commit b9a5a8fe2381fd6d972cd567ba4a1f16e61f669b Author: littlefoot Date: Sun Oct 24 15:36:18 2021 -0400 initial commit diff --git a/addoninfo.txt b/addoninfo.txt new file mode 100755 index 0000000..9b068d5 --- /dev/null +++ b/addoninfo.txt @@ -0,0 +1,9 @@ +"AddonInfo" +{ + maps "touhoutd" + "touhoutd" + { + "MaxPlayers" "4" + } + "IsPlayable" "1" +} diff --git a/aghanim_singleplayer/addon_schinese.txt b/aghanim_singleplayer/addon_schinese.txt new file mode 100755 index 0000000..36aabcf --- /dev/null +++ b/aghanim_singleplayer/addon_schinese.txt @@ -0,0 +1,1014 @@ +"lang" +{ + "Language" "schinese" + "Tokens" + { + "addon_game_name" "阿哈利姆的天地迷宫" + "DOTA_GameMode_15" "阿哈利姆的天地迷宫" + "DOTA_GameMode_19" "阿哈利姆的天地迷宫" + + "aghanim_bonus_round_time_left" "剩余时间" + "aghanim_bonus_round_total_gold" "总金钱" + "DOTA_Defeated" "你的队伍已经消亡!" + + "dota_game_end_victory_title_radiant" "已通过阿哈利姆的天地迷宫" + "dota_game_end_victory_title_dire" "阿哈利姆的天地迷宫让你们全军覆没" + + // UI + "DOTA_HUD_EnemiesRemaining" "剩余敌人:" + "DOTA_HUD_TimeRemaining" "剩余时间:" + "DOTA_HUD_Victory" "胜利!" + "DOTA_HUD_Defeat" "失败!" + "DOTA_HUD_Kills" "击杀" + "DOTA_HUD_Deaths" "死亡" + "DOTA_HUD_Saves" "复活" + "DOTA_HUD_Bags" "金袋" + "DOTA_HUD_Mute" "屏蔽" + "DOTA_HUD_PlayAgain" "再玩一次?" + "DOTA_HUD_Yes" "好的" + "DOTA_HUD_No" "不用" + "DOTA_HUD_Score" "得分" + "DOTA_HUD_GoldBags" "收集的金袋" + "DOTA_HUD_GoldBagsMissed" "错过的金袋" + "DOTA_HUD_TeamDeaths" "全队死亡" + "DOTA_HUD_Rewards" "神杖碎片" + "DOTA_HUD_Blessings" "福佑" + "DOTA_HUD_RoomRewards" "房间奖励" + "DOTA_HUD_ShowBlessings" "显示福佑" + "DOTA_HUD_HideBlessings" "隐藏福佑" + + "DOTA_HUD_Reward_Header" "选择你的奖励" + "DOTA_HUD_Reward_Gold" "额外金钱" + "DOTA_HUD_Reward_Gold_desc" "{d:quantity}金钱" + "DOTA_HUD_Reward_ExtraLives" "额外生命" + "DOTA_HUD_Reward_ExtraLives_desc" "{d:quantity}次额外生命" + "DOTA_HUD_Reward_Item" "中立物品" + "DOTA_HUD_Reward_TempBuff" "临时状态" + "DOTA_HUD_Reward_Aura" "光环" + "DOTA_HUD_Reward_AbilityUpgrade" "阿哈利姆福佑" + "DOTA_HUD_Reward_MinotrAbilityUpgrade" "技能升级" + "DOTA_HUD_Reward_AdditionalRewards" "已获得额外奖励" + "DOTA_HUD_Game_Mode_Header" "欢迎来到阿哈利姆的天地迷宫!" + "DOTA_HUD_Rewards_AscensionLevel" "难度等级:{d:ascension_level}" + + "DOTA_HUD_TopBar_Difficulty" "{s:difficulty_name}" + + "boss_shop" "钢背饰品店" + "DOTA_Subshop_1" "基础" + "DOTA_Subshop_2" "饰物" + + "DOTA_HUD_BattleRoyaleDamageStarting" "快加入战斗,懦夫!" + + "DOTA_Tooltip_Ability_item_battle_points" "勇士积分" + "DOTA_Tooltip_Ability_item_arcane_fragments" "奥术碎片" + "DOTA_RewardTooltip_Gold" "金钱" + "DOTA_RewardTooltip_XP" "经验" + + "DOTA_HUD_Rewards_ShowRewards" "神杖碎片可用" + "DOTA_HUD_Rewards_Info" "查看计分板中已选择升级效果" + + "DOTA_HUD_REWARD_TIER1_Desc" "第1级" + "DOTA_HUD_REWARD_TIER2_Desc" "第2级" + "DOTA_HUD_REWARD_TIER3_Desc" "第3级" + "DOTA_HUD_REWARD_TIER4_Desc" "第4阶" + "DOTA_HUD_REWARD_TIER5_Desc" "第5阶" + + "DOTA_Hud_EncounterDepth" "第{s:encounter_depth}层" + "DOTA_Hud_AscenionAbilitiesTitle" "额外效果" + "DOTA_Hud_Elite_Encounter_Discover" "菁英遭遇战 - 2倍奖励" + "DOTA_Hud_Elite_Encounter" "菁英遭遇战" + "DOTA_HUD_Reward_Rarity_Common" "选择普通神杖碎片" + "DOTA_HUD_Reward_Rarity_Elite" "选择精英神杖碎片" + "DOTA_HUD_Reward_Rarity_Epic" "选择传奇神杖碎片" + + "DOTA_HUD_REWARD_TYPE_GOLD_Toast" "{s:player_name}选择了{d:int_value} " + "DOTA_HUD_REWARD_TYPE_ITEM_Toast" "{s:player_name}选择了{s:locstring_value}" + "DOTA_HUD_REWARD_TYPE_ABILITY_UPGRADE_Toast" "{s:player_name}选择了{s:locstring_value}" + "DOTA_HUD_REWARD_TYPE_EXTRA_LIVES_Toast" "{s:player_name}选择了{d:int_value}" + "DOTA_HUD_REWARD_TYPE_MINOR_ABILITY_UPGRADE_Toast" "{s:player_name}选择了%s1" + "DOTA_HUD_REWARD_TYPE_MINOR_STATS_UPGRADE_Toast" "{s:player_name}选择了%s1" + + "DOTA_HUD_REWARD_TYPE_GOLD_Desc" "黄金" + "DOTA_HUD_REWARD_TYPE_TREASURE_Desc" "宝箱" + "DOTA_HUD_REWARD_TYPE_EXTRA_LIVES_Desc" "额外生命" + + "DOTA_HUD_Claimed_Rewards_Header" "领取奖励" + + "DOTA_Hud_Tooltip_Outpost_Title" "战斗" + "DOTA_Hud_Tooltip_Outpost_EliteTitle" "菁英战斗" + "DOTA_Hud_Tooltip_Outpost_TrapTitle" "陷阱" + "DOTA_Hud_Tooltip_Outpost_BossTitle" "首领" + "DOTA_Hud_Tooltip_Outpost_BonusTitle" "奖励" + "DOTA_Hud_Tooltip_Outpost_TransitionTitle" "休息" + + "DOTA_Hud_Outpost_ChannelBar_Title" "正在选择战斗" + "DOTA_Hud_Outpost_ChannelBar_EliteTitle" "正在选择菁英战斗" + "DOTA_Hud_Outpost_ChannelBar_TrapTitle" "正在选择陷阱" + "DOTA_Hud_Outpost_ChannelBar_BossTitle" "正在选择首领" + "DOTA_Hud_Outpost_ChannelBar_BonusTitle" "正在选择奖励" + "DOTA_Hud_Outpost_ChannelBar_RestTitle" "正在选择休整" + + // Objectives + "defeat_all_enemies" "击败所有敌人" + "survive_waves" "在大波敌人中存活" + "destroy_spawning_portals" "摧毁黑暗传送门" + "navigate_the_traps" "通过陷阱并到达目的地" + "kill_scarab_priests" "击败圣甲虫牧师" + "defeat_the_alchemists" "击败炼金术士" + "defeat_boss_npc_dota_boss_void_spirit" "击败无玄的阴影" + "defeat_boss_npc_dota_creature_temple_guardian" "击败神庙守卫" + "defeat_boss_npc_dota_creature_storegga" "击败石托瑞嘉" + "defeat_boss_npc_dota_boss_aghanim" "击败阿哈利姆" + "defeat_boss_npc_dota_boss_visage" "Defeat the Warden of the Narrow Maze" + "defeat_boss_npc_dota_boss_timbersaw" "击败剃锯机瑞兹瑞克" + "kill_waveblasters" "击败爆破蝙蝠" + "kill_wildwings" "击败愤怒的小鸟" + "kill_tinies" "击败友谊" + "defeat_shadow_demons" "击败暗影恶魔" + "rescue_sheep" "拯救绵羊" + "save_gary" "拯救盖瑞" + "destroy_all_mines" "击败水底炸弹" + "defeat_shadow_shamans" "击败沼泽枷锁恶徒" + "defeat_boss_npc_dota_boss_visage" "击败狭窄迷宫的守望者" + "kill_shroom_giants" "击败蘑菇巨人" + "objective_select_ascension_level" "选择难度级别" + "objective_stand_on_buttons" "站在初始按钮上" + "objective_select_aghanims_fragmants" "选择阿哈利姆神杖碎片" + "objective_saddle_up_on_morty" "骑上小莫迪" + "objective_jump_to_collect_gold" "跳跃收集黄金!" + "objective_saddle_up_on_penguin" "骑上一头鹅儿" + "objective_sled_to_collect_gold" "乘雪橇收集黄金!" + "defeat_blazhan" "击败熔山山" + "defeat_frozhan" "击败寒山山" + "defeat_portly" "击败珀特里!" + + // Hints + "hint_ride_morty" "按{s:keybind}键或{s:alternate_keybind}键骑乘!" + "hint_hop_with_morty" "瞄准你的蜥蜴,再按下{s:keybind}键获得力量,然后跳跃!" + "hint_ride_penguin" "按{s:keybind}键或{s:alternate_keybind}键骑乘!" + + "DOTA_Tooltip_modifier_aghsfort_firefly_burn" "纵火狂人" + "DOTA_Tooltip_modifier_aghsfort_firefly_burn_Description" "你着火了。" + + // End UI + + "npc_dota_creature_brewmaster_boss" "熊猫大兄弟" + "npc_dota_brewmaster_earth_unit" "大地老三" + "npc_dota_brewmaster_storm_unit" "风暴老三" + "npc_dota_brewmaster_fire_unit" "灰烬老三" + "npc_dota_creature_dire_hound" "夜魇幼犬" + "npc_dota_creature_dire_hound_boss" "夜魇猎犬" + "npc_dota_creature_huskar" "虚无战士" + "npc_dota_creature_ogre_tank" "骨末肉盾" + "npc_dota_creature_ogre_magi" "骨末法师" + "npc_dota_creature_baby_ogre_tank" "骨末肉盾宝宝" + "npc_dota_creature_baby_ogre_magi" "骨末法师宝宝" + "npc_dota_creature_small_hellbear" "林地地狱熊怪" + "npc_dota_creature_hellbear" "地狱熊怪战士" + "npc_dota_pinecone_champion" "松果卫士" + "npc_dota_pinecone_warrior" "松果战士" + "npc_dota_creature_small_ogre_seal" "食人魔海豹宝宝" + "npc_dota_creature_large_ogre_seal" "暴躁食人魔海豹" + "npc_dota_creature_wandering_ogre_seal" "徜徉食人魔海豹" + "npc_dota_creature_dazzle" "德尊侍僧" + "npc_dota_creature_wildwing_laborer" "温顺枭兽" + "npc_dota_creature_tusk_skeleton" "海象步兵" + "npc_dota_creature_spectral_tusk_mage" "海象冰霜法师" + "npc_dota_holdout_tower" "瞭望塔" + "npc_dota_undead_tusk_tombstone" "海象墓碑" + "npc_dota_creature_friendly_baby_ogre_tank" "布拉格" + "npc_dota_creature_friendly_ogre_seal" "盖瑞" + "npc_dota_creature_sand_king" "莱兹克" + "npc_dota_sand_king_sandstorm" "莱兹克的沙尘暴" + "npc_dota_creature_big_exploding_burrower" "砂虫爆破王" + "npc_dota_creature_healing_burrower" "砂虫祭品" + "npc_dota_creature_storegga" "石托瑞嘉" + "npc_dota_creature_small_storegga" "小石头" + "npc_dota_creature_temple_guardian" "神庙守卫" + "npc_dota_creature_morphling_big" "激流元素人" + "npc_dota_creature_tiny_crab" "小钳蟹" + "npc_dota_creature_warlock" "恶魔术师" + "npc_dota_creature_grimstroke" "不被理解的画家" + "npc_dota_creature_life_stealer" "尖牙怪" + "npc_dota_creature_gauntlet_skeleton" "冰骨骷髅" + "npc_dota_creature_demon_golem" "迷醉傀儡" + "npc_dota_creature_bomber" "投弹手" + "npc_dota_creature_gyrocopter" "无畏飞行员" + "npc_dota_creature_gyrocopter_homing_missile" "追踪导弹" + "npc_dota_creature_zealot_scarab" "圣甲虫狂热者" + "npc_dota_creature_zealot_mound" "钻地单位" + "npc_dota_creature_scarab_priest" "圣甲虫牧师" + "npc_dota_creature_rock_golem_a" "巨大岩石傀儡" + "npc_dota_creature_rock_golem_b" "岩石傀儡" + "npc_dota_creature_rock_golem_c" "岩石傀儡碎片" + "npc_dota_creature_luna_mini" "小暗月骑士" + "npc_dota_creature_mirana" "银夜潜行者" + "npc_dota_creature_alchemist" "术士,炼金" + "npc_dota_creature_broodmother" "沼泞毒蛛" + "npc_dota_creature_huge_broodmother" "庞然饕餮" + "npc_dota_creature_newborn_spider" "沼泞群蛛" + "npc_dota_creature_broodmother_baby" "微型蜘蛛" + "npc_dota_creature_broodmother_baby_b" "小小蜘蛛" + "npc_dota_creature_broodmother_baby_c" "小蜘蛛" + "npc_dota_creature_broodmother_baby_d" "毛毛小蜘蛛" + "npc_dota_creature_kidnap_spider" "沼泞猛蛛" + "npc_dota_creature_lina" "燃烧女巫师" + "npc_dota_creature_puck" "幻梦" + "npc_dota_creature_wolf" "红狼" + "npc_dota_creature_large_elder_titan" "世界终结者" + "npc_dota_creature_spectre" "超然之魂" + "npc_dota_creature_dragon_knight" "霜害领主" + "npc_dota_creature_underlord" "黑曜恶魔" + "npc_dota_creature_pudge_miniboss" "珀特里" + "npc_dota_creature_pudge_miniboss_minion" "行尸" + "npc_dota_creature_friendly_ogre_tank" "格兰奇" + "npc_aghsfort_morty" "马迪" + "npc_dota_sled_penguin" "鹅儿" + "npc_dota_creature_bonus_chicken" "金鹅" + "npc_dota_creature_bonus_greevil" "贪婪贪魔" + "npc_dota_breathe_fire_trap" "炽烈吐息" + "npc_dota_arrow_trap" "猎心装置" + "npc_dota_vase" "古董花瓶" + "npc_dota_crate" "木箱子" + "npc_treasure_chest" "宝箱" + "npc_dota_explosive_barrel" "易爆木桶" + "npc_aghsfort_dark_portal" "阿哈利姆的传送门" + "npc_dota_creature_ice_roshan" "寒山山" + "npc_dota_creature_fire_roshan" "熔山山" + "npc_dota_creature_baby_roshan" "小肉山" + "npc_dota_creature_ogre_tank_boss" "波格达格" + "npc_dota_creature_ogre_seer" "骨末先知" + "npc_dota_creature_phoenix" "幸运之阳" + "npc_dota_creature_ember_spirit" "焰手" + "npc_dota_creature_bandit" "荒漠盗贼" + "npc_dota_creature_bandit_archer" "荒漠射手" + "npc_dota_creature_bandit_captain" "荒漠队长" + "npc_dota_pendulum_trap" "斩首装置" + "npc_dota_creature_wave_blaster" "爆破蝙蝠" + "npc_aghsfort_creature_wave_blaster_ghost" "寒冰幽灵" + "npc_dota_creature_frost_kobold" "冰霜狗头人" + "npc_dota_creature_lich" "古老寒冰领主" + "npc_dota_creature_dark_seer" "堕落贤者" + "npc_dota_undead_woods_skeleton_king" "白骨之王" + "npc_dota_creature_upheaval_urn" "邪恶之瓮" + "npc_dota_creature_shadow_demon" "恶魔驱逐者" + "npc_dota_creature_doom" "恶魔暴徒" + "npc_dota_creature_necro_warrior" "地狱奉承者" + "npc_dota_creature_drow_ranger_miniboss" "神射手" + "npc_dota_creature_drow_ranger_skeleton_archer" "骷髅弓兵" + "npc_dota_creature_drow_ranger_skeleton_warrior" "骷髅战士" + "npc_dota_creature_beastmaster_boss" "毛皮商人" + "npc_dota_creature_beastmaster_boar" "毛皮贡献者" + "npc_dota_creature_troll_warlord_melee" "交易站暴徒" + "npc_dota_creature_troll_warlord_ranged" "交易站暴徒" + "npc_dota_cage" "动物牢笼" + "npc_dota_creature_sheep_hostage" "绵羊" + "npc_dota_creature_gladiator_creep" "业余" + "npc_dota_creature_skywrath_mage" "菜鸟" + "npc_dota_creature_legion_commander" "全明星" + "npc_dota_creature_shadow_shaman" "沼泽枷锁恶徒" + "npc_dota_creature_shroomling" "昏睡蘑菇" + "npc_dota_creature_shroom_giant" "蘑菇巨人" + "npc_dota_creature_slark_peon" "滑腻斯拉克" + "npc_dota_creature_naga_siren_boss" "头号人物" + "npc_dota_creature_naga_siren_illusion" "序幕" + "npc_dota_underwater_mine" "咬苹果" + "npc_dota_creature_elemental_tiny" "元素小小" + "npc_dota_creature_elemental_io" "元素精灵" + "npc_dota_assault_bad_melee_creep" "攻城近战兵" + "npc_dota_assault_bad_ranged_creep" "攻城远程兵" + "npc_dota_creature_catapult" "攻城投石车" + "npc_aghsfort_creature_dire_assault_captain" "攻城队长" + "npc_dota_creature_tidehunter_mini" "海滩碎浪" + "npc_dota_creature_tidehunter_medium" "海龟巡逻" + "npc_dota_creature_tidehunter_large" "海洋向导" + "npc_dota_creature_kunkka_medium" "能量掌握者" + "npc_dota_shop_keeper" "旅行商人" + "npc_dota_boss_aghanim" "巅峰法师阿哈利姆" + "npc_dota_creature_aghanim_minion" "碎土傀儡" + "npc_dota_boss_aghanim_crystal" "法术碎晶" + "npc_dota_story_crystal" "阿哈利姆的心智虹吸" + "npc_dota_dummy_caster" "阿哈利姆的助手亨利" + + "npc_aghsfort_creature_bomb_squad" "炸弹小队" + "npc_aghsfort_creature_bomb_squad_landmine" "炸弹小队炸弹" + "npc_aghsfort_creature_bomb_squad_stasis_trap" "炸弹小队静滞炸弹" + "npc_aghsfort_creature_enraged_wildwing" "愤怒的小鸟" + "npc_aghsfort_creature_tornado_harpy" "飓风鹰身女妖" + + "npc_dota_boss_timbersaw" "瑞兹瑞克" + "npc_dota_creature_timbersaw_treant" "小恩特" + "npc_dota_boss_void_spirit" "无玄的影子" + "npc_dota_earth_spirit_statue" "考林的足球雕塑" + "npc_dota_earth_spirit_boss" "考林卫士" + "npc_dota_boss_visage" "狭窄迷宫的守望者" + "npc_dota_boss_visage_familiar" "迷失幽魂" + "npc_dota_boss_visage_familiar_state" "迷宫观察者" + + "npc_dota_aghsfort_watch_tower_option_1" "出口选择" + "npc_dota_aghsfort_watch_tower_option_2" "出口选择" + + "DOTA_Tooltip_Ability_item_health_potion" "生命药水" + "DOTA_Tooltip_Ability_item_mana_potion" "魔法药水" + "DOTA_Tooltip_ability_item_bag_of_gold" "金袋" + "DOTA_Tooltip_Ability_item_life_rune" "生命符文" + "DOTA_Tooltip_Ability_item_life_rune_Description" "+1次生命,阵亡10秒后可以复活。" + "DOTA_Tooltip_Ability_item_small_scepter_fragment" "小神杖碎片" + "DOTA_Tooltip_Ability_item_small_scepter_fragment_Description" "消耗后可以选择3项小幅技能升级。" + "DOTA_Tooltip_ability_item_tombstone" "复活队友" + "DOTA_Chat_Tombstone_Pinged" "有队友在这里阵亡了。" + "Aghanim_FoundChestItem" "{s:player_name}找到了一个宝藏,内有:{s:locstring_value}" + "Aghanim_FoundChestGold" "{s:player_name}找到了一个宝藏,内有:{s:value}" + "Aghanim_FoundChestTrap" "{s:player_name}找到了一个宝藏,内有:{s:locstring_value}!" + "Aghanim_FoundLifeRune" "{s:player_name}找到了{s:locstring_value}!" + "Aghanim_FoundItem" "{s:player_name}找到了新物品:{s:locstring_value}!" + "Aghanim_FoundConsumableItem" "{s:player_name}找到了新的消耗品:{s:locstring_value}!" + "Aghanim_KilledByCreature" "{s:player_name}被{s:locstring_value}杀死!" + "Aghanim_BattlePointsFound" "{s:player_name}为全队找到了{d:int_value}点勇士积分!" + "Aghanim_ArcaneFragmentsFound" "{s:player_name}为全队找到了{d:int_value}块奥术碎片!" + + "DOTA_Tooltip_ability_item_bottle_Description" "

主动:回复

消耗一点能量,在%restore_time%秒哪回复%health_restore_pct%%%最大生命和%mana_restore_pct%%%最大魔法。每场遭遇战结束时将恢复一点能量。" + "DOTA_Tooltip_ability_item_bottle_max_charges" "最大能量:" + + "DOTA_Tooltip_ability_item_shadow_amulet_Description" "

主动:渐隐

让自己或友方单位静止不动的情况下获得隐身效果。

拥有%fade_time%秒渐隐时间,如果移动将立刻打破隐身。对友军施法距离:%abilitycastrange%" + "DOTA_Tooltip_ability_item_shadow_amulet_fade_duration" "最大渐隐时间:" + + "DOTA_Tooltip_ability_item_vladmir_Description" "

被动:弗拉迪米尔光环

向周围队友提供%lifesteal_aura%%%吸血,%damage_aura%%%攻击力加成和%mana_regen_aura%点/秒魔法恢复。

作用范围:%aura_radius%" + "DOTA_Tooltip_ability_item_vladmir_Lore" "一副怪异的面具,纠缠着死去吸血鬼的怨念。" + + "DOTA_Tooltip_modifier_item_vladmir_aura" "弗拉迪米尔光环" + "DOTA_Tooltip_modifier_item_vladmir_aura_Description" "获得%dMODIFIER_PROPERTY_TOOLTIP%%%吸血效果,还有%fMODIFIER_PROPERTY_MANA_REGEN_CONSTANT%点/秒魔法恢复和%dMODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS%点护甲。" + + "DOTA_Tooltip_ability_item_satanic_Description" "

主动:不洁狂热

吸血效果提升至%unholy_lifesteal_total_tooltip%%%,持续%unholy_duration%秒。\n

被动:吸血

攻击者每次攻击都将根据造成的伤害回复%lifesteal_percent%%%的生命值。" + "DOTA_Tooltip_ability_item_satanic_Lore" "无穷的力量,需要你付出灵魂作为代价。" + "DOTA_Tooltip_ability_item_satanic_bonus_strength" "+$str" + "DOTA_Tooltip_ability_item_satanic_bonus_damage" "+$damage" + "DOTA_Tooltip_ability_item_satanic_status_resistance" "%+状态抗性" + + "DOTA_Tooltip_modifier_item_satanic_unholy" "不洁狂热" + "DOTA_Tooltip_modifier_item_satanic_unholy_Description" "吸血效果提升%dMODIFIER_PROPERTY_TOOLTIP%%%。" + + "DOTA_Tooltip_modifier_creature_pudge_miniboss_armor_corruption_debuff" "腐蚀" + "DOTA_Tooltip_modifier_creature_pudge_miniboss_armor_corruption_debuff_Description" "失去%dMODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS%点护甲。" + + "DOTA_Tooltip_Ability_aghanim_empty_spell1" "技能被锁定" + "DOTA_Tooltip_Ability_aghanim_empty_spell1_Description" "阿哈利姆锁定了你的技能 - 快摧毁碎片夺回来!" + "DOTA_Tooltip_Ability_aghanim_empty_spell2" "技能被锁定" + "DOTA_Tooltip_Ability_aghanim_empty_spell2_Description" "阿哈利姆锁定了你的技能 - 快摧毁碎片夺回来!" + "DOTA_Tooltip_Ability_aghanim_empty_spell3" "技能被锁定" + "DOTA_Tooltip_Ability_aghanim_empty_spell3_Description" "阿哈利姆锁定了你的技能 - 快摧毁碎片夺回来!" + "DOTA_Tooltip_Ability_aghanim_empty_spell4" "技能被锁定" + "DOTA_Tooltip_Ability_aghanim_empty_spell4_Description" "阿哈利姆锁定了你的技能 - 快摧毁碎片夺回来!" + "DOTA_Tooltip_modifier_aghanim_spell_swap" "技能被锁定" + "DOTA_Tooltip_modifier_aghanim_spell_swap_Description" "阿哈利姆锁定了你的技能 - 快摧毁碎片夺回来!" + "DOTA_Tooltip_modifier_aghanim_crystal_attack_debuff" "晶莹寒气" + "DOTA_Tooltip_modifier_aghanim_crystal_attack_debuff_Description" "所有治疗、恢复和吸血效果降低%dMODIFIER_PROPERTY_HEAL_AMPLIFY_PERCENTAGE_TARGET%%%" + + "DOTA_Tooltip_ability_creature_brewmaster_fire_permanent_immolation" "永久献祭" + "DOTA_Tooltip_ability_creature_brewmaster_fire_permanent_immolation_Lore" "" + "DOTA_Tooltip_ability_creature_brewmaster_fire_permanent_immolation_Description" "烧灼附近的敌方单位。" + "DOTA_Tooltip_ability_creature_brewmaster_fire_permanent_immolation_damage" "每秒伤害:" + "DOTA_Tooltip_ability_creature_brewmaster_fire_permanent_immolation_radius" "作用范围:" + + "DOTA_Tooltip_Ability_item_greater_salve" "高级治疗药膏" + "DOTA_Tooltip_ability_item_greater_salve_Description" "

使用:药膏

向目标提供%hp_per_tick%点/秒生命恢复,持续%buff_duration%秒。

受到敌方英雄或肉山攻击时效果会被驱散。

对友军施放距离:%abilitycastrange%" + "DOTA_Tooltip_ability_item_greater_salve_Lore" "即使最严重的伤口也能快速治愈的魔法药膏。" + + "DOTA_Tooltip_modifier_item_greater_salve" "高级治疗药膏" + "DOTA_Tooltip_modifier_item_greater_salve_Description" "这个单位正在回复生命。" + + "DOTA_Tooltip_Ability_item_greater_clarity" "高级净化药水" + "DOTA_Tooltip_ability_item_greater_clarity_Description" "

使用:回魔

向目标提供%mana_per_tick%点魔法恢复,持续%buff_duration%秒。

施法距离:%abilitycastrange%" + "DOTA_Tooltip_ability_item_greater_clarity_Lore" "能增强冥想能力的清水。" + + "DOTA_Tooltip_modifier_item_greater_clarity" "高级净化药水" + "DOTA_Tooltip_modifier_item_greater_clarity_Description" "这个单位正在回复魔法。" + + "DOTA_Tooltip_Ability_item_double_damage_potion" "双倍伤害药水" + "DOTA_Tooltip_Ability_item_double_damage_potion_Description" "获得双倍伤害效果,持续%buff_duration%秒。" + + "DOTA_Tooltip_modifier_item_double_damage_potion" "双倍伤害药水" + "DOTA_Tooltip_modifier_item_double_damage_potion_Description" "这个单位拥有双倍伤害。" + + "DOTA_Tooltip_Ability_item_spell_amp_potion" "技能增强药水" + "DOTA_Tooltip_Ability_item_spell_amp_potion_Description" "获得%spell_amp_bonus_pct%%%技能伤害加成,持续%buff_duration%秒。" + + "DOTA_Tooltip_modifier_item_spell_amp_potion" "技能增强药水" + "DOTA_Tooltip_modifier_item_spell_amp_potion_Description" "这个单位拥有100%技能增强。" + + "DOTA_Tooltip_Ability_item_evasion_potion" "闪避药水" + "DOTA_Tooltip_Ability_item_evasion_potion_Description" "获得%evasion_bonus_pct%%%闪避加成,持续%buff_duration%秒。" + + "DOTA_Tooltip_modifier_item_evasion_potion" "闪避药水" + "DOTA_Tooltip_modifier_item_evasion_potion_Description" "这个单位拥有100%闪避加成。" + + "DOTA_Tooltip_Ability_item_tome_of_greater_knowledge" "高级学识之书" + "DOTA_Tooltip_Ability_item_tome_of_greater_knowledge_Description" "所有友方英雄获得升至下一级所需的半数经验。" + + "DOTA_Tooltip_Ability_item_purification_potion" "洗礼药水" + "DOTA_Tooltip_Ability_item_purification_potion_Description" "

使用:高级洗礼

立刻回复自身%heal%点生命,对附近敌人造成%heal%点伤害。" + "DOTA_Tooltip_ability_item_purification_potion_heal" "治疗/伤害:" + "DOTA_Tooltip_ability_item_purification_potion_radius" "伤害作用范围:" + + "DOTA_Tooltip_Ability_item_ravage_potion" "毁灭药水" + "DOTA_Tooltip_Ability_item_ravage_potion_Description" "

使用:高级毁灭

猛击地面,触手向各个方向穿出,伤害并眩晕附近所有敌方单位。" + "DOTA_Tooltip_Ability_item_ravage_potion_Note0" "毁灭能伤害隐身单位。" + "DOTA_Tooltip_Ability_item_ravage_potion_Note1" "毁灭以%speed%的速度向外扩散。" + "DOTA_Tooltip_ability_item_ravage_potion_radius" "作用范围:" + "DOTA_Tooltip_ability_item_ravage_potion_duration" "持续时间:" + + "DOTA_Tooltip_ability_item_dragon_potion" "古龙药水" + "DOTA_Tooltip_ability_item_dragon_potion_Description" "

使用:古龙形态

变成一头古龙,拥有腐蚀吐息,溅射伤害/减速和魔法抗性提升。" + "DOTA_Tooltip_ability_item_dragon_potion_duration" "持续时间:" + "DOTA_Tooltip_ability_item_dragon_potion_bonus_movement_speed" "移动速度加成:" + "DOTA_Tooltip_ability_item_dragon_potion_bonus_attack_range" "攻击距离加成:" + "DOTA_Tooltip_ability_item_dragon_potion_bonus_attack_damage" "攻击力加成:" + "DOTA_Tooltip_ability_item_dragon_potion_magic_resistance" "魔法抗性:" + "DOTA_Tooltip_ability_item_dragon_potion_splash_radius" "溅射范围:" + "DOTA_Tooltip_ability_item_dragon_potion_splash_damage_percent" "溅射伤害百分比:" + + "DOTA_Tooltip_ability_item_arcanist_potion" "秘士药水" + "DOTA_Tooltip_ability_item_arcanist_potion_Description" "

使用:强化秘法

降低技能冷却时间和魔法消耗。" + "DOTA_Tooltip_ability_item_arcanist_potion_duration" "持续时间:" + "DOTA_Tooltip_ability_item_arcanist_potion_cooldown_reduction_pct" "%冷却时间减少:" + "DOTA_Tooltip_ability_item_arcanist_potion_manacost_reduction_pct" "%魔法消耗降低:" + + "DOTA_Tooltip_modifier_aghsfort_arcanist_potion" "秘士药水" + "DOTA_Tooltip_modifier_aghsfort_arcanist_potion_Description" "降低技能冷却时间和魔法消耗。" + + "DOTA_Tooltip_Ability_item_echo_slam_potion" "回音击药水" + "DOTA_Tooltip_Ability_item_echo_slam_potion_Description" "

使用:高级回音击

穿过地面的冲击波,伤害敌方单位。每个受到攻击的敌人都会引起伤害附近单位的反射波。英雄本体将引起两次反射。" + "DOTA_Tooltip_ability_item_echo_slam_potion_echo_slam_echo_damage" "回音伤害:" + "DOTA_Tooltip_ability_item_echo_slam_potion_echo_slam_damage_range" "作用范围:" + "DOTA_Tooltip_ability_item_echo_slam_potion_echo_slam_initial_damage" "初始伤害:" + + "DOTA_Tooltip_Ability_item_torrent_effect_potion" "洪流反射" + "DOTA_Tooltip_Ability_item_torrent_effect_potion_Description" "

使用:获得永久效果。

每次受到攻击时有%proc_chance%%%几率召唤涨起的洪流,在短时间延迟后将敌方单位抛向空中。受到洪流作用的单位将被眩晕和减速,并受到伤害。" + "DOTA_Tooltip_ability_item_torrent_effect_potion_proc_chance" "%触发几率:" + "DOTA_Tooltip_ability_item_torrent_effect_potion_torrent_damage" "洪流伤害:" + "DOTA_Tooltip_ability_item_torrent_effect_potion_stun_duration" "眩晕时间:" + + "DOTA_Tooltip_modifier_item_torrent_effect_potion" "洪流反射" + "DOTA_Tooltip_modifier_item_torrent_effect_potion_Description" "该单位被攻击时有几率触发洪流。" + + "DOTA_Tooltip_ability_item_shadow_wave_effect_potion" "暗影波反射" + "DOTA_Tooltip_ability_item_shadow_wave_effect_potion_Description" "

使用:获得永久效果。

每次受到攻击时有%proc_chance%%%几率放出在友军身上跳跃的能量弧,对其治疗的同时对附近的所有单位造成伤害。自身总会受到暗影波的治疗效果。" + "DOTA_Tooltip_ability_item_shadow_wave_effect_potion_Note0" "优先治疗友方英雄" + "DOTA_Tooltip_ability_item_shadow_wave_effect_potion_Note1" "如果敌军附近有多个我方单位,那么他将受到多重暗影波的伤害。" + "DOTA_Tooltip_ability_item_shadow_wave_effect_potion_proc_chance" "触发几率:" + "DOTA_Tooltip_ability_item_shadow_wave_effect_potion_cast_range" "距离:" + //"DOTA_Tooltip_ability_item_shadow_wave_effect_potion_bounce_radius" "HEAL ARC RADIUS:" + "DOTA_Tooltip_ability_item_shadow_wave_effect_potion_tooltip_max_targets_inc_dazzle" "最大治疗目标数:" + "DOTA_Tooltip_ability_item_shadow_wave_effect_potion_damage_radius" "伤害作用范围:" + "DOTA_Tooltip_ability_item_shadow_wave_effect_potion_damage" "治疗/伤害:" + + "DOTA_Tooltip_modifier_aghsfort_shadow_wave_effect_potion" "暗影波反射" + "DOTA_Tooltip_modifier_aghsfort_shadow_wave_effect_potion_Description" "该单位被攻击时有几率触发暗影波。" + + "DOTA_Tooltip_modifier_bonus_room_start" "额外房间" + "DOTA_Tooltip_modifier_bonus_room_start_Description" "被沉默和锁闭。前往奖励!" + + "DOTA_Tooltip_Ability_item_aghsfort_refresher_shard" "刷新球碎片" + + "DOTA_Tooltip_Ability_item_aghsfort_refresher_shard_Description" "

主动:完全重置

重置所有物品和技能的冷却时间。" + "DOTA_Tooltip_Ability_item_aghsfort_refresher_shard_lore" "无尽之战时代的前前后后,不朽者的求胜之志始终从未动摇。" + "DOTA_Tooltip_ability_item_aghsfort_refresher_shard_Note0" "刷新球碎片可以共享。" + + "DOTA_Tooltip_modifier_aghsfort_firefly" "纵火狂人" + "DOTA_Tooltip_modifier_aghsfort_firefly_Description" "这个单位的足迹是火焰路径。" + + "DOTA_Tooltip_modifier_ascension_crit" "幸运一击" + "DOTA_Tooltip_modifier_ascension_crit_Description" "有%dMODIFIER_PROPERTY_TOOLTIP%%%几率造成%dMODIFIER_PROPERTY_TOOLTIP2%%%伤害。" + + "DOTA_Tooltip_modifier_ascension_magic_resist" "魔法刚毅" + "DOTA_Tooltip_modifier_ascension_magic_resist_Description" "这个单位拥有%dMODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS%%%额外魔法抗性。" + + "DOTA_Tooltip_modifier_ascension_plasma_field_display" "触电式告别" + "DOTA_Tooltip_modifier_ascension_plasma_field_display_Description" "单位在死亡时会施放等离子场。" + + "DOTA_Tooltip_modifier_ascension_flicker_display" "闪灵" + "DOTA_Tooltip_modifier_ascension_flicker_display_Description" "单位随机传送,净化自身的负面状态。" + + "DOTA_Tooltip_modifier_ascension_armor_sapping_display" "死亡诅咒" + "DOTA_Tooltip_modifier_ascension_armor_sapping_display_Description" "该单位削弱其击杀者的护甲" + + "DOTA_Tooltip_modifier_aghsfort_ascension_silence" "请安静!" + "DOTA_Tooltip_modifier_aghsfort_ascension_silence_Description" "无法施放技能" + + "DOTA_Tooltip_modifier_aghsfort_ascension_silence_display" "请安静!" + "DOTA_Tooltip_modifier_aghsfort_ascension_silence_display_Description" "单位偶尔会沉默附近玩家。" + + "DOTA_Tooltip_modifier_aghsfort_ascension_magnetic_field_evasion" "泡泡中的生活" + "DOTA_Tooltip_modifier_aghsfort_ascension_magnetic_field_evasion_Description" "躲避来自泡泡之外的物理攻击。" + + "DOTA_Tooltip_modifier_ascension_drunken_display" "醉酒" + "DOTA_Tooltip_modifier_ascension_drunken_display_Description" "单位偶尔会进入醉酒状态,获得移动速度、闪避加成和致命一击。" + + "DOTA_Tooltip_modifier_ascension_damage" "极其致命" + "DOTA_Tooltip_modifier_ascension_damage_Description" "单位造成的伤害增加%dMODIFIER_PROPERTY_TOTALDAMAGEOUTGOING_PERCENTAGE%%%。" + + "DOTA_Tooltip_modifier_ascension_attack_speed" "屹立不倒" + "DOTA_Tooltip_modifier_ascension_attack_speed_Description" "低血量时攻击速度提升%dMODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT%。" + + "DOTA_Tooltip_modifier_ascension_magic_immunity" "天神下凡" + "DOTA_Tooltip_modifier_ascension_magic_immunity_Description" "受到魔法伤害时短暂获得技能免疫状态。" + + "DOTA_Tooltip_modifier_ascension_armor" "皮糙肉厚" + "DOTA_Tooltip_modifier_ascension_armor_Description" "护甲提升%dMODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS%点。" + + "DOTA_Tooltip_modifier_ascension_armor_sapping" "死亡诅咒" + "DOTA_Tooltip_modifier_ascension_armor_sapping_Description" "由于击杀敌方单位,护甲降低%dMODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS%点。" + + "DOTA_Tooltip_modifier_ascension_heal_suppression_aura" "恶化力场" + "DOTA_Tooltip_modifier_ascension_heal_suppression_aura_Description" "减少附近单位%dMODIFIER_PROPERTY_TOOLTIP%%%治疗效果。" + + "DOTA_Tooltip_modifier_ascension_heal_suppression" "恶化力场" + "DOTA_Tooltip_modifier_ascension_heal_suppression_Description" "治疗效果降低%dMODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS%。" + + "DOTA_Tooltip_modifier_ascension_extra_fast" "奔腾不息" + "DOTA_Tooltip_modifier_ascension_extra_fast_Description" "移动速度提升%dMODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE%%%,并且无法被减速。" + + "DOTA_Tooltip_modifier_ascension_vampiric" "吸血鬼化" + "DOTA_Tooltip_modifier_ascension_vampiric_Description" "%dMODIFIER_PROPERTY_TOOLTIP%%%吸血。" + + "DOTA_Tooltip_modifier_ascension_chilling_touch" "极寒之触" + "DOTA_Tooltip_modifier_ascension_chilling_touch_Description" "这个生物造成伤害时将减缓目标%dMODIFIER_PROPERTY_TOOLTIP%%%移动速度,持续%fMODIFIER_PROPERTY_TOOLTIP%秒。多个负面效果将会叠加。" + + "DOTA_Tooltip_modifier_ogre_magi_channelled_bloodlust" "魔法师的嗜血术" + "DOTA_Tooltip_modifier_ogre_magi_channelled_bloodlust_Description" "移动和攻击速度更快。" + + "DOTA_Tooltip_modifier_battle_royale_damage" "阿哈利姆的失望" + "DOTA_Tooltip_modifier_battle_royale_damage_Description" "进入当前房间的战斗,不然他不高兴了你就难受了!" + + "DOTA_Tooltip_modifier_sand_king_boss_caustic_finale" "腐尸毒" + "DOTA_Tooltip_modifier_sand_king_boss_caustic_finale_Description" "每次叠加减少10%%护甲。" + + "DOTA_Tooltip_modifier_lifestealer_damage_counter" "酝酿狂暴" + "DOTA_Tooltip_modifier_lifestealer_damage_counter_Description" "短时间内受到大量伤害时将会进入狂暴状态。" + + "DOTA_Tooltip_modifier_lifestealer_enraged" "狂暴" + "DOTA_Tooltip_modifier_lifestealer_enraged_Description" "移动速度和攻击速度得到极大提升。" + + "DOTA_Tooltip_ability_morty_hop" "喂食饼干" + "DOTA_Tooltip_ability_morty_hop_Description" "给马迪喂一块饼干。持续施法的时间越长,能跳得也越快。" + + "DOTA_Tooltip_modifier_urn_upheaval" "灵龛的掌控" + "DOTA_Tooltip_modifier_urn_upheaval_Description" "移动速度大幅下降。" + + + "DOTA_Tooltip_ability_aghsfort_luna_lucent_beam" "月光" + "DOTA_Tooltip_ability_aghsfort_luna_lucent_beam_Description" "召唤一道月能的光束打击目标附近%radius%范围的敌人,造成伤害并短暂眩晕目标。" + "DOTA_Tooltip_ability_aghsfort_luna_lucent_beam_Lore" "那些侵犯银夜森林的家伙会受到赛莉蒙妮的毁灭打击。" + "DOTA_Tooltip_ability_aghsfort_luna_lucent_beam_stun_duration" "眩晕时间:" + "DOTA_Tooltip_ability_aghsfort_luna_lucent_beam_beam_damage" "月光伤害:" + "DOTA_Tooltip_ability_aghsfort_luna_lucent_beam_radius" "作用范围:" + + "DOTA_Tooltip_ability_aghsfort_luna_eclipse" "月蚀" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_Lore" "在急需其帮助的时候,赛莉蒙妮亲自降临世间,遮蔽照向敌人的光芒,以及他们的希望。" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_Description" "召唤一次月蚀,以她当前技能等级的月光随机打击附近敌人。月光只有伤害效果,不会造成眩晕,而且单一目标只能受到有限次数的打击。月蚀会暂时将白天变为黑夜,持续10秒。\n\n可用神杖升级。" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_Note0" "如果露娜没有升级月光,月蚀将无法造成伤害,但是变为黑夜效果有效。" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_Note1" "露娜阵亡后月光马上中止。" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_Note2" "月蚀不会造成眩晕。" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_Note3" "不能伤害隐身单位。" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_Note4" "每道月光之间都有0.6秒的间隔。神杖升级后间隔为0.3秒。" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_beams" "月光数量:" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_hit_count" "最大单体打击次数:" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_radius" "作用范围:" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_duration_tooltip" "月蚀持续时间:" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_beams_scepter" "神杖升级月光数量:" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_duration_tooltip_scepter" "神杖升级持续时间:" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_cast_range_tooltip_scepter" "神杖升级施法距离:" + "DOTA_Tooltip_ability_aghsfort_luna_eclipse_aghanim_description" "露娜可以对友方单位或自身施放月蚀,使月蚀的效果跟随他,或者在一片区域上施放。同时增加月光数量,延长月蚀持续时间,并且移除单体打击次数上限,月光的产生间隔缩短一半。" + + "DOTA_Tooltip_ability_monkey_king_jingu_mastery_aghsfort" "如意棒法" + "DOTA_Tooltip_ability_monkey_king_jingu_mastery_aghsfort_Description" "主动技能。 齐天大圣获得4次增强后的攻击,拥有额外攻击力和吸血效果。" + + "DOTA_Tooltip_Ability_rock_golem_split_a" "碎裂" + "DOTA_Tooltip_ability_rock_golem_split_a_Description" "傀儡的灵魂转移至破裂身躯的碎片中。" + "DOTA_Tooltip_Ability_rock_golem_split_b" "碎裂" + "DOTA_Tooltip_ability_rock_golem_split_b_Description" "傀儡的灵魂转移至破裂身躯的碎片中。" + + "DOTA_Tooltip_modifier_aghsfort_player_transform" "已变身" + "DOTA_Tooltip_modifier_aghsfort_player_transform_Description" "你的内在自我已向所有人暴露。无法治疗、施法或使用物品。" + + "DOTA_Tooltip_modifier_bandit_archer_arrow_debuff" "荒漠射手神箭" + "DOTA_Tooltip_modifier_bandit_archer_arrow_debuff_Description" "这个单位正处于破坏作用下。" + + // Artifacts + "DOTA_Tooltip_Ability_item_life_rune" "Life Rune" + + "DOTA_Tooltip_ability_item_book_of_strength" "力量之书" + "DOTA_Tooltip_ability_item_book_of_strength_Description" "消耗后永久获得3点力量。" + "DOTA_Tooltip_ability_item_book_of_agility" "敏捷之书" + "DOTA_Tooltip_ability_item_book_of_agility_Description" "消耗后永久获得3点敏捷。" + "DOTA_Tooltip_ability_item_book_of_intelligence" "智力之书" + "DOTA_Tooltip_ability_item_book_of_intelligence_Description" "消耗后永久获得3点智力。" + + "DOTA_Tooltip_ability_item_book_of_greater_strength" "刚毅之书" + "DOTA_Tooltip_ability_item_book_of_greater_strength_Description" "消耗后永久获得5点力量。" + "DOTA_Tooltip_ability_item_book_of_greater_agility" "迅捷之书" + "DOTA_Tooltip_ability_item_book_of_greater_agility_Description" "消耗后永久获得5点敏捷。" + "DOTA_Tooltip_ability_item_book_of_greater_intelligence" "洞察之书" + "DOTA_Tooltip_ability_item_book_of_greater_intelligence_Description" "消耗后永久获得5点智力。" + + "DOTA_Tooltip_ability_item_creed_of_omniscience" "全能信条" + "DOTA_Tooltip_ability_item_creed_of_omniscience_Description" "

被动:研习

获得额外经验。\n" + "DOTA_Tooltip_ability_item_creed_of_omniscience_bonus_xp" "%额外经验:" + "DOTA_Tooltip_ability_item_creed_of_omniscience_Lore" "全能之神赐我荣耀!" + + "DOTA_Tooltip_ability_item_oblivions_locket" "湮灭挂件" + "DOTA_Tooltip_ability_item_oblivions_locket_Description" "

主动:闹鬼

持续施法 - 变成虚无状态,对物理伤害免疫,但承受%extra_spell_damage_percent%%%额外魔法伤害,最多持续1秒。\n" + "DOTA_Tooltip_ability_item_oblivions_locket_bonus_all_stats" "全属性加成:" + "DOTA_Tooltip_ability_item_oblivions_locket_Lore" "一具骷髅的护符。用来防止日子难过。" + + "DOTA_Tooltip_ability_item_pelt_of_the_old_wolf" "暮狼毛皮" + "DOTA_Tooltip_ability_item_pelt_of_the_old_wolf_Description" "" + "DOTA_Tooltip_ability_item_pelt_of_the_old_wolf_Lore" "野外充满着勾心斗角;别放松警惕。" + "DOTA_Tooltip_ability_item_pelt_of_the_old_wolf_bonus_armor" "护甲加成:" + "DOTA_Tooltip_ability_item_pelt_of_the_old_wolf_bonus_move_speed" "移动速度加成:" + "DOTA_Tooltip_ability_item_pelt_of_the_old_wolf_bonus_evasion" "%额外闪避:" + + "DOTA_Tooltip_Ability_item_keen_optic" "基恩镜片" + + "DOTA_Tooltip_ability_item_paw_of_lucius" "卢修兕之爪" + "DOTA_Tooltip_ability_item_paw_of_lucius_Description" "

被动:利爪

普通攻击有%rupture_chance%%%几率触发割裂。\n" + "DOTA_Tooltip_ability_item_paw_of_lucius_Lore" "这一爪会深深插入。" + "DOTA_Tooltip_ability_item_paw_of_lucius_bonus_strength" "力量加成:" + "DOTA_Tooltip_ability_item_paw_of_lucius_bonus_attack_speed" "攻击速度加成:" + + "DOTA_Tooltip_ability_item_longclaws_amulet" "长爪护符" + "DOTA_Tooltip_ability_item_longclaws_amulet_Description" "" + "DOTA_Tooltip_ability_item_longclaws_amulet_Lore" "在维尔德,魔法有点不寻常,它的秘密正被严密守护。" + "DOTA_Tooltip_ability_item_longclaws_amulet_spell_lifesteal_pct" "%技能吸血:" + "DOTA_Tooltip_ability_item_longclaws_amulet_cooldown_reduction_pct" "%冷却时间减少:" + "DOTA_Tooltip_ability_item_longclaws_amulet_mana_cost_reduction_pct" "%魔法消耗降低:" + + "DOTA_Tooltip_ability_item_bogduggs_cudgel" "波格达格的巨棍" + "DOTA_Tooltip_ability_item_bogduggs_cudgel_Description" "

被动:粉碎

仅近战 - 所有攻击速度减半,但是攻击在目标%damage_radius%范围内造成溅射伤害,并且眩晕%stun_duration%秒。\n" + "DOTA_Tooltip_ability_item_bogduggs_cudgel_Lore" "波格达格提着最大的棍子来骨末山脊称王。" + "DOTA_Tooltip_ability_item_bogduggs_cudgel_bonus_strength" "力量加成:" + "DOTA_Tooltip_ability_item_bogduggs_cudgel_bonus_damage" "攻击力加成:" + + "DOTA_Tooltip_ability_item_bogduggs_baldric" "波格达格的肩带" + "DOTA_Tooltip_ability_item_bogduggs_baldric_Description" "" + "DOTA_Tooltip_ability_item_bogduggs_baldric_Lore" "跑来跑去可没有打人爽。太无聊了。" + "DOTA_Tooltip_ability_item_bogduggs_baldric_bonus_armor" "护甲加成:" + "DOTA_Tooltip_ability_item_bogduggs_baldric_disable_resist_pct" "%眩晕时间减少:" + "DOTA_Tooltip_ability_item_bogduggs_baldric_move_speed_penalty" "移动速度减少:" + + "DOTA_Tooltip_ability_item_bogduggs_lucky_femur" "波格达格的幸运股骨" + "DOTA_Tooltip_ability_item_bogduggs_lucky_femur_Description" "

被动:好运连连

在施放一个技能后,有%refresh_pct%%%的几率马上刷新该技能,被刷新的技能进入冷却后,幸运股骨也将进入冷却时间。\n" + "DOTA_Tooltip_ability_item_bogduggs_lucky_femur_Lore" "再来一次!" + "DOTA_Tooltip_ability_item_bogduggs_lucky_femur_max_mana_penalty" "最大魔法值降低:" + "DOTA_Tooltip_ability_item_bogduggs_lucky_femur_intelligence_penalty" "智力减少:" + "DOTA_Tooltip_ability_item_bogduggs_lucky_femur_mana_regen_sec" "额外魔法恢复:" + + "DOTA_Tooltip_ability_item_sign_of_the_arachnid" "蛛形印记" + "DOTA_Tooltip_ability_item_sign_of_the_arachnid_Description" "

被动:蛛形光环

友军获得额外移动速度和攻击速度。" + "DOTA_Tooltip_ability_item_sign_of_the_arachnid_Lore" "一个授予蛛丝之路追随者的不祥标志。" + "DOTA_Tooltip_ability_item_sign_of_the_arachnid_bonus_agility" "敏捷加成:" + "DOTA_Tooltip_ability_item_sign_of_the_arachnid_bonus_move_speed_pct" "%光环移动速度加成:" + "DOTA_Tooltip_ability_item_sign_of_the_arachnid_attack_speed" "光环攻击速度加成:" + + "DOTA_Tooltip_modifier_item_sign_of_the_arachnid_effect" "蛛形光环" + "DOTA_Tooltip_modifier_item_sign_of_the_arachnid_effect_Description" "获得移动速度和攻击速度加成。" + + "DOTA_Tooltip_ability_item_unhallowed_icon" "不洁之像" + "DOTA_Tooltip_ability_item_unhallowed_icon_Description" "

被动:血缘光环

友军获得额外的生命恢复速率。攻击任何单位后,造成伤害的%lifesteal_pct%%%将会变成吸取的生命值均摊给光环作用下的所有单位。" + "DOTA_Tooltip_ability_item_unhallowed_icon_Lore" "由地下世界的守护者佩戴的画像。" + "DOTA_Tooltip_ability_item_unhallowed_icon_bonus_strength" "力量加成:" + "DOTA_Tooltip_ability_item_unhallowed_icon_lifesteal_pct" "%光环均摊吸血:" + "DOTA_Tooltip_ability_item_unhallowed_icon_hp_regen" "光环生命恢复:" + + "DOTA_Tooltip_modifier_item_unhallowed_icon_effect" "血缘光环" + "DOTA_Tooltip_modifier_item_unhallowed_icon_effect_Description" "获得额外的生命恢复速率。物理攻击可以吸血,并均摊给血缘光环作用下的所有单位。" + + "DOTA_Tooltip_ability_item_preserved_skull" "坚韧之颅" + "DOTA_Tooltip_ability_item_preserved_skull_Description" "

被动:祈灵光环

友军获得额外的魔法恢复速率和冷却时间减少。" + "DOTA_Tooltip_ability_item_preserved_skull_Lore" "你再嘲笑啊?" + "DOTA_Tooltip_ability_item_preserved_skull_bonus_intelligence" "智力加成:" + "DOTA_Tooltip_ability_item_preserved_skull_cooldown_reduction_pct" "%光环冷却时间减少:" + "DOTA_Tooltip_ability_item_preserved_skull_aura_mana_regen" "光环魔法恢复:" + + "DOTA_Tooltip_modifier_item_preserved_skull_effect" "祈灵光环" + "DOTA_Tooltip_modifier_item_preserved_skull_effect_Description" "获得魔法恢复和冷却时间减少加成。" + + "DOTA_Tooltip_ability_item_treads_of_ermacor" "艾莫克之鞋" + "DOTA_Tooltip_ability_item_treads_of_ermacor_Description" "多个鞋类物品提供的移动速度加成不叠加。" + "DOTA_Tooltip_ability_item_treads_of_ermacor_Lore" "获得额外魔法恢复速率和冷却时间减少。" + "DOTA_Tooltip_ability_item_treads_of_ermacor_bonus_movement_speed" "移动速度加成:" + "DOTA_Tooltip_ability_item_treads_of_ermacor_bonus_attack_speed" "攻击速度加成:" + "DOTA_Tooltip_ability_item_treads_of_ermacor_bonus_all_stats" "全属性加成:" + + "DOTA_Tooltip_ability_item_rhyziks_eye" "莱兹克之眼" + "DOTA_Tooltip_ability_item_rhyziks_eye_Description" "" + "DOTA_Tooltip_ability_item_rhyziks_eye_Lore" "腐化者的眼中存在着力量。" + "DOTA_Tooltip_ability_item_rhyziks_eye_bonus_all_stats" "全属性加成:" + "DOTA_Tooltip_ability_item_rhyziks_eye_bonus_damage_pct" "%攻击力加成:" + "DOTA_Tooltip_ability_item_rhyziks_eye_damage_reduction" "%受到伤害降低:" + "DOTA_Tooltip_ability_item_rhyziks_eye_mana_regen_sec" "额外魔法恢复:" + "DOTA_Tooltip_ability_item_rhyziks_eye_hp_regen_sec" "额外生命恢复:" + + "DOTA_Tooltip_ability_item_guardian_shell" "卫士之壳" + "DOTA_Tooltip_ability_item_guardian_shell_Description" "

被动:坚定不移

不受减速和缠绕效果影响。" + "DOTA_Tooltip_ability_item_guardian_shell_Lore" "一往无前,没有尘世的牵挂。" + "DOTA_Tooltip_ability_item_guardian_shell_bonus_armor" "护甲加成:" + "DOTA_Tooltip_ability_item_guardian_shell_magic_resistance" "%魔法抗性加成:" + + "DOTA_Tooltip_ability_item_watchers_gaze" "守卫之眼" + "DOTA_Tooltip_ability_item_watchers_gaze_Description" "

主动:石化凝视

前方锥形区域内的敌人将变成石头,并承受额外的物理伤害。\n" + "DOTA_Tooltip_ability_item_watchers_gaze_Lore" "看着你的敌人,亲见他们在你面前石化。" + "DOTA_Tooltip_ability_item_watchers_gaze_bonus_stats" "全属性加成:" + + "DOTA_Tooltip_ability_item_carapace_of_qaldin" "卡尔丁甲壳" + "DOTA_Tooltip_ability_item_carapace_of_qaldin_Description" "

被动:酸性恢复

所有获得的魔法和生命恢复效果加倍,而且所有受到的伤害会有一部分反弹给攻击者。\n" + "DOTA_Tooltip_ability_item_carapace_of_qaldin_Lore" "让他们攻击,每次都会有鲜血的代价。" + "DOTA_Tooltip_ability_item_carapace_of_qaldin_bonus_hp" "生命加成:" + "DOTA_Tooltip_ability_item_carapace_of_qaldin_bonus_mana" "额外魔法:" + "DOTA_Tooltip_ability_item_carapace_of_qaldin_bonus_restore_pct" "%额外回复:" + "DOTA_Tooltip_ability_item_carapace_of_qaldin_damage_return_pct" "%反弹伤害:" + + "DOTA_Tooltip_ability_item_the_caustic_finale" "腐蚀剧毒" + "DOTA_Tooltip_ability_item_the_caustic_finale_Description" "

被动:腐蚀毒素

普通攻击会降低目标一定百分比的护甲。效果可以叠加至%max_stack_count%次。如果目标在这个效果下死亡将会爆炸,对范围内敌人造成伤害。\n" + "DOTA_Tooltip_ability_item_the_caustic_finale_Lore" "腐蚀的天赋总是能被重用。" + "DOTA_Tooltip_ability_item_the_caustic_finale_bonus_damage" "攻击力加成:" + "DOTA_Tooltip_ability_item_the_caustic_finale_bonus_attack_speed" "攻击速度提升:" + "DOTA_Tooltip_ability_item_the_caustic_finale_caustic_armor_reduction_pct" "%每次叠加削弱护甲:" + "DOTA_Tooltip_ability_item_the_caustic_finale_caustic_radius" "剧毒作用范围:" + "DOTA_Tooltip_ability_item_the_caustic_finale_caustic_damage" "剧毒伤害:" + "DOTA_Tooltip_ability_item_the_caustic_finale_max_stack_count" "最大叠加次数:" + + "DOTA_Tooltip_ability_item_winter_embrace" "寒冬之拥" + "DOTA_Tooltip_ability_item_winter_embrace_Description" "

被动:寒冰外壳

受到物理攻击时,攻击者的攻击和移动速度被降低,持续%slow_duration%秒。\n" + "DOTA_Tooltip_ability_item_winter_embrace_Lore" "现在是谁麻了?" + "DOTA_Tooltip_ability_item_winter_embrace_bonus_intelligence" "智力加成:" + "DOTA_Tooltip_ability_item_winter_embrace_bonus_armor" "护甲加成:" + + "DOTA_Tooltip_ability_item_ice_dragon_maw" "冰龙之喉" + "DOTA_Tooltip_ability_item_ice_dragon_maw_Description" "

被动:极寒撕咬

每次攻击有%chance_to_freeze%%%几率冻结目标,持续%freeze_duration%秒。\n" + "DOTA_Tooltip_ability_item_ice_dragon_maw_Lore" "你的眼里满是冰霜!" + "DOTA_Tooltip_ability_item_ice_dragon_maw_bonus_attack_range" "攻击距离加成(仅远程):" + "DOTA_Tooltip_ability_item_ice_dragon_maw_bonus_damage" "攻击力加成:" + + "DOTA_Tooltip_ability_item_precious_egg" "珍稀龙蛋" + "DOTA_Tooltip_ability_item_precious_egg_Description" "

被动:最后机会

受到致死伤害时有%chance_to_resist_death%%%几率使佩戴者以1点生命生还。\n" + "DOTA_Tooltip_ability_item_precious_egg_Lore" "在探索学识的研习之际,古龙掌握了延缓生命之息流失的诀窍。" + "DOTA_Tooltip_ability_item_precious_egg_bonus_all_stats" "全属性加成:" + + "DOTA_Tooltip_ability_item_stony_coat" "岩石外衣" + "DOTA_Tooltip_ability_item_stony_coat_Description" "

被动:阻塞

佩戴者受到伤害时有%boulder_chance%%%几率反击,扔出一块巨石,造成%boulder_damage%点伤害,并眩晕%boulder_stun_duration%秒。\n" + "DOTA_Tooltip_ability_item_stony_coat_Lore" "只是一石之遥。" + "DOTA_Tooltip_ability_item_stony_coat_bonus_strength" "力量加成:" + "DOTA_Tooltip_ability_item_stony_coat_bonus_armor" "护甲加成:" + + "DOTA_Tooltip_ability_item_stonework_pendant" "石制坠饰" + "DOTA_Tooltip_ability_item_stonework_pendant_Description" "

被动:石头里还是能榨出血的。

现在施放技能时消耗生命,数值为所需魔法的%hp_cost_multiplier%倍,并且佩戴者获得额外的生命值和生命恢复,数值分别等于魔法值和魔法恢复。\n" + "DOTA_Tooltip_ability_item_stonework_pendant_Lore" "石头里还是能榨出血的。" + "DOTA_Tooltip_ability_item_stonework_pendant_spell_lifesteal" "%技能吸血:" + + "DOTA_Tooltip_ability_item_gravel_foot" "砂砾之足" + "DOTA_Tooltip_ability_item_gravel_foot_Description" "" + "DOTA_Tooltip_ability_item_gravel_foot_Lore" "在任何地方都能站稳脚跟。" + "DOTA_Tooltip_ability_item_gravel_foot_bonus_movement_speed" "移动速度加成:" + "DOTA_Tooltip_ability_item_gravel_foot_bonus_all_stats" "全属性加成:" + "DOTA_Tooltip_ability_item_gravel_foot_bonus_hp_regen" "额外生命恢复:" + "DOTA_Tooltip_ability_item_gravel_foot_damage_block" "伤害格挡:" + + + "DOTA_Tooltip_modifier_book_of_strength" "力量之书" + "DOTA_Tooltip_modifier_book_of_strength_Description" "消耗后获得了力量。" + "DOTA_Tooltip_modifier_book_of_agility" "敏捷之书" + "DOTA_Tooltip_modifier_book_of_agility_Description" "消耗后获得了敏捷。" + "DOTA_Tooltip_modifier_book_of_intelligence" "智力之书" + "DOTA_Tooltip_modifier_book_of_intelligence_Description" "消耗后获得了智力。" + + "DOTA_Tooltip_Ability_item_wand_of_the_brine" "苍洋魔杖" + "DOTA_Tooltip_Ability_item_wand_of_the_brine_Lore" "要不是这把尊崇的魔杖,教团在石鱼门一役就全军覆没。" + "DOTA_Tooltip_Ability_item_wand_of_the_brine_Description" "

主动:苍洋泡沫

使一个友方单位进入具有防护效果的疗伤泡泡,持续%bubble_duration%秒,每%heal_tick_interval%秒治疗%bubble_heal_per_tick%点生命。" + "DOTA_Tooltip_Ability_item_wand_of_the_brine_bonus_intelligence" "+$int" + "DOTA_Tooltip_Ability_item_wand_of_the_brine_bonus_mana_regen_pct" "%+$mana_regen" + + "DOTA_Tooltip_modifier_item_wand_of_the_brine_bubble" "苍洋泡沫" + "DOTA_Tooltip_modifier_item_wand_of_the_brine_bubble_Description" "这个单位正受到苍洋泡沫的保护。每秒恢复300点生命。" + + "DOTA_Tooltip_Ability_item_slippers_of_the_abyss" "深渊便鞋" + "DOTA_Tooltip_Ability_item_slippers_of_the_abyss_Lore" "在浩瀚的深海,动得不够快就会死得非常快。" + "DOTA_Tooltip_Ability_item_slippers_of_the_abyss_Description" "

主动:水性冲刺

移动速度提升%sprint_bonus_ms%,持续%sprint_duration%秒。" + "DOTA_Tooltip_Ability_item_slippers_of_the_abyss_bonus_movement_speed" "移动速度加成:" + "DOTA_Tooltip_Ability_item_slippers_of_the_abyss_bonus_atk_speed" "攻击速度加成:" + "DOTA_Tooltip_Ability_item_slippers_of_the_abyss_bonus_strength" "+$str" + "DOTA_Tooltip_Ability_item_slippers_of_the_abyss_bonus_agility" "+$agi" + + "DOTA_Tooltip_modifier_item_slippers_of_the_abyss_sprint" "水性冲刺" + "DOTA_Tooltip_modifier_item_slippers_of_the_abyss_sprint_Description" "这个单位的移动速度得到极大提升。" + //"DOTA_Tooltip_modifier_item_slippers_of_the_abyss_sprint_sprint_bonus_ms" "%BONUS MOVEMENT SPEED:" + //"DOTA_Tooltip_modifier_item_slippers_of_the_abyss_sprint_sprint_bonus_dmg" "%BONUS MOVEMENT SPEED:" + + "DOTA_Tooltip_Ability_item_glimmerdark_shield" "荧光护盾" + "DOTA_Tooltip_Ability_item_glimmerdark_shield_Lore" "这面盾牌的首位拥有者觉得自己在战场上已经所向无敌。直到第二位拥有者的魔法出现。" + "DOTA_Tooltip_Ability_item_glimmerdark_shield_Description" "

主动:闪光

对物理伤害免疫,但是受到的魔法伤害增加%tooltip_prism_bonus_magic_dmg%%。持续%prism_duration%秒。" + "DOTA_Tooltip_Ability_item_glimmerdark_shield_bonus_strength" "+$str" + "DOTA_Tooltip_Ability_item_glimmerdark_shield_bonus_agility" "+$agi" + "DOTA_Tooltip_Ability_item_glimmerdark_shield_bonus_intellect" "+$int" + "DOTA_Tooltip_Ability_item_glimmerdark_shield_bonus_armor" "护甲加成:" + "DOTA_Tooltip_Ability_item_glimmerdark_shield_bonus_health_regen" "生命恢复加成:" + + "DOTA_Tooltip_modifier_item_glimmerdark_shield_prism" "闪光" + "DOTA_Tooltip_modifier_item_glimmerdark_shield_prism_Description" "这个单位对物理伤害免疫,但是受到的魔法伤害大幅增加。" + + "DOTA_Tooltip_Ability_item_dredged_trident" "破泞之主的疏浚三叉戟" + "DOTA_Tooltip_Ability_item_dredged_trident_Description" "

被动:致命一击

每次攻击有%crit_chance%%几率造成%crit_multiplier%%%额外伤害。" + "DOTA_Tooltip_ability_item_dredged_trident_Lore" "很久以前从深海中拔出后,破泞之主就将这把毁灭性的武器据为己有。" + "DOTA_Tooltip_Ability_item_dredged_trident_bonus_damage" "+$damage" + //"DOTA_Tooltip_Ability_item_dredged_trident_crit_chance" "CRIT CHANCE:" + //"DOTA_Tooltip_Ability_item_dredged_trident_crit_multiplier" "CRIT MULTIPLIER:" + + "DOTA_Tooltip_Ability_item_ambient_sorcery" "环域巫术" + "DOTA_Tooltip_Ability_item_ambient_sorcery_Description" "

被动:环域巫术

使周围单位的魔法抗性降低%aura_magic_reduction%%。" + "DOTA_Tooltip_ability_item_ambient_sorcery_Lore" "一个闪光的宝珠,盗自一座奥术师高塔。" + "DOTA_Tooltip_Ability_item_ambient_sorcery_bonus_intelligence" "+$int" + + "DOTA_Tooltip_modifier_item_ambient_sorcery_effect" "环域巫术" + "DOTA_Tooltip_modifier_item_ambient_sorcery_effect_Description" "这个单位受到的魔法伤害增加。" + + "DOTA_Tooltip_Ability_item_ogre_seal_totem" "食人魔海豹图腾" + "DOTA_Tooltip_Ability_item_ogre_seal_totem_Description" "

主动:食人魔海豹扑打

像食人魔海豹一样扑打,每次造成%damage%点伤害并眩晕%stun_duration%秒。" + "DOTA_Tooltip_ability_item_ogre_seal_totem_Lore" "从食人魔海豹的牙齿雕刻而来的图腾。" + "DOTA_Tooltip_Ability_item_ogre_seal_totem_bonus_strength" "力量加成:" + "DOTA_Tooltip_Ability_item_ogre_seal_totem_bonus_hp" "生命加成:" + + "DOTA_Tooltip_Ability_item_bear_cloak" "熊皮斗篷" + "DOTA_Tooltip_Ability_item_bear_cloak_Description" "

光环:毛糙熊皮

向周围友方单位提供%aura_bonus_magic_resist%%%魔法抗性加成。" + "DOTA_Tooltip_ability_item_bear_cloak_Lore" "野兽的天然护甲并没有缺点。" + "DOTA_Tooltip_Ability_item_bear_cloak_bonus_magic_resist" "自身魔法抗性加成:" + + "DOTA_Tooltip_modifier_item_bear_cloak_effect" "毛糙熊皮" + "DOTA_Tooltip_modifier_item_bear_cloak_effect_Description" "这个单位拥有额外魔法抗性。" + + "DOTA_Tooltip_Ability_item_lifestone" "生命之石" + "DOTA_Tooltip_Ability_item_lifestone_Description" "

主动:生命之契

每0.5秒将%pact_hp_cost%点生命值转化为%pact_mana_gained%点魔法。" + "DOTA_Tooltip_ability_item_lifestone_Lore" "灵石渴求鲜血。" + "DOTA_Tooltip_Ability_item_lifestone_hp_regen" "生命恢复:" + + "DOTA_Tooltip_modifier_item_lifestone_pact" "生命之契" + "DOTA_Tooltip_modifier_item_lifestone_pact_Description" "这个单位正将生命转化为魔法。" + + "DOTA_Tooltip_Ability_item_corrupting_blade" "紫罗兰战刃" + "DOTA_Tooltip_Ability_item_corrupting_blade_Description" "

被动:黯寂

每次攻击将降低目标%corruption_armor%点护甲,持续%corruption_duration%秒。" + "DOTA_Tooltip_ability_item_corrupting_blade_Lore" "一件可怕的武器,其铸造图纸早已遗失在紫罗兰档案馆。" + "DOTA_Tooltip_Ability_item_corrupting_blade_bonus_damage" "+$damage" + + "DOTA_Tooltip_modifier_item_corrupting_blade_buff" "黯寂" + "DOTA_Tooltip_modifier_item_corrupting_blade_buff_Description" "紫罗兰战刃的攻击降低该单位14点护甲。" + + "DOTA_Tooltip_Ability_item_amorphotic_shell" "变形之壳" + "DOTA_Tooltip_Ability_item_amorphotic_shell_Description" "

被动:分裂

受到的攻击超过25点时有%amoeba_chance%%%几率产生一只变形虫为自己作战,持续%amoeba_duration%秒。" + "DOTA_Tooltip_ability_item_amorphotic_shell_Lore" "它的形状无法准确把握。" + "DOTA_Tooltip_Ability_item_amorphotic_shell_bonus_strength" "力量加成:" + "DOTA_Tooltip_Ability_item_amorphotic_shell_bonus_intelligence" "智力加成:" + "DOTA_Tooltip_Ability_item_amorphotic_shell_bonus_agility" "敏捷加成:" + + //-------------------------------------------------------------------------------------------------------------- + // AURAS + //-------------------------------------------------------------------------------------------------------------- + "DOTA_Tooltip_ability_aghsfort_aura_reward_hp" "磐石光环" + "DOTA_Tooltip_ability_aghsfort_aura_reward_hp_Description" "提高周围单位的生命值上限。" + "DOTA_Tooltip_ability_aghsfort_aura_reward_hp_bonus_hp" "%生命加成:" + + "DOTA_Tooltip_ability_aghsfort_aura_reward_armor" "穿山甲光环" + "DOTA_Tooltip_ability_aghsfort_aura_reward_armor_Description" "友军的外皮更为坚韧,对物理伤害的抗性提升。" + "DOTA_Tooltip_ability_aghsfort_aura_reward_armor_bonus_armor" "护甲加成:" + + "DOTA_Tooltip_modifier_aghsfort_aura_reward_armor_bonus" "穿山甲光环" + "DOTA_Tooltip_modifier_aghsfort_aura_reward_armor_bonus_Description" "提供%dMODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS%点额外护甲。" + + "DOTA_Tooltip_ability_aghsfort_aura_reward_magic_resist" "魔法斗篷" + "DOTA_Tooltip_ability_aghsfort_aura_reward_magic_resist_Description" "一件具有魔力的斗篷,提升了魔法抗性。" + "DOTA_Tooltip_ability_aghsfort_aura_reward_magic_resist_bonus_magical_armor" "魔法抗性:" + + "DOTA_Tooltip_modifier_aghsfort_aura_reward_magic_resist_bonus" "魔法斗篷" + "DOTA_Tooltip_modifier_aghsfort_aura_reward_magic_resist_bonus_Description" "额外提供%dMODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS%魔法抗性。" + + "DOTA_Tooltip_ability_aghsfort_aura_reward_crit_chance" "剑圣现世" + "DOTA_Tooltip_ability_aghsfort_aura_reward_crit_chance_Description" "友军获得%crit_chance%%%几率造成%crit_multiplier%%%致命一击伤害。" + "DOTA_Tooltip_ability_aghsfort_aura_reward_crit_chance_crit_chance" "%致命一击概率:" + "DOTA_Tooltip_ability_aghsfort_aura_reward_crit_chance_crit_multiplier" "致命一击伤害:" + + "DOTA_Tooltip_modifier_aghsfort_reward_crit_aura_bonus" "剑圣现世" + "DOTA_Tooltip_modifier_aghsfort_reward_crit_aura_bonus_Description" "拥有几率使每次攻击造成致命一击。" + + //-------------------------------------------------------------------------------------------------------------- + // TEMP BUFFS + //-------------------------------------------------------------------------------------------------------------- + "DOTA_Tooltip_ability_aghsfort_tempbuff_corpse_explosion" "尸爆" + "DOTA_Tooltip_ability_aghsfort_tempbuff_corpse_explosion_aura_Description" "敌方单位有几率爆裂成一团血肉,对周围单位造成其25%%最大生命值的魔法伤害。" + "DOTA_Tooltip_ability_aghsfort_tempbuff_corpse_explosion_corpse_explosion_radius" "爆炸范围:" + "DOTA_Tooltip_ability_aghsfort_tempbuff_corpse_explosion_corpse_explosion_damage_pct" "%最大生命值伤害百分比:" + "DOTA_Tooltip_ability_aghsfort_tempbuff_corpse_explosion_corpse_explosion_chance_pct" "%爆炸作用几率:" + + "DOTA_Tooltip_modifier_aghsfort_tempbuff_corpse_explosion_aura" "尸爆" + "DOTA_Tooltip_modifier_aghsfort_tempbuff_corpse_explosion_aura_Description" "敌方单位有几率爆裂成一团血肉,对周围单位造成其25%%最大生命值的魔法伤害。" + + "DOTA_Tooltip_modifier_aghsfort_tempbuff_corpse_explosion_debuff" "膨胀轰动" + "DOTA_Tooltip_modifier_aghsfort_tempbuff_corpse_explosion_debuff_Description" "这个单位死亡时有几率爆炸,对周围单位造成其25%%最大生命值的魔法伤害。" + + //-------------------------------------------------------------------------------------------------------------- + // BLESSING MODIFIERS START + //-------------------------------------------------------------------------------------------------------------- + + "DOTA_Tooltip_modifier_blessing_armor" "护甲祝福" + "DOTA_Tooltip_modifier_blessing_armor_Description" "提供%dMODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS%点额外护甲。" + + "DOTA_Tooltip_modifier_blessing_attack_speed" "攻击速度祝福" + "DOTA_Tooltip_modifier_blessing_attack_speed_Description" "获得%dMODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT%攻击速度。" + + "DOTA_Tooltip_modifier_blessing_evasion" "闪避祝福" + "DOTA_Tooltip_modifier_blessing_evasion_Description" "获得%dMODIFIER_PROPERTY_EVASION_CONSTANT%%%闪避。" + + "DOTA_Tooltip_modifier_blessing_mana_boost" "最大魔法祝福" + "DOTA_Tooltip_modifier_blessing_mana_boost_Description" "获得%dMODIFIER_PROPERTY_EXTRA_MANA_PERCENTAGE%%%最大魔法。" + + "DOTA_Tooltip_modifier_blessing_health_boost" "最大生命祝福" + "DOTA_Tooltip_modifier_blessing_health_boost_Description" "获得%dMODIFIER_PROPERTY_EXTRA_HEALTH_PERCENTAGE%%%点最大生命。" + + "DOTA_Tooltip_modifier_blessing_magic_resist" "魔法抗性祝福" + "DOTA_Tooltip_modifier_blessing_magic_resist_Description" "额外提供%dMODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS%%%魔法抗性。" + + "DOTA_Tooltip_modifier_blessing_magic_damage_bonus" "技能增强福佑" + "DOTA_Tooltip_modifier_blessing_magic_damage_bonus_Description" "获得%dMODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE%%%技能增强。" + + "DOTA_Tooltip_modifier_blessing_damage_bonus" "攻击力加成福佑" + "DOTA_Tooltip_modifier_blessing_damage_bonus_Description" "获得%dMODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE%点攻击力(每级+%dMODIFIER_PROPERTY_TOOLTIP%点)" + + "DOTA_Tooltip_modifier_blessing_movement_speed" "移动速度福佑" + "DOTA_Tooltip_modifier_blessing_movement_speed_Description" "获得%dMODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE%%%移动速度加成。" + + "DOTA_Tooltip_modifier_blessing_damage_reflect" "伤害反弹" + "DOTA_Tooltip_modifier_blessing_damage_reflect_Description" "%dMODIFIER_PROPERTY_TOOLTIP%%%伤害反弹给攻击者。" + + "DOTA_Tooltip_modifier_blessing_spell_life_steal" "法术吸血福佑" + "DOTA_Tooltip_modifier_blessing_spell_life_steal_Description" "%dMODIFIER_PROPERTY_TOOLTIP%%%法术伤害将以生命形式返还。" + + "DOTA_Tooltip_modifier_blessing_life_steal" "吸血福佑" + "DOTA_Tooltip_modifier_blessing_life_steal_Description" "%dMODIFIER_PROPERTY_TOOLTIP%%%攻击伤害将以生命形式返还。" + + "DOTA_Tooltip_modifier_blessing_potion_dragon" "古龙药水福佑" + "DOTA_Tooltip_modifier_blessing_potion_dragon_Description" "古龙药水现在把你变成一头黑龙,攻击力额外提升%dMODIFIER_PROPERTY_TOOLTIP2%点,溅射伤害额外提升%dMODIFIER_PROPERTY_TOOLTIP%%%。" + + "DOTA_Tooltip_modifier_blessing_potion_echo_slam" "回音击药水福佑" + "DOTA_Tooltip_modifier_blessing_potion_echo_slam_Description" "回音击药水额外造成%dMODIFIER_PROPERTY_TOOLTIP%点回音伤害。" + + "DOTA_Tooltip_modifier_blessing_potion_torrent" "洪流药水福佑" + "DOTA_Tooltip_modifier_blessing_potion_torrent_Description" "洪流药水额外拥有%dMODIFIER_PROPERTY_TOOLTIP%%%几率在受到攻击时产生洪流。" + + "DOTA_Tooltip_modifier_blessing_potion_ravage" "毁灭药水福佑" + "DOTA_Tooltip_modifier_blessing_potion_ravage_Description" "毁灭药水击中敌人的范围额外增加%dMODIFIER_PROPERTY_TOOLTIP%。" + + "DOTA_Tooltip_modifier_blessing_potion_shadow_wave" "暗影波药水福佑" + "DOTA_Tooltip_modifier_blessing_potion_shadow_wave_Description" "暗影波药水额外治疗友军和伤害敌人%dMODIFIER_PROPERTY_TOOLTIP%点。" + + "DOTA_Tooltip_modifier_blessing_potion_purification" "洗礼药水福佑" + "DOTA_Tooltip_modifier_blessing_potion_purification_Description" "洗礼药水额外伤害%dMODIFIER_PROPERTY_TOOLTIP%范围内敌人。" + + "DOTA_Tooltip_modifier_blessing_respawn_time_reduction" "复活时间减少福佑" + "DOTA_Tooltip_modifier_blessing_respawn_time_reduction_Description" "复活时间减少%dMODIFIER_PROPERTY_TOOLTIP%%%。" + + "DOTA_Tooltip_modifier_blessing_death_detonation" "死亡引爆" + "DOTA_Tooltip_modifier_blessing_death_detonation_Description" "死亡时产生爆炸,对%dMODIFIER_PROPERTY_TOOLTIP2%范围内造成每级%dMODIFIER_PROPERTY_TOOLTIP%点伤害。" + + "DOTA_Tooltip_modifier_blessing_strength" "力量加成" + "DOTA_Tooltip_modifier_blessing_strength_Description" "提供%dMODIFIER_PROPERTY_STATS_STRENGTH_BONUS%点额外力量。" + + "DOTA_Tooltip_modifier_blessing_agility" "敏捷加成" + "DOTA_Tooltip_modifier_blessing_agility_Description" "提供%dMODIFIER_PROPERTY_STATS_AGILITY_BONUS%点额外敏捷。" + + "DOTA_Tooltip_modifier_blessing_intelligence" "智力奖赏" + "DOTA_Tooltip_modifier_blessing_intelligence_Description" "获得%dMODIFIER_PROPERTY_STATS_INTELLECT_BONUS%点额外敏捷" + + "DOTA_Tooltip_modifier_blessing_potion_health" "生命药水拾取福佑" + "DOTA_Tooltip_modifier_blessing_potion_health_Description" "生命药水治疗你时额外回复%dMODIFIER_PROPERTY_TOOLTIP%%%最大生命值。" + + "DOTA_Tooltip_modifier_blessing_potion_mana" "魔法药水拾取福佑" + "DOTA_Tooltip_modifier_blessing_potion_mana_Description" "生命药水治疗你时额外回复%dMODIFIER_PROPERTY_TOOLTIP%%%最大魔法值。" + + "DOTA_Tooltip_modifier_blessing_restore_mana" "击杀魔法福佑" + "DOTA_Tooltip_modifier_blessing_restore_mana_Description" "每次击杀一名敌人都将回复%dMODIFIER_PROPERTY_TOOLTIP%点魔法。" + + "DOTA_Tooltip_modifier_blessing_respawn_invulnerability" "复活后一段时间内暂时无敌。" + "DOTA_Tooltip_modifier_blessing_respawn_invulnerability_Description" "复活后的武器时间延长%dMODIFIER_PROPERTY_TOOLTIP%秒。" + + "DOTA_Tooltip_modifier_blessing_book_strength" "力量之书福佑" + "DOTA_Tooltip_modifier_blessing_book_strength_Description" "使用力量之书时额外获得%dMODIFIER_PROPERTY_TOOLTIP%点力量。" + + "DOTA_Tooltip_modifier_blessing_book_agility" "敏捷之书福佑" + "DOTA_Tooltip_modifier_blessing_book_agility_Description" "使用敏捷之书时额外获得%dMODIFIER_PROPERTY_TOOLTIP%点敏捷。" + + "DOTA_Tooltip_modifier_blessing_book_intelligence" "智力之书福佑" + "DOTA_Tooltip_modifier_blessing_book_intelligence_Description" "使用智力之书时额外获得%dMODIFIER_PROPERTY_TOOLTIP%点智力。" + + //-------------------------------------------------------------------------------------------------------------- + // BLESSING MODIFIERS END + //-------------------------------------------------------------------------------------------------------------- + + } +} diff --git a/aghanim_singleplayer/scripts/custom.gameevents b/aghanim_singleplayer/scripts/custom.gameevents new file mode 100755 index 0000000..85138a0 --- /dev/null +++ b/aghanim_singleplayer/scripts/custom.gameevents @@ -0,0 +1,53 @@ +// No spaces in event names, max length 32 +// All strings are case sensitive +// +// valid data key types are: +// string : a zero terminated string +// bool : unsigned int, 1 bit +// byte : unsigned int, 8 bit +// short : signed int, 16 bit +// long : signed int, 32 bit +// float : float, 32 bit +// uint64 : unsigned int 64 bit +// local : any data, but not networked to clients +// +// following key names are reserved: +// local : if set to 1, event is not networked to clients +// unreliable : networked, but unreliable +// suppress : never fire this event +// time : firing server time +// eventid : holds the event ID + +"CustomEvents" +{ + "trigger_start_touch" + { + "trigger_name" "string" + "activator_entindex" "short" + "caller_entindex" "short" + } + "trigger_end_touch" + { + "trigger_name" "string" + "activator_entindex" "short" + "caller_entindex" "short" + } + "aghsfort_ascension_level_selected" + { + "level" "short" + } + "aghsfort_path_selected" + { + "selected_room" "string" + } + "bullet" + { + "player_id" "short" + "text" "string" + "target" "string" + "item" "string" + "item_level" "short" + "ban" "string" + } +} + diff --git a/aghanim_singleplayer/scripts/custom_net_tables.txt b/aghanim_singleplayer/scripts/custom_net_tables.txt new file mode 100755 index 0000000..635eac5 --- /dev/null +++ b/aghanim_singleplayer/scripts/custom_net_tables.txt @@ -0,0 +1,22 @@ + +{ + custom_net_tables = + [ + "aghanim_scores", + "game_global", + "special_ability_upgrades", + "respawns_remaining", + "revive_state", + + "room_data", + + "reward_options", + "reward_choices", + "minor_ability_upgrades", + + "boss_net_table", + "currency_rewards", + + "encounter_state", + ] +} diff --git a/aghanim_singleplayer/scripts/npc/herolist.txt b/aghanim_singleplayer/scripts/npc/herolist.txt new file mode 100755 index 0000000..856e09d --- /dev/null +++ b/aghanim_singleplayer/scripts/npc/herolist.txt @@ -0,0 +1,72 @@ +// +// +// Hero currently on/off, will be # of instances (-1 = infinite) +// + +"CustomHeroList" +{ + //--------------- ENABLED ----------------- + + "npc_dota_hero_disruptor" "1" + "npc_dota_hero_magnataur" "1" + "npc_dota_hero_mars" "1" + "npc_dota_hero_snapfire" "1" + "npc_dota_hero_sniper" "1" + "npc_dota_hero_tusk" "1" + "npc_dota_hero_ursa" "1" + "npc_dota_hero_viper" "1" + "npc_dota_hero_weaver" "1" + "npc_dota_hero_winter_wyvern" "1" + + // Next + "npc_dota_hero_omniknight" "1" + "npc_dota_hero_witch_doctor" "1" + "npc_dota_hero_phantom_assassin" "1" + + + //---------------- DISABLED ----------------- + + // Top candidates + "npc_dota_hero_axe" "0" + "npc_dota_hero_centaur" "0" // aghs Stampede allows phasing through obstructions + "npc_dota_hero_legion_commander" "0" + "npc_dota_hero_phantom_assassin" "0" + "npc_dota_hero_pangolier" "0" + + // Tanky + "npc_dota_hero_bristleback" "0" + "npc_dota_hero_dragon_knight" "0" + "npc_dota_hero_sven" "0" + "npc_dota_hero_tidehunter" "0" + "npc_dota_hero_tiny" "0" + "npc_dota_hero_treant" "0" + + // Fighter + "npc_dota_hero_juggernaut" "0" + "npc_dota_hero_kunkka" "0" + "npc_dota_hero_templar_assassin" "0" + "npc_dota_hero_troll_warlord" "0" + + // Archer + "npc_dota_hero_clinkz" "0" + "npc_dota_hero_drow_ranger" "0" + "npc_dota_hero_medusa" "0" + + // Wizard + "npc_dota_hero_crystal_maiden" "0" + "npc_dota_hero_dazzle" "0" + "npc_dota_hero_invoker" "0" + "npc_dota_hero_jakiro" "0" + "npc_dota_hero_keeper_of_the_light" "0" + "npc_dota_hero_leshrac" "0" + "npc_dota_hero_lina" "0" + "npc_dota_hero_necrolyte" "0" + "npc_dota_hero_shadow_shaman" "0" + "npc_dota_hero_venomancer" "0" + "npc_dota_hero_weaver" "0" + "npc_dota_hero_zuus" "0" + + // Rogue + "npc_dota_hero_bounty" "0" + "npc_dota_hero_riki" "0" +} diff --git a/aghanim_singleplayer/scripts/npc/npc_abilities_custom.txt b/aghanim_singleplayer/scripts/npc/npc_abilities_custom.txt new file mode 100755 index 0000000..f3f17c3 --- /dev/null +++ b/aghanim_singleplayer/scripts/npc/npc_abilities_custom.txt @@ -0,0 +1,23552 @@ +// Dota Heroes File +"DOTAAbilities" +{ + "Version" "1" + + + //================================================================================================================= + // Ability: Ability Capture + //================================================================================================================= + "ability_aghsfort_capture" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityCastAnimation" "ACT_DOTA_GENERIC_CHANNEL_1" + "MaxLevel" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "300" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "base_capture_time" "6.0" + } + } + } + + //================================================================================================================= + // Phased + //================================================================================================================= + "phased" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/phased" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + } + + //================================================================================================================= + // Story Crystal + //================================================================================================================= + "story_crystal" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/story_crystal" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + } + + //================================================================================================================= + // Unselectable + //================================================================================================================= + "ability_unselectable" + { + "BaseClass" "ability_datadriven" + "AbilityName" "ability_unselectable" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + "Modifiers" + { + "modifier_unselectable" + { + "IsHidden" "1" + "Passive" "1" + + "States" + { + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + } + + //================================================================================================================= + // No Vision + //================================================================================================================= + "no_vision" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "BaseClass" "ability_datadriven" + "IsOnCastBar" "0" + "Modifiers" + { + "modifier_no_vision" + { + "Passive" "1" + "States" + { + "MODIFIER_STATE_BLIND" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + } + + //================================================================================================================= + // Creature: Announcer Passive + //================================================================================================================= + "aghanim_announcer_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/aghanim_announcer_passive" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + } + + //================================================================================================================= + // Creature: Dummy Caster Passive + //================================================================================================================= + "dummy_caster_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/dummy_caster_passive" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + } + + //================================================================================================================= + // Creature: Dummy Target Passive + //================================================================================================================= + "dummy_target_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/dummy_target_passive" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + } + + //================================================================================================================= + // No health bar + //================================================================================================================= + "no_health_bar" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + + "BaseClass" "ability_datadriven" + + "IsOnCastBar" "0" + + "Modifiers" + { + "modifier_no_health_bar" + { + "Passive" "1" + "IsHidden" "1" + "States" + { + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + } + + //================================================================================================================= + // Provides FOW Position + //================================================================================================================= + "provides_fow_position" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "terrorblade_reflection" + "ScriptFile" "abilities/provides_fow_position" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + + //================================================================================================================= + // Explosive Barrel + //================================================================================================================= + "aghsfort_explosive_barrel" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "MaxLevel" "19" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "0 150 240 330 420 510 600 690 780 870 960 1050 1140 1230 1320 1410 1500 1590 1680" //"150 400 850 1500" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "425" + } + "03" + { + "var_type" "FIELD_INTEGER" + "vision_radius" "500" + } + "04" + { + "var_type" "FIELD_FLOAT" + "vision_duration" "3.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "model_scale" "0 6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96 102 108" //"0 30 60 90" // Percentage over model scale + } + "06" + { + "var_type" "FIELD_FLOAT" + "detonate_delay" "1.5" + } + } + } + + //================================================================================================================= + // Aggro On Damage + //================================================================================================================= + "aggro_on_damage" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/aggro_on_damage" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + + //================================================================================================================= + // Absolute No CC + //================================================================================================================= + "ability_absolute_no_cc" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "terrorblade_reflection" + "ScriptFile" "abilities/ability_absolute_no_cc" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + + //================================================================================================================= + // Attack rate is unslowable + //================================================================================================================= + "ability_attack_speed_unslowable" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "terrorblade_reflection" + "ScriptFile" "abilities/ability_attack_speed_unslowable" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "attack_speed_reduction_pct" "0" + } + } + } + + //================================================================================================================= + // Move speed is unslowable + //================================================================================================================= + "ability_move_speed_unslowable" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "terrorblade_reflection" + "ScriptFile" "abilities/ability_move_speed_unslowable" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "move_speed_reduction_pct" "20" + } + } + } + + //================================================================================================================= + // Ability: Ascenion. Used to increase difficulty of enemies + //================================================================================================================= + "ability_ascension" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ability_ascension" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "MaxLevel" "5" + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "bonus_magic_resist" "0" //"0 5 10 15 20" + } + "02" + { + "var_type" "FIELD_FLOAT" + "min_bonus_armor" "0" //"0 1 1 2 2" + } + "03" + { + "var_type" "FIELD_FLOAT" + "max_bonus_armor" "0" //"0 8 16 24 32" + } + "04" + { + "var_type" "FIELD_FLOAT" + "crit_chance" "0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "crit_multiplier" "0" + } + "06" + { + "var_type" "FIELD_FLOAT" + "bonus_attack_speed" "0" + } + "07" + { + "var_type" "FIELD_FLOAT" + "bonus_hp" "0 15 30 45 60" + } + "08" + { + "var_type" "FIELD_FLOAT" + "bonus_cooldown" "0" + } + "09" + { + "var_type" "FIELD_FLOAT" + "bonus_outgoing_damage" "0 20 40 60 80" //"0 10 20 30 40" + } + "10" + { + "var_type" "FIELD_FLOAT" + "attack_speed_reduction_pct" "50" + } + "11" + { + "var_type" "FIELD_FLOAT" + "move_speed_reduction_pct" "50" + } + + "12" + { + "var_type" "FIELD_FLOAT" + "act_1_modifier" "-10 -10 0 0 0" + } + "13" + { + "var_type" "FIELD_FLOAT" + "act_2_modifier" "-5 -5 0 0 0" + } + + } + } + + //================================================================================================================= + // Ascension: Flicker + //================================================================================================================= + "ascension_flicker" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_flicker" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "MaxLevel" "1" + "IsOnCastBar" "0" + "AbilityTextureName" "antimage_blink" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "7.0" + "AbilityManaCost" "0" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "range" "600" + } + } + } + + + //================================================================================================================= + // Ability: Used to increase difficulty of enemies + //================================================================================================================= + "ascension_magic_resist" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_magic_resist" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "mudgolem_cloak_aura" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "bonus_magic_resist" "25" + } + } + } + + + //================================================================================================================= + // Ability: Used to increase difficulty of enemies + //================================================================================================================= + "ascension_magic_immunity" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_magic_immunity" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "MaxLevel" "5" + "AbilityCooldown" "25" + "IsOnCastBar" "0" + "AbilityTextureName" "modifier_magicimmune" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "4" + } + "02" + { + "var_type" "FIELD_FLOAT" + "model_scale" "40" + } + } + } + + //================================================================================================================= + // Ability: Used to increase difficulty of enemies + //================================================================================================================= + "ascension_armor_sapping" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_armor_sapping" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_UNRESTRICTED" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "phantom_assassin_armor_corruption_debuff" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "6" + } + "02" + { + "var_type" "FIELD_FLOAT" + "armor_reduction_per_stack" "1 1.5 2 3 4" + } + "03" + { + "var_type" "FIELD_FLOAT" + "model_scale_per_stack" "8" + } + } + } + + //================================================================================================================= + // Ability: Used to increase difficulty of enemies + //================================================================================================================= + "ascension_crit" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_crit" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "phantom_assassin_coup_de_grace" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "crit_chance" "25" + } + "02" + { + "var_type" "FIELD_FLOAT" + "crit_multiplier" "200" + } + } + } + + //================================================================================================================= + // Ability: Used to increase difficulty of enemies + //================================================================================================================= + "ascension_drunken" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_drunken" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "brewmaster_drunken_brawler" + "AbilityCooldown" "20" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "dodge_chance" "33" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "75" + } + "03" + { + "var_type" "FIELD_INTEGER" + "crit_multiplier" "250" + } + "04" + { + "var_type" "FIELD_INTEGER" + "min_movement" "-30" + } + "05" + { + "var_type" "FIELD_INTEGER" + "max_movement" "30" + } + "06" + { + "var_type" "FIELD_FLOAT" + "duration" "5" + } + } + } + + //================================================================================================================= + // Ability: Ascenion. Used to increase difficulty of enemies + //================================================================================================================= + "ascension_armor" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_armor" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "hoplite_bull_rush" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "min_bonus_armor" "5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "max_bonus_armor" "15" + } + } + } + + //================================================================================================================= + // Ability: Ascenion. Used to increase difficulty of enemies + //================================================================================================================= + "ascension_damage" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_damage" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "ember_spirit_sleight_of_fist" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_outgoing_damage" "30" + } + } + } + + //================================================================================================================= + // Ability: Ascenion. Used to increase difficulty of enemies + //================================================================================================================= + "ascension_heal_suppression" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_heal_suppression" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "necrolyte_heartstopper_aura" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "heal_suppression_pct" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + } + } + + //================================================================================================================= + // Ability: Ascenion. Used to increase difficulty of enemies + //================================================================================================================= + "ascension_chilling_touch" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_chilling_touch" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "ancient_apparition_chilling_touch" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "slow" "8" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "0.5" + } + } + } + + //================================================================================================================= + // Ability: Ascenion. Used to increase difficulty of enemies + //================================================================================================================= + "ascension_extra_fast" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_extra_fast" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "clinkz_wind_walk" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_move_speed" "25" + } + } + } + + //================================================================================================================= + // Ability: Ascenion. Used to increase difficulty of enemies + //================================================================================================================= + "ascension_vampiric" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_vampiric" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "life_stealer_feast" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "lifesteal_pct" "200" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "3.5" + } + } + } + + //================================================================================================================= + // Ability: Ascenion. Used to increase difficulty of enemies + //================================================================================================================= + "ascension_attack_speed" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_attack_speed" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "clinkz_strafe" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "150" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "8" + } + } + } + + //================================================================================================================= + // Ascension Ability: Firefly + //================================================================================================================= + "aghsfort_ascension_firefly" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "batrider_firefly" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastPoint" "0.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_pct_per_second" "12" + } + "02" + { + "var_type" "FIELD_INTEGER" + "movement_speed" "5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "100" + } + "04" + { + "var_type" "FIELD_FLOAT" + "pool_duration" "12" + } + "05" + { + "var_type" "FIELD_FLOAT" + "tick_interval" "0.5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "tree_radius" "100" + } + "07" + { + "var_type" "FIELD_FLOAT" + "trail_placement_duration" "5" + } + "08" + { + "var_type" "FIELD_FLOAT" + "burn_linger_duration" "0.5" + } + } + } + + //================================================================================================================= + // Ascension ability: Silence + //================================================================================================================= + "aghsfort_ascension_silence" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "Hero_DeathProphet.Silence" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "IsOnCastBar" "0" + "AbilityTextureName" "death_prophet_silence" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20" + "AbilityDuration" "4" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "375" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "3.5" + } + "03" + { + "var_type" "FIELD_FLOAT" + "windup_time" "2.0" + } + } + } + + + //================================================================================================================= + // Temple Guardian: Wrath + //================================================================================================================= + "ascension_temple_guardian_wrath" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/temple_guardian_wrath" + "AbilityTextureName" "omniknight_guardian_angel" + "MaxLevel" "5" + "IsOnCastBar" "0" + + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25" + "AbilityChannelTime" "3.0" + "AbilityCastPoint" "1.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "effect_radius" "2500" + } + "02" + { + "var_type" "FIELD_FLOAT" + "delay" "1.25" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "250" + } + "04" + { + "var_type" "FIELD_INTEGER" + "blast_damage" "400" //"600" + } + "05" + { + "var_type" "FIELD_FLOAT" + "channel_duration" "3.0" + } + "06" + { + "var_type" "FIELD_FLOAT" + "interval" "0.2" + } + "07" + { + "var_type" "FIELD_FLOAT" + "block_cooldown" "0.001" + } + } + } + + //================================================================================================================= + // Ascension: Chakram Dance + //================================================================================================================= + "ascension_timbersaw_chakram_dance" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "shredder_chakram" + "ScriptFile" "abilities/creatures/boss_timbersaw_chakram_dance" + "MaxLevel" "5" + "IsOnCastBar" "0" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + "AbilityCastPoint" "2.0" + + "IsOnCastBar" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30" + "AbilityChannelTime" "13" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "num_chakrams" "2" + } + "02" + { + "var_type" "FIELD_FLOAT" + "interval" "8.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "short_range" "1500" + } + "04" + { + "var_type" "FIELD_INTEGER" + "long_range" "2500" + } + "05" + { + "var_type" "FIELD_INTEGER" + "spawn_interval" "1.2" + } + "06" + { + "var_type" "FIELD_INTEGER" + "spawn_count" "4" + } + "07" + { + "var_type" "FIELD_FLOAT" + "radius" "200" + } + "08" + { + "var_type" "FIELD_INTEGER" + "pass_damage" "6" + } + "09" + { + "var_type" "FIELD_FLOAT" + "pass_slow_duration" "1.2" + } + "10" + { + "var_type" "FIELD_INTEGER" + "slow_health_percentage" "0" + } + "11" + { + "var_type" "FIELD_INTEGER" + "slow" "30" + } + } + } + + //================================================================================================================= + // Ascension: Plasma Field + //================================================================================================================= + "ascension_plasma_field" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_UNRESTRICTED" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Ability.PlasmaField" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "razor_plasma_field" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastRange" "0" + "AbilityCastPoint" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "1" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_min" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_max" "17" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "500" + } + "04" + { + "var_type" "FIELD_INTEGER" + "speed" "420" // 1.5 second to reach radius + } + "05" + { + "var_type" "FIELD_INTEGER" + "slow_min" "5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "slow_max" "15" + } + "07" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "1.0" + } + "08" + { + "var_type" "FIELD_FLOAT" + "windup_time" "1.0" + } + } + } + + //================================================================================================================= + // Ability: Ascension Bulwark + //================================================================================================================= + "ascension_bulwark" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "mars_bulwark" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "physical_damage_reduction" "25" + } + "02" + { + "var_type" "FIELD_INTEGER" + "forward_angle" "120" + } + "03" + { + "var_type" "FIELD_INTEGER" + "physical_damage_reduction_side" "0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "side_angle" "120" + } + } + } + + //================================================================================================================= + // Ascension: Bomb + //================================================================================================================= + "ascension_bomb" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/ascension_bomb" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_UNRESTRICTED" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "5" + "IsOnCastBar" "0" + "AbilityTextureName" "techies_land_mines" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "450" + } + "03" + { + "var_type" "FIELD_FLOAT" + "min_delay_time" "2.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "max_delay_time" "2.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "is_ascension_ability" "1" + } + } + } + + + //================================================================================================================= + // Arc Warden: Magnetic Field + //================================================================================================================= + "aghsfort_ascension_magnetic_field" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_ArcWarden.MagneticField.Cast" + "AbilityTextureName" "arc_warden_magnetic_field" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_AW_MAGNETIC_FIELD" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastPoint" "0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "300" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "6" + } + "03" + { + "var_type" "FIELD_INTEGER" + "evasion_chance" "75" + } + } + } + + //================================================================================================================= + // Treasure Chest + //================================================================================================================= + "treasure_chest" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/treasure_chest" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + } + + //================================================================================================================= + // Generic: Gold Bag Fountain 1000g + //================================================================================================================= + "generic_gold_bag_fountain_1000" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "item_hand_of_midas" + + "IsOnCastBar" "0" + + "OnOwnerDied" + { + "CreateThinker" + { + "ModifierName" "gold_bag_thinker" + "Target" + { + "Center" "CASTER" + "Flags" "DOTA_UNIT_TARGET_FLAG_DEAD" + } + } + + } + + "Modifiers" + { + "gold_bag_thinker" + { + "Duration" "3" + "ThinkInterval" ".075" + "OnIntervalThink" + { + "CreateItem" + { + "Target" + { + "Center" "TARGET" + } + "ItemName" "item_bag_of_gold" + "ItemCount" "1" + "SpawnRadius" "25" + "ItemChargeCount" "%gold_value" + "AutoUse" "1" + "LaunchHeight" "300" + "LaunchDistance" "?50 350" + "LaunchDuration" "0.75" + } + } + } + } + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "gold_value" "25" + } + } + } + + //================================================================================================================= + // Generic: Gold Bag Fountain 2000g + //================================================================================================================= + "generic_gold_bag_fountain_2000" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "item_hand_of_midas" + + "IsOnCastBar" "0" + + "OnOwnerDied" + { + "CreateThinker" + { + "ModifierName" "gold_bag_thinker" + "Target" + { + "Center" "CASTER" + "Flags" "DOTA_UNIT_TARGET_FLAG_DEAD" + } + } + + } + + "Modifiers" + { + "gold_bag_thinker" + { + "Duration" "3" + "ThinkInterval" ".075" + "OnIntervalThink" + { + "CreateItem" + { + "Target" + { + "Center" "TARGET" + } + "ItemName" "item_bag_of_gold" + "ItemCount" "1" + "SpawnRadius" "25" + "ItemChargeCount" "%gold_value" + "AutoUse" "1" + "LaunchHeight" "300" + "LaunchDistance" "?50 350" + "LaunchDuration" "0.75" + } + } + } + } + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "gold_value" "50" + } + } + } + + //================================================================================================================= + // Generic: Gold Bag Fountain 4000g + //================================================================================================================= + "generic_gold_bag_fountain_4000" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "item_hand_of_midas" + + "IsOnCastBar" "0" + + "OnOwnerDied" + { + "CreateThinker" + { + "ModifierName" "gold_bag_thinker" + "Target" + { + "Center" "CASTER" + "Flags" "DOTA_UNIT_TARGET_FLAG_DEAD" + } + } + + } + + "Modifiers" + { + "gold_bag_thinker" + { + "Duration" "3" + "ThinkInterval" ".075" + "OnIntervalThink" + { + "CreateItem" + { + "Target" + { + "Center" "TARGET" + } + "ItemName" "item_bag_of_gold" + "ItemCount" "1" + "SpawnRadius" "25" + "ItemChargeCount" "%gold_value" + "AutoUse" "1" + "LaunchHeight" "300" + "LaunchDistance" "?50 350" + "LaunchDuration" "0.75" + } + } + } + } + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "gold_value" "100" + } + } + } + + //================================================================================================================= + // Generic: Gold Bag Fountain 8000g + //================================================================================================================= + "generic_gold_bag_fountain_8000" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "item_hand_of_midas" + + "IsOnCastBar" "0" + + "OnOwnerDied" + { + "CreateThinker" + { + "ModifierName" "gold_bag_thinker" + "Target" + { + "Center" "CASTER" + "Flags" "DOTA_UNIT_TARGET_FLAG_DEAD" + } + } + + } + + "Modifiers" + { + "gold_bag_thinker" + { + "Duration" "3" + "ThinkInterval" ".075" + "OnIntervalThink" + { + "CreateItem" + { + "Target" + { + "Center" "CASTER" + "Flags" "DOTA_UNIT_TARGET_FLAG_DEAD" + } + "ItemName" "item_bag_of_gold" + "ItemCount" "1" + "SpawnRadius" "25" + "ItemChargeCount" "%gold_value" + "AutoUse" "1" + "LaunchHeight" "300" + "LaunchDistance" "?50 350" + "LaunchDuration" "0.75" + } + } + } + } + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "gold_value" "200" + } + } + } + + //================================================================================= + // Not On Minimap + //================================================================================= + "modifier_no_minimap" + { + // General + //------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityName" "modifier_no_minimap" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + "Modifiers" + { + "modifier_no_minimap" + { + "Passive" "1" + "States" + { + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + } + + //================================================================================= + // Invulnerable + //================================================================================= + "modifier_invulnerable" + { + // General + //------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityName" "modifier_invulnerable" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + "Modifiers" + { + "modifier_invulnerable" + { + "Passive" "1" + "States" + { + "MODIFIER_STATE_INVULNERABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + } + + //================================================================================= + // Pudge Miniboss Passive + //================================================================================= + "creature_pudge_miniboss_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/creature_pudge_miniboss_passive" + "AbilityTextureName" "phantom_assassin_armor_corruption_debuff" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "IsOnCastBar" "0" + } + + + //================================================================================= + // 75% status resistance passive + //================================================================================= + "creature_generic_high_status_resist_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/creature_generic_high_status_resist_passive" + + "IsOnCastBar" "0" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + } + + //================================================================================================================= + // Trap Unselectable + //================================================================================================================= + "trap_unselectable" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + + "BaseClass" "ability_datadriven" + + "IsOnCastBar" "0" + + "Modifiers" + { + "modifier_unselectable" + { + "Passive" "1" + "States" + { + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_PROVIDES_VISION" "MODIFIER_STATE_VALUE_DISABLED" + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_DISARMED" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_INVULNERABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_LOW_ATTACK_PRIORITY" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_BLOCK_DISABLED" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_OUT_OF_GAME" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_BLIND" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_FLYING_FOR_PATHING_PURPOSES_ONLY" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + } + + //================================================================================================================= + // Spike Trap + //================================================================================================================= + "spike_trap" + { + "BaseClass" "ability_lua" + "ScriptFile" "abilities/traps/spike_trap" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityCastAnimation" "ACT_DOTA_ATTACK" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + "AbilityCastPoint" "0.45" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "2" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "150" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "light_strike_array_aoe" "160" + } + + "02" + { + "var_type" "FIELD_FLOAT" + "light_strike_array_delay_time" "0.65" + } + + "03" + { + "var_type" "FIELD_FLOAT" + "light_strike_array_stun_duration" "1.6" + } + "04" + { + "var_type" "FIELD_INTEGER" + "cast_animation" "12" + } + "05" + { + "var_type" "FIELD_INTEGER" + "light_strike_array_damage" "600" + } + } + } + + //================================================================================================================= + // Fire Trap: Breathe Fire + //================================================================================================================= + "breathe_fire" + { + "BaseClass" "ability_lua" + "ScriptFile" "abilities/traps/breathe_fire" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "9999" + "AbilityCastPoint" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "start_radius" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "end_radius" "60" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "9999" + } + "04" + { + "var_type" "FIELD_INTEGER" + "speed" "1050" + } + "05" + { + "var_type" "FIELD_FLOAT" + "max_hp_pct_damage" "25.0 34.0 50.0 100.0" // set by ascension level in breathe_fire.lua + } + } + } + + //================================================================================================================= + // Arrow Trap: Arrow + //================================================================================================================= + "arrow" + { + "BaseClass" "ability_lua" + "ScriptFile" "abilities/traps/arrow" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityCastAnimation" "ACT_DOTA_ATTACK" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "9999" + "AbilityCastPoint" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0" + + // Damage + //------------------------------------------------------------------------------------------------------------- + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "start_radius" "70" + } + "02" + { + "var_type" "FIELD_INTEGER" + "end_radius" "70" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "9999" + } + "04" + { + "var_type" "FIELD_INTEGER" + "speed" "850 950 950 1050" // scales with ascension level + } + "05" + { + "var_type" "FIELD_FLOAT" + "max_hp_pct_damage" "50.0 50.0 100.0 100.0" // scales with ascension level + } + } + } + + //================================================================================================================= + // Treasure Trap: Land Mine + //================================================================================================================= + "creature_techies_land_mine" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/creature_techies_land_mine" + "AbilityTextureName" "techies_land_mines" + "MaxLevel" "10" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "210" + "AbilityCastPoint" "0.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "4" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "30" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "proximity_threshold" "1.6" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "400 500 600 700 800 900 1000 1100 1200 1300" + } + "04" + { + "var_type" "FIELD_FLOAT" + "burn_duration" "0.5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "building_damage_pct" "25" + } + "06" + { + "var_type" "FIELD_FLOAT" + "activation_delay" "1.75" + } + } + } + + //================================================================================================================= + // Treasure Trap: Sun Strike + //================================================================================================================= + "trap_sun_strike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "invoker_sun_strike" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "MaxLevel" "10" + "HotKeyOverride" "T" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Invoker.SunStrike.Charge" + + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.05" + "AbilityCooldown" "0" + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "delay" "1.7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "area_of_effect" "175" + } + "03" + { + "var_type" "FIELD_FLOAT" + "damage" "300 400 500 600 700 800 900 1000 1100 1200" + "levelkey" "exortlevel" + } + "04" + { + "var_type" "FIELD_INTEGER" + "vision_distance" "400" + } + "05" + { + "var_type" "FIELD_FLOAT" + "vision_duration" "4.0" + } + } + } + + //================================================================================================================= + // Pendulum Swing + //================================================================================================================= + "pendulum_swing" + { + "BaseClass" "ability_lua" + "ScriptFile" "abilities/traps/pendulum_swing" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCastAnimation" "ACT_DOTA_IDLE" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "60000" + "AbilityCastPoint" "0" + "AbilityChannelTime" "999999" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.0" // Modifier just delays damage + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "max_hp_pct_damage" "25.0 34.0 50.0 100.0" // scales with ascension level + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "60" + } + } + } + + //================================================================================================================= + // Creature: Shadow Wave + //================================================================================================================= + "creature_shadow_wave" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "dazzle_shadow_wave" + "ScriptFile" "abilities/creatures/creature_shadow_wave" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + + "IsOnCastBar" "0" + + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + "AbilityCastPoint" "1.8" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "15" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "100" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bounce_radius" "475" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "200" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_targets" "4" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage" "150" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Dazzle: Poison Touch + //================================================================================================================= + "creature_poison_touch" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "dazzle_poison_touch" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Dazzle.Poison_Touch" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "400" + "AbilityCastPoint" "0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.35" // Can apply multiple modifiers + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "start_radius" "200" + } + "02" + { + "var_type" "FIELD_INTEGER" + "end_radius" "200" + } + "03" + { + "var_type" "FIELD_INTEGER" + "end_distance" "900" + } + "04" + { + "var_type" "FIELD_INTEGER" + "targets" "2" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage" "20" + } + "06" + { + "var_type" "FIELD_INTEGER" + "slow" "-33" + } + "07" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "800" + } + "08" + { + "var_type" "FIELD_FLOAT" + "duration" "5" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Creature: Shallow Grave + //================================================================================================================= + "creature_shallow_grave" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "dazzle_shallow_grave" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Dazzle.Shallow_Grave" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_SHALLOW_GRAVE" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastRange" "700" + "AbilityCastPoint" "0.4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "3.0" + } + } + } + + //================================================================================================================= + // Creature: Inner Fire + //================================================================================================================= + "creature_inner_fire" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "huskar_inner_fire" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilitySound" "Hero_Huskar.Inner_Vitality" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "500" + "AbilityCastPoint" "0.2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.0" // already gets credit for the healing + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "500" + } + "03" + { + "var_type" "FIELD_FLOAT" + "disarm_duration" "2.5" + } + "04" + { + "var_type" "FIELD_INTEGER" + "knockback_distance" "550" + } + "05" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.6" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Creature: Burning Spears + //================================================================================================================= + "creature_burning_spears" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "huskar_burning_spear" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST | DOTA_ABILITY_BEHAVIOR_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilitySound" "Hero_Huskar.Burning_Spear" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "450" + "AbilityCastPoint" "0.0 0.0 0.0 0.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0 0.0 0.0 0.0" + "AbilityDuration" "5" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0 0 0 0" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "health_cost" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "burn_damage" "5 10 15 20" + "LinkedSpecialBonus" "special_bonus_unique_huskar_2" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Creature: Berserker's Blood + //================================================================================================================= + "creature_berserkers_blood" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "huskar_berserkers_blood" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "maximum_attack_speed" "100" + } + "02" + { + "var_type" "FIELD_INTEGER" + "maximum_health_regen" "37.5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "hp_threshold_max" "20" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Creature: Life Break + //================================================================================================================= + "creature_life_break" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "huskar_life_break" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Huskar.Life_Break" + + "IsOnCastBar" "0" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "1.0" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0 0 0" + + // Cast Range + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "350" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityDuration" "3" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "health_cost_percent" "0.40" + } + "02" + { + "var_type" "FIELD_FLOAT" + "health_damage" "0.40" + } + "03" + { + "var_type" "FIELD_INTEGER" + "charge_speed" "900" + } + "04" + { + "var_type" "FIELD_INTEGER" + "tooltip_health_damage" "20 20 20" + } + "05" + { + "var_type" "FIELD_INTEGER" + "tooltip_health_cost_percent" "25 30 35" + "CalculateSpellDamageTooltip" "1" + } + "06" + { + "var_type" "FIELD_INTEGER" + "movespeed" "-60" + } + "07" + { + "var_type" "FIELD_FLOAT" + "slow_durtion_tooltip" "3" + } + "08" + { + "var_type" "FIELD_FLOAT" + "taunt_duration" "2.5" + "RequiresScepter" "1" + } + } + } + + //================================================================================================================= + // Hellbear Smash + //================================================================================================================= + "hellbear_smash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/hellbear_smash" + "AbilityTextureName" "polar_furbolg_ursa_warrior_thunder_clap" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + "MaxLevel" "2" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "1.25" + "AbilityCooldown" "6.0" + "AbilityDamage" "250" + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "255" + } + "02" + { + "var_type" "FIELD_INTEGER" + "movespeed_slow" "-20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "attackspeed_slow" "-20" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "3.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage" "250" + } + } + } + + + //================================================================================================================= + // Creature: Ogre Tank Melee Smash + //================================================================================================================= + "ogre_tank_melee_smash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/ogre_tank_melee_smash" + "AbilityTextureName" "centaur_double_edge" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "500" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" // Activity + "AnimationPlaybackRate" "1.0" // Animation speed multiplier + "AnimationIgnoresModelScale" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "2.5" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "225" + } + "02" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "0.75" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "1800" + } + "04" + { + "var_type" "FIELD_FLOAT" + "base_swing_speed" "1.0" + } + } + } + + //================================================================================================================= + // Creature: Ogre Tank Jump Smash + //================================================================================================================= + "ogre_tank_jump_smash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/ogre_tank_jump_smash" + "AbilityTextureName" "centaur_double_edge" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "150" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AnimationIgnoresModelScale" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "4.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "290" + } + "02" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "1800" + } + "04" + { + "var_type" "FIELD_FLOAT" + "jump_speed" "1.8" + } + } + } + + //================================================================================================================= + // Ability: Ogre Magi Bloodlust + //================================================================================================================= + "ogre_magi_channelled_bloodlust" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/ogre_magi_channelled_bloodlust" + "AbilityTextureName" "ogre_magi_bloodlust" + + "AbilityCastAnimation" "ACT_DOTA_VICTORY" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_CREEP | DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + "AbilityCastPoint" "0.56" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "3.0" // was 4.0 + "AbilityChannelTime" "10.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "8" + } + + "02" + { + "var_type" "FIELD_FLOAT" + "modelscale" "10" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "50" + } + "05" + { + "var_type" "FIELD_INTEGER" + "interrupted_cooldown" "4" + } + } + } + + //================================================================================================================= + // Ogre Magi Area Ignite + //================================================================================================================= + "ogre_magi_area_ignite" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/ogre_magi_area_ignite" + "AbilityTextureName" "ogre_magi_ignite" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + "IsOnCastBar" "0" + + "MaxLevel" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "700" + "AbilityCastPoint" "0.45" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "linger_duration" "1.0" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "burn_damage" "250" + } + + "03" + { + "var_type" "FIELD_INTEGER" + "slow_movement_speed_pct" "-30" + } + + "04" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "700" + } + "05" + { + "var_type" "FIELD_INTEGER" + "radius" "275" + } + "06" + { + "var_type" "FIELD_FLOAT" + "area_duration" "2.0" + } + } + } + + //================================================================================================================= + // Creature: Baby Ogre Tank Melee Smash + //================================================================================================================= + "baby_ogre_tank_melee_smash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/baby_ogre_tank_melee_smash" + "AbilityTextureName" "centaur_double_edge" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "350" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" // Activity + "AnimationPlaybackRate" "1.0" // Animation speed multiplier + "AnimationIgnoresModelScale" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "2.5" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "150" + } + "02" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "0.75" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "600" + } + "04" + { + "var_type" "FIELD_FLOAT" + "base_swing_speed" "1.0" + } + } + } + + //================================================================================================================= + // Creature: Baby Ogre Tank Jump Smash + //================================================================================================================= + "baby_ogre_tank_jump_smash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/baby_ogre_tank_jump_smash" + "AbilityTextureName" "centaur_double_edge" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "150" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AnimationIgnoresModelScale" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "4.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "225" + } + "02" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "600" + } + "04" + { + "var_type" "FIELD_FLOAT" + "jump_speed" "1.8" + } + } + } + + //================================================================================================================= + // Creature: Baby Ogre Magi Area Ignite + //================================================================================================================= + "baby_ogre_magi_area_ignite" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/baby_ogre_magi_area_ignite" + "AbilityTextureName" "ogre_magi_ignite" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + "IsOnCastBar" "0" + + "MaxLevel" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "700" + "AbilityCastPoint" "0.45" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "2" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "burn_damage" "175" + } + + "03" + { + "var_type" "FIELD_INTEGER" + "slow_movement_speed_pct" "-30" + } + + "04" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "700" + } + "05" + { + "var_type" "FIELD_INTEGER" + "radius" "275" + } + "06" + { + "var_type" "FIELD_FLOAT" + "area_duration" "2.0" + } + } + } + + //================================================================================================================= + // Ability: Ogre Tank Boss Melee Smash + //================================================================================================================= + "ogre_tank_boss_melee_smash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/ogre_tank_boss_melee_smash" + "AbilityTextureName" "centaur_double_edge" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "570" //"583" // regular version: 500 + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" // Activity + "AnimationPlaybackRate" "1.0" // Animation speed multiplier + "AnimationIgnoresModelScale" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "2.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "242" //"250" // regular version: 200 + } + "02" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.0" // regular version: 1.0 + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "2000" // regular version: 750 + } + "04" + { + "var_type" "FIELD_FLOAT" + "base_swing_speed" "1.0" + } + } + } + + //================================================================================================================= + // Ability: Ogre Tank Boss Jump Smash + //================================================================================================================= + "ogre_tank_boss_jump_smash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/ogre_tank_boss_jump_smash" + "AbilityTextureName" "centaur_double_edge" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "150" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" // Activity + "AnimationIgnoresModelScale" "1" + //"AnimationPlaybackRate" "1.0" // default 1.0 + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "3.75" // regular: 5.25 + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "4.0" // regular: 4.0 + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "3000" + } + "04" + { + "var_type" "FIELD_FLOAT" + "jump_speed" "1.5" // regular: 1.8 + } + } + } + + //================================================================================================================= + // Ogre Seer Area Ignite + //================================================================================================================= + "ogre_seer_area_ignite" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "ogre_magi_ignite" + "ScriptFile" "abilities/creatures/ogre_seer_area_ignite" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + + "IsOnCastBar" "0" + + "MaxLevel" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "0.45" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "linger_duration" "1.0" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "burn_damage" "300" + } + + "03" + { + "var_type" "FIELD_INTEGER" + "slow_movement_speed_pct" "-30" + } + + "04" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "700" + } + "05" + { + "var_type" "FIELD_INTEGER" + "radius" "275" // magi's: 275 + } + "06" + { + "var_type" "FIELD_FLOAT" + "area_duration" "5.0" // magi's: 2.0 + } + } + } + + //================================================================================================================= + // Lina Creature: Flamestrike + //================================================================================================================= + "creature_flamestrike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" // | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "MaxLevel" "1" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "FightRecapLevel" "1" + "AbilitySound" "Creature.Flamestrike.Charge" + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "900" + "AbilityCastPoint" "1.0" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + "AbilityCooldown" "7" + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "delay" "2.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "225" + } + "03" + { + "var_type" "FIELD_FLOAT" + "damage" "450" + } + "04" + { + "var_type" "FIELD_INTEGER" + "vision_distance" "400" + } + "05" + { + "var_type" "FIELD_FLOAT" + "vision_duration" "4.0" + } + "06" + { + "var_type" "FIELD_FLOAT" + "ground_burn_duration" "4.0" + } + "07" + { + "var_type" "FIELD_FLOAT" + "burn_interval" "0.5" + } + "08" + { + "var_type" "FIELD_INTEGER" + "burn_dps" "100" + } + "09" + { + "var_type" "FIELD_INTEGER" + "burn_radius" "275" + } + } + } + + //================================================================================================================= + // Pine Cone: Shield Bash + //================================================================================================================= + "pine_cone_shield_bash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_NORMAL_WHEN_STOLEN | DOTA_ABILITY_BEHAVIOR_DONT_CANCEL_CHANNEL" + + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Mars.Shield.Cast" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCastRange" "350" + "AbilityCastPoint" "1.25" + //"AbilityChannelTime" "1.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "7" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_mult" "500 600" + "LinkedSpecialBonus" "special_bonus_unique_mars_gods_rebuke_extra_crit" + } + "02" + { + "var_type" "FIELD_INTEGER" + "angle" "90" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "04" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.3" + } + "05" + { + "var_type" "FIELD_FLOAT" + "knockback_distance" "300" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_slow" "25" + } + "07" + { + "var_type" "FIELD_FLOAT" + "knockback_slow_duration" "3" + } + "08" + { + "var_type" "FIELD_FLOAT" + "activity_duration" "2" + } + "09" + { + "var_type" "FIELD_FLOAT" + "scepter_cooldown" "3.5" + "RequiresScepter" "1" + } + "10" + { + "var_type" "FIELD_FLOAT" + "anim_playback_speed" "0.5" + } + } + } + + //================================================================================================================= + // Assault Captain Sun Ray + //================================================================================================================= + "assault_captain_sun_ray" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "phoenix_sun_ray" + "AbilityTextureName" "phoenix_sun_ray" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Phoenix.SunRay.Cast" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1300" + "AbilityCastPoint" "0.01" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "15.0" + "AbilityDuration" "5.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "hp_cost_perc_per_second" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "base_damage" "250" + } + "03" + { + "var_type" "FIELD_FLOAT" + "hp_perc_damage" "6.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "base_heal" "200" + } + "05" + { + "var_type" "FIELD_FLOAT" + "hp_perc_heal" "5.0" + } + + "06" + { + "var_type" "FIELD_INTEGER" + "radius" "130" + } + "07" + { + "var_type" "FIELD_FLOAT" + "tick_interval" "0.2" + } + "08" + { + "var_type" "FIELD_FLOAT" + "forward_move_speed" "250" // 250 + } + "09" + { + "var_type" "FIELD_INTEGER" + "beam_range" "1300" + } + "10" + { + "var_type" "FIELD_FLOAT" + "turn_rate_initial" "250" + } + "11" + { + "var_type" "FIELD_FLOAT" + "turn_rate" "25" + } + "12" + { + "var_type" "FIELD_INTEGER" + "tooltip_duration" "6" + } + } + } + + //================================================================================================================= + // Assault Captain: Searing Chains + //================================================================================================================= + "assault_captain_searing_chains" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ember_spirit_searing_chains" + "AbilityTextureName" "ember_spirit_searing_chains" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_EmberSpirit.SearingChains.Target" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "400" + "AbilityCastPoint" "1.0" + + //"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AnimationPlaybackRate" "1.0" + "AnimationIgnoresModelScale" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "18.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "2.0" + "LinkedSpecialBonus" "special_bonus_unique_ember_spirit_2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "500" + } + "03" + { + "var_type" "FIELD_INTEGER" + "chains_damage" "300" + } + "04" + { + "var_type" "FIELD_INTEGER" + "total_damage_tooltip" "600" + } + "05" + { + "var_type" "FIELD_FLOAT" + "tick_interval" "1.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "unit_count" "10" + } + } + } + + //================================================================================================================= + // Catapult: Attack + //================================================================================================================= + "catapult_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "BaseClass" "ability_datadriven" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "3000" + //"AbilityCastMinimumRange" "500" // Not hooked up? Added hook in vscript to check min range. + "AbilityCastPoint" "0.7" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "4.5" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "1.0" + + "OnSpellStart" + { + "LinearProjectile" + { + "EffectName" "particles/creatures/catapult/catapult_projectile.vpcf" + //"EffectName" "particles/dev/library/base_linear_projectile_model.vpcf" + "MoveSpeed" "%speed" + "StartPosition" "attach_attack1" + "StartRadius" "%collision_radius" + "EndRadius" "%collision_radius" + "TargetTeams" "DOTA_UNIT_TARGET_TEAM_NONE" + "TargetTypes" "DOTA_UNIT_TARGET_NONE" + "TargetFlags" "DOTA_UNIT_TARGET_FLAG_NONE" + "HasFrontalCone" "0" + "ProvidesVision" "1" + "VisionRadius" "300" + } + "CreateThinker" + { + "ModifierName" "target_effect_thinker" + "Target" "POINT" + } + "FireSound" + { + "EffectName" "Creep_Bad_Engine.Attack" + "Target" "CASTER" + } + "FireSound" + { + "EffectName" "Hero_Batrider.Flamebreak" + "Target" "CASTER" + } + } + + "OnProjectileFinish" + { + "FireSound" + { + "EffectName" "Catapult.Impact" + "Target" "POINT" + } + "Damage" + { + "Target" + { + "Center" "PROJECTILE" + "Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Radius" "%explosion_radius" + } + "Type" "DAMAGE_TYPE_MAGICAL" + "Damage" "%damage" + } + "Knockback" + { + "Target" + { + "Center" "PROJECTILE" + "Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Radius" "%explosion_radius" + } + "Center" "PROJECTILE" + "Distance" "%knockback_max_distance" + "IsFixedDistance" "1" + "Height" "%knockback_height" + "Duration" "%knockback_duration" + } + } + + "Modifiers" + { + "target_effect_thinker" + { + "Duration" "3" + + "OnCreated" + { + "AttachEffect" + { + "EffectName" "particles/econ/events/darkmoon_2017/darkmoon_generic_aoe.vpcf" + "EffectAttachType" "follow_origin" + "Target" "TARGET" + "ControlPoints" + { + "00" "0 0 0" + "01" "%explosion_radius 0 0" + "02" "6 0 1" + "03" "200 0 0" + "04" "0 0 0" + } + } + } + } + } + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "1000" + } + "02" + { + "var_type" "FIELD_INTEGER" + "explosion_radius" "300" + } + "03" + { + "var_type" "FIELD_INTEGER" + "collision_radius" "100" + } + "04" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "0.5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "speed" "600" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_max_distance" "500" + } + "07" + { + "var_type" "FIELD_INTEGER" + "knockback_height" "100" + } + "08" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.5" + } + "09" + { + "var_type" "FIELD_INTEGER" + "mindistance" "500" + } + + } + } + + //================================================================================================================= + // Ability: Urn Upheaval + //================================================================================================================= + "urn_upheaval" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_AOE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "Hero_Warlock.Upheaval" + "AbilityCastAnimation" "ACT_INVALID" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0" + "AbilityChannelTime" "8.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "0 0 0 0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "aoe" "400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "slow_rate_duration" "3.5" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "0.5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "max_slow" "84" + } + } + } + + //================================================================================================================= + // Upheaval Urn Reincarnation + //================================================================================================================= + "upheaval_urn_reincarnation" + { + // General + //------------------------------------------------------------------------------------------------------------- + "IsOnCastBar" "0" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + + "IsOnCastBar" "0" + + "HasScepterUpgrade" "1" + "AbilitySound" "Hero_SkeletonKing.Reincarnate" + + //"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.5" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.2" // Slow isn't the main function of this ability. + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "reincarnate_time" "9.0" + } + } + } + + //================================================================================================================= + // Upheaval Urn: Incoming Damage Rules + //================================================================================================================= + "upheaval_urn_incoming_damage_rules" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/upheaval_urn_incoming_damage_rules" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "IsOnCastBar" "0" + } + + //================================================================================================================= + // Gyrocopter: Multi Homing Missile + //================================================================================================================= + "gyrocopter_multi_homing_missile" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "850" + "AbilityCastPoint" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "200" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "hits_to_kill_tooltip" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "tower_hits_to_kill_tooltip" "2" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.5" + "LinkedSpecialBonus" "special_bonus_unique_gyrocopter_6" + } + "04" + { + "var_type" "FIELD_INTEGER" + "attack_speed_bonus_pct" "400" + } + "05" + { + "var_type" "FIELD_INTEGER" + "min_damage" "50" + } + "06" + { + "var_type" "FIELD_INTEGER" + "max_distance" "1500" + } + "07" + { + "var_type" "FIELD_INTEGER" + "pre_flight_time" "6" + } + "08" + { + "var_type" "FIELD_INTEGER" + "hero_damage" "100" + } + "09" + { + "var_type" "FIELD_FLOAT" + "speed" "550" + } + "10" + { + "var_type" "FIELD_INTEGER" + "acceleration" "20" + } + "11" + { + "var_type" "FIELD_INTEGER" + "enemy_vision_time" "4" + } + "12" + { + "var_type" "FIELD_INTEGER" + "AbilityCharges" "" + "LinkedSpecialBonus" "special_bonus_unique_gyrocopter_1" + } + "13" + { + "var_type" "FIELD_INTEGER" + "multi_search_radius" "350" + } + "14" + { + "var_type" "FIELD_INTEGER" + "max_rockets" "1" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Pangolier: Gyroshell + //================================================================================================================= + "aghsfort_pangolier_gyroshell" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "pangolier_gyroshell" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "FightRecapLevel" "1" + "IsCastableWhileHidden" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "1.2" + "AbilityCastAnimation" "ACT_DOTA_GENERIC_CHANNEL_1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "70" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "200 275 350" + + "precache" + { + "model" "models/heroes/pangolier/pangolier_gyroshell.vmdl" + "model" "models/heroes/pangolier/pangolier_gyroshell2.vmdl" + } + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "cast_time_tooltip" "1.2" + } + "02" + { + "var_type" "FIELD_FLOAT" + "tick_interval" "0.05" + } + "03" + { + "var_type" "FIELD_FLOAT" + "forward_move_speed" "400" + } + "04" + { + "var_type" "FIELD_FLOAT" // used after any break in the roll (start/jump/bounce) + "turn_rate_boosted" "165" + } + "05" + { + "var_type" "FIELD_FLOAT" + "turn_rate" "120" + } + "06" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "07" + { + "var_type" "FIELD_INTEGER" + "hit_radius" "150" + } + "08" + { + "var_type" "FIELD_FLOAT" + "bounce_duration" "0.4" + } + "09" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.0 1.25 1.5" + } + "10" + { + "var_type" "FIELD_INTEGER" + "knockback_radius" "150" + } + "11" + { + "var_type" "FIELD_FLOAT" + "duration" "40.0" + "LinkedSpecialBonus" "special_bonus_unique_pangolier_6" + } + "12" + { + "var_type" "FIELD_FLOAT" + "jump_recover_time" "0.25" + } + } + } + + //================================================================================================================= + // Evil Greevil Passive + //================================================================================================================= + "evil_greevil_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/evil_greevil_passive" + + "IsOnCastBar" "0" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + } + + //================================================================================================================= + // Ability: Drow Ranger: Multishot + //================================================================================================================= + "aghsfort_drow_ranger_multishot" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "drow_ranger_multishot" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_DIRECTIONAL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.0" + "AbilityChannelTime" "3.5" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "arrow_count" "18" + } + "02" + { + "var_type" "FIELD_INTEGER" + "arrow_damage_pct" "125" + "LinkedSpecialBonus" "special_bonus_unique_drow_ranger_1" + } + "03" + { + "var_type" "FIELD_FLOAT" + "arrow_slow_duration" "1.25" + } + "04" + { + "var_type" "FIELD_INTEGER" + "arrow_width" "90" + } + "05" + { + "var_type" "FIELD_INTEGER" + "arrow_speed" "750" + } + "06" + { + "var_type" "FIELD_FLOAT" + "arrow_range_multiplier" "1.75" + } + "07" + { + "var_type" "FIELD_INTEGER" + "arrow_angle" "90" + } + "08" + { + "var_type" "FIELD_INTEGER" + "effective_range" "1000" + } + } + "AbilityCastAnimation" "ACT_DOTA_CHANNEL_ABILITY_3" + } + + //================================================================================================================= + // Ability: Drow Ranger Wave of Silence + //================================================================================================================= + "aghsfort_drow_ranger_wave_of_silence" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "drow_ranger_wave_of_silence" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_DrowRanger.Silence" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "900" + "AbilityCastPoint" "0.25" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "13" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "wave_speed" "800.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "wave_width" "250" + } + "03" + { + "var_type" "FIELD_FLOAT" + "silence_duration" "5" + "LinkedSpecialBonus" "special_bonus_unique_drow_ranger_4" + } + "04" + { + "var_type" "FIELD_FLOAT" + "knockback_distance_max" "600" + } + "05" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_height" "0" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Aghsfort Shadow Demon Shadow Poison + //================================================================================================================= + "aghsfort_shadow_demon_shadow_poison" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "Hero_ShadowDemon.ShadowPoison" + + "IsOnCastBar" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityDuration" "7" + "AbilityCooldown" "3.0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1050" + "AbilityCastPoint" "0.25" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.0" // modifier is damage only. + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "stack_damage" "75" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_multiply_stacks" "10" + } + "03" + { + "var_type" "FIELD_FLOAT" + "bonus_stack_damage" "75" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius" "200" + } + "05" + { + "var_type" "FIELD_INTEGER" + "speed" "400" + } + "06" //Damage that is applied every time shadow poison is applied. + { + "var_type" "FIELD_FLOAT" + "hit_damage" "50" + } + "07" + { + "var_type" "FIELD_INTEGER" + "release_at_max_stacks" "20" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Aghsfort Shadow Demon: Shadow Demon Disruption + //================================================================================================================= + "aghsfort_shadow_demon_disruption" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "shadow_demon_disruption" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY | DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_ShadowDemon.Disruption" + + "IsOnCastBar" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityDuration" "2.0" + "AbilityCooldown" "15.0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1050" + "AbilityCastPoint" "0.3" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "disruption_duration" "2.0" + "LinkedSpecialBonus" "special_bonus_unique_shadow_demon_5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "illusion_duration" "5" + } + "03" + { + "var_type" "FIELD_FLOAT" + "illusion_outgoing_damage" "-70.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "illusion_outgoing_tooltip" "30.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "illusion_incoming_damage" "250" + } + "06" + { + "var_type" "FIELD_FLOAT" + "tooltip_total_illusion_incoming_damage" "350" + } + "07" + { + "var_type" "FIELD_INTEGER" + "AbilityCharges" "" + "LinkedSpecialBonus" "special_bonus_unique_shadow_demon_7" + } + "08" + { + "var_type" "FIELD_INTEGER" + "illusion_bounty_base" "0" + } + "09" + { + "var_type" "FIELD_INTEGER" + "illusion_bounty_growth" "0" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Doom Bringer: Infernal Blade + //================================================================================================================= + "creature_doom_infernal_blade" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "doom_bringer_infernal_blade" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST | DOTA_ABILITY_BEHAVIOR_ATTACK" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "Hero_DoomBringer.InfernalBlade.Target" + "HasScepterUpgrade" "1" + + "IsOnCastBar" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + "AbilityManaCost" "0" + "AbilityCastRange" "175" + "AbilityCastPoint" "0.0 0.0 0.0 0.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "burn_damage" "20" + } + "02" + { + "var_type" "FIELD_FLOAT" + "burn_damage_pct" "4" + "LinkedSpecialBonus" "special_bonus_unique_doom_1" + } + "03" + { + "var_type" "FIELD_FLOAT" + "burn_duration" "5.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "ministun_duration" "1.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "ministun_duration_scepter" "1.75" + "RequiresScepter" "1" + } + "06" + { + "var_type" "FIELD_FLOAT" + "burn_duration_scepter" "6.0" + "RequiresScepter" "1" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Doom Bringer: Doom + //================================================================================================================= + "creature_doom_bringer_doom" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "doom_bringer_doom" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES | DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "FightRecapLevel" "2" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.5" + "AbilityCastRange" "550" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_6" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "60.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "6.0" + "LinkedSpecialBonus" "special_bonus_unique_doom_7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "50" + "LinkedSpecialBonus" "special_bonus_unique_doom_5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "deniable_pct" "0" + } + } + } + + //================================================================================================================= + // AghsFort Shadow Shaman: Shackles + //================================================================================================================= + "aghsfort_shadow_shaman_shackles" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + "AbilityCastPoint" "0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityChannelTime" "3" + "AbilityCooldown" "20" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "tick_interval" "0.1" + } + "02" + { + "var_type" "FIELD_FLOAT" + "total_damage" "500" + } + "03" + { + "var_type" "FIELD_FLOAT" + "channel_time" "3" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Mushroom Split - based on the rock golem's split ability + //================================================================================================================= + "mushroom_split" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/mushroom_split" + + "IsOnCastBar" "0" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityTextureName" "dark_seer_wall_of_replica" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "unit_count" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spawn_radius" "10" + } + "03" + { + "var_type" "FIELD_FLOAT" + "knockback_duration_min" "1.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "knockback_duration_max" "1.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "knockback_distance_min" "50" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_distance_max" "300" + } + "07" + { + "var_type" "FIELD_INTEGER" + "knockback_height_min" "100" + } + "08" + { + "var_type" "FIELD_INTEGER" + "knockback_height_max" "200" + } + } + } + + //================================================================================================================= + // Pugna: Nether Ward + //================================================================================================================= + "aghsfort_pugna_nether_ward" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilitySound" "Hero_Pugna.NetherWard" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.2" + "AbilityCastRange" "150" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35.0 35.0 35.0 35.0" + "AbilityDuration" "18 22 26 30" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "80 80 80 80" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1600" + } + "02" + { + "var_type" "FIELD_INTEGER" + "base_damage" "50" + } + "03" + { + "var_type" "FIELD_FLOAT" + "mana_multiplier" "1.0 1.25 1.50 1.75" + "LinkedSpecialBonus" "special_bonus_unique_pugna_3" + } + "04" + { + "var_type" "FIELD_FLOAT" + "mana_regen" "-0.6 -0.8 -1.0 -1.2" + } + "05" + { + "var_type" "FIELD_INTEGER" + "attacks_to_destroy_tooltip" "4 4 4 4" + "LinkedSpecialBonus" "special_bonus_unique_pugna_6" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Ranged Quill Attack + //================================================================================================================= + "ranged_quill_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "BaseClass" "ability_lua" + "AbilityTextureName" "ranged_quill_attack" + "ScriptFile" "abilities/creatures/ranged_quill_attack" + "MaxLevel" "1" + + "AbilityCastAnimation" "ACT_DOTA_ATTACK" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1500" + "AbilityCastPoint" "0.75" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "700" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "attack_width_initial" "75" + } + "03" + { + "var_type" "FIELD_INTEGER" + "attack_width_end" "75" + } + + "04" + { + "var_type" "FIELD_INTEGER" + "attack_distance" "1500" + } + "05" + { + "var_type" "FIELD_INTEGER" + "attack_damage" "300" + } + } + } + + //================================================================================= + // Boss Visage: Passive + //================================================================================= + "boss_visage_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/boss_visage_passive" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "stone_threshold" "4500" + } + "02" + { + "var_type" "FIELD_INTEGER" + "soul_assumption_count" "8" + } + "03" + { + "var_type" "FIELD_INTEGER" + "soul_assumption_damage" "400" + } + "04" + { + "var_type" "FIELD_INTEGER" + "soul_assumption_speed" "600" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stone_duration" "7.5" + } + + "06" + { + "var_type" "FIELD_INTEGER" + "soul_assumption_radius" "100" + } + + "07" + { + "var_type" "FIELD_FLOAT" + "familiar_wake_interval" "6.0" + } + } + } + + //================================================================================================================= + // Boss Visage: Ranged Attack + //================================================================================================================= + "boss_visage_ranged_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "BaseClass" "ability_lua" + "AbilityTextureName" "boss_visage_ranged_attack" + "ScriptFile" "abilities/creatures/boss_visage_ranged_attack" + "MaxLevel" "1" + + "AbilityCastAnimation" "ACT_DOTA_ATTACK" + + "IsOnCastBar" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "3000" + "AbilityCastPoint" "0.5" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "1" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "650" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "attack_width_initial" "75" + } + "03" + { + "var_type" "FIELD_INTEGER" + "attack_width_end" "75" + } + + "04" + { + "var_type" "FIELD_INTEGER" + "attack_distance" "3000" + } + "05" + { + "var_type" "FIELD_INTEGER" + "attack_damage" "700" + } + } + } + + //================================================================================================================= + // Boss Visage: Grave Chill + //================================================================================================================= + "boss_visage_grave_chill" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "BaseClass" "ability_lua" + "AbilityTextureName" "boss_visage_grave_chill" + "ScriptFile" "abilities/creatures/boss_visage_grave_chill" + "MaxLevel" "1" + + "AbilityCastAnimation" "ACT_DOTA_ATTACK" + + "IsOnCastBar" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "3000" + "AbilityCastPoint" "0.5" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chill_speed" "500" + } + "02" + { + "var_type" "FIELD_INTEGER" + "chill_radius" "100" + } + "03" + { + "var_type" "FIELD_INTEGER" + "chill_count" "10" + } + "04" + { + "var_type" "FIELD_FLOAT" + "chill_duration" "5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "chill_damage" "400" + } + "06" + { + "var_type" "FIELD_INTEGER" + "movespeed_bonus" "25" + } + "07" + { + "var_type" "FIELD_INTEGER" + "attackspeed_bonus" "50" + } + + } + } + + //================================================================================================================= + // Boss Visage: Familiar stone Form + //================================================================================================================= + "boss_visage_familiar_stone_form" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "boss_visage_familiar_stone_form" + "ScriptFile" "abilities/creatures/boss_visage_familiar_stone_form" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "AbilityCastRange" "160" + "AbilityCastPoint" "0.0" + "MaxLevel" "1" + "AbilitySound" "Visage_Familiar.StoneForm.Cast" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "200" + } + "02" + { + "var_type" "FIELD_FLOAT" + "stun_delay" "1.00" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "200" + } + "04" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "0.75" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + + //================================================================================================================= + // Monkey King: Jingu Mastery Active (Aghanim's Fortress) + //================================================================================================================= + "monkey_king_jingu_mastery_aghsfort" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/heroes/monkey_king_jingu_mastery_aghsfort" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_MonkeyKing.IronCudgel" + "AbilityTextureName" "monkey_king_jingu_mastery_aghsfort" + "AbilityCastAnimation" "ACT_INVALID" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "26 22 18 14" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "80 90 100 110" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_hits" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "counter_duration" "10" + } + "03" + { + "var_type" "FIELD_INTEGER" + "charges" "4" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "60 90 120 150" + "LinkedSpecialBonus" "special_bonus_unique_monkey_king_2" + } + "05" + { + "var_type" "FIELD_INTEGER" + "lifesteal" "15 30 45 60" + } + "06" + { + "var_type" "FIELD_INTEGER" + "max_duration" "10" + } + } + } + + //================================================================================================================= + // Brewmaster Thunderclap + //================================================================================================================= + "aghsfort_brewmaster_thunderclap" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/aghsfort_brewmaster_thunderclap" + "AbilityTextureName" "polar_furbolg_ursa_warrior_thunder_clap" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + "MaxLevel" "2" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "1.3" + "AbilityCooldown" "11.0" + "AbilityDamage" "250" + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "250" + } + "02" + { + "var_type" "FIELD_INTEGER" + "movespeed_slow" "-20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "attackspeed_slow" "-20" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "3.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage" "250" + } + "06" + { + "var_type" "FIELD_FLOAT" + "speed" "0.5" + } + } + } + + //================================================================================================================= + // Brewmaster: Primal Split + //================================================================================================================= + "aghsfort_brewmaster_primal_split" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/aghsfort_brewmaster_primal_split" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Brewmaster.PrimalSplit.Spawn" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + "HasScepterUpgrade" "1" + + "IsOnCastBar" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "2.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "16 18 20" + } + "02" + { + "var_type" "FIELD_FLOAT" + "split_duration" "0.6" + } + "03" + { + "var_type" "FIELD_INTEGER" + "scepter_movementspeed" "100" + "RequiresScepter" "1" + } + } + } + + //================================================================================================================= + // Brewmaster Fire: Permanent Immolation + //================================================================================================================= + "creature_brewmaster_fire_permanent_immolation" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "brewmaster_fire_permanent_immolation" + "AbilityTextureName" "brewmaster_fire_permanent_immolation" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "25" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "220" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Brewmaster Unit Passive + //================================================================================================================= + "brewmaster_unit_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/brewmaster_unit_passive" + + "IsOnCastBar" "0" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + } + + + //================================================================================================================= + // Naga Siren: Mirror Image + //================================================================================================================= + "aghsfort_naga_siren_mirror_image" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/aghsfort_naga_siren_mirror_image" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilitySound" "Hero_NagaSiren.MirrorImage" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + "IsOnCastBar" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.65" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "illusion_duration" "26" + } + "02" + { + "var_type" "FIELD_INTEGER" + "outgoing_damage" "-75 -70 -65 -60" + "LinkedSpecialBonus" "special_bonus_unique_naga_siren_4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "outgoing_damage_tooltip" "25 30 35 40" + "LinkedSpecialBonus" "special_bonus_unique_naga_siren_4" + } + "04" + { + "var_type" "FIELD_INTEGER" + "incoming_damage" "250" + } + "05" + { + "var_type" "FIELD_INTEGER" + "tooltip_incoming_damage_total_pct" "350" + } + "06" + { + "var_type" "FIELD_INTEGER" + "images_count" "3 3 3 3" + "LinkedSpecialBonus" "special_bonus_unique_naga_siren" + } + "07" + { + "var_type" "FIELD_FLOAT" + "invuln_duration" "0.3" + } + } + } + + //================================================================================================================= + // Tidehunter Passive + //================================================================================================================= + "tidehunter_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/tidehunter_passive" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "damage_counter_duration" "5.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_threshold" "3000" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_counter_tiers" "6" + } + "04" + { + "var_type" "FIELD_FLOAT" + "time_before_reduction" "1.5" + } + } + } + + //================================================================================================================= + // Tidehunter: Mini Ravage + //================================================================================================================= + "tidehunter_mini_ravage" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "tidehunter_ravage" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "2" + "AbilitySound" "Ability.Ravage" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.3 0.3 0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20.0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "1000" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + "02" + { + "var_type" "FIELD_INTEGER" + "speed" "725" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "1.0" + } + } + } + + //================================================================================================================= + // Luna: Lucent Beam (Aghanim's Fortress) + //================================================================================================================= + "aghsfort_luna_lucent_beam" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "aghsfort_luna_lucent_beam" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Luna.LucentBeam.Target" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "0.4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "6.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "90 100 110 120" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.5" // Mostly about the damage + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "0.8" + } + "02" + { + "var_type" "FIELD_INTEGER" + "beam_damage" "75 150 225 300" + "LinkedSpecialBonus" "special_bonus_unique_luna_1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "225" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Luna: Eclipse (Aghanim's Fortress) + //================================================================================================================= + "aghsfort_luna_eclipse" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "luna_eclipse" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Luna.Eclipse.Cast" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.6 0.6 0.6" + "AbilityCastRange" "0" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "140.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "150 200 250" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "beams" "8 11 14" + } + "02" + { + "var_type" "FIELD_INTEGER" + "hit_count" "5" + } + "03" + { + "var_type" "FIELD_FLOAT" + "beam_interval" "0.6 0.6 0.6" + } + "04" + { + "var_type" "FIELD_FLOAT" + "beam_interval_scepter" "0.3" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration_tooltip" "2.4 4.2 6.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "radius" "675 675 675" + } + "07" + { + "var_type" "FIELD_INTEGER" + "beams_scepter" "10 15 20" + } + "08" + { + "var_type" "FIELD_INTEGER" + "hit_count_scepter" "10 15 20" + } + "09" + { + "var_type" "FIELD_FLOAT" + "duration_tooltip_scepter" "1.8 3.6 5.4" + } + "10" + { + "var_type" "FIELD_INTEGER" + "cast_range_tooltip_scepter" "2500" + } + "11" + { + "var_type" "FIELD_INTEGER" + "lucent_beam_radius" "225" + } + } + } + + //================================================================================================================= + // Omniknight: Regen Aura + //================================================================================================================= + "aghsfort_omniknight_degen_aura" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_CUSTOM" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilityTextureName" "omniknight_degen_aura" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "400 500 600 700" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "move_speed_bonus" "16 20 24 28" + "LinkedSpecialBonus" "special_bonus_unique_omniknight_2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_speed_bonus" "40 60 80 100" + "LinkedSpecialBonus" "special_bonus_unique_omniknight_2" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "450" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + //================================================================================================================= + // Omniknight: Repel + //================================================================================================================= + "aghsfort_omniknight_repel" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "omniknight_repel" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Omniknight.Repel" + + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "500" + "AbilityCastPoint" "0.25" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "24 22 20 18" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "55 60 65 70" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "3.0" // Value much higher than cost. + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "15" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_reduction" "-10 -15 -20 -25" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_str" "10 20 30 40" + } + "04" + { + "var_type" "FIELD_INTEGER" + "hp_regen" "6 12 18 24" + "LinkedSpecialBonus" "special_bonus_unique_omniknight_5" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // START REWARD AURAS + //================================================================================================================= + + "aghsfort_aura_reward_hp" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "granite_golem_hp_aura" + "MaxLevel" "5" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "bonus_hp" "10 25 40 60 100" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "5000" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + "aghsfort_aura_reward_armor" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "pangolier_shield_crash" + "MaxLevel" "5" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "3 6 12 24 32" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "5000" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + "aghsfort_aura_reward_crit_chance" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "juggernaut_blade_dance" + "MaxLevel" "5" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "15" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crit_multiplier" "140 175 225 325 450" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + + "aghsfort_aura_reward_magic_resist" + { + // General + //------------------------------------------------------------------------------------------------------------- + "MaxLevel" "5" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityTextureName" "mudgolem_cloak_aura" + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_magical_armor" "15 25 35 55 75" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_magical_armor_creeps" "0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "5000" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // END REWARD AURAS + //================================================================================================================= + + + //================================================================================================================= + // START REWARD TEMP BUFFS + //================================================================================================================= + + "aghsfort_tempbuff_corpse_explosion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityTextureName" "pudge_flesh_heap" + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "5000" + } + "02" + { + "var_type" "FIELD_INTEGER" + "corpse_explosion_chance_pct" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "corpse_explosion_damage_pct" "25" + } + "04" + { + "var_type" "FIELD_INTEGER" + "corpse_explosion_radius" "400" + } + + + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // END REWARD TEMP BUFFS + //================================================================================================================= + + //================================================================================================================= + // Undead Tusk Mage Tombstone + //================================================================================================================= + "undead_tusk_mage_tombstone" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "undead_tusk_mage_tombstone" + "ScriptFile" "abilities/creatures/undead_tusk_mage_tombstone" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "FightRecapLevel" "1" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "AbilitySound" "Hero_Undying.Tombstone" + + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AnimationPlaybackRate" "0.5" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + "AbilityCastPoint" "2.5" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "30.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "600" + } + "03" + { + "var_type" "FIELD_FLOAT" + "skeleton_interval" "3.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "skeletons_per_tick" "1" + } + "05" + { + "var_type" "FIELD_INTEGER" + "max_skeletons" "8" + } + } + } + + //================================================================================================================= + // Creature Dark Seer: Vacuum + //================================================================================================================= + "creature_dark_seer_vacuum" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "dark_seer_vacuum" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Dark_Seer.Vacuum" + + "IsOnCastBar" "0" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + "AbilityCastPoint" "0.4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "550" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "0.6" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "300" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius_tree" "275" + } + "05" + { + "var_type" "FIELD_INTEGER" + "scepter_cooldown" "12" + "RequiresScepter" "1" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + + //================================================================================================================= + // Creature Dark Seer: Wall of Replica + //================================================================================================================= + "creature_dark_seer_wall_of_replica" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "dark_seer_wall_of_replica" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_VECTOR_TARGETING" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Dark_Seer.Wall_of_Replica_Start" + + "IsOnCastBar" "0" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "700" + "AbilityCastPoint" "0.2" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "15.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "replica_damage_outgoing" "0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "tooltip_outgoing" "70 85 100" + } + "04" + { + "var_type" "FIELD_INTEGER" + "replica_damage_incoming" "100" + } + "05" + { + "var_type" "FIELD_INTEGER" + "tooltip_replica_total_damage_incoming" "200" + "CalculateSpellDamageTooltip" "0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "width" "1300" + } + "07" + { + "var_type" "FIELD_INTEGER" + "replica_scale" "0" + } + "08" + { + "var_type" "FIELD_INTEGER" + "movement_slow" "50" + } + "09" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "0.75" + } + "10" + { + "var_type" "FIELD_FLOAT" + "scepter_length_multiplier" "2" + "RequiresScepter" "1" + } + } + } + + //================================================================================================================= + // Lich: Sinister Gaze + //================================================================================================================= + "creature_lich_sinister_gaze" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "lich_sinister_gaze" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_DONT_CANCEL_CHANNEL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "HasScepterUpgrade" "1" + + "IsOnCastBar" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityChannelTime" "2.5" + "AbilityCooldown" "16" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "2.5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "destination" "65" + } + "03" + { + "var_type" "FIELD_INTEGER" + "mana_drain" "0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "cast_range" "600" + } + "05" + { + "var_type" "FIELD_INTEGER" + "aoe_scepter" "400" + "RequiresScepter" "1" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Creature Lich: Chain Frost + //================================================================================================================= + "creature_lich_chain_frost" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "lich_chain_frost" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Lich.ChainFrost" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "750" + "AbilityCastPoint" "0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_6" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "16" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.0" // Primarily about the damage + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "1000" + } + "02" + { + "var_type" "FIELD_INTEGER" + "jumps" "10" + } + "03" + { + "var_type" "FIELD_INTEGER" + "jump_range" "600" + } + "04" + { + "var_type" "FIELD_INTEGER" + "slow_movement_speed" "-65" + } + "05" + { + "var_type" "FIELD_INTEGER" + "slow_attack_speed" "-65" + } + "06" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "2.5" + } + "07" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "600" + } + "08" + { + "var_type" "FIELD_INTEGER" + "vision_radius" "800" + } + "09" + { + "var_type" "FIELD_INTEGER" + "bonus_jump_damage" "0" + } + } + } + + //================================================================================================================= + // Tusk Mage Freezing Blast + //================================================================================================================= + "aghsfort_tusk_mage_freezing_blast" + { + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/tusk_mage_freezing_blast" + + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + //"AbilitySound" "Hero_Crystal.frostbite" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "750" + "AbilityCastPoint" "1.2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.5" // Applies multiple modifiers + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "impact_damage" "125" + } + "02" + { + "var_type" "FIELD_FLOAT" + "projectile_speed" "500" + } + "03" + { + "var_type" "FIELD_FLOAT" + "projectile_radius" "100" + } + "04" + { + "var_type" "FIELD_FLOAT" + "projectile_distance" "1000" + } + "05" + { + "var_type" "FIELD_INTEGER" + "movespeed_slow" "-15" + } + "06" + { + "var_type" "FIELD_INTEGER" + "attackspeed_slow" "-125" + } + "07" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "1.3" + } + } + } + + //================================================================================================================= + // Ogreseal Flop + //================================================================================================================= + "ogreseal_flop" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/ogreseal_flop" + "AbilityTextureName" "ogreseal_flop" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_NORMAL_WHEN_STOLEN" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "FightRecapLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + "IsOnCastBar" "0" + + "MaxLevel" "2" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "6" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "250" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "550" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.0" + } + } + } + + //================================================================================================================= + // Friendly Ogre Seal Flop + //================================================================================================================= + "friendly_ogreseal_flop" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/friendly_ogreseal_flop" + "AbilityTextureName" "ogreseal_flop" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_NORMAL_WHEN_STOLEN" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "FightRecapLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + "IsOnCastBar" "0" + + "MaxLevel" "2" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "6" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "275" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "130" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "0.5" + } + } + } + + //================================================================================================================= + // Bomber: Death Explosion + //================================================================================================================= + "bomber_death_explosion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/bomber_death_explosion" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "250" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "300" + } + "03" + { + "var_type" "FIELD_FLOAT" + "min_delay_time" "2.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "max_delay_time" "2.25" + } + "05" + { + "var_type" "FIELD_FLOAT" + "is_ascension_ability" "0" + } + } + } + + //================================================================================================================= + // Bomber: Suicide On Attack + //================================================================================================================= + "bomber_suicide_on_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/bomber_suicide_on_attack" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "suicide_chance" "15" + } + } + } + + //================================================================================================================= + // Pudge Miniboss: Hateful Strike + //================================================================================================================= + "creature_pudge_miniboss_hateful_strike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "AbilitySound" "Hero_PhantomAssassin.CoupDeGrace" + + "IsOnCastBar" "0" + + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "maxhp_percent_damage" "70" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "every_n_attacks" "3" + } + } + } + + //================================================================================================================= + // Creature Pudge Dismember + //================================================================================================================= + "creature_pudge_dismember" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "pudge_dismember" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "FightRecapLevel" "2" + + "IsOnCastBar" "0" + + "HasScepterUpgrade" "1" + "AbilityDraftUltScepterAbility" "pudge_eject" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + "AbilityCastPoint" "0.3 0.3 0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + "AbilityChannelAnimation" "ACT_DOTA_CHANNEL_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityChannelTime" "2.5" + "AbilityCooldown" "18" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "dismember_damage" "250" + "LinkedSpecialBonus" "special_bonus_unique_pudge_3" + "LinkedSpecialBonusField" "value" + } + "02" + { + "var_type" "FIELD_FLOAT" + "strength_damage" "0" + "LinkedSpecialBonus" "special_bonus_unique_pudge_3" + "LinkedSpecialBonusField" "value2" + "CalculateSpellDamageTooltip" "0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "ticks" "3.0" + "LinkedSpecialBonus" "special_bonus_unique_pudge_6" + "LinkedSpecialBonusField" "value2" + } + "04" + { + "var_type" "FIELD_INTEGER" + "pull_units_per_second" "125" + } + "05" + { + "var_type" "FIELD_INTEGER" + "pull_distance_limit" "350" + } + "06" + { + "var_type" "FIELD_FLOAT" + "animation_rate" "1.5" + } + "07" + { + "var_type" "FIELD_INTEGER" + "abilitychanneltime" "" + "LinkedSpecialBonus" "special_bonus_unique_pudge_6" + } + "08" + { + "var_type" "FIELD_INTEGER" + "creep_dismember_duration_tooltip" "6.0 6.0 6.0" + } + "09" + { + "var_type" "FIELD_INTEGER" + "scepter_regen_pct" "4" + "RequiresScepter" "1" + } + "10" + { + "var_type" "FIELD_FLOAT" + "order_lock_duration" "3" + "RequiresScepter" "1" + } + "11" + { + "var_type" "FIELD_INTEGER" + "scepter_cooldown" "11" + "RequiresScepter" "1" + } + } + } + + + //================================================================================================================= + // Pudge Miniboss: Flesh Heap + //================================================================================================================= + "creature_pudge_miniboss_flesh_heap" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "pudge_flesh_heap" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "health_regen" "0 8 16 32" + } + "02" + { + "var_type" "FIELD_FLOAT" + "flesh_heap_strength_buff_amount" "0 0 0 0" + "LinkedSpecialBonus" "special_bonus_unique_pudge_1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "flesh_heap_range" "1200" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + + //================================================================================================================= + // Pudge Miniboss: Armor Corruption + //================================================================================================================= + "creature_pudge_miniboss_armor_corruption" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + + "IsOnCastBar" "0" + + "AbilityCooldown" "3" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "armor_reduction_per_stack" "1.0" + } + "02" + { + "var_type" "FIELD_FLOAT" + "stack_duration" "10" + } + } + } + + //================================================================================================================= + // Wave Blast + //================================================================================================================= + "aghsfort_wave_blast" + { + // General + //------------------------------------------------------------------------------------------------------------- + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + "IsOnCastBar" "0" + + "AbilitySound" "Hero_Invoker.DeafeningBlast" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1200" + "AbilityCastPoint" "0.7" + "AbilityCastAnimation" "ACT_INVALID" + + + "AbilityManaCost" "0" + "AbilityCooldown" "0" + "AbilityCharges" "1" + "AbilityChargeRestoreTime" "4" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "travel_distance" "1200" + } + "02" + { + "var_type" "FIELD_INTEGER" + "travel_speed" "600" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius_start" "120" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius_end" "120" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage" "400" + } + "06" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.2" + } + "07" + { + "var_type" "FIELD_FLOAT" + "disarm_duration" "0" + } + "08" + { + "var_type" "FIELD_FLOAT" + "wave_cooldown" "5.75" + } + "09" + { + "var_type" "FIELD_FLOAT" + "animation_fade_in" "0.0" + } + "10" + { + "var_type" "FIELD_FLOAT" + "playback_rate" "0.75" + } + + + } + //"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Ability: Waveblaster Leap Leap + //================================================================================================================= + "aghsfort_waveblaster_leap" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "Ability.Leap" + "AbilityTextureName" "sandking_caustic_finale" + + "IsOnCastBar" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8.0" + "AbilityCharges" "1" + "AbilityChargeRestoreTime" "8.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "min_range" "1300" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "2000" + } + "03" + { + "var_type" "FIELD_FLOAT" + "leap_speed" "1300.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "leap_acceleration" "6000.0" + } + + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Waveblaster: Summon Ghost + //================================================================================================================= + "aghsfort_waveblaster_summon_ghost" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "kunkka_torrent" + "ScriptFile" "abilities/creatures/aghsfort_waveblaster_summon_ghost" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.5" // applies 2 modifiers + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "spawn_count" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spawn_distance" "150" + } + "03" + { + "var_type" "FIELD_FLOAT" + "spawn_delay" "1.5" + } + } + } + + //================================================================================================================= + // Kunkka: Torrent Dark Moon + //================================================================================================================= + "kunkka_torrent_dm" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "kunkka_torrent" + "ScriptFile" "abilities/creatures/kunkka_torrent_dm" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1500" + "AbilityCastPoint" "0.4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "600" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.5" // applies 2 modifiers + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "225" + "LinkedSpecialBonus" "special_bonus_unique_kunkka" + } + "02" + { + "var_type" "FIELD_INTEGER" + "movespeed_bonus" "-35" + } + "03" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "1.75 2.5 3.25 4.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.6" + } + "05" + { + "var_type" "FIELD_FLOAT" + "delay" "1.6 1.6 1.6 1.6" + } + } + } + + //================================================================================================================= + // Creature: Kraken Shell + //================================================================================================================= + "creature_kraken_shell" + { + "BaseClass" "tidehunter_kraken_shell" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_reduction" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_cleanse" "200" + } + "03" + { + "var_type" "FIELD_FLOAT" + "damage_reset_interval" "6.0 6.0 6.0 6.0" + } + } + } + + //================================================================================================================= + // Creature Tidehunter: Gush + //================================================================================================================= + "creature_tidehunter_gush" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "HasScepterUpgrade" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "0.6" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20" + "AbilityDuration" "2.0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "800" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Actions + //------------------------------------------------------------------------------------------------------------- + "OnSpellStart" + { + "LinearProjectile" + { + "Target" "POINT" + "EffectName" "particles/units/heroes/hero_tidehunter/tidehunter_gush_upgrade.vpcf" + "MoveSpeed" "%projectile_speed" + "StartPosition" "attach_attack2" + "StartRadius" "%aoe_scepter" + "EndRadius" "%aoe_scepter" + "TargetTeams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "TargetTypes" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "TargetFlags" "DOTA_UNIT_TARGET_FLAG_NONE" + "HasFrontalCone" "0" + "ProvidesVision" "0" + "VisionRadius" "300" + } + "FireSound" + { + "EffectName" "Ability.GushCast" + } + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "false" + + "Damage" + { + "Type" "DAMAGE_TYPE_MAGICAL" + "Damage" "%damage" + "Target" "TARGET" + } + + "ApplyModifier" + { + "ModifierName" "modifier_tidehunter_gush" + "Duration" "%duration" + "Target" "TARGET" + } + + "Knockback" + { + "Target" "TARGET" + "Center" "PROJECTILE" //"CASTER" + "Duration" "0.5" //"%knockback_duration" + "Distance" "200" //"%knockback_max_distance" + "IsFixedDistance" "1" + "Height" "10" + } + } + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "200" + } + "02" + { + "var_type" "FIELD_INTEGER" + "movement_speed" "-25" + } + "03" + { + "var_type" "FIELD_FLOAT" + "negative_armor" "10" + "LinkedSpecialBonus" "special_bonus_unique_tidehunter" + } + "04" + { + "var_type" "FIELD_INTEGER" + "speed_scepter" "200" + } + "05" + { + "var_type" "FIELD_INTEGER" + "aoe_scepter" "240" + } + "06" + { + "var_type" "FIELD_INTEGER" + "cooldown_scepter" "20" + } + "07" + { + "var_type" "FIELD_INTEGER" + "cast_range_scepter" "800" + } + "08" + { + "var_type" "FIELD_INTEGER" + "knockback_duration" "0.25" + } + "09" + { + "var_type" "FIELD_INTEGER" + "knockback_max_distance" "200" + } + "10" + { + "var_type" "FIELD_INTEGER" + "duration" "2" + } + "11" + { + "var_type" "FIELD_INTEGER" + "damage" "1000" + } + } + } + + //================================================================================================================= + // Bandit: Blink Strike + //================================================================================================================= + "creature_blink_strike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "riki_blink_strike" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_CUSTOM" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_CUSTOM" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilitySound" "Hero_Riki.Blink_Strike" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "0.4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "tooltip_range" "700" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "400" + } + } + } + + //================================================================================================================= + // Bandit Captain: Stifling Dagger + //================================================================================================================= + "bandit_stifling_dagger" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/bandit_stifling_dagger" + "AbilityTextureName" "phantom_assassin_stifling_dagger" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "10000" + "AbilityCastPoint" "1.1" + "AbilityChannelTime" "0.9" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityDuration" "4" + "AbilityCooldown" "14" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "dagger_speed" "550" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "4" + } + "04" + { + "var_type" "FIELD_INTEGER" + "base_damage" "0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "attack_factor" "-30" + } + "06" + { + "var_type" "FIELD_INTEGER" + "attack_factor_tooltip" "70" + } + "07" + { + "var_type" "FIELD_INTEGER" + "dagger_count" "12" + } + "08" + { + "var_type" "FIELD_INTEGER" + "dagger_offset" "50" // 100 + } + "09" + { + "var_type" "FIELD_FLOAT" + "dagger_rate" "0.14" + } + "10" + { + "var_type" "FIELD_INTEGER" + "dagger_range" "1200" + } + } + } + + //================================================================================================================= + // Bandit Archer Arrow + //================================================================================================================= + "bandit_archer_arrow" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/bandit_archer_arrow" + "AbilityTextureName" "mirana_arrow" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "MaxLevel" "1" + + "AbilityCastAnimation" "ACT_DOTA_ATTACK" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "4000" + "AbilityCastPoint" "1.2" // "1.334" + "AnimationPlaybackRate" "0.7" + "AnimationIgnoresModelScale" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "4" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "700" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_width_initial" "100" + } + "03" + { + "var_type" "FIELD_INTEGER" + "attack_width_end" "100" + } + "04" + { + "var_type" "FIELD_INTEGER" + "attack_distance" "4000" + } + "05" + { + "var_type" "FIELD_INTEGER" + "attack_damage" "1000" + } + "06" + { + "var_type" "FIELD_FLOAT" + "duration" "3.0" + } + "07" + { + "var_type" "FIELD_FLOAT" + "break_duration" "3.0" + } + } + } + + //================================================================================================================= + // Creature: Juggernaut Blade Fury + //================================================================================================================= + "creature_juggernaut_blade_fury" + { + "BaseClass" "juggernaut_blade_fury" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "17" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "blade_fury_damage_tick" "0.2" + "CalculateSpellDamageTooltip" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "blade_fury_radius" "250" + } + "03" + { + "var_type" "FIELD_INTEGER" + "blade_fury_damage" "300" + "LinkedSpecialBonus" "special_bonus_unique_juggernaut_3" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "5.0" + "LinkedSpecialBonus" "special_bonus_unique_juggernaut" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Creature: Juggernaut Omnislash + //================================================================================================================= + "creature_juggernaut_omnislash" + { + "BaseClass" "juggernaut_omni_slash" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES | DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "350" + "AbilityCastPoint" "0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.0" // damage only + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "attack_rate_multiplier" "1.7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "250" + "CalculateSpellDamageTooltip" "0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "3" + } + "04" + { + "var_type" "FIELD_INTEGER" + "omni_slash_radius" "425" + } + } + } + + //================================================================================================================= + // Sand King Boss Passive + //================================================================================================================= + "sand_king_boss_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "sandking_caustic_finale" + "ScriptFile" "abilities/creatures/sand_king_boss_passive" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "caustic_armor_reduction_pct" "20" + } + "02" + { + "var_type" "FIELD_FLOAT" + "caustic_duration" "4.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "caustic_radius" "400" + } + "04" + { + "var_type" "FIELD_INTEGER" + "caustic_damage" "1500" + } + "05" + { + "var_type" "FIELD_INTEGER" + "accuracy_pct" "50" + } + } + } + + //================================================================================================================= + // Sand King: Claw Attack + //================================================================================================================= + "sand_king_claw_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "bloodseeker_bloodrage" + "ScriptFile" "abilities/creatures/sand_king_claw_attack" + "AbilityCastAnimation" "ACT_DOTA_ATTACK" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AnimationIgnoresModelScale" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "450" + "AbilityCastPoint" "1.1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "1.00" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "2500" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "110" + } + "03" + { + "var_type" "FIELD_FLOAT" + "animation_time" "1.00" + } + "04" + { + "var_type" "FIELD_FLOAT" + "initial_delay" "0.85" + } + "05" + { + "var_type" "FIELD_INTEGER" + "forward_movement" "60" + } + } + } + + //================================================================================================================= + // Sand King: Tail Swipe Left + //================================================================================================================= + "sand_king_tail_swipe_left" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "bloodseeker_bloodrage" + "ScriptFile" "abilities/creatures/sand_king_tail_swipe_left" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AnimationIgnoresModelScale" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "450" + "AbilityCastPoint" "1.98" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "3500" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "110" + } + "03" + { + "var_type" "FIELD_FLOAT" + "animation_time" "1.98" + } + "04" + { + "var_type" "FIELD_FLOAT" + "initial_delay" "1.5" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "0.5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_distance" "600" + } + "07" + { + "var_type" "FIELD_INTEGER" + "knockback_height" "100" + } + "08" + { + "var_type" "FIELD_INTEGER" + "movespeed_slow" "-100" + } + "09" + { + "var_type" "FIELD_INTEGER" + "attackspeed_slow" "-100" + } + "10" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "4.0" + } + } + } + + //================================================================================================================= + // Sand King: Tail Swipe Right + //================================================================================================================= + "sand_king_tail_swipe_right" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "bloodseeker_bloodrage" + "ScriptFile" "abilities/creatures/sand_king_tail_swipe_right" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AnimationIgnoresModelScale" "1" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "450" + "AbilityCastPoint" "1.98" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "3500" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "110" + } + "03" + { + "var_type" "FIELD_FLOAT" + "animation_time" "1.98" + } + "04" + { + "var_type" "FIELD_FLOAT" + "initial_delay" "1.5" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "0.5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_distance" "800" + } + "07" + { + "var_type" "FIELD_INTEGER" + "knockback_height" "100" + } + "08" + { + "var_type" "FIELD_INTEGER" + "movespeed_slow" "-100" + } + "09" + { + "var_type" "FIELD_INTEGER" + "attackspeed_slow" "-100" + } + "10" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "4.0" + } + } + } + + //================================================================================================================= + // Sand King: Burrowed Forward Tail + //================================================================================================================= + "sand_king_burrowed_forward_strike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "bloodseeker_bloodrage" + "ScriptFile" "abilities/creatures/sand_king_burrowed_forward_strike" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_7" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AnimationIgnoresModelScale" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "450" + "AbilityCastPoint" "2.75" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "4.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "4000" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "125" + } + "03" + { + "var_type" "FIELD_FLOAT" + "animation_time" "3.5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "initial_delay" "2.4" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "4.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_distance" "0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "knockback_height" "0" + } + } + } + + //================================================================================================================= + // Sand King: Burrowed Backward Tail + //================================================================================================================= + "sand_king_burrowed_backward_strike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "bloodseeker_bloodrage" + "ScriptFile" "abilities/creatures/sand_king_burrowed_backward_strike" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_ROT" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AnimationIgnoresModelScale" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "450" + "AbilityCastPoint" "2.75" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "4.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "3500" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "125" + } + "03" + { + "var_type" "FIELD_FLOAT" + "animation_time" "3.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "initial_delay" "2.4" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "2.5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_distance" "0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "knockback_height" "0" + } + } + } + + //================================================================================================================= + // Sand King Boss: Burrow + //================================================================================================================= + "sand_king_boss_burrow" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/sand_king_boss_burrow" + "AbilityTextureName" "nyx_assassin_burrow" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "MaxLevel" "1" + "FightRecapLevel" "1" + + "AbilityCastAnimation" "ACT_DOTA_RAZE_1" + + "IsOnCastBar" "0" + + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "2.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + } + } + + //================================================================================================================= + // Sand King Boss: Burrow strike + //================================================================================================================= + "sand_king_boss_burrowstrike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "sandking_burrowstrike" + "ScriptFile" "abilities/creatures/sand_king_boss_burrowstrike" + + "AbilityCastAnimation" "ACT_DOTA_SAND_KING_BURROW_IN" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilityCastPoint" "0.8" + + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "3000" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "speed" "1000" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "1500" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "300" + } + "04" + { + "var_type" "FIELD_FLOAT" + "delay" "1.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_distance" "500" + } + "07" + { + "var_type" "FIELD_INTEGER" + "knockback_height" "150" + } + "08" + { + "var_type" "FIELD_INTEGER" + "scaling_speed" "900" + } + } + } + + //================================================================================================================= + // Sand King Boss: Sand Storm + //================================================================================================================= + "sand_king_boss_sandstorm" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "sandking_sand_storm" + "ScriptFile" "abilities/creatures/sand_king_boss_sandstorm" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilitySound" "Ability.SandKing_SandStorm.start" + "AbilityCastAnimation" "ACT_DOTA_SPAWN" + "AbilityCastPoint" "2.0" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityDuration" "50" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "34" + "AbilityChannelTime" "15" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "500" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "60 50 40 30" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "sand_storm_invis_delay" "0.5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "sand_storm_radius" "700" + } + "03" + { + "var_type" "FIELD_FLOAT" + "channel_time" "15.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "storm_count_per_player" "1" + } + "05" + { + "var_type" "FIELD_INTEGER" + "storm_angle_step" "30" + } + "06" + { + "var_type" "FIELD_INTEGER" + "storm_speed" "375" + } + "07" + { + "var_type" "FIELD_INTEGER" + "storm_speed_step" "40" + } + "08" + { + "var_type" "FIELD_INTEGER" + "spiral_storm_count" "12" + } + } + } + + //================================================================================================================= + // Sand King Boss: Sand Storm Passive + //================================================================================================================= + "sand_king_boss_sandstorm_storm_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "sandking_sand_storm" + "ScriptFile" "abilities/creatures/sand_king_boss_sandstorm_storm_passive" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "sand_storm_radius" "165" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "800" + } + "03" + { + "var_type" "FIELD_INTEGER" + "movespeed_pct" "33" + } + "04" + { + "var_type" "FIELD_INTEGER" + "storm_move_speed" "325" + } + "05" + { + "var_type" "FIELD_FLOAT" + "blind_duration" "5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "storm_decreased_turn_rate" "150" + } + } + } + + //================================================================================================================= + // Sand King Boss: Epicenter + //================================================================================================================= + "sand_king_boss_epicenter" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "sandking_epicenter" + "ScriptFile" "abilities/creatures/sand_king_boss_epicenter" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + "AbilityCastPoint" "2.0" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "34" + "AbilityChannelTime" "15" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "60" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "900" + } + "02" + { + "var_type" "FIELD_FLOAT" + "interval" "1.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "pulse_width" "110" + } + "04" + { + "var_type" "FIELD_INTEGER" + "pulse_distance" "5000" + } + "05" + { + "var_type" "FIELD_INTEGER" + "min_pulse_speed" "500" + } + "06" + { + "var_type" "FIELD_INTEGER" + "blocker_radius" "225" + } + "07" + { + "var_type" "FIELD_INTEGER" + "min_random_pulses" "7" + } + "08" + { + "var_type" "FIELD_INTEGER" + "max_random_pulses" "15" + } + "09" + { + "var_type" "FIELD_INTEGER" + "max_pulse_speed" "1000" + } + "10" + { + "var_type" "FIELD_INTEGER" + "speed_step" "100" + } + "11" + { + "var_type" "FIELD_INTEGER" + "pulse_end_width" "110" + } + "12" + { + "var_type" "FIELD_INTEGER" + "random_pulses_step" "3" + } + } + } + + //================================================================================================================= + // Sand King Boss: Unburrow + //================================================================================================================= + "sand_king_boss_unburrow" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/sand_king_boss_unburrow" + "AbilityTextureName" "nyx_assassin_unburrow" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "MaxLevel" "1" + "FightRecapLevel" "1" + + "AbilityCastAnimation" "ACT_DOTA_RAZE_2" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "2.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + } + + //================================================================================================================= + // Sand King Strafe Move Left + //================================================================================================================= + "sand_king_boss_move_left" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "bloodseeker_bloodrage" + "ScriptFile" "abilities/creatures/sand_king_boss_move_left" + "AbilityCastAnimation" "ACT_DOTA_RUN" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AnimationIgnoresModelScale" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "550" + "AbilityCastPoint" "10" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "speed" "400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "minimum_duration" "0.75" + } + "03" + { + "var_type" "FIELD_FLOAT" + "maximum_duration" "1.0" + } + } + } + + //================================================================================================================= + // Sand King Strafe Move Right + //================================================================================================================= + "sand_king_boss_move_right" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "bloodseeker_bloodrage" + "ScriptFile" "abilities/creatures/sand_king_boss_move_right" + "AbilityCastAnimation" "ACT_DOTA_RUN" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AnimationIgnoresModelScale" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "550" + "AbilityCastPoint" "10" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "speed" "400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "minimum_duration" "0.75" + } + "03" + { + "var_type" "FIELD_FLOAT" + "maximum_duration" "1.0" + } + } + } + + //================================================================================================================= + // Sand King Strafe Move Back + //================================================================================================================= + "sand_king_boss_move_back" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "bloodseeker_bloodrage" + "ScriptFile" "abilities/creatures/sand_king_boss_move_back" + "AbilityCastAnimation" "ACT_DOTA_RUN" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AnimationIgnoresModelScale" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "300" + "AbilityCastPoint" "10" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "speed" "350" + } + "02" + { + "var_type" "FIELD_FLOAT" + "minimum_duration" "0.75" + } + "03" + { + "var_type" "FIELD_FLOAT" + "maximum_duration" "1.0" + } + } + } + + //================================================================================================================= + // Nyx Suicide Heal + //================================================================================================================= + "nyx_suicide_heal" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/nyx_suicide_heal" + "AbilityTextureName" "nyx_assassin_unburrow" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "200" + "AbilityCastPoint" "0.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "15.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "heal" "400" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "350" + } + } + } + + //================================================================================================================= + // Burrower Big Explosion + //================================================================================================================= + "burrower_big_explosion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/burrower_big_explosion" + "AbilityTextureName" "polar_furbolg_ursa_warrior_thunder_clap" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.67" + "AbilityCooldown" "10" + "AbilityDamage" "400" + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "300" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "3.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "1250" + } + } + } + + //================================================================================================================= + // Rock Unit + //================================================================================================================= + "ability_storegga_rock" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + + "BaseClass" "ability_datadriven" + + "IsOnCastBar" "0" + + "Modifiers" + { + "modifier_ability_storegga_rock" + { + "Passive" "1" + "States" + { + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + } + + //================================================================================================================= + // Storegga Arm Slam + //================================================================================================================= + "storegga_arm_slam" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/storegga_arm_slam" + "AbilityTextureName" "bloodseeker_bloodrage" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_7" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + //"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" // dev test + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES | DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AnimationIgnoresModelScale" "1" + "MaxLevel" "4" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "450" + "AbilityCastPoint" "2.20 2.05 1.90 1.75" + "AnimationPlaybackRate" "1.0 1.0732 1.1579 1.2571" // 1.0 corresponds to cast point of 2.2 + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "2.2" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "2700 3000 3300 3600" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "200 210 220 230" + } + "03" + { + "var_type" "FIELD_FLOAT" + "animation_time" "2.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "initial_delay" "1.2" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.5 1.75 2.0 2.25" + } + } + } + + //================================================================================================================= + // Storegga Grab + //================================================================================================================= + "storegga_grab" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "bloodseeker_bloodrage" + "ScriptFile" "abilities/creatures/storegga_grab" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_6" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_ALL" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES | DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "4" + + "AnimationIgnoresModelScale" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "450" + "AbilityCastPoint" "2.0" + "AnimationPlaybackRate" "0.35" // 0.35 (supposedly) corresponds to cast point of 1.25 + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "2.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "grab_radius" "200" + } + "02" + { + "var_type" "FIELD_FLOAT" + "animation_time" "2.00" + } + "03" + { + "var_type" "FIELD_FLOAT" + "initial_delay" "1.2" + } + "04" + { + "var_type" "FIELD_FLOAT" + "min_hold_time" "1.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "max_hold_time" "4.0" + } + } + } + + //================================================================================================================= + // Storegga Grab Throw + //================================================================================================================= + "storegga_grab_throw" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "storegga_grab_throw" + "ScriptFile" "abilities/creatures/storegga_grab_throw" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + "IsOnCastBar" "0" + + "MaxLevel" "4" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "2000" + "AbilityCastPoint" "1.25" + "AnimationPlaybackRate" "0.7" // 0.7 (supposedly) corresponds to cast point of 1.25 + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "throw_speed" "1600" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "235 240 245 250" + } + + "03" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "2.0 2.2 2.4 2.6" + } + + "04" + { + "var_type" "FIELD_INTEGER" + "knockback_duration" "1.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "knockback_distance" "275" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_damage" "2600 2800 3000 3360" + } + "07" + { + "var_type" "FIELD_INTEGER" + "knockback_height" "150" + } + } + } + + //================================================================================================================= + // Storegga: Ground Pound + //================================================================================================================= + "storegga_ground_pound" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/storegga_ground_pound" + "AbilityTextureName" "omniknight_guardian_angel" + + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AnimationIgnoresModelScale" "1" + + "IsOnCastBar" "0" + "MaxLevel" "4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "16 15 14 13" + "AbilityChannelTime" "2.8" // anim 2 (2.5) + anim 2 end (1.2) with most of end anim clipped off + "AbilityCastPoint" "1.6 1.45 1.3 1.15" + //"AnimationPlaybackRate" "1.5625 1.7241 1.9231 2.1739" // 1.0 corresponds to cast point of 2.5 + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "pound_interval" "1.1161" // based on storegga_avalanche_channel anim (hit intervals are at 1.4) but adjusted due to channel_playback_rate + } + "02" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "0.3 0.6 0.9 1.2" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "2000 2200 2400 2600" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius" "500" + } + "05" + { + "var_type" "FIELD_INTEGER" + "movespeed_slow" "-75" + } + "06" + { + "var_type" "FIELD_FLOAT" + "cast_point_playback_rate" "1.5625 1.7241 1.9231 2.1739" // doing it here since we need to adjust it in ability once channel starts + } + "07" + { + "var_type" "FIELD_FLOAT" + "channel_playback_rate" "0.8929" // our channel anim would take 2.5s at 1.0 rate, we need ours slowed since our channel time is 2.8 + } + } + } + + //================================================================================================================= + // Storegga: Avalanche + //================================================================================================================= + "storegga_avalanche" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/storegga_avalanche" + "AbilityTextureName" "omniknight_guardian_angel" + + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AnimationIgnoresModelScale" "1" + + "IsOnCastBar" "0" + "MaxLevel" "4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30 29 28 27" + "AbilityChannelTime" "10.0" + "AbilityCastPoint" "2.0 1.75 1.5 1.25" + "AnimationPlaybackRate" "1.0 1.1429 1.3333 1.6000" // 1.0 corresponds to 2.0 cast point + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "interval" "0.33" + } + "02" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "0.5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "600 700 800 900" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius" "225" + } + "05" + { + "var_type" "FIELD_INTEGER" + "movement" "340 360 380 400" + } + } + } + + //================================================================================================================= + // Storegga Passive + //================================================================================================================= + "storegga_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/storegga_passive" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + + //================================================================================================================= + // Temple Guardian: Hammer Smash + //================================================================================================================= + "temple_guardian_hammer_smash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/temple_guardian_hammer_smash" + "AbilityTextureName" "centaur_double_edge" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "350" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_6" + "AnimationIgnoresModelScale" "1" + "AbilityCastPoint" "1.15 1.10 1.05 1.00" //"1.0" // must be kept inversely proportional to playback_rate + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "1.6 1.5 1.4 1.3" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "playback_rate" "0.4238 0.4450 0.4684 0.4944" // must be kept inversely proportional to cast point + } + "02" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "220 228 236 244" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "0.6 0.6 0.6 0.6" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage" "900 1060 1220 1380" + } + } + } + + //================================================================================================================= + // Temple Guardian: Rage Hammer Smash + //================================================================================================================= + "temple_guardian_rage_hammer_smash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/temple_guardian_rage_hammer_smash" + "AbilityTextureName" "centaur_double_edge" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "350" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_6" + "AnimationIgnoresModelScale" "1" + "AbilityCastPoint" "0.65 0.6 0.55 0.5" // must be kept inversely proportional to playback_rate + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "1.30 1.25 1.20 1.15" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "playback_rate" "0.6840 0.7410 0.8084 0.8892" // must be kept inversely proportional to cast point + } + "02" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "230 238 246 254" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "0.8 0.8 0.8 0.8" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage" "900 1080 1260 1440" + } + } + } + + //================================================================================================================= + // Temple Guardian: Purification + //================================================================================================================= + "temple_guardian_purification" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/temple_guardian_purification" + "AbilityTextureName" "omniknight_purification" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_NO" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "FightRecapLevel" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "1.5" // must be kept inversely proportional to playback_rate + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "14" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "playback_rate" "0.4000 0.4364 0.4800 0.5333" // must be kept inversely proportional to cast point + } + "02" + { + "var_type" "FIELD_INTEGER" + "heal" "800 850 900 950" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "250" + } + } + } + + //================================================================================================================= + // Temple Guardian: Wrath + //================================================================================================================= + "temple_guardian_wrath" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/temple_guardian_wrath" + "AbilityTextureName" "omniknight_guardian_angel" + + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + "IsOnCastBar" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25" + "AbilityChannelTime" "5.0" + "AbilityCastPoint" "1.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "effect_radius" "2000" + } + "02" + { + "var_type" "FIELD_FLOAT" + "delay" "1.5 1.45 1.4 1.35" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "300" + } + "04" + { + "var_type" "FIELD_INTEGER" + "blast_damage" "450 500 550 600" + } + "05" + { + "var_type" "FIELD_FLOAT" + "channel_duration" "7.0" + } + "06" + { + "var_type" "FIELD_FLOAT" + "interval" "0.1" + } + "07" + { + "var_type" "FIELD_FLOAT" + "block_cooldown" "0.001" + } + } + } + + //================================================================================================================= + // Temple Guardian: Hammer Throw + //================================================================================================================= + "temple_guardian_hammer_throw" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/temple_guardian_hammer_throw" + "AbilityTextureName" "sven_storm_bolt" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "FightRecapLevel" "1" + + "AbilityCastAnimation" "ACT_DOTA_CAST_REFRACTION" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1600" + "AbilityCastPoint" "1.3 1.2 1.1 1.0" // must be kept inversely proportional to playback_rate + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "playback_rate" "0.4615 0.5000 0.5455 0.6000" // must be kept inversely proportional to cast point + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "200 210 220 230" + } + "03" + { + "var_type" "FIELD_FLOAT" + "throw_duration" "2.3 2.1 1.9 1.7" //"2.3 2.2 2.1 2.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.50" + } + "05" + { + "var_type" "FIELD_INTEGER" + "hammer_damage" "900 1000 1100 1200" + } + } + } + + //================================================================================================================= + // Temple Guardian Passive + //================================================================================================================= + "temple_guardian_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/temple_guardian_passive" + "AbilityTextureName" "temple_guardian_passive" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "nonrage_status_resistance" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "rage_move_speed_bonus" "40" + } + "03" + { + "var_type" "FIELD_INTEGER" + "rage_model_scale_bonus" "0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "rage_turn_rate_bonus_pct" "50" + } + } + } + + //================================================================================================================= + // Warlock: Shadow Word + //================================================================================================================= + "creature_warlock_shadow_word" + { + // General + //------------------------------------------------------------------------------------------------------------ + "BaseClass" "warlock_shadow_word" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.5" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "30" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Cast Range + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "700" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.0" // Modifier just does damage/healing + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "8.0" + } + "02" + { + "var_type" "FIELD_FLOAT" + "tick_interval" "1.0" + } + } + } + + //================================================================================================================= + // Warlock: HP Aura + //================================================================================================================= + "warlock_hp_aura" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/warlock_hp_aura" + "AbilityTextureName" "granite_golem_hp_aura" + "MaxLevel" "1" + + "IsOnCastBar" "0" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_CREEP" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "bonus_hp_multiplier" "250" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "500" + } + } + } + + //================================================================================================================= + // Creature: Flamestrike + //================================================================================================================= + "creature_flamestrike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "MaxLevel" "1" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "FightRecapLevel" "1" + "AbilitySound" "Creature.Flamestrike.Charge" + "IsOnCastBar" "1" + + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "0.05" + "AbilityCastAnimation" "ACT_INVALID" + + "AbilityCooldown" "9" + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "delay" "1.7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "175" + } + "03" + { + "var_type" "FIELD_FLOAT" + "damage" "500" + } + "04" + { + "var_type" "FIELD_INTEGER" + "vision_distance" "400" + } + "05" + { + "var_type" "FIELD_FLOAT" + "vision_duration" "5.0" + } + "06" + { + "var_type" "FIELD_FLOAT" + "ground_burn_duration" "5.0" + } + "07" + { + "var_type" "FIELD_FLOAT" + "burn_interval" "0.5" + } + "08" + { + "var_type" "FIELD_INTEGER" + "burn_dps" "100" + } + "09" + { + "var_type" "FIELD_INTEGER" + "burn_radius" "275" + } + } + } + + //================================================================================================================= + // Lifestealer Passive + //================================================================================================================= + "lifestealer_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/lifestealer_passive" + "AbilityTextureName" "life_stealer_rage" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "damage_counter_duration" "5.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_threshold" "900" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_counter_tiers" "6" + } + "04" + { + "var_type" "FIELD_FLOAT" + "enrage_duration" "6.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "enrage_movespeed_bonus" "300" + } + "06" + { + "var_type" "FIELD_INTEGER" + "enrage_attack_speed_bonus" "100" + } + "07" + { + "var_type" "FIELD_INTEGER" + "enrage_model_scale_bonus" "40" + } + "08" + { + "var_type" "FIELD_FLOAT" + "time_before_reduction" "1.0" + } + } + } + + //================================================================================================================= + // Lifestealer Enraged Pulse + //================================================================================================================= + "aghsfort_lifestealer_enraged_pulse" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "range" "350" + } + "02" + { + "var_type" "FIELD_INTEGER" + "slow" "25" + } + "03" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "2" + } + "04" + { + "var_type" "FIELD_INTEGER" + "angle" "360" + } + "05" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.3" + } + "06" + { + "var_type" "FIELD_FLOAT" + "knockback_distance" "250" + } + "07" + { + "var_type" "FIELD_INTEGER" + "damage" "350" + } + } + } + + //================================================================================================================= + // Grimstroke: Ink Swell + //================================================================================================================= + "aghsfort_grimstroke_spirit_walk" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "grimstroke_spirit_walk" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilitySound" "Hero_ObsidianDestroyer.AstralImprisonment" + "FightRecapLevel" "1" + + "IsOnCastBar" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "700" + "AbilityCastPoint" "0.15" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "buff_duration" "3.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "movespeed_bonus_pct" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "250" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_damage" "400" + } + "05" + { + "var_type" "FIELD_FLOAT" + "max_stun" "1.5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "damage_per_tick" "10" + } + "07" + { + "var_type" "FIELD_FLOAT" + "tick_rate" "0.2" + } + "08" + { + "var_type" "FIELD_INTEGER" + "tick_dps_tooltip" "50" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCastGestureSlot" "DEFAULT" + } + + + //================================================================================================================= + // Creature Spectre: Active Dispersion + //================================================================================================================= + "aghsfort_spectre_active_dispersion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "IsOnCastBar" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "16" + "AbilityCastPoint" "1.5" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_reflection_pct" "200" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "4.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "650" + } + "04" + { + "var_type" "FIELD_INTEGER" + "speed" "500" //"636" + } + } + } + + + //================================================================================================================= + // Building Tower Blast Wave: Blast Wave + //================================================================================================================= + "aghsfort_tower_blast_wave" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "IsOnCastBar" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "14" + "AbilityCastPoint" "1.2" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_pct" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + "03" + { + "var_type" "FIELD_INTEGER" + "speed" "250" + } + } + } + + //================================================================================================================= + // Morphling: Waveform + //================================================================================================================= + "aghsfort_morphling_waveform" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Morphling.Waveform" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "1.0" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "350" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "speed" "800" + } + "02" + { + "var_type" "FIELD_INTEGER" + "width" "200" + } + } + } + + //================================================================================================================= + // Nyx Assassin Creature: Impale + //================================================================================================================= + "aghsfort_creature_impale" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "3000" + "AbilityCastPoint" "1.0" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "250" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "width" "125" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "0.6" + } + "03" + { + "var_type" "FIELD_INTEGER" + "length" "3000" + } + "04" + { + "var_type" "FIELD_INTEGER" + "speed" "350" + } + "05" + { + "var_type" "FIELD_INTEGER" + "cooldown_upgrade" "7" + } + } + } + + //================================================================================================================= + // Nyx Assassin: Spiked Carapce + //================================================================================================================= + "aghsfort_creature_spiked_carapace" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilityTextureName" "nyx_assassin_spiked_carapace" + + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + "AbilityCastPoint" "0.4" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "reflect_duration" "2.0" + } + "02" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "150" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "burrow_aoe" "300" + } + "07" + { + "var_type" "FIELD_INTEGER" + "damage_reflect_pct" "0" + } + } + } + + //================================================================================================================= + // Scarab Priest Summon Zealots + //================================================================================================================= + "scarab_priest_summon_zealots" + { + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/scarab_priest_summon_zealots" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.69" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8.0" + "AbilityDuration" "14" + + // Damage + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "mound_duration" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spawn_count" "1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "spawn_distance" "350" + } + "04" + { + "var_type" "FIELD_INTEGER" + "attack_count" "2" + } + "05" + { + "var_type" "FIELD_INTEGER" + "max_summons" "2" + } + } + } + + //================================================================================================================= + // Phoenix: Passive + //================================================================================================================= + "phoenix_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/phoenix_passive" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + + //================================================================================================================= + // Creature Phoenix: Icarus Dive + //================================================================================================================= + "aghsfort_phoenix_icarus_dive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "phoenix_icarus_dive" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Phoenix.IcarusDive.Cast" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "17" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "hp_cost_perc" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "dash_length" "1400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "dash_width" "500" + } + "04" + { + "var_type" "FIELD_INTEGER" + "hit_radius" "230" + } + "05" + { + "var_type" "FIELD_FLOAT" + "burn_duration" "4" + } + "06" + { + "var_type" "FIELD_INTEGER" + "damage_per_second" "350" + } + "07" + { + "var_type" "FIELD_FLOAT" + "burn_tick_interval" "1.0" + } + "08" + { + "var_type" "FIELD_INTEGER" + "slow_movement_speed_pct" "30" + } + "09" + { + "var_type" "FIELD_FLOAT" + "dive_duration" "4.0" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Creature Phoenix: Icarus Dive Stop + //================================================================================================================= + "aghsfort_phoenix_icarus_dive_stop" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "phoenix_icarus_dive_stop" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.0" + "AbilityCastAnimation" "ACT_INVALID" + } + + //================================================================================================================= + // Phoenix: Fire Spirits + //================================================================================================================= + "aghsfort_phoenix_fire_spirits" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Phoenix.FireSpirits.Cast" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastRange" "1400" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "15" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "hp_cost_perc" "0" + } + "02" + { + "var_type" "FIELD_FLOAT" + "spirit_duration" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "spirit_speed" "400" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius" "150" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "4.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "attackspeed_slow" "-200" + } + "07" + { + "var_type" "FIELD_INTEGER" + "damage_per_second" "300" + "LinkedSpecialBonus" "special_bonus_unique_phoenix_3" + } + "08" + { + "var_type" "FIELD_INTEGER" + "spirit_count" "1" + } + "09" + { + "var_type" "FIELD_FLOAT" + "tick_interval" "1.0" + } + } + } + + //================================================================================================================= + // Phoenix: Launch Fire Spirit + //================================================================================================================= + "aghsfort_phoenix_launch_fire_spirit" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityType" "DOTA_ABILITY_TYPE_BASIC" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilitySound" "Hero_Phoenix.FireSpirits.Launch" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1400" + "AbilityCastAnimation" "ACT_INVALID" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "hp_cost_perc" "0" + } + "02" + { + "var_type" "FIELD_FLOAT" + "spirit_duration" "20.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "spirit_speed" "600" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius" "175" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "4.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "attackspeed_slow" "-100" + } + "07" + { + "var_type" "FIELD_INTEGER" + "damage_per_second" "110" + "LinkedSpecialBonus" "special_bonus_unique_phoenix_3" + } + "08" + { + "var_type" "FIELD_INTEGER" + "spirit_count" "2" + } + "09" + { + "var_type" "FIELD_FLOAT" + "tick_interval" "1.0" + } + } + } + + //================================================================================================================= + // Creature Phoenix: Supernova + //================================================================================================================= + "aghsfort_phoenix_supernova" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"BaseClass" "aghsfort_phoenix_supernova" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Phoenix.SuperNova.Begin" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + "AbilityCastPoint" "3.0" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35" + "AbilityDuration" "6.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1300" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_per_sec" "350" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "3.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_hero_attacks" "13" + } + "05" + { + "var_type" "FIELD_FLOAT" + "caster_life_pct" "50.0" + } + } + } + + //================================================================================================================= + // Ember Spirit Fireball + //================================================================================================================= + "ember_spirit_fireball" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/ember_spirit_fireball" + "AbilityTextureName" "item_heavens_halberd" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + + "IsOnCastBar" "0" + + "MaxLevel" "1" + + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1200" + "AbilityCastPoint" "1.0" + "AnimationIgnoresModelScale" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "700" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "projectile_width_initial" "125" + } + "03" + { + "var_type" "FIELD_INTEGER" + "projectile_width_end" "125" + } + + "04" + { + "var_type" "FIELD_INTEGER" + "projectile_distance" "1500" + } + "05" + { + "var_type" "FIELD_FLOAT" + "disarm_duration" "4.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "impact_damage" "1200" + } + "07" + { + "var_type" "FIELD_INTEGER" + "preview_fx_radius" "50" + } + } + } + + //================================================================================================================= + // Creature Dragon Knight: Breathe Fire + //================================================================================================================= + "aghsfort_dragon_knight_breathe_fire" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "FightRecapLevel" "1" + "AbilitySound" "Hero_DragonKnight.BreathFire" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + "AbilityCastPoint" "1.2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "16" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "500" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "start_radius" "150" + } + "02" + { + "var_type" "FIELD_INTEGER" + "end_radius" "250" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "750" + } + "04" + { + "var_type" "FIELD_INTEGER" + "speed" "800" //"1050" + } + "05" + { + "var_type" "FIELD_FLOAT" + "debuff_duration" "3.0" + } + "06" + { + "var_type" "FIELD_FLOAT" + "anim_playback_speed" "0.5" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Dragon Knight: Dragon Tail + //================================================================================================================= + "aghsfort_dragon_knight_dragon_tail" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "dragon_knight_dragon_tail" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "1" + "AbilitySound" "Hero_DragonKnight.DragonTail.Target" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "150" + "AbilityCastPoint" "0.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "250" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.5" + "LinkedSpecialBonus" "special_bonus_unique_dragon_knight_2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "dragon_cast_range" "400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "800" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Creature Dragon Knight: Elder Dragon Form + //================================================================================================================= + "aghsfort_dragon_knight_elder_dragon_form" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "dragon_knight_elder_dragon_form" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES_ENEMIES_NO" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + "AbilitySound" "Hero_DragonKnight.ElderDragonForm" + "HasScepterUpgrade" "1" + "MaxLevel" "3" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_INVALID" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "115" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.35" // Attacks are primarily about the damage + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "-1.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "25" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_range" "350" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_damage" "100" + } + "05" + { + "var_type" "FIELD_INTEGER" + "corrosive_breath_damage" "30" + } + "06" + { + "var_type" "FIELD_FLOAT" + "corrosive_breath_duration" "5.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "splash_radius" "300" + } + "08" + { + "var_type" "FIELD_INTEGER" + "splash_damage_percent" "70" + } + "09" + { + "var_type" "FIELD_INTEGER" + "frost_bonus_movement_speed" "-30" + } + "10" + { + "var_type" "FIELD_INTEGER" + "frost_bonus_attack_speed" "-30" + } + "11" + { + "var_type" "FIELD_FLOAT" + "frost_duration" "2.0" + } + "12" + { + "var_type" "FIELD_FLOAT" + "frost_aoe" "300" + } + "13" + { + "var_type" "FIELD_INTEGER" + "magic_resistance" "20" + } + "14" + { + "var_type" "FIELD_INTEGER" + "model_scale" "5" + } + } + } + + //================================================================================================================= + // Ability: Underlord Channelled Buff + //================================================================================================================= + "underlord_channelled_buff" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/underlord_channelled_buff" + "AbilityTextureName" "ogre_magi_bloodlust" + + "AbilityCastAnimation" "ACT_DOTA_VICTORY" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_CREEP | DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + "AbilityCastPoint" "0.56" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "1.0" + "AbilityChannelTime" "10.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "8" + } + "02" + { + "var_type" "FIELD_FLOAT" + "modelscale" "10" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "20" + } + "05" + { + "var_type" "FIELD_INTEGER" + "interrupted_cooldown" "4" + } + } + } + + //================================================================================================================= + // Creature Underlord: Firestorm + //================================================================================================================= + "aghsfort_underlord_firestorm" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "abyssal_underlord_firestorm" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "IsOnCastBar" "0" + + "AbilityCastRange" "750" + "AbilityCastPoint" "0.6" + "FightRecapLevel" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "wave_duration" "3.5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "wave_count" "3" + } + "04" + { + "var_type" "FIELD_INTEGER" + "wave_damage" "240" + } + "05" + { + "var_type" "FIELD_FLOAT" + "wave_interval" "1.0" + } + "06" + { + "var_type" "FIELD_FLOAT" + "burn_damage" "0.0" + "CalculateSpellDamageTooltip" "0" + } + "07" + { + "var_type" "FIELD_FLOAT" + "burn_interval" "1.0" + } + "08" + { + "var_type" "FIELD_FLOAT" + "burn_duration" "2.0" + } + "09" + { + "var_type" "FIELD_FLOAT" + "first_wave_delay" "0.0" + } + "10" + { + "var_type" "FIELD_FLOAT" + "building_damage" "33" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Spider Egg Sack + //================================================================================================================= + "spider_egg_sack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/spider_egg_sack" + "AbilityTextureName" "venomancer_venomous_gale" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "275" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "spider_min" "4" + } + "04" + { + "var_type" "FIELD_INTEGER" + "spider_max" "5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "trigger_radius" "100" + } + "06" + { + "var_type" "FIELD_FLOAT" + "duration" "3.0" + } + } + } + + //================================================================================================================= + // Mini Spider Slow Attack + //================================================================================================================= + "mini_spider_slow_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/mini_spider_slow_attack" + "AbilityTextureName" "broodmother_poison_sting" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportBonus" "15" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "movement_speed_slow" "-3" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "1.5" + } + } + } + + //================================================================================================================= + // Creature: Broodmother Accrue Children + //================================================================================================================= + "broodmother_accrue_children" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/broodmother_accrue_children" + "AbilityTextureName" "broodmother_spawn_spiderlings" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "babies_to_spawn" "4" + } + } + } + + //================================================================================================================= + // Hug Brood Passive + //================================================================================================================= + "huge_brood_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/huge_brood_passive" + //"AbilityTextureName" "huge_brood_passive" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "97" + } + } + } + + //================================================================================================================= + // Creature: Huge Broodmother Accrue Children + //================================================================================================================= + "huge_broodmother_accrue_children" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/huge_broodmother_accrue_children" + "AbilityTextureName" "broodmother_spawn_spiderlings" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "babies_to_spawn" "8" + } + } + } + + //================================================================================================================= + // Creature: Broodmother Generate Children + //================================================================================================================= + "broodmother_generate_children" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/broodmother_generate_children" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.69" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5.0" + "AbilityDuration" "14" + + // Damage + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "totem_damage_percentage" "100 200 300 400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "tooltip_duration" "14.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "distance_scepter" "1100" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "0.75" + } + "05" + { + "var_type" "FIELD_INTEGER" + "aftershock_range" "300" + } + "06" + { + "var_type" "FIELD_FLOAT" + "spawn_interval" "0.09" + } + } + } + + //================================================================================================================= + // Creature: Huge Broodmother Generate Children + //================================================================================================================= + "huge_broodmother_generate_children" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/huge_broodmother_generate_children" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.69" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5.0" + "AbilityDuration" "14" + + // Damage + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "totem_damage_percentage" "100 200 300 400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "tooltip_duration" "14.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "distance_scepter" "1100" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "0.75" + } + "05" + { + "var_type" "FIELD_INTEGER" + "aftershock_range" "300" + } + "06" + { + "var_type" "FIELD_FLOAT" + "spawn_interval" "0.075" + } + } + } + + //================================================================================================================= + // Huge Brood: Summon Eggs + //================================================================================================================= + "huge_brood_summon_eggs" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/huge_brood_summon_eggs" + "AbilityTextureName" "broodmother_spawn_spiderlings" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "1.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "16.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "egg_spawns" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spider_spawns" "3" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_summoned_units" "12" + } + "04" + { + "var_type" "FIELD_INTEGER" + "summon_radius" "475" + } + } + } + + //================================================================================================================= + // Kidnap Spider: Summon Eggs + //================================================================================================================= + "kidnap_spider_summon_eggs" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/kidnap_spider_summon_eggs" + "AbilityTextureName" "broodmother_spawn_spiderlings" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.75" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "15.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "egg_spawns" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spider_spawns" "0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_summoned_units" "6" + } + "04" + { + "var_type" "FIELD_INTEGER" + "summon_radius" "200" + } + } + } + + //================================================================================================================= + // Broodmother: Web + //================================================================================================================= + "broodmother_web" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/broodmother_web" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "900" + "AbilityCastPoint" "1.0" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "1200" + } + "02" + { + "var_type" "FIELD_INTEGER" + "projectile_distance" "1600" + } + "03" + { + "var_type" "FIELD_INTEGER" + "projectile_radius" "125" + } + "04" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "500" + } + "05" + { + "var_type" "FIELD_FLOAT" + "root_duration" "1.75" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_distance" "500" + } + "07" + { + "var_type" "FIELD_INTEGER" + "knockback_height" "65" + } + "08" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.38" + } + } + } + + //================================================================================================================= + // Creature: Baby Broodmother Passive + //================================================================================================================= + "baby_broodmother_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/baby_broodmother_passive" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "200" + } + "03" + { + "var_type" "FIELD_INTEGER" + "magic_resistance" "-15" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "8" + } + "05" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "2000" + } + "06" + { + "var_type" "FIELD_INTEGER" + "landing_damage" "300" + } + "07" + { + "var_type" "FIELD_INTEGER" + "knockback_distance" "150" + } + "08" + { + "var_type" "FIELD_INTEGER" + "knockback_height" "37" + } + "09" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.37" + } + "10" + { + "var_type" "FIELD_FLOAT" + "launch_duration" "0.75" // hacky: must match enchant totem leap duration in broodmother_generate_children + } + } + } + + //================================================================================================================= + // Kidnap Spider: Kidnap + //================================================================================================================= + "aghsfort_batrider_flaming_lasso" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "batrider_flaming_lasso" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Batrider.FlamingLasso.Cast" + "AbilityCastAnimation" "ACT_INVALID" + + "IsOnCastBar" "0" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "160" //"170" + "AbilityCooldown" "40" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "drag_distance" "180" //"200" + } + "03" + { + "var_type" "FIELD_INTEGER" + "break_distance" "425" + } + "04" + { + "var_type" "FIELD_INTEGER" + "grab_radius" "400" + } + "05" + { + "var_type" "FIELD_INTEGER" + "grab_radius_scepter" "400" + } + "06" + { + "var_type" "FIELD_FLOAT" + "damage_scepter" "100" + } + } + } + + + //================================================================================================================= + // Puck: Flying Bomb + //================================================================================================================= + "puck_flying_bomb" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/puck_flying_bomb" + "AbilityTextureName" "sven_storm_bolt" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "FightRecapLevel" "1" + + "AbilityCastAnimation" "ACT_DOTA_CAST_REFRACTION" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.75" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "6" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "explosion_radius" "220" + } + "02" + { + "var_type" "FIELD_FLOAT" + "flight_duration" "2.5" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.5" + } + "04" + { + "var_type" "FIELD_INTEGER" + "explosion_damage" "800" + } + "05" + { + "var_type" "FIELD_INTEGER" + "flight_speed" "600" + } + } + } + + //================================================================================================================= + // Creature Elder Titan: Echo Stomp + //================================================================================================================= + "creature_elder_titan_echo_stomp" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "elder_titan_echo_stomp" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "1" + "AbilitySound" "Hero_ElderTitan.EchoStomp" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_INVALID" + "AbilityCastPoint" "0.4" + "AbilityCastRange" "500" + "AbilityChannelTime" "1.3" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "16" + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "cast_time" "1.7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "550" + } + "03" + { + "var_type" "FIELD_FLOAT" + "sleep_duration" "3.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "stomp_damage" "500" + } + "05" + { + "var_type" "FIELD_FLOAT" + "initial_stun_duration" "0.2" + } + "06" + { + "var_type" "FIELD_FLOAT" + "animation_rate" "0.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "wake_damage_limit" "100" + } + } + } + + //================================================================================================================= + // Creature Elder Titan: Earth Splitter + //================================================================================================================= + "creature_elder_titan_earth_splitter" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "elder_titan_earth_splitter" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "2" + "AbilitySound" "Hero_ElderTitan.EarthSplitter.Cast" + "IsOnCastBar" "0" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "2000" + "AbilityCastPoint" "0.4" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "14.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "crack_time" "3.14" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crack_width" "315" + } + "03" + { + "var_type" "FIELD_INTEGER" + "crack_distance" "3000" + } + "04" + { + "var_type" "FIELD_INTEGER" + "slow_pct" "40" + } + "05" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "4.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "speed" "910" + } + "07" + { + "var_type" "FIELD_INTEGER" + "damage_pct" "80" + } + "08" + { + "var_type" "FIELD_INTEGER" + "vision_width" "500" + } + "09" + { + "var_type" "FIELD_FLOAT" + "vision_interval" "0.22" + } + "10" + { + "var_type" "FIELD_FLOAT" + "vision_duration" "4.0" + } + "11" + { + "var_type" "FIELD_INTEGER" + "vision_step" "200" + } + "12" + { + "var_type" "FIELD_INTEGER" + "total_steps" "12" + } + "13" + { + "var_type" "FIELD_FLOAT" + "slow_duration_scepter" "5.0" + } + } + } + + //================================================================================================================= + // Boss Timbersaw: Whirling Death + //================================================================================================================= + "boss_timbersaw_whirling_death" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/boss_timbersaw_whirling_death" + "AbilityTextureName" "shredder_whirling_death" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Shredder.WhirlingDeath.Cast" + + "IsOnCastBar" "0" + "MaxLevel" "4" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "500" + "AbilityCastPoint" "1.55 1.5 1.45 1.4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "6" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "whirling_radius" "450" + } + "02" + { + "var_type" "FIELD_INTEGER" + "whirling_damage" "400 450 500 550" + } + "03" + { + "var_type" "FIELD_INTEGER" + "tree_damage_scale" "15 20 25 30" + } + "04" + { + "var_type" "FIELD_FLOAT" + "whirling_tick" "0.3" + } + "05" + { + "var_type" "FIELD_INTEGER" + "stat_loss_pct" "20 25 30 35" + } + "06" + { + "var_type" "FIELD_FLOAT" + "duration" "10.0" + } + } + "AbilityCastAnimation" "ACT_DOTA_GENERIC_CHANNEL_1" + } + + //================================================================================================================= + // Boss Timbersaw: Timber Chain + //================================================================================================================= + "boss_timbersaw_timber_chain" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/boss_timbersaw_timber_chain" + "AbilityTextureName" "shredder_timber_chain" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Shredder.TimberChain.Cast" + + "IsOnCastBar" "0" + "MaxLevel" "4" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.3" + "AbilityCastRange" "4800" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chain_radius" "90 90 90 90" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "4800" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "200 200 200 200" + } + "04" + { + "var_type" "FIELD_INTEGER" + "speed" "2100 2200 2300 2400" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage" "400 450 500 550" + } + "06" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.5 1.75 2.0 2.25" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Boss Timbersaw: Reactive Armor + //================================================================================================================= + "boss_timbersaw_reactive_armor" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/boss_timbersaw_reactive_armor" + "AbilityTextureName" "shredder_reactive_armor" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + "MaxLevel" "4" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "max_stacks" "20 22 24 26" + } + "02" + { + "var_type" "FIELD_INTEGER" + "armor_per_stack" "1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "magic_resist_per_stack" "1" + } + "04" + { + "var_type" "FIELD_INTEGER" + "regen_per_stack" "0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "status_resist" "50 55 60 65" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Boss Timbersaw: Chakram Dance + //================================================================================================================= + "boss_timbersaw_chakram_dance" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "shredder_chakram" + "ScriptFile" "abilities/creatures/boss_timbersaw_chakram_dance" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + "AbilityCastPoint" "2.0 1.9 1.8 1.7" + + "IsOnCastBar" "0" + "MaxLevel" "4" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "33 33 33 33" + "AbilityChannelTime" "9.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "num_chakrams" "12" + } + "02" + { + "var_type" "FIELD_FLOAT" + "interval" "3.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "short_range" "1800" + } + "04" + { + "var_type" "FIELD_INTEGER" + "long_range" "3000" + } + } + } + + //================================================================================================================= + // Creature: Void Spirit Boss Passive + //================================================================================================================= + "aghsfort_void_spirit_boss_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + + //================================================================================================================= + // Void Spirit Boss: Aether Remnant + //================================================================================================================= + "aghsfort_void_spirit_boss_aether_remnant" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"BaseClass" "void_spirit_aether_remnant" + "AbilityTextureName" "void_spirit_aether_remnant" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_MOVEMENT | DOTA_ABILITY_BEHAVIOR_VECTOR_TARGETING" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_VoidSpirit.AetherRemnant.Cast" + "MaxLevel" "4" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "1.0 0.9 0.8 0.7" + "AnimationPlaybackRate" "0.2500 0.2778 0.3125 0.3571" // 0.25 corresponds to 1.0 cast point + "AbilityCastRange" "1200" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12 11 10 9" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "start_radius" "135" //"90" + } + "02" + { + "var_type" "FIELD_INTEGER" + "end_radius" "135" //"90" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "450" //"300" + } + "04" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "650 700 750 800" + } + "05" + { + "var_type" "FIELD_INTEGER" + "remnant_watch_distance" "600 600 600 600" //"450" + } + "06" + { + "var_type" "FIELD_INTEGER" + "remnant_watch_radius" "130" + } + "07" + { + "var_type" "FIELD_INTEGER" + "watch_path_vision_radius" "200" + } + "08" + { + "var_type" "FIELD_FLOAT" + "activation_delay" "0.6" + } + "09" + { + "var_type" "FIELD_INTEGER" + "impact_damage" "900 1000 1100 1200" + } + "10" + { + "var_type" "FIELD_FLOAT" + "pull_duration" "2.0 2.0 2.0 2.0" //"1.8" + } + "11" + { + "var_type" "FIELD_INTEGER" + "pull_destination" "93" //"62" + } + "12" + { + "var_type" "FIELD_FLOAT" + "duration" "12.0" + } + "13" + { + "var_type" "FIELD_FLOAT" + "think_interval" "0.1" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + //"AbilityCastGestureSlot" "DEFAULT" + } + + //================================================================================================================= + // Void Spirit Boss: Dissimilate + //================================================================================================================= + "aghsfort_void_spirit_boss_dissimilate" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"BaseClass" "void_spirit_dissimilate" + "AbilityTextureName" "void_spirit_dissimilate" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + //"SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_VoidSpirit.Dissimilate.Cast" + "MaxLevel" "4" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.5 0.45 0.4 0.35" + "AnimationPlaybackRate" "0.2000 0.2222 0.2500 0.2857" // 0.2 corresponds to 0.5 cast point + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12" + + // Damage + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "1500 1600 1700 1800" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "phase_duration" "1.8 1.7 1.6 1.5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "destination_fx_radius" "274" //"183" // proportional to distance_offset + } + "03" + { + "var_type" "FIELD_INTEGER" + "portals_per_ring" "6" + } + "04" + { + "var_type" "FIELD_INTEGER" + "angle_per_ring_portal" "60" + } + "05" + { + "var_type" "FIELD_INTEGER" + "first_ring_distance_offset" "780" //"520" + } + "06" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "412" //"275" // proportional to distance_offset + } + "07" + { + "var_type" "FIELD_FLOAT" + "pct_of_phase_for_selection" "40" + } + "08" + { + "var_type" "FIELD_INTEGER" + "search_range_reduction" "200" + } + //"09" + //{ + //"var_type" "FIELD_INTEGER" + //"second_ring_distance_offset" "1040" + //} + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Void Spirit Boss: Astral Step + //================================================================================================================= + "aghsfort_void_spirit_boss_astral_step" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "void_spirit_astral_step" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "FightRecapLevel" "1" + "AbilitySound" "Hero_VoidSpirit.AstralStep.Start" + "MaxLevel" "4" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "1.5 1.4 1.3 1.2" + "AnimationPlaybackRate" "0.2300 0.2464 0.2654 0.2875" // 1.0 corresponds to cast point of 0.3 + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0" + "AbilityCharges" "2" + "AbilityChargeRestoreTime" "13 12 11 10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "170 180 190 200" + } + "02" + { + "var_type" "FIELD_INTEGER" + "AbilityCharges" "" + "LinkedSpecialBonus" "special_bonus_unique_void_spirit_9" + } + "03" + { + "var_type" "FIELD_INTEGER" + "AbilityChargeRestoreTime" "" + "LinkedSpecialBonus" "special_bonus_unique_void_spirit_1" + } + "04" + { + "var_type" "FIELD_INTEGER" + "min_travel_distance" "200" + } + "05" + { + "var_type" "FIELD_INTEGER" + "max_travel_distance" "2000 2100 2200 2300" + } + "06" + { + "var_type" "FIELD_FLOAT" + "pop_damage_delay" "1.25" + } + "07" + { + "var_type" "FIELD_INTEGER" + "pop_damage" "800 900 1000 1100" + } + "08" + { + "var_type" "FIELD_INTEGER" + "movement_slow_pct" "80" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Void Spirit Boss: Resonant Pulse + //================================================================================================================= + "aghsfort_void_spirit_boss_resonant_pulse" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"BaseClass" "void_spirit_resonant_pulse" + "AbilityTextureName" "void_spirit_resonant_pulse" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_VoidSpirit.Pulse.Cast" + "HasScepterUpgrade" "1" + "MaxLevel" "4" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "1.8 1.7 1.6 1.5" + "AnimationPlaybackRate" "0.3650 0.3982 0.4380 0.4867" // 0.365 corresponds to 1.2 cast point + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + //"AbilityCastGestureSlot" "DEFAULT" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "15 14 13 12" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "600" + } + "02" + { + "var_type" "FIELD_INTEGER" + "speed" "1000" //"800 900 1000 1100" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "900 1000 1100 1200" + "LinkedSpecialBonus" "special_bonus_unique_void_spirit_4" + } + "04" + { + "var_type" "FIELD_FLOAT" + "buff_duration" "10.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "base_absorb_amount" "900 1000 1100 1200" + } + "06" + { + "var_type" "FIELD_INTEGER" + "absorb_per_hero_hit" "200 220 240 260" + } + "07" + { + "var_type" "FIELD_INTEGER" + "return_projectile_speed" "800" + } + "08" + { + "var_type" "FIELD_INTEGER" + "max_charges" "1" // don't want ai double casting it + "RequiresScepter" "1" + } + "09" + { + "var_type" "FIELD_INTEGER" + "charge_restore_time" "10" + "RequiresScepter" "1" + } + "10" + { + "var_type" "FIELD_FLOAT" + "silence_duration_scepter" "1.6 1.8 2.0 2.2" + } + } + } + + //================================================================================================================= + // Void Spirit Boss: Activate Earth Spirits + //================================================================================================================= + "void_spirit_boss_activate_earth_spirits" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/void_spirit_boss_activate_earth_spirits" + "AbilityTextureName" "omniknight_guardian_angel" + "MaxLevel" "5" + "IsOnCastBar" "0" + + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30 30 30 30" + "AbilityChannelTime" "8.0" + "AbilityCastPoint" "1.5" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "channel_duration" "9.0" + } + } + } + + + //================================================================================================================= + // Creature: Earth Spirit Statue Passive + //================================================================================================================= + "earth_spirit_statue_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/earth_spirit_statue_passive" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + + //================================================================================================================= + // Earth Spirit: Boulder Smash + //================================================================================================================= + "aghsfort_earth_spirit_boss_boulder_smash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP" + "AbilityUnitTargetFlag" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "1" + "AbilitySound" "Hero_EarthSpirit.BoulderSmash.Target" + "MaxLevel" "4" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastRange" "150" + "AbilityCastPoint" "0.01" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "1" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "150" // NOTE: This radius must match the radius for geomagnetic grip + } + "02" + { + "var_type" "FIELD_INTEGER" + "rock_search_aoe" "200" + } + "03" + { + "var_type" "FIELD_INTEGER" + "rock_damage" "750 850 950 1050" + } + "04" + { + "var_type" "FIELD_INTEGER" + "move_slow" "30" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "2.5" // slow duration? + } + "06" + { + "var_type" "FIELD_INTEGER" + "speed" "800" + } + "07" + { + "var_type" "FIELD_FLOAT" + "unit_distance" "1500.0" + } + "08" + { + "var_type" "FIELD_FLOAT" + "rock_distance" "3000.0" + } + "09" + { + "var_type" "FIELD_INTEGER" + "remnant_smash_radius_tooltip" "200" + } + } + } + + //================================================================================================================= + // Earth Spirit: Rolling Boulder + //================================================================================================================= + "aghsfort_earth_spirit_boss_rolling_boulder" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilitySound" "Hero_EarthSpirit.RollingBoulder.Cast" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "3000" + "AbilityCastPoint" "0.01" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "150" + } + "02" + { + "var_type" "FIELD_INTEGER" + "speed" "1200" + } + "03" + { + "var_type" "FIELD_INTEGER" + "rock_speed" "1600" + } + "04" + { + "var_type" "FIELD_FLOAT" + "distance" "1500.0" + "LinkedSpecialBonus" "special_bonus_unique_earth_spirit_4" + } + "05" + { + "var_type" "FIELD_FLOAT" + "rock_distance" "3000.0" + "LinkedSpecialBonus" "special_bonus_unique_earth_spirit_4" + "LinkedSpecialBonusField" "value2" + } + "06" + { + "var_type" "FIELD_FLOAT" + "delay" "0.6" + } + "07" + { + "var_type" "FIELD_INTEGER" + "damage" "700" + "LinkedSpecialBonus" "special_bonus_unique_earth_spirit" + } + "08" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.0" + "LinkedSpecialBonus" "special_bonus_unique_earth_spirit_3" + } + "09" + { + "var_type" "FIELD_FLOAT" + "rock_bonus_duration" "1.0" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + + //================================================================================================================= + // Earth Spirit: Geomagnetic Grip + //================================================================================================================= + "aghsfort_earth_spirit_boss_geomagnetic_grip" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_EarthSpirit.GeomagneticGrip.Target" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastRange" "1100" + "AbilityCastPoint" "0.01" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "15" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "180" // NOTE: This radius must match the radius for boulder smash + } + "02" + { + "var_type" "FIELD_INTEGER" + "rock_damage" "400" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "3" + "LinkedSpecialBonus" "special_bonus_unique_earth_spirit_5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "pull_units_per_second_heroes" "600" + } + "05" + { + "var_type" "FIELD_FLOAT" + "pull_units_per_second" "1000" + } + "06" + { + "var_type" "FIELD_INTEGER" + "speed" "800" + } + "07" + { + "var_type" "FIELD_FLOAT" + "total_pull_distance" "2000" + } + } + } + + //================================================================================================================= + // Earth Spirit: Stone Caller + //================================================================================================================= + "aghsfort_earth_spirit_boss_stone_caller" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_SHOW_IN_GUIDES" + "AbilityType" "DOTA_ABILITY_TYPE_BASIC" + "MaxLevel" "1" + "AbilitySound" "Hero_EarthSpirit.StoneRemnant.Impact" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_ES_STONE_CALLER" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastRange" "1100" + "AbilityCastPoint" "0.0" + "HasScepterUpgrade" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + "AbilityCharges" "7" + "AbilityChargeRestoreTime" "1" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "10.0" + } + } + } + + //================================================================================================================= + // Earth Spirit: Petrify ( scepter ability ) + //================================================================================================================= + "aghsfort_earth_spirit_boss_petrify" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_SHOW_IN_GUIDES" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_CUSTOM" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_CUSTOM" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "MaxLevel" "1" + "FightRecapLevel" "1" + "IsGrantedByScepter" "1" + "AbilitySound" "Hero_EarthSpirit.Petrify" + + "IsOnCastBar" "0" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "125" + "AbilityCastPoint" "0.2" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "3" + "RequiresScepter" "1" + } + + "02" + { + "var_type" "FIELD_FLOAT" + "damage" "300" + "RequiresScepter" "1" + } + + "03" + { + "var_type" "FIELD_FLOAT" + "aoe" "300" + "RequiresScepter" "1" + } + } + } + + //================================================================================================================= + // Earth Spirit: Magnetize + //================================================================================================================= + "aghsfort_earth_spirit_boss_magnetize" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "2" + "AbilitySound" "Hero_EarthSpirit.Magnetize.Cast" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_6" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastRange" "350" + "AbilityCastPoint" "0.01" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "45" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cast_radius" "450" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_per_second" "250" + } + "03" + { + "var_type" "FIELD_FLOAT" + "damage_duration" "6.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "rock_search_radius" "400" + } + "05" + { + "var_type" "FIELD_INTEGER" + "rock_explosion_radius" "600" + } + "06" + { + "var_type" "FIELD_FLOAT" + "damage_interval" "1.0" + } + "07" + { + "var_type" "FIELD_FLOAT" + "rock_explosion_delay" "8.0" + } + "08" + { + "var_type" "FIELD_FLOAT" + "silence_duration" "5.0" + } + "09" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "2.0" + } + } + } + + //================================================================================================================= + // Creature: Fire Breath + //================================================================================================================= + "creature_fire_breath" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityName" "creature_fire_breath" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityTextureName" "ogre_magi_fireblast" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + "IsOnCastBar" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12.0" + "AbilityChannelTime" "3.0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1200" + "AbilityCastPoint" "2.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "radius" "200.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "speed" "1200" + } + "03" + { + "var_type" "FIELD_FLOAT" + "damage" "1000" + } + "04" + { + "var_type" "FIELD_FLOAT" + "rotation_angle" "90.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "projectile_count" "12" + } + } + } + + //================================================================================================================= + // Creature Ice Slam + //================================================================================================================= + "creature_ice_slam" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + + "IsOnCastBar" "0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "7.0" + "AbilityCastPoint" "1.5" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "300" + } + "02" + { + "var_type" "FIELD_INTEGER" + "slow_movement_speed" "-25" + } + "03" + { + "var_type" "FIELD_INTEGER" + "slow_attack_speed" "0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "frozen_path_duration" "10" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage" "1250" + } + "06" + { + "var_type" "FIELD_FLOAT" + "freeze_duration" "2.0" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Creature: Skeleton King Run passive + //================================================================================================================= + "skeleton_king_run_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/skeleton_king_run_passive" + + "IsOnCastBar" "0" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "IsOnCastBar" "0" + } + + //================================================================================================================= + // Ability: Undead Woods Skeleton King Hellfire Blast + //================================================================================================================= + "undead_woods_skeleton_king_hellfire_blast" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "skeleton_king_hellfire_blast" + "IsOnCastBar" "0" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "1" + "AbilitySound" "Hero_SkeletonKing.Hellfire_Blast" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "425" + "AbilityCastPoint" "0.35" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "13" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "1000" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.5" // Applies two modifiers + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "blast_speed" "800" + } + "02" + { + "var_type" "FIELD_FLOAT" + "blast_stun_duration" "2.0" + + } + "03" + { + "var_type" "FIELD_FLOAT" + "blast_dot_duration" "4.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "blast_slow" "-50" + } + "05" + { + "var_type" "FIELD_INTEGER" + "blast_dot_damage" "125" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Ability: Undead Woods Skeleton King Vampiric Aura + //================================================================================================================= + "aghsfort_skeleton_king_vampiric_aura" + { + // General + //------------------------------------------------------------------------------------------------------------- + "IsOnCastBar" "0" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES" + "IsOnCastBar" "0" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "vampiric_aura_radius" "5000" + } + "02" + { + "var_type" "FIELD_INTEGER" + "vampiric_aura" "20" + "LinkedSpecialBonus" "special_bonus_unique_wraith_king_2" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "50" + } + "04" + { + "var_type" "FIELD_FLOAT" + "self_bonus" "1.5" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Ability: Undead Woods Skeleton King Mortal Strike + //================================================================================================================= + "undead_woods_skeleton_king_mortal_strike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "IsOnCastBar" "0" + "BaseClass" "skeleton_king_mortal_strike" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilitySound" "Hero_SkeletonKing.CriticalStrike" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_mult" "250" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "15" + } + "03" + { + "var_type" "FIELD_FLOAT" + "skeleton_duration" "60" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_skeleton_charges" "10" + } + "05" + { + "var_type" "FIELD_FLOAT" + "spawn_interval" "0.25" + } + "06" + { + "var_type" "FIELD_FLOAT" + "reincarnate_time" "3" + } + "07" + { + "var_type" "FIELD_INTEGER" + "gold_bounty" "0" + } + "08" + { + "var_type" "FIELD_INTEGER" + "xp_bounty" "0" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Ability: Skeleton King Reincarnation + //================================================================================================================= + "undead_woods_skeleton_king_reincarnation" + { + // General + //------------------------------------------------------------------------------------------------------------- + "IsOnCastBar" "0" + "BaseClass" "skeleton_king_reincarnation" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "2" + + "IsOnCastBar" "0" + + "HasScepterUpgrade" "1" + "AbilitySound" "Hero_SkeletonKing.Reincarnate" + + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "9999" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.2" // Slow isn't the main function of this ability. + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "reincarnate_time" "3.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "slow_radius" "900" + } + "03" + { + "var_type" "FIELD_INTEGER" + "movespeed" "-75" + } + "04" + { + "var_type" "FIELD_INTEGER" + "attackslow" "-75" + } + "05" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "5.0" + } + "07" + { + "var_type" "FIELD_FLOAT" + "scepter_duration" "7" + "RequiresScepter" "1" + } + "08" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1200" + } + "09" + { + "var_type" "FIELD_INTEGER" + "aura_radius_tooltip_scepter" "1200" + "RequiresScepter" "1" + } + } + } + + //================================================================================================================= + // Sled Penguin Passive + //================================================================================================================= + "sled_penguin_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/sled_penguin_passive" + + //"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "max_sled_speed" "700" + } + "02" + { + "var_type" "FIELD_INTEGER" + "speed_step" "7" + } + "03" + { + "var_type" "FIELD_INTEGER" + "tree_destroy_radius" "200" + } + "04" + { + "var_type" "FIELD_INTEGER" + "reset_pos_offset" "100" + } + "05" + { + "var_type" "FIELD_FLOAT" + "penguin_lifetime" "100.0" // unused? + } + "06" + { + "var_type" "FIELD_INTEGER" + "collision_radius" "75" + } + "07" + { + "var_type" "FIELD_FLOAT" + "impaired_duration" "3.0" + } + } + } + + //================================================================================================================= + // Wandering Ogre Seal Passive + //================================================================================================================= + "wandering_ogre_seal_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/wandering_ogre_seal_passive" + + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "max_wander_range" "300" + } + "02" + { + "var_type" "FIELD_INTEGER" + "min_wander_range" "200" + } + "03" + { + "var_type" "FIELD_FLOAT" + "move_interval" "5.0" + } + } + } + + //================================================================================================================= + // Creature: Bonus Chicken passive + //================================================================================================================= + "creature_bonus_chicken" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "alchemist_goblins_greed" + "ScriptFile" "abilities/creatures/creature_bonus_chicken" + + "IsOnCastBar" "0" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "total_gold" "10000" + } + "02" + { + "var_type" "FIELD_FLOAT" + "time_limit" "40.0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "gold_bag_duration" "8.0" + } + } + } + + //================================================================================================================= + // Creature: Bonus Greevil passive + //================================================================================================================= + "creature_bonus_greevil" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "alchemist_goblins_greed" + "ScriptFile" "abilities/creatures/creature_bonus_greevil" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "total_gold" "10000" + } + "02" + { + "var_type" "FIELD_FLOAT" + "time_limit" "40.0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "gold_bag_duration" "8.0" + } + } + } + + //================================================================================================================= + // Ability: Morty Hop + //================================================================================================================= + "morty_hop" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilityTextureName" "snapfire_firesnap_cookie" + "FightRecapLevel" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.2" + "AbilityCastRange" "1000" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "1.1" + "AbilityChannelTime" "1.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "375" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "0.75" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_distance" "1000" + } + "05" + { + "var_type" "FIELD_INTEGER" + "height" "200" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Ability: Hop Launch + //================================================================================================================= + "morty_hop_launch" + { + // General + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL | DOTA_ABILITY_BEHAVIOR_HIDDEN" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0 0 0 0" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Rock Smash + //================================================================================================================= + "aghsfort_rock_golem_smash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "tiny_avalanche" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "MaxLevel" "1" + + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "1.4" // must be kept in inverse proportion to anim_playback_rate; 1.7 cast point corresponds to 1.0 playback rate + "AbilityCooldown" "16.0" + "AbilityCastRange" "400" + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "tick_interval" "0.2" + } + "03" + { + "var_type" "FIELD_FLOAT" + "total_duration" "1.4" + } + "04" + { + "var_type" "FIELD_INTEGER" + "tick_count" "5" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "0.2" + } + "06" + { + "var_type" "FIELD_FLOAT" + "projectile_duration" "0.5" + } + "07" + { + "var_type" "FIELD_INTEGER" + "avalanche_damage" "1400" + } + "08" + { + "var_type" "FIELD_FLOAT" + "anim_playback_rate" "1.2143" // must be kept in inverse proportion to cast point + } + } + } + + //================================================================================================================= + // Rock Golem: Splitter A + //================================================================================================================= + "rock_golem_split_a" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/rock_golem_split_a" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityTextureName" "dark_seer_wall_of_replica" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "unit_count" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spawn_radius" "50" + } + "03" + { + "var_type" "FIELD_FLOAT" + "knockback_duration_min" "0.75" + } + "04" + { + "var_type" "FIELD_FLOAT" + "knockback_duration_max" "0.75" + } + "05" + { + "var_type" "FIELD_INTEGER" + "knockback_distance_min" "50" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_distance_max" "275" + } + "07" + { + "var_type" "FIELD_INTEGER" + "knockback_height_min" "100" + } + "08" + { + "var_type" "FIELD_INTEGER" + "knockback_height_max" "200" + } + } + } + + //================================================================================================================= + // Rock Golem: Splitter B + //================================================================================================================= + "rock_golem_split_b" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/rock_golem_split_b" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityTextureName" "dark_seer_wall_of_replica" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "unit_count" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spawn_radius" "25" + } + "03" + { + "var_type" "FIELD_FLOAT" + "knockback_duration_min" "0.6" + } + "04" + { + "var_type" "FIELD_FLOAT" + "knockback_duration_max" "0.6" + } + "05" + { + "var_type" "FIELD_INTEGER" + "knockback_distance_min" "50" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_distance_max" "275" + } + "07" + { + "var_type" "FIELD_INTEGER" + "knockback_height_min" "100" + } + "08" + { + "var_type" "FIELD_INTEGER" + "knockback_height_max" "200" + } + + } + } + //================================================================================================================= + // Ability: Bomb Squad + //================================================================================================================= + "bomb_squad_self_cast" + { + + // General + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/bomb_squad_self_cast" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0 0 0 0" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "max_active_mines" "3" + } + "02" + { + "var_type" "FIELD_FLOAT" + "mine_spawn_interval" "0.5" + } + "03" + { + "var_type" "FIELD_FLOAT" + "max_launch_distance" "100" + } + } + } + + //================================================================================================================= + // Ability: Bomb Squad Mine Charge + //================================================================================================================= + "bomb_squad_mine_charge" + { + + // General + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/bomb_squad_mine_charge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "IsOnCastBar" "0" + + "AbilityCastRange" "3000" + "AbilityCooldown" "12" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.5" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "max_active_mines" "3" + } + "02" + { + "var_type" "FIELD_FLOAT" + "mine_spawn_interval" "0.3" + } + "03" + { + "var_type" "FIELD_FLOAT" + "max_launch_distance" "10" + } + "04" + { + "var_type" "FIELD_FLOAT" + "speed" "350" + } + + } + } + + //================================================================================================================= + // Ability: Bomb Squad + //================================================================================================================= + "bomb_squad_landmine_detonate" + { + // General + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/bomb_squad_landmine_detonate" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0 0 0 0" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "1.8" + } + "02" + { + "var_type" "FIELD_INTEGER" + "detonate_radius" "375" + } + "03" + { + "var_type" "FIELD_INTEGER" + "detonate_damage" "1200" + } + "04" + { + "var_type" "FIELD_INTEGER" + "chain_radius" "200" + } + "05" + { + "var_type" "FIELD_FLOAT" + "chain_duration" "0.5" + } + + } + } + + //================================================================================================================= + // Ability: Bomb Squad Stasis Launch + //================================================================================================================= + "bomb_squad_stasis_launch" + { + // General + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/bomb_squad_stasis_launch" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "750" + "AbilityCooldown" "2.5" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.3" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "detonate_radius" "300" + } + "02" + { + "var_type" "FIELD_FLOAT" + "activation_delay" "1.3" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "2.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage" "380" + } + "05" + { + "var_type" "FIELD_FLOAT" + "mine_lifetime" "3.0" + } + } + } + + //================================================================================================================= + // Ability: Walrus Pudge Harpoon + //================================================================================================================= + "aghsfort_walrus_pudge_harpoon" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Pudge.AttackHookExtend" + "AbilityTextureName" "pudge_meat_hook" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1300" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "1050" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "hook_speed" "1200.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "hook_width" "120" + } + "03" + { + "var_type" "FIELD_INTEGER" + "hook_distance" "2700" + } + "04" + { + "var_type" "FIELD_INTEGER" + "vision_radius" "500 500 500 500" + } + "05" + { + "var_type" "FIELD_FLOAT" + "vision_duration" "4.0 4.0 4.0 4.0" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + + //================================================================================================================= + // Enraged Wildkin: Tornado + //================================================================================================================= + "enraged_wildwing_create_tornado" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/enraged_wildwing_create_tornado" + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "500" + "AbilityCastPoint" "0.4" + "AbilityCooldown" "0.0" + "AbilityChannelTime" "140.0" + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "350" + } + "02" + { + "var_type" "FIELD_INTEGER" + "tornado_radius" "250" + } + "03" + { + "var_type" "FIELD_FLOAT" + "movespeed_pct" "40.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "harpy_spawn_interval" "4.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "harpy_spawn_amount" "2" + } + "06" + { + "var_type" "FIELD_INTEGER" + "max_total_harpies" "14" + } + + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Enraged Wildkin: Tornado Passive + //================================================================================================================= + "enraged_wildkin_tornado_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/enraged_wildkin_tornado_passive" + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "250" + } + "02" + { + "var_type" "FIELD_INTEGER" + "tornado_radius" "250" + } + "03" + { + "var_type" "FIELD_FLOAT" + "movespeed_pct" "20.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "harpy_spawn_interval" "4.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "harpy_spawn_amount" "2" + } + "06" + { + "var_type" "FIELD_INTEGER" + "max_total_harpies" "14" + } + + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Wildwing: Tornado Blast + //================================================================================================================= + "aghsfort_enraged_wildwing_tornado_blast" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/aghsfort_enraged_wildwing_tornado_blast" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilitySound" "Hero_Invoker.Tornado" + + "IsOnCastBar" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "3000" + "AbilityCastPoint" "0.8" + "AbilityCastAnimation" "ACT_INVALID" + + "AbilityCooldown" "7" + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "travel_distance" "1500" + } + "02" + { + "var_type" "FIELD_INTEGER" + "travel_speed" "750" + } + "03" + { + "var_type" "FIELD_INTEGER" + "area_of_effect" "220" + } + "04" + { + "var_type" "FIELD_FLOAT" + "disable_duration" "2.5" + } + "05" + { + "var_type" "FIELD_FLOAT" + "damage" "1000" + } + "06" + { + "var_type" "FIELD_INTEGER" + "spawns_per_blast" "3" + } + "07" + { + "var_type" "FIELD_INTEGER" + "harpy_spawn_amount" "2" + } + } + } + + //================================================================================================================= + // Tornado Harpy + //================================================================================================================= + "tornado_harpy_intrinsic" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/tornado_harpy_intrinsic" + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "2.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "speed_boost" "250" + } + + } + } + + //================================================================================================================= + // Debug: Preview Intrinsic ability (may come in useful) + //================================================================================================================= + "preview_intrinsic" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/preview_intrinsic" + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + } + } + + //================================================================================================================= + // Aghanim Empty1 + //================================================================================================================= + "aghanim_empty_spell1" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "doom_bringer_empty1" + "AbilityTextureName" "aghanim_spell_swap" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "MaxLevel" "1" + } + + //================================================================================================================= + // Aghanim Empty2 + //================================================================================================================= + "aghanim_empty_spell2" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "doom_bringer_empty1" + "AbilityTextureName" "aghanim_spell_swap" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "MaxLevel" "1" + } + + //================================================================================================================= + // Aghanim Empty3 + //================================================================================================================= + "aghanim_empty_spell3" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "doom_bringer_empty1" + "AbilityTextureName" "aghanim_spell_swap" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "MaxLevel" "1" + } + + //================================================================================================================= + // Aghanim Empty4 + //================================================================================================================= + "aghanim_empty_spell4" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "doom_bringer_empty1" + "AbilityTextureName" "aghanim_spell_swap" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "MaxLevel" "1" + } + + //================================================================================================================= + // Aghanim Passive + //================================================================================================================= + "aghanim_passive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "aghanim_passive" + "ScriptFile" "abilities/creatures/aghanim_passive" + + "MaxLevel" "5" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "status_resist" "10 20 30 40 50" + } + } + } + + //================================================================================================================= + // Aghanim: Portal Spear + //================================================================================================================= + "aghanim_spear" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "aghanim_spear" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_DIRECTIONAL" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Mars.Spear.Cast" + "MaxLevel" "5" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "2200 2640 3080 3520 3960" + } + "02" + { + "var_type" "FIELD_FLOAT" + "spear_speed" "1200 1200 1200 1200 1200" + } + "03" + { + "var_type" "FIELD_INTEGER" + "spear_width" "75" + } + "04" + { + "var_type" "FIELD_INTEGER" + "spear_vision" "300" + } + "05" + { + "var_type" "FIELD_INTEGER" + "spear_range" "10000" + } + "06" + { + "var_type" "FIELD_FLOAT" + "activity_duration" "2.0" + } + "07" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.25 1.5 1.75 2.0 2.25" + } + "08" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.25" + } + "09" + { + "var_type" "FIELD_FLOAT" + "knockback_distance" "75" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5" + "AbilityCastGestureSlot" "DEFAULT" + } + + //================================================================================================================= + // Aghanim Crystal Attack + //================================================================================================================= + "aghanim_crystal_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICALs" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "BaseClass" "ability_lua" + "AbilityTextureName" "ancient_apparition_ice_blast" + "ScriptFile" "abilities/creatures/aghanim_crystal_attack" + "MaxLevel" "5" + + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AnimationIgnoresModelScale" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "10000" + "AbilityCastPoint" "0.5" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.5 0.4 0.3 0.2 0.1" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "attack_time" "1.5 1.4 1.3 1.2 1.1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "explosion_radius" "175" + } + "03" + { + "var_type" "FIELD_INTEGER" + "attack_damage" "1000 1100 1200 1300 1400" + } + "04" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.5 0.55 0.6 0.65 0.7" + } + "05" + { + "var_type" "FIELD_INTEGER" + "knockback_distance" "200 220 240 260 280" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_height" "80 90 100 110 120" + } + "07" + { + "var_type" "FIELD_INTEGER" + "heal_suppression_pct" "25 25 30 30 35" + } + "08" + { + "var_type" "FIELD_FLOAT" + "debuff_duration" "8.0" + } + "09" + { + "var_type" "FIELD_INTEGER" + "armor_reduction_pct" "18 26 34 42 50" + } + "10" + { + "var_type" "FIELD_INTEGER" + "pulse_radius" "400" + } + "11" + { + "var_type" "FIELD_INTEGER" + "pulse_damage" "0" + } + "12" + { + "var_type" "FIELD_INTEGER" + "pulse_damage_pct" "15 20 25 30 35" + } + } + } + + //================================================================================================================= + // Aghanim: Staff Beams + //================================================================================================================= + "aghanim_staff_beams" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "aghanim_staff_beams" + "ScriptFile" "abilities/creatures/aghanim_staff_beams" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AbilityChannelAnimation" "ACT_DOTA_CHANNEL_ABILITY_2" + "AnimationIgnoresModelScale" "1" + "AbilityCastPoint" "2.0" + + "MaxLevel" "5" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "10000" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5" + "AbilityChannelTime" "6.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "beam_speed" "380 380 380 380 380" + } + "02" + { + "var_type" "FIELD_INTEGER" + "beam_radius" "175" + } + "03" + { + "var_type" "FIELD_INTEGER" + "beam_dps" "0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "linger_time" "8.0 8.5 9.0 9.5 10.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "linger_create_interval" "0.33" + } + "06" + { + "var_type" "FIELD_FLOAT" + "damage_interval" "0.1" + } + "07" + { + "var_type" "FIELD_INTEGER" + "beam_dps_pct" "30 33 36 39 42" + } + } + } + + //================================================================================================================= + // Aghanim: Summon Portals + //================================================================================================================= + "aghanim_summon_portals" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "aghanim_summon_portals" + "ScriptFile" "abilities/creatures/aghanim_summon_portals" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + "AbilityChannelAnimation" "ACT_DOTA_CHANNEL_ABILITY_4" + "AnimationIgnoresModelScale" "1" + "AbilityCastPoint" "1.4" + "AnimationPlaybackRate" "1.0" + "MaxLevel" "5" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "10000" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5" + "AbilityChannelTime" "5.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "base_portals" "6 6 7 7 8" + } + "02" + { + "var_type" "FIELD_INTEGER" + "portal_health_pct" "20 18 16 14" + } + "03" + { + "var_type" "FIELD_INTEGER" + "min_portal_offset" "600" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_portal_offset" "600" + } + "05" + { + "var_type" "FIELD_FLOAT" + "portal_time" "2.0 2.0 2.0 2.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "total_portal_depth" "20 24 28 32" + } + "07" + { + "var_type" "FIELD_INTEGER" + "staff_crush_radius" "400" + } + "08" + { + "var_type" "FIELD_INTEGER" + "staff_crush_damage" "3400 4250 5100 5950 6800" + } + "09" + { + "var_type" "FIELD_FLOAT" + "staff_crush_stun_duration" "2.0 3.0 4.0 5.0 6.0" + } + + "10" + { + "var_type" "FIELD_FLOAT" + "staff_crush_delay" "1.0" + } + } + } + + //================================================================================================================= + // Aghanim: Blink + //================================================================================================================= + "aghanim_blink" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "aghanim_blink" + "ScriptFile" "abilities/creatures/aghanim_blink" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilitySound" "Hero_QueenOfPain.Blink_in" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCastRange" "99999" + "AbilityCastPoint" "0.5" + "MaxLevel" "5" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "travel_speed" "2500" + } + } + } + + //================================================================================================================= + // Aghanim: Spell Swap + //================================================================================================================= + "aghanim_spell_swap" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "aghanim_spell_swap" + "ScriptFile" "abilities/creatures/aghanim_spell_swap" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5" + "AbilityChannelAnimation" "ACT_DOTA_CHANNEL_ABILITY_5" + "AnimationIgnoresModelScale" "1" + "AbilityCastPoint" "2.0" + "MaxLevel" "5" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "10000" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "7.5" + "AbilityChannelTime" "7.5" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "animation_rate" "0.1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "move_speed_slow_pct" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "num_crystal_hits" "9 10 11 12 13" + } + } + } + + //================================================================================================================= + // Aghanim: Shard Attack + //================================================================================================================= + "aghanim_shard_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "aghanim_shard_attack" + "ScriptFile" "abilities/creatures/aghanim_shard_attack" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_6" + "AbilityChannelAnimation" "ACT_DOTA_CHANNEL_ABILITY_6" + "AnimationIgnoresModelScale" "1" + "AbilityCastPoint" "2.0" + "MaxLevel" "5" + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "10000" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30.0" + "AbilityChannelTime" "15.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "spiral_projectiles" "15 15 15 15 15" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spiral_projectile_waves" "6" + } + "03" + { + "var_type" "FIELD_INTEGER" + "spiral_projectile_width" "50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "spiral_projectile_damage" "2250 2250 2500 2750 3000" + } + "05" + { + "var_type" "FIELD_INTEGER" + "spiral_projectile_speed" "650 650 650 650 650" + } + "06" + { + "var_type" "FIELD_FLOAT" + "spiral_projectile_rotation_speed" "1.2" + } + "07" + { + "var_type" "FIELD_FLOAT" + "spiral_projectile_speed_change_interval" "0.75" + } + + } + } + + + //================================================================================================================= + // Elemental Tiny: Toss + //================================================================================================================= + "aghsfort_elemental_tiny_toss" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "AbilityTextureName" "tiny_toss" + "ScriptFile" "abilities/creatures/aghsfort_elemental_tiny_toss" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "FightRecapLevel" "1" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "3200" + "AbilityCastPoint" "0.5" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5.5" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.25" // generally used for damage only + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "1.3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "grab_radius" "300" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "250" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_damage_pct" "30" + } + "05" + { + "var_type" "FIELD_INTEGER" + "toss_damage" "900" + } + "06" + { + "var_type" "FIELD_INTEGER" + "AbilityCharges" "" + "LinkedSpecialBonus" "special_bonus_unique_tiny_2" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Elemental Tiny Create Io + //================================================================================================================= + "aghsfort_elemental_tiny_create_io" + { + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/aghsfort_elemental_tiny_create_io" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET| DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.0" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8.0" + + // Damage + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "spawn_count" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spawn_distance" "400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_summons" "3" + } + } + } + + //================================================================================================================= + // Wisp: Tether + //================================================================================================================= + "aghsfort_wisp_tether" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "wisp_tether" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + + "IsOnCastBar" "0" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0" + "AbilityCastAnimation" "ACT_INVALID" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Cast Range + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "900 900 900 900" + } + "02" + { + "var_type" "FIELD_INTEGER" + "movespeed" "5 8 11 14" + } + "03" + { + "var_type" "FIELD_INTEGER" + "latch_distance" "300" + } + "04" + { + "var_type" "FIELD_INTEGER" + "latch_speed" "1000 1000 1000 1000" + } + "05" + { + "var_type" "FIELD_FLOAT" + "tether_heal_amp" "1.5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "self_bonus" "0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "slow" "25" + } + "08" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "5.5" + } + "09" + { + "var_type" "FIELD_INTEGER" + "movement_speed" "15" + } + "10" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "15" + } + "11" + { + "var_type" "FIELD_INTEGER" + "health_regen" "200" + } + "12" + { + "var_type" "FIELD_INTEGER" + "status_resist" "20" + } + } + } + + //================================================================================================================= + // Tiny: Tree Grab + //================================================================================================================= + "elemental_tiny_tree_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/elemental_tiny_tree_attack" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + "IsOnCastBar" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "0" + "CalculateSpellDamageTooltip" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage_buildings" "0" + "CalculateSpellDamageTooltip" "0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "attack_range" "170" + } + "04" + { + "var_type" "FIELD_INTEGER" + "splash_width" "200" + } + "05" + { + "var_type" "FIELD_INTEGER" + "splash_range" "250" + } + "06" + { + "var_type" "FIELD_INTEGER" + "splash_pct" "50" + } + "07" + { + "var_type" "FIELD_INTEGER" + "throw_splash_pct" "150" + } + "08" + { + "var_type" "FIELD_FLOAT" + "bat_increase" "0.0" + } + "09" + { + "var_type" "FIELD_INTEGER" + "speed_reduction" "0" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_wisp_autoattack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_lua" + "ScriptFile" "abilities/creatures/aghsfort_wisp_autoattack" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "wisp_tether" + + "IsOnCastBar" "0" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "attack_interval" "0.9" + } + } + } + + //================================================================================================================= + // HERO ABILITY UPGRADES START + //================================================================================================================= + //================================================================================================================= + // Omniknight: START + //================================================================================================================= + + //================================================================================================================= + // Omniknight: Purification + //================================================================================================================= + "aghsfort_omniknight_purification" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_CAN_SELF_CAST" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Omniknight.Purification" + "AbilityTextureName" "omniknight_purification" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "300" + "AbilityCastPoint" "0.2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "9" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "55 60 65 70" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "heal" "150 225 300 375" + "LinkedSpecialBonus" "special_bonus_unique_omniknight_1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + "LinkedSpecialBonus" "special_bonus_unique_omniknight_4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "cast_radius" "400" + } + "04" + { + "var_type" "FIELD_INTEGER" + "AbilityCharges" "" + "LinkedSpecialBonus" "aghsfort_special_omniknight_purification_charges" + } + "05" + { + "var_type" "FIELD_INTEGER" + "secondary_heal_damage_pct" "75" + } + "06" + { + "var_type" "FIELD_INTEGER" + "cast_range" "300" + } + + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Omniknight: Guardian Angel + //================================================================================================================= + "aghsfort_omniknight_guardian_angel" + { + // General + //------------------------------------------------------------------------------------------------------------- + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Omniknight.GuardianAngel.Cast" + "AbilityTextureName" "omniknight_guardian_angel" + + + + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35" + "AbilityCastPoint" "0.4" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100 125 150" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "3.5 4.0 4.5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "1000" + } + "03" + { + "var_type" "FIELD_INTEGER" + "hp_regen" "50 100 150" + } + } + } + + + //================================================================================================================= + // Omniknight: Guardian Angel + //================================================================================================================= + "aghsfort_special_omniknight_guardian_angel_single_target" + { + // General + //------------------------------------------------------------------------------------------------------------- + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "2" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "MaxLevel" "1" + "AbilitySound" "Hero_Omniknight.GuardianAngel.Cast" + "AbilityTextureName" "omniknight_guardian_angel" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "500" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35" + "AbilityCastPoint" "0.4" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "75 75 75" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "mana_cost_modifier" "50" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_guardian_angel_single_target_dummy" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_guardian_angel" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "mana_cost_modifier" "50" + } + } + } + + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_purification_cast_radius" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_purification" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "250" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_purification_charges" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_purification" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "2" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_purification_cooldown_reduction" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_purification" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "cooldown_reduction_per_hit" "1.0" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_purification_multicast" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_purification" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "multicast_chance" "100" + } + "02" + { + "var_type" "FIELD_FLOAT" + "multicast_delay" "0.5" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_repel_procs_purification" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_repel" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_repel_outgoing_damage" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_repel" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "60" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_repel_applies_degen_aura" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_repel" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_repel_damage_instance_refraction" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_repel" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_threshold" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_instances" "5" + } + + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_repel_knockback_on_cast" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_repel" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "knockback_radius" "400" + } + "02" + { + "var_type" "FIELD_INTEGER" + "knockback_speed" "1000" + } + "03" + { + "var_type" "FIELD_INTEGER" + "knockback_damage_pct" "300" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_purification_cooldown_reduction" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_purification" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "cooldown_reduction_per_hit" "0.5" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_degen_aura_damage" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_degen_aura" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "damage_interval" "1.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_damage_pct" "100" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_degen_aura_restoration" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_degen_aura" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "8" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_degen_aura_toggle" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_degen_aura" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "100" + } + } + } + + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_guardian_angel_purification" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_guardian_angel" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "purification_trigger_chance" "100" + } + "02" + { + "var_type" "FIELD_FLOAT" + "purification_trigger_cooldown" "1.0" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_omniknight_guardian_angel_immune_flight" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "omniknight_guardian_angel" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "45" + } + } + } + + + + //================================================================================================================= + // Omniknight: END + //================================================================================================================= + + //================================================================================================================= + // Disruptor: START + //================================================================================================================= + + //================================================================================================================= + // Disruptor: Thunder Strike + //================================================================================================================= + "aghsfort_disruptor_thunder_strike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Disruptor.ThunderStrike.Target" + "AbilityTextureName" "disruptor_thunder_strike" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_THUNDER_STRIKE" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastPoint" "0.05 0.05 0.05 0.05" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "70 80 90 100" + + // Cast Range + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800 800 800 800" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "240 240 240 240" + } + "02" + { + "var_type" "FIELD_INTEGER" + "strikes" "4" + "LinkedSpecialBonus" "special_bonus_unique_disruptor" + } + "03" + { + "var_type" "FIELD_FLOAT" + "strike_interval" "1.5 1.5 1.5 1.5" + } + "04" + { + "var_type" "FIELD_INTEGER" + "strike_damage" "70 90 110 130 " + "LinkedSpecialBonus" "special_bonus_unique_disruptor_3" + } + "05" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "0.25" + } + "06" + { + "var_type" "FIELD_INTEGER" + "slow_amount" "100" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_disruptor_thunder_strike_interval_upgrade" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_thunder_strike" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "50" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_disruptor_thunder_strike_mana_restore" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_thunder_strike" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "restore_radius" "450" + } + "02" + { + "var_type" "FIELD_INTEGER" + "restore_amount" "12" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_disruptor_thunder_strike_crit_chance" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_thunder_strike" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "100" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crit_pct" "150" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_disruptor_thunder_strike_on_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_thunder_strike" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "strike_chance" "100" + } + } + } + + //================================================================================================================= + // Disruptor: Glimpse + //================================================================================================================= + "aghsfort_disruptor_glimpse" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Disruptor.Glimpse.Target" + "AbilityTextureName" "disruptor_glimpse" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.05 0.05 0.05 0.05" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "60" + + // Cast Range + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600 1000 1400 1800" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "backtrack_time" "4.0 4.0 4.0 4.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "cast_range" "1200 1400 1600 1800" + } + "03" + { + "var_type" "FIELD_INTEGER" + "cast_radius" "300" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "120 180 240 300" + } + + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + + //================================================================================================================= + // Ability: Special Bonus Glimpse AoE Increase + //================================================================================================================= + "aghsfort_special_disruptor_glimpse_cast_aoe" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_glimpse" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "250" + } + } + } + //================================================================================================================= + // Ability: Special Bonus Glimpse hit on arrival + //================================================================================================================= + "aghsfort_special_disruptor_glimpse_hit_on_arrival" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_glimpse" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "hit_radius" "250" + } + "02" + { + "var_type" "FIELD_INTEGER" + "int_pct" "300" + } + } + } + //================================================================================================================= + // Ability: Special Bonus Glimpse Travel Damage + //================================================================================================================= + "aghsfort_special_disruptor_glimpse_travel_damage" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_glimpse" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "100" + } + } + } + //================================================================================================================= + // Disruptor: Kinetic Field + //================================================================================================================= + "aghsfort_disruptor_kinetic_field" + { + // General + //------------------------------------------------------------------------------------------------------------- + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Disruptor.KineticField" + "AbilityTextureName" "disruptor_kinetic_field" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_KINETIC_FIELD" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastPoint" "0.05 0.05 0.05 0.05" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "40 50 60 70" + + // Cast Range + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "900 900 900 900" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "340" + } + "02" + { + "var_type" "FIELD_FLOAT" + "formation_time" "0.75 0.75 0.75 0.75" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "2.8 3.2 3.4 4" + "LinkedSpecialBonus" "special_bonus_unique_disruptor_5" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus Kinetic Field Instant Setup + //================================================================================================================= + "aghsfort_special_disruptor_kinetic_field_instant_setup" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_kinetic_field" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "100" + } + } + } + //================================================================================================================= + // Ability: Special Bonus Kinetic Field Allied Buff + //================================================================================================================= + "aghsfort_special_disruptor_kinetic_field_allied_attack_buff" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_kinetic_field" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "150" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus Kinetic Field Damage + //================================================================================================================= + "aghsfort_special_disruptor_kinetic_field_damage" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_kinetic_field" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "125" + } + } + } + //================================================================================================================= + // Ability: Special Bonus Kinetic Field Allied Heal + //================================================================================================================= + "aghsfort_special_disruptor_kinetic_field_allied_heal" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_kinetic_field" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "100" + } + } + } + //================================================================================================================= + // Ability: Special Bonus Kinetic Field Instant Setup + //================================================================================================================= + "aghsfort_special_disruptor_kinetic_field_double_ring" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_kinetic_field" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "2" + } + } + } + //================================================================================================================= + // Disruptor: Static Storm + //================================================================================================================= + "aghsfort_disruptor_static_storm" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Disruptor.StaticStorm.Cast" + "AbilityTextureName" "disruptor_static_storm" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_STATIC_STORM" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastPoint" "0.05 0.05 0.05 0.05" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100 140 180" + + // Cast Range + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800 800 800" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "500" + } + "02" + { + "var_type" "FIELD_INTEGER" + "pulses" "40" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_max" "300 500 700" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "5.0" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus Static Storm Kinetic Field On Cast + //================================================================================================================= + "aghsfort_special_disruptor_static_storm_kinetic_field_on_cast" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_static_storm" + "AbilitySpecial" + { + + } + } + + //================================================================================================================= + // Ability: Special Bonus Static Storm Crits on attack + //================================================================================================================= + "aghsfort_special_disruptor_static_storm_crits_on_attacks" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_static_storm" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "100" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crit_damage" "160" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus Static Storm Damage Reduction + //================================================================================================================= + "aghsfort_special_disruptor_static_storm_damage_reduction" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "disruptor_static_storm" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_reduction_pct" "35" + } + } + } + + //================================================================================================================= + // Disruptor: END + //================================================================================================================= + + + //================================================================================================================= + // Magnataur: START + //================================================================================================================= + + //================================================================================================================= + // Magnataur: Shockwave + //================================================================================================================= + "aghsfort_magnataur_shockwave" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilityTextureName" "magnataur_shockwave" + "FightRecapLevel" "1" + + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1200" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "9" + "AbilityDuration" "0.6875 0.6875 0.6875 0.6875" + + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "55 60 65 70" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "shock_speed" "900" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "shock_width" "200" + } + "03" + { + "var_type" "FIELD_INTEGER" + "shock_damage" "140 200 260 320" + "LinkedSpecialBonus" "special_bonus_unique_magnus_4" + } + "04" + { + "var_type" "FIELD_FLOAT" + "pull_duration" "0.2" + } + "05" + { + "var_type" "FIELD_INTEGER" + "movement_slow" "60" + } + "06" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "2" + } + "07" + { + "var_type" "FIELD_INTEGER" + "scepter_distance" "2000" + } + "08" + { + "var_type" "FIELD_INTEGER" + "scepter_speed" "1500" + } + "09" + { + "var_type" "FIELD_INTEGER" + "pull_distance" "150" + } + "10" + { + "var_type" "FIELD_FLOAT" + "basic_slow_duration" "0.75" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Shockwave - Multishot + //================================================================================================================= + "aghsfort_special_magnataur_shockwave_multishot" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_shockwave" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "total_shockwaves" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "degrees_between_shockwaves" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_pct" "25" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Shockwave - Damage Redution On Targets + //================================================================================================================= + "aghsfort_special_magnataur_shockwave_damage_reduction" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_shockwave" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "2.5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_reduction_pct" "65" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Shockwave - Boomerang + //================================================================================================================= + "aghsfort_special_magnataur_shockwave_boomerang" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_shockwave" + } + + //================================================================================================================= + // Magnataur: Empower + //================================================================================================================= + "aghsfort_magnataur_empower" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "Hero_Magnataur.Empower.Cast" + "AbilityTextureName" "magnataur_empower" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "45 50 55 60" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.3" // Easy to spam + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "empower_duration" "44 46 48 50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage_pct" "25 30 35 40" + "LinkedSpecialBonus" "special_bonus_unique_magnus_2" + } + "03" + { + "var_type" "FIELD_FLOAT" + "cleave_damage_pct" "35 40 45 50" + "LinkedSpecialBonus" "special_bonus_unique_magnus_2" + } + "04" + { + "var_type" "FIELD_INTEGER" + "cleave_starting_width" "150" + } + "05" + { + "var_type" "FIELD_INTEGER" + "cleave_ending_width" "360" + } + "06" + { + "var_type" "FIELD_INTEGER" + "cleave_distance" "650" + } + "07" + { + "var_type" "FIELD_FLOAT" + "splash_damage_pct" "25 30 35 40" + } + "08" + { + "var_type" "FIELD_INTEGER" + "splash_radius" "240" + } + "09" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "900" + } + "10" + { + "var_type" "FIELD_FLOAT" + "self_multiplier" "2" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Empower - All Allies + //================================================================================================================= + "aghsfort_special_magnataur_empower_all_allies" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_empower" + } + + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Empower - Lifesteal + //================================================================================================================= + "aghsfort_special_magnataur_empower_lifesteal" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_empower" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "30" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Empower - Shockwave on Attack + //================================================================================================================= + "aghsfort_special_magnataur_empower_shockwave_on_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_empower" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "80" + } + "02" + { + "var_type" "FIELD_FLOAT" + "shockwave_cooldown" "2" + } + + } + } + + //================================================================================================================= + // Magnataur: Skewer + //================================================================================================================= + "aghsfort_magnataur_skewer" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Magnataur.Skewer.Cast" + "AbilityTextureName" "magnataur_skewer" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "9" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50 60 70 80" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "skewer_speed" "950" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "800 900 1000 1100" + "LinkedSpecialBonus" "special_bonus_unique_magnus_3" + } + "03" + { + "var_type" "FIELD_INTEGER" + "slow_pct" "10 20 30 40" + } + "04" + { + "var_type" "FIELD_INTEGER" + "skewer_radius" "175" + } + "05" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "3.25" + } + "06" + { + "var_type" "FIELD_INTEGER" + "skewer_damage" "130 180 230 280" + } + "07" + { + "var_type" "FIELD_INTEGER" + "tree_radius" "200" + } + "08" + { + "var_type" "FIELD_INTEGER" + "tool_attack_slow" "10 20 30 40" + } + "09" + { + "var_type" "FIELD_FLOAT" + "skewer_cooldown" "6" + "RequiresScepter" "1" + } + "10" + { + "var_type" "FIELD_INTEGER" + "skewer_manacost" "40" + "RequiresScepter" "1" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Friendly Skewer + //================================================================================================================= + "aghsfort_special_magnataur_friendly_skewer" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitDamageType" "DAMAGE_TYPE_NONE" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Magnataur.Skewer.Cast" + "AbilityTextureName" "aghsfort_magnataur_friendly_skewer" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "15.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "20" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "skewer_speed" "950" + } + "02" + { + "var_type" "FIELD_INTEGER" + "skewer_radius" "175" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_targets" "20" + } + "04" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "slow_pct" "0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "skewer_damage" "0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "range" "600 800 1000 1200" + } + "08" + { + "var_type" "FIELD_INTEGER" + "tree_radius" "200" + } + "09" + { + "var_type" "FIELD_INTEGER" + "affects_creeps" "0" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Skewer - Original Scepter + //================================================================================================================= + "aghsfort_special_magnataur_skewer_original_scepter" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_skewer" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "skewer_manacost" "40" + } + "02" + { + "var_type" "FIELD_FLOAT" + "skewer_cooldown" "5" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Skewer - Bonus Strength per Target + //================================================================================================================= + "aghsfort_special_magnataur_skewer_bonus_strength" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_skewer" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "strength_gain" "10" + } + "02" + { + "var_type" "FIELD_FLOAT" + "buff_duration" "20" + } + } + } + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Skewer - Heal Allies + //================================================================================================================= + "aghsfort_special_magnataur_skewer_heal" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_skewer" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "100" + } + + } + } + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Skewer - Shockwave + //================================================================================================================= + "aghsfort_special_magnataur_skewer_shockwave" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_skewer" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "cooldown_reduction_per_hit" "0.5" + } + } + } + //================================================================================================================= + // Magnataur: Reverse Polarity + //================================================================================================================= + "aghsfort_magnataur_reverse_polarity" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Magnataur.ReversePolarity.Cast" + "AbilityTextureName" "magnataur_reverse_polarity" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.3 0.3 0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + "AbilityCooldown" "35" + "AbilityManaCost" "100 125 150" + "AbilityCastRange" "410 410 410" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.5" // Applies multiple modifiers + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "pull_radius" "410" + } + "02" + { + "var_type" "FIELD_INTEGER" + "polarity_damage" "100 150 200" + } + "03" + { + "var_type" "FIELD_FLOAT" + "hero_stun_duration" "2.75 3.25 3.75" + "LinkedSpecialBonus" "special_bonus_unique_magnus_5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "pull_duration" "0.0 0.0 0.0" + } + } + } + //================================================================================================================= + // Magnataur: Reverse Polarity + //================================================================================================================= + "aghsfort_special_magnataur_reverse_polarity_polarity" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Magnataur.ReversePolarity.Cast" + "AbilityTextureName" "aghsfort_magnataur_reverse_polarity_polarity" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.3 0.3 0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + "AbilityCooldown" "35" + "AbilityManaCost" "200 250 300" + "AbilityCastRange" "410 410 410" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.5" // Applies multiple modifiers + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "pull_radius" "410" + } + "02" + { + "var_type" "FIELD_INTEGER" + "polarity_damage" "50 125 200" + } + "03" + { + "var_type" "FIELD_FLOAT" + "hero_stun_duration" "2.75 3.25 3.75" + "LinkedSpecialBonus" "special_bonus_unique_magnus_5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "pull_duration" "0.3 0.3 3.3" + } + "05" + { + "var_type" "FIELD_INTEGER" + "radius_modifier" "75" + } + + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_magnataur_reverse_polarity_polarity_dummy" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_reverse_polarity" + "AbilitySpecial" + { + + } + } + + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Reverse Polarity - Radius + //================================================================================================================= + "aghsfort_special_magnataur_reverse_polarity_radius" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_reverse_polarity" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "820" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Reverse Polarity - Allies Crit + //================================================================================================================= + "aghsfort_special_magnataur_reverse_polarity_allies_crit" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_reverse_polarity" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "300" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus - Magnataur: Reverse Polarity - Steroid + //================================================================================================================= + "aghsfort_special_magnataur_reverse_polarity_steroid" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "magnataur_reverse_polarity" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "move_speed_percent" "100" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "150" + } + "03" + { + "var_type" "FIELD_FLOAT" + "buff_duration" "20" + } + } + } + + //================================================================================================================= + // Magnataur: END + //================================================================================================================= + + //================================================================================================================= + // Phantom Assassin : Start + //================================================================================================================= + //================================================================================================================= + // Ability: Phantom Assassin's Stifling Dagger + //================================================================================================================= + "aghsfort_phantom_assassin_stifling_dagger" + { + // General + //------------------------------------------------------------------------------------------------------------- + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "Hero_PhantomAssassin.Dagger.Cast" + "AbilityTextureName" "phantom_assassin_stifling_dagger" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "900 1000 1100 1200" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5.5 5.0 4.5 4.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "20" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "move_slow" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "dagger_speed" "1200" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "1.75 2.5 3.25 4" + } + "04" + { + "var_type" "FIELD_INTEGER" + "base_damage" "160 220 280 340" + } + "05" + { + "var_type" "FIELD_INTEGER" + "attack_factor" "25" + } + "06" + { + "var_type" "FIELD_INTEGER" + "secondary_dagger_range" "600 650 700 750" + + } + "07" + { + "var_type" "FIELD_INTEGER" + "secondary_dagger_width" "220" + + } + "08" + { + "var_type" "FIELD_INTEGER" + "secondary_dagger_amount" "6 8 10 12" + + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + + + //================================================================================================================= + // Ability: Special Bonus - Stifling Dagger No Secondary Dagger limit + //================================================================================================================= + "aghsfort_special_phantom_assassin_stifling_dagger_no_secondary_dagger_restriction" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_stifling_dagger_upgrade" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + } + } + + //================================================================================================================= + // Ability: Special Bonus - Stifling Dagger On Attack + //================================================================================================================= + "aghsfort_special_phantom_assassin_stifling_dagger_on_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_stifling_dagger_upgrade" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "strike_chance" "80" + } + } + } + //================================================================================================================= + // Ability: Special Bonus - Stifling Dagger Autodagger + //================================================================================================================= + "aghsfort_special_phantom_assassin_stifling_dagger_autodagger" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_stifling_dagger_upgrade" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "fire_rate" "2.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "600" + } + } + } + //================================================================================================================= + // Ability: Phantom Assassin's Phantom Strike + //================================================================================================================= + "aghsfort_phantom_assassin_phantom_strike" + { + // General + //------------------------------------------------------------------------------------------------------------- + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_CUSTOM" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_CUSTOM" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "Hero_PhantomAssassin.Strike.Start" + "AbilityTextureName" "phantom_assassin_phantom_strike" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1000 1000 1000 1000" + "AbilityCastPoint" "0.25" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "40" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "100 125 150 175" + } + + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "3.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_evasion" "16 20 24 28" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Ability: Special Bonus - Phantom Strike Buffs Allies + //================================================================================================================= + "aghsfort_special_phantom_assassin_phantom_strike_buff_allies" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_phantom_strike_upgrade" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + } + } + + //================================================================================================================= + // Ability: Special Bonus - Phantom Strike Duration, cast point, cast range buffs + //================================================================================================================= + "aghsfort_special_phantom_assassin_phantom_strike_mastery" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_phantom_strike_upgrade" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_range" "500" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_duration" "1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_evasion" "20" + } + } + } + //================================================================================================================= + // Ability: Special Bonus - Phantom Strike Damage_Reduction + //================================================================================================================= + "aghsfort_special_phantom_assassin_phantom_strike_damage_reduction" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_phantom_strike_upgrade" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_reduction_pct" "40" + } + } + } + + //================================================================================================================= + // Ability: Phantom Assassin's Blur + //================================================================================================================= + "aghsfort_phantom_assassin_blur" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilityTextureName" "phantom_assassin_blur" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.4" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "30" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_evasion" "20 30 40 50" + "LinkedSpecialBonus" "special_bonus_unique_phantom_assassin_3" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "6 7 8 9" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "600" + } + "04" + { + "var_type" "FIELD_FLOAT" + "fade_duration" "0.25" + } + + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Special Ability: Phantom Assassin's Blur Regen when active + //================================================================================================================= + "aghsfort_special_phantom_assassin_blur_regen_when_active" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_blur_upgrade" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "5" + } + } + } + //================================================================================================================= + // Special Ability: Phantom Assassin's Blur Dagger On End + //================================================================================================================= + "aghsfort_special_phantom_assassin_blur_dagger_on_end" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_blur_upgrade" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + } + } + //================================================================================================================= + // Special Ability: Phantom Assassin's Blur Immediate + //================================================================================================================= + "aghsfort_special_phantom_assassin_blur_immediate" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_blur_upgrade" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "10" + } + } + } + + //================================================================================================================= + // Ability: Phantom Coup de Grace + //================================================================================================================= + "aghsfort_phantom_assassin_coup_de_grace" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "AbilitySound" "Hero_PhantomAssassin.CoupDeGrace" + "AbilityTextureName" "phantom_assassin_coup_de_grace" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + // "AbilityCooldown" "40" + + // Cost + //------------------------------------------------------------------------------------------------------------- + // "AbilityManaCost" "30 45 60" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "15" + "LinkedSpecialBonus" "special_bonus_unique_phantom_assassin_2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crit_bonus" "200 325 450" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus - Phantom Assassin: Coup de Grace - Marks Targets for Death + //================================================================================================================= + "aghsfort_special_phantom_assassin_coup_de_grace_marks_target" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_coup_de_grace_upgrade" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "10" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus - Phantom Assassin: Coup de Grace - Execute + //================================================================================================================= + "aghsfort_special_phantom_assassin_coup_de_grace_execute" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_coup_de_grace_upgrade" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "health_percent" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "kill_percent" "20" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus - Phantom Assassin: Coup de Grace - Kills Refresh + //================================================================================================================= + "aghsfort_special_phantom_assassin_coup_de_grace_kills_refresh" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_coup_de_grace_upgrade" + } + + //================================================================================================================= + // Ability: Special Bonus - Phantom Assassin: Coup de Grace - Bloody Debuff + //================================================================================================================= + "aghsfort_special_phantom_assassin_coup_de_grace_bloody_debuff" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "aghsfort_phantom_assassin_coup_de_grace_upgrade" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_reduction" "33" + } + "02" + { + "var_type" "FIELD_FLOAT" + "debuff_duration" "3" + } + "03" + { + "var_type" "FIELD_FLOAT" + "radius" "350" + } + "04" + { + "var_type" "FIELD_INTEGER" + "angle" "45" + } + } + } + + //================================================================================================================= + // Phantom Assassin : END + //================================================================================================================= + + //================================================================================================================= + // Winter Wyvern: START + //================================================================================================================= + + //================================================================================================================= + // Winter Wyvern: Arctic Burn + //================================================================================================================= + "aghsfort_winter_wyvern_arctic_burn" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilitySound" "Hero_WinterWyvern.ArcticBurn.Cast" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilityTextureName" "winter_wyvern_arctic_burn" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.0 0.0 0.0 0.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "14.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "45" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "10.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_range_bonus" "300 350 400 450" + } + "03" + { + "var_type" "FIELD_FLOAT" + "damage_per_second" "60 90 120 150" + } + "04" + { + "var_type" "FIELD_FLOAT" + "tick_rate" "0.5" + } + "05" + { + "var_type" "FIELD_FLOAT" + "damage_duration" "5.0" + "CalculateSpellDamageTooltip" "0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "move_slow" "31 34 37 40" + "LinkedSpecialBonus" "special_bonus_unique_winter_wyvern_1" + } + "07" + { + "var_type" "FIELD_INTEGER" + "night_vision_bonus" "600" + } + "08" + { + "var_type" "FIELD_INTEGER" + "projectile_speed_bonus" "700" + } + "09" + { + "var_type" "FIELD_INTEGER" + "tree_destruction_radius" "250" + } + "10" + { + "var_type" "FIELD_FLOAT" + "attack_point" "0.1" + } + "11" + { + "var_type" "FIELD_INTEGER" + "mana_cost_scepter" "30" + "RequiresScepter" "1" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Ability: Special Bonus Arctic Burn Splitshot + //================================================================================================================= + "aghsfort_special_winter_wyvern_arctic_burn_splitshot" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_arctic_burn" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_modifier" "-20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_modifier_tooltip" "80" + } + "03" + { + "var_type" "FIELD_INTEGER" + "arrow_count" "5" + } + "04" + { + "var_type" "FIELD_INTEGER" + "split_shot_bonus_range" "100" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus Arctic Burn DoubleAttack + //================================================================================================================= + "aghsfort_special_winter_wyvern_arctic_burn_doubleattack" + { + // General + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_arctic_burn" + + "AbilityCooldown" "3.5" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "delay" "0.25" + } + "02" + { + "var_type" "FIELD_FLOAT" + "cooldown_tooltip" "2.0" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + //================================================================================================================= + // Ability: Special Bonus Arctic Burn No Mana cost + //================================================================================================================= + "aghsfort_special_winter_wyvern_arctic_burn_nomana" + { + // General + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_arctic_burn" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + } + + } + //================================================================================================================= + // Ability: Special Bonus Arctic Burn Splash Damage + //================================================================================================================= + "aghsfort_special_winter_wyvern_arctic_burn_splash_damage" + { + // General + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_arctic_burn" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "350" + } + } + + } + + + //================================================================================================================= + // Winter Wyvern: Splinter Blast + //================================================================================================================= + "aghsfort_winter_wyvern_splinter_blast" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilityTextureName" "winter_wyvern_splinter_blast" + "FightRecapLevel" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1200" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "6" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "55 60 65 70" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "750" + } + "02" + { + "var_type" "FIELD_FLOAT" + "projectile_max_time" "1.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "split_radius" "600" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_movespeed" "30" + } + "05" + { + "var_type" "FIELD_INTEGER" + "movespeed_slow_tooltip" "30" + } + "06" + { + "var_type" "FIELD_FLOAT" + "duration" "4.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "secondary_projectile_speed" "750" + } + "08" + { + "var_type" "FIELD_INTEGER" + "splinter_damage" "220 260 300 340" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Ability: Special Bonus Splinter Blast Main Target Also hits + //================================================================================================================= + "aghsfort_special_winter_wyvern_splinter_blast_main_target_hit" + { + // General + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_splinter_blast" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "50" + } + } + + } + + //================================================================================================================= + // Ability: Special Bonus Splinter Blast Vacuum + //================================================================================================================= + "aghsfort_special_winter_wyvern_splinter_blast_vacuum" + { + // General + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_splinter_blast" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "0.3" + } + + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + //================================================================================================================= + // Ability: Special Bonus Splinter Blast Heal + //================================================================================================================= + "aghsfort_special_winter_wyvern_splinter_blast_heal" + { + // General + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_splinter_blast" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "100" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Winter Wyvern: Cold Embrace + //================================================================================================================= + "aghsfort_winter_wyvern_cold_embrace" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilityTextureName" "winter_wyvern_cold_embrace" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Winter_Wyvern.ColdEmbrace" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "25 30 35 40" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "4.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "heal_additive" "26 30 34 38" + } + "03" + { + "var_type" "FIELD_FLOAT" + "heal_percentage" "3.0 3.5 4.0 5.5" + "LinkedSpecialBonus" "special_bonus_unique_winter_wyvern_5" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + + //================================================================================================================= + // Ability: Special Bonus Cold Embrace Charges + //================================================================================================================= + "aghsfort_special_winter_wyvern_cold_embrace_charges" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_cold_embrace" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "2" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus Cold Embrace Casts Splinter Blast on End + //================================================================================================================= + "aghsfort_special_winter_wyvern_cold_embrace_blast_on_end" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_cold_embrace" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + } + } + + //================================================================================================================= + // Ability: Special Bonus Cold Embrace Charges + //================================================================================================================= + "aghsfort_special_winter_wyvern_cold_embrace_magic_damage_block" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_cold_embrace" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "350" + } + } + } + //================================================================================================================= + // Winter Wyvern: Winter's Curse + //================================================================================================================= + "aghsfort_winter_wyvern_winters_curse" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "AbilityTextureName" "winter_wyvern_winters_curse" + "FightRecapLevel" "2" + "AbilitySound" "Hero_WinterWyvern.WintersCurse.Target" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "125" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "500" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_reduction" "100" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_amplification" "0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "75" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "4.0 4.75 5.5" + "LinkedSpecialBonus" "special_bonus_unique_winter_wyvern_3" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus Winters Curse transfers to new target upon initial target's death + //================================================================================================================= + "aghsfort_special_winter_wyvern_winters_curse_transfer" + { + // General + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_winters_curse" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + } + + } + //================================================================================================================= + // Ability: Special Bonus Winters Curse transfers to new target upon initial target's death + //================================================================================================================= + "aghsfort_special_winter_wyvern_winters_curse_damage_amp" + { + // General + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_winters_curse" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "75" + } + } + + } + //================================================================================================================= + // Ability: Special Bonus Winters Curse transfers to new target upon initial target's death + //================================================================================================================= + "aghsfort_special_winter_wyvern_winters_curse_heal_on_death" + { + // General + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "winter_wyvern_winters_curse" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "50" + } + } + + } + //================================================================================================================= + // Winter Wyvern: END + //================================================================================================================= + //================================================================================================================= + // Snapfire: Start + //================================================================================================================= + //================================================================================================================= + // Ability: Snapfire Scatterblast + //================================================================================================================= + "aghsfort_snapfire_scatterblast" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Snapfire.Shotgun.Fire" + "AbilityTextureName" "snapfire_scatterblast" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "0.4" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AnimationPlaybackRate" "1.2" // 1.0 corresponds to cast point of 0.45 or so + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "40 50 60 70" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "140 200 260 320" + "LinkedSpecialBonus" "special_bonus_unique_snapfire_7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "blast_speed" "3000" + } + "03" + { + "var_type" "FIELD_INTEGER" + "blast_width_initial" "225" + } + "04" + { + "var_type" "FIELD_INTEGER" + "blast_width_end" "400" + } + "05" + { + "var_type" "FIELD_FLOAT" + "debuff_duration" "1.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "movement_slow_pct" "100" + } + "07" + { + "var_type" "FIELD_INTEGER" + "point_blank_range" "600" + } + "08" + { + "var_type" "FIELD_FLOAT" + "point_blank_dmg_bonus_pct" "100.0" + } + } + } + + //================================================================================================================= + // Ability: Snapfire Mortimer Kisses + //================================================================================================================= + "aghsfort_snapfire_mortimer_kisses" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_MOVEMENT | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "Hero_Snapfire.MortimerBlob.Launch" + "AbilityTextureName" "snapfire_mortimer_kisses" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "3000" + "AbilityCastPoint" "0.25" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Damage + //------------------------------------------------------------------------------------------------------------- + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35" + "AbilityDuration" "5.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100 150 200" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "projectile_count" "8" + "LinkedSpecialBonus" "special_bonus_unique_snapfire_1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "1300" + } + "03" + { + "var_type" "FIELD_INTEGER" + "projectile_width" "130" + } + "04" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "275" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage_per_impact" "160 240 320" + } + "06" + { + "var_type" "FIELD_FLOAT" + "duration_tooltip" "6.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "projectile_vision" "500" + } + "08" + { + "var_type" "FIELD_FLOAT" + "turn_rate" "75" + } + "09" + { + "var_type" "FIELD_FLOAT" + "burn_interval" "0.5" + } + "10" + { + "var_type" "FIELD_INTEGER" + "burn_damage" "100 125 150" + } + "11" + { + "var_type" "FIELD_INTEGER" + "move_slow_pct" "35 45 55" + "LinkedSpecialBonus" "special_bonus_unique_snapfire_4" + } + "12" + { + "var_type" "FIELD_FLOAT" + "burn_ground_duration" "3.0" + } + "13" + { + "var_type" "FIELD_FLOAT" + "dist_change_speed" "100" + } + "14" + { + "var_type" "FIELD_INTEGER" + "min_range" "350" + } + "15" + { + "var_type" "FIELD_FLOAT" + "min_lob_travel_time" "0.2" + } + "16" + { + "var_type" "FIELD_FLOAT" + "max_lob_travel_time" "0.4" + } + "17" + { + "var_type" "FIELD_FLOAT" + "delay_after_last_projectile" "0.1" + } + "18" + { + "var_type" "FIELD_FLOAT" + "burn_linger_duration" "1.0" + } + } + } + + //================================================================================================================= + // Snapfire: Gobble Up + //================================================================================================================= + "aghsfort_snapfire_gobble_up" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_SHOW_IN_GUIDES" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_CUSTOM" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_CUSTOM" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO" + "MaxLevel" "1" + "FightRecapLevel" "1" + "IsGrantedByScepter" "1" + + "AbilitySound" "Hero_Snapfire.GobbleUp.Cast" + "AbilityTextureName" "snapfire_gobble_up" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "150" + "AbilityCooldown" "40" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "max_time_in_belly" "3.0" + "RequiresScepter" "1" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Snapfire Spit Creep + //================================================================================================================= + "aghsfort_snapfire_spit_creep" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_MOVEMENT | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "MaxLevel" "1" + "FightRecapLevel" "1" + "IsGrantedByScepter" "1" + "AbilitySound" "Hero_Snapfire.MortimerBlob.Launch" + "AbilityTextureName" "snapfire_spit_creep" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "3000" + "AbilityCastPoint" "0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Damage + //------------------------------------------------------------------------------------------------------------- + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "75" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "1400" + } + "02" + { + "var_type" "FIELD_INTEGER" + "projectile_width" "130" + } + "03" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "400" + } + "04" + { + "var_type" "FIELD_INTEGER" + "impact_damage" "400" + } + "05" + { + "var_type" "FIELD_INTEGER" + "projectile_vision" "500" + } + "06" + { + "var_type" "FIELD_FLOAT" + "burn_interval" "0.5" + } + "07" + { + "var_type" "FIELD_INTEGER" + "burn_damage" "100" + } + "08" + { + "var_type" "FIELD_INTEGER" + "move_slow_pct" "25" + "LinkedSpecialBonus" "special_bonus_unique_snapfire_4" + } + "09" + { + "var_type" "FIELD_FLOAT" + "burn_ground_duration" "3.0" + } + "10" + { + "var_type" "FIELD_INTEGER" + "min_range" "0" //"600" + } + "11" + { + "var_type" "FIELD_FLOAT" + "min_lob_travel_time" "0.2" + } + "12" + { + "var_type" "FIELD_FLOAT" + "max_lob_travel_time" "0.4" + } + "13" + { + "var_type" "FIELD_FLOAT" + "burn_linger_duration" "1.0" + } + "14" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.0" + } + "15" + { + "var_type" "FIELD_FLOAT" + "min_height_above_lowest" "150.0" + } + "16" + { + "var_type" "FIELD_FLOAT" + "min_height_above_highest" "100.0" + } + "17" + { + "var_type" "FIELD_FLOAT" + "min_acceleration" "1000.0" + } + "18" + { + "var_type" "FIELD_FLOAT" + "max_acceleration" "2000.0" + } + } + } + + //================================================================================================================= + // Ability: Snapfire Firesnap Cookie + //================================================================================================================= + "aghsfort_snapfire_firesnap_cookie" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "6483" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Snapfire.FeedCookie.Cast" + "AbilityTextureName" "snapfire_firesnap_cookie" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "700" + "AbilityCastPoint" "0.2" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "9" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50 60 70 80" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "1000" + } + "02" + { + "var_type" "FIELD_FLOAT" + "pre_hop_duration" "0.0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "jump_duration" "0.484" //"0.431 0.484 0.538 0.592" // proportional to horizontal distance + } + "04" + { + "var_type" "FIELD_INTEGER" + "jump_height" "257" //"228 257 285 314" // proportional to horizontal distance + } + "05" + { + "var_type" "FIELD_INTEGER" + "jump_horizontal_distance" "1100" //"400 450 500 550" + } + "06" + { + "var_type" "FIELD_FLOAT" + "pre_land_anim_time" "0.14" + } + "07" + { + "var_type" "FIELD_FLOAT" + "landing_gesture_duration" "0.6" + } + "08" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "550" + } + "09" + { + "var_type" "FIELD_INTEGER" + "impact_damage" "150 200 250 300" + } + "10" + { + "var_type" "FIELD_FLOAT" + "impact_stun_duration" "1.6 1.8 2.0 2.2" + } + "11" + { + "var_type" "FIELD_FLOAT" + "self_cast_delay" "0.1" + } + } + } + + //================================================================================================================= + // Ability: Snapfire Lil Shredder + //================================================================================================================= + "aghsfort_snapfire_lil_shredder" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Snapfire.ExplosiveShells.Cast" + "AbilityTextureName" "snapfire_lil_shredder" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.0" + "AbilityCastRange" "800" + "AbilityCastAnimation" "ACT_DOTA_OVERRIDE_ABILITY_3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12" + "AbilityDuration" "12" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50 55 60 65" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "50 100 150 200" + } + "02" + { + "var_type" "FIELD_INTEGER" + "buffed_attacks" "12" + } + "03" + { + "var_type" "FIELD_INTEGER" + "attack_speed_bonus" "200" + } + "04" + { + "var_type" "FIELD_INTEGER" + "attack_range_bonus" "150 200 250 300" + } + "05" + { + "var_type" "FIELD_INTEGER" + "buff_duration_tooltip" "12" + } + "06" + { + "var_type" "FIELD_FLOAT" + "base_attack_time" "1.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "attack_speed_slow_per_stack" "15 20 25 30" + } + "08" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "3.0" + } + } + + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_scatterblast_double_barrel" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_scatterblast" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "2" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_scatterblast_knockback" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_scatterblast" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "400" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_scatterblast_fullrange_pointblank" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_scatterblast" + "AbilitySpecial" + { + + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_scatterblast_barrage" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_scatterblast" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "100" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_firesnap_cookie_multicookie" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_firesnap_cookie" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "300" + } + "02" + { + "var_type" "FIELD_INTEGER" + "projectile_speed_pct" "50" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_firesnap_cookie_allied_buff" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_firesnap_cookie" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_range" "350" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_damage" "100" + } + "03" + { + "var_type" "FIELD_FLOAT" + "buff_duration" "8.0" + } + } + } + + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_firesnap_cookie_enemytarget" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_firesnap_cookie" + "AbilitySpecial" + { + + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_lil_shredder_explosives" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_lil_shredder" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "300" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_lil_shredder_bouncing_bullets" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_lil_shredder" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bounce_range" "300" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bounces" "5" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_lil_shredder_ally_cast" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_lil_shredder" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "500" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_mortimer_kisses_fragmentation" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_mortimer_kisses" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "split_projectiles" "6" + } + "02" + { + "var_type" "FIELD_INTEGER" + "split_radius" "300" + } + "03" + { + "var_type" "FIELD_INTEGER" + "split_impact_radius" "150" + } + + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_mortimer_kisses_autoattack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_mortimer_kisses" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "fire_rate" "1.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "450" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_snapfire_mortimer_kisses_incoming_damage_reduction" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "snapfire_mortimer_kisses" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_reduction" "90" + } + } + } + + + //================================================================================================================= + // Snapfire: END + //================================================================================================================= + + //================================================================================================================= + // Tusk: START + //================================================================================================================= + + //================================================================================================================= + // Tusk: Ice Shards + //================================================================================================================= + "aghsfort_tusk_ice_shards" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Tusk.IceShards" + "AbilityTextureName" "tusk_ice_shards" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "2000" + "AbilityCastPoint" "0.1 0.1 0.1 0.1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10.0" + + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50 60 70 80" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "shard_width" "200" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "shard_damage" "170 220 270 320" + } + "03" + { + "var_type" "FIELD_INTEGER" + "shard_count" "7" + } + "04" + { + "var_type" "FIELD_FLOAT" + "shard_speed" "1200.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "shard_duration" "3.0" + } + "06" + { + "var_type" "FIELD_FLOAT" + "shard_angle_step" "40.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "shard_distance" "200" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Tusk: Ice Shards Stop + //================================================================================================================= + "aghsfort_tusk_ice_shards_stop" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.0 0.0 0.0 0.0" + } + + + + //================================================================================================================= + // Tusk: Snowball + //================================================================================================================= + "aghsfort_tusk_snowball" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Tusk.Snowball.Cast" + "AbilityTextureName" "tusk_snowball" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1250" + "AbilityCastPoint" "0.1 0.1 0.1 0.1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12" + + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "40 50 60 70" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "snowball_damage" "140 190 240 290" + "LinkedSpecialBonus" "special_bonus_unique_tusk_2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "snowball_speed" "600 625 650 675" + "LinkedSpecialBonus" "special_bonus_unique_tusk_3" + } + "03" + { + "var_type" "FIELD_INTEGER" + "snowball_damage_bonus" "70 80 90 100" + } + "04" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "0.5 0.75 1.0 1.25" + } + "05" + { + "var_type" "FIELD_INTEGER" + "snowball_windup_radius" "100" + } + "06" + { + "var_type" "FIELD_FLOAT" + "snowball_duration" "3.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "snowball_radius" "200" + } + "08" + { + "var_type" "FIELD_INTEGER" + "snowball_grow_rate" "40" + } + "09" + { + "var_type" "FIELD_FLOAT" + "snowball_windup" "3.0" + } + "10" + { + "var_type" "FIELD_INTEGER" + "snowball_grab_radius" "350" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Tusk: Launch Snowball + //================================================================================================================= + "aghsfort_tusk_launch_snowball" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_PSEUDO_QUEUE" + "AbilityTextureName" "tusk_snowball" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.0 0.0 0.0 0.0" + "AbilityCastAnimation" "ACT_INVALID" + } + + //================================================================================================================= + // Tusk: Tag Team + //================================================================================================================= + "aghsfort_tusk_tag_team" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilitySound" "Hero_Tusk.FrozenSigil" + "AbilityTextureName" "tusk_tag_team" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0" + "AbilityCastRange" "500" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCastGestureSlot" "DEFAULT" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "35" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "50 80 110 140" + } + "02" + { + "var_type" "FIELD_INTEGER" + "movement_slow" "75" + } + "03" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "0.4" + } + "04" + { + "var_type" "FIELD_FLOAT" + "debuff_duration" "5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "radius" "350" + } + } + } + + //================================================================================================================= + // Tusk: Walrus Punch + //================================================================================================================= + "aghsfort_tusk_walrus_punch" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST | DOTA_ABILITY_BEHAVIOR_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Tusk.WalrusPunch.Target" + "AbilityTextureName" "tusk_walrus_punch" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0" + "AbilityCastRange" "150" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "80 120 160" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_multiplier" "350 400 450" + "LinkedSpecialBonus" "special_bonus_unique_tusk" + } + "02" + { + "var_type" "FIELD_FLOAT" + "air_time" "1.0" + "LinkedSpecialBonus" "special_bonus_unique_tusk_7" + } + "03" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "2.0 3.0 4.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "move_slow" "40" + } + "05" + { + "var_type" "FIELD_INTEGER" + "push_length" "1000" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_ice_shards_circle" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_ice_shards" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "80" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_ice_shards_secondary" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_ice_shards" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "2000" + } + } + } + + + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_ice_shards_explode" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_ice_shards" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "250" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_pct" "75" + } + "03" + { + "var_type" "FIELD_FLOAT" + "explosion_interval" "0.66" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_ice_shards_stun" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_ice_shards" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "2" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_snowball_heal" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_snowball" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "4" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_snowball_end_damage" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_snowball" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "500" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_snowball_global" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_snowball" + "AbilitySpecial" + { + + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_tag_team_lifesteal" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_tag_team" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "25" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_tag_team_toggle" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_tag_team" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "15" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_tag_team_global" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_tag_team" + "AbilitySpecial" + { + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_walrus_punch_reset" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_walrus_punch" + "AbilitySpecial" + { + + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_walrus_punch_land_damage" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_walrus_punch" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_pct" "100" + } + + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_tusk_walrus_punch_wallop" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "tusk_walrus_punch" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "distance" "600" + } + "02" + { + "var_type" "FIELD_INTEGER" + "fall_off_pct" "25" + } + "03" + { + "var_type" "FIELD_FLOAT" + "vertical_distance" "150" + } + + } + } + //================================================================================================================= + // Tusk: END + //================================================================================================================= + + //================================================================================================================= + // Ursa: START + //================================================================================================================= + //================================================================================================================= + // Ursa: Earthshock + //================================================================================================================= + "aghsfort_ursa_earthshock" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Ursa.Earthshock" + "AbilityTextureName" "ursa_earthshock" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5.0" + "AbilityDuration" "4.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "45 50 55 60" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "shock_radius" "385" + "LinkedSpecialBonus" "special_bonus_unique_ursa_5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "movement_slow" "25 35 45 55" + } + "03" + { + "var_type" "FIELD_INTEGER" + "hop_distance" "250" + } + "04" + { + "var_type" "FIELD_FLOAT" + "hop_duration" "0.25" + } + "05" + { + "var_type" "FIELD_INTEGER" + "hop_height" "83" + } + "06" + { + "var_type" "FIELD_INTEGER" + "impact_damage" "150 210 270 330" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCastGestureSlot" "DEFAULT" + } + + //================================================================================================================= + // Ursa: Overpower + //================================================================================================================= + "aghsfort_ursa_overpower" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "Hero_Ursa.Overpower" + "AbilityTextureName" "ursa_overpower" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_OVERRIDE_ABILITY_3" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastRange" "0" + "AbilityCastPoint" "0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8" + "AbilityDuration" "20" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "40 45 50 55" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "max_attacks" "5 6 7 8" + "LinkedSpecialBonus" "special_bonus_unique_ursa_7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_speed_bonus_pct" "400" + } + } + } + + //================================================================================================================= + // Ursa: Fury Swipes + //================================================================================================================= + "aghsfort_ursa_fury_swipes" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilityTextureName" "ursa_fury_swipes" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "bonus_reset_time" "10" + "LinkedSpecialBonus" "special_bonus_unique_ursa_4" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_reset_time_roshan" "12" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_per_stack" "16 22 28 34" //"9 18 27 36" + "LinkedSpecialBonus" "special_bonus_unique_ursa" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_swipe_stack" "10" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Ursa: Enrage + //================================================================================================================= + "aghsfort_ursa_enrage" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Ursa.Enrage" + "AbilityTextureName" "ursa_enrage" + + + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_OVERRIDE_ABILITY_4" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastRange" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_reduction" "65" + } + "02" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "65" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "3 3.5 4" + "LinkedSpecialBonus" "special_bonus_unique_ursa_3" + } + "04" + { + "var_type" "FIELD_FLOAT" + "cooldown_scepter" "30 24 18" + "RequiresScepter" "1" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_earthshock_bonus_charge" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_earthshock" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "1" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_earthshock_invis" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_earthshock" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "2.5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "value2" "0.0" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_earthshock_apply_fury_swipes" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_earthshock" + "AbilitySpecial" + { + + } + } + "aghsfort_special_ursa_earthshock_overpower_stack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_earthshock" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "1" + } + } + } + + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_earthshock_knockback" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_earthshock" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "200" // knockback distance + } + "02" + { + "var_type" "FIELD_FLOAT" + "value2" "0.3" // knockback duration + } + "03" + { + "var_type" "FIELD_FLOAT" + "value3" "1.5" // stun duration + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_earthshock_miss_chance" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_earthshock" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "50" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_overpower_crit" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_overpower" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "200" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_overpower_evasion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_overpower" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "3.5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "value2" "50" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_overpower_taunt" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_overpower" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "6" // armor + } + "02" + { + "var_type" "FIELD_INTEGER" + "value2" "350" // radius + } + "03" + { + "var_type" "FIELD_FLOAT" + "value3" "2.5" // seconds + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_overpower_cleave" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_overpower" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "80" // damage pct + } + "02" + { + "var_type" "FIELD_INTEGER" + "value2" "150" // starting width + } + "03" + { + "var_type" "FIELD_INTEGER" + "value3" "360" // ending width + } + "04" + { + "var_type" "FIELD_INTEGER" + "value4" "650" // cleave distance + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_fury_swipes_armor_reduction" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_fury_swipes" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "1.5" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_enrage_magic_immunity" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_enrage" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "700" // radius + } + "02" + { + "var_type" "FIELD_INTEGER" + "value2" "30" // Percentage over model scale + } + } + } + "aghsfort_special_ursa_fury_swipes_ursa_minor" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_fury_swipes" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cubs" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "mana_cost" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "cooldown" "12" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "10.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "cub_swipes_modifier" "80" + } + } + } + "aghsfort_special_ursa_fury_swipes_lifesteal" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_fury_swipes" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "4" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_enrage_allies" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_enrage" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "700" // radius + } + } + } + + + + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_enrage_fear" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_enrage" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "500" // radius + } + "02" + { + "var_type" "FIELD_FLOAT" + "value2" "3.0" // duration + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_enrage_armor" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_enrage" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "700" // radius + } + "02" + { + "var_type" "FIELD_INTEGER" + "value2" "30" // bonus armor + } + } + } + "aghsfort_special_ursa_enrage_earthshock" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_enrage" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "interval" "1.0" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_ursa_enrage_attack_speed" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "ursa_enrage" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "700" // radius + } + "02" + { + "var_type" "FIELD_INTEGER" + "value2" "300" // attack speed + } + } + } + + //================================================================================================================= + // Ursa: END + //================================================================================================================= + + + //================================================================================================================= + // Sniper: START + //================================================================================================================= + + //================================================================================================================= + // Sniper: Shrapnel + //================================================================================================================= + "aghsfort_sniper_shrapnel" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Sniper.ShrapnelShatter" + "AbilityTextureName" "sniper_shrapnel" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1800" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0" + "AbilityCharges" "3" + "AbilityChargeRestoreTime" "14" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "45 50 55 60" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.25" // primarily about damage + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "slow_movement_speed" "-30 -40 -50 -60" + "LinkedSpecialBonus" "special_bonus_unique_sniper_5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "500" + } + "03" + { + "var_type" "FIELD_INTEGER" + "shrapnel_damage" "50 70 90 110" + "LinkedSpecialBonus" "special_bonus_unique_sniper_1" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "5.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "damage_delay" "0.25" + } + "06" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "2.0 2.0 2.0 2.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "AbilityCharges" "" + "LinkedSpecialBonus" "special_bonus_unique_sniper_2" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Sniper: Headshot + //================================================================================================================= + "aghsfort_sniper_headshot" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilityTextureName" "sniper_headshot" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "proc_chance" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "80 140 200 260" + } + "03" + { + "var_type" "FIELD_INTEGER" + "knockback_distance" "10" + "LinkedSpecialBonus" "special_bonus_unique_sniper_3" + } + "04" + { + "var_type" "FIELD_INTEGER" + "slow" "-100" + } + "05" + { + "var_type" "FIELD_INTEGER" + "slow_vs_considered_hero" "-40" + } + "06" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "1.0" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Sniper: Take Aim + //================================================================================================================= + "aghsfort_sniper_take_aim" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityTextureName" "sniper_take_aim" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "4" + + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "30" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_range" "250 300 350 400" + "LinkedSpecialBonus" "special_bonus_unique_sniper_6" + } + "02" + { + "var_type" "FIELD_INTEGER" + "active_attack_range_multiplier" "5" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Sniper: Assassinate + //================================================================================================================= + "aghsfort_sniper_assassinate" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_NORMAL_WHEN_STOLEN" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "FightRecapLevel" "2" + + "AbilitySound" "Ability.Assassinate" + "AbilityTextureName" "sniper_assassinate" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "3000" + "AbilityCastRangeBuffer" "600" + "AbilityCastPoint" "0.5" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100 130 160" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.0" // Modifier just does damage + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "600 1000 1400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "abilitycastpoint" "" + "LinkedSpecialBonus" "aghsfort_special_sniper_assassinate_original_scepter" + "LinkedSpecialBonusOperation" "SPECIAL_BONUS_SUBTRACT" + } + "03" + { + "var_type" "FIELD_FLOAT" + "scepter_stun_duration" "1.5" + "RequiresScepter" "1" + } + "04" + { + "var_type" "FIELD_FLOAT" + "scepter_cast_point" "0.5" + "RequiresScepter" "1" + } + "05" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "2500" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_shrapnel_bombs" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_shrapnel" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "300" // bomb aoe + } + "02" + { + "var_type" "FIELD_INTEGER" + "value2" "80" // damage pct + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_shrapnel_attack_speed" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_shrapnel" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "50" // attack speed per charge + } + "02" + { + "var_type" "FIELD_FLOAT" + "value2" "15" // charge duration + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_shrapnel_miss_chance" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_shrapnel" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "50" // miss chance + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_shrapnel_move_speed" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_shrapnel" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "200" // move speed + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_headshot_crits" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_headshot" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "300" // crit damage + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_headshot_stuns" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_headshot" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "2.0" // cooldown + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_take_aim_self_purge" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_take_aim" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "250" // bonus movespeed + } + "02" + { + "var_type" "FIELD_FLOAT" + "value2" "2.5" // sprint duration + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_take_aim_aoe" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_take_aim" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "500" // radius + } + "02" + { + "var_type" "FIELD_FLOAT" + "value2" "0.05" // delay per unit + } + "03" + { + "var_type" "FIELD_INTEGER" + "value3" "800" // cast range + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_take_aim_hop_backwards" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_take_aim" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "400" // distance + } + "02" + { + "var_type" "FIELD_FLOAT" + "value2" "0.2" // travel duration + } + "03" + { + "var_type" "FIELD_INTEGER" + "value3" "350" // knockback proc range + } + "04" + { + "var_type" "FIELD_INTEGER" + "value4" "180" // knockback angle + } + "05" + { + "var_type" "FIELD_FLOAT" + "value5" "30.0" // knockback height + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_take_aim_armor_reduction" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_take_aim" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "10" // duration + } + "02" + { + "var_type" "FIELD_INTEGER" + "value2" "8" // armor reduction + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_take_aim_rapid_fire" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_take_aim" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "6.0" // duration + } + "02" + { + "var_type" "FIELD_INTEGER" + "value2" "400" // attack speed bonus + } + "03" + { + "var_type" "FIELD_INTEGER" + "value3" "4" // attack count + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_assassinate_buckshot" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_assassinate" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "900" // scatter range + } + "02" + { + "var_type" "FIELD_INTEGER" + "value2" "450" // scatter width + } + "03" + { + "var_type" "FIELD_INTEGER" + "value3" "100" // buckshot damage pct + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_assassinate_original_scepter" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_assassinate" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_sniper_assassinate_killshot" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "sniper_assassinate" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "200" // bonus assassinate damage per kill + } + "02" + { + "var_type" "FIELD_INTEGER" + "value2" "2" // max killshot gains per encounter + } + } + } + + + //================================================================================================================= + // Sniper: END + //================================================================================================================= + + + //================================================================================================================= + // Mars: Start + //================================================================================================================= + + + //================================================================================================================= + // Ability: Spear of Mars + //================================================================================================================= + "aghsfort_mars_spear" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "mars_spear" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_DIRECTIONAL" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Mars.Spear.Cast" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.25" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "55 60 65 70" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "175 225 275 325" + "LinkedSpecialBonus" "special_bonus_unique_mars_spear_bonus_damage" + } + "02" + { + "var_type" "FIELD_FLOAT" + "spear_speed" "1400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "spear_width" "125" + } + "04" + { + "var_type" "FIELD_INTEGER" + "spear_vision" "300" + } + "05" + { + "var_type" "FIELD_INTEGER" + "spear_range" "1200" + } + "06" + { + "var_type" "FIELD_FLOAT" + "activity_duration" "1.7" + } + "07" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "2.2 2.4 2.6 2.8" + "LinkedSpecialBonus" "special_bonus_unique_mars_spear_stun_duration" + } + "08" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.25" + } + "09" + { + "var_type" "FIELD_FLOAT" + "knockback_distance" "75" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_5" + } + + //================================================================================================================= + // Mars: God's Rebuke + //================================================================================================================= + "aghsfort_mars_gods_rebuke" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "mars_gods_rebuke" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_NORMAL_WHEN_STOLEN" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Mars.Shield.Cast" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + "AbilityCastRange" "500" + "AbilityCastPoint" "0.2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "7" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "45 50 55 60" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_mult" "160 210 260 310" + "LinkedSpecialBonus" "special_bonus_unique_mars_gods_rebuke_extra_crit" + } + "02" + { + "var_type" "FIELD_INTEGER" + "angle" "140" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "500" + } + "04" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.3" + } + "05" + { + "var_type" "FIELD_FLOAT" + "knockback_distance" "150" + } + "06" + { + "var_type" "FIELD_INTEGER" + "knockback_slow" "40" + } + "07" + { + "var_type" "FIELD_FLOAT" + "knockback_slow_duration" "2" + } + "08" + { + "var_type" "FIELD_FLOAT" + "activity_duration" "2" + } + "09" + { + "var_type" "FIELD_INTEGER" + "bonus_damage_vs_heroes" "35" + } + } + } + + //================================================================================================================= + // Ability: Mars Bulwark + //================================================================================================================= + "aghsfort_mars_bulwark" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "mars_bulwark" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityCastAnimation" "ACT_INVALID" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8" + "AbilityDuration" "5.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "15" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "physical_damage_reduction" "40 45 50 55" + } + "02" + { + "var_type" "FIELD_INTEGER" + "forward_angle" "140" + } + "03" + { + "var_type" "FIELD_INTEGER" + "physical_damage_reduction_side" "35 40 45 50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "side_angle" "240" + } + "05" + { + "var_type" "FIELD_INTEGER" + "redirect_chance" "70" + } + "06" + { + "var_type" "FIELD_INTEGER" + "redirect_range" "800" + } + "07" + { + "var_type" "FIELD_INTEGER" + "redirect_speed_penatly" "20" + } + "08" + { + "var_type" "FIELD_INTEGER" + "active_bulwark_block_bonus" "50" + } + "09" + { + "var_type" "FIELD_INTEGER" + "active_duration" "4 5 6 7" + } + + } + } + + //================================================================================================================= + // Phoenix: Sun Ray Stop + //================================================================================================================= + "aghsfort_mars_bulwark_stop" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityTextureName" "aghsfort_mars_bulwark_stop" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.0 0.0 0.0 0.0" + "AbilityCastAnimation" "ACT_INVALID" + } + + + //================================================================================================================= + // Ability: Mars Arena of Blood + //================================================================================================================= + "aghsfort_mars_arena_of_blood" + { + "AbilityTextureName" "mars_arena_of_blood" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilitySound" "Hero_Mars.ArenaOfBlood.Start" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + "AbilityCastPoint" "0.2" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100 150 200" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "5 6 7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "300" + } + "03" + { + "var_type" "FIELD_INTEGER" + "width" "100" + } + "04" + { + "var_type" "FIELD_INTEGER" + "spear_damage" "100 200 300" + } + "05" + { + "var_type" "FIELD_FLOAT" + "formation_time" "0.66" + } + "06" + { + "var_type" "FIELD_INTEGER" + "spear_distance_from_wall" "360" + } + "07" + { + "var_type" "FIELD_FLOAT" + "spear_attack_interval" "0.40" + } + "08" + { + "var_type" "FIELD_INTEGER" + "warrior_count" "14" + } + "09" + { + "var_type" "FIELD_FLOAT" + "first_warrior_angle" "0.0" + } + "10" + { + "var_type" "FIELD_FLOAT" + "warrior_fade_min_dist" "350.0" + } + "11" + { + "var_type" "FIELD_FLOAT" + "warrior_fade_max_dist" "450.0" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_spear_multiskewer" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_spear" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "10" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_spear_impale_explosion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_spear" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "500" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_spear_burning_trail" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_spear" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "trail_duration" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_pct" "75" + } + "03" + { + "var_type" "FIELD_INTEGER" + "path_radius" "150" + } + "04" + { + "var_type" "FIELD_FLOAT" + "linger_duration" "0.2" + } + "05" + { + "var_type" "FIELD_FLOAT" + "burn_interval" "0.5" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_gods_rebuke_full_circle" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_gods_rebuke" + "AbilitySpecial" + { + + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_gods_rebuke_stun" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_gods_rebuke" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "2.5" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_gods_rebuke_strength_buff" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_gods_rebuke" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "buff_duration" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "strength_gain" "10" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_bulwark_counter_rebuke" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_bulwark" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "15" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_bulwark_healing" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_bulwark" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "4" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_bulwark_spears" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_bulwark" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "stack_limit" "3" + } + "02" + { + "var_type" "FIELD_FLOAT" + "stack_interval" "1.25" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_bulwark_soldiers" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_bulwark" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "soldier_count" "3" + } + "02" + { + "var_type" "FIELD_FLOAT" + "soldier_offset" "200" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_damage_pct" "100" + } + "04" + { + "var_type" "FIELD_INTEGER" + "attack_damage_tooltip" "100" + } + "05" + { + "var_type" "FIELD_INTEGER" + "attack_range_tooltip" "300" + } + } + } + + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_bulwark_return" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_bulwark" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "75" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_arena_of_blood_fear" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_arena_of_blood" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "3" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_arena_of_blood_global" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_arena_of_blood" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "25" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_arena_of_blood_attack_buff" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_arena_of_blood" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "100" + } + } + } + //================================================================================================================= + // Ability: Special Bonus + //================================================================================================================= + "aghsfort_special_mars_arena_of_blood_outside_perimeter" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "mars_arena_of_blood" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "250" + } + } + } + + + + //================================================================================================================= + // Mars: End + //================================================================================================================= + + //================================================================================================================= + // Viper: Start + //================================================================================================================= + + //================================================================================================================= + // Aghsfort Viper: Poison Attack + //================================================================================================================= + "aghsfort_viper_poison_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST | DOTA_ABILITY_BEHAVIOR_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "hero_viper.poisonAttack.Cast" + "AbilityTextureName" "viper_poison_attack" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "750" + "AbilityCastPoint" "0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "0 0 0 0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "10 12 14 16" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "damage" "15 20 25 30" + } + "03" + { + "var_type" "FIELD_INTEGER" + "movement_speed" "18 20 22 24" + } + "04" + { + "var_type" "FIELD_INTEGER" + "magic_resistance" "3.0 3.5 4.0 4.5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "max_stacks" "9" + } + "06" + { + "var_type" "FIELD_INTEGER" + "bonus_range" "105 115 125 145" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Aghsfort Viper: Nethertoxin + //================================================================================================================= + "aghsfort_viper_nethertoxin" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "AbilityTextureName" "viper_nethertoxin" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.2" + "AbilityCastRange" "900" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "45 50 55 60" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "min_damage" "50 65 80 95" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_damage" "60 80 100 120" + } + "03" + { + "var_type" "FIELD_FLOAT" + "max_duration" "3" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "8" + } + "06" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "2000" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Aghsfort Viper: Corrosive Skin + //================================================================================================================= + "aghsfort_viper_corrosive_skin" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "hero_viper.CorrosiveSkin" + "AbilityTextureName" "viper_corrosive_skin" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportBonus" "10" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "4.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "20 24 28 32" + "LinkedSpecialBonus" "special_bonus_unique_viper_1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_magic_resistance" "19 21 23 25" + "LinkedSpecialBonus" "special_bonus_unique_viper_1" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage" "20 24 28 32" + "LinkedSpecialBonus" "special_bonus_unique_viper_1" + } + "05" + { + "var_type" "FIELD_INTEGER" + "max_range_tooltip" "1400" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Aghsfort Viper: Viper Strike + //================================================================================================================= + "aghsfort_viper_viper_strike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "FightRecapLevel" "2" + "AbilitySound" "hero_viper.viperStrike" + "AbilityTextureName" "viper_viper_strike" + + + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "0.3 0.3 0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100 150 200" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "150 250 350" + "LinkedSpecialBonus" "special_bonus_unique_viper_2" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "-60 -70 -80" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "-60 -70 -80" + } + "05" + { + "var_type" "FIELD_INTEGER" + "mana_cost_scepter" "125 125 125" + "RequiresScepter" "1" + } + "06" + { + "var_type" "FIELD_FLOAT" + "cooldown_scepter" "10" + "RequiresScepter" "1" + } + "07" + { + "var_type" "FIELD_INTEGER" + "cast_range_scepter" "900" + "RequiresScepter" "1" + } + "08" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "1200" + } + "09" + { + "var_type" "FIELD_INTEGER" + "max_charges" "2" + } + "10" + { + "var_type" "FIELD_FLOAT" + "charge_restore_time" "30.0" + } + } + } + + //================================================================================================================= + // Ability: Viper Poison Attack Snap + //================================================================================================================= + "aghsfort_special_viper_poison_snap" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_poison_attack" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "25" + } + } + } + + //================================================================================================================= + // Ability: Viper Poison Attack Explode + //================================================================================================================= + "aghsfort_special_viper_poison_attack_explode" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_poison_attack" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "300" + } + "02" + { + "var_type" "FIELD_FLOAT" + "damage_multiplier" "2.5" + } + } + } + + //================================================================================================================= + // Ability: Viper Poison Attack Spread + //================================================================================================================= + "aghsfort_special_viper_poison_attack_spread" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_poison_attack" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "500" + } + } + } + + //================================================================================================================= + // Ability: Viper Nethertoxin Lifesteal + //================================================================================================================= + "aghsfort_special_viper_nethertoxin_lifesteal" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_nethertoxin" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "20" + } + } + } + + //================================================================================================================= + // Ability: Viper Nethertoxin Charges + //================================================================================================================= + "aghsfort_special_viper_nethertoxin_charges" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_nethertoxin" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "2" + } + } + } + + //================================================================================================================= + // Ability: Viper Nethertoxin Persist + //================================================================================================================= + "aghsfort_special_viper_nethertoxin_persist" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_nethertoxin" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "2.0" + } + } + } + + //================================================================================================================= + // Ability: Viper Corrosive Skin Speed Steal + //================================================================================================================= + "aghsfort_special_viper_corrosive_skin_speed_steal" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_corrosive_skin" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "bonus_factor" "0.25" + } + } + } + + //================================================================================================================= + // Ability: Viper Corrosive Skin Flying + //================================================================================================================= + "aghsfort_special_viper_corrosive_skin_flying" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_corrosive_skin" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "damage_multiplier" "2.0" + } + "02" + { + "var_type" "FIELD_FLOAT" + "flight_time" "8.0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "cooldown" "30.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "mana_cost" "50" + } + "05" + { + "var_type" "FIELD_INTEGER" + "radius" "450" + } + } + } + + //================================================================================================================= + // Ability: Viper Corrosive Skin Aura + //================================================================================================================= + "aghsfort_special_viper_corrosive_skin_aura" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_corrosive_skin" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "900" + } + } + } + + //================================================================================================================= + // Ability: Viper Viper Strike Allies + //================================================================================================================= + "aghsfort_special_viper_viper_strike_allies" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_viper_strike" + "AbilitySpecial" + { + } + } + + //================================================================================================================= + // Ability: Viper Viper Strike Allies + //================================================================================================================= + "aghsfort_special_viper_chain_viper_strike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_viper_strike" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "2" + } + } + } + + //================================================================================================================= + // Ability: Viper Viper Strike Channeled + //================================================================================================================= + "aghsfort_special_viper_channeled_viper_strike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_viper_strike" + "AbilitySpecial" + { + + } + } + + //================================================================================================================= + // Ability: Viper Viper Strike Channeled + //================================================================================================================= + "aghsfort_special_viper_periodic_strike" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "viper_viper_strike" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "0.75" + } + + } + } + + + //================================================================================================================= + // Viper: End + //================================================================================================================= + + //================================================================================================================= + // WEAVER Start + //================================================================================================================= + + //================================================================================================================= + // Weaver: The Swarm + //================================================================================================================= + "aghsfort_weaver_the_swarm" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilitySound" "Hero_Weaver.Swarm.Cast" + "AbilityTextureName" "weaver_the_swarm" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + "AbilityCastRange" "3000" + "AbilityCooldown" "12" + "AbilityManaCost" "50 55 60 65" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.2" // Primarily about the damage + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "30 35 40 45" + } + "02" + { + "var_type" "FIELD_FLOAT" + "attack_rate" "1.0 0.95 0.90 0.85" + } + "03" + { + "var_type" "FIELD_INTEGER" + "count" "16" + } + "04" + { + "var_type" "FIELD_FLOAT" + "armor_reduction" "1 1 1 1" + "LinkedSpecialBonus" "special_bonus_unique_weaver_3" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "4" + } + "06" + { + "var_type" "FIELD_INTEGER" + "destroy_attacks" "4" + "LinkedSpecialBonus" "special_bonus_unique_weaver_4" + } + "07" + { + "var_type" "FIELD_INTEGER" + "radius" "100 100 100 100" + } + "08" + { + "var_type" "FIELD_INTEGER" + "speed" "600 600 600 600" + } + "09" + { + "var_type" "FIELD_INTEGER" + "spawn_radius" "300 300 300 300" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + + //================================================================================================================= + // Weaver: Shukuchi + //================================================================================================================= + "aghsfort_weaver_shukuchi" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilitySound" "Hero_Weaver.Shukuchi" + "AbilityTextureName" "weaver_shukuchi" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0 0 0 0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "7.0" + + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "45 50 55 60" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "130 200 270 340" + "LinkedSpecialBonus" "special_bonus_unique_weaver_1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "speed" "190 200 210 220" + "LinkedSpecialBonus" "special_bonus_unique_weaver_2" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "200 200 200 200" + } + "04" + { + "var_type" "FIELD_FLOAT" + "fade_time" "0.25 0.25 0.25 0.25" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "4.5" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + + //================================================================================================================= + // Ability: Weaver's Geminate Attack + //================================================================================================================= + "aghsfort_weaver_geminate_attack" + { + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "AbilityTextureName" "weaver_geminate_attack" + "AbilityCooldown" "4.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "delay" "0.20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "tooltip_attack" "1" + "LinkedSpecialBonus" "special_bonus_unique_weaver_5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "100 160 220 280" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + + //================================================================================================================= + // Ability: Weaver's Time Lapse + //================================================================================================================= + "aghsfort_weaver_time_lapse" + { + // General + //------------------------------------------------------------------------------------------------------------- + + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_MOVEMENT | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO" + "AbilityCastRange" "1000" + "AbilitySound" "Hero_Weaver.TimeLapse" + "AbilityTextureName" "weaver_time_lapse" + "FightRecapLevel" "2" + + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + "AbilityCooldown" "30" + "AbilityManaCost" "50" + + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cooldown_scepter" "16" + "RequiresScepter" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "cast_range_tooltip_scepter" "1000" + "RequiresScepter" "1" + } + } + } + + //================================================================================================================= + // Ability: Weaver Swarm Allies + //================================================================================================================= + "aghsfort_special_weaver_swarm_allies" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_the_swarm" + "AbilitySpecial" + { + + } + } + "aghsfort_special_weaver_swarm_explosion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_the_swarm" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "300" + } + } + } + "aghsfort_special_weaver_swarm_damage_transfer" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_the_swarm" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "20" + } + } + } + "aghsfort_special_weaver_geminate_attack_splitshot" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_geminate_attack" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_count" "6" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_range" "250" + } + } + } + "aghsfort_special_weaver_geminate_attack_applies_swarm" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_geminate_attack" + "AbilitySpecial" + { + + } + } + "aghsfort_special_weaver_geminate_attack_lifesteal" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_geminate_attack" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "60" + } + } + } + "aghsfort_special_weaver_geminate_attack_knockback" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_geminate_attack" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "30" + } + } + } + "aghsfort_special_weaver_shukuchi_pull" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_shukuchi" + "AbilitySpecial" + { + + } + } + "aghsfort_special_weaver_shukuchi_trail" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_shukuchi" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "trail_duration" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_pct" "80" + } + "03" + { + "var_type" "FIELD_INTEGER" + "path_radius" "150" + } + "04" + { + "var_type" "FIELD_FLOAT" + "linger_duration" "0.2" + } + "05" + { + "var_type" "FIELD_FLOAT" + "burn_interval" "0.25" + } + } + } + + "aghsfort_special_weaver_shukuchi_attack_on_completion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_shukuchi" + "AbilitySpecial" + { + + } + } + "aghsfort_special_weaver_shukuchi_swarm" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_shukuchi" + "AbilitySpecial" + { + + } + } + "aghsfort_special_weaver_shukuchi_greater_invisibility" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_shukuchi" + "AbilitySpecial" + { + + } + } + "aghsfort_special_weaver_shukuchi_heal" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_shukuchi" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "heal_pct" "50" + } + } + } + "aghsfort_special_weaver_time_lapse_allies" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_time_lapse" + "AbilitySpecial" + { + + } + } + "aghsfort_special_weaver_time_lapse_restoration" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_time_lapse" + "AbilitySpecial" + { + + } + } + "aghsfort_special_weaver_time_lapse_explosion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "weaver_time_lapse" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "300" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_pct" "100" + } + } + } + + //================================================================================================================= + // WEAVER END + //================================================================================================================= + + //================================================================================================================= + // WITCH DOCTOR START + //================================================================================================================= + + //================================================================================================================= + // Witch Doctor: Paralyzing Cask + //================================================================================================================= + "aghsfort_witch_doctor_paralyzing_cask" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "1" + "AbilitySound" "Hero_WitchDoctor.Paralyzing_Cask_Cast" + "AbilityTextureName" "witch_doctor_paralyzing_cask" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "700" + "AbilityCastPoint" "0.25 0.25 0.25 0.25" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12.0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + //"AbilityDamage" "75 100 125 150" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50 60 70 80" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.5" // Can have multiple bounces + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.0 1.0 1.0 1.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "140 200 260 320" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bounce_range" "575 575 575 575" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bounces" "7 8 9 10" + "LinkedSpecialBonus" "special_bonus_unique_witch_doctor_3" + } + "06" + { + "var_type" "FIELD_INTEGER" + "speed" "1000" + } + "07" + { + "var_type" "FIELD_FLOAT" + "bounce_delay" "0.2" + } + "08" + { + "var_type" "FIELD_INTEGER" + "bounces_tooltip" "7 8 9 10" + "LinkedSpecialBonus" "special_bonus_unique_witch_doctor_3" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Witch Doctor: Voodoo Restoration + //================================================================================================================= + "aghsfort_witch_doctor_voodoo_restoration" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_TOGGLE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "SpellImmunityType" "SPELL_IMMUNITY_ALLIES_YES" + "AbilitySound" "Hero_WitchDoctor.Voodoo_Restoration" + "AbilityTextureName" "witch_doctor_voodoo_restoration" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0 0.0 0.0 0.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100 110 120 130" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "mana_per_second" "30 50 70 90" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "600" + } + "03" + { + "var_type" "FIELD_INTEGER" + "heal" "100 150 200 250" + } + "04" + { + "var_type" "FIELD_FLOAT" + "heal_interval" "0.2 0.2 0.2 0.2 0.2" + } + "05" + { + "var_type" "FIELD_INTEGER" + "activation_base_mana_cost" "100" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Witch Doctor: Maledict + //================================================================================================================= + "aghsfort_witch_doctor_maledict" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_WitchDoctor.Maledict_Cast" + "AbilityTextureName" "witch_doctor_maledict" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "575" + "AbilityCastPoint" "0.35 0.35 0.35 0.35" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "24 23 22 21" + "AbilityDuration" "12.0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "25 30 35 40" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "60 70 80 90" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "250" + "LinkedSpecialBonus" "special_bonus_unique_witch_doctor_6" + } + "02" + { + "var_type" "FIELD_INTEGER" + "abilityduration" "" + "LinkedSpecialBonus" "special_bonus_unique_witch_doctor_4" + "LinkedSpecialBonusField" "value" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "40 45 50 55" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_damage_threshold" "100" + } + "05" + { + "var_type" "FIELD_INTEGER" + "ticks" "3" + "LinkedSpecialBonusField" "value2" + } + "06" + { + "var_type" "FIELD_INTEGER" + "max_bonus_damage" "300 400 500 600" + } + + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Witch Doctor: Death Ward + //================================================================================================================= + "aghsfort_witch_doctor_death_ward" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NO_INVIS | DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE | DOTA_UNIT_TARGET_FLAG_NOT_ATTACK_IMMUNE | DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "FightRecapLevel" "2" + "AbilitySound" "Hero_WitchDoctor.Death_WardBuild" + "AbilityTextureName" "witch_doctor_death_ward" + "LinkedAbility" "aghsfort_witch_doctor_death_ward_no_channel" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "200" + "AbilityCastPoint" "0.35 0.35 0.35" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + "AbilityChannelAnimation" "ACT_DOTA_CHANNEL_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35.0" + //"AbilityChannelTime" "8.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "120 160 200" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "150 200 250" + "LinkedSpecialBonus" "special_bonus_unique_witch_doctor_5" + "CalculateSpellDamageTooltip" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_range_tooltip" "700" + "LinkedSpecialBonus" "special_bonus_unique_witch_doctor_1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bounce_radius" "550 550 550" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bounces" "12" + } + "05" + { + "var_type" "FIELD_FLOAT" + "channel_duration" "5.0" + } + } + } + + //================================================================================================================= + // Witch Doctor: Death Ward + //================================================================================================================= + "aghsfort_witch_doctor_death_ward_no_channel" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NO_INVIS | DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE | DOTA_UNIT_TARGET_FLAG_NOT_ATTACK_IMMUNE | DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "FightRecapLevel" "2" + "AbilitySound" "Hero_WitchDoctor.Death_WardBuild" + "AbilityTextureName" "witch_doctor_death_ward" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "200" + "AbilityCastPoint" "0.35 0.35 0.35" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + "AbilityChannelAnimation" "ACT_DOTA_CHANNEL_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35.0" + "AbilityDuration" "5.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "120 160 200" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "150 200 250" + "LinkedSpecialBonus" "special_bonus_unique_witch_doctor_5" + "CalculateSpellDamageTooltip" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_range_tooltip" "700" + "LinkedSpecialBonus" "special_bonus_unique_witch_doctor_1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bounce_radius" "550 550 650" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bounces" "12" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "5.0" + } + } + } + + "aghsfort_special_witch_doctor_paralyzing_cask_multicask" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_paralyzing_cask" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "2" + } + } + } + "aghsfort_special_witch_doctor_paralyzing_cask_applies_maledict" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_paralyzing_cask" + "AbilitySpecial" + { + + } + } + "aghsfort_special_witch_doctor_paralyzing_cask_aoe_damage" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_paralyzing_cask" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "300" + } + } + } + "aghsfort_special_witch_doctor_paralyzing_cask_attack_procs" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_paralyzing_cask" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cask_chance" "80" + } + "02" + { + "var_type" "FIELD_FLOAT" + "cask_cooldown" "2.0" + } + } + } + "aghsfort_special_witch_doctor_maledict_ground_curse" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_maledict" + "AbilitySpecial" + { + + } + } + "aghsfort_special_witch_doctor_maledict_aoe_procs" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_maledict" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "300" + } + } + } + "aghsfort_special_witch_doctor_maledict_death_restoration" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_maledict" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "65" + } + } + } + "aghsfort_special_witch_doctor_maledict_affects_allies" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_maledict" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "75" + } + } + } + "aghsfort_special_witch_doctor_maledict_infectious" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_maledict" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "300" + } + } + } + + "aghsfort_special_witch_doctor_voodoo_restoration_enemy_damage" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_voodoo_restoration" + "AbilitySpecial" + { + + } + } + "aghsfort_special_witch_doctor_voodoo_restoration_lifesteal" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_voodoo_restoration" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "15" + } + } + } + "aghsfort_special_witch_doctor_voodoo_restoration_damage_amp" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_voodoo_restoration" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "35" + } + } + } + "aghsfort_special_witch_doctor_voodoo_restoration_mana_restore" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_voodoo_restoration" + "AbilitySpecial" + { + + } + } + "aghsfort_special_witch_doctor_death_ward_no_channel" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_death_ward" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "value" "80" + } + } + } + "aghsfort_special_witch_doctor_death_ward_splitshot" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_death_ward" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "split_shot_count" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "split_shot_bonus_range" "100" + } + } + } + "aghsfort_special_witch_doctor_death_ward_damage_resist" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_death_ward" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "value" "90" + } + } + } + "aghsfort_special_witch_doctor_death_ward_bounce" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "witch_doctor_death_ward" + "AbilitySpecial" + { + + } + } + + //================================================================================================================= + // WITCH DOCTOR END + //================================================================================================================= + + + + + //================================================================================================================= + // HERO ABILITY UPGRADES END + //================================================================================================================= + + + //================================== + // MINOR STAT UPGRADES + //================ + + //================================================================================================================= + // Ability: minor stat upgrade + //================================================================================================================= + "aghsfort_minor_stats_upgrade" + { + // General + //------------------------------------------------------------------------------------------------------------- + //"AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + //"BaseClass" "ability_lua" + //"ScriptFile" "abilities/heroes/aghsfort_minor_stats_upgrade" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityTextureName" "attribute_bonus" + "MaxLevel" "1" + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_primary_stat" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_intelligence" "0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_movespeed" "0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_hp_regen" "0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_damage" "0" + } + "08" + { + "var_type" "FIELD_INTEGER" + "bonus_cast_range" "0" + } + "09" + { + "var_type" "FIELD_INTEGER" + "bonus_spell_amp" "0" + } + "10" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "0" + } + "11" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "0" + } + "12" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "0" + } + "13" + { + "var_type" "FIELD_INTEGER" + "bonus_heal_amp" "0" + } + "14" + { + "var_type" "FIELD_INTEGER" + "bonus_mana_regen" "0" + } + "15" + { + "var_type" "FIELD_INTEGER" + "bonus_evasion" "0" + } + "16" + { + "var_type" "FIELD_INTEGER" + "bonus_magic_resist" "0" + } + "17" + { + "var_type" "FIELD_INTEGER" + "bonus_lifesteal" "0" + } + } + } + + +} diff --git a/aghanim_singleplayer/scripts/npc/npc_abilities_override.txt b/aghanim_singleplayer/scripts/npc/npc_abilities_override.txt new file mode 100755 index 0000000..c958c54 --- /dev/null +++ b/aghanim_singleplayer/scripts/npc/npc_abilities_override.txt @@ -0,0 +1,4493 @@ + +// Dota Abilities Override File +"DOTAAbilities" +{ + "Version" "1" + + //================================================================================================================= + // + // ITEM ABILITIES + // + //================================================================================================================= + + //================================================================================================================= + // Broom Handle + //================================================================================================================= + "item_broom_handle" + { + "ItemCost" "600" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Keen Optic + //================================================================================================================= + "item_keen_optic" + { + "ItemCost" "500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Arcane Ring + //================================================================================================================= + "item_arcane_ring" + { + "ItemCost" "600" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Ocean Heart + //================================================================================================================= + "item_ocean_heart" + { + "ItemCost" "600" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Ironwood Tree + //================================================================================================================= + "item_ironwood_tree" + { + "ItemCost" "600" + "ItemPurchasable" "0" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Poor Man's Shield + //================================================================================================================= + "item_poor_mans_shield" + { + "ItemCost" "750" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Faded Broach + //================================================================================================================= + "item_faded_broach" + { + "ItemCost" "600" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Dragon Scale + //================================================================================================================= + "item_dragon_scale" + { + "ItemCost" "1000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Essence Ring + //================================================================================================================= + "item_essence_ring" + { + "ItemCost" "1000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Pupil's Gift + //================================================================================================================= + "item_pupils_gift" + { + "ItemCost" "1000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Enchanted Quiver + //================================================================================================================= + "item_enchanted_quiver" + { + "ItemCost" "1250" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Ring of Aquila + //================================================================================================================= + "item_ring_of_aquila" + { + "ItemCost" "1250" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Grove Bow + //================================================================================================================= + "item_grove_bow" + { + "ItemCost" "1250" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Craggy Coat + //================================================================================================================= + "item_craggy_coat" + { + "ItemCost" "1250" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Nether Shawl + //================================================================================================================= + "item_nether_shawl" + { + "ItemCost" "1500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Imp Claw + //================================================================================================================= + "item_imp_claw" + { + "ItemCost" "1500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Vambrace + //================================================================================================================= + "item_vambrace" + { + "ItemCost" "1500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Greater Faerie Fire + //================================================================================================================= + "item_greater_faerie_fire" + { + "ItemCost" "1750" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Quickening Charm + //================================================================================================================= + "item_quickening_charm" + { + "ItemCost" "2500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Orb of Destruction + //================================================================================================================= + "item_orb_of_destruction" + { + "ItemCost" "3000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Paladin Sword + //================================================================================================================= + "item_paladin_sword" + { + "ItemCost" "3000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_lifesteal" "30" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_amp" "20" + } + } + } + + //================================================================================================================= + // Havoc Hammer + //================================================================================================================= + "item_havoc_hammer" + { + "ItemCost" "3000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Witless Shako + //================================================================================================================= + "item_witless_shako" + { + "ItemCost" "3000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Magic Lamp + //================================================================================================================= + "item_panic_button" + { + "ItemCost" "3000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + + //================================================================================================================= + // Illusionist's Cape + //================================================================================================================= + "item_illusionsts_cape" + { + "ItemCost" "3500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Minotaur Horn + //================================================================================================================= + "item_minotaur_horn" + { + "ItemCost" "3000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Phoenix Ash + //================================================================================================================= + "item_phoenix_ash" + { + "ItemCost" "2500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Spell Prism + //================================================================================================================= + "item_spell_prism" + { + "ItemCost" "4000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Timeless Relic + //================================================================================================================= + "item_timeless_relic" + { + "ItemCost" "4000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Ballista + //================================================================================================================= + "item_ballista" + { + "ItemCost" "4500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Book of the Dead + //================================================================================================================= + "item_demonicon" + { + "ItemCost" "5000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Force Boots + //================================================================================================================= + "item_force_boots" + { + "ItemCost" "5500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Woodland Striders + //================================================================================================================= + "item_woodland_striders" + { + "ItemCost" "4500" + "ItemPurchasable" "0" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Mirror Shield + //================================================================================================================= + "item_mirror_shield" + { + "ItemCost" "4500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Ex Machina + //================================================================================================================= + "item_ex_machina" + { + "ItemCost" "4500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Fallen Sky + //================================================================================================================= + "item_fallen_sky" + { + "ItemCost" "4500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Apex + //================================================================================================================= + "item_apex" + { + "ItemCost" "6000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Stygian Desolator + //================================================================================================================= + "item_desolator_2" + { + "ItemCost" "6000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + } + + //================================================================================================================= + // Magic Stick + //================================================================================================================= + "item_magic_stick" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Magic Wand + //================================================================================================================= + "item_magic_wand" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Tome of Knowledge + //================================================================================================================= + "item_tome_of_knowledge" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Magic Wand - Recipe + //================================================================================================================= + "item_recipe_magic_wand" + { + "ItemRequirements" "0" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Teleport Scroll + //================================================================================================================= + "item_tpscroll" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Flask + //================================================================================================================= + "item_flask" + { + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "buff_duration" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "health_regen" "40" + } + "03" + { + "var_type" "FIELD_INTEGER" + "break_on_hero_damage" "0" // don't break to anything in this mode + } + } + } + + //================================================================================================================= + // Clarity + //================================================================================================================= + "item_clarity" + { + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Bottle + //================================================================================================================= + "item_bottle" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "41" // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_OPTIONAL_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_SUPPRESS_ASSOCIATED_CONSUMABLE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/bottle_blue.vmdl" + "ModelAlternate" "models/props_gameplay/bottle_empty.vmdl" + "FightRecapLevel" "1" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.5" + "AbilityCastRange" "350" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + "ItemCost" "0" + "ItemShopTags" "consumable" + "ItemQuality" "common" + "ItemAliases" "bottle" + "ItemStackable" "0" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + "ItemPermanent" "1" + "ItemInitialCharges" "3" + "ItemDisplayCharges" "1" + "IsTempestDoubleClonable" "0" + "ShouldBeSuggested" "1" + "ShouldBeInitiallySuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "health_restore" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "mana_restore" "0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "health_restore_pct" "25" + } + "04" + { + "var_type" "FIELD_INTEGER" + "mana_restore_pct" "8" + } + "05" + { + "var_type" "FIELD_FLOAT" + "restore_time" "2.5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "max_charges" "3" + } + "07" + { + "var_type" "FIELD_INTEGER" + "break_on_hero_damage" "0" + } + } + } + + //================================================================================================================= + // Recipe: Urn of Shadows + //================================================================================================================= + "item_recipe_urn_of_shadows" + { + "ItemRequirements" "0" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Urn of Shadows + //================================================================================================================= + "item_urn_of_shadows" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Faerie Fire + //================================================================================================================= + "item_faerie_fire" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Recipe: Spirit Vessel + //================================================================================================================= + "item_recipe_spirit_vessel" + { + "ItemRequirements" "0" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Spirit Vessel + //================================================================================================================= + "item_spirit_vessel" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Recipe: Bloodstone + //================================================================================================================= + "item_recipe_bloodstone" + { + "ItemRequirements" "0" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Bloodstone + //================================================================================================================= + "item_bloodstone" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Enchanted Mango + //================================================================================================================= + "item_enchanted_mango" + { + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Courier + //================================================================================================================= + "item_courier" + { + "ItemPurchasable" "0" + "ItemDroppable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Flying Courier + //================================================================================================================= + "item_flying_courier" + { + "ItemPurchasable" "0" + "ItemDroppable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Smoke of Deceit + //================================================================================================================= + "item_smoke_of_deceit" + { + "ItemPurchasable" "0" + "ItemDroppable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Recipe: Rapier + //================================================================================================================= + "item_recipe_rapier" + { + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + + // Recipe + //------------------------------------------------------------------------------------------------------------- + "ItemRequirements" "0" + } + + //================================================================================================================= + // Divine Rapier + //================================================================================================================= + "item_rapier" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Helm of the Dominator + //================================================================================================================= + "item_helm_of_the_dominator" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Recipe: Helm of the Dominator + //================================================================================================================= + "item_recipe_helm_of_the_dominator" + { + "ItemRequirements" "0" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Hand of Midas + //================================================================================================================= + "item_hand_of_midas" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Hand of Midas Recipe + //================================================================================================================= + "item_recipe_hand_of_midas" + { + "ItemRequirements" "0" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Quelling Blade + //================================================================================================================= + "item_quelling_blade" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Recipe: Battlefury - now requires a purchase in place of the quelling blade + //================================================================================================================= + "item_recipe_bfury" + { + "ItemCost" "130" + "ItemRequirements" + { + "01" "item_broadsword;item_claymore;item_pers" + } + } + + //================================================================================================================= + // Observer Wards + //================================================================================================================= + "item_ward_observer" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Sentry + //================================================================================================================= + "item_ward_sentry" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Recipe: Ward Dispenser + //================================================================================================================= + "item_recipe_ward_dispenser" + { + "ItemRequirements" "0" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Ward Dispenser + //================================================================================================================= + "item_ward_dispenser" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Tango + //================================================================================================================= + "item_tango" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Aghs Scepter + //================================================================================================================= + "item_ultimate_scepter" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Aghs Scepter 2 + //================================================================================================================= + "item_ultimate_scepter_2" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Recipe: Scepter + //================================================================================================================= + "item_recipe_ultimate_scepter" + { + "ItemRequirements" "0" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Holy Locket + //================================================================================================================= + "item_recipe_holy_locket" + { + "ItemRequirements" "0" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + "item_holy_locket" + { + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + } + + //================================================================================================================= + // Lifesteal + //================================================================================================================= + "item_lifesteal" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "900" + "ItemShopTags" "unique" + "ItemQuality" "component" + "ItemAliases" "morbid mask" + //"SideShop" "1" + "ShouldBeSuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "lifesteal_percent" "20" + } + } + } + + //================================================================================================================= + // Mask of Madness + //================================================================================================================= + "item_mask_of_madness" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "FightRecapLevel" "1" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "16.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "25" + "ItemCost" "1775" + "ItemShopTags" "unique;hard_to_tag" + "ItemQuality" "artifact" + "ItemAliases" "mom;mask of madness" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ShouldBeSuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "lifesteal_percent" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "berserk_bonus_attack_speed" "220" + } + "05" + { + "var_type" "FIELD_INTEGER" + "berserk_bonus_movement_speed" "60" + } + "06" + { + "var_type" "FIELD_INTEGER" + "berserk_armor_reduction" "8" + } + "07" + { + "var_type" "FIELD_FLOAT" + "berserk_duration" "6.0" + } + } + } + + //================================================================================================================= + // Vladimir + //================================================================================================================= + "item_vladmir" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCastRange" "1200" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "2200" + "ItemShopTags" "lifesteal;damage;armor;regen_mana" + "ItemQuality" "rare" + "ItemAliases" "vladmir's offering;vlads" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ShouldBeSuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "mana_regen_aura" "2.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "lifesteal_aura" "8" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_aura" "18" + } + "04" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1200" + } + } + } + + //================================================================================================================= + // Satanic + //================================================================================================================= + "item_satanic" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "FightRecapLevel" "2" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "5300" + "ItemShopTags" "damage;str;armor;unique;hard_to_tag" + "ItemQuality" "artifact" + "ItemAliases" "satanic" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ShouldBeSuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "lifesteal_percent" "20" + } + "05" + { + "var_type" "FIELD_INTEGER" + "unholy_lifesteal_percent" "100" + } + "06" + { + "var_type" "FIELD_INTEGER" + "unholy_lifesteal_total_tooltip" "120" + } + "07" + { + "var_type" "FIELD_FLOAT" + "unholy_duration" "5.0" + } + "08" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "30" + } + } + } + + //================================================================================================================= + // Vampire Fangs + //================================================================================================================= + "item_vampire_fangs" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + + "ItemIsNeutralDrop" "1" + + "ItemCost" "2000" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_lifesteal" "25" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spell_lifesteal" "12" + } + "03" + { + "var_type" "FIELD_INTEGER" + "night_vision" "500" + } + } + } + + //================================================================================================================= + // + //================================================================================================================= + "item_trident" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemIsNeutralDrop" "1" + + "ItemCost" "6000" + "ItemPurchasable" "0" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "30" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "30" + } + "04" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "20" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "30" + } + "06" + { + "var_type" "FIELD_INTEGER" + "movement_speed_percent_bonus" "30" + } + "07" + { + "var_type" "FIELD_INTEGER" + "hp_regen_amp" "30" + } + "08" + { + "var_type" "FIELD_INTEGER" + "manacost_reduction" "30" + } + "09" + { + "var_type" "FIELD_INTEGER" + "spell_amp" "30" + } + } + } + + //================================================================================================================= + // Shadow Amulet + //================================================================================================================= + "item_shadow_amulet" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_MOVEMENT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "FightRecapLevel" "1" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + "AbilityCooldown" "28.0" + "AbilityManaCost" "75" + "AbilitySharedCooldown" "shadow_blade" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemShopTags" "" + "ItemAliases" "shadow amulet" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "fade_time" "0.3" + } + "02" + { + "var_type" "FIELD_FLOAT" + "fade_duration" "14" + } + } + } + + //================================================================================================================= + // Titan Sliver + //================================================================================================================= + "item_titan_sliver" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemIsNeutralDrop" "1" + + + "ItemCost" "2500" + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "base_attack_damage" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "magic_resistance" "32" + } + "03" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "24" + } + } + } + + //================================================================================================================= + // Lifesteal + //================================================================================================================= + "item_lifesteal" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "26" // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "900" + "ItemShopTags" "unique" + "ItemQuality" "component" + "ItemAliases" "morbid mask" + //"SideShop" "1" + "ShouldBeSuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "lifesteal_percent" "8" + } + } + } + + //================================================================================================================= + // Recipe: Heart + //================================================================================================================= + "item_recipe_heart" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "113" // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "Model" "models/props_gameplay/recipe.vmdl" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1400" + "ItemShopTags" "" + + // Recipe + //------------------------------------------------------------------------------------------------------------- + "ItemRecipe" "1" + "ItemResult" "item_heart" + "ItemRequirements" + { + "01" "item_ring_of_tarrasque;item_vitality_booster;item_reaver" + } + } + + //================================================================================================================= + // Heart + //================================================================================================================= + "item_heart" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "114" // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "5200" + "ItemShopTags" "str;regen_health;health_pool" + "ItemQuality" "epic" + "ItemAliases" "hot;heart of tarrasque" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ShouldBeSuggested" "1" + "ItemStockMax" "4" + "ItemStockTime" "99999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "600" + } + "03" + { + "var_type" "FIELD_INTEGER" + "hp_regen_amp" "15" + } + "04" + { + "var_type" "FIELD_FLOAT" + "health_regen_rate" "1.5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "cooldown_melee" "7" + } + "06" + { + "var_type" "FIELD_INTEGER" + "cooldown_ranged_tooltip" "6" + } + } + } + + //================================================================================================================= + // Recipe: Bloodthorn + //================================================================================================================= + "item_recipe_bloodthorn" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "245" // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "Model" "models/props_gameplay/recipe.vmdl" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "2000" + "ItemShopTags" "" + + // Recipe + //------------------------------------------------------------------------------------------------------------- + "ItemRecipe" "1" + "ItemResult" "item_bloodthorn" + "ItemRequirements" + { + "01" "item_orchid;item_hyperstone" + } + } + + //================================================================================================================= + // Bloodthorn + //================================================================================================================= + "item_bloodthorn" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "250" // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "FightRecapLevel" "1" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "900" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "15.0" + "AbilitySharedCooldown" "orchid" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100" + "ItemCost" "6475" + "ItemShopTags" "int;attack_speed;damage;regen_mana;damage;hard_to_tag" + "ItemQuality" "epic" + "ItemAliases" "orchid malevolence" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ShouldBeSuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "180" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "60" + } + "04" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "16.5" + } + "05" + { + "var_type" "FIELD_FLOAT" + "silence_damage_percent" "60" + } + "06" + { + "var_type" "FIELD_FLOAT" + "silence_duration" "5" + } + "07" + { + "var_type" "FIELD_FLOAT" + "target_crit_multiplier" "180" + } + "08" + { + "var_type" "FIELD_FLOAT" + "tooltip_crit_chance" "100" + } + } + } + + //================================================================================================================= + // Black King Bar + //================================================================================================================= + "item_black_king_bar" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "FightRecapLevel" "2" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "60" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "4050" + "ItemShopTags" "str;damage;hard_to_tag" + "ItemQuality" "epic" + "ItemAliases" "bkb;black king bar" + "ItemSellable" "1" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ShouldBeSuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "48" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "7.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_level" "1" + } + "05" + { + "var_type" "FIELD_INTEGER" + "model_scale" "30" // Percentage over model scale + } + } + } + "skywrath_mage_mystic_flare" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5584" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "2" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1200" + "AbilityCastPoint" "0.1 0.1 0.1 0.1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "60.0 40.0 20.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "300 550 800" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "170" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "2.4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "400 600 800" + "LinkedSpecialBonus" "special_bonus_unique_skywrath_5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "damage_interval" "0.1" + } + "05" + { + "var_type" "FIELD_INTEGER" + "scepter_radius" "700" + "RequiresScepter" "1" + } + } + } + "legion_commander_duel" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5598" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES | DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + "AbilitySound" "Hero_LegionCommander.Duel" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "200" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "50.0 50.0 50.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "75 75 75" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "3.0" // Value much higher than cost. + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "2.5 2.5 2.5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_scepter" "6 7 8" + "RequiresScepter" "1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "reward_damage" "10 20 30" + "LinkedSpecialBonus" "special_bonus_unique_legion_commander" + } + "04" + { + "var_type" "FIELD_INTEGER" + "victory_range" "600" + } + } + } + + //================================================================================================================= + // Battlefury + //================================================================================================================= + "item_bfury" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_TREE | DOTA_UNIT_TARGET_CUSTOM" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_CUSTOM" + + "AbilityCastRange" "350" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "4.0" + + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "4500" + "ItemShopTags" "damage;health_regen;mana_regen;hard_to_tag" + "ItemQuality" "epic" + "ItemAliases" "bf;battle fury" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "110" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "22.5" + } + "03" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "7.75" + } + "04" + { + "var_type" "FIELD_INTEGER" + "cleave_damage_percent" "70" + } + "05" + { + "var_type" "FIELD_INTEGER" + "cleave_damage_percent_creep" "70" + } + "06" + { + "var_type" "FIELD_INTEGER" + "quelling_bonus" "36" + } + "07" + { + "var_type" "FIELD_INTEGER" + "quelling_bonus_ranged" "25" + } + "08" + { + "var_type" "FIELD_INTEGER" + "cleave_starting_width" "150" + } + "09" + { + "var_type" "FIELD_INTEGER" + "cleave_ending_width" "360" + } + "10" + { + "var_type" "FIELD_INTEGER" + "cleave_distance" "650" + } + } + } + + //================================================================================================================= + // Orchid + //================================================================================================================= + "item_orchid" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "FightRecapLevel" "1" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "900" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "18.0" + "AbilitySharedCooldown" "orchid" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100" + "ItemCost" "3475" + "ItemShopTags" "int;attack_speed;damage;regen_mana;damage;hard_to_tag" + "ItemQuality" "rare" + "ItemAliases" "orchid malevolence;silence" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ShouldBeSuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "60" + } + "04" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "12" + } + "05" + { + "var_type" "FIELD_FLOAT" + "silence_damage_percent" "60" + } + "06" + { + "var_type" "FIELD_FLOAT" + "silence_duration" "5" + } + } + } + + //================================================================================================================= + // Travel Boots + //================================================================================================================= + "item_travel_boots" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP | DOTA_UNIT_TARGET_BUILDING" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "45.0" + "AbilitySharedCooldown" "teleport" + "AbilityChannelTime" "3.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "75" + "ItemCost" "2500" + "ItemShopTags" "teleport;move_speed" + "ItemQuality" "common" + "ItemAliases" "bot;boots of travel;tp" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "MaxUpgradeLevel" "2" + "ItemBaseLevel" "1" + "ShouldBeSuggested" "1" + + "UpgradesItems" "item_travel_boots" + "UpgradeRecipe" "item_recipe_travel_boots" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "32" + } + "02" + { + "var_type" "FIELD_INTEGER" + "maximum_distance" "575" + } + "03" + { + "var_type" "FIELD_INTEGER" + "vision_radius" "200" + } + "04" + { + "var_type" "FIELD_INTEGER" + "tp_penalty" "10" + } + } + } + + + //================================================================================================================= + // + // REGULAR ABILITIES + // + //================================================================================================================= + + //================================================================================================================= + // Shredder: Chakram + //================================================================================================================= + "shredder_chakram" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5527" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "HasScepterUpgrade" "1" + "AbilitySound" "Hero_Shredder.Chakram.Cast" + "MaxLevel" "4" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "2500" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "speed" "600.0 625.0 650.0 675.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "175" + } + "03" + { + "var_type" "FIELD_INTEGER" + "pass_damage" "250 275 300 325" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_per_second" "100 125 150 175" + } + "05" + { + "var_type" "FIELD_INTEGER" + "slow" "5 6 7 8" + } + "06" + { + "var_type" "FIELD_FLOAT" + "damage_interval" "0.25" + } + "07" + { + "var_type" "FIELD_FLOAT" + "break_distance" "3000.0" + } + "08" + { + "var_type" "FIELD_FLOAT" + "mana_per_second" "0" + } + "09" + { + "var_type" "FIELD_FLOAT" + "pass_slow_duration" "0.5" + } + "10" + { + "var_type" "FIELD_INTEGER" + "slow_health_percentage" "5" + } + + } + } + + //================================================================================================================= + // Shredder: Chakram 2 + //================================================================================================================= + "shredder_chakram_2" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5645" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE | DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_SHOW_IN_GUIDES" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "IsGrantedByScepter" "1" + "HasScepterUpgrade" "1" + "MaxLevel" "4" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "2500" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_6" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "speed" "600.0 625.0 650.0 675.0" + "RequiresScepter" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "200" + "RequiresScepter" "1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "pass_damage" "250 275 300 325" + "RequiresScepter" "1" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_per_second" "100 125 150 175" + "RequiresScepter" "1" + } + "05" + { + "var_type" "FIELD_INTEGER" + "slow" "5 6 7 8" + "RequiresScepter" "1" + } + "06" + { + "var_type" "FIELD_FLOAT" + "damage_interval" "0.25" + "RequiresScepter" "1" + } + "07" + { + "var_type" "FIELD_FLOAT" + "break_distance" "3000.0" + "RequiresScepter" "1" + } + "08" + { + "var_type" "FIELD_FLOAT" + "mana_per_second" "0" + "RequiresScepter" "1" + } + "09" + { + "var_type" "FIELD_FLOAT" + "pass_slow_duration" "0.5" + "RequiresScepter" "1" + } + "10" + { + "var_type" "FIELD_INTEGER" + "slow_health_percentage" "5" + "RequiresScepter" "1" + } + } + } + //================================================================================================================= + // Tidehunter: Ravage + //================================================================================================================= + "tidehunter_ravage" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "2" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.7" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "15.0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "300" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1025" + } + "02" + { + "var_type" "FIELD_INTEGER" + "speed" "775" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "1.2" + } + } + } + + //================================================================================================================= + // Kunkka: Tidebringer + //================================================================================================================= + "kunkka_tidebringer" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5032" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST | DOTA_ABILITY_BEHAVIOR_ATTACK" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "AbilitySound" "Hero_Kunkka.Tidebringer.Attack" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "4.0" + "AbilityCastRange" "150" + "AbilityCastPoint" "0.0 0.0 0.0 0.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cleave_starting_width" "150" + } + "02" + { + "var_type" "FIELD_INTEGER" + "cleave_ending_width" "650" + } + "03" + { + "var_type" "FIELD_INTEGER" + "cleave_distance" "1100" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_bonus" "100" + "CalculateSpellDamageTooltip" "0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "cleave_damage" "300" + "LinkedSpecialBonus" "special_bonus_unique_kunkka_4" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Kunkka: Ghostship + //================================================================================================================= + "kunkka_ghostship" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1200" + "AbilityCastPoint" "0.3" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "16" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "1000" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "150" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "tooltip_delay" "2.7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "ghostship_distance" "1000" + } + "03" + { + "var_type" "FIELD_INTEGER" + "ghostship_width" "425" + } + "04" + { + "var_type" "FIELD_INTEGER" + "movespeed_bonus" "20" + } + "05" + { + "var_type" "FIELD_FLOAT" + "buff_duration" "10" + } + "06" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "2.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "ghostship_speed" "550" + } + "08" + { + "var_type" "FIELD_INTEGER" + "ghostship_speed_scepter" "650" + } + "09" + { + "var_type" "FIELD_INTEGER" + "ghostship_width_scepter" "200" + } + "10" + { + "var_type" "FIELD_FLOAT" + "ghostship_absorb" "40 45 50" + } + } + } + + //================================================================================================================= + // Obsidian Destroyer: Astral Imprisonment + //================================================================================================================= + "obsidian_destroyer_astral_imprisonment" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5392" // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY | DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "AbilitySound" "Hero_ObsidianDestroyer.AstralImprisonment" + "HasScepterUpgrade" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityDuration" "2.0" + "AbilityCooldown" "3" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "150" + "AbilityCastPoint" "0.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.5" // applies multiple modifiers + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "prison_duration" "2.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "0" + "LinkedSpecialBonus" "special_bonus_unique_outworld_devourer_3" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "150" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_charges_scepter" "2" + "RequiresScepter" "1" + } + "05" + { + "var_type" "FIELD_INTEGER" + "charge_restore_time_scepter" "12" + "RequiresScepter" "1" + } + "06" + { + "var_type" "FIELD_INTEGER" + "scepter_range_bonus" "300" + "RequiresScepter" "1" + } + "07" + { + "var_type" "FIELD_INTEGER" + "counter_duration" "35" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Alchemist: Acid Spray + //================================================================================================================= + "alchemist_acid_spray" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.2" + "AbilityCastRange" "900" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "450" // was 625 + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "9.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "125" + } + "04" + { + "var_type" "FIELD_INTEGER" + "armor_reduction" "20" + "LinkedSpecialBonus" "special_bonus_unique_alchemist" + } + "05" + { + "var_type" "FIELD_FLOAT" + "tick_rate" "0.5" + } + } + } + + //================================================================================================================= + // Alchemist: Unstable Concoction + //================================================================================================================= + "alchemist_unstable_concoction" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "900" // give it a range for sake of our alchemist_ai + "AbilityCastPoint" "0.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "18.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "brew_time" "2.5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "brew_explosion" "5.5" + } + "03" + { + "var_type" "FIELD_FLOAT" + "min_stun" "1.5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "max_stun" "3.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "min_damage" "800" + } + "06" + { + "var_type" "FIELD_INTEGER" + "max_damage" "1200" + } + "07" + { + "var_type" "FIELD_INTEGER" + "midair_explosion_radius" "500" + } + } + } + + //================================================================================================================= + // Alchemist: Unstable Concoction Throw + //================================================================================================================= + "alchemist_unstable_concoction_throw" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "900" // was 775 + "AbilityCastPoint" "0.2" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportBonus" "120" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "brew_time" "2.5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "min_stun" "2.0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "max_stun" "2.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "min_damage" "800" + } + "05" + { + "var_type" "FIELD_INTEGER" + "max_damage" "1200" + } + "06" + { + "var_type" "FIELD_INTEGER" + "movement_speed" "900" + } + "07" + { + "var_type" "FIELD_INTEGER" + "vision_range" "300" + } + "08" + { + "var_type" "FIELD_INTEGER" + "midair_explosion_radius" "500" + } + "09" + { + "var_type" "FIELD_FLOAT" + "brew_explosion" "5.5" + } + } + } + + //================================================================================================================= + // Alchemist: Chemical Rage + //================================================================================================================= + "alchemist_chemical_rage" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5369" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Alchemist.ChemicalRage.Cast" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.0" + "AbilityCastAnimation" "ACT_INVALID" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "22.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "8.0" + } + "02" + { + "var_type" "FIELD_FLOAT" + "transformation_time" "0.7" + } + "03" + { + "var_type" "FIELD_FLOAT" + "base_attack_time" "0.75" + "LinkedSpecialBonus" "special_bonus_unique_alchemist_3" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "3000" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_health_regen" "100" + "LinkedSpecialBonus" "special_bonus_unique_alchemist_4" + } + "06" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "200" + } + "07" + { + "var_type" "FIELD_INTEGER" + "bonus_movespeed" "150" + "LinkedSpecialBonus" "special_bonus_unique_alchemist_6" + } + "08" + { + "var_type" "FIELD_FLOAT" + "scepter_gold_damage" "2" + "RequiresScepter" "1" + } + "09" + { + "var_type" "FIELD_INTEGER" + "scepter_bonus_damage" "30" + "RequiresScepter" "1" + } + "10" + { + "var_type" "FIELD_INTEGER" + "scepter_spell_amp" "6" + "RequiresScepter" "1" + } + } + } + + //================================================================================================================= + // Ability: Mirana Starfall + //================================================================================================================= + "mirana_starfall" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5051" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "AbilitySound" "Ability.Starfall" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12.0" + "AbilityDuration" "10.0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "200" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "80" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "starfall_radius" "650" + } + "02" + { + "var_type" "FIELD_INTEGER" + "starfall_secondary_radius" "450" + } + "03" + { + "var_type" "FIELD_FLOAT" + "interval_scepter" "8.0" + "RequiresScepter" "1" + } + "04" + { + "var_type" "FIELD_INTEGER" + "secondary_starfall_damage_percent" "50" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCastGestureSlot" "DEFAULT" + } + + //================================================================================================================= + // Ability: Mirana Arrow + //================================================================================================================= + "mirana_arrow" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5048" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Mirana.ArrowCast" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "3000" + "AbilityCastPoint" "0.5 0.5 0.5 0.5" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "18 17 16 15" + "AbilityDuration" "3.11 3.11 3.11 3.11" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "350" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100 100 100 100" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "arrow_speed" "900.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "arrow_width" "115" + } + "03" + { + "var_type" "FIELD_INTEGER" + "arrow_range" "3000" + } + "04" + { + "var_type" "FIELD_INTEGER" + "arrow_max_stunrange" "1500" + } + "05" + { + "var_type" "FIELD_FLOAT" + "arrow_min_stun" "0.3" + } + "06" + { + "var_type" "FIELD_FLOAT" + "arrow_max_stun" "5.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "arrow_bonus_damage" "500" + } + "08" + { + "var_type" "FIELD_INTEGER" + "arrow_vision" "500" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Luna: Moon Glaive + //================================================================================================================= + "luna_moon_glaive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "range" "500" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bounces" "2 4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_reduction_percent" "35" + } + } + } + + //================================================================================================================= + // Harpy Storm: Chain Lightning + //================================================================================================================= + "harpy_storm_chain_lightning" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5319" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "MaxLevel" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + // Unit Targeting + //------------------------------------------------------------------------------------------------------------- + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "200" + "AbilityCastPoint" "0.3" + "AbilityCooldown" "6.0" + "AbilityManaCost" "00" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "initial_damage" "450" + } + "02" + { + "var_type" "FIELD_INTEGER" + "jump_range" "500" + } + "03" + { + "var_type" "FIELD_FLOAT" + "jump_delay" "0.25" + } + "04" + { + "var_type" "FIELD_FLOAT" + "damage_percent_loss" "25.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "max_targets" "4" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Ghost: Frost Attack + //================================================================================================================= + "ghost_frost_attack" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5301" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "MaxLevel" "1" + "AbilityType" "DOTA_ABILITY_TYPE_BASIC" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "movespeed_slow" "-15" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attackspeed_slow" "-10" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "1" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Brewmaster Storm: Static Remnant + //================================================================================================================= + "storm_spirit_static_remnant" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5098" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_StormSpirit.StaticRemnantPlant" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0 0 0 0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "3.5" + "AbilityDuration" "12.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "25" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "static_remnant_radius" "235" + } + "02" + { + "var_type" "FIELD_INTEGER" + "static_remnant_damage_radius" "260" + } + "03" + { + "var_type" "FIELD_FLOAT" + "static_remnant_delay" "1.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "static_remnant_damage" "100" + "LinkedSpecialBonus" "special_bonus_unique_storm_spirit_5" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Brewmaster: Thunder Clap + //================================================================================================================= + "brewmaster_thunder_clap" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5400" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySound" "Hero_Brewmaster.ThunderClap" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.4 0.4 0.4" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50 100 110 120" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "400 400 400 400" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "100 100 100 100" + } + "03" + { + "var_type" "FIELD_INTEGER" + "movement_slow" "25" + } + "04" + { + "var_type" "FIELD_INTEGER" + "attack_speed_slow" "25" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "2.0" + "LinkedSpecialBonus" "special_bonus_unique_brewmaster_3" + } + "06" + { + "var_type" "FIELD_FLOAT" + "duration_creeps" "2.0" + "LinkedSpecialBonus" "special_bonus_unique_brewmaster_3" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Beastmaster: Wild Axes + //================================================================================================================= + "beastmaster_wild_axes" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5168" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Beastmaster.Wild_Axes" + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "12" + + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "80" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "175" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spread" "450" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "1500" + } + "04" + { + "var_type" "FIELD_INTEGER" + "axe_damage" "250" + "LinkedSpecialBonus" "special_bonus_unique_beastmaster" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "6" + } + "06" + { + "var_type" "FIELD_INTEGER" + "damage_amp" "6 8 10 12" + } + "07" + { + "var_type" "FIELD_FLOAT" + "scepter_cooldown" "0" + "RequiresScepter" "1" + } + "08" + { + "var_type" "FIELD_FLOAT" + "min_throw_duration" "1.25" + } + "09" + { + "var_type" "FIELD_FLOAT" + "max_throw_duration" "1.25" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + } + + //================================================================================================================= + // Beastmaster: Primal Roar + //================================================================================================================= + "beastmaster_primal_roar" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5177" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Beastmaster.Primal_Roar" + + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.5 0.5 0.5" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "90" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "200" + + // Cast Range + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "0.6" // Applies multiple modifiers + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "2.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage" "150" + } + "03" + { + "var_type" "FIELD_INTEGER" + "side_damage" "150" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "300" + } + "05" + { + "var_type" "FIELD_INTEGER" + "slow_movement_speed_pct" "-60" + } + "06" + { + "var_type" "FIELD_INTEGER" + "slow_attack_speed_pct" "-60" + } + "07" + { + "var_type" "FIELD_INTEGER" + "push_distance" "450" + } + "08" + { + "var_type" "FIELD_FLOAT" + "push_duration" "1.0" + } + "09" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "3" + } + "10" + { + "var_type" "FIELD_INTEGER" + "movement_speed" "40" + } + "11" + { + "var_type" "FIELD_FLOAT" + "movement_speed_duration" "3.0" + } + } + } + + //================================================================================================================= + // Troll Warlord: Whirling Axes (Throw) + //================================================================================================================= + "troll_warlord_whirling_axes_ranged" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5509" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_TrollWarlord.WhirlingAxes.Ranged" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_WHIRLING_AXES_RANGED" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.2 0.2 0.2 0.2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "9" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "axe_width" "100" + } + + "02" + { + "var_type" "FIELD_FLOAT" + "axe_speed" "800.0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "axe_range" "1000.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "axe_damage" "600" + "LinkedSpecialBonus" "special_bonus_unique_troll_warlord_3" + } + "05" + { + "var_type" "FIELD_FLOAT" + "axe_slow_duration" "2.5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "movement_speed" "40" + } + "07" + { + "var_type" "FIELD_INTEGER" + "axe_spread" "25" + } + "08" + { + "var_type" "FIELD_INTEGER" + "axe_count" "5" + } + } + } + + //================================================================================================================= + // Troll Warlord: Whirling Axes Spin + //================================================================================================================= + "troll_warlord_whirling_axes_melee" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5510" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_TrollWarlord.WhirlingAxes.Melee" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCastGestureSlot" "DEFAULT" + "AbilityCastPoint" "0.0" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "9" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage" "400" + "LinkedSpecialBonus" "special_bonus_unique_troll_warlord_3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "hit_radius" "100" + } + "03" + { + "var_type" "FIELD_FLOAT" + "max_range" "450.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "axe_movement_speed" "1250" + } + "05" + { + "var_type" "FIELD_FLOAT" + "blind_duration" "5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "blind_pct" "60" + } + "07" + { + "var_type" "FIELD_FLOAT" + "whirl_duration" "3.0" + } + } + } + + //================================================================================================================= + // Skywrath Mage: Mystic Flare + //================================================================================================================= + "skywrath_mage_mystic_flare" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5584" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "2" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "0.1 0.1 0.1 0.1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "60.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "300" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "170" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "2.4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "750" + "LinkedSpecialBonus" "special_bonus_unique_skywrath_5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "damage_interval" "0.1" + } + "05" + { + "var_type" "FIELD_INTEGER" + "scepter_radius" "700" + "RequiresScepter" "1" + } + } + } + + //================================================================================================================= + // Legion Commander: Duel + //================================================================================================================= + "legion_commander_duel" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5598" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES | DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + "AbilitySound" "Hero_LegionCommander.Duel" + + "HasScepterUpgrade" "1" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "150" + "AbilityCastPoint" "0.3 0.3 0.3 0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "50.0 50.0 50.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "75 75 75" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportValue" "3.0" // Value much higher than cost. + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "3.5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_scepter" "6 7 8" + "RequiresScepter" "1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "reward_damage" "20" + "LinkedSpecialBonus" "special_bonus_unique_legion_commander" + } + "04" + { + "var_type" "FIELD_INTEGER" + "victory_range" "600" + } + } + } + + //================================================================================================================= + // Slark: Dark Pact + //================================================================================================================= + "slark_dark_pact" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5494" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Slark.DarkPact.Cast" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_INVALID" + "AbilityCastPoint" "0.001 0.001 0.001 0.001" + "AbilityCastRange" "400" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20.0" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "60" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "delay" "1.5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "pulse_duration" "1.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "04" + { + "var_type" "FIELD_INTEGER" + "total_damage" "300" + "LinkedSpecialBonus" "special_bonus_unique_slark_2" + } + "05" + { + "var_type" "FIELD_INTEGER" + "total_pulses" "10" + } + "06" + { + "var_type" "FIELD_FLOAT" + "pulse_interval" "0.1" + } + } + } + + //================================================================================================================= + // Slark: Pounce + //================================================================================================================= + "slark_pounce" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5495" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Slark.Pounce.Cast" + "HasScepterUpgrade" "1" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "pounce_distance" "400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "pounce_speed" "1000" + } + "03" + { + "var_type" "FIELD_FLOAT" + "pounce_acceleration" "4000.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "pounce_radius" "95" + } + "05" + { + "var_type" "FIELD_FLOAT" + "leash_duration" "0" + "LinkedSpecialBonus" "special_bonus_unique_slark" + } + "06" + { + "var_type" "FIELD_INTEGER" + "leash_radius" "400" + } + "07" + { + "var_type" "FIELD_INTEGER" + "max_charges" "2" + "RequiresScepter" "1" + } + "08" + { + "var_type" "FIELD_INTEGER" + "charge_restore_time" "10" + "RequiresScepter" "1" + } + "09" + { + "var_type" "FIELD_INTEGER" + "pounce_distance_scepter" "1100" + "RequiresScepter" "1" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Slark Shadow Dance + //================================================================================================================= + "slark_shadow_dance" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5497" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + "AbilitySound" "Hero_Slark.ShadowDance" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "45" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "4" + "LinkedSpecialBonus" "special_bonus_unique_slark_3" + } + "02" + { + "var_type" "FIELD_FLOAT" + "fade_time" "0.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_regen_pct" "20" + } + "05" + { + "var_type" "FIELD_FLOAT" + "activation_delay" "0.5" + } + "06" + { + "var_type" "FIELD_FLOAT" + "neutral_disable" "2.0" + } + } + } + + //================================================================================================================= + // Naga Siren: Ensnare + //================================================================================================================= + "naga_siren_ensnare" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5468" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_NagaSiren.Ensnare.Cast" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.6" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "70" + + // Cast Range + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "650 650 650 650" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "2.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "net_speed" "500" + } + "03" + { + "var_type" "FIELD_INTEGER" + "fake_ensnare_distance" "900" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Naga Siren: Rip Tide + //================================================================================================================= + "naga_siren_rip_tide" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5469" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_NagaSiren.Riptide.Cast" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0 0 0 0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chance" "17" + } + "02" + { + "var_type" "FIELD_INTEGER" + "armor_reduction" "-2 -4 -6 -8" + "LinkedSpecialBonus" "special_bonus_unique_naga_siren_3" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage" "300" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius" "300" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "4.0" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Naga Siren: Song of the Siren + //================================================================================================================= + "naga_siren_song_of_the_siren" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5470" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + "HasScepterUpgrade" "1" + "AbilitySound" "Hero_NagaSiren.SongOfTheSiren" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "1.0" + "AbilityCastRange" "1000 1200 1400" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "60" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "150 175 200" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1000" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "7.0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "animation_rate" "0.55 0.55 0.55" + } + "04" + { + "var_type" "FIELD_FLOAT" + "regen_rate" "10.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "regen_rate_self" "100.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "regen_rate_tooltip_scepter" "10" + "RequiresScepter" "1" + } + } + } + + //================================================================================================================= + // Tidehunter: Anchor Smash + //================================================================================================================= + "tidehunter_anchor_smash" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5120" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "FightRecapLevel" "1" + "AbilitySound" "Hero_Tidehunter.AnchorSmash" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "375" + "AbilityCastPoint" "0.4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "30" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_damage" "1000" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_reduction" "-30" + "LinkedSpecialBonus" "special_bonus_unique_tidehunter_3" + "CalculateSpellDamageTooltip" "0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "reduction_duration" "6.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius" "375" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + //================================================================================================================= + // Tidehunter: Ravage + //================================================================================================================= + "tidehunter_ravage" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5121" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "FightRecapLevel" "2" + "AbilitySound" "Ability.Ravage" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.3 0.3 0.3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + + // Damage. + //------------------------------------------------------------------------------------------------------------- + "AbilityDamage" "1000" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "150" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1250" + } + "02" + { + "var_type" "FIELD_INTEGER" + "speed" "725" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "2.0" + } + } + } + + //================================================================================================================= + // Sange + //================================================================================================================= + "item_sange" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "162" // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "2050" + "ItemShopTags" "damage;str;unique" + "ItemQuality" "artifact" + "ItemAliases" "sange" + "ShouldBeSuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "32" + } + "02" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "16" + } + "03" + { + "var_type" "FIELD_INTEGER" + "hp_regen_amp" "24" + } + } + } + + //================================================================================================================= + // Sange and Yasha + //================================================================================================================= + "item_sange_and_yasha" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "154" // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "4100" + "ItemShopTags" "damage;str;agi;attack_speed;unique" + "ItemQuality" "artifact" + "ItemAliases" "sny;s&y;sy;sange and yasha" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ShouldBeSuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "32" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "32" + } + "03" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "32" + } + "05" + { + "var_type" "FIELD_INTEGER" + "movement_speed_percent_bonus" "20" + } + "06" + { + "var_type" "FIELD_INTEGER" + "hp_regen_amp" "30" + } + } + } + + //================================================================================================================= + // Kaya and Sange + //================================================================================================================= + "item_kaya_and_sange" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "273" // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "4100" + "ItemShopTags" "damage;str;agi;attack_speed;unique" + "ItemQuality" "artifact" + "ItemAliases" "snk;s&k;sk;sange and kaya" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ShouldBeSuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "32" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "32" + } + "03" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "mana_regen_multiplier" "60" + } + "05" + { + "var_type" "FIELD_INTEGER" + "spell_amp" "32" + } + "06" + { + "var_type" "FIELD_INTEGER" + "hp_regen_amp" "30" + } + "07" + { + "var_type" "FIELD_INTEGER" + "spell_lifesteal_amp" "30" + } + } + } + + //================================================================================================================= + // Heaven's Halberd + //================================================================================================================= + "item_heavens_halberd" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "210" // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "FightRecapLevel" "1" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "18" + "AbilityCastRange" "600" + "AbilityCastPoint" "0.0" + + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100" + "ItemCost" "3450" + "ItemShopTags" "str;damage;evasion" + "ItemQuality" "artifact" + "ItemAliases" "heaven's halberd" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ShouldBeSuggested" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_evasion" "20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + "03" + { + "var_type" "FIELD_FLOAT" + "disarm_range" "5.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "disarm_melee" "3.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "10" + } + "06" + { + "var_type" "FIELD_INTEGER" + "hp_regen_amp" "15" + } + } + } +} diff --git a/aghanim_singleplayer/scripts/npc/npc_heroes_custom.txt b/aghanim_singleplayer/scripts/npc/npc_heroes_custom.txt new file mode 100755 index 0000000..3fceb7f --- /dev/null +++ b/aghanim_singleplayer/scripts/npc/npc_heroes_custom.txt @@ -0,0 +1,220 @@ +// Dota Heroes File +// NOTE: This is not for creating new heroes, this is for taking a currently existing hero as a template and overriding +// the specified key-value combinations. Use override_hero for this. +"DOTAHeroes" +{ + //================================================================================================================= + // HERO: Luna + //================================================================================================================= + "npc_dota_hero_luna_aghsfort" + { + "override_hero" "npc_dota_hero_luna" + "Ability1" "aghsfort_luna_lucent_beam" + "Ability6" "aghsfort_luna_eclipse" + } + + //================================================================================================================= + // HERO: Magnus + //================================================================================================================= + "npc_dota_hero_magnataur_aghsfort" + { + "override_hero" "npc_dota_hero_magnataur" + "Ability1" "aghsfort_magnataur_shockwave" + "Ability2" "aghsfort_magnataur_empower" + "Ability3" "aghsfort_magnataur_skewer" + "Ability5" "aghsfort_special_magnataur_reverse_polarity_polarity" + "Ability6" "aghsfort_magnataur_reverse_polarity" + "Ability11" "special_bonus_mp_200" + "Ability12" "special_bonus_strength_8" + } + + //================================================================================================================= + // HERO: Monkey King + //================================================================================================================= + "npc_dota_hero_monkey_king_aghsfort" + { + "override_hero" "npc_dota_hero_monkey_king" + "Ability4" "monkey_king_jingu_mastery_aghsfort" + } + + //================================================================================================================= + // HERO: Omniknight + //================================================================================================================= + "npc_dota_hero_omniknight_aghsfort" + { + "override_hero" "npc_dota_hero_omniknight" + "Ability1" "aghsfort_omniknight_purification" + "Ability2" "aghsfort_omniknight_repel" + "Ability3" "aghsfort_omniknight_degen_aura" + "Ability5" "aghsfort_special_omniknight_guardian_angel_single_target" + "Ability6" "aghsfort_omniknight_guardian_angel" + "Ability10" "special_bonus_mp_250" + "Ability12" "special_bonus_armor_6" + "Ability15" "special_bonus_mp_regen_3" + "Ability17" "special_bonus_unique_omniknight_3" + "ArmorPhysical" "4" + } + + //================================================================================================================= + // HERO: Winter Wyvern + //================================================================================================================= + "npc_dota_hero_winter_wyvern_aghsfort" + { + "override_hero" "npc_dota_hero_winter_wyvern" + "Ability1" "aghsfort_winter_wyvern_arctic_burn" + "Ability2" "aghsfort_winter_wyvern_splinter_blast" + "Ability3" "aghsfort_winter_wyvern_cold_embrace" + "Ability6" "aghsfort_winter_wyvern_winters_curse" + "Ability13" "special_bonus_attack_speed_30" + } + + //================================================================================================================= + // HERO: Phantom Assassin + //================================================================================================================= + "npc_dota_hero_phantom_assassin_aghsfort" + { + "override_hero" "npc_dota_hero_phantom_assassin" + "Ability1" "aghsfort_phantom_assassin_stifling_dagger" + "Ability2" "aghsfort_phantom_assassin_phantom_strike" + "Ability3" "aghsfort_phantom_assassin_blur" + "Ability6" "aghsfort_phantom_assassin_coup_de_grace" + } + + //================================================================================================================= + // HERO: Disruptor + //================================================================================================================= + "npc_dota_hero_disruptor_aghsfort" + { + "override_hero" "npc_dota_hero_disruptor" + "Ability1" "aghsfort_disruptor_thunder_strike" + "Ability2" "aghsfort_disruptor_glimpse" + "Ability3" "aghsfort_disruptor_kinetic_field" + "Ability6" "aghsfort_disruptor_static_storm" + "Ability14" "special_bonus_intelligence_20" + "Ability13" "special_bonus_unique_disruptor_2" + "Ability10" "special_bonus_magic_resistance_20" + } + + //================================================================================================================= + // HERO: Snapfire + //================================================================================================================= + "npc_dota_hero_snapfire_aghsfort" + { + "override_hero" "npc_dota_hero_snapfire" + "Ability1" "aghsfort_snapfire_scatterblast" + "Ability2" "aghsfort_snapfire_firesnap_cookie" + "Ability3" "aghsfort_snapfire_lil_shredder" + "Ability4" "aghsfort_snapfire_gobble_up" + "Ability5" "aghsfort_snapfire_spit_creep" + "Ability6" "aghsfort_snapfire_mortimer_kisses" + "Ability16" "special_bonus_attack_damage_90" + + } + + //================================================================================================================= + // HERO: Tusk + //================================================================================================================= + "npc_dota_hero_tusk_aghsfort" + { + "override_hero" "npc_dota_hero_tusk" + "Ability1" "aghsfort_tusk_ice_shards" + "Ability2" "aghsfort_tusk_snowball" + "Ability3" "aghsfort_tusk_tag_team" + "Ability6" "aghsfort_tusk_walrus_punch" + "Ability7" "aghsfort_tusk_launch_snowball" + "Ability14" "special_bonus_movement_speed_30" + "Ability17" "special_bonus_attack_speed_40" + "ArmorPhysical" "4" + "AttackDamageMin" "29" + "AttackDamageMax" "33" + } + + //================================================================================================================= + // HERO: Ursa + //================================================================================================================= + "npc_dota_hero_ursa_aghsfort" + { + "override_hero" "npc_dota_hero_ursa" + "Ability1" "aghsfort_ursa_earthshock" + "Ability2" "aghsfort_ursa_overpower" + "Ability3" "aghsfort_ursa_fury_swipes" + "Ability6" "aghsfort_ursa_enrage" + "Ability10" "special_bonus_attack_damage_20" + "Ability14" "special_bonus_unique_ursa_3" + } + + //================================================================================================================= + // HERO: Sniper + //================================================================================================================= + "npc_dota_hero_sniper_aghsfort" + { + "override_hero" "npc_dota_hero_sniper" + "Ability1" "aghsfort_sniper_shrapnel" + "Ability2" "aghsfort_sniper_headshot" + "Ability3" "aghsfort_sniper_take_aim" + "Ability6" "aghsfort_sniper_assassinate" + } + + //================================================================================================================= + // HERO: Mars + //================================================================================================================= + "npc_dota_hero_mars_aghsfort" + { + "override_hero" "npc_dota_hero_mars" + "Ability1" "aghsfort_mars_spear" + "Ability2" "aghsfort_mars_gods_rebuke" + "Ability3" "aghsfort_mars_bulwark" + "Ability6" "aghsfort_mars_arena_of_blood" + "Ability9" "aghsfort_mars_bulwark_stop" + } + + //================================================================================================================= + // HERO: Viper + //================================================================================================================= + "npc_dota_hero_viper_aghsfort" + { + "override_hero" "npc_dota_hero_viper" + "Ability1" "aghsfort_viper_poison_attack" + "Ability2" "aghsfort_viper_nethertoxin" + "Ability3" "aghsfort_viper_corrosive_skin" + "Ability6" "aghsfort_viper_viper_strike" + "Ability16" "special_bonus_hp_400" + "Ability17" "special_bonus_movement_speed_30" + "Ability11" "special_bonus_spell_lifesteal_6" + } + + //================================================================================================================= + // HERO: Weaver + //================================================================================================================= + "npc_dota_hero_weaver_aghsfort" + { + "override_hero" "npc_dota_hero_weaver" + "Ability1" "aghsfort_weaver_the_swarm" + "Ability2" "aghsfort_weaver_shukuchi" + "Ability3" "aghsfort_weaver_geminate_attack" + "Ability6" "aghsfort_weaver_time_lapse" + "Ability11" "special_bonus_agility_6" + "Ability12" "special_bonus_corruption_3" + "Ability16" "special_bonus_hp_475" + "MovementSpeed" "300" + "AttributeBaseStrength" "18" + } + + //================================================================================================================= + // HERO: Witch Doctor + //================================================================================================================= + "npc_dota_hero_witch_doctor_aghsfort" + { + "override_hero" "npc_dota_hero_witch_doctor" + "Ability1" "aghsfort_witch_doctor_paralyzing_cask" + "Ability2" "aghsfort_witch_doctor_voodoo_restoration" + "Ability3" "aghsfort_witch_doctor_maledict" + "Ability5" "aghsfort_witch_doctor_death_ward_no_channel" + "Ability6" "aghsfort_witch_doctor_death_ward" + "Ability15" "special_bonus_unique_witch_doctor_4" + } + + + + +} diff --git a/aghanim_singleplayer/scripts/npc/npc_items_custom.txt b/aghanim_singleplayer/scripts/npc/npc_items_custom.txt new file mode 100755 index 0000000..053a7f9 --- /dev/null +++ b/aghanim_singleplayer/scripts/npc/npc_items_custom.txt @@ -0,0 +1,11610 @@ +"DOTAAbilities" +{ + + //================================================================================================================= + // Item Battle Points + //================================================================================================================= + "item_battle_points" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "ScriptFile" "items/item_battle_points" + "AbilityTextureName" "item_battle_points" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/ui/compendium_points/compendium_points_aghanim.vmdl" + "Skin" "3" + "Effect" "particles/econ/events/ti10/ingame_battle_points_ti10.vpcf" + "WorldDropSound" "Item.BattlePointsDropped" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemKillable" "0" + "ItemCastOnPickup" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + "item_ring_of_regen" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "27" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "175" + "ItemShopTags" "regen_health" + "ItemAliases" "ror" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "4.5" + } + } + "ShouldBeInitiallySuggested" "1" + // Sound + // ------------------------------------------------------------------------------------------------------------- + "UIPickupSound" "Item.PickUpRingShop" + "UIDropSound" "Item.DropRingShop" + "WorldDropSound" "Item.DropRingWorld" + } + "item_sobi_mask" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "28" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "175" + "ItemShopTags" "regen_mana" + "ItemAliases" "sage's mask" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "1.8" + } + } + "ShouldBeInitiallySuggested" "1" + } + "item_gloves" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "25" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "450" + "ItemShopTags" "attack_speed" + "ItemAliases" "gloves of haste" + // "SideShop" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "40" + } + } + } + "item_ring_of_tarrasque" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "279" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "650" + "ItemShopTags" "regen_health" + "ItemAliases" "rot" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "300" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "12" + } + } + "ShouldBeInitiallySuggested" "1" + // Sound + // ------------------------------------------------------------------------------------------------------------- + "UIPickupSound" "Item.PickUpRingShop" + "UIDropSound" "Item.DropRingShop" + "WorldDropSound" "Item.DropRingWorld" + } + "item_ring_of_protection" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "12" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "175" + "ItemShopTags" "armor" + "ItemAliases" "rop;ring of protection" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "bonus_armor" "4" + } + } + "ShouldBeInitiallySuggested" "1" + // Sound + // ------------------------------------------------------------------------------------------------------------- + "UIPickupSound" "Item.PickUpRingShop" + "UIDropSound" "Item.DropRingShop" + "WorldDropSound" "Item.DropRingWorld" + } + "item_infused_raindrop" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.0" + "AbilityCooldown" "7.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "265" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "225" + "ItemPermanent" "0" + "ItemInitialCharges" "6" + "ItemStackable" "0" + "ItemShopTags" "armor" + "ItemAliases" "raindrop" + "ItemStockMax" "1" + "ItemStockTime" "1" + "ItemStockInitial" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "mana_regen" "2.4" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_armor" "0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_magical_armor" "0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "magic_damage_block" "240" + } + "05" + { + "var_type" "FIELD_INTEGER" + "min_damage" "50" + } + "06" + { + "var_type" "FIELD_INTEGER" + "initial_charges" "6" + } + } + "ItemHideCharges" "0" + "ItemInitialStockTime" "270.0" + // Sounden + // ------------------------------------------------------------------------------------------------------------- + "UIPickupSound" "Item.PickUpRingShop" + "UIDropSound" "Item.DropRingShop" + "WorldDropSound" "Item.DropRingWorld" + } + "item_orb_of_venom" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "181" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "300" + "ItemShopTags" "hard_to_tag" + "ItemAliases" "oov;orb of venom" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "poison_damage_melee" "4.0" + } + "02" + { + "var_type" "FIELD_FLOAT" + "poison_damage_range" "4.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "poison_movement_speed_melee" "-30" + } + "04" + { + "var_type" "FIELD_INTEGER" + "poison_movement_speed_range" "-8" + } + "05" + { + "var_type" "FIELD_FLOAT" + "poison_duration" "4.0" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeInitiallySuggested" "1" + } + "item_blades_of_attack" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "2" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "450" + "ItemShopTags" "damage;tutorial" + "ItemAliases" "blades of attack" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "18" + } + } + } + "item_chainmail" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "4" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "550" + "ItemShopTags" "armor" + "ItemAliases" "chainmail" + // "SideShop" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "8" + } + } + } + "item_quarterstaff" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "10" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "875" + "ItemShopTags" "damage;attack_speed" + "ItemAliases" "quarterstaff" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_speed" "20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "20" + } + } + } + "item_helm_of_iron_will" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "6" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "925" + "ItemShopTags" "armor;regen_health" + "ItemAliases" "helm of iron will" + // "SideShop" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "10" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_regen" "10" + } + } + } + "item_broadsword" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "3" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemShopTags" "damage" + "ItemAliases" "broadsword" + // "SideShop" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "30" + } + } + } + "item_claymore" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "5" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1400" + "ItemShopTags" "damage" + "ItemAliases" "claymore" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "42" + } + } + } + "item_mithril_hammer" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "8" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1600" + "ItemShopTags" "damage" + "ItemAliases" "mithril hammer" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "48" + } + } + } + "item_ring_of_health" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "56" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "825" + "SecretShop" "1" + "ItemShopTags" "regen_health" + "ItemAliases" "roh;ring of health" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "19.5" + } + } + // Sound + // ------------------------------------------------------------------------------------------------------------- + "UIPickupSound" "Item.PickUpRingShop" + "UIDropSound" "Item.DropRingShop" + "WorldDropSound" "Item.DropRingWorld" + } + "item_void_stone" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "57" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "825" + "SecretShop" "1" + "ItemShopTags" "regen_mana" + "ItemAliases" "void stone" + // "SideShop" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "6.75" + } + } + } + "item_energy_booster" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "59" + "ItemQuality" "secret_shop" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "900" + "SecretShop" "1" + "ItemShopTags" "mana_pool" + "ItemAliases" "energy booster" + // "SideShop" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "500" + } + } + } + "item_vitality_booster" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "61" + "ItemQuality" "secret_shop" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1100" + "SecretShop" "1" + "ItemShopTags" "health_pool" + "ItemAliases" "vitality booster" + // "SideShop" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "500" + } + } + } + "item_point_booster" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "60" + "ItemQuality" "secret_shop" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1200" + "SecretShop" "1" + "ItemShopTags" "mana_pool;health_pool" + "ItemAliases" "point booster" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "350" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "350" + } + } + } + "item_platemail" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "9" + "ItemQuality" "secret_shop" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1400" + "SecretShop" "1" + "ItemShopTags" "armor" + "ItemAliases" "platemail" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "20" + } + } + } + "item_talisman_of_evasion" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "32" + "ItemQuality" "secret_shop" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1400" + "SecretShop" "1" + "ItemShopTags" "evasion" + "ItemAliases" "talisman of evasion" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_evasion" "30" + } + } + } + "item_hyperstone" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "55" + "ItemQuality" "secret_shop" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2000" + "SecretShop" "1" + "ItemShopTags" "attack_speed" + "ItemAliases" "hyperstone" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "120" + } + } + } + "item_ultimate_orb" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "24" + "ItemQuality" "secret_shop" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2050" + "SecretShop" "1" + "ItemShopTags" "agi;int;str" + "ItemAliases" "ultimate orb" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "20" + } + } + } + "item_demon_edge" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "51" + "ItemQuality" "secret_shop" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2200" + "SecretShop" "1" + "ItemShopTags" "damage" + "ItemAliases" "demon edge" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "84" + } + } + } + "item_mystic_staff" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "58" + "ItemQuality" "secret_shop" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2700" + "SecretShop" "1" + "ItemShopTags" "int" + "ItemAliases" "mystic staff" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "50" + } + } + } + "item_reaver" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "53" + "ItemQuality" "secret_shop" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "3000" + "SecretShop" "1" + "ItemShopTags" "str" + "ItemAliases" "reaver" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "50" + } + } + } + "item_eagle" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "52" + "ItemQuality" "secret_shop" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "3000" + "SecretShop" "1" + "ItemShopTags" "agi" + "ItemAliases" "eaglesong" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "50" + } + } + } + "item_relic" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "54" + "ItemQuality" "secret_shop" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "3800" + "SecretShop" "1" + "ItemShopTags" "damage" + "ItemAliases" "sacred relic" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "120" + } + } + } + "item_null_talisman" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "77" + "ItemQuality" "common" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "510" + "ItemShopTags" "damage;int;agi;str" + "ItemAliases" "null talisman" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "4" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_spell_amp" "6" + } + "05" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "1.2" + } + } + "ShouldBeInitiallySuggested" "1" + "ShouldBeSuggested" "1" + } + "item_wraith_band" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "75" + "ItemQuality" "common" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "510" + "ItemShopTags" "damage;int;agi;str" + "ItemAliases" "wraith band" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "4" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "10" + } + "05" + { + "var_type" "FIELD_FLOAT" + "bonus_armor" "3.0" + } + } + "ShouldBeInitiallySuggested" "1" + "ShouldBeSuggested" "1" + } + "item_bracer" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "73" + "ItemQuality" "common" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "510" + "ItemShopTags" "damage;int;agi;str" + "ItemAliases" "bracer" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "4" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "6" + } + "05" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "1.5" + } + } + "ShouldBeInitiallySuggested" "1" + "ShouldBeSuggested" "1" + } + "item_soul_ring" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "178" + "ItemQuality" "common" + "ItemCost" "815" + "ItemDeclarations" "DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "regen_health;boost_mana" + "ItemAliases" "soul ring" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "12" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_armor" "4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "health_sacrifice" "170" + } + "04" + { + "var_type" "FIELD_INTEGER" + "mana_gain" "300" + } + "05" + { + "var_type" "FIELD_INTEGER" + "duration" "10" + } + } + "ShouldBeSuggested" "1" + // Sound + // ------------------------------------------------------------------------------------------------------------- + "UIPickupSound" "Item.PickUpRingShop" + "UIDropSound" "Item.DropRingShop" + "WorldDropSound" "Item.DropRingWorld" + } + "item_power_treads" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "63" + "ItemQuality" "common" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1400" + "ItemDeclarations" "DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "attack_speed;move_speed;int;agi;str" + "ItemAliases" "power treads" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "90" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_stat" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "0" + } + } + "ShouldBeSuggested" "1" + } + "item_phase_boots" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "8.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "50" + "ItemQuality" "common" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1500" + "ItemDeclarations" "DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;move_speed;hard_to_tag" + "ItemAliases" "phase boots" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "90" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage_melee" "36" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_damage_range" "24" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_block_melee" "0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage_block_ranged" "0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "block_chance" "0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "phase_movement_speed" "40" + } + "08" + { + "var_type" "FIELD_INTEGER" + "phase_movement_speed_range" "20" + } + "09" + { + "var_type" "FIELD_FLOAT" + "phase_duration" "6.0" + } + "10" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "0" + } + "11" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "8" + } + } + "ShouldBeSuggested" "1" + } + "item_oblivion_staff" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "67" + "ItemQuality" "common" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1500" + "ItemShopTags" "damage;int;attack_speed;regen_mana" + "ItemAliases" "oblivion staff" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "20" + } + "04" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "2.5" + } + } + } + "item_mask_of_madness" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "FightRecapLevel" "1" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "16.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "25" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "172" + "ItemQuality" "artifact" + "ItemCost" "1775" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "unique;hard_to_tag" + "ItemAliases" "mom;mask of madness" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "lifesteal_percent" "40" + } + "04" + { + "var_type" "FIELD_INTEGER" + "berserk_bonus_attack_speed" "220" + } + "05" + { + "var_type" "FIELD_INTEGER" + "berserk_bonus_movement_speed" "60" + } + "06" + { + "var_type" "FIELD_INTEGER" + "berserk_armor_reduction" "8" + } + "07" + { + "var_type" "FIELD_FLOAT" + "berserk_duration" "6.0" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + + "item_pers" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "69" + "ItemQuality" "common" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1650" + "ItemShopTags" "regen_health;regen_mana" + "ItemAliases" "perseverance" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "19.5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "6.75" + } + } + } + "item_ring_of_basilius" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCastRange" "1200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "88" + "ItemQuality" "rare" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "425" + "ItemShopTags" "regen_mana" + "ItemAliases" "rob;ring of basilius" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "0" + } + "02" + { + "var_type" "FIELD_FLOAT" + "aura_mana_regen" "4.2" + } + "03" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1200" + } + } + "ShouldBeInitiallySuggested" "1" + // Sound + // ------------------------------------------------------------------------------------------------------------- + "UIPickupSound" "Item.PickUpRingShop" + "UIDropSound" "Item.DropRingShop" + "WorldDropSound" "Item.DropRingWorld" + } + "item_headdress" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCastRange" "1200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "94" + "ItemQuality" "rare" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "425" + "ItemShopTags" "str;int;agi;regen_health" + "ItemAliases" "headdress" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "0" + } + "02" + { + "var_type" "FIELD_FLOAT" + "aura_health_regen" "4.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1200" + } + } + } + "item_buckler" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "86" + "ItemQuality" "rare" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "375" + "ItemShopTags" "armor;boost_armor" + "ItemAliases" "buckler" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "0" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_aoe_armor" "4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_aoe_radius" "1200" + } + } + } + "item_tranquil_boots" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "13.0" + "AbilityManaCost" "0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "214" + "ItemQuality" "rare" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "925" + "ItemDeclarations" "DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "move_speed;regen_health;armor" + "ItemAliases" "tranquil boots" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "140" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_health_regen" "28" + } + "04" + { + "var_type" "FIELD_FLOAT" + "heal_duration" "20.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "heal_amount" "250" + } + "06" + { + "var_type" "FIELD_FLOAT" + "heal_interval" "0.334" + } + "07" + { + "var_type" "FIELD_INTEGER" + "break_time" "8" + } + "08" + { + "var_type" "FIELD_INTEGER" + "break_count" "1" + } + "09" + { + "var_type" "FIELD_INTEGER" + "break_threshold" "20" + } + "10" + { + "var_type" "FIELD_INTEGER" + "broken_movement_speed" "90" + } + } + "ItemHideCharges" "1" + "ShouldBeSuggested" "1" + } + "item_medallion_of_courage" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "AbilityCooldown" "7.0" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1000" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "187" + "ItemQuality" "rare" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1025" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "armor;regen_mana;hard_to_tag" + "ItemAliases" "medallion of courage" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "10" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen_pct" "3.75" + } + "03" + { + "var_type" "FIELD_INTEGER" + "armor_reduction" "-10" + } + "04" + { + "var_type" "FIELD_INTEGER" + "duration" "7" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySharedCooldown" "medallion" + "ShouldBeSuggested" "1" + } + "item_arcane_boots" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "55.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + "AbilityCastRange" "1200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "180" + "ItemQuality" "rare" + "ItemCost" "1400" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemAlertable" "1" + "ItemShopTags" "move_speed;boost_mana;mana_pool" + "ItemAliases" "mana;mb;arcane boots" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_movement" "90" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "500" + } + "03" + { + "var_type" "FIELD_INTEGER" + "replenish_amount" "320" + } + "04" + { + "var_type" "FIELD_INTEGER" + "replenish_radius" "1200" + } + } + "ShouldBeSuggested" "1" + } + "item_ancient_janggo" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "FightRecapLevel" "1" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30.0" + "AbilityCastRange" "1200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "185" + "ItemQuality" "rare" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1475" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemPermanent" "1" + "ItemRequiresCharges" "1" + "ItemInitialCharges" "6" + "ItemShopTags" "str;agi;int;damage;move_speed;attack_speed;hard_to_tag" + "ItemAliases" "drum of endurance" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "12" + } + "03" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "4.5" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed_pct" "90" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed_pct" "26" + } + "06" + { + "var_type" "FIELD_INTEGER" + "duration" "6" + } + "07" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ItemDisplayCharges" "1" + "ShouldBeSuggested" "1" + } + "item_javelin" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "7" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1100" + "ItemShopTags" "damage" + "ItemAliases" "javelin" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_chance" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_chance_damage" "160" + } + } + } + "item_vladmir" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCastRange" "1200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "81" + "ItemQuality" "rare" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2375" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;armor;regen_mana" + "ItemAliases" "vladmir's offering;vlads" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "mana_regen_aura" "4.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "lifesteal_aura" "30" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_aura" "36" + } + "04" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1200" + } + } + "ShouldBeSuggested" "1" + } + "item_mekansm" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "FightRecapLevel" "2" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "45.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "225" + "AbilityCastRange" "1200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "79" + "ItemQuality" "rare" + "ItemCost" "1975" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemAlertable" "1" + "ItemShopTags" "agi;int;str;armor;boost_health" + "ItemAliases" "mechanism;mekansm" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "8" + } + "02" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1200" + } + "03" + { + "var_type" "FIELD_FLOAT" + "aura_health_regen" "4.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "aura_armor" "6.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "heal_amount" "550" + } + "06" + { + "var_type" "FIELD_INTEGER" + "heal_radius" "1200" + } + } + "ShouldBeSuggested" "1" + } + "item_pipe" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "FightRecapLevel" "2" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "60.0" + "AbilityManaCost" "100" + "AbilityCastRange" "1200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "90" + "ItemQuality" "rare" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "3425" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemAlertable" "1" + "ItemShopTags" "regen_health;boost_magic_resist" + "ItemAliases" "pipe of insight" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "health_regen" "25.5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "magic_resistance" "60" + } + "03" + { + "var_type" "FIELD_FLOAT" + "barrier_debuff_duration" "50.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "tooltip_resist" "60" + } + "05" + { + "var_type" "FIELD_FLOAT" + "aura_health_regen" "6.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "magic_resistance_aura" "20" + } + "07" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1200" + } + "08" + { + "var_type" "FIELD_INTEGER" + "barrier_block" "800" + } + "09" + { + "var_type" "FIELD_INTEGER" + "barrier_duration" "12.0" + } + "10" + { + "var_type" "FIELD_INTEGER" + "barrier_radius" "1200" + } + "11" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "0" + } + "12" + { + "var_type" "FIELD_INTEGER" + "barrier_block_creep" "400" + } + } + "ShouldBeSuggested" "1" + } + "item_guardian_greaves" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "FightRecapLevel" "1" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "40" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + "AbilityCastRange" "1200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "231" + "ItemQuality" "rare" + "ItemCost" "4975" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemAlertable" "1" + "ItemShopTags" "int;armor;regen_health;hard_to_tag" + "ItemAliases" "guardian greaves" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_movement" "100" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "500" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "8" + } + "04" + { + "var_type" "FIELD_FLOAT" + "aura_health_regen" "7.5" + } + "05" + { + "var_type" "FIELD_FLOAT" + "aura_armor" "6" + } + "06" + { + "var_type" "FIELD_INTEGER" + "aura_health_regen_bonus" "32" + } + "07" + { + "var_type" "FIELD_INTEGER" + "aura_armor_bonus" "20" + } + "08" + { + "var_type" "FIELD_INTEGER" + "aura_bonus_threshold" "40" + } + "09" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1200" + } + "10" + { + "var_type" "FIELD_INTEGER" + "replenish_health" "600" + } + "11" + { + "var_type" "FIELD_INTEGER" + "replenish_mana" "400" + } + "12" + { + "var_type" "FIELD_INTEGER" + "replenish_radius" "1200" + } + } + "ShouldBeSuggested" "1" + } + "item_glimmer_cape" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_MOVEMENT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "FightRecapLevel" "1" + "AbilityCooldown" "14.0" + "AbilityManaCost" "90" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "550" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "254" + "ItemQuality" "rare" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1900" + "ItemAliases" "glimmer cape" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_magical_armor" "30" + } + "03" + { + "var_type" "FIELD_FLOAT" + "fade_delay" "0.6" + } + "04" + { + "var_type" "FIELD_INTEGER" + "active_magical_armor" "90" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "5" + } + "06" + { + "var_type" "FIELD_FLOAT" + "building_duration_limit" "180" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + "item_veil_of_discord" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_DONT_CANCEL_MOVEMENT" + "AbilityCastPoint" "0.0" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50" + "AbilityCastRange" "1000" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "190" + "ItemQuality" "rare" + "ItemCost" "1525" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "int;armor;regen_health;hard_to_tag" + "ItemAliases" "vod;veil of discord" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "8" + } + "02" + { + "var_type" "FIELD_FLOAT" + "aura_mana_regen" "4.5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1200" + } + "04" + { + "var_type" "FIELD_INTEGER" + "spell_amp" "36" + } + "05" + { + "var_type" "FIELD_INTEGER" + "debuff_radius" "600" + } + "06" + { + "var_type" "FIELD_FLOAT" + "resist_debuff_duration" "16.0" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + "item_force_staff" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC | DOTA_UNIT_TARGET_CUSTOM" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH | DOTA_UNIT_TARGET_TEAM_CUSTOM" + "FightRecapLevel" "1" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "23.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "550" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "102" + "ItemQuality" "rare" + "ItemCost" "2175" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "int;damage;attack_speed;hard_to_tag" + "ItemAliases" "fs;force staff" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "20" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "7.5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "push_length" "600" + } + "04" + { + "var_type" "FIELD_INTEGER" + "enemy_cast_range" "850" + } + } + "AbilitySharedCooldown" "force" + "ShouldBeSuggested" "1" + } + "item_aether_lens" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "232" + "ItemQuality" "rare" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2275" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "int;regen_mana;move_speed;hard_to_tag" + "ItemAliases" "aether lens" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "900" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "9.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "cast_range_bonus" "500" + } + } + "ShouldBeSuggested" "1" + } + "item_cyclone" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_CUSTOM" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_CUSTOM" + "FightRecapLevel" "1" + "AbilityCastPoint" "0.0" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "23.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "175" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "575" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "100" + "ItemQuality" "rare" + "ItemCost" "2725" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "int;regen_mana;move_speed;hard_to_tag" + "ItemAliases" "cyclone euls;eul's scepter of divinity" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "20" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "15.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "40" + } + "04" + { + "var_type" "FIELD_FLOAT" + "cyclone_duration" "2.5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "tooltip_drop_damage" "50" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + "item_rod_of_atos" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "FightRecapLevel" "1" + "AbilityCastPoint" "0.0" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "18" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50" + "AbilityCastRange" "1100" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "206" + "ItemQuality" "rare" + "ItemCost" "2750" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "int;regen_health" + "ItemAliases" "rod of atos" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "20" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "4.0" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + "item_solar_crest" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "AbilityCooldown" "7.0" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1000" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "229" + "ItemQuality" "rare" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "3775" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "armor;regen_mana;hard_to_tag" + "ItemAliases" "solar crest" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "16" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "self_movement_speed" "40" + } + "04" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen_pct" "5.25" + } + "05" + { + "var_type" "FIELD_INTEGER" + "target_movement_speed" "20" + } + "06" + { + "var_type" "FIELD_INTEGER" + "target_attack_speed" "160" + } + "07" + { + "var_type" "FIELD_INTEGER" + "duration" "7" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySharedCooldown" "medallion" + "ShouldBeSuggested" "1" + } + "item_orchid" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "FightRecapLevel" "1" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "18.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "900" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "98" + "ItemQuality" "rare" + "ItemCost" "3475" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "int;attack_speed;damage;regen_mana;damage;hard_to_tag" + "ItemAliases" "orchid malevolence;silence" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "60" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "60" + } + "04" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "12" + } + "05" + { + "var_type" "FIELD_FLOAT" + "silence_damage_percent" "60" + } + "06" + { + "var_type" "FIELD_FLOAT" + "silence_duration" "5" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySharedCooldown" "orchid" + "ShouldBeSuggested" "1" + } + "item_nullifier" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + "FightRecapLevel" "1" + "AbilityCooldown" "11.0" + "AbilityManaCost" "75" + "AbilityCastRange" "900" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "225" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "4725" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemAliases" "nlf;nullifier" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "160" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "16" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_regen" "12" + } + "04" + { + "var_type" "FIELD_FLOAT" + "mute_duration" "5.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "1000" + } + "06" + { + "var_type" "FIELD_INTEGER" + "slow_pct" "80" + } + "07" + { + "var_type" "FIELD_FLOAT" + "slow_interval_duration" "0.5" + } + } + "ShouldBeSuggested" "1" + } + "item_refresher" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.0" + "AbilityCooldown" "120.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "375" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "110" + "ItemQuality" "rare" + "ItemCost" "5000" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "regen_health;regen_mana;hard_to_tag" + "ItemAliases" "refresher orb" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_health_regen" "39" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "36.0" + } + } + "ShouldBeSuggested" "1" + } + "item_sheepstick" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "FightRecapLevel" "2" + "AbilityCastPoint" "0.0" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "22.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "250" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "96" + "ItemQuality" "rare" + "ItemCost" "5575" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "int;regen_mana;agi;hard_to_tag" + "ItemAliases" "hex;sheepstick;scythe of vyse" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "70" + } + "04" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "27.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "sheep_duration" "3.5" + } + "06" + { + "var_type" "FIELD_FLOAT" + "sheep_movement_speed" "140" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "ShouldBeSuggested" "1" + } + "item_octarine_core" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "235" + "ItemQuality" "rare" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "5000" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "move_speed;boost_mana;mana_pool" + "ItemAliases" "mana;mb;octarine core" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intelligence" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "640" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "640" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_magical_armor" "15" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_cooldown" "35" + } + "06" + { + "var_type" "FIELD_FLOAT" + "hero_lifesteal" "35" + } + "07" + { + "var_type" "FIELD_FLOAT" + "creep_lifesteal" "10" + } + "08" + { + "var_type" "FIELD_INTEGER" + "active_duration" "7" + } + } + "ShouldBeSuggested" "1" + } + "item_hood_of_defiance" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "60.0" + "AbilityManaCost" "75" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "131" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1750" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "regen_health;magic_resist" + "ItemAliases" "hood of defiance" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_spell_resist" "50" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "25.5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "tooltip_resist" "50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "barrier_block" "650" + } + "05" + { + "var_type" "FIELD_INTEGER" + "barrier_duration" "12.0" + } + } + "ShouldBeSuggested" "1" + } + "item_vanguard" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "125" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1925" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "regen_health;block;health_pool" + "ItemAliases" "vg;vanguard" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "500" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "21.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "block_damage_melee" "140" + } + "04" + { + "var_type" "FIELD_INTEGER" + "block_damage_ranged" "70" + } + "05" + { + "var_type" "FIELD_INTEGER" + "block_chance" "75" + } + } + "ShouldBeSuggested" "1" + } + "item_blade_mail" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "25" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "127" + "ItemQuality" "epic" + "ItemCost" "2050" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;armor;int;hard_to_tag" + "ItemAliases" "bm;blade mail;blademail" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "56" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "14" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "4.5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "passive_reflection_constant" "10" + } + "06" + { + "var_type" "FIELD_INTEGER" + "passive_reflection_pct" "10" + } + "07" + { + "var_type" "FIELD_INTEGER" + "active_reflection_pct" "90" + } + } + "ShouldBeSuggested" "1" + } + "item_soul_booster" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "129" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "3200" + "ItemShopTags" "regen_health;regen_mana;health_pool;mana_pool" + "ItemAliases" "soul booster" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "850" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "850" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_magical_armor" "20" + } + } + } + "item_aeon_disk" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "105.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "256" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "3100" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS | DECLARE_PURCHASES_IN_SPEECH" + "ItemShopTags" "str;regen_health;health_pool" + "ItemAliases" "ad;aeon disk" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "600" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "600" + } + "03" + { + "var_type" "FIELD_INTEGER" + "health_threshold_pct" "70" + } + "04" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "75" + } + "05" + { + "var_type" "FIELD_FLOAT" + "buff_duration" "2.5" + } + } + "ShouldBeSuggested" "1" + } + "item_crimson_guard" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "40.0" + "AbilityCastRange" "1200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "242" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "3800" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemAlertable" "1" + "ItemShopTags" "armor;boost_armor;regen_health;block;health_pool" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "500" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "36" + } + "03" + { + "var_type" "FIELD_FLOAT" + "bonus_armor" "12" + } + "04" + { + "var_type" "FIELD_INTEGER" + "block_damage_melee" "140" + } + "05" + { + "var_type" "FIELD_INTEGER" + "block_damage_ranged" "70" + } + "06" + { + "var_type" "FIELD_INTEGER" + "block_chance" "75" + } + "07" + { + "var_type" "FIELD_INTEGER" + "duration" "12" + } + "08" + { + "var_type" "FIELD_INTEGER" + "bonus_aoe_radius" "1200" + } + "09" + { + "var_type" "FIELD_INTEGER" + "block_damage_melee_active" "60" + } + "10" + { + "var_type" "FIELD_INTEGER" + "block_damage_ranged_active" "60" + } + "11" + { + "var_type" "FIELD_INTEGER" + "block_chance_active" "100" + } + "12" + { + "var_type" "FIELD_FLOAT" + "tooltip_reapply_time" "40" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + "item_lotus_orb" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "FightRecapLevel" "1" + "AbilityCooldown" "15.0" + "AbilityManaCost" "175" + "AbilityCastRange" "900" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "226" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "3950" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "regen_health;regen_mana;str;agi;int;hard_to_tag" + "ItemAliases" "ls;lotus orb" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "20" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "19.5" + } + "03" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "12.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "500" + } + "05" + { + "var_type" "FIELD_FLOAT" + "active_duration" "6" + } + } + "ShouldBeSuggested" "1" + } + "item_black_king_bar" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "FightRecapLevel" "2" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "70" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "116" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "4050" + "ItemSellable" "1" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "str;damage;hard_to_tag" + "ItemAliases" "bkb;black king bar" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "48" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "10.0 9.0 8.0 7.0 6.0 5.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_level" "6" + } + "05" + { + "var_type" "FIELD_INTEGER" + // Percentage over model scale + "model_scale" "30" + } + } + "ShouldBeSuggested" "1" + } + "item_hurricane_pike" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC | DOTA_UNIT_TARGET_CUSTOM" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH | DOTA_UNIT_TARGET_TEAM_CUSTOM" + "FightRecapLevel" "1" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "23.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "550" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "263" + "ItemQuality" "epic" + "ItemCost" "4525" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "int;damage;attack_speed;hard_to_tag" + "ItemAliases" "fs;force staff" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "26" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "7.5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "40" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "30" + } + "05" + { + "var_type" "FIELD_INTEGER" + "base_attack_range" "280" + } + "06" + { + "var_type" "FIELD_INTEGER" + "push_length" "600" + } + "07" + { + "var_type" "FIELD_INTEGER" + "enemy_length" "450" + } + "08" + { + "var_type" "FIELD_FLOAT" + "range_duration" "5" + } + "09" + { + "var_type" "FIELD_INTEGER" + "cast_range_enemy" "400" + } + "10" + { + "var_type" "FIELD_INTEGER" + "max_attacks" "4" + } + "11" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "100" + } + } + "AbilitySharedCooldown" "force" + "ShouldBeSuggested" "1" + } + "item_shivas_guard" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "FightRecapLevel" "1" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100" + "AbilityCastRange" "900" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "119" + "ItemQuality" "epic" + "ItemCost" "4850" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "int;armor;hard_to_tag" + "ItemAliases" "shiva's guard;shivas" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "22" + } + "03" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1200" + } + "04" + { + "var_type" "FIELD_INTEGER" + "aura_attack_speed" "-75" + } + "05" + { + "var_type" "FIELD_INTEGER" + "blast_damage" "400" + } + "06" + { + "var_type" "FIELD_INTEGER" + "blast_movement_speed" "-60" + } + "07" + { + "var_type" "FIELD_FLOAT" + "blast_debuff_duration" "4.0" + } + "08" + { + "var_type" "FIELD_INTEGER" + "blast_radius" "900" + } + "09" + { + "var_type" "FIELD_INTEGER" + "blast_speed" "350" + } + "10" + { + "var_type" "FIELD_INTEGER" + "hp_regen_degen_aura" "50" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + "item_manta" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityCastPoint" "0.0" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "45.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "125" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "147" + "ItemQuality" "epic" + "ItemCost" "4600" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "agi;str;int;attack_speed;move_speed;hard_to_tag" + "ItemAliases" "manta style" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "52" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "24" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "16" + } + "06" + { + "var_type" "FIELD_INTEGER" + "images_count" "2" + } + "07" + { + "var_type" "FIELD_INTEGER" + "tooltip_illusion_duration" "20" + } + "08" + { + "var_type" "FIELD_INTEGER" + "images_do_damage_percent_melee" "-67" + } + "09" + { + "var_type" "FIELD_INTEGER" + "tooltip_damage_outgoing_melee" "33" + } + "10" + { + "var_type" "FIELD_INTEGER" + "images_take_damage_percent_melee" "250" + } + "11" + { + "var_type" "FIELD_INTEGER" + "tooltip_damage_incoming_melee_total_pct" "350" + } + "12" + { + "var_type" "FIELD_INTEGER" + "images_do_damage_percent_ranged" "-72" + } + "13" + { + "var_type" "FIELD_INTEGER" + "tooltip_damage_outgoing_ranged" "28" + } + "14" + { + "var_type" "FIELD_INTEGER" + "images_take_damage_percent_ranged" "300" + } + "15" + { + "var_type" "FIELD_INTEGER" + "tooltip_damage_incoming_ranged_total_pct" "400" + } + "16" + { + "var_type" "FIELD_INTEGER" + "cooldown_melee" "30" + } + "17" + { + "var_type" "FIELD_INTEGER" + "cooldown_ranged_tooltip" "45" + } + "18" + { + "var_type" "FIELD_FLOAT" + "invuln_duration" "0.1" + } + "19" + { + "var_type" "FIELD_INTEGER" + "vision_radius" "1000" + } + "20" + { + "var_type" "FIELD_FLOAT" + "tooltip_ranged_cooldown_increase" "15" + } + } + "ShouldBeSuggested" "1" + } + "item_sphere" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "FightRecapLevel" "1" + "AbilityCooldown" "12.0" + "AbilityCastRange" "700" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "123" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "4600" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "regen_health;regen_mana;str;agi;int;hard_to_tag" + "ItemAliases" "ls;linken's sphere" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "28" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "21" + } + "03" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "15.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "block_cooldown" "12.0" + } + } + "ActiveDescriptionLine" "2" + "ShouldBeSuggested" "1" + } + "item_heart" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "7.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "114" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "5400" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "str;regen_health;health_pool" + "ItemAliases" "hot;heart of tarrasque" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "80" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "800" + } + "03" + { + "var_type" "FIELD_INTEGER" + "hp_regen_amp" "20" + } + "04" + { + "var_type" "FIELD_FLOAT" + "health_regen_pct" "2" + } + "05" + { + "var_type" "FIELD_INTEGER" + "cooldown_melee" "5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "cooldown_ranged_tooltip" "7" + } + } + "ShouldBeSuggested" "1" + } + "item_assault" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCastRange" "1200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "112" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "5075" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "attack_speed;armor;hard_to_tag" + "ItemAliases" "ac;assault cuirass" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "15" + } + "03" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1200" + } + "04" + { + "var_type" "FIELD_INTEGER" + "aura_attack_speed" "60" + } + "05" + { + "var_type" "FIELD_INTEGER" + "aura_positive_armor" "7.5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "aura_negative_armor" "-10" + } + } + "ShouldBeSuggested" "1" + } + "item_armlet" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_TOGGLE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "151" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2475" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;attack_speed;armor;regen_health;hard_to_tag" + "ItemAliases" "armlet of mordiggian" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "10" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_health_regen" "10" + } + "05" + { + "var_type" "FIELD_INTEGER" + "unholy_bonus_damage" "62" + } + "06" + { + "var_type" "FIELD_INTEGER" + "unholy_bonus_attack_speed" "0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "unholy_bonus_strength" "50" + } + "08" + { + "var_type" "FIELD_INTEGER" + "unholy_bonus_armor" "8" + } + "09" + { + "var_type" "FIELD_INTEGER" + "unholy_health_drain_per_tick" "6" + } + "10" + { + "var_type" "FIELD_INTEGER" + "unholy_health_drain_per_second_tooltip" "54" + } + "11" + { + "var_type" "FIELD_FLOAT" + "toggle_cooldown" "0.036f" + } + } + "ShouldBeSuggested" "1" + } + "item_meteor_hammer" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_CHANNELLED" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "AbilityCooldown" "24" + "AbilityManaCost" "125" + // Casting + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + // Time + // ------------------------------------------------------------------------------------------------------------- + "AbilityChannelTime" "2.5" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "223" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2350" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemAliases" "mh;meteor hammer" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "16" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "25.5" + } + "03" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "7.5" + } + "04" + { + "var_type" "FIELD_INTEGER" + "burn_dps_buildings" "50" + } + "05" + { + "var_type" "FIELD_INTEGER" + "burn_dps_units" "90" + } + "06" + { + "var_type" "FIELD_INTEGER" + "burn_duration" "6" + } + "07" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.75" + } + "08" + { + "var_type" "FIELD_FLOAT" + "burn_interval" "1.0" + } + "09" + { + "var_type" "FIELD_FLOAT" + "land_time" ".5" + } + "10" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "315" + } + "11" + { + "var_type" "FIELD_FLOAT" + "max_duration" "2.5" + } + "12" + { + "var_type" "FIELD_INTEGER" + "impact_damage_buildings" "75" + } + "13" + { + "var_type" "FIELD_INTEGER" + "impact_damage_units" "150" + } + } + "ShouldBeSuggested" "1" + } + "item_invis_sword" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "FightRecapLevel" "1" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "28.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "75" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "152" + "ItemQuality" "epic" + "ItemCost" "3000" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;attack_speed;movespeed;hard_to_tag" + "ItemAliases" "sb;invis;shadow blade;silver edge" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "70" + } + "03" + { + "var_type" "FIELD_FLOAT" + "windwalk_duration" "14.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "windwalk_movement_speed" "20" + } + "05" + { + "var_type" "FIELD_FLOAT" + "windwalk_fade_time" "0.3" + } + "06" + { + "var_type" "FIELD_INTEGER" + "windwalk_bonus_damage" "175" + } + } + "AbilitySharedCooldown" "shadow_blade" + "ShouldBeSuggested" "1" + } + "item_basher" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "2.3" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "143" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2950" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;str;hard_to_tag" + "ItemAliases" "skull basher" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bash_chance_melee" "50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bash_chance_ranged" "20" + } + "05" + { + "var_type" "FIELD_FLOAT" + "bash_duration" "1.5" + } + "06" + { + "var_type" "FIELD_FLOAT" + "bash_cooldown" "2.3" + } + "07" + { + "var_type" "FIELD_INTEGER" + "bonus_chance_damage" "100" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "ShouldBeSuggested" "1" + } + "item_broom_handle" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "355" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "melee_attack_range" "100" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "24" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "6" + } + } + "ItemIsNeutralDrop" "1" + } + "item_ocean_heart" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "354" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "all_stats" "10" + } + "02" + { + "var_type" "FIELD_FLOAT" + "water_hp_regen" "24" + } + "03" + { + "var_type" "FIELD_FLOAT" + "water_mp_regen" "12" + } + } + "ItemIsNeutralDrop" "1" + } + "item_keen_optic" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "287" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cast_range_bonus" "225" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "3.75" + } + } + "ItemIsNeutralDrop" "1" + } + + "item_monkey_king_bar" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "135" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "4300" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;attack_speed;hard_to_tag" + "ItemAliases" "mkb;monkey king bar" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "84" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "70" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_chance" "75" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_chance_damage" "200" + } + } + "ShouldBeSuggested" "1" + } + "item_bfury" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_TREE | DOTA_UNIT_TARGET_CUSTOM" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_CUSTOM" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "4.0" + "AbilityCastRange" "350" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "145" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "4180" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;health_regen;mana_regen;hard_to_tag" + "ItemAliases" "bf;battle fury" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "110" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "22.5" + } + "03" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "7.75" + } + "04" + { + "var_type" "FIELD_INTEGER" + "cleave_damage_percent" "70" + } + "05" + { + "var_type" "FIELD_INTEGER" + "cleave_damage_percent_creep" "70" + } + "06" + { + "var_type" "FIELD_INTEGER" + "quelling_bonus" "32" + } + "07" + { + "var_type" "FIELD_INTEGER" + "quelling_bonus_ranged" "20" + } + "08" + { + "var_type" "FIELD_INTEGER" + "cleave_starting_width" "150" + } + "09" + { + "var_type" "FIELD_INTEGER" + "cleave_ending_width" "360" + } + "10" + { + "var_type" "FIELD_INTEGER" + "cleave_distance" "650" + } + } + "ShouldBeSuggested" "1" + } + "item_quelling_blade" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_TREE | DOTA_UNIT_TARGET_CUSTOM" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_CUSTOM" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "4.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + "AbilityCastRange" "350" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "11" + "ItemQuality" "component" + "Model" "models/props_gameplay/quelling_blade.vmdl" + "ItemCost" "130" + "ItemShopTags" "damage" + "ItemAliases" "qb;quelling blade" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_bonus" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_bonus_ranged" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "quelling_range_tooltip" "350" + } + } + // "SideShop" "1" + "ShouldBeSuggested" "1" + "ShouldBeInitiallySuggested" "1" + } + "item_branches" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "0.0" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "400" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "16" + "ItemQuality" "consumable" + "Model" "models/props_gameplay/branch.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "50" + "ItemShopTags" "agi;int;str" + "ItemAliases" "gg branch;iron branch" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "tree_duration" "20" + } + } + "ShouldBeInitiallySuggested" "1" + } + "item_gauntlets" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "13" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "145" + "ItemShopTags" "str" + "ItemAliases" "gauntlets of strength" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "6" + } + } + "ShouldBeInitiallySuggested" "1" + } + "item_slippers" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "14" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "145" + "ItemShopTags" "agi" + "ItemAliases" "slippers of agility" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "6" + } + } + "ShouldBeInitiallySuggested" "1" + } + "item_mantle" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "15" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "145" + "ItemShopTags" "int" + "ItemAliases" "mantle of intelligence" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "6" + } + } + "ShouldBeInitiallySuggested" "1" + } + "item_circlet" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "20" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "155" + "ItemShopTags" "agi;int;str" + "ItemAliases" "circlet" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "4" + } + } + "ShouldBeInitiallySuggested" "1" + } + "item_belt_of_strength" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "17" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "450" + "ItemShopTags" "str" + "ItemAliases" "belt of strength" + // "SideShop" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "12" + } + } + } + "item_boots_of_elves" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "18" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "450" + "ItemShopTags" "agi" + "ItemAliases" "band of elvenskin" + // "SideShop" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "12" + } + } + } + "item_robe" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "19" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "450" + "ItemShopTags" "int" + "ItemAliases" "robe of the magi" + // "SideShop" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "12" + } + } + } + + "item_crown" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "261" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "450" + "ItemShopTags" "agi;int;str" + "ItemAliases" "crown" + // "SideShop" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "8" + } + } + "ShouldBeInitiallySuggested" "1" + } + "item_ogre_axe" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "21" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemShopTags" "str" + "ItemAliases" "ogre club" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + } + } + + // ================================================================================================================= + // Blade of Alacrity + // ================================================================================================================= + "item_blade_of_alacrity" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "22" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemShopTags" "agi" + "ItemAliases" "blade of alacrity" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "20" + } + } + } + + // ================================================================================================================= + // Staff of Wizardry + // ================================================================================================================= + "item_staff_of_wizardry" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "23" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemShopTags" "int" + "ItemAliases" "staff of wizardry" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "20" + } + } + } + + "item_ethereal_blade" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY | DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES" + "FightRecapLevel" "1" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "20.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "176" + "ItemQuality" "epic" + "ItemCost" "4500" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "agi;str;int;hard_to_tag" + "ItemAliases" "eb;ethereal blade;eblade" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "80" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "blast_movement_slow" "-80" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration" "4.0" + } + "06" + { + "var_type" "FIELD_FLOAT" + "blast_agility_multiplier" "3.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "blast_damage_base" "250" + } + "08" + { + "var_type" "FIELD_FLOAT" + "duration_ally" "4.0" + } + "09" + { + "var_type" "FIELD_INTEGER" + "ethereal_damage_bonus" "-40" + } + "10" + { + "var_type" "FIELD_INTEGER" + "projectile_speed" "1275" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySharedCooldown" "ethereal" + "ShouldBeSuggested" "1" + } + "item_radiance" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_TOGGLE" + "AbilityCastRange" "700" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "137" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "5150" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage" + "ItemAliases" "radiance" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "120" + } + "02" + { + "var_type" "FIELD_INTEGER" + "aura_damage" "120" + } + "03" + { + "var_type" "FIELD_INTEGER" + "aura_damage_illusions" "70" + } + "04" + { + "var_type" "FIELD_INTEGER" + "blind_pct" "34" + } + "05" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "700" + } + } + "ShouldBeSuggested" "1" + } + "item_butterfly" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "139" + "ItemQuality" "epic" + // "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "5275" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "agi;damage;evasion;attack_speed" + "ItemAliases" "bfly;butterfly" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_evasion" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "60" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "50" + } + } + "ShouldBeSuggested" "1" + } + "item_silver_edge" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "FightRecapLevel" "1" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "22.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "75" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "249" + "ItemQuality" "epic" + "ItemCost" "6100" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;attack_speed;movespeed;hard_to_tag" + "ItemAliases" "sb;invis;shadow blade" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "80" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "90" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "24" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "20" + } + "05" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "4.5" + } + "06" + { + "var_type" "FIELD_FLOAT" + "windwalk_duration" "14.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "windwalk_movement_speed" "25" + } + "08" + { + "var_type" "FIELD_FLOAT" + "windwalk_fade_time" "0.3" + } + "09" + { + "var_type" "FIELD_INTEGER" + "windwalk_bonus_damage" "175" + } + "10" + { + "var_type" "FIELD_INTEGER" + "backstab_reduction" "-50" + } + "11" + { + "var_type" "FIELD_FLOAT" + "backstab_duration" "4" + } + "12" + { + "var_type" "FIELD_INTEGER" + "movement_slow" "100" + } + "13" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "0.8" + } + "14" + { + "var_type" "FIELD_FLOAT" + "echo_cooldown" "5.0" + } + } + "AbilitySharedCooldown" "shadow_blade" + "ShouldBeSuggested" "1" + } + "item_abyssal_blade" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + "FightRecapLevel" "1" + "AbilityCastPoint" "0.0" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "75" + "AbilityCastRange" "600" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "208" + "ItemQuality" "epic" + "ItemCost" "6625" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;str;hard_to_tag" + "ItemAliases" "abyssal blade" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "500" + } + "03" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "30" + } + "04" + { + "var_type" "FIELD_INTEGER" + "block_damage_melee" "140" + } + "05" + { + "var_type" "FIELD_INTEGER" + "block_damage_ranged" "70" + } + "06" + { + "var_type" "FIELD_INTEGER" + "block_chance" "75" + } + "07" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + "08" + { + "var_type" "FIELD_INTEGER" + "bash_chance_melee" "50" + } + "09" + { + "var_type" "FIELD_INTEGER" + "bash_chance_ranged" "20" + } + "10" + { + "var_type" "FIELD_FLOAT" + "bash_duration" "1.5" + } + "11" + { + "var_type" "FIELD_FLOAT" + "bash_cooldown" "2.3" + } + "12" + { + "var_type" "FIELD_INTEGER" + "bonus_chance_damage" "200" + } + "13" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.8" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "ShouldBeSuggested" "1" + } + "item_bloodthorn" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "FightRecapLevel" "1" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "15.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "900" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "250" + "ItemQuality" "epic" + "ItemCost" "6475" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "int;attack_speed;damage;regen_mana;damage;hard_to_tag" + "ItemAliases" "orchid malevolence" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "180" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "60" + } + "04" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "16.5" + } + "05" + { + "var_type" "FIELD_FLOAT" + "silence_damage_percent" "60" + } + "06" + { + "var_type" "FIELD_FLOAT" + "silence_duration" "5" + } + "07" + { + "var_type" "FIELD_FLOAT" + "target_crit_multiplier" "180" + } + "08" + { + "var_type" "FIELD_FLOAT" + "tooltip_crit_chance" "100" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySharedCooldown" "orchid" + "ShouldBeSuggested" "1" + } + "item_dragon_lance" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "236" + "ItemQuality" "artifact" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1900" + "ItemShopTags" "damage" + "ItemAliases" "dragon lance" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "28" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "24" + } + "03" + { + "var_type" "FIELD_INTEGER" + "base_attack_range" "280" + } + } + "ShouldBeSuggested" "1" + } + "item_sange" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "162" + "ItemQuality" "artifact" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2050" + "ItemShopTags" "damage;str;unique" + "ItemAliases" "sange" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "32" + } + "02" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "16" + } + "03" + { + "var_type" "FIELD_INTEGER" + "hp_regen_amp" "24" + } + } + "ShouldBeSuggested" "1" + } + "item_yasha" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "170" + "ItemQuality" "artifact" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2050" + "ItemShopTags" "agi;attack_speed;move_speed" + "ItemAliases" "yasha" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "32" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "24" + } + "03" + { + "var_type" "FIELD_INTEGER" + "movement_speed_percent_bonus" "16" + } + } + "ShouldBeSuggested" "1" + } + "item_kaya" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "259" + "ItemQuality" "epic" + // Item Info^ + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2050" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS | DECLARE_PURCHASES_IN_SPEECH" + "ItemShopTags" "int;mana" + "ItemAliases" "ky;kaya" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "32" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spell_amp" "16" + } + "03" + { + "var_type" "FIELD_INTEGER" + "mana_regen_multiplier" "48" + } + "04" + { + "var_type" "FIELD_INTEGER" + "spell_lifesteal_amp" "48" + } + } + "ShouldBeSuggested" "1" + } + "item_echo_sabre" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "FightRecapLevel" "1" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.0" + "AbilityCooldown" "4.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "252" + "ItemQuality" "artifact" + "ItemCost" "2500" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "int;attack_speed;damage;regen_mana;damage;hard_to_tag" + "ItemAliases" "echo sabre" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "24" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "20" + } + "05" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "3.75" + } + "06" + { + "var_type" "FIELD_INTEGER" + "movement_slow" "100" + } + "07" + { + "var_type" "FIELD_INTEGER" + "attack_speed_slow" "0" + } + "08" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "0.8" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + "item_maelstrom" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "166" + "ItemQuality" "artifact" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "2700" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;attack_speed;unique" + "ItemAliases" "maelstrom" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "48" + } + "02" + { + "var_type" "FIELD_INTEGER" + "chain_chance" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "chain_damage" "280" + } + "04" + { + "var_type" "FIELD_INTEGER" + "chain_strikes" "8" + } + "05" + { + "var_type" "FIELD_INTEGER" + "chain_radius" "650" + } + "06" + { + "var_type" "FIELD_FLOAT" + "chain_delay" "0.25" + } + "07" + { + "var_type" "FIELD_FLOAT" + "chain_cooldown" "0.2" + } + } + "ShouldBeSuggested" "1" + } + "item_diffusal_blade" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "FightRecapLevel" "1" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "15.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "600" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "174" + "ItemQuality" "artifact" + "ItemCost" "3150" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemPermanent" "1" + "ItemShopTags" "agi;int;unique;hard_to_tag" + "ItemAliases" "diffusal blade 1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "feedback_mana_burn" "80" + } + "04" + { + "var_type" "FIELD_INTEGER" + "feedback_mana_burn_illusion_melee" "32" + } + "05" + { + "var_type" "FIELD_INTEGER" + "feedback_mana_burn_illusion_ranged" "16" + } + "06" + { + "var_type" "FIELD_INTEGER" + "purge_rate" "5" + } + "07" + { + "var_type" "FIELD_FLOAT" + "purge_root_duration" "3.0" + } + "08" + { + "var_type" "FIELD_FLOAT" + "purge_slow_duration" "4.0" + } + "09" + { + "var_type" "FIELD_FLOAT" + "damage_per_burn" "0.8" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "AbilitySharedCooldown" "diffusal" + "UpgradesItems" "item_diffusal_blade" + "UpgradeRecipe" "item_recipe_diffusal_blade" + "ShouldBeSuggested" "1" + } + "item_heavens_halberd" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "FightRecapLevel" "1" + "AbilityCastPoint" "0.0" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "18" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "100" + "AbilityCastRange" "600" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "210" + "ItemQuality" "artifact" + "ItemCost" "3450" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "str;damage;evasion" + "ItemAliases" "heaven's halberd" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_evasion" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "40" + } + "03" + { + "var_type" "FIELD_FLOAT" + "disarm_range" "5.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "disarm_melee" "3.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "40" + } + "06" + { + "var_type" "FIELD_INTEGER" + "hp_regen_amp" "60" + } + } + "ShouldBeSuggested" "1" + } + "item_desolator" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "168" + "ItemQuality" "artifact" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "3500" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;unique" + "ItemAliases" "desolator" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "120" + } + "02" + { + "var_type" "FIELD_INTEGER" + "corruption_armor" "-12" + } + "03" + { + "var_type" "FIELD_FLOAT" + "corruption_duration" "7.0" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + "item_kaya_and_sange" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "273" + "ItemQuality" "artifact" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "4100" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;str;agi;attack_speed;unique" + "ItemAliases" "snk;s&k;sk;sange and kaya" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "32" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "32" + } + "03" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "mana_regen_multiplier" "60" + } + "05" + { + "var_type" "FIELD_INTEGER" + "spell_amp" "32" + } + "06" + { + "var_type" "FIELD_INTEGER" + "hp_regen_amp" "30" + } + "07" + { + "var_type" "FIELD_INTEGER" + "spell_lifesteal_amp" "60" + } + } + "ShouldBeSuggested" "1" + } + "item_sange_and_yasha" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "154" + "ItemQuality" "artifact" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "4100" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;str;agi;attack_speed;unique" + "ItemAliases" "sny;s&y;sy;sange and yasha" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "32" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "32" + } + "03" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "32" + } + "05" + { + "var_type" "FIELD_INTEGER" + "movement_speed_percent_bonus" "20" + } + "06" + { + "var_type" "FIELD_INTEGER" + "hp_regen_amp" "30" + } + } + "ShouldBeSuggested" "1" + } + "item_satanic" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "FightRecapLevel" "2" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "35.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "156" + "ItemQuality" "artifact" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "5800" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;str;armor;unique;hard_to_tag" + "ItemAliases" "satanic" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "lifesteal_percent" "26" + } + "04" + { + "var_type" "FIELD_INTEGER" + "unholy_lifesteal_percent" "150" + } + "05" + { + "var_type" "FIELD_INTEGER" + "unholy_lifesteal_total_tooltip" "176" + } + "06" + { + "var_type" "FIELD_FLOAT" + "unholy_duration" "5.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "30" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + "item_skadi" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "160" + "ItemQuality" "artifact" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "5300" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "agi;str;int;hard_to_tag;mana_pool;health_pool;unique" + "ItemAliases" "eos;eye of skadi" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "450" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "500" + } + "04" + { + "var_type" "FIELD_INTEGER" + "cold_slow_melee" "-50" + } + "05" + { + "var_type" "FIELD_INTEGER" + "cold_slow_ranged" "-100" + } + "06" + { + "var_type" "FIELD_FLOAT" + "cold_duration" "3.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "heal_reduction" "80" + } + } + "ShouldBeSuggested" "1" + } + "item_mjollnir" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "35.0" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "158" + "ItemQuality" "artifact" + "ItemCost" "5600" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;attack_speed;unique" + "ItemAliases" "mjollnir" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "48" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "130" + } + "03" + { + "var_type" "FIELD_FLOAT" + "static_duration" "15.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "static_chance" "40" + } + "05" + { + "var_type" "FIELD_INTEGER" + "static_strikes" "8" + } + "06" + { + "var_type" "FIELD_INTEGER" + "static_damage" "400" + } + "07" + { + "var_type" "FIELD_INTEGER" + "static_primary_radius" "600" + } + "08" + { + "var_type" "FIELD_INTEGER" + "static_seconary_radius" "900" + } + "09" + { + "var_type" "FIELD_INTEGER" + "static_radius" "900" + } + "10" + { + "var_type" "FIELD_FLOAT" + "static_cooldown" "1.0" + } + "11" + { + "var_type" "FIELD_INTEGER" + "chain_chance" "25" + } + "12" + { + "var_type" "FIELD_INTEGER" + "chain_damage" "170" + } + "13" + { + "var_type" "FIELD_INTEGER" + "chain_strikes" "12" + } + "14" + { + "var_type" "FIELD_INTEGER" + "chain_radius" "650" + } + "15" + { + "var_type" "FIELD_FLOAT" + "chain_delay" "0.25" + } + "16" + { + "var_type" "FIELD_FLOAT" + "chain_cooldown" "0.2" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + + "item_yasha_and_kaya" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "277" + "ItemQuality" "artifact" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "4100" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;str;agi;attack_speed;unique" + "ItemAliases" "ynk;y&k;sk;yasha and kaya" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "32" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "32" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "32" + } + "04" + { + "var_type" "FIELD_INTEGER" + "mana_regen_multiplier" "60" + } + "05" + { + "var_type" "FIELD_INTEGER" + "movement_speed_percent_bonus" "20" + } + "06" + { + "var_type" "FIELD_INTEGER" + "spell_amp" "32" + } + "07" + { + "var_type" "FIELD_INTEGER" + "spell_lifesteal_amp" "60" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + "item_greater_crit" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "141" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "5150" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemShopTags" "damage;crit" + "ItemAliases" "daedalus" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "176" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "45" + } + "03" + { + "var_type" "FIELD_INTEGER" + "crit_multiplier" "340" + } + } + "ShouldBeSuggested" "1" + } + "item_lesser_crit" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "149" + "ItemQuality" "epic" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1950" + "ItemShopTags" "damage;crit" + "ItemAliases" "crystalys" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "64" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "45" + } + "03" + { + "var_type" "FIELD_INTEGER" + "crit_multiplier" "240" + } + "04" + { + "var_type" "FIELD_INTEGER" + "tooltip_crit_damage" "60" + } + } + "ShouldBeSuggested" "1" + } + "item_moon_shard" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CUSTOM" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "247" + "ItemQuality" "consumable" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "4000" + "ItemShopTags" "attack_speed" + "ItemAliases" "moon shard" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "280" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_night_vision" "800" + } + "03" + { + "var_type" "FIELD_INTEGER" + "consumed_bonus" "120" + } + "04" + { + "var_type" "FIELD_INTEGER" + "consumed_bonus_night_vision" "400" + } + } + "ShouldBeSuggested" "1" + } + "item_blight_stone" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "240" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "300" + "ItemShopTags" "hard_to_tag" + "ItemAliases" "blight stone" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "corruption_armor" "-4" + } + "02" + { + "var_type" "FIELD_FLOAT" + "corruption_duration" "16.0" + } + } + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeInitiallySuggested" "1" + } + "item_ghost" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "FightRecapLevel" "1" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "37" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "1500" + "ItemShopTags" "int;agi;str;hard_to_tag" + "ItemAliases" "ghost scepter" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "10" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "8.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "extra_spell_damage_percent" "-40" + } + } + "AbilitySharedCooldown" "ethereal" + "SpellDispellableType" "SPELL_DISPELLABLE_YES" + "ShouldBeSuggested" "1" + } + "item_lifesteal" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "26" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "900" + "ItemShopTags" "unique" + "ItemAliases" "morbid mask" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "lifesteal_percent" "30" + } + } + // "SideShop" "1" + "ShouldBeSuggested" "1" + } + "item_cloak" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "31" + "ItemQuality" "component" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "450" + "ItemShopTags" "magic_resist" + "ItemAliases" "cloak" + // "SideShop" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_magical_armor" "15" + } + "02" + { + "var_type" "FIELD_INTEGER" + "tooltip_resist" "30" + } + } + } + "item_boots" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "29" + "ItemQuality" "component" + "Model" "models/props_gameplay/boots_of_speed.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "500" + "ItemShopTags" "move_speed" + "ItemAliases" "boots of speed" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "100" + } + } + // "SideShop" "1" + "ShouldBeSuggested" "1" + "ShouldBeInitiallySuggested" "1" + } + + //================================================================================================================= + // Item Arcane Fragments + //================================================================================================================= + "item_arcane_fragments" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "item_arcane_fragments" + "ScriptFile" "items/item_arcane_fragments" + "Model" "models/ui/compendium_points/compendium_points_aghanim.vmdl" + "Skin" "4" + "Effect" "particles/ingame_arcane_fragments.vpcf" + "WorldDropSound" "Item.ArcaneFragmentsDropped" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "ItemKillable" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemKillable" "0" + "ItemCastOnPickup" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + + //================================================================================================================= + // Health Potion + //================================================================================================================= + "item_health_potion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "item_health_potion" + "ScriptFile" "items/item_health_potion" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/bottle_rejuvenation.vmdl" + "ItemKillable" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemKillable" "0" + "ItemCastOnPickup" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "hp_restore_pct" "15" + } + } + } + + //================================================================================================================= + // Mana Potion + //================================================================================================================= + "item_mana_potion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "item_mana_potion" + "ScriptFile" "items/item_mana_potion" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/bottle_mango001.vmdl" + "ItemKillable" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemKillable" "0" + "ItemCastOnPickup" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "mana_restore_pct" "15" + } + } + } + + + //================================================================================================================= + // Bag of Gold + //================================================================================================================= + "item_bag_of_gold" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityName" "item_bag_of_gold" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/gold_bag.vmdl" + "ItemKillable" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemKillable" "0" + } + + //================================================================================================================= + // Holdout Tombstone + //================================================================================================================= + "item_tombstone" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityName" "item_tombstone" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "Model" "models/props_gameplay/tombstoneb01.vmdl" + "PingOverrideText" "DOTA_Chat_Tombstone_Pinged" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + "AbilityChannelTime" "4.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemCastOnPickup" "1" + "ItemKillable" "0" + } + + //================================================================================================================= + // Treasure Box + //================================================================================================================= + "item_treasure_box" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "treasure_box" + "ScriptFile" "items/item_treasure_box" + + "AbilityBehavior" "DOTA_ABILTIY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/bottle_rejuvenation.vmdl" + "ItemKillable" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "750" + "ItemPurchasable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemKillable" "0" + } + + //================================================================================================================= + // Life Rune + //================================================================================================================= + "item_life_rune" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "life_rune" + "ScriptFile" "items/item_life_rune" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/heart001.vmdl" + "ItemKillable" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemPurchasable" "1" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemKillable" "0" + "ItemCastOnPickup" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "4" + "ItemStockMax" "4" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + + //================================================================================================================= + // Small Scepter Fragment + //================================================================================================================= + "item_small_scepter_fragment" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "small_scepter_fragment" + "ScriptFile" "items/item_small_scepter_fragment" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/aghanim_scepter.vmdl" + "ItemKillable" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemPurchasable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemKillable" "0" + "ItemCastOnPickup" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + + //================================================================================================================= + // Tome Of Greater Knowledge + //================================================================================================================= + "item_tome_of_greater_knowledge" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "item_tome_of_knowledge" + "ScriptFile" "items/item_tome_of_greater_knowledge" + "Model" "models/gameplay/attrib_tome_xp.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "ItemKillable" "0" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemKillable" "0" + "ItemCastOnPickup" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + } + } + + + //================================================================================================================= + // Book of Strength + //================================================================================================================= + "item_book_of_strength" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + + "Model" "models/gameplay/attrib_tome_str.vmdl" + "skin" "1" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "600" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemPurchasable" "1" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemDisplayCharges" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "4" + "ItemStockMax" "4" + "ItemStockTime" "999999.0" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_stat" "3" + } + } + } + + //================================================================================================================= + // Book of Greater Strength + //================================================================================================================= + "item_book_of_greater_strength" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_book_of_strength" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + + "Model" "models/gameplay/attrib_tome_str.vmdl" + "skin" "1" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemPurchasable" "1" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemDisplayCharges" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "4" + "ItemStockMax" "4" + "ItemStockTime" "999999.0" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_stat" "5" + } + } + } + + //================================================================================================================= + // Book of Agility + //================================================================================================================= + "item_book_of_agility" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + + "Model" "models/gameplay/attrib_tome_agi.vmdl" + "skin" "2" + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "500" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemPurchasable" "1" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemDisplayCharges" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "4" + "ItemStockMax" "4" + "ItemStockTime" "999999.0" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_stat" "3" + } + } + } + + //================================================================================================================= + // Book of Greater Agility + //================================================================================================================= + "item_book_of_greater_agility" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_book_of_agility" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + + "Model" "models/gameplay/attrib_tome_agi.vmdl" + "skin" "2" + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemPurchasable" "0" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemDisplayCharges" "1" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_stat" "5" + } + } + } + + //================================================================================================================= + // Book of Intelligence + //================================================================================================================= + "item_book_of_intelligence" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "Model" "models/gameplay/attrib_tome_int.vmdl" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "500" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemPurchasable" "1" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemDisplayCharges" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "4" + "ItemStockMax" "4" + "ItemStockTime" "999999.0" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_stat" "3" + } + } + } + + //================================================================================================================= + // Book of Greater Intelligence + //================================================================================================================= + "item_book_of_greater_intelligence" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_book_of_intelligence" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "Model" "models/gameplay/attrib_tome_int.vmdl" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemPurchasable" "0" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemDisplayCharges" "1" + + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_stat" "5" + } + } + } + + + + //================================================================================================================= + // Creed of Omniscience + //================================================================================================================= + "item_creed_of_omniscience" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "creed_of_omniscience" + "ScriptFile" "items/item_creed_of_omniscience" + + "Model" "models/props_gameplay/treasure_chest001.vmdl" + "Effect" "particles/generic_gameplay/dropped_aegis.vpcf" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_xp" "25" + } + } + } + + //================================================================================================================= + // Oblivion's Locket + //================================================================================================================= + "item_oblivions_locket" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "oblivions_locket" + "ScriptFile" "items/item_oblivions_locket" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + "AbilityChannelTime" "1.0" + "AbilityCooldown" "10.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "600" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "extra_spell_damage_percent" "25" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "10" + } + } + } + "item_arcane_ring" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "40.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "349" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_intelligence" "20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "8" + } + "03" + { + "var_type" "FIELD_INTEGER" + "mana_restore" "150" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + } + "ItemIsNeutralDrop" "1" + } + "item_poor_mans_shield" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "71" + "ItemQuality" "common" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemShopTags" "agi;block" + "ItemAliases" "pms;poor man's shield" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "8" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_block_melee" "60" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_block_ranged" "40" + } + "04" + { + "var_type" "FIELD_INTEGER" + "block_chance" "100" + } + "05" + { + "var_type" "FIELD_INTEGER" + "block_chance_hero" "100" + } + } + "ItemIsNeutralDrop" "1" + } + "item_dragon_scale" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "358" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_hp_regen" "15" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_per_sec" "36" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "4" + } + } + "ItemIsNeutralDrop" "1" + } + "item_essence_ring" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25.0" + "AbilityManaCost" "200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "359" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_int" "12" + } + "02" + { + "var_type" "FIELD_FLOAT" + "mp_regen" "5.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "health_gain" "750" + } + "04" + { + "var_type" "FIELD_INTEGER" + "health_gain_duration" "15" + } + } + "ItemIsNeutralDrop" "1" + } + "item_enchanted_quiver" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "3.5" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "361" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_range" "400" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "600" + } + } + "ItemIsNeutralDrop" "1" + } + "item_pupils_gift" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "306" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "secondary_stats" "26" + } + } + "ItemIsNeutralDrop" "1" + } + "item_ring_of_aquila" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_TOGGLE" + "AbilityCastRange" "1200" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "212" + "ItemQuality" "rare" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemSellable" "0" + "ItemPurchasable" "0" + "ItemAliases" "roa;ring of aquila" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "14" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "6" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "18" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "6" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "1200" + } + "07" + { + "var_type" "FIELD_FLOAT" + "aura_mana_regen" "2.5" + } + "08" + { + "var_type" "FIELD_INTEGER" + "aura_bonus_armor" "4" + } + } + "ActiveDescriptionLine" "2" + "ShouldBeSuggested" "0" + "ItemIsNeutralDrop" "1" + // Sound + // ------------------------------------------------------------------------------------------------------------- + "UIPickupSound" "Item.PickUpRingShop" + "UIDropSound" "Item.DropRingShop" + "WorldDropSound" "Item.DropRingWorld" + } + "item_grove_bow" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "288" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_range_bonus" "200" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_speed_bonus" "30" + } + "03" + { + "var_type" "FIELD_INTEGER" + "magic_resistance_reduction" "24" + } + "04" + { + "var_type" "FIELD_INTEGER" + "debuff_duration" "6" + } + } + "ItemIsNeutralDrop" "1" + } + "item_craggy_coat" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "298" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "armor_bonus" "24" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "-25" + } + } + "ItemIsNeutralDrop" "1" + } + "item_nether_shawl" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "357" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_magic_resistance" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_spell_amp" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "5" + } + } + "ItemIsNeutralDrop" "1" + } + "item_imp_claw" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "4.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "334" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_multiplier" "250" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "48" + } + } + "ItemIsNeutralDrop" "1" + } + "item_vambrace" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "331" + "ItemQuality" "common" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemShopTags" "damage;int;agi;str" + "ItemAliases" "bracer" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_primary_stat" "20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_secondary_stat" "10" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_spell_amp" "12" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_magic_resistance" "20" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "20" + } + } + "ItemIsNeutralDrop" "1" + } + "item_vampire_fangs" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "297" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_lifesteal" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spell_lifesteal" "12" + } + "03" + { + "var_type" "FIELD_INTEGER" + "night_vision" "500" + } + } + "ItemIsNeutralDrop" "1" + } + "item_greater_faerie_fire" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityCooldown" "10.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "299" + "ItemQuality" "consumable" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemPermanent" "0" + "ItemInitialCharges" "3" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "80" + } + "02" + { + "var_type" "FIELD_INTEGER" + "hp_restore" "900" + } + } + "ItemIsNeutralDrop" "1" + "IsTempestDoubleClonable" "0" + } + "item_quickening_charm" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "289" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_cooldown" "26" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_health_regen" "18" + } + } + "ItemIsNeutralDrop" "1" + } + "item_titan_sliver" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "381" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "base_attack_damage" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "magic_resistance" "32" + } + "03" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "24" + } + } + "ItemIsNeutralDrop" "1" + } + "item_orb_of_destruction" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "378" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "armor_reduction" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "slow_melee" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "slow_range" "30" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration" "4" + } + } + "ItemIsNeutralDrop" "1" + } + "item_paladin_sword" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "376" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_lifesteal" "32" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_amp" "28" + } + } + "ItemIsNeutralDrop" "1" + } + "item_havoc_hammer" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "364" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "36" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "400" + } + "04" + { + "var_type" "FIELD_INTEGER" + "slow" "50" + } + "05" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "3" + } + "06" + { + "var_type" "FIELD_INTEGER" + "angle" "360" + } + "07" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.3" + } + "08" + { + "var_type" "FIELD_FLOAT" + "knockback_distance" "250" + } + "09" + { + "var_type" "FIELD_INTEGER" + "nuke_base_dmg" "550" + } + "10" + { + "var_type" "FIELD_FLOAT" + "nuke_str_dmg" "2" + } + } + "ItemIsNeutralDrop" "1" + } + "item_witless_shako" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "330" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "max_health" "2400" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_mana" "800" + } + } + "ItemIsNeutralDrop" "1" + } + "item_panic_button" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "365" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_health" "800" + } + "02" + { + "var_type" "FIELD_INTEGER" + "heal" "800" + } + "03" + { + "var_type" "FIELD_FLOAT" + "health_threshold" "25" + } + } + "ItemIsNeutralDrop" "1" + } + "item_illusionsts_cape" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "363" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_damage_aura" "20" + } + "02" + { + "var_type" "FIELD_FLOAT" + "illusion_duration" "30" + } + "03" + { + "var_type" "FIELD_INTEGER" + "outgoing_damage" "-25" + } + "04" + { + "var_type" "FIELD_INTEGER" + "outgoing_damage_tooltip" "75" + } + "05" + { + "var_type" "FIELD_INTEGER" + "incoming_damage" "50" + } + "06" + { + "var_type" "FIELD_INTEGER" + "tooltip_incoming_damage_total_pct" "150" + } + "07" + { + "var_type" "FIELD_INTEGER" + "bonus_agi" "28" + } + "08" + { + "var_type" "FIELD_INTEGER" + "bonus_str" "28" + } + } + "ItemIsNeutralDrop" "1" + } + "item_minotaur_horn" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "16.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "377" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "40" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "4" + } + } + "ItemIsNeutralDrop" "1" + } + "item_phoenix_ash" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "293" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "health_pct" "100" + } + } + "ItemIsNeutralDrop" "1" + } + "item_spell_prism" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "311" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_cooldown" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "24" + } + "03" + { + "var_type" "FIELD_FLOAT" + "mana_regen" "8" + } + } + "ItemIsNeutralDrop" "1" + } + "item_timeless_relic" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "300" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "debuff_amp" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spell_amp" "30" + } + } + "ItemIsNeutralDrop" "1" + } + "item_ballista" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "367" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_range_bonus" "400" + } + "02" + { + "var_type" "FIELD_INTEGER" + "knockback_distance" "75" + } + "03" + { + "var_type" "FIELD_FLOAT" + "knockback_duration" "0.3" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "80" + } + } + "ItemIsNeutralDrop" "1" + } + "item_demonicon" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30.0" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "370" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "60" + } + "03" + { + "var_type" "FIELD_FLOAT" + "summon_duration" "120" + } + } + "ItemIsNeutralDrop" "1" + } + "item_force_boots" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10.0" + "AbilityManaCost" "100" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "291" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "140" + } + "02" + { + "var_type" "FIELD_INTEGER" + "push_length" "800" + } + "03" + { + "var_type" "FIELD_FLOAT" + "push_duration" "0.5" + } + } + "ItemIsNeutralDrop" "1" + } + "item_mirror_shield" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "301" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "reflect_chance" "75" + } + "02" + { + "var_type" "FIELD_INTEGER" + "all_stats" "40" + } + "03" + { + "var_type" "FIELD_FLOAT" + "block_cooldown" "8.0" + } + } + "ItemIsNeutralDrop" "1" + } + "item_apex" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "366" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "primary_stat" "150" + } + } + "ItemIsNeutralDrop" "1" + } + "item_desolator_2" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "292" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "150" + } + "02" + { + "var_type" "FIELD_INTEGER" + "corruption_armor" "-20" + } + "03" + { + "var_type" "FIELD_FLOAT" + "corruption_duration" "7.0" + } + } + "ItemIsNeutralDrop" "1" + } + "item_ex_machina" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "45.0" + "AbilityManaCost" "100" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "374" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "40" + } + } + "ItemIsNeutralDrop" "1" + } + "item_faded_broach" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "375" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "400" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "60" + } + } + "ItemIsNeutralDrop" "1" + } + + //================================================================================================================= + // Pelt of the Old Wolf + //================================================================================================================= + "item_pelt_of_the_old_wolf" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "pelt_of_the_old_wolf" + "ScriptFile" "items/item_pelt_of_the_old_wolf" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1250" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "10" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_move_speed" "70" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_evasion" "30" + } + } + } + + //================================================================================================================= + // Paw of Lucius + //================================================================================================================= + "item_paw_of_lucius" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "paw_of_lucius" + "ScriptFile" "items/item_paw_of_lucius" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1250" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "40" + } + "04" + { + "var_type" "FIELD_INTEGER" + "rupture_chance" "50" + } + "05" + { + "var_type" "FIELD_INTEGER" + "movement_damage_pct" "40" + } + "06" + { + "var_type" "FIELD_INTEGER" + "damage_cap_amount" "400" + } + "07" + { + "var_type" "FIELD_FLOAT" + "damage_cap_interval" "0.25" + } + "08" + { + "var_type" "FIELD_FLOAT" + "rupture_duration" "5.0" + } + } + } + + //================================================================================================================= + // Longclaw's Amulet + //================================================================================================================= + "item_longclaws_amulet" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "longclaws_amulet" + "ScriptFile" "items/item_longclaws_amulet" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "750" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spell_lifesteal_pct" "6" + } + "03" + { + "var_type" "FIELD_INTEGER" + "cooldown_reduction_pct" "12" + } + "04" + { + "var_type" "FIELD_INTEGER" + "mana_cost_reduction_pct" "12" + } + } + } + + //================================================================================================================= + // Bogdugg's Cudgel + //================================================================================================================= + "item_bogduggs_cudgel" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "bogduggs_cudgel" + "ScriptFile" "items/item_bogduggs_cudgel" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "3000" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "40" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "40" + } + "04" + { + "var_type" "FIELD_INTEGER" + "base_attack_time_penalty_pct" "50" + } + "05" + { + "var_type" "FIELD_INTEGER" + "attack_speed_penalty_pct" "50" + } + "06" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "400" + } + "07" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.5" + } + } + } + + //================================================================================================================= + // Bogdugg's Baldric + //================================================================================================================= + "item_bogduggs_baldric" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "bogduggs_baldric" + "ScriptFile" "items/item_bogduggs_baldric" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1250" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "25" + } + "03" + { + "var_type" "FIELD_INTEGER" + "disable_resist_pct" "75" + } + "04" + { + "var_type" "FIELD_INTEGER" + "move_speed_penalty" "30" + } + } + } + + //================================================================================================================= + // Bogdugg's Lucky Femur + //================================================================================================================= + "item_bogduggs_lucky_femur" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "bogduggs_lucky_femur" + "ScriptFile" "items/item_bogduggs_lucky_femur" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "3250" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_mana_penalty" "400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "intelligence_penalty" "10" + } + "04" + { + "var_type" "FIELD_INTEGER" + "mana_regen_sec" "10" + } + "05" + { + "var_type" "FIELD_INTEGER" + "refresh_pct" "50" + } + } + } + + //================================================================================================================= + // Sign of the Arachnid + //================================================================================================================= + "item_sign_of_the_arachnid" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "sign_of_the_arachnid" + "ScriptFile" "items/item_sign_of_the_arachnid" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "2500" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "30" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_move_speed_pct" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "40" + } + "05" + { + "var_type" "FIELD_INTEGER" + "radius" "500" + } + } + } + + //================================================================================================================= + // Unhallowed Icon + //================================================================================================================= + "item_unhallowed_icon" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "unhallowed_icon" + "ScriptFile" "items/item_unhallowed_icon" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "5000" + "ItemPurchasable" "0" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "lifesteal_pct" "15" + } + "04" + { + "var_type" "FIELD_INTEGER" + "hp_regen" "15" + } + "05" + { + "var_type" "FIELD_INTEGER" + "radius" "900" + } + } + } + + //================================================================================================================= + // Preserved Skull + //================================================================================================================= + "item_preserved_skull" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "preserved_skull" + "ScriptFile" "items/item_preserved_skull" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "3000" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_intelligence" "30" + } + "03" + { + "var_type" "FIELD_INTEGER" + "cooldown_reduction_pct" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "aura_mana_regen" "15" + } + "05" + { + "var_type" "FIELD_INTEGER" + "radius" "900" + } + } + } + + //================================================================================================================= + // Treads of Ermacor + //================================================================================================================= + "item_treads_of_ermacor" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "treads_of_ermacor" + "ScriptFile" "items/item_treads_of_ermacor" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "5000" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "100" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "80" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "20" + } + } + } + + //================================================================================================================= + // Rhyzik's Eye + //================================================================================================================= + "item_rhyziks_eye" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "rhyziks_eye" + "ScriptFile" "items/item_rhyziks_eye" + + "Model" "models/props_gameplay/treasure_chest001.vmdl" + "Effect" "particles/generic_gameplay/dropped_aegis.vpcf" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage_pct" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_reduction" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "hp_regen_sec" "20" + } + "05" + { + "var_type" "FIELD_INTEGER" + "mana_regen_sec" "20" + } + "06" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "20" + } + } + } + + //================================================================================================================= + // Guardian Shell + //================================================================================================================= + "item_guardian_shell" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "guardian_shell" + "ScriptFile" "items/item_guardian_shell" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "4250" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "magic_resistance" "40" + } + } + } + + //================================================================================================================= + // Watcher's Gaze + //================================================================================================================= + "item_watchers_gaze" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "watchers_gaze" + "ScriptFile" "items/item_watchers_gaze" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "20.0" + "AbilityManaCost" "75" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "4250" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_stats" "40" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stone_duration" "4.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_physical_damage" "100" + } + "05" + { + "var_type" "FIELD_FLOAT" + "vision_cone" "0.08715" // 85 degree cone + } + } + } + + //================================================================================================================= + // Carapace of Qaldin + //================================================================================================================= + "item_carapace_of_qaldin" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "carapace_of_qaldin" + "ScriptFile" "items/item_carapace_of_qaldin" + + "Model" "models/props_gameplay/treasure_chest001.vmdl" + "Effect" "particles/generic_gameplay/dropped_aegis.vpcf" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_hp" "750" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_mana" "750" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_restore_pct" "100" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage_return_pct" "50" + } + } + } + + //================================================================================================================= + // The Caustic Finale + //================================================================================================================= + "item_the_caustic_finale" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "the_caustic_finale" + "ScriptFile" "items/item_the_caustic_finale" + + "Model" "models/props_gameplay/treasure_chest001.vmdl" + "Effect" "particles/generic_gameplay/dropped_aegis.vpcf" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "150" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "35" + } + "04" + { + "var_type" "FIELD_INTEGER" + "caustic_armor_reduction_pct" "5" + } + "05" + { + "var_type" "FIELD_FLOAT" + "caustic_duration" "3.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "caustic_radius" "300" + } + "07" + { + "var_type" "FIELD_INTEGER" + "caustic_damage" "300" + } + "08" + { + "var_type" "FIELD_INTEGER" + "max_stack_count" "5" + } + } + } + + //================================================================================================================= + // Winter's Embrace + //================================================================================================================= + "item_winter_embrace" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "winter_embrace" + "ScriptFile" "items/item_winter_embrace" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "750" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "6" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_intelligence" "15" + } + "04" + { + "var_type" "FIELD_INTEGER" + "movespeed_slow" "-40" + } + "05" + { + "var_type" "FIELD_INTEGER" + "attackspeed_slow" "-40" + } + "06" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "3.0" + } + } + } + + //================================================================================================================= + // Ice Dragon Maw + //================================================================================================================= + "item_ice_dragon_maw" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "ice_dragon_maw" + "ScriptFile" "items/item_ice_dragon_maw" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_range" "100" + } + "04" + { + "var_type" "FIELD_INTEGER" + "chance_to_freeze" "25" + } + "05" + { + "var_type" "FIELD_FLOAT" + "freeze_duration" "0.75" + } + "06" + { + "var_type" "FIELD_FLOAT" + "freeze_cooldown" "3.0" + } + } + } + + //================================================================================================================= + // Precious Egg + //================================================================================================================= + "item_precious_egg" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "precious_egg" + "ScriptFile" "items/item_precious_egg" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "600" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "10" + } + "03" + { + "var_type" "FIELD_INTEGER" + "chance_to_resist_death" "50" + } + } + } + + //================================================================================================================= + // Stony Coat + //================================================================================================================= + "item_stony_coat" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "stony_coat" + "ScriptFile" "items/item_stony_coat" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "3250" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "40" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "boulder_chance" "50" + } + "05" + { + "var_type" "FIELD_INTEGER" + "boulder_damage" "250" + } + "06" + { + "var_type" "FIELD_FLOAT" + "boulder_stun_duration" "1.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "boulder_speed" "800" + } + + } + } + + //================================================================================================================= + // Stonework Pendant + //================================================================================================================= + "item_stonework_pendant" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "stonework_pendant" + "ScriptFile" "items/item_stonework_pendant" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "3750" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spell_lifesteal" "10" + } + "03" + { + "var_type" "FIELD_FLOAT" + "hp_cost_multiplier" "3.0" + } + } + } + + //================================================================================================================= + // Gravel Foot + //================================================================================================================= + "item_gravel_foot" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "gravel_foot" + "ScriptFile" "items/item_gravel_foot" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "3000" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "100" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_block" "50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_all_stats" "16" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_hp_regen" "24" + } + } + } + + //================================================================================================================= + // Wand of the Brine + //================================================================================================================= + "item_wand_of_the_brine" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "wand_of_the_brine" + "ScriptFile" "items/item_wand_of_the_brine" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "700" + "AbilityCastPoint" "0.2" + "AbilityCooldown" "25.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "4750" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_intelligence" "100" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_mana_regen_pct" "250" + } + "04" + { + "var_type" "FIELD_FLOAT" + "bubble_duration" "3.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bubble_heal_per_tick" "300" + } + "06" + { + "var_type" "FIELD_FLOAT" + "heal_tick_interval" "0.5" + } + } + } + "item_fallen_sky" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES" + "AbilityCooldown" "15.0" + // Stats + // ------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1600" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "371" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "4751" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "40" + } + "03" + { + "var_type" "FIELD_FLOAT" + "bonus_health_regen" "30.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "20.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "burn_dps_buildings" "50" + } + "06" + { + "var_type" "FIELD_INTEGER" + "burn_dps_units" "90" + } + "07" + { + "var_type" "FIELD_INTEGER" + "burn_duration" "6" + } + "08" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "2.0" + } + "09" + { + "var_type" "FIELD_FLOAT" + "burn_interval" "1.0" + } + "10" + { + "var_type" "FIELD_FLOAT" + "land_time" ".5" + } + "11" + { + "var_type" "FIELD_INTEGER" + "impact_radius" "315" + } + "12" + { + "var_type" "FIELD_FLOAT" + "max_duration" "2.5" + } + "13" + { + "var_type" "FIELD_INTEGER" + "impact_damage_buildings" "75" + } + "14" + { + "var_type" "FIELD_INTEGER" + "impact_damage_units" "150" + } + "15" + { + "var_type" "FIELD_FLOAT" + "blink_damage_cooldown" "3.0" + } + } + "ItemIsNeutralDrop" "1" + } + + //================================================================================================================= + // Slippers of the Abyss + //================================================================================================================= + "item_slippers_of_the_abyss" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "slippers_of_the_abyss" + "ScriptFile" "items/item_slippers_of_the_abyss" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "20.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "5500" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "110" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "30" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "30" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_atk_speed" "150" + } + "06" + { + "var_type" "FIELD_INTEGER" + "sprint_duration" "4" + } + "07" + { + "var_type" "FIELD_INTEGER" + "sprint_bonus_ms" "200" + } + //"08" + //{ + //"var_type" "FIELD_INTEGER" + //"sprint_bonus_dmg" "300" + //} + //"09" + //{ + //"var_type" "FIELD_INTEGER" + //"sprint_bonus_atk_speed" "200" + //} + } + } + + //================================================================================================================= + // Glimmerdark Shield + //================================================================================================================= + "item_glimmerdark_shield" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "ScriptFile" "items/item_glimmerdark_shield" + "AbilityTextureName" "glimmerdark_shield" + + "Model" "models/props_gameplay/treasure_chest001.vmdl" + "Effect" "particles/generic_gameplay/dropped_aegis.vpcf" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "700" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "30.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "20" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_health_regen" "80" + } + "06" + { + "var_type" "FIELD_INTEGER" + "bonus_armor" "40" + } + "07" + { + "var_type" "FIELD_INTEGER" + "prism_duration" "6" + } + "08" + { + "var_type" "FIELD_INTEGER" + "prism_bonus_magic_dmg" "-100" + } + "09" + { + "var_type" "FIELD_INTEGER" + "tooltip_prism_bonus_magic_dmg" "100" + } + } + } + + //================================================================================================================= + // Dredged Trident + //================================================================================================================= + "item_dredged_trident" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "dredged_trident" + "ScriptFile" "items/item_dredged_trident" + + "Model" "models/props_gameplay/treasure_chest001.vmdl" + "Effect" "particles/generic_gameplay/dropped_aegis.vpcf" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + //"AbilityCooldown" "5.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "160" + } + "03" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "35" + } + "04" + { + "var_type" "FIELD_INTEGER" + "crit_multiplier" "350" + } + } + } + "item_trident" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "369" + "Model" "models/props_gameplay/neutral_box.vmdl" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "60" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "60" + } + "04" + { + "var_type" "FIELD_INTEGER" + "status_resistance" "60" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "60" + } + "06" + { + "var_type" "FIELD_INTEGER" + "movement_speed_percent_bonus" "20" + } + "07" + { + "var_type" "FIELD_INTEGER" + "hp_regen_amp" "60" + } + "08" + { + "var_type" "FIELD_INTEGER" + "mana_regen_multiplier" "60" + } + "09" + { + "var_type" "FIELD_INTEGER" + "spell_amp" "60" + } + "10" + { + "var_type" "FIELD_INTEGER" + "spell_lifesteal_amp" "60" + } + } + "ItemIsNeutralDrop" "1" + } + + //================================================================================================================= + // Ambient Sorcery + //================================================================================================================= + "item_ambient_sorcery" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "AbilityTextureName" "ambient_sorcery" + "ScriptFile" "items/item_ambient_sorcery" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1500" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_intelligence" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "750" + } + "04" + { + "var_type" "FIELD_INTEGER" + "aura_magic_reduction" "-30" + } + "05" + { + "var_type" "FIELD_INTEGER" + "aura_magic_reduction_tooltip" "30" + } + } + } + + //================================================================================================================= + // Ogre Seal Totem + //================================================================================================================= + "item_ogre_seal_totem" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "ScriptFile" "items/item_ogre_seal_totem" + "AbilityTextureName" "ogre_seal_totem" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.3" + "AbilityCooldown" "12.0" + "AbilityManaCost" "50" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "16" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_hp" "400" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius" "275" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage" "500" + } + "06" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "2.0" + } + } + } + + //================================================================================================================= + // Bear Cloak + //================================================================================================================= + "item_bear_cloak" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "ScriptFile" "items/item_bear_cloak" + "AbilityTextureName" "bear_cloak" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "750" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_magic_resist" "35.0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "aura_bonus_magic_resist" "15.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "aura_radius" "900.0" + } + } + } + + //================================================================================================================= + // Lifestone + //================================================================================================================= + "item_lifestone" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "ScriptFile" "items/item_lifestone" + "AbilityTextureName" "lifestone" + + "Model" "models/props_gameplay/neutral_box.vmdl" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "1.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "2000" + "ItemPurchasable" "1" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_FLOAT" + "pact_interval" "0.5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "pact_hp_cost" "40" + } + "04" + { + "var_type" "FIELD_INTEGER" + "pact_mana_gained" "50" + } + "05" + { + "var_type" "FIELD_INTEGER" + "hp_regen" "10" + } + } + } + + //================================================================================================================= + // Corrupting Blade + //================================================================================================================= + "item_corrupting_blade" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "ScriptFile" "items/item_corrupting_blade" + "AbilityTextureName" "corrupting_blade" + + "Model" "models/props_gameplay/treasure_chest001.vmdl" + "Effect" "particles/generic_gameplay/dropped_aegis.vpcf" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "80" + } + "03" + { + "var_type" "FIELD_INTEGER" + "corruption_armor" "-14" + } + "04" + { + "var_type" "FIELD_FLOAT" + "corruption_duration" "15.0" + } + } + } + + //================================================================================================================= + // Greater Clarity + //================================================================================================================= + "item_greater_clarity" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/salve_blue.vmdl" + "BaseClass" "item_datadriven" + "AbilityTextureName" "item_greater_clarity" + "ItemKillable" "1" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "130" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + + "OnSpellStart" + { + "ApplyModifier" + { + "Target" "CURSOR_TARGET" + "ModifierName" "modifier_item_greater_clarity" + } + "FireSound" + { + "Target" "UNIT" + "EffectName" "DOTA_Item.ClarityPotion.Activate" + } + "SpendCharge" + {} + } + + "Modifiers" + { + "modifier_item_greater_clarity" + { + "TextureName" "item_greater_clarity" + "EffectName" "particles/items_fx/healing_clarity.vpcf" + "EffectAttachType" "follow_origin" + "Duration" "%buff_duration" + "Properties" + { + "MODIFIER_PROPERTY_MANA_REGEN_CONSTANT" "%mana_per_tick" + } + } + } + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "buff_duration" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "total_mana" "200" + } + "03" + { + "var_type" "FIELD_INTEGER" + "mana_per_tick" "15" // %total_mana / %buff_duration + } + } + } + + //================================================================================================================= + // Greater Salve + //================================================================================================================= + "item_greater_salve" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/salve_red.vmdl" + "BaseClass" "item_datadriven" + "AbilityTextureName" "item_greater_salve" + "ItemKillable" "1" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityCastPoint" "0.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + + "ItemCost" "275" + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemStackable" "1" + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + + "OnSpellStart" + { + "ApplyModifier" + { + "Target" "CURSOR_TARGET" + "ModifierName" "modifier_item_greater_salve" + } + "FireSound" + { + "Target" "UNIT" + "EffectName" "DOTA_Item.HealingSalve.Activate" + } + "SpendCharge" + {} + } + + "Modifiers" + { + "modifier_item_greater_salve" + { + "TextureName" "item_greater_salve" + "EffectName" "particles/items_fx/healing_flask.vpcf" + "EffectAttachType" "follow_origin" + "Duration" "%buff_duration" + "Properties" + { + "MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT" "%hp_per_tick" + } + } + } + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "buff_duration" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "total_hp" "1000" + } + "03" + { + "var_type" "FIELD_INTEGER" + "hp_per_tick" "100" // %total_mana / %buff_duration + } + } + } + + //================================================================================================================= + // Double Damage Potion + //================================================================================================================= + "item_double_damage_potion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "ScriptFile" "items/item_double_damage_potion" + "AbilityTextureName" "double_damage_potion" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/red_box.vmdl" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "5" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemKillable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemStackable" "1" + "ItemStackableMax" "5" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "buff_duration" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_bonus_pct" "100" + } + } + } + + //================================================================================================================= + // Spell Amp Potion + //================================================================================================================= + "item_spell_amp_potion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "ScriptFile" "items/item_spell_amp_potion" + "AbilityTextureName" "spell_amp_potion" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/red_box.vmdl" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "5" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemKillable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemStackable" "1" + "ItemStackableMax" "5" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "buff_duration" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spell_amp_bonus_pct" "100" + } + } + } + + //================================================================================================================= + // Evasion Potion + //================================================================================================================= + "item_evasion_potion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "ScriptFile" "items/item_evasion_potion" + "AbilityTextureName" "evasion_potion" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/red_box.vmdl" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "5" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemKillable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemStackable" "1" + "ItemStackableMax" "5" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "buff_duration" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "evasion_bonus_pct" "100" + } + } + } + + //================================================================================================================= + // Purification Potion + //================================================================================================================= + "item_purification_potion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "ScriptFile" "items/item_purification_potion" + "AbilityTextureName" "purification_potion" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + //"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_OPTIONAL_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_SUPPRESS_ASSOCIATED_CONSUMABLE" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "Model" "models/props_gameplay/red_box.vmdl" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.0" + //"AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "0.5" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "500" + "ItemPurchasable" "1" + "ItemKillable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemStackable" "1" + "ItemStackableMax" "5" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "360.0" + "ItemSellable" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "heal" "1000" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "260" + } + } + } + + //================================================================================================================= + // Ravage Potion + //================================================================================================================= + "item_ravage_potion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "aghsfort_ravage_potion" + "AbilityTextureName" "ravage_potion" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "Model" "models/props_gameplay/red_box.vmdl" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.3" + "AbilityCooldown" "3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityDamage" "600" + "AbilityManaCost" "0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "750" + "ItemPurchasable" "1" + "ItemKillable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemStackable" "1" + "ItemStackableMax" "5" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "360.0" + "ItemSellable" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1250" + } + "02" + { + "var_type" "FIELD_INTEGER" + "speed" "725" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "3.5" + } + } + } + + //================================================================================================================= + // Dragon Potion + //================================================================================================================= + "item_dragon_potion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "aghsfort_dragon_potion" + "AbilityTextureName" "dragon_potion" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "Model" "models/props_gameplay/red_box.vmdl" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_INVALID" + "AbilityCooldown" "80" + "AbilityManaCost" "0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1500" + "ItemPurchasable" "1" + "ItemKillable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemStackable" "1" + "ItemStackableMax" "5" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "360.0" + "ItemSellable" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_movement_speed" "25" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_range" "350" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_damage" "70" + } + "05" + { + "var_type" "FIELD_INTEGER" + "corrosive_breath_damage" "20" + } + "06" + { + "var_type" "FIELD_FLOAT" + "corrosive_breath_duration" "5.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "splash_radius" "300" + } + "08" + { + "var_type" "FIELD_INTEGER" + "splash_damage_percent" "80" + } + "09" + { + "var_type" "FIELD_INTEGER" + "frost_bonus_movement_speed" "-60" + } + "10" + { + "var_type" "FIELD_INTEGER" + "frost_bonus_attack_speed" "-60" + } + "11" + { + "var_type" "FIELD_FLOAT" + "frost_duration" "3.0" + } + "12" + { + "var_type" "FIELD_FLOAT" + "frost_aoe" "300" + } + "13" + { + "var_type" "FIELD_INTEGER" + "magic_resistance" "30" + } + "14" + { + "var_type" "FIELD_INTEGER" + "model_scale" "50" + } + } + } + + //================================================================================================================= + // Arcanist Potion + //================================================================================================================= + "item_arcanist_potion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "aghsfort_arcanist_potion" + "AbilityTextureName" "item_arcanist_potion" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "Model" "models/props_gameplay/red_box.vmdl" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_INVALID" + "AbilityCooldown" "3" + "AbilityManaCost" "0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "750" + "ItemPurchasable" "1" + "ItemKillable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemStackable" "1" + "ItemStackableMax" "5" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "360.0" + "ItemSellable" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "cooldown_reduction_pct" "40" + } + "03" + { + "var_type" "FIELD_INTEGER" + "manacost_reduction_pct" "40" + } + } + } + + //================================================================================================================= + // Echo Slam Potion + //================================================================================================================= + "item_echo_slam_potion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "aghsfort_echo_slam_potion" + "AbilityTextureName" "echo_slam_potion" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "Model" "models/props_gameplay/red_box.vmdl" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastAnimation" "ACT_INVALID" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "750" + "ItemPurchasable" "1" + "ItemKillable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemStackable" "1" + "ItemStackableMax" "5" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "360.0" + "ItemSellable" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "echo_slam_damage_range" "600" + "CalculateSpellDamageTooltip" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "echo_slam_echo_search_range" "600" + } + "03" + { + "var_type" "FIELD_INTEGER" + "echo_slam_echo_range" "600" + } + "04" + { + "var_type" "FIELD_INTEGER" + "echo_slam_echo_damage" "110" + } + "05" + { + "var_type" "FIELD_INTEGER" + "echo_slam_initial_damage" "180" + } + "06" + { + "var_type" "FIELD_FLOAT" + "spend_charge_delay" "3.0" + } + } + } + + //================================================================================================================= + // Torrent Effect Potion + //================================================================================================================= + "item_torrent_effect_potion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "ScriptFile" "items/item_torrent_effect_potion" + "AbilityTextureName" "torrent_effect_potion" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "Model" "models/props_gameplay/red_box.vmdl" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "0.5" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1250" + "ItemPurchasable" "1" + "ItemKillable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemStackable" "1" + "ItemStackableMax" "5" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "99999.0" + "ItemSellable" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "proc_chance" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "225" + } + "03" + { + "var_type" "FIELD_INTEGER" + "movespeed_bonus" "-35" + } + "04" + { + "var_type" "FIELD_FLOAT" + "slow_duration" "1" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stun_duration" "1.2" + } + "06" + { + "var_type" "FIELD_FLOAT" + "delay" "1.6" + } + "07" + { + "var_type" "FIELD_INTEGER" + "torrent_damage" "125" + } + "08" + { + "var_type" "FIELD_FLOAT" + "torrent_cooldown" "2.0" + } + } + } + + //================================================================================================================= + // Shadow Wave Effect Potion + //================================================================================================================= + "item_shadow_wave_effect_potion" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "aghsfort_shadow_wave_effect_potion" + "AbilityTextureName" "shadow_wave_effect_potion" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO" + "Model" "models/props_gameplay/red_box.vmdl" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "0.5" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemPurchasable" "1" + "ItemKillable" "0" + "ItemShopTags" "consumable" + "ItemQuality" "consumable" + "ItemShareability" "ITEM_FULLY_SHAREABLE_STACKING" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemStackable" "1" + "ItemStackableMax" "5" + + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "99999.0" + "ItemSellable" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "proc_chance" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "cast_range" "800" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bounce_radius" "475" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "185" + } + "05" + { + "var_type" "FIELD_INTEGER" + "max_targets" "6" + } + "06" + { + "var_type" "FIELD_INTEGER" + "tooltip_max_targets_inc_dazzle" "7" + } + "07" + { + "var_type" "FIELD_INTEGER" + "damage" "100" + } + } + } + + //================================================================================================================= + // Creature's Black King Bar + //================================================================================================================= + "item_creature_black_king_bar" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_black_king_bar" + "AbilityTextureName" "item_black_king_bar" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "FightRecapLevel" "1" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemShopTags" "" + "ItemQuality" "epic" + "ItemAliases" "" + "ItemSellable" "0" + "ItemDeclarations" "" + "ShouldBeSuggested" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "6.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_level" "6" + } + "05" + { + "var_type" "FIELD_INTEGER" + "model_scale" "30" // Percentage over model scale + } + } + } + + //================================================================================================================= + // Phoenix Creature's Sheepstick + //================================================================================================================= + "item_phoenix_sheepstick" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_sheepstick" + "AbilityTextureName" "item_sheepstick" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "FightRecapLevel" "2" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "800" + "AbilityCastPoint" "0.5" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "25.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemSellable" "0" + "AbilityManaCost" "0" + "ItemCost" "5575" + "ItemShopTags" "int;regen_mana;agi;hard_to_tag" + "ItemQuality" "rare" + "ItemAliases" "hex;sheepstick;scythe of vyse" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + "ShouldBeSuggested" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_intellect" "0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "bonus_mana_regen" "0.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "sheep_duration" "3.5" + } + "06" + { + "var_type" "FIELD_FLOAT" + "sheep_movement_speed" "140" + } + } + } + + //================================================================================================================= + // Amorphotic Shell + //================================================================================================================= + "item_amorphotic_shell" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_lua" + "ScriptFile" "items/item_amorphotic_shell" + "AbilityTextureName" "amorphotic_shell" + + "Model" "models/props_gameplay/treasure_chest001.vmdl" + "Effect" "particles/generic_gameplay/dropped_aegis.vpcf" + + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "0" + "ItemPurchasable" "0" + "ItemQuality" "" + "ItemStackable" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + "ItemPermanent" "0" + "ItemKillable" "0" + "CustomShop" "1" + "ItemIsNeutralDrop" "1" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "required_level" "1" + } + "02" + { + "var_type" "FIELD_FLOAT" + "amoeba_duration" "20.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "amoeba_chance" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_strength" "30" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_intelligence" "20" + } + "06" + { + "var_type" "FIELD_INTEGER" + "bonus_agility" "10" + } + } + } + + //================================================================================================================= + // Aghs Fort Refresher Shard + //================================================================================================================= + "item_aghsfort_refresher_shard" + { + // General + //------------------------------------------------------------------------------------------------------------- + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "FightRecapLevel" "2" + "Model" "models/props_gameplay/refresher_shard.vmdl" + "Effect" "particles/generic_gameplay/dropped_refresher_shard.vpcf" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "200.0" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "ItemCost" "1000" + "ItemShopTags" "" + "ItemQuality" "consumable" + + "ItemPurchasable" "1" + "CustomShop" "1" + "RequiresCustomShop" "1" + "RequiredCustomShopName" "boss_shop" + "ItemStockInitial" "1" + "ItemStockMax" "1" + "ItemStockTime" "999999.0" + "ItemSellable" "0" + + "ItemStackable" "0" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPermanent" "0" + "ItemInitialCharges" "1" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS" + "ItemContributesToNetWorthWhenDropped" "0" + "IsTempestDoubleClonable" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "health_restore_percent" "0" + } + } + } + + //================================================================================================================= + // Drow Ranger Shadow Blade Invisibility Sword + //================================================================================================================= + "item_aghsfort_drow_ranger_invis_sword" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_invis_sword" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "FightRecapLevel" "1" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "2.0" + "AbilitySharedCooldown" "shadow_blade" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + "ItemCost" "2800" + "ItemShopTags" "damage;attack_speed;movespeed;hard_to_tag" + "ItemQuality" "epic" + "ItemAliases" "sb;invis;shadow blade;silver edge" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "27" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "30" + } + "03" + { + "var_type" "FIELD_FLOAT" + "windwalk_duration" "14.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "windwalk_movement_speed" "20" + } + "05" + { + "var_type" "FIELD_FLOAT" + "windwalk_fade_time" "0.3" + } + "06" + { + "var_type" "FIELD_INTEGER" + "windwalk_bonus_damage" "25" + } + } + } + "item_wind_lace" + { + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // General + // ------------------------------------------------------------------------------------------------------------- + // unique ID number for this item. Do not change this once established or it will invalidate collected stats. + "ID" "244" + "ItemQuality" "component" + // "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET" + // Item Info + // ------------------------------------------------------------------------------------------------------------- + "ItemCost" "250" + "ItemPermanent" "1" + "ItemShopTags" "armor" + "ItemAliases" "wind lace" + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "movement_speed" "40" + } + } + // "ItemInitialCharges" "3" + // "ItemRequiresCharges" "1" + "ShouldBeInitiallySuggested" "1" + // Sounden + // ------------------------------------------------------------------------------------------------------------- + "UIPickupSound" "Item.PickUpRingShop" + "UIDropSound" "Item.DropRingShop" + "WorldDropSound" "Item.DropRingWorld" + } + + //================================================================================================================= + // Bandit Archer Shadow Blade + //================================================================================================================= + "item_bandit_archer_shadow_blade" + { + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "item_invis_sword" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL" + "FightRecapLevel" "1" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "22.0" + "AbilitySharedCooldown" "shadow_blade" + + // Item Info + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + "ItemCost" "2800" + "ItemShopTags" "damage;attack_speed;movespeed;hard_to_tag" + "ItemQuality" "epic" + "ItemAliases" "sb;invis;shadow blade;silver edge" + "ItemDeclarations" "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS" + + "ItemPurchasable" "0" + "ShouldBeSuggested" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_speed" "0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "windwalk_duration" "7.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "windwalk_movement_speed" "20" + } + "05" + { + "var_type" "FIELD_FLOAT" + "windwalk_fade_time" "0.3" + } + "06" + { + "var_type" "FIELD_INTEGER" + "windwalk_bonus_damage" "0" + } + } + } + +} \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/npc/npc_neutral_items_custom.txt b/aghanim_singleplayer/scripts/npc/npc_neutral_items_custom.txt new file mode 100755 index 0000000..f78052e --- /dev/null +++ b/aghanim_singleplayer/scripts/npc/npc_neutral_items_custom.txt @@ -0,0 +1,97 @@ +"neutral_items" +{ + "1" + { + + "items" + { + "item_broom_handle" "1" + "item_keen_optic" "1" + "item_ocean_heart" "1" + "item_oblivions_locket" "1" + "item_precious_egg" "1" + "item_faded_broach" "1" + "item_longclaws_amulet" "1" + "item_bear_cloak" "1" + "item_arcane_ring" "1" + "item_poor_mans_shield" "1" + "item_winter_embrace" "1" + } + } + "2" + { + "items" + { + "item_ogre_seal_totem" "1" + "item_dragon_scale" "1" + "item_essence_ring" "1" + "item_enchanted_quiver" "1" + "item_pupils_gift" "1" + "item_ring_of_aquila" "1" + "item_grove_bow" "1" + "item_bogduggs_baldric" "1" + "item_craggy_coat" "1" + "item_nether_shawl" "1" + "item_imp_claw" "1" + "item_ambient_sorcery" "1" + "item_vambrace" "1" + "item_paw_of_lucius" "1" + "item_pelt_of_the_old_wolf" "1" + } + } + "3" + { + "items" + { + + "item_vampire_fangs" "1" + "item_greater_faerie_fire" "1" + "item_quickening_charm" "1" + "item_titan_sliver" "1" + "item_sign_of_the_arachnid" "1" + "item_preserved_skull" "1" + "item_gravel_foot" "1" + "item_orb_of_destruction" "1" + "item_paladin_sword" "1" + "item_havoc_hammer" "1" + "item_witless_shako" "1" + "item_bogduggs_cudgel" "1" + } + } + "4" + { + + "items" + { + "item_stony_coat" "1" + "item_panic_button" "1" + "item_bogduggs_lucky_femur" "1" + "item_illusionsts_cape" "1" + "item_minotaur_horn" "1" + "item_phoenix_ash" "1" + "item_stonework_pendant" "1" + "item_spell_prism" "1" + "item_timeless_relic" "1" + "item_watchers_gaze" "1" + "item_guardian_shell" "1" + } + } + "5" + { + "items" + { + "item_ballista" "1" + "item_demonicon" "1" + "item_force_boots" "1" + "item_mirror_shield" "1" + "item_treads_of_ermacor" "1" + "item_wand_of_the_brine" "1" + "item_fallen_sky" "1" + "item_apex" "1" + "item_slippers_of_the_abyss" "1" + "item_desolator_2" "1" + "item_ex_machina" "1" + "item_trident" "1" + } + } +} \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/npc/npc_units_custom.txt b/aghanim_singleplayer/scripts/npc/npc_units_custom.txt new file mode 100755 index 0000000..d762f5e --- /dev/null +++ b/aghanim_singleplayer/scripts/npc/npc_units_custom.txt @@ -0,0 +1,18174 @@ +// Units File +"DOTAUnits" +{ + "Version" "1" + + //================================================================================================================= + // Announcer + //================================================================================================================= + "npc_dota_announcer_aghanim" + { + // Script + "vscripts" "ai/announcer_aghanim.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_custom_game_announcer" + "Model" "models/development/invisiblebox.vmdl" + "VoiceFile" "soundevents/voscripts/game_sounds_vo_announcer_aghanim.vsndevts" + "SoundSet" "Creep_Good_Melee" + "Level" "1" + "ModelScale" "1.0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghanim_announcer_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "110" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "30" + "StatusHealthRegen" "0" + "StatusMana" "10000" + "StatusStartingMana" "10000" + "StatusManaRegen" "500" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "0" + "VisionNighttimeRange" "0" + + "DisableDamageDisplay" "1" + } + + //================================================================================= + // Creature: Baby Ogre Tank + //================================================================================= + "npc_dota_creature_baby_ogre_tank" + { + // Script + "vscripts" "ai/baby_ogre_tank.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/creeps/ogre_1/large_ogre.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Ogre" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.2" + "ConsideredHero" "1" + "IsAncient" "1" + "skin" "1" + + "MinimapIcon" "minimap_enemyicon" + "MinimapIconSize" "275" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "baby_ogre_tank_melee_smash" + "Ability2" "baby_ogre_tank_jump_smash" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "3" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "78" + "AttackDamageMax" "88" + "AttackRate" "2.8" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "1" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "60" + "HealthBarOffset" "240" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "100" + "BountyGoldMin" "65" + "BountyGoldMax" "75" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "240" + "MovementTurnRate" "0.2" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "900" + "StatusHealthRegen" "2" + "StatusMana" "400" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //------------------------------------------------------------ + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "DisableResistance" "100.0" + + //------------------------------------------------------------ + "ItemDrops" + { + + } + } + } + + //================================================================================= + // Creature: Ogre Tank + //================================================================================= + "npc_dota_creature_ogre_tank" + { + // Script + "vscripts" "ai/ogre_tank.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/creeps/ogre_1/large_ogre.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Ogre" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.8" + "ConsideredHero" "1" + "IsAncient" "1" + "skin" "1" + + "MinimapIcon" "minimap_enemyicon" + "MinimapIconSize" "275" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ogre_tank_melee_smash" + "Ability2" "ogre_tank_jump_smash" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "20" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "200" + "AttackDamageMax" "225" + "AttackRate" "2.8" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "500" + "AttackRange" "1" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "100" + "HealthBarOffset" "310" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "240" + "MovementTurnRate" "0.2" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "4800" + "StatusHealthRegen" "5" + "StatusMana" "500" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //------------------------------------------------------------ + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "DisableResistance" "100.0" + + //------------------------------------------------------------ + "ItemDrops" + { + } + } + } + + //================================================================================= + // Creature: Baby Ogre Magi + //================================================================================= + "npc_dota_creature_baby_ogre_magi" + { + // Script + "vscripts" "ai/baby_ogre_magi.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/creeps/ogre_1/small_ogre.vmdl" + "BaseClass" "npc_dota_creature" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "0.75" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ogre_magi_channelled_bloodlust" + "Ability2" "baby_ogre_magi_area_ignite" + "Ability3" "skeleton_king_run_passive" // adds "run" activity modifier + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "50" + "AttackDamageMax" "55" + "AttackRate" "1.35" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "230" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "340" + "StatusHealthRegen" "1" + "StatusMana" "500" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //------------------------------------------------------------ + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + //------------------------------------------------------------ + "ItemDrops" + { + + } + } + } + + //================================================================================= + // Creature: Ogre Magi + //================================================================================= + "npc_dota_creature_ogre_magi" + { + // Script + "vscripts" "ai/ogre_magi.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/creeps/ogre_1/small_ogre.vmdl" + "BaseClass" "npc_dota_creature" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ogre_magi_channelled_bloodlust" + "Ability2" "ogre_magi_area_ignite" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "10" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "100" + "AttackDamageMax" "110" + "AttackRate" "1.50" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "500" + "AttackRange" "140" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "230" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1000" + "StatusHealthRegen" "3" + "StatusMana" "800" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //------------------------------------------------------------ + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + //------------------------------------------------------------ + "ItemDrops" + { + + } + } + } + + //================================================================================= + // Creature: Ogre Tank Boss + //================================================================================= + "npc_dota_creature_ogre_tank_boss" + { + // Script + "vscripts" "ai/ogre_tank_boss.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/creeps/ogre_1/boss_ogre.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Ogre" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "2.1" + "ConsideredHero" "1" + "IsAncient" "1" + "IsBossMonster" "1" + + "MinimapIcon" "minimap_roshancamp" + "MinimapIconSize" "300" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ogre_tank_boss_melee_smash" + "Ability2" "ogre_tank_boss_jump_smash" + "Ability3" "ability_absolute_no_cc" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "20" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "2.8" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1500" + "AttackRange" "1" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "100" + "HealthBarOffset" "420" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "230" + "MovementTurnRate" "0.25" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "25000" + "StatusHealthRegen" "0" + "StatusMana" "1000" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1500" + "VisionNighttimeRange" "1500" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //------------------------------------------------------------ + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "DisableResistance" "100.0" + + //------------------------------------------------------------ + "ItemDrops" + { + } + } + } + + //================================================================================= + // Creature: Ogre Seer + //================================================================================= + "npc_dota_creature_ogre_seer" + { + // Script + "vscripts" "ai/ogre_seer.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/creeps/ogre_1/small_ogre.vmdl" + "BaseClass" "npc_dota_creature" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "1.4" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ogre_magi_channelled_bloodlust" + "Ability2" "ogre_seer_area_ignite" + "Ability3" "skeleton_king_run_passive" // adds "run" activity modifier + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "3" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "190" + "AttackDamageMax" "200" + "AttackRate" "1.35" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1500" + "AttackRange" "160" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "330" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1800" + "StatusHealthRegen" "0" + "StatusMana" "1200" + "StatusManaRegen" "10" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1500" + "VisionNighttimeRange" "1500" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //------------------------------------------------------------ + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + //------------------------------------------------------------ + "ItemDrops" + { + } + } + } + + //================================================================================================================= + // Breakable Crate + //================================================================================================================= + "npc_dota_crate" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_rotatable_building" + "Model" "models/gameplay/breakingcrate_dest.vmdl" + "SoundSet" "Creep_Good_Melee" + "Level" "1" + "ModelScale" "0.9" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "110" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "30" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + //"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + "DisableDamageDisplay" "1" + "PathfindingSearchDepthScale" "0.0" + } + + //================================================================================================================= + // Breakable Vase + //================================================================================================================= + "npc_dota_vase" + { + // General + //---------------------------------------------------------------- + + "BaseClass" "npc_dota_creep" + "Model" "models/gameplay/breakingvase_dest.vmdl" + "SoundSet" "Creep_Good_Melee" + "Level" "1" + "ModelScale" "0.8" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "110" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "30" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + //"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + "DisableDamageDisplay" "1" + "PathfindingSearchDepthScale" "0.0" + } + + //================================================================================================================= + // Treasure Chest + //================================================================================================================= + "npc_treasure_chest" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/beetlejaws/mesh/beetlejaws.vmdl" + "SoundSet" "Creep_Good_Melee" + "Level" "1" + "ModelScale" "1.5" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "treasure_chest" + "Ability2" "creature_techies_land_mine" + "Ability3" "trap_sun_strike" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "20" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "110" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1000" + "StatusHealthRegen" "3" + "StatusMana" "500" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + } + + //================================================================================================================= + // Explosive Barrel + //================================================================================================================= + "npc_dota_explosive_barrel" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_rotatable_building" + "Model" "models/heroes/techies/fx_techies_remotebomb_underhollow.vmdl" + "SoundSet" "Creep_Good_Melee" + "Level" "1" + "ModelScale" "1.0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_explosive_barrel" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "110" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "30" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + //"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + "DisableDamageDisplay" "1" + "PathfindingSearchDepthScale" "0.0" + } + + //================================================================================= + // Techies Land Mine + //================================================================================= + "npc_dota_creature_techies_land_mine" + { + // General + //---------------------------------------------------------------- + "Model" "models/heroes/techies/fx_techiesfx_mine.vmdl" + "BaseClass" "npc_dota_techies_mines" + "SoundSet" "0" + "Level" "1" + "ModelScale" "1.0" + "SelectionGroup" "Techies_LandMines" + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" + "wearable" "8644" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_unselectable" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "HealthBarOffset" "140" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1" + "StatusHealthRegen" "0.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "64" + "VisionNighttimeRange" "64" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + } + + //================================================================================================================= + // Shop Keeper Bristleback + //================================================================================================================= + "npc_dota_shop_keeper" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creep" + "Model" "models/heroes/bristleback/bristleback.vmdl" + "SoundSet" "Hero_Bristleback" + "Level" "1" + "ModelScale" "1.5" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "110" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + //"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + "DisableDamageDisplay" "1" + "PathfindingSearchDepthScale" "0.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "436" // back: default + } + "Wearable2" + { + "ItemDef" "437" // head: default + } + "Wearable3" + { + "ItemDef" "438" // weapons: default + } + "Wearable4" + { + "ItemDef" "439" // bracers: default + } + "Wearable5" + { + "ItemDef" "440" // necklace: default + } + } + } + } + + //================================================================================= + // Small Hellbear + //================================================================================= + "npc_dota_creature_small_hellbear" + { + // Script + "vscripts" "ai/small_hellbear.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/creeps/neutral_creeps/n_creep_beast/n_creep_beast.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" ".60" + "IsNeutralUnitType" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + "Ability2" "" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "44" + "AttackDamageMax" "50" + "AttackRate" "1.65" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "50" + "HealthBarOffset" "140" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "25" + "BountyGoldMin" "13" + "BountyGoldMax" "17" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "270" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "50" + "StatusHealthRegen" "0.5" + "StatusMana" "0" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + } + } + + //================================================================================= + // Hellbear + //================================================================================= + "npc_dota_creature_hellbear" + { + // Script + "vscripts" "ai/hellbear.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/creeps/neutral_creeps/n_creep_furbolg/n_creep_furbolg_disrupter.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "1.1" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "hellbear_smash" + "Ability2" "" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "1" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "50" + "AttackDamageMax" "54" + "AttackRate" "1.70" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "170" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "55" + "BountyGoldMin" "29" + "BountyGoldMax" "35" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "160" + "StatusHealthRegen" "1" + "StatusMana" "300" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + } + } + + //================================================================================= + // Brewmaster Unit - Earth + //================================================================================= + "npc_dota_brewmaster_earth_unit" + { + // Script + "vscripts" "ai/brewmaster_earth.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/heroes/brewmaster/brewmaster_earthspirit.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Brewmaster_Earth" + "Level" "1" + "ModelScale" ".85" + + + // Abilities + //---------------------------------------------------------------- + "Ability1" "brewmaster_earth_pulverize" + "Ability2" "brewmaster_unit_passive" + "Ability3" "aghsfort_brewmaster_thunderclap" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "38" // Damage range min. + "AttackDamageMax" "42" // Damage range max. + "AttackRate" "1.40" // Speed of attack. + "AttackAnimationPoint" "0.3" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "600" // Range within a target can be acquired. + "AttackRange" "150" // Range within a target can be attacked. + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "170" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "55" + "BountyGoldMin" "29" + "BountyGoldMax" "35" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "270" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "110" + "StatusHealthRegen" "1" + "StatusMana" "75" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + } + } + + //================================================================================= + // Brewmaster Unit - Storm + //================================================================================= + "npc_dota_brewmaster_storm_unit" + { + // Script + "vscripts" "ai/brewmaster_storm.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/heroes/brewmaster/brewmaster_windspirit.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Brewmaster_Storm" + "Level" "1" + "ModelScale" ".85" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "brewmaster_unit_passive" + "Ability2" "" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "28" // Damage range min. + "AttackDamageMax" "33" // Damage range max. + "AttackRate" "1.6" // Speed of attack. + "AttackAnimationPoint" "0.4" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "600" // Range within a target can be acquired. + "AttackRange" "600" // Range within a target can be attacked. + "ProjectileModel" "particles/units/heroes/hero_brewmaster/brewmaster_storm_attack.vpcf" // Particle system model for projectile. + "ProjectileSpeed" "1200" // Speed of projectile. + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "170" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "55" + "BountyGoldMin" "29" + "BountyGoldMax" "35" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "115" + "StatusHealthRegen" "1" + "StatusMana" "75" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + } + + //================================================================================= + // Brewmaster Unit - Fire + //================================================================================= + "npc_dota_brewmaster_fire_unit" + { + // Script + "vscripts" "ai/brewmaster_fire.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/heroes/brewmaster/brewmaster_firespirit.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Brewmaster_Fire" + "Level" "1" + "ModelScale" ".85" + + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_brewmaster_fire_permanent_immolation" + "Ability2" "brewmaster_unit_passive" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "50" // Damage range min. + "AttackDamageMax" "55" // Damage range max. + "AttackRate" "1.50" // Speed of attack. + "AttackAnimationPoint" "0.3" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "600" // Range within a target can be acquired. + "AttackRange" "150" // Range within a target can be attacked. + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "170" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "55" + "BountyGoldMin" "29" + "BountyGoldMax" "35" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "1" + "StatusMana" "75" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + } + } + + //================================================================================= + // Brewmaster Boss + //================================================================================= + "npc_dota_creature_brewmaster_boss" + { + // Script + "vscripts" "ai/brewmaster.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/heroes/brewmaster/brewmaster.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Brewmaster" + "Level" "1" + "ModelScale" "1.1" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_brewmaster_thunderclap" + "Ability2" "aghsfort_brewmaster_primal_split" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "1" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "85" + "AttackDamageMax" "90" + "AttackRate" "1.70" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "170" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "55" + "BountyGoldMin" "29" + "BountyGoldMax" "35" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "240" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "330" + "StatusHealthRegen" "1" + "StatusMana" "300" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "158" // staff: default + } + "Wearable2" + { + "ItemDef" "159" // barrel: default + } + "Wearable3" + { + "ItemDef" "160" // bracers: default + } + "Wearable4" + { + "ItemDef" "161" // backpack: default + } + "Wearable5" + { + "ItemDef" "162" // shoulders: default + } + } + } + } + + //================================================================================= + // Creature: Pinecone Warrior + //================================================================================= + "npc_dota_pinecone_warrior" + { + // General + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/pine_cone/pine_cone.vmdl" + "SoundSet" "Furion_Treant" + "ModelScale" "0.75" + "Level" "2" + "Portrait" "scripts/npc/portraits" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_furion.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "30" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "50" + "AttackDamageMax" "56" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1.80" + "AttackAnimationPoint" "0.467" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "HealthBarOffset" "150" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "60" + "StatusHealthRegen" "1.5" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "700" + "VisionNighttimeRange" "700" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + "DisableClumpingBehavior" "1" + } + } + + //================================================================================= + // Creature: Pinecone Champion + //================================================================================= + "npc_dota_pinecone_champion" + { + // General + "BaseClass" "npc_dota_creature" + "RunAIWhenControllableByPlayer" "1" + + "Model" "models/creeps/pine_cone/pine_cone.vmdl" + //"SoundSet" "Furion_Treant" + "SoundSet" "Hero_Mars" + "ModelScale" "1.4" + "Level" "2" + "ConsideredHero" "1" + "Portrait" "scripts/npc/portraits" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_mars.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "pine_cone_shield_bash" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "1" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "75" + "AttackDamageMax" "80" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1.9" + "AttackAnimationPoint" "0.467" + "AttackAcquisitionRange" "1000" + "AttackRange" "200" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "HealthBarOffset" "270" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "270" + "MovementTurnRate" "0.3" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "320" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "700" + "VisionNighttimeRange" "700" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DisableClumpingBehavior" "1" + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "OffensiveAbilities" + { + "Ability1" + { + "Name" "pine_cone_shield_bash" + "AOE" "1" + "Radius" "250" + "MinimumTargets" "1" + } + } + } + } + + //================================================================================= + // Creature: Tusk Skeleton + //================================================================================= + "npc_dota_creature_tusk_skeleton" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/ice_biome/undeadtusk/undead_tuskskeleton01.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "0.7" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "15" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "68" + "AttackDamageMax" "72" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.36" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALLEST" + "RingRadius" "40" + "HealthBarOffset" "135" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "270" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "1" + "StatusMana" "50" + "StatusManaRegen" "2" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.5" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + "DefaultState" "Invade" + } + } + + //================================================================================= + // Creature: Icy Tusk Skeleton + //================================================================================= + "npc_dota_creature_spectral_tusk_mage" + { + // Script + "vscripts" "ai/spectral_tusk_mage.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/ice_biome/undeadtusk/undead_tuskskeleton02.vmdl" + "SoundSet" "Hero_Necrolyte" + "IdleSoundLoop" "Hero_Necrolyte.IdleLoop" + "Level" "1" + "ModelScale" "1.2" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "undead_tusk_mage_tombstone" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "75" + "AttackDamageMax" "80" + "AttackRate" "1.6" + "AttackAnimationPoint" "0.36" + "AttackAcquisitionRange" "1000" + "AttackRange" "500" + "ProjectileModel" "particles/units/heroes/hero_necrolyte/necrolyte_base_attack.vpcf" + "ProjectileSpeed" "400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "260" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "400" + "StatusHealthRegen" "0" + "StatusMana" "200" + "StatusManaRegen" "4" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "1.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + "DefaultState" "Invade" + } + } + + //================================================================================= + // Creature: Undead Tusk Tombstone + //================================================================================= + "npc_dota_undead_tusk_tombstone" + { + // General + "BaseClass" "npc_dota_unit_aghsfort_spectral_tusk_tombstone" + "Model" "models/props_gameplay/undying_tower_winter/undying_tower_winter.vmdl" + "SoundSet" "Undying_Tombstone" + "ModelScale" "0.8" + "Level" "4" + "IsSummoned" "1" + "IsAncient" "1" + "IsOther" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "neutral_spell_immunity" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "100" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "HealthBarOffset" "320" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "0.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "120" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1800" + "VisionNighttimeRange" "1800" + } + + //================================================================================= + // Creature: Friendly Baby Ogre Tank + //================================================================================= + "npc_dota_creature_friendly_baby_ogre_tank" + { + // Script + "vscripts" "ai/friendly_baby_ogre_tank.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/creeps/ogre_1/large_ogre.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Ogre" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.2" + "ConsideredHero" "1" + "IsAncient" "1" + "skin" "0" //"1" + + "MinimapIcon" "minimap_enemyicon" + "MinimapIconSize" "275" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "baby_ogre_tank_melee_smash" + "Ability2" "baby_ogre_tank_jump_smash" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "5" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "70" + "AttackDamageMax" "80" + "AttackRate" "2.8" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "1" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + "RingRadius" "60" + "HealthBarOffset" "240" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "100" + "BountyGoldMin" "65" + "BountyGoldMax" "75" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "200" + "MovementTurnRate" "0.2" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "8000" + "StatusHealthRegen" "35" + "StatusMana" "400" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //------------------------------------------------------------ + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "DisableResistance" "100.0" + + //------------------------------------------------------------ + "ItemDrops" + { + } + } + } + + //================================================================================= + // Creature: Friendly Ogre Seal + //================================================================================= + "npc_dota_creature_friendly_ogre_seal" + { + // Script + "vscripts" "ai/friendly_ogre_seal.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/ice_biome/ogreseal/ogreseal_rednose.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "0.8" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "friendly_ogreseal_flop" + "Ability2" "ability_ascension" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "5" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "130" + "AttackDamageMax" "130" + "AttackRate" "1.8" + "AttackAnimationPoint" "0.5714" + "AttackAcquisitionRange" "1000" + "AttackRange" "180" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_LARGE" + "RingRadius" "65" + "HealthBarOffset" "250" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "4500" + "StatusHealthRegen" "15" + "StatusMana" "400" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "1.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "DisableClumpingBehavior" "1" + } + } + + //================================================================================= + // Creature: Zealot Scarab + //================================================================================= + "npc_dota_creature_zealot_scarab" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/nerubian_assassin/nerubian_assassin.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "1" + "IsNeutralUnitType" "1" + "vscripts" "ai/scarab_zealot.lua" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_creature_impale" + "Ability2" "" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" + "MagicalResistance" "15" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "80" + "AttackDamageMax" "90" + "AttackRate" "1.55" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1500" + "AttackRange" "128" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "220" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "119" + "BountyGoldMin" "76" + "BountyGoldMax" "88" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "250" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "250" + "StatusHealthRegen" "1" + "StatusMana" "3000" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1500" + "VisionNighttimeRange" "1500" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "8005" // weapon: Latticean Shards + } + "Wearable2" + { + "ItemDef" "196" // back: default + } + "Wearable3" + { + "ItemDef" "197" // head: default + } + "Wearable4" + { + "ItemDef" "578" // misc: default + } + } + } + } + + //================================================================================= + // Creature: Zealot Scarab Mound + //================================================================================= + "npc_dota_creature_zealot_mound" + { + // General + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/nerubian_assassin/mound.vmdl" + "SoundSet" "n_creep_Melee" + "ModelScale" "1.0" + "Level" "4" + "IsSummoned" "1" + "IsAncient" "1" + "IsOther" "1" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "HealthBarOffset" "200" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "0.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "40" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + } + } + + //================================================================================= + // Creature: Scarab Priest + //================================================================================= + "npc_dota_creature_scarab_priest" + { + // Script + //---------------------------------------------------------------- + "vscripts" "ai/scarab_priest.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/nerubian_assassin/nerubian_assassin.vmdl" + "ModelScale" "2.3" + "Level" "1" + "IsNeutralUnitType" "1" + "ConsideredHero" "1" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_nyx_assassin.vsndevts" + + "SoundSet" "Hero_NyxAssassin" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_creature_spiked_carapace" + "Ability2" "scarab_priest_summon_zealots" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" + "MagicalResistance" "15" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "165" + "AttackDamageMax" "198" + "AttackRate" "1.70" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "900" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "220" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "119" + "BountyGoldMin" "76" + "BountyGoldMax" "88" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "900" + "StatusHealthRegen" "2" + "StatusMana" "300" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "8005" // weapon: Latticean Shards + } + "Wearable2" + { + "ItemDef" "196" // back: default + } + "Wearable3" + { + "ItemDef" "197" // head: default + } + "Wearable4" + { + "ItemDef" "578" // misc: default + } + } + } + } + + //================================================================================= + // Creature: Small Ogre Seal + //================================================================================= + "npc_dota_creature_small_ogre_seal" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/ice_biome/ogreseal/ogreseal.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "0.45" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "10" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "120" + "AttackDamageMax" "130" + "AttackRate" "1.6" + "AttackAnimationPoint" "0.5714" + "AttackAcquisitionRange" "1000" + "AttackRange" "130" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "45" + "HealthBarOffset" "150" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "330" + "StatusHealthRegen" "1" + "StatusMana" "400" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.5" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "DisableClumpingBehavior" "1" + } + } + + //================================================================================= + // Creature: Large Ogre Seal + //================================================================================= + "npc_dota_creature_large_ogre_seal" + { + // Script + "vscripts" "ai/ogre_seal.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/ice_biome/ogreseal/ogreseal_rednose.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "1.0" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ogreseal_flop" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "205" + "AttackDamageMax" "220" + "AttackRate" "1.8" + "AttackAnimationPoint" "0.5714" + "AttackAcquisitionRange" "1000" + "AttackRange" "180" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "65" + "HealthBarOffset" "250" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1100" + "StatusHealthRegen" "3" + "StatusMana" "600" + "StatusManaRegen" "5.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "1.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "DisableClumpingBehavior" "1" + } + } + + //================================================================================= + // Creature: Pudge Miniboss + //================================================================================= + "npc_dota_creature_pudge_miniboss" + { + // Script + //---------------------------------------------------------------- + "vscripts" "ai/ai_pudge_miniboss.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/pudge/pudge.vmdl" + "ModelScale" "1.75" + "Level" "1" + "ConsideredHero" "1" + "IsAncient" "1" + + "SoundSet" "Hero_Pudge" + "GameSoundsFile" "soundevents/game_sounds_pudge_miniboss.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_pudge_dismember" + "Ability2" "creature_pudge_miniboss_flesh_heap" + "Ability3" "creature_pudge_miniboss_passive" + "Ability4" "generic_hidden" + "Ability5" "generic_hidden" + "Ability6" "generic_hidden" + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "25" + "MagicalResistance" "0" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "500" + "AttackDamageMax" "550" + "AttackRate" "1.3" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "3000" + "AttackRange" "150" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "350" + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "375" + "MovementTurnRate" "0.3" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "18000" + "StatusHealthRegen" "10.0" + "StatusMana" "750" + "StatusManaRegen" "5.0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1400" + "VisionNighttimeRange" "1400" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + + "EquippedItems" + { + "PhaseBoots" + { + "Item" "item_phase_boots" + } + } + + + "AttachWearables" + { + // Plague Champion of Nurgle + "Wearable1" + { + "ItemDef" "8495" + } + "Wearable2" + { + "ItemDef" "8496" + } + + "Wearable3" + { + "ItemDef" "8497" + } + + "Wearable4" + { + "ItemDef" "8498" + } + + "Wearable5" + { + "ItemDef" "8499" + } + "Wearable6" + { + "ItemDef" "8500" + } + "Wearable6" + { + "ItemDef" "8501" + } + } + } + } + + //================================================================================= + // Creature: Drow Ranger Miniboss + //================================================================================= + "npc_dota_creature_drow_ranger_miniboss" + { + // Script + //---------------------------------------------------------------- + "vscripts" "ai/ai_drow_ranger_miniboss.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/drow/drow_base.vmdl" + "IdleExpression" "scenes/drowranger/drowranger_exp_idle_01.vcd" + + "ModelScale" "1.5" + "Level" "1" + "ConsideredHero" "1" + "IsAncient" "1" + + "SoundSet" "Hero_DrowRanger" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_drowranger.vsndevts" + "particle_folder" "particles/units/heroes/hero_drow" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_drow_ranger_wave_of_silence" + "Ability2" "aghsfort_drow_ranger_multishot" + "Ability3" "generic_hidden" + "Ability4" "generic_hidden" + "Ability5" "generic_hidden" + "Ability6" "generic_hidden" + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "5" + "MagicalResistance" "0" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "72" + "AttackDamageMax" "85" + "AttackRate" "1.15" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "3000" + "AttackRange" "600" + "ProjectileModel" "particles/units/heroes/hero_drow/drow_base_attack.vpcf" + "ProjectileSpeed" "1250" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "300" + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "320" + "MovementTurnRate" "0.6" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "2500" + "StatusHealthRegen" "0.0" + "StatusMana" "1000" + "StatusManaRegen" "5.0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1400" + "VisionNighttimeRange" "1400" + + //Inventory + "HasInventory" "1" + + "RenderablePortrait" + { + "Particles" + { + "particles/units/heroes/hero_drow/drow_loadout.vpcf" "loadout" + } + } + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "EquippedItems" + { + "Pike" + { + "Item" "item_hurricane_pike" + } + "ShadowBlade" + { + "Item" "item_aghsfort_drow_ranger_invis_sword" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "7232" // "Boots of the Winged Bolt" + } + "Wearable2" + { + "ItemDef" "7238" // "Bow of the Winged Bolt" + } + "Wearable3" + { + "ItemDef" "7242" // "Bracers of the Winged Bolt" + } + "Wearable4" + { + "ItemDef" "7243" // "Cape of the Winged Bolt" + } + "Wearable5" + { + "ItemDef" "7244" // "Guards of the Winged Bolt" + } + "Wearable6" + { + "ItemDef" "7245" // "Mask of the Winged Bolt" + } + "Wearable7" + { + "ItemDef" "7246" // "Quiver of the Winged Bolt" + } + // "6785" // "Mania's Mask" + } + } + } + + "npc_dota_creature_drow_ranger_skeleton_archer" + { + // Script + "vscripts" "ai/ai_drow_ranger_skeleton_archer.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/clinkz/clinkz_archer.vmdl"// Model. + "SoundSet" "Hero_Clinkz" // Name of sound set. + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_clinkz.vsndevts" + "Level" "1" + "ModelScale" "1.1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "35" // Damage range min. + "AttackDamageMax" "38" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1.7" // Speed of attack. + "AttackAnimationPoint" "0.3" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "1000" // Range within a target can be acquired. + "AttackRange" "900" // Range within a target can be attacked. + "ProjectileModel" "particles/units/heroes/hero_clinkz/clinkz_searing_arrow.vpcf" // Particle system model for projectile. + "ProjectileSpeed" "900" // Speed of projectile. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion. + "HealthBarOffset" "200" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "150" // Base health. + "StatusHealthRegen" "0" // Health regeneration rate. + "StatusMana" "1000" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1500" // Range of vision during day light. + "VisionNighttimeRange" "1500" // Range of vision at night time. + + //Inventory + "HasInventory" "0" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + } + } + + //================================================================================= + // Creature: Drow Ranger Miniboss Skeleton Warrior + //================================================================================= + "npc_dota_creature_drow_ranger_skeleton_warrior" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/creeps/neutral_creeps/n_creep_troll_skeleton/n_creep_skeleton_melee.vmdl" // Model. + "SoundSet" "Creep_Good_Melee" // Name of sound set. + "ModelScale" "1.1" + "Level" "1" + "IsSummoned" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "50" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "48" // Damage range min. + "AttackDamageMax" "54" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1.2" // Speed of attack. + "AttackAnimationPoint" "0.56" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "2500" // Range within a target can be acquired. + "AttackRange" "128" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALLEST" // Hull type used for navigation/locomotion. + "HealthBarOffset" "140" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "350" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "130" // Base health. + "StatusHealthRegen" "0.0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "2500" // Range of vision during day light. + "VisionNighttimeRange" "2500" // Range of vision at night time. + } + + //================================================================================= + // Creature: Basic Zombie + //================================================================================= + "npc_dota_creature_pudge_miniboss_minion" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/heroes/undying/undying_minion_torso.vmdl" // Model. + "SoundSet" "Undying_Zombie" // Name of sound set. + "ModelScale" "1.1" + "Level" "1" + + "GameSoundsFile" "soundevents/game_sounds_pudge_miniboss.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_pudge_miniboss_armor_corruption" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "50" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "120" // Damage range min. + "AttackDamageMax" "130" // Damage range max. + "AttackRate" "1.0" // Speed of attack. + "AttackAnimationPoint" "0.3" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "3000" // Range within a target can be acquired. + "AttackRange" "100" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "50" + "HealthBarOffset" "120" + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "225" // Speed + "MovementTurnRate" "0.4" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "180" // Base health. + "StatusHealthRegen" "0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1400" // Range of vision during day light. + "VisionNighttimeRange" "1400" // Range of vision at night time. + + // Pathing + //---------------------------------------------------------------- + "PathfindingSearchDepthScale" "0.2" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + } + } + //================================================================================= + // Creature: Wave Blaster + //================================================================================= + "npc_dota_creature_wave_blaster" + { + // Script + "vscripts" "ai/wave_blaster_ai.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/neutral_creeps/n_creep_harpy_b/n_creep_harpy_b.vmdl" // Model. + "SoundSet" "Hero_Necrolyte" + "IdleSoundLoop" "Hero_Necrolyte.IdleLoop" + "Level" "3" + "ModelScale" "1.1" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_wave_blast" + "Ability2" "aghsfort_waveblaster_leap" + "Ability3" "aghsfort_waveblaster_summon_ghost" + + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "35" + "AttackDamageMax" "37" + "AttackRate" "1.5" + "AttackAnimationPoint" "0.36" + "AttackAcquisitionRange" "500" + "AttackRange" "500" + "ProjectileModel" "particles/units/heroes/hero_necrolyte/necrolyte_base_attack.vpcf" + "ProjectileSpeed" "400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "310" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1000" + "StatusHealthRegen" "1" + "StatusMana" "200" + "StatusManaRegen" "4" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "1.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + "DefaultState" "Invade" + } + } + + +//================================================================================= +// Neutral: Wave Blaster Ghost +//================================================================================= + "npc_aghsfort_creature_wave_blaster_ghost" + { + // General + //---------------------------------------------------------------- + "Model" "models/creeps/neutral_creeps/n_creep_ghost_a/n_creep_ghost_a.vmdl" // Model. + "BaseClass" "npc_dota_creature" + "SoundSet" "n_creep_Ranged" + "Level" "3" + "ModelScale" ".90" + + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ghost_frost_attack" // Ability 1 + "Ability2" "" // Ability 2 + "Ability3" "" // Ability 3 + "Ability4" "" // Ability 4 + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "55" // Damage range min. + "AttackDamageMax" "60" // Damage range max. + "AttackRate" "1.0" // Speed of attack. + "AttackAnimationPoint" "0.3" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "1000" // Range within a target can be acquired. + "AttackRange" "350" // Range within a target can be attacked. + "ProjectileModel" "particles/neutral_fx/ghost_base_attack.vpcf" // Particle system model for projectile. + "ProjectileSpeed" "900" // Speed of projectile. + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "45" + "HealthBarOffset" "190" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" // Speed. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "160" // Base health. + "StatusHealthRegen" "0.5" // Health regeneration rate. + "StatusMana" "400" // Base mana. + "StatusManaRegen" "1.0" // Mana regeneration rate. + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" // Range of vision during day light. + "VisionNighttimeRange" "800" // Range of vision at night time. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.5" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + "DefaultState" "Invade" + } + } + + + //================================================================================= + // Creature: Storegga + //================================================================================= + "npc_dota_creature_storegga" + { + // Script + "vscripts" "ai/storegga.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/ice_biome/storegga/storegga.vmdl" + "SoundSet" "Hero_Tiny" + "Level" "1" + "ModelScale" "2.4" + "ConsideredHero" "1" + "IsAncient" "1" + "IsBossMonster" "1" + + "MinimapIcon" "minimap_enemyicon" + "MinimapIconSize" "300" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "storegga_arm_slam" + "Ability2" "storegga_grab" + "Ability3" "storegga_grab_throw" + "Ability4" "storegga_ground_pound" + "Ability5" "storegga_passive" + "Ability6" "storegga_avalanche" + "Ability7" "generic_gold_bag_fountain_8000" + //"Ability8" "ability_absolute_no_cc" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "30" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "1500" + "AttackDamageMax" "2000" + "AttackRate" "2.5" + "AttackAnimationPoint" "1.0" + "AttackAcquisitionRange" "1500" + "AttackRange" "10" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "850" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "2500" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "550" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "45000" + "StatusHealthRegen" "0" + "StatusMana" "10000" + "StatusManaRegen" "50" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1800" + "VisionNighttimeRange" "1800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "ItemDrops" + { + } + + "HPGain" "7500" + "DamageGain" "75" + } + } + + //================================================================================= + // Creature: Little Rock + //================================================================================= + "npc_dota_creature_small_storegga" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/tiny_01/tiny_01.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "1.0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "25" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "280" + "AttackDamageMax" "282" + "AttackRate" "1.4" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "3000" + "AttackRange" "128" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "50" + "HealthBarOffset" "130" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "350" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "600" + "StatusHealthRegen" "1.0" + "StatusMana" "300" + "StatusManaRegen" "2.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.4" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "60.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "6866" // head: Elemental Ice Head + //"ItemDef" "493" // head: default + } + "Wearable2" + { + "ItemDef" "494" // armor: default + } + "Wearable3" + { + "ItemDef" "6868" // arms: Elemental Ice Left Arm + //"ItemDef" "495" // arms: default + } + "Wearable4" + { + "ItemDef" "6867" // offhand_weapon: Elemental Ice Right Arm + //"ItemDef" "496" // offhand_weapon: default + } + "Wearable5" + { + "ItemDef" "6869" // armor: Elemental Ice Body + } + "Wearable6" + { + "ItemDef" "516" // ambient_effects: default + } + } + } + } + + //================================================================================================================= + // Storegga Rock + //================================================================================================================= + "npc_dota_storegga_rock" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/rocks/crypt_rock_basalt_medium_03.vmdl" + "SoundSet" "Creep_Good_Melee" + "Level" "1" + "ModelScale" "3.0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "modifier_no_minimap" + "Ability2" "provides_fow_position" + "Ability3" "no_vision" + "Ability4" "no_health_bar" + "Ability5" "ability_storegga_rock" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "99999" + "MagicalResistance" "100" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + "RingRadius" "45" + "HealthBarOffset" "110" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "9999" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + "DisableDamageDisplay" "1" + } + + //================================================================================================================= + // Storegga Rock 2 + //================================================================================================================= + "npc_dota_storegga_rock2" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/rocks/crypt_rock_basalt_medium_02.vmdl" + "SoundSet" "Creep_Good_Melee" + "Level" "1" + "ModelScale" "1.3" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "modifier_no_minimap" + "Ability2" "provides_fow_position" + "Ability3" "no_vision" + "Ability4" "no_health_bar" + "Ability5" "ability_storegga_rock" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "99" + "MagicalResistance" "100" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_FILLER" + "RingRadius" "45" + "HealthBarOffset" "110" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "99999" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + "DisableDamageDisplay" "1" + } + + //================================================================================================================= + // Storegga Rock 3 + //================================================================================================================= + "npc_dota_storegga_rock3" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/rocks/crypt_rock_basalt_medium_01.vmdl" + "SoundSet" "Creep_Good_Melee" + "Level" "1" + "ModelScale" "1.8" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "modifier_no_minimap" + "Ability2" "provides_fow_position" + "Ability3" "no_vision" + "Ability4" "no_health_bar" + "Ability5" "ability_storegga_rock" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "999" + "MagicalResistance" "100" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_BARRACKS" + "RingRadius" "45" + "HealthBarOffset" "110" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "99999" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + "DisableDamageDisplay" "1" + } + + //================================================================================= + // Creature: Temple Guardian + //================================================================================= + "npc_dota_creature_temple_guardian" + { + // Script + "vscripts" "ai/temple_guardian.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/creeps/omniknight_golem/omniknight_golem.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "n_creep_Melee" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "2.3072" + "ConsideredHero" "1" + "IsAncient" "1" + "IsBossMonster" "1" + + "MinimapIcon" "minimap_enemyicon" + "MinimapIconSize" "275" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "temple_guardian_purification" + "Ability2" "temple_guardian_hammer_throw" + "Ability3" "temple_guardian_hammer_smash" + "Ability4" "temple_guardian_rage_hammer_smash" + "Ability5" "temple_guardian_wrath" + "Ability6" "temple_guardian_passive" + "Ability7" "generic_gold_bag_fountain_2000" + "Ability8" "ability_absolute_no_cc" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "20" + "MagicalResistance" "15" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "175" + "AttackDamageMax" "225" + "AttackRate" "2.8" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "2500" + "AttackRange" "1" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + "RingRadius" "100" + "HealthBarOffset" "500" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "700" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "300" + "MovementTurnRate" "0.2" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "10000" // "20000" + "StatusHealthRegen" "0" // "5" + "StatusMana" "5000" + "StatusManaRegen" "30" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1500" + "VisionNighttimeRange" "1500" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //------------------------------------------------------------ + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "HPGain" "1875" + "DamageGain" "0" + } + } + + //================================================================================= + // Creature: Demon Golem + //================================================================================= + "npc_dota_creature_demon_golem" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/warlock/warlock_demon.vmdl" + "SoundSet" "Hero_WarlockGolem" + "Level" "1" + "ModelScale" "0.45" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" //"warlock_golem_flaming_fists" + "Ability2" "" //"warlock_golem_permanent_immolation" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "15" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "67" + "AttackDamageMax" "72" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.26" + "AttackAcquisitionRange" "1000" + "AttackRange" "200" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "220" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "260" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "250" + "StatusHealthRegen" "0" + "StatusMana" "400" + "StatusManaRegen" "1" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "60.0" + "Avoidance" "0.0" + "Support" "40.0" + } + } + } + } + + //================================================================================= + // Creature: Warlock + //================================================================================= + "npc_dota_creature_warlock" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/warlock/warlock.vmdl" + "SoundSet" "Hero_Warlock" + "Level" "6" + "ModelScale" "1.3" + "IsNeutralUnitType" "1" // need this too? + "ConsideredHero" "1" + "IsAncient" "1" // warlock's aura doesn't work on ancients, this is how we're keeping it from applying to other warlocks + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_warlock_shadow_word" + "Ability2" "warlock_hp_aura" + "Ability3" "creature_flamestrike" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "82" + "AttackDamageMax" "88" + "AttackRate" "1.8" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "600" + "ProjectileModel" "particles/units/heroes/hero_warlock/warlock_base_attack.vpcf" + "ProjectileSpeed" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "230" + "BoundsHullName" "DOTA_HULL_SIZE_SIEGE" // siege gives bigger collision radius, helps with selecting warlocks when they're surrounded + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "270" + "MovementTurnRate" "0.4" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "700" + "StatusHealthRegen" "0.0" + "StatusMana" "800" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "50.0" + "Avoidance" "0.0" + "Support" "10.0" + } + } + + "OffensiveAbilities" + { + "Ability3" + { + "Name" "creature_flamestrike" + "AOE" "1" + "Radius" "275" + "MinimumTargets" "1" + } + } + + "DefensiveAbilities" + { + "Ability1" + { + "Name" "creature_warlock_shadow_word" + "Heal" "1" + "UseSelfishly" "1" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "245" // belt: default + } + "Wearable2" + { + "ItemDef" "241" // head: default + } + "Wearable3" + { + "ItemDef" "240" // offhand_weapon: default + } + "Wearable4" + { + "ItemDef" "243" // arms: default + } + "Wearable5" + { + "ItemDef" "244" // back: default + } + "Wearable6" + { + "ItemDef" "242" // shoulder: default + } + "Wearable7" + { + "ItemDef" "239" //"6473" // weapon: Hellborn Grasp + } + } + } + } + + //================================================================================= + // Creature: Gauntlet Skeleton + //================================================================================= + "npc_dota_creature_gauntlet_skeleton" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/ice_biome/undeadtusk/undead_tuskskeleton01.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "0.8" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "10" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "92" + "AttackDamageMax" "94" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.36" + "AttackAcquisitionRange" "1000" + "AttackRange" "110" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALLEST" + "RingRadius" "40" + "HealthBarOffset" "135" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "250" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "400" + "StatusHealthRegen" "1" + "StatusMana" "50" + "StatusManaRegen" "2" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.5" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + "DefaultState" "Invade" + } + } + + //================================================================================= + // Creature: Lifestealer + //================================================================================= + "npc_dota_creature_life_stealer" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/life_stealer/life_stealer.vmdl" + "SoundSet" "Hero_LifeStealer" + "Level" "1" + "ModelScale" "1.6" + "ConsideredHero" "1" + "VoiceFile" "soundevents/voscripts/game_sounds_vo_life_stealer.vsndevts" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_life_stealer.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "lifestealer_passive" + "Ability2" "aghsfort_lifestealer_enraged_pulse" + "Ability3" "aggro_on_damage" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "4" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "310" + "AttackDamageMax" "310" + "AttackRate" "1.35" + "AttackAnimationPoint" "0.39" + "AttackAcquisitionRange" "750" + "AttackRange" "140" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALLEST" + "RingRadius" "80" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "250" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1800" + "StatusHealthRegen" "0" + "StatusMana" "50" + "StatusManaRegen" "2" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "750" + "VisionNighttimeRange" "750" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + "DefaultState" "Invade" + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "9199" // back: Profane Union + } + } + } + } + + //================================================================================= + // Creature: Grimstroke + //================================================================================= + "npc_dota_creature_grimstroke" + { + // General + //---------------------------------------------------------------- + "vscripts" "ai/grimstroke.lua" + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/grimstroke/grimstroke.vmdl" + "SoundSet" "Hero_Grimstroke" + "Level" "5" + "ModelScale" "1.0" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_grimstroke.vsndevts" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_grimstroke_spirit_walk" + "Ability2" "aggro_on_damage" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "110" + "AttackDamageMax" "115" + "AttackRate" "1.9" + "AttackAnimationPoint" "0.35" + "AttackAcquisitionRange" "750" + "AttackRange" "600" + "ProjectileModel" "particles/units/heroes/hero_grimstroke/grimstroke_base_attack.vpcf" + "ProjectileSpeed" "700" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "230" + "BoundsHullName" "DOTA_HULL_SIZE_SIEGE" // siege gives bigger collision radius, helps with selecting warlocks when they're surrounded + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + "MovementTurnRate" "0.4" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1400" + "StatusHealthRegen" "1.0" + "StatusMana" "800" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "750" + "VisionNighttimeRange" "750" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "50.0" + "Avoidance" "0.0" + "Support" "10.0" + } + } + + "OffensiveAbilities" + { + "Ability3" + { + "Name" "creature_flamestrike" + "AOE" "1" + "Radius" "275" + "MinimumTargets" "1" + } + } + + "DefensiveAbilities" + { + "Ability1" + { + "Name" "creature_warlock_shadow_word" + "Heal" "1" + "UseSelfishly" "1" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "664" // belt + } + "Wearable2" + { + "ItemDef" "12939" // weapon: Immortal + } + "Wearable3" + { + "ItemDef" "667" // head + } + "Wearable4" + { + "ItemDef" "668" // armor + } + } + } + } + + + //================================================================================= + // Creature: Tidehunter Mini + //================================================================================= + "npc_dota_creature_tidehunter_mini" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/tidehunter/tidehunter.vmdl" + "SoundSet" "Hero_Tidehunter" + "Level" "1" + "ModelScale" "0.75" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "tidehunter_kraken_shell" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "5" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "250" + "AttackDamageMax" "275" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "1000" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "140" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "119" + "BountyGoldMin" "76" + "BountyGoldMax" "88" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "300" + "MovementTurnRate" "0.4" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1600" + "StatusHealthRegen" "1" + "StatusMana" "1100" + "StatusManaRegen" "5.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "60.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "34" // arms: default + } + "Wearable2" + { + "ItemDef" "35" // belt: default + } + "Wearable3" + { + "ItemDef" "36" // weapon: default + } + "Wearable4" + { + "ItemDef" "37" // offhand_weapon: default + } + } + } + } + + //================================================================================= + // Creature: Tidehunter Medium + //================================================================================= + "npc_dota_creature_tidehunter_medium" + { + // Scripts + "vscripts" "ai/tidehunter.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/tidehunter/tidehunter.vmdl" + "SoundSet" "Hero_Tidehunter" + "Level" "1" + "ModelScale" "1.25" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_tidehunter.vsndevts" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_tidehunter_gush" + "Ability2" "tidehunter_anchor_smash" + "Ability3" "tidehunter_kraken_shell" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "3" + "MagicalResistance" "10" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "300" + "AttackDamageMax" "350" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.6" + "AttackAcquisitionRange" "1000" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "119" + "BountyGoldMin" "76" + "BountyGoldMax" "88" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + "MovementTurnRate" "0.4" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "4000" + "StatusHealthRegen" "0" + "StatusMana" "2000" + "StatusManaRegen" "5.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "60.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "EquippedItems" + { + "UltimateScepter" + { + "Item" "item_ultimate_scepter" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "7774" // arms: default + } + "Wearable2" + { + "ItemDef" "7773" // belt: default + } + "Wearable3" + { + "ItemDef" "7778" // weapon: default + } + "Wearable4" + { + "ItemDef" "7777" // offhand_weapon: default + } + "Wearable5" + { + "ItemDef" "7775" // back: default + } + "Wearable6" + { + "ItemDef" "7776" // head: default + } + } + } + } + + //================================================================================= + // Creature: Tidehunter Large + //================================================================================= + "npc_dota_creature_tidehunter_large" + { + // Scripts + "vscripts" "ai/tidehunter_miniboss.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/tidehunter/tidehunter.vmdl" + "SoundSet" "Hero_Tidehunter" + "Level" "1" + "ModelScale" "1.75" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_tidehunter.vsndevts" + "ConsideredHero" "1" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_tidehunter_gush" + "Ability2" "tidehunter_kraken_shell" + "Ability3" "tidehunter_anchor_smash" + "Ability4" "tidehunter_ravage" + "Ability5" "tidehunter_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "10" + "MagicalResistance" "20" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "700" + "AttackDamageMax" "800" + "AttackRate" "3.0" + "AttackAnimationPoint" "0.6" + "AttackAcquisitionRange" "1000" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "300" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "119" + "BountyGoldMin" "76" + "BountyGoldMax" "88" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + "MovementTurnRate" "0.4" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "12500" + "StatusHealthRegen" "0" + "StatusMana" "2000" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "60.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "EquippedItems" + { + "UltimateScepter" + { + "Item" "item_ultimate_scepter" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "34" // arms: default + } + "Wearable2" + { + "ItemDef" "35" // belt: default + } + "Wearable3" + { + "ItemDef" "7469" // weapon: Claddish Cudgel + } + "Wearable4" + { + "ItemDef" "37" // offhand_weapon: default + } + "Wearable5" + { + "ItemDef" "4092" // back: kraken shell + } + "Wearable6" + { + "ItemDef" "4093" // head: octopus hat + } + } + } + } + + //================================================================================= + // Creature: Slark Peon + //================================================================================= + "npc_dota_creature_slark_peon" + { + // Scripts + "vscripts" "ai/slark.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/slark/slark.vmdl" + "SoundSet" "Hero_Slark" + "Level" "1" + "ModelScale" "1" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_slark.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "slark_dark_pact" + "Ability2" "slark_pounce" + "Ability3" "slark_essence_shift" + "Ability4" "slark_shadow_dance" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "1" + "MagicalResistance" "2" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "220" + "AttackDamageMax" "270" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "600" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "119" + "BountyGoldMin" "76" + "BountyGoldMax" "88" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "300" + "MovementTurnRate" "0.4" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1100" + "StatusHealthRegen" "10" + "StatusMana" "1000" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "DisableClumpingBehavior" "1" + + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "60.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "OffensiveAbilities" + { + "Ability1" + { + "Name" "slark_pounce" + "Linear" "1" + "AOE" "1" + "Radius" "100" + "MinimumTargets" "1" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "7710" // buckler: default + } + "Wearable2" + { + "ItemDef" "7711" // cape: default + } + "Wearable3" + { + "ItemDef" "7712" // cowl: default + } + "Wearable4" + { + "ItemDef" "7713" // flippers: default + } + "Wearable5" + { + "ItemDef" "7714" // weapon: default + } + } + } + } + + //================================================================================= + // Creature: Naga Siren Boss + //================================================================================= + "npc_dota_creature_naga_siren_boss" + { + // Scripts + "vscripts" "ai/naga_siren.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/siren/siren.vmdl" + "SoundSet" "Hero_NagaSiren" + "Level" "1" + "ModelScale" "1.5" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_naga_siren.vsndevts" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_naga_siren_mirror_image" + "Ability2" "naga_siren_ensnare" + "Ability3" "naga_siren_rip_tide" + "Ability4" "naga_siren_song_of_the_siren" + "Ability5" "naga_siren_song_of_the_siren_cancel" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "1" + "MagicalResistance" "2" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "450" + "AttackDamageMax" "500" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "600" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "300" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "119" + "BountyGoldMin" "76" + "BountyGoldMax" "88" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "300" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1600" + "StatusHealthRegen" "10" + "StatusMana" "2000" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "DisableClumpingBehavior" "1" + + "EquippedItems" + { + "Radiance" + { + "Item" "item_radiance" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "6424" // head: default + } + "Wearable2" + { + "ItemDef" "6425" // weapon: default + } + "Wearable3" + { + "ItemDef" "6427" // tail: default + } + "Wearable4" + { + "ItemDef" "6423" // armor: default + } + "Wearable5" + { + "ItemDef" "6426" // offhand: default + } + } + } + } + + //================================================================================= + // Creature: Naga Siren Illusion + //================================================================================= + "npc_dota_creature_naga_siren_illusion" + { + // Scripts + "vscripts" "ai/naga_siren_illusion.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/siren/siren.vmdl" + "SoundSet" "Hero_NagaSiren" + "Level" "1" + "ModelScale" "1.0" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_naga_siren.vsndevts" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "naga_siren_rip_tide" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "1" + "MagicalResistance" "2" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "400" + "AttackDamageMax" "450" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "600" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "300" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "119" + "BountyGoldMin" "76" + "BountyGoldMax" "88" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "320" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "4000" + "StatusHealthRegen" "0" + "StatusMana" "2000" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "DisableClumpingBehavior" "1" + + "EquippedItems" + { + "Radiance" + { + "Item" "item_radiance" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "191" // head: default + } + "Wearable2" + { + "ItemDef" "192" // weapon: default + } + "Wearable3" + { + "ItemDef" "193" // tail: default + } + "Wearable4" + { + "ItemDef" "194" // armor: default + } + "Wearable5" + { + "ItemDef" "312" // offhand: default + } + } + } + } + + //================================================================================================================= + // Underwater Mine + //================================================================================================================= + "npc_dota_underwater_mine" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/techies/fx_techiesfx_stasis.vmdl" + "SoundSet" "0" + "Level" "1" + "ModelScale" "2" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "bomber_death_explosion" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1.0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "120" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "450" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + "DisableDamageDisplay" "1" + "PathfindingSearchDepthScale" "0.0" + } + + //================================================================================= + // Creature: Tiny Crab + //================================================================================= + "npc_dota_creature_tiny_crab" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/darkreef/prisoner_crab/darkreef_prisoner_crab.vmdl" + "SoundSet" "Hero_Broodmother" + "Level" "1" + "ModelScale" "0.7" + "IsNeutralUnitType" "1" + "EnableIK" "0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "10" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "42" + "AttackDamageMax" "48" + "AttackRate" "1.5" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "130" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "100" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "270" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "250" + "StatusHealthRegen" "1" + "StatusMana" "400" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + } + } + + //================================================================================= + // Creature: Morphling Big + //================================================================================= + "npc_dota_creature_morphling_big" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/morphling/morphling.vmdl" + "SoundSet" "Hero_Morphling" + "Level" "1" + "ModelScale" "1.7" + "IsNeutralUnitType" "1" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_morphling.vsndevts" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_morphling_waveform" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "1" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "100" + "AttackDamageMax" "105" + "AttackRate" "1.6" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "450" + "ProjectileModel" "particles/units/heroes/hero_morphling/morphling_base_attack.vpcf" + "ProjectileSpeed" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "300" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1000" + "StatusHealthRegen" "1" + "StatusMana" "1000" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "OffensiveAbilities" + { + "Ability1" + { + "Name" "aghsfort_morphling_waveform" + "Linear" "1" + "AOE" "1" + "Radius" "200" + "MinimumTargets" "2" + } + } + } + } + + //================================================================================= + // Creature: Lina + //================================================================================= + "npc_dota_creature_lina" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/lina/lina.vmdl" + "SoundSet" "Hero_Lina" + "Level" "1" + "ModelScale" "1.3" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_lina.vsndevts" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_flamestrike" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" + "MagicalResistance" "15" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "130" + "AttackDamageMax" "140" + "AttackRate" "1.6" + "AttackAnimationPoint" "0.65" + "AttackAcquisitionRange" "1000" + "AttackRange" "550" + "ProjectileModel" "particles/units/heroes/hero_lina/lina_base_attack.vpcf" + "ProjectileSpeed" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "240" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "900" + "StatusHealthRegen" "4" + "StatusMana" "1000" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "OffensiveAbilities" + { + "Ability1" + { + "Name" "creature_flamestrike" + "AOE" "1" + "Radius" "200" + "MinimumTargets" "1" + } + } + } + } + + //================================================================================= + // Creature: Puck + //================================================================================= + "npc_dota_creature_puck" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/puck/puck.vmdl" + "SoundSet" "Hero_Puck" + "Level" "1" + "ModelScale" "1.2" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_puck.vsndevts" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "puck_flying_bomb" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "6" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "160" + "AttackDamageMax" "160" + "AttackRate" "1.6" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "1000" + "AttackRange" "650" + "ProjectileModel" "particles/units/heroes/hero_puck/puck_base_attack.vpcf" + "ProjectileSpeed" "900" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "230" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1800" + "StatusHealthRegen" "0" + "StatusMana" "1000" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "OffensiveAbilities" + { + "Ability1" + { + "Name" "puck_flying_bomb" + "AOE" "1" + "Radius" "200" + "MinimumTargets" "1" + } + } + } + } + + //================================================================================= + // Creature: Large Elder Titan + //================================================================================= + "npc_dota_creature_large_elder_titan" + { + // Scripts + "vscripts" "ai/elder_titan.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/elder_titan/elder_titan.vmdl" + "SoundSet" "Hero_ElderTitan" + "Level" "11" + "ModelScale" "1.2" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_elder_titan.vsndevts" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_elder_titan_echo_stomp" + "Ability2" "elder_titan_ancestral_spirit" // required for Echo Stomp to function + "Ability3" "creature_elder_titan_earth_splitter" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "10" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "450" + "AttackDamageMax" "500" + "AttackRate" "1.6" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "200" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "350" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "4500" + "StatusHealthRegen" "0.0" + "StatusMana" "2400" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "DisableResistance" "75.0" + + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "60.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "6381" // weapon: Worldforger's Anvil + } + "Wearable2" + { + "ItemDef" "6382" // arms: Worldforger's Bracers + } + "Wearable3" + { + "ItemDef" "6384" // head: Worldforger's Crown + } + "Wearable4" + { + "ItemDef" "6385" // shoulder: Worldforger's Shoulders + } + "Wearable5" + { + "ItemDef" "6386" // back: Worldforger's Spires + } + } + } + } + + //================================================================================= + // Creature: Kunkka Mini + //================================================================================= + "npc_dota_creature_kunkka_mini" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/kunkka/kunkka.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "0.65" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "5" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "75" + "AttackDamageMax" "80" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "140" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "315" + "MovementTurnRate" "0.6" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "650" + "StatusHealthRegen" "1.0" + "StatusMana" "200" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "60.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "10" // boots + } + "Wearable2" + { + "ItemDef" "11" // hands + } + "Wearable3" + { + "ItemDef" "12" // sword + } + "Wearable4" + { + "ItemDef" "14" // hair + } + } + } + } + + //================================================================================= + // Creature: Kunkka Medium + //================================================================================= + "npc_dota_creature_kunkka_medium" + { + // Scripts + "vscripts" "ai/kunkka.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/kunkka/kunkka.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "1.3" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_kunkka.vsndevts" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "kunkka_torrent_dm" + "Ability2" "kunkka_ghostship" + "Ability3" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "4" + "MagicalResistance" "10" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "450" + "AttackDamageMax" "500" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "140" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "300" + "MovementTurnRate" "0.6" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "6000" + "StatusHealthRegen" "0" + "StatusMana" "800" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "60.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "10" // boots + } + "Wearable2" + { + "ItemDef" "11" // hands + } + "Wearable3" + { + "ItemDef" "12" // sword + } + "Wearable4" + { + "ItemDef" "14" // hair + } + "Wearable5" + { + "ItemDef" "81" // spyglass + } + "Wearable6" + { + "ItemDef" "357" // shoulder + } + } + } + } + + //================================================================================= + // Creature: Kunkka Large + //================================================================================= + "npc_dota_creature_kunkka_large" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/kunkka/kunkka.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "1.8" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_kunkka.vsndevts" + "ConsideredHero" "1" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "kunkka_torrent_dm" + "Ability2" "life_stealer_empty_1" + "Ability3" "kunkka_x_marks_the_spot" + "Ability4" "kunkka_ghostship" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "7" + "MagicalResistance" "20" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "500" + "AttackDamageMax" "550" + "AttackRate" "1.5" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "140" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "385" + "MovementTurnRate" "0.6" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "2600" + "StatusHealthRegen" "3.0" + "StatusMana" "1400" + "StatusManaRegen" "5.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "60.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "OffensiveAbilities" + { + "Ability1" + { + "Name" "kunkka_torrent_dm" + "AOE" "1" + "Radius" "200" + "MinimumTargets" "1" + } + + "Ability3" + { + "Name" "kunkka_x_marks_the_spot" + } + + "Ability4" + { + "Name" "kunkka_ghostship" + "AOE" "1" + "Radius" "300" + "MinimumTargets" "2" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "4011" // legs: pegleg + } + "Wearable2" + { + "ItemDef" "11" // gloves + } + "Wearable3" + { + "ItemDef" "12" // sword + } + "Wearable4" + { + "ItemDef" "4017" // head: bicorne + } + "Wearable5" + { + "ItemDef" "81" // belt: spyglass + } + "Wearable6" + { + "ItemDef" "357" // shoulder + } + } + } + } + + //================================================================================= + // Creature: Leshrac Small + //================================================================================= + "npc_dota_creature_leshrac_small" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/leshrac/leshrac.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "0.6" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_leshrac.vsndevts" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "5" + "MagicalResistance" "20" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "70" + "AttackDamageMax" "80" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "600" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "50" + "HealthBarOffset" "150" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "330" + "MovementTurnRate" "0.6" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "800" + "StatusHealthRegen" "4.0" + "StatusMana" "800" + "StatusManaRegen" "8.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "60.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "AttachWearables" + { + //"Wearable1" + //{ + //"ItemDef" "12765" // weapon: Blade of Odocoeleus + //} + } + } + } + + //================================================================================= + // Creature: Bandit Captain + //================================================================================= + "npc_dota_creature_bandit_captain" + { + // Script + "vscripts" "ai/bandit_captain.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/thief/thief_01_leader.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "15" + "ModelScale" "1.75" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "bandit_stifling_dagger" + "Ability2" "creature_blink_strike" + "Ability3" "creature_generic_high_status_resist_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "30" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "750" + "AttackDamageMax" "750" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "65" + "HealthBarOffset" "310" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "380" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "9500" + "StatusHealthRegen" "0" + "StatusMana" "1500" + "StatusManaRegen" "20" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "50.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "EquippedItems" + { + "MKB" + { + "Item" "item_monkey_king_bar" + } + } + } + } + + //================================================================================= + // Creature: Bandit Archer + //================================================================================= + "npc_dota_creature_bandit_archer" + { + // Script + "vscripts" "ai/bandit_archer.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/thief/thief_01_archer.vmdl" + "SoundSet" "Hero_DrowRanger" + "Level" "15" + "ModelScale" "1.32" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "bandit_archer_arrow" + "Ability2" "creature_generic_high_status_resist_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "21" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.700000" + "AttackAcquisitionRange" "1000" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "65" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "380" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "3500" + "StatusHealthRegen" "0" + "StatusMana" "1500" + "StatusManaRegen" "20" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "50.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "EquippedItems" + { + "ShadowBlade" + { + "Item" "item_bandit_archer_shadow_blade" + } + } + + } + } + + //================================================================================= + // Creature: Bandit + //================================================================================= + "npc_dota_creature_bandit" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/thief/thief_01.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "0.9" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "15" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "450" + "AttackDamageMax" "450" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "160" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "380" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "2500" + "StatusHealthRegen" "0" + "StatusMana" "500" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "50.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + } + } + + //================================================================================= + // Creature: Rhyzik + //================================================================================= + "npc_dota_creature_sand_king" + { + // Script + "vscripts" "ai/rhyzik.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/sandking_boss/sand_king_boss.vmdl" + "SoundSet" "Roshan" + "Level" "50" + "ModelScale" "3.0" + "ConsideredHero" "1" + "IsAncient" "1" + "IsBossMonster" "1" + + // Minimap + //---------------------------------------------------------------- + "MinimapIcon" "minimap_roshancamp" + "MinimapIconSize" "250" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "sand_king_boss_burrow" + "Ability2" "sand_king_boss_unburrow" + "Ability3" "sand_king_tail_swipe_right" + "Ability4" "sand_king_tail_swipe_left" + "Ability5" "sand_king_boss_move_back" + "Ability6" "sand_king_boss_burrowstrike" + "Ability7" "sand_king_boss_sandstorm" + "Ability8" "sand_king_boss_epicenter" + "Ability9" "sand_king_boss_passive" + "Ability10" "sand_king_burrowed_forward_strike" + "Ability11" "sand_king_burrowed_backward_strike" + "Ability12" "sand_king_boss_move_right" + "Ability13" "sand_king_boss_move_left" + "Ability14" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "75" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "1600" + "AttackDamageMax" "1800" + "AttackRate" "1.75" + "AttackAnimationPoint" "0.53" + "AttackAcquisitionRange" "1800" + "AttackRange" "300" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "75" + "HealthBarOffset" "250" + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "1000" + "BountyGoldMin" "500" + "BountyGoldMax" "1000" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "420" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "180000" + "StatusHealthRegen" "50" + "StatusMana" "10000" + "StatusManaRegen" "250" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1800" + "VisionNighttimeRange" "1800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "DisableResistance" "100.0" + "DisableClumpingBehavior" "1" + + "EquippedItems" + { + "Blink" + { + "Item" "item_blink" + } + "Shivas" + { + "Item" "item_shivas_guard" + } + "Sphere" + { + "Item" "item_sphere" + } + } + "ItemDrops" + { + } + } + } + + "npc_dota_sand_king_sandstorm" + { + // General + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/attachto_ghost/attachto_ghost.vmdl" + "SoundSet" "Creep_Good_Melee" + "ModelScale" "16.0" + "Level" "4" + "IsSummoned" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "sand_king_boss_sandstorm_storm_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "1" + "AttackDamageMax" "1" + "AttackRate" "1" + "AttackAnimationPoint" "1" + "AttackAcquisitionRange" "1" + "AttackRange" "1" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "HealthBarOffset" "140" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_FLY" + "MovementSpeed" "650" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "450" + "StatusHealthRegen" "0.5" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "300" + "VisionNighttimeRange" "300" + } + + //================================================================================= + // Creature: Healing Burrower + //================================================================================= + "npc_dota_creature_healing_burrower" + { + // Script + "vscripts" "ai/healing_burrower.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/nerubian_assassin/nerubian_assassin.vmdl" + "SoundSet" "Hero_NyxAssassin" + "Level" "5" + "ModelScale" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "nyx_suicide_heal" + "Ability2" "nyx_assassin_burrow" + "Ability3" "nyx_assassin_unburrow" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.55" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" + "RingRadius" "25" + "HealthBarOffset" "120" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "50" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "320" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "800" + "StatusHealthRegen" "100" + "StatusMana" "1000" + "StatusManaRegen" "30" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "750" + "VisionNighttimeRange" "750" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "70.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DisableClumpingBehavior" "1" + + "EquippedItems" + { + "Aghanims" + { + "Item" "item_ultimate_scepter" + } + } + + "ItemDrops" + { + } + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "5345" // misc nyx dagon + } + } + } + } + + //================================================================================= + // Creature: Big Exploding Burrower + //================================================================================= + "npc_dota_creature_big_exploding_burrower" + { + // Script + "vscripts" "ai/exploding_big_burrower.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/nyx_swarm/nyx_swarm.vmdl" + "SoundSet" "Hero_NyxAssassin" + "Level" "5" + "ModelScale" "1.5" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "burrower_big_explosion" + "Ability2" "nyx_assassin_burrow" + "Ability3" "nyx_assassin_unburrow" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.55" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" + "RingRadius" "25" + "HealthBarOffset" "150" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "50" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "450" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "800" + "StatusHealthRegen" "25" + "StatusMana" "1000" + "StatusManaRegen" "30" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "750" + "VisionNighttimeRange" "750" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "70.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DisableClumpingBehavior" "1" + + "ItemDrops" + { + } + + } + } + + //================================================================================= + // Creature: Spectre + //================================================================================= + "npc_dota_creature_spectre" + { + // General + //---------------------------------------------------------------- + "vscripts" "ai/spectre.lua" + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/spectre/spectre.vmdl" + "SoundSet" "Hero_Spectre" + "Level" "11" + "ModelScale" "1.4" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_spectre.vsndevts" + "ConsideredHero" "1" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_spectre_active_dispersion" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "11" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "450" + "AttackDamageMax" "460" + "AttackRate" "1.5" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "200" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_LARGE" + "RingRadius" "70" + "HealthBarOffset" "300" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "300" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "3600" + "StatusHealthRegen" "0.0" + "StatusMana" "1800" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "8913" // belt: Flow of the Flowering Shade + } + "Wearable2" + { + "ItemDef" "8914" // shoulder: Drape of the Flowering Shade + } + "Wearable3" + { + "ItemDef" "8915" // weapon: Edge of the Flowering Shade + } + "Wearable4" + { + "ItemDef" "8916" // head: Crest of the Flowering shade + } + "Wearable5" + { + "ItemDef" "539" // ambient_effects: default + } + } + } + } + + //================================================================================= + // Creature: Wolf + //================================================================================= + "npc_dota_creature_wolf" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/items/lycan/wolves/ambry_summon/ambry_summon.vmdl" + "SoundSet" "DireHound" + "Level" "6" + "ModelScale" "1.0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "150" + "AttackDamageMax" "160" + "AttackRate" "1.3" + "AttackAnimationPoint" "0.33" + "AttackAcquisitionRange" "1000" + "AttackRange" "110" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "140" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "340" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "950" + "StatusHealthRegen" "3.0" + "StatusMana" "500" + "StatusManaRegen" "6" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.5" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + } + } + + //================================================================================= + // Creature: Phoenix + //================================================================================= + "npc_dota_creature_phoenix" + { + // General + //---------------------------------------------------------------- + "vscripts" "ai/phoenix.lua" + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/phoenix/phoenix_bird.vmdl" + "SoundSet" "Hero_Phoenix" + "Level" "16" + "ModelScale" "1.4" + "particle_folder" "particles/units/heroes/hero_phoenix" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_phoenix.vsndevts" + "VoiceFile" "soundevents/voscripts/game_sounds_vo_phoenix.vsndevts" + "ConsideredHero" "1" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_phoenix_icarus_dive" + "Ability2" "aghsfort_phoenix_icarus_dive_stop" + "Ability3" "aghsfort_phoenix_fire_spirits" + "Ability4" "aghsfort_phoenix_launch_fire_spirit" + "Ability5" "aghsfort_phoenix_supernova" + "Ability6" "creature_generic_high_status_resist_passive" + "Ability7" "phoenix_passive" + //"Ability7" "ability_absolute_no_cc" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "30" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "700" + "AttackDamageMax" "700" + "AttackRate" "1.3" + "AttackAnimationPoint" "0.35" + "AttackAcquisitionRange" "1000" + "AttackRange" "700" + "ProjectileModel" "particles/units/heroes/hero_phoenix/phoenix_base_attack.vpcf" + "ProjectileSpeed" "1100" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "340" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "300" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "9000" + "StatusHealthRegen" "0.0" + "StatusMana" "3000" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + //"DisableResistance" "75.0" + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "7835" // head: Crest of the Vermillion Crucible + } + "Wearable2" + { + "ItemDef" "7836" // ability_ultimate: Egg of the Vermillion Crucible + } + "Wearable3" + { + "ItemDef" "7837" // back: Feathers of the Vermillion Crucible + } + } + } + } + + //================================================================================= + // Creature: Ember Spirit + //================================================================================= + "npc_dota_creature_ember_spirit" + { + // General + //---------------------------------------------------------------- + "vscripts" "ai/ember_spirit.lua" + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/ember_spirit/ember_spirit.vmdl" + "SoundSet" "Hero_Emberspirit" + "Level" "9" + "ModelScale" "1.3" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_ember_spirit.vsndevts" + "particle_folder" "particles/units/heroes/hero_ember_spirit" + "VoiceFile" "soundevents/voscripts/game_sounds_vo_ember_spirit.vsndevts" + "ConsideredHero" "1" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ember_spirit_fireball" + //"Ability2" "creature_generic_high_status_resist_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "22" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "750" + "AttackDamageMax" "750" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "290" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "360" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "7000" + "StatusHealthRegen" "0.0" + "StatusMana" "1800" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "EquippedItems" + { + "MKB" + { + "Item" "item_monkey_king_bar" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "462" // head: Ember Spirit's Head Item + } + "Wearable2" + { + "ItemDef" "469" // shoulder: Ember Spirit's Shoulders + } + //"Wearable3" + //{ + //"ItemDef" "471" // belt: Ember Spirit's Belt Item + //} + "Wearable4" + { + "ItemDef" "472" // weapon: Ember Spirit's Main Weapon + } + "Wearable5" + { + "ItemDef" "473" // offhand_weapon: Ember Spirit's Offhand Weapon + } + //"Wearable6" + //{ + //"ItemDef" "474" // arms: Ember Spirit's Arms + //} + } + } + } + + //================================================================================= + // Creature: Dragon Knight + //================================================================================= + "npc_dota_creature_dragon_knight" + { + // General + //---------------------------------------------------------------- + "vscripts" "ai/dragon_knight.lua" + "BaseClass" "npc_dota_creature_dragon_knight" + "Model" "models/heroes/dragon_knight/dragon_knight.vmdl" + "SoundSet" "Hero_DragonKnight" + "Level" "13" + "ModelScale" "1.3" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_dragon_knight.vsndevts" + "particle_folder" "particles/units/heroes/hero_dragon_knight" + "ConsideredHero" "1" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_dragon_knight_breathe_fire" + "Ability2" "aghsfort_dragon_knight_dragon_tail" + "Ability3" "aghsfort_dragon_knight_elder_dragon_form" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "22" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "600" + "AttackDamageMax" "600" + "AttackRate" "1.3" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "1000" + "AttackRange" "200" + "ProjectileModel" "" + "ProjectileSpeed" "900" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "330" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "260" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "7000" + "StatusHealthRegen" "0.0" + "StatusMana" "1800" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + //"HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DisableClumpingBehavior" "1" + + //"DisableResistance" "100.0" + + "OffensiveAbilities" + { + "Ability1" + { + "Name" "aghsfort_dragon_knight_breathe_fire" + "AOE" "1" + "Radius" "250" + "MinimumTargets" "1" + } + } + + //"EquippedItems" + //{ + //"BlackKingBar" + //{ + //"Item" "item_creature_black_king_bar" + //} + //} + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "9638" // head: Helm of the Bitterwing Legacy + } + "Wearable2" + { + "ItemDef" "9639" // shoulder: Shoulder of the Bitterwing Legacy + } + "Wearable3" + { + "ItemDef" "9640" // back: Barding of the Bitterwing Legacy + } + "Wearable4" + { + "ItemDef" "9641" // offhand_weapon: Shield of the Bitterwing Legacy + } + "Wearable5" + { + "ItemDef" "9642" // arms: Arms of the Bitterwing Legacy + } + "Wearable6" + { + "ItemDef" "9643" // Blade of the Bitterwing Legacy + } + "Wearable7" + { + "ItemDef" "9644" // shapeshift: Bitterwing + } + } + } + } + + //================================================================================= + // Creature: Underlord + //================================================================================= + "npc_dota_creature_underlord" + { + // General + //---------------------------------------------------------------- + "vscripts" "ai/underlord.lua" + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/abyssal_underlord/abyssal_underlord_v2.vmdl" + "SoundSet" "Hero_AbyssalUnderlord" + "Level" "9" + "ModelScale" "0.7" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_abyssal_underlord.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "underlord_channelled_buff" + "Ability2" "aghsfort_underlord_firestorm" + "Ability3" "skeleton_king_run_passive" // adds "run" activity modifier + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "10" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "230" + "AttackDamageMax" "240" + "AttackRate" "1.5" + "AttackAnimationPoint" "0.45" + "AttackAcquisitionRange" "1000" + "AttackRange" "200" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "320" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1600" + "StatusHealthRegen" "0.0" + "StatusMana" "1800" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "12293" // head: Horns of the Obsidian Forge + } + "Wearable2" + { + "ItemDef" "12294" // armor: Armor of the Obsidian Forge + } + "Wearable3" + { + "ItemDef" "12295" // Blade of the Obsidian Forge + } + } + } + } + + //================================================================================= + // Creature: Friendly Ogre Tank + //================================================================================= + "npc_dota_creature_friendly_ogre_tank" + { + // Script + "vscripts" "ai/friendly_ogre_tank.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/creeps/ogre_1/large_ogre.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Ogre" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.8" + "ConsideredHero" "1" + "IsAncient" "1" + "skin" "0" //"1" + + "MinimapIcon" "minimap_enemyicon" + "MinimapIconSize" "275" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ogre_tank_melee_smash" + "Ability2" "ogre_tank_jump_smash" + "Ability3" "ability_ascension" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "10" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "200" + "AttackDamageMax" "225" + "AttackRate" "2.8" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "1" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + "RingRadius" "100" + "HealthBarOffset" "340" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "200" + "MovementTurnRate" "0.2" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "11000" + "StatusHealthRegen" "30" + "StatusMana" "400" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //------------------------------------------------------------ + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "DisableResistance" "100.0" + + //------------------------------------------------------------ + "ItemDrops" + { + } + } + } + + //================================================================================= + // Creature: Spider Sac + //================================================================================= + "npc_dota_spider_sac" + { + // General + //---------------------------------------------------------------- + "Model" "models/creeps/spiders/spidersack.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "0" + "Level" "1" + "ModelScale" "1.0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "spider_egg_sack" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" + + // Bounty + //---------------------------------------------------------------- + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1" + "StatusHealthRegen" "0.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "0" + "VisionNighttimeRange" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + } + + //================================================================================= + // Creature: Broodmother + //================================================================================= + "npc_dota_creature_broodmother" + { + // Scripts + "vscripts" "ai/broodmother.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/broodmother/broodmother.vmdl" + "SoundSet" "Hero_Broodmother" + "Level" "1" + "ModelScale" "1.3" + "ConsideredHero" "1" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_broodmother.vsndevts" + "EnableIK" "0" + + // Abilities + //---------------------------------------------------------------- + //"Ability1" "broodmother_accrue_children" + "Ability1" "broodmother_web" + "Ability2" "creature_generic_high_status_resist_passive" + //"Ability4" "ability_absolute_no_cc" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "27" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "650" + "AttackDamageMax" "650" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "800" + "AttackRange" "165" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "220" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "300" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "6000" + "StatusHealthRegen" "0.0" + "StatusMana" "500" + "StatusManaRegen" "5.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.5" + + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "EquippedItems" + { + "MKB" + { + "Item" "item_monkey_king_bar" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "8395" // head: Ancient Crown of the Arachnarok + } + "Wearable2" + { + "ItemDef" "8397" // misc: Ancient Pedipalps of the Arachnarok + } + "Wearable3" + { + "ItemDef" "9090" // back: Lycosidae's Brood + } + "Wearable4" + { + "ItemDef" "8399" // legs: Ancient Legs of the Arachnarok + } + } + } + } + + //================================================================================= + // Creature: Huge Broodmother + //================================================================================= + "npc_dota_creature_huge_broodmother" + { + // Scripts + "vscripts" "ai/huge_broodmother.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/broodmother/broodmother.vmdl" + "SoundSet" "Hero_Broodmother" + "Level" "1" + "ModelScale" "1.8" + "ConsideredHero" "1" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_broodmother.vsndevts" + "EnableIK" "0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "huge_brood_passive" + "Ability2" "huge_broodmother_accrue_children" + "Ability3" "broodmother_web" + "Ability4" "huge_brood_summon_eggs" + "Ability5" "ability_absolute_no_cc" + "Ability6" "creature_generic_high_status_resist_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "35" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "950" + "AttackDamageMax" "950" + "AttackRate" "1.3" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "165" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "90" + "HealthBarOffset" "290" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "13500" + "StatusHealthRegen" "0.0" + "StatusMana" "2000" + "StatusManaRegen" "15.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.5" + + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "EquippedItems" + { + "MKB" + { + "Item" "item_monkey_king_bar" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "8562" // misc: Cowl of the Glutton's Larder + } + "Wearable2" + { + "ItemDef" "8563" // legs: Legs of the Glutton's Larder + } + "Wearable3" + { + "ItemDef" "8564" // head: Crown of the Glutton's Larder + } + "Wearable4" + { + "ItemDef" "8565" // back: Abdomen of the Glutton's Larder + } + } + } + } + + //================================================================================= + // Creature: Newborn Spider + //================================================================================= + "npc_dota_creature_newborn_spider" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/broodmother/spiderling.vmdl" + "SoundSet" "Hero_Broodmother" + "Level" "1" + "ModelScale" ".35" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "mini_spider_slow_attack" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "8" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "220" + "AttackDamageMax" "220" + "AttackRate" "1.25" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "1000" + "AttackRange" "110" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" + "RingRadius" "35" + "HealthBarOffset" "110" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "450" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "650" + "StatusHealthRegen" "0" + "StatusMana" "200" + "StatusManaRegen" "3" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Pathing + //---------------------------------------------------------------- + "PathfindingSearchDepthScale" "0.01" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + } + } + + //================================================================================= + // Creature: Broodmother Baby C + //================================================================================= + "npc_dota_creature_broodmother_baby_c" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/broodmother/spiderling.vmdl" + "SoundSet" "0" + "Level" "1" + "ModelScale" "0.55" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "baby_broodmother_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "9" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "300" + "AttackDamageMax" "300" + "AttackRate" "1.3" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "1000" + "AttackRange" "110" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" + "RingRadius" "45" + "HealthBarOffset" "130" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "380" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "2000" + "StatusHealthRegen" "0.0" + "StatusMana" "100" + "StatusManaRegen" "3.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "900" + "VisionNighttimeRange" "900" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.2" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + } + } + + //================================================================================= + // Creature: Broodmother Baby D + //================================================================================= + "npc_dota_creature_broodmother_baby_d" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/items/broodmother/spiderling/elder_blood_heir_of_elder_blood/elder_blood_heir_of_elder_blood.vmdl" + "SoundSet" "0" + "Level" "1" + "ModelScale" "0.7" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "baby_broodmother_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "10" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "380" + "AttackDamageMax" "380" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "1000" + "AttackRange" "110" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" + "RingRadius" "50" + "HealthBarOffset" "150" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "360" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "2700" + "StatusHealthRegen" "0.0" + "StatusMana" "100" + "StatusManaRegen" "3.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "900" + "VisionNighttimeRange" "900" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.2" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + } + } + + //================================================================================= + // Creature: Kidnap Spider + //================================================================================= + "npc_dota_creature_kidnap_spider" + { + // Script + "vscripts" "ai/kidnap_spider.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/spiders/spider_kidnap.vmdl" + "SoundSet" "Hero_Broodmother" + "Level" "1" + "ModelScale" "1.0" + "ConsideredHero" "1" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_broodmother.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_batrider_flaming_lasso" + "Ability2" "kidnap_spider_summon_eggs" + "Ability3" "creature_generic_high_status_resist_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "21" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "550" + "AttackDamageMax" "550" + "AttackRate" "1.5" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "215" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "540" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "4200" + "StatusHealthRegen" "0" + "StatusMana" "600" + "StatusManaRegen" "20" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + } + + //================================================================================================================= + // Dummy Caster + //================================================================================================================= + "npc_dota_dummy_caster" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/development/invisiblebox.vmdl" + "SoundSet" "Creep_Good_Melee" + "Level" "1" + "ModelScale" "1.0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "dummy_caster_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "110" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "30" + "StatusHealthRegen" "0" + "StatusMana" "10000" + "StatusStartingMana" "10000" + "StatusManaRegen" "500" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + "DisableDamageDisplay" "1" + } + + + //================================================================================================================= + // Dummy target for chicken TPs + //================================================================================================================= + "npc_dota_dummy_target" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/development/invisiblebox.vmdl" + "SoundSet" "Creep_Good_Melee" + "Level" "1" + "ModelScale" "1.0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "dummy_target_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "110" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "3000" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + "DisableDamageDisplay" "1" + } + + //================================================================================= + // Sled Penguin + //================================================================================= + "npc_dota_sled_penguin" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/ice_biome/penguin/penguin.vmdl" + "SoundSet" "Creep_Good_Melee_Mega" + "ModelScale" "2.7" + "Level" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "sled_penguin_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "100" + "MagicalResistance" "100" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "5" + "AttackDamageMax" "5" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1" + "AttackAnimationPoint" "0.467" + "AttackAcquisitionRange" "500" + "AttackRange" "130" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "25" + "BountyGoldMin" "16" + "BountyGoldMax" "24" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "160" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "325" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusManaRegen" "10" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "800" + + //Inventory + "HasInventory" "0" + "Creature" + { + } + } + + //================================================================================= + // Creature: Wandering Ogre Seal + //================================================================================= + "npc_dota_creature_wandering_ogre_seal" + { + // Script + //"vscripts" "ai/wandering_ogre_seal.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/ice_biome/ogreseal/ogreseal_rednose.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "1.0" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "wandering_ogre_seal_passive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "10" + "AttackDamageMax" "10" + "AttackRate" "1.8" + "AttackAnimationPoint" "0.5714" + "AttackAcquisitionRange" "1" + "AttackRange" "1" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "65" + "HealthBarOffset" "250" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "175" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1200" + "StatusHealthRegen" "3" + "StatusMana" "600" + "StatusManaRegen" "5.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "1.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "DisableClumpingBehavior" "1" + } + } + + //================================================================================= + // Creeps: Watch Tower + //================================================================================= + "npc_dota_aghsfort_watch_tower_option_1" + { + // General + // + "BaseClass" "npc_dota_aghsfort_watch_tower" // Class of entity of link to. + "Model" "models/props_structures/aghanim_outpost.vmdl" // Model. + "ModelScale" "0.8" + "OptionNumber" "1" + "MovePlayersRadius" "500" + "SoundSet" "Creep_Good_Melee" // Name of sound set. + "MinimapIcon" "minimap_miscbuilding" + "destroysound" "Building_RadiantTower.Destruction" + "destroyfx" "particles/radiant_fx/radiant_statue001_destruction.vpcf" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" // Damage range min. + "AttackDamageMax" "0" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" // Speed of attack. + "AttackAnimationPoint" "0" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "0" // Range within a target can be acquired. + "AttackRange" "0" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "0" // Speed of projectile. + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" // Base strength + "AttributeStrengthGain" "0" // Strength bonus per level. + "AttributeBaseIntelligence" "0" // Base intelligence + "AttributeIntelligenceGain" "0" // Intelligence bonus per level. + "AttributeBaseAgility" "0" // Base agility + "AttributeAgilityGain" "0" // Agility bonus per level. + + // Bounty + //---------------------------------------------------------------- + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_FILLER" // Hull type used for navigation/locomotion. + "RingRadius" "100" + "HealthBarOffset" "375" + "MinimapIconSize" "500" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "450" // Base health. + "StatusHealthRegen" "0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_SIEGE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_STRUCTURE" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_BUILDING" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "0" // Range of vision during day light. + "VisionNighttimeRange" "0" // Range of vision at night time. + } + + "npc_dota_aghsfort_watch_tower_option_2" + { + // General + // + "BaseClass" "npc_dota_aghsfort_watch_tower" // Class of entity of link to. + "Model" "models/props_structures/aghanim_outpost.vmdl" // Model. + "ModelScale" "0.8" + "OptionNumber" "2" + "MovePlayersRadius" "500" + "SoundSet" "Creep_Good_Melee" // Name of sound set. + "MinimapIcon" "minimap_miscbuilding" + "destroysound" "Building_RadiantTower.Destruction" + "destroyfx" "particles/radiant_fx/radiant_statue001_destruction.vpcf" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" // Damage range min. + "AttackDamageMax" "0" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" // Speed of attack. + "AttackAnimationPoint" "0" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "0" // Range within a target can be acquired. + "AttackRange" "0" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "0" // Speed of projectile. + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" // Base strength + "AttributeStrengthGain" "0" // Strength bonus per level. + "AttributeBaseIntelligence" "0" // Base intelligence + "AttributeIntelligenceGain" "0" // Intelligence bonus per level. + "AttributeBaseAgility" "0" // Base agility + "AttributeAgilityGain" "0" // Agility bonus per level. + + // Bounty + //---------------------------------------------------------------- + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_FILLER" // Hull type used for navigation/locomotion. + "RingRadius" "100" + "HealthBarOffset" "375" + "MinimapIconSize" "500" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "450" // Base health. + "StatusHealthRegen" "0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_SIEGE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_STRUCTURE" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_BUILDING" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "0" // Range of vision during day light. + "VisionNighttimeRange" "0" // Range of vision at night time. + } + + //================================================================================= + // Ascension Level picker (for use in outpost previews only -- doesn't actually do anything) + //================================================================================= + "aghsfort_ascension_level_picker_1" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/items/courier/mighty_chicken/mighty_chicken.vmdl" + "ModelScale" "1.7" + "Level" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0" // Turning rate. + + // Team + //---------------------------------------------------------------- + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + } + + //================================================================================= + // Ascension Level picker (for use in outpost previews only -- doesn't actually do anything) + //================================================================================= + "aghsfort_ascension_level_picker_2" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/props_structures/well_skull.vmdl" + "ModelScale" "0.6" + "Level" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0" // Turning rate. + + // Team + //---------------------------------------------------------------- + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + } + + //================================================================================= + // Ascension Level picker (for use in outpost previews only -- doesn't actually do anything) + //================================================================================= + "aghsfort_ascension_level_picker_3" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/props_structures/well_skull.vmdl" + "ModelScale" "1" + "Level" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0" // Turning rate. + + // Team + //---------------------------------------------------------------- + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + } + + //================================================================================= + // Ascension Level picker (for use in outpost previews only -- doesn't actually do anything) + //================================================================================= + "aghsfort_ascension_level_picker_4" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/props_structures/well_skull.vmdl" + "ModelScale" "1.4" + "Level" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0" // Turning rate. + + // Team + //---------------------------------------------------------------- + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + } + + "npc_dota_aghsfort_effigy" + { + // General + // + "BaseClass" "npc_dota_aghsfort_effigy" // Class of entity of link to. + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" // Damage range min. + "AttackDamageMax" "0" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" // Speed of attack. + "AttackAnimationPoint" "0" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "0" // Range within a target can be acquired. + "AttackRange" "0" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "0" // Speed of projectile. + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" // Base strength + "AttributeStrengthGain" "0" // Strength bonus per level. + "AttributeBaseIntelligence" "0" // Base intelligence + "AttributeIntelligenceGain" "0" // Intelligence bonus per level. + "AttributeBaseAgility" "0" // Base agility + "AttributeAgilityGain" "0" // Agility bonus per level. + + // Bounty + //---------------------------------------------------------------- + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "0" + "HealthBarOffset" "0" + "MinimapIconSize" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1" // Base health. + "StatusHealthRegen" "0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_SIEGE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_STRUCTURE" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_BUILDING" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "0" // Range of vision during day light. + "VisionNighttimeRange" "0" // Range of vision at night time. + + "EnableIK" "0" + } + + //================================================================================= + // Breathe Fire Trap + //================================================================================= + "npc_dota_breathe_fire_trap" + { + // General + "BaseClass" "npc_dota_trap_ward" + "Model" "models/props/traps/barking_dog/barking_dog.vmdl" + "Level" "1" + "VisbibleInPortraitOnly" "0" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "breathe_fire" + "Ability2" "trap_unselectable" + "Ability3" "provides_fow_position" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "0.25" + + // Team + //---------------------------------------------------------------- + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "500" + "VisionNighttimeRange" "500" + } + + //================================================================================= + // Spike Trap + //================================================================================= + "npc_dota_spike_trap_ward" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/props/traps/spiketrap/spiketrap.vmdl"// Model. + "Level" "1" + "VisbibleInPortraitOnly" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "spike_trap" // Ability 1. + "Ability2" "trap_unselectable" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0.25" // Turning rate. + + // Team + //---------------------------------------------------------------- + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + } + + //================================================================================= + // Arrow Trap + //================================================================================= + "npc_dota_arrow_trap" + { + // General + "BaseClass" "npc_dota_trap_ward" + "Model" "models/props/traps/barking_dog/barking_dog.vmdl" + "Level" "1" + "VisbibleInPortraitOnly" "0" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "arrow" + "Ability2" "trap_unselectable" + "Ability3" "provides_fow_position" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "0.25" + + // Team + //---------------------------------------------------------------- + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "500" + "VisionNighttimeRange" "500" + } + + //================================================================================= + // Pendulum Trap + //================================================================================= + "npc_dota_pendulum_trap" + { + // Script + "vscripts" "traps/pendulum_trap.lua" + + // General + "BaseClass" "npc_dota_creature" + "Model" "models/props/traps/pendulum/pendulum_extended.vmdl" + "Level" "1" + "ModelScale" "0.7" + + + // Abilities + //---------------------------------------------------------------- + "Ability1" "pendulum_swing" + "Ability2" "trap_unselectable" + "Ability3" "phased" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "6" + + // Team + //---------------------------------------------------------------- + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + } + + //================================================================================= + // Holdout Tower - Tier 1 + //================================================================================= + "npc_dota_holdout_tower" + { + // General + "BaseClass" "npc_dota_holdout_tower" + "Model" "models/props_structures/tower_good.vmdl" + "SoundSet" "Tower.Water" + "MinimapIcon" "minimap_tower90" + "MinimapIconSize" "320" + "Level" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "20" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "140" + "AttackDamageMax" "140" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1" + "AttackAnimationPoint" "0.6" + "AttackAcquisitionRange" "700" + "AttackRange" "700" + "ProjectileModel" "particles/base_attacks/ranged_tower_good.vpcf" + "ProjectileSpeed" "750" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_TOWER" + "ProjectileCollisionSize" "50" + "RingRadius" "130" + "HealthBarOffset" "320" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "3000" + "StatusHealthRegen" "3" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_SIEGE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_STRUCTURE" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_BUILDING" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1900" + "VisionNighttimeRange" "1600" + } + + //================================================================================= + // Holdout Tower - Tier 2 + //================================================================================= + "npc_dota_holdout_tower_tier2" + { + // General + "BaseClass" "npc_dota_holdout_tower" + "Model" "models/props_structures/tower_good.vmdl" + "SoundSet" "Tower.Water" + "MinimapIcon" "minimap_tower90" + "MinimapIconSize" "320" + "Level" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "35" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "450" + "AttackDamageMax" "450" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1" + "AttackAnimationPoint" "0.6" + "AttackAcquisitionRange" "700" + "AttackRange" "700" + "ProjectileModel" "particles/base_attacks/ranged_tower_good.vpcf" + "ProjectileSpeed" "750" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_TOWER" + "ProjectileCollisionSize" "50" + "RingRadius" "130" + "HealthBarOffset" "320" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "5000" + "StatusHealthRegen" "5" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_SIEGE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_STRUCTURE" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_BUILDING" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1900" + "VisionNighttimeRange" "1600" + } + + //================================================================================= + // Creature: Wildwing Laborer + //================================================================================= + "npc_dota_creature_wildwing_laborer" + { + // General + //---------------------------------------------------------------- + "Model" "models/creeps/neutral_creeps/n_creep_vulture_b/n_creep_vulture_b.mdl" // Model. + "BaseClass" "npc_dota_creature" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" ".80" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" // Ability 1 + "Ability2" "" // Ability 2 + "Ability3" "" // Ability 3 + "Ability4" "" // Ability 4 + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "45" // Damage range min. + "AttackDamageMax" "50" // Damage range max. + "AttackRate" "1.35" // Speed of attack. + "AttackAnimationPoint" "0.3" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "1000" // Range within a target can be acquired. + "AttackRange" "128" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "0" // Speed of projectile. + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "50" + "HealthBarOffset" "170" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "30" // Experience earn. + "BountyGoldMin" "21" // Gold earned min. + "BountyGoldMax" "24" // Gold earned max. + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" // Speed. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "220" // Base health. + "StatusHealthRegen" "0.5" // Health regeneration rate. + "StatusMana" "500" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" // Range of vision during day light. + "VisionNighttimeRange" "800" // Range of vision at night time. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + } + } + + //================================================================================= + // Creature: dazzle + //================================================================================= + "npc_dota_creature_dazzle" + { + // General + //---------------------------------------------------------------- + "Model" "models/heroes/dazzle/dazzle.vmdl" + "Portrait" "vgui/hud/heroportraits/portrait_dazzle" + "IdleExpression" "scenes/dazzle/dazzle_exp_idle_01.vcd" + "SoundSet" "Hero_Dazzle" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.25" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_poison_touch" + "Ability2" "creature_shallow_grave" + "Ability3" "creature_shadow_wave" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "1" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "80" + "AttackDamageMax" "90" + "AttackRate" "1.60" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "800" + "AttackRange" "500" + "ProjectileModel" "particles/units/heroes/hero_dazzle/dazzle_base_attack.vpcf" + "ProjectileSpeed" "1200" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "50" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "30" + "BountyGoldMin" "21" + "BountyGoldMax" "24" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "600" + "StatusHealthRegen" "0.5" + "StatusMana" "500" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ParticleFile" "particles/units/heroes/hero_dazzle.pcf" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "80.0" + "Avoidance" "0.0" + "Support" "40.0" + } + } + + "DefaultState" "Invade" + + "OffensiveAbilities" + { + "Ability1" + { + "Name" "creature_poison_touch" + } + } + + "DefensiveAbilities" + { + "Ability3" + { + "Name" "creature_shadow_wave" + "AOE" "1" + "Heal" "1" + "Radius" "600" + "MinimumTargets" "2" + } + } + + "EscapeAbilities" + { + "Ability2" + { + "Name" "creature_shallow_grave" + "CanHelpOthersEscape" "1" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "263" // back: default + } + "Wearable2" + { + "ItemDef" "468" // misc: default + } + "Wearable3" + { + "ItemDef" "265" // legs: default + } + "Wearable4" + { + "ItemDef" "266" // arms: default + } + "Wearable5" + { + "ItemDef" "264" // weapon: default + } + } + } + } + + //================================================================================= + // Creature: Huskar + //================================================================================= + "npc_dota_creature_huskar" + { + // General + //---------------------------------------------------------------- + "Model" "models/heroes/huskar/huskar.vmdl" + "IdleExpression" "scenes/huskar/huskar_exp_idle_01.vcd" + "SoundSet" "Hero_Huskar" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.5" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_berserkers_blood" + "Ability2" "creature_inner_fire" + "Ability3" "creature_life_break" + "Ability4" "creature_burning_spears" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "66" + "AttackDamageMax" "70" + "AttackRate" "1.50" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "800" + "AttackRange" "400" + "ProjectileModel" "particles/units/heroes/hero_huskar/huskar_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "50" + "HealthBarOffset" "220" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "30" + "BountyGoldMin" "21" + "BountyGoldMax" "24" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "275" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1000" + "StatusHealthRegen" "0.5" + "StatusMana" "500" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ParticleFile" "particles/units/heroes/hero_huskar.pcf" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "OffensiveAbilities" + { + "Ability1" + { + "Name" "creature_inner_fire" + "AOE" "1" + "Radius" "400" + "MinimumTargets" "2" + + } + "Ability3" + { + "Name" "creature_life_break" + "UseAtHealthPercent" "50" + } + + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "270" // back: default + } + "Wearable2" + { + "ItemDef" "269" // misc: default + } + "Wearable3" + { + "ItemDef" "272" // legs: default + } + "Wearable4" + { + "ItemDef" "268" // arms: default + } + "Wearable5" + { + "ItemDef" "271" // weapon: default + } + } + } + } + + + //================================================================================= + // Boss Timbersaw + //================================================================================= + "npc_dota_boss_timbersaw" + { + // Script + "vscripts" "ai/boss_timbersaw.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/shredder/shredder.vmdl" + "IdleExpression" "scenes/shredder/shredder_exp_idle_01.vcd" + "SoundSet" "Hero_Shredder" + "IdleSoundLoop" "Hero_Shredder.IdleLoop" + "Level" "1" + "ModelScale" "2.0" + "ConsideredHero" "1" + "IsAncient" "1" + "IsBossMonster" "1" + + // Minimap + //---------------------------------------------------------------- + "MinimapIcon" "minimap_roshancamp" + "MinimapIconSize" "250" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "boss_timbersaw_whirling_death" + "Ability2" "boss_timbersaw_timber_chain" + "Ability3" "boss_timbersaw_reactive_armor" + "Ability4" "shredder_chakram_2" + "Ability5" "shredder_chakram" + "Ability6" "shredder_return_chakram" + "Ability7" "shredder_return_chakram_2" + "Ability8" "generic_gold_bag_fountain_4000" + "Ability9" "boss_timbersaw_chakram_dance" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "10" + "MagicalResistance" "25" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "250" + "AttackDamageMax" "300" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.53" + "AttackAcquisitionRange" "1800" + "AttackRange" "300" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "75" + "HealthBarOffset" "250" + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "1000" + "BountyGoldMin" "500" + "BountyGoldMax" "1000" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "300" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "15000" + "StatusHealthRegen" "0" + "StatusMana" "25000" + "StatusManaRegen" "250" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1800" + "VisionNighttimeRange" "1800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "7581" // Controlled Burn + } + "Wearable2" + { + "ItemDef" "12927" // Rectifier + } + "Wearable3" + { + "ItemDef" "9695" // Helm of the Siege Engine + } + "Wearable4" + { + "ItemDef" "9694" // Pauldrons of the Siege Engine + } + "Wearable5" + { + "ItemDef" "9693" // Hull of the Siege Engine + } + "Wearable6" + { + "ItemDef" "9692" // Armor of the Siege Engine + } + } + + "EquippedItems" + { + "Aghs" + { + "Item" "item_ultimate_scepter" + } + } + + "HPGain" "2625" + "DamageGain" "60" + } + } + + //================================================================================= + // Boss Timbersaw Treant + //================================================================================= + "npc_dota_creature_timbersaw_treant" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/heroes/furion/treant.vmdl" // Model. + "SoundSet" "Furion_Treant" // Name of sound set. + "ModelScale" "1.2" + "Level" "1" + "IsSummoned" "1" + "SelectionGroup" "Furion_Treants" + "wearable" "8363" + "UnitLabel" "treants" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "50" // Damage range min. + "AttackDamageMax" "60" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1.75" // Speed of attack. + "AttackAnimationPoint" "0.467" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "1000" // Range within a target can be acquired. + "AttackRange" "128" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "20" // Experience earn. + "BountyGoldMin" "16" // Gold earned min. + "BountyGoldMax" "16" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" // Hull type used for navigation/locomotion. + "HealthBarOffset" "170" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "365" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "200" // Base health. + "StatusHealthRegen" "0.5" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "500" // Range of vision during day light. + "VisionNighttimeRange" "500" // Range of vision at night time. + + "Creature" + { + } + } + + //================================================================================= + // Boss Visage + //================================================================================= + "npc_dota_boss_visage" + { + // Script + "vscripts" "ai/boss_visage.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/visage/visage.vmdl" + "IdleExpression" "scenes/visage/visage_exp_idle_01.vcd" + "SoundSet" "Hero_Visage" + "IdleSoundLoop" "Hero_Visage.IdleLoop" + "Level" "1" + "ModelScale" "2.3" + "ConsideredHero" "1" + "IsAncient" "1" + "IsBossMonster" "1" + + // Minimap + //---------------------------------------------------------------- + "MinimapIcon" "minimap_roshancamp" + "MinimapIconSize" "250" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "boss_visage_ranged_attack" + "Ability2" "boss_visage_grave_chill" + "Ability3" "boss_visage_passive" + "Ability4" "generic_gold_bag_fountain_4000" + "Ability5" "ability_absolute_no_cc" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "50" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.53" + "AttackAcquisitionRange" "3000" + "AttackRange" "300" + "ProjectileModel" "particles/units/heroes/hero_visage/visage_base_attack.vpcf" + "ProjectileSpeed" "9000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "75" + "HealthBarOffset" "250" + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "1000" + "BountyGoldMin" "500" + "BountyGoldMax" "1000" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "16000" + "StatusHealthRegen" "0" + "StatusMana" "25000" + "StatusManaRegen" "250" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "3000" + "VisionNighttimeRange" "3000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "UsesGestureBasedAttackAnimation" "1" + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "543" // Visage Ambient + } + "Wearable2" + { + "ItemDef" "599" // Familiars + } + "Wearable3" + { + "ItemDef" "625" // Visage Armor + } + "Wearable4" + { + "ItemDef" "624" // Visage's... Visage + } + "Wearable5" + { + "ItemDef" "600" // Familiar Ambient + } + } + + "HPGain" "2500" + "DamageGain" "50" + } + } + + //================================================================================= + // Boss Visage Familiar + //================================================================================= + "npc_dota_boss_visage_familiar" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/heroes/visage/visage_familiar.vmdl" // Model. + "SoundSet" "Visage_Familiar" // Name of sound set. + "ModelScale" "1.0" + "Level" "1" + "IsSummoned" "1" + "IsAncient" "1" + "UnitLabel" "visage_familiars" + "ConsideredHero" "0" + "wearable" "600" + + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "boss_visage_familiar_stone_form" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "50" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "35" // Damage range min. + "AttackDamageMax" "35" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0.75" // Speed of attack. + "AttackAnimationPoint" "0.33" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "3000" // Range within a target can be acquired. + "AttackRange" "160" // Range within a target can be attacked. + "ProjectileModel" "particles/units/heroes/hero_visage/visage_familiar_base_attack.vpcf" // Particle system model for projectile. + "ProjectileSpeed" "900" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "41" // Experience earn. + "BountyGoldMin" "100" // Gold earned min. + "BountyGoldMax" "100" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" // Hull type used for navigation/locomotion. + "HealthBarOffset" "130" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "270" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "350" // Base health. + "StatusHealthRegen" "0.0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0.0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_HERO" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1500" // Range of vision during day light. + "VisionNighttimeRange" "1500" // Range of vision at night time. + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "ShouldDoFlyHeightVisual" "1" + "IsHybridFlyer" "1" + "UsesGestureBasedAttackAnimation" "1" + } + } + + //================================================================================= + // Boss Visage Familiar + //================================================================================= + "npc_dota_boss_visage_familiar_statue" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/heroes/visage/visage_familiar.vmdl" // Model. + "SoundSet" "Visage_Familiar" // Name of sound set. + "ModelScale" "1.6" + "Level" "1" + "IsSummoned" "1" + "IsAncient" "1" + "UnitLabel" "visage_familiars" + "ConsideredHero" "0" + "wearable" "600" + + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "boss_visage_familiar_stone_form" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "50" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "0" // Damage range min. + "AttackDamageMax" "0" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0.4" // Speed of attack. + "AttackAnimationPoint" "0.33" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "3000" // Range within a target can be acquired. + "AttackRange" "160" // Range within a target can be attacked. + "ProjectileModel" "particles/units/heroes/hero_visage/visage_familiar_base_attack.vpcf" // Particle system model for projectile. + "ProjectileSpeed" "900" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "41" // Experience earn. + "BountyGoldMin" "100" // Gold earned min. + "BountyGoldMax" "100" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" // Hull type used for navigation/locomotion. + "HealthBarOffset" "130" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "250" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "220" // Base health. + "StatusHealthRegen" "0.0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0.0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_HERO" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1500" // Range of vision during day light. + "VisionNighttimeRange" "1500" // Range of vision at night time. + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + } + } + + //================================================================================= + // Boss Void Spirit + //================================================================================= + "npc_dota_boss_void_spirit" + { + // Script + "vscripts" "ai/boss_void_spirit.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + + "Model" "models/heroes/void_spirit/void_spirit.vmdl" + "IdleExpression" "scenes/void_spirit/void_spirit_exp_idle_01.vcd" + "SoundSet" "Hero_VoidSpirit" + //"IdleSoundLoop" "Hero_VoidSpirit.IdleLoop" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_void_spirit.vsndevts" + "VoiceFile" "soundevents/voscripts/game_sounds_vo_void_spirit.vsndevts" + "ParticleFile" "particles/units/heroes/hero_void_spirit.pcf" + "Level" "1" + "ModelScale" "1.8" + "ConsideredHero" "1" + "IsAncient" "1" + "IsBossMonster" "1" + + // Minimap + //---------------------------------------------------------------- + "MinimapIcon" "minimap_roshancamp" + "MinimapIconSize" "250" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_void_spirit_boss_aether_remnant" + "Ability2" "aghsfort_void_spirit_boss_dissimilate" + "Ability3" "aghsfort_void_spirit_boss_resonant_pulse" + "Ability4" "void_spirit_boss_activate_earth_spirits" + "Ability5" "generic_hidden" + "Ability6" "aghsfort_void_spirit_boss_astral_step" + "Ability7" "generic_gold_bag_fountain_4000" + "Ability8" "aghsfort_void_spirit_boss_passive" + "Ability9" "ability_absolute_no_cc" + "Ability10" "special_bonus_mp_regen_3" + "Ability11" "special_bonus_attack_damage_30" + "Ability12" "ability_attack_speed_unslowable" + //"Ability12" "special_bonus_unique_void_spirit_7" + //"Ability13" "special_bonus_unique_void_spirit_4" + //"Ability14" "special_bonus_spell_amplify_15" + //"Ability15" "special_bonus_unique_void_spirit_1" + "Ability16" "special_bonus_unique_void_spirit_8" // astral step crit + "Ability17" "special_bonus_unique_void_spirit_3" // dissimilate stuns + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "21" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "475" + "AttackDamageMax" "475" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.35" + "AttackAcquisitionRange" "1500" + "AttackRange" "300" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "75" + "HealthBarOffset" "340" + "BoundsHullName" "DOTA_HULL_SIZE_LARGE" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "350" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "43000" + "StatusHealthRegen" "0" + "StatusMana" "25000" + "StatusManaRegen" "250" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1500" + "VisionNighttimeRange" "1500" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "686" // default weapon + } + "Wearable2" + { + "ItemDef" "687" // default head + } + "Wearable3" + { + "ItemDef" "689" // default belt + } + "Wearable4" + { + "ItemDef" "690" // default ambient effects + } + //"Wearable5" + //{ + //"ItemDef" "688" // default armor [busted] + //} + } + + "EquippedItems" + { + "Aghs" + { + "Item" "item_ultimate_scepter" + } + "MKB" + { + "Item" "item_monkey_king_bar" + } + } + + "HPGain" "7050" + "DamageGain" "115" + } + } + + //================================================================================= + // Earth Spirit Statue + //================================================================================= + "npc_dota_earth_spirit_statue" + { + // Script + "vscripts" "ai/earth_spirit_statue.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + + "Model" "models/heroes/earth_spirit/earth_spirit.vmdl" + "IdleExpression" "scenes/earth_spirit/earth_spirit_exp_idle_01.vcd" + "SoundSet" "Hero_EarthSpirit" + //"IdleSoundLoop" "Hero_EarthSpirit.IdleLoop" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_earth_spirit.vsndevts" + "particle_folder" "particles/units/heroes/hero_earth_spirit" + "VoiceFile" "soundevents/voscripts/game_sounds_vo_earth_spirit.vsndevts" + "ParticleFile" "particles/units/heroes/hero_earth_spirit.pcf" + "Level" "1" + "ModelScale" "1.2" + "ConsideredHero" "1" + "IsAncient" "1" + "IsBossMonster" "1" + + // Minimap + //---------------------------------------------------------------- + "MinimapIcon" "minimap_roshancamp" + "MinimapIconSize" "250" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_earth_spirit_boss_boulder_smash" + "Ability2" "aghsfort_earth_spirit_boss_rolling_boulder" + "Ability3" "aghsfort_earth_spirit_boss_geomagnetic_grip" + "Ability4" "aghsfort_earth_spirit_boss_stone_caller" + "Ability5" "aghsfort_earth_spirit_boss_petrify" + "Ability6" "aghsfort_earth_spirit_boss_magnetize" + "Ability7" "earth_spirit_statue_passive" // lua + "Ability10" "special_bonus_unique_earth_spirit_4" + "Ability11" "special_bonus_attack_damage_50" + "Ability12" "special_bonus_armor_6" + "Ability13" "special_bonus_unique_earth_spirit" + "Ability14" "special_bonus_spell_amplify_16" + "Ability15" "special_bonus_unique_earth_spirit_5" + "Ability16" "special_bonus_unique_earth_spirit_2" + "Ability17" "special_bonus_unique_earth_spirit_3" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "40" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "100" + "AttackDamageMax" "100" + "AttackRate" "1.3" + "AttackAnimationPoint" "0.35" + "AttackAcquisitionRange" "2500" + "AttackRange" "200" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "75" + "HealthBarOffset" "340" + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "250" + "MovementTurnRate" "0.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "25000" + "StatusHealthRegen" "5" + "StatusMana" "25000" + "StatusManaRegen" "250" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "2500" + "VisionNighttimeRange" "2500" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //"HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "481" // arms: default + //"ItemDef" "8712" // arms: Arms of the Jade General + } + "Wearable2" + { + "ItemDef" "479" // belt: default + //"ItemDef" "8903" // belt: Belt of the Jade General + } + "Wearable3" + { + // This unit has no face for some reason.. + "ItemDef" "13389" // head: Helm of the Jade Emissary + //"ItemDef" "7185" // head: Kabuto of Bedrock Serenity + //"ItemDef" "8904" // head: Style of the Jade General + //"ItemDef" "477" // head: default + } + "Wearable4" + { + "ItemDef" "480" // neck: default + //"ItemDef" "8905" // neck: Armor of the Jade General + } + "Wearable5" + { + "ItemDef" "475" // staff: default + //"ItemDef" "8906" // Staff of the Jade General + } + } + + //"EquippedItems" + //{ + //"Aghs" + //{ + //"Item" "item_ultimate_scepter" + //} + //} + + + } + } + + "npc_dota_aghsfort_earth_spirit_boss_stone" + { + // General + //---------------------------------------------------------------- + "Model" "models/heroes/attachto_ghost/attachto_ghost.vmdl" + "SoundSet" "0" + "Level" "4" + "ModelScale" "24" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" + + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_FLY" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "0" + "VisionNighttimeRange" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + } + + //================================================================================= + // Creature: Bomber + //================================================================================= + "npc_dota_creature_bomber" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/rattletrap/rattletrap.vmdl" + "SoundSet" "Hero_Rattletrap" + "Level" "1" + "ModelScale" "0.8" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_techies.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "bomber_death_explosion" + //"Ability2" "bomber_suicide_on_attack" // disabling this + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "5" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "57" + "AttackDamageMax" "74" + "AttackRate" "1.4" + "AttackAnimationPoint" "0.33" + "AttackAcquisitionRange" "500" + "AttackRange" "100" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" + "RingRadius" "45" + "HealthBarOffset" "130" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "125" + "StatusHealthRegen" "1.0" + "StatusMana" "100" + "StatusManaRegen" "3.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "900" + "VisionNighttimeRange" "900" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.4" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "AttachWearables" + { + //"Wearable1" + //{ + // "ItemDef" "231" // rocket: default + //} + "Wearable2" + { + "ItemDef" "446" // weapon: default + } + "Wearable3" + { + "ItemDef" "484" // armor: default + } + "Wearable4" + { + "ItemDef" "485" // head: default + } + } + + "DisableClumpingBehavior" "1" + } + } + + //================================================================================= + // Gyrocopter Captain + //================================================================================= + "npc_dota_creature_gyrocopter" + { + "BaseClass" "npc_dota_creature" + "RunAIWhenControllableByPlayer" "1" + "ConsideredHero" "1" + + "Model" "models/heroes/gyro/gyro.vmdl" + "SoundSet" "Hero_Gyrocopter" + "IdleSoundLoop" "Hero_Gyrocopter.IdleLoop" + "ModelScale" "1.1" + "GibType" "motor" + + "Level" "1" + + "ArmorPhysical" "2" + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "BaseAttackSpeed" "125" + "AttackDamageMin" "60" + "AttackDamageMax" "80" + "AttackRate" "1.700000" + "AttackAnimationPoint" "0.200000" + "AttackAcquisitionRange" "800" + "AttackRange" "550" + "ProjectileSpeed" "3000" + "ProjectileModel" "particles/units/heroes/hero_gyrocopter/gyro_base_attack.vpcf" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "gyrocopter_multi_homing_missile" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "100" + "HealthBarOffset" "250" + + "particle_folder" "particles/units/heroes/hero_gyrocopter" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_gyrocopter.vsndevts" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + "MovementTurnRate" "0.600000" + "HasAggressiveStance" "1" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "300" + "StatusHealthRegen" "0.0" + "StatusMana" "100" + "StatusManaRegen" "3.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "900" + "VisionNighttimeRange" "900" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.4" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "OffensiveAbilities" + { + "Ability1" + { + "Name" "gyrocopter_multi_homing_missile" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "126" // bottles: default + } + "Wearable2" + { + "ItemDef" "131" // head: default + } + "Wearable3" + { + "ItemDef" "176" // goggles: default + } + "Wearable4" + { + "ItemDef" "177" // guns: default + } + "Wearable5" + { + "ItemDef" "178" // propellor: default + } + "Wearable6" + { + "ItemDef" "179" // homing missile: default + } + "Wearable7" + { + "ItemDef" "527" // ambient effects: default + } + } + } + } + + "npc_dota_creature_gyrocopter_homing_missile" + { + // General + //---------------------------------------------------------------- + "Model" "models/heroes/gyro/gyro_missile.vmdl" // Model. + "BaseClass" "npc_dota_base_additive" + "SoundSet" "0" // Name of sound set. + "Level" "1" + "ModelScale" "1.5" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" // Ability 1 + "Ability2" "" // Ability 2 + "Ability3" "" // Ability 3 + "Ability4" "" // Ability 4 + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" // Damage range min. + "AttackDamageMax" "0" // Damage range max. + "AttackRate" "1.0" // Speed of attack. + "AttackAnimationPoint" "0.0" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "0" // Range within a target can be acquired. + "AttackRange" "0" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "0" // Speed of projectile. + + // Bounds + //---------------------------------------------------------------- + "HealthBarOffset" "220" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" // Speed. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "25" // Base health. + "StatusHealthRegen" "0.0" // Health regeneration rate. + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "400" // Range of vision during day light. + "VisionNighttimeRange" "400" // Range of vision at night time. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + } + + + //================================================================================= + // Shadow Demon + //================================================================================= + "npc_dota_creature_shadow_demon" + { + // Script + "vscripts" "ai/ai_shadow_demon.lua" + + "BaseClass" "npc_dota_creature" + "RunAIWhenControllableByPlayer" "1" + "ConsideredHero" "1" + + "Model" "models/heroes/shadow_demon/shadow_demon.vmdl" + "SoundSet" "Hero_ShadowDemon" + "ModelScale" "0.840000" + "GibType" "ethereal" + "GibTintColor" "148 68 121 255" + + "Level" "1" + + "ArmorPhysical" "2" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "BaseAttackSpeed" "75" + "AttackDamageMin" "125" + "AttackDamageMax" "155" + "AttackRate" "1.700000" + "AttackAnimationPoint" "0.350000" + "AttackAcquisitionRange" "1200" + "AttackRange" "850" + "ProjectileModel" "particles/units/heroes/hero_shadow_demon/shadow_demon_base_attack.vpcf" + "ProjectileSpeed" "900" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_shadow_demon_disruption" + //"Ability2" "aghsfort_shadow_demon_shadow_poison" // disabling due to difficulty in communication + + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "100" + "HealthBarOffset" "275" + + "particle_folder" "particles/units/heroes/hero_shadow_demon" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_shadow_demon.vsndevts" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "330" + "MovementTurnRate" "0.600000" + "HasAggressiveStance" "1" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "3500" + "StatusHealthRegen" "0.0" + "StatusMana" "1000" + "StatusManaRegen" "3.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1100" + "VisionNighttimeRange" "1100" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.4" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "13152" // "Tail of Depraved Malformation" + } + "Wearable2" + { + "ItemDef" "13153" // "Grasp of Depraved Malformation" + } + "Wearable3" + { + "ItemDef" "13154" // "Armor of Depraved Malformation" + } + "Wearable4" + { + "ItemDef" "13155" // "Belt of Depraved Malformation" + } + "Wearable5" + { + "ItemDef" "545" // "Shadow Demon's Ambient Effects" + } + } + } + } + + //================================================================================= + // Doom + //================================================================================= + "npc_dota_creature_doom" + { + // Script + "vscripts" "ai/ai_doom.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/heroes/doom/doom.vmdl" + "SoundSet" "Hero_DoomBringer" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_doombringer.vsndevts" + "Level" "1" + "ModelScale" "1.2" + "ConsideredHero" "1" + + // Minimap + //---------------------------------------------------------------- + "MinimapIcon" "minimap_roshancamp" + "MinimapIconSize" "250" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_doom_infernal_blade" + "Ability2" "creature_doom_bringer_doom" + "Ability3" "ability_attack_speed_unslowable" + "Ability4" "creature_generic_high_status_resist_passive" + "Ability5" "ability_absolute_no_cc" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "15" + "MagicalResistance" "10" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "400" + "AttackDamageMax" "550" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "1800" + "AttackRange" "175" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_LARGE" + "RingRadius" "70" + "HealthBarOffset" "300" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "310" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "12000" + "StatusHealthRegen" "0" + "StatusMana" "25000" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1800" + "VisionNighttimeRange" "1800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "1" + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "6632" + } + "Wearable2" + { + "ItemDef" "6821" + } + "Wearable3" + { + "ItemDef" "6822" + } + "Wearable4" + { + "ItemDef" "6885" + } + "Wearable5" + { + "ItemDef" "6887" + } + "Wearable6" + { + "ItemDef" "6888" + } + "Wearable7" + { + "ItemDef" "6947" + } + } + } + } + + //================================================================================= + // Creature: Necro Warrior + //================================================================================= + "npc_dota_creature_necro_warrior" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/item_creeps/i_creep_necro_warrior/necro_warrior.vmdl" // Model. + "SoundSet" "Creep_Good_Melee" + "Level" "1" + "ModelScale" "0.5" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "4" + "MagicalResistance" "20" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "100" + "AttackDamageMax" "140" + "AttackRate" "0.75" + "AttackAnimationPoint" "0.56" + "AttackAcquisitionRange" "3000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "140" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "310" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "800" + "StatusHealthRegen" "0.0" + "StatusMana" "500" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "3000" + "VisionNighttimeRange" "3000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.5" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + } + } + + //================================================================================= + // Creature: Shadow Shaman + //================================================================================= + "npc_dota_creature_shadow_shaman" + { + // Script + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "RunAIWhenControllableByPlayer" "1" + + "Model" "models/heroes/shadowshaman/shadowshaman.vmdl" + "SoundSet" "Hero_ShadowShaman" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_shadowshaman.vsndevts" + "Level" "1" + "ModelScale" "1.2" + "IsNeutralUnitType" "1" + + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_shadow_shaman_shackles" + "Ability2" "" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "33" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "65" + "AttackDamageMax" "70" + "AttackRate" "1.35" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "3000" + "AttackRange" "400" + "ProjectileModel" "particles/units/heroes/hero_shadowshaman/shadowshaman_base_attack.vpcf" + "ProjectileSpeed" "900" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "160" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "350" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1000" + "StatusHealthRegen" "0.5" + "StatusMana" "350" + "StatusManaRegen" "1" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "3000" + "VisionNighttimeRange" "3000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "OffensiveAbilities" + { + "Ability1" + { + "Name" "aghsfort_shadow_shaman_shackles" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "13367" // "Bogmarch Mask" + } + "Wearable2" + { + "ItemDef" "13368" // "Bogmarch Barrel" + } + "Wearable3" + { + "ItemDef" "13369" // "Bogmarch Garb" + } + "Wearable4" + { + "ItemDef" "13366" // "Bogmarch Charm" + } + "Wearable5" + { + "ItemDef" "13365" // "Bogmarch Ward" + } + "Wearable6" + { + "ItemDef" "13364" // "Bogmarch Wand" + } + } + } + } + + "npc_dota_creature_shroomling" + { + // General + // + "vscripts" "ai/ai_shroomling.lua" + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/items/furion/treant/shroomling_treant/shroomling_treant.vmdl" // Model. + "SoundSet" "Furion_Treant" // Name of sound set. + "ModelScale" "0.90" + "Level" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "140" // Damage range min. + "AttackDamageMax" "150" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0.90" // Speed of attack. + "AttackAnimationPoint" "0.467" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "5000" // Range within a target can be acquired. + "AttackRange" "100" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" // Hull type used for navigation/locomotion. + "HealthBarOffset" "170" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "280" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "900" // Base health. + "StatusHealthRegen" "0.5" // Health regeneration rate. + "StatusMana" "100" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "5000" // Range of vision during day light. + "VisionNighttimeRange" "5000" // Range of vision at night time. + } + + "npc_dota_creature_shroom_giant" + { + // General + // + //"vscripts" "ai/ai_shroom_giant.lua" + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/items/furion/treant/fungal_lord_shroomthing/fungal_lord_shroomthing.vmdl" // Model. + "SoundSet" "Furion_Treant" // Name of sound set. + "ModelScale" "1.75" + "Level" "1" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "mushroom_split" // Ability 1. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "380" // Damage range min. + "AttackDamageMax" "405" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1.10" // Speed of attack. + "AttackAnimationPoint" "0.467" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "900" // Range within a target can be acquired. + "AttackRange" "150" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" // Hull type used for navigation/locomotion. + "RingRadius" "100" + "HealthBarOffset" "250" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "280" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "6600" // Base health. + "StatusHealthRegen" "0.5" // Health regeneration rate. + "StatusMana" "100" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" // Range of vision during day light. + "VisionNighttimeRange" "800" // Range of vision at night time. + } + + //================================================================================= + // Dark Portal + //================================================================================= + "npc_aghsfort_dark_portal" + { + // General + // + "BaseClass" "npc_dota_building" + "Model" "models/props_structures/good_statue010.vmdl" + "SoundSet" "Creep_Good_Melee" + "MinimapIcon" "minimap_miscbuilding" + "destroysound" "Building_RadiantTower.Destruction" + "destroyfx" "particles/radiant_fx/radiant_statue001_destruction.vpcf" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "6" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_FILLER" + "RingRadius" "100" + "HealthBarOffset" "275" + "MinimapIconSize" "375" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "50" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_SIEGE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_STRUCTURE" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_BUILDING" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "300" + "VisionNighttimeRange" "300" + } + + //================================================================================= + // Dark Portal + //================================================================================= + "npc_aghsfort_dark_portal_v2" + { + // General + // + "BaseClass" "npc_dota_building" + "Model" "models/props_structures/bad_statue001.vmdl" + "SoundSet" "Creep_Good_Melee" + "MinimapIcon" "minimap_miscbuilding" + "destroysound" "Building_DireTower.Destruction" + "destroyfx" "particles/dire_fx/statue001_bad_destroy.vpcf" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "6" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_FILLER" + "RingRadius" "100" + "HealthBarOffset" "275" + "MinimapIconSize" "375" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "50" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_SIEGE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_STRUCTURE" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_BUILDING" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "300" + "VisionNighttimeRange" "300" + } + + //================================================================================= + // Creature: Bonus Chicken + //================================================================================= + "npc_dota_creature_bonus_chicken" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/items/courier/mighty_chicken/mighty_chicken.vmdl" + "SoundSet" "n_creep_Melee" + "ModelScale" "2.5" + "IsNeutralUnitType" "1" + "IsAncient" "1" + "ConsideredHero" "1" + "HasInventory" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_bonus_chicken" + "Ability2" "" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "1" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "22" + "AttackDamageMax" "24" + "AttackRate" "1.45" + "AttackAnimationPoint" "0.33" + "AttackAcquisitionRange" "500" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "45" + "HealthBarOffset" "150" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "62" + "BountyGoldMin" "22" + "BountyGoldMax" "26" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "500" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1" + "StatusHealthRegen" "0.5" + "StatusMana" "60000" + "StatusManaRegen" "500" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Minimap + //---------------------------------------------------------------- + "MinimapIcon" "minimap_roshancamp" + "MinimapIconSize" "450" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "EquippedItems" + { + "Travels" + { + "Item" "item_travel_boots" + } + } + } + } + + //================================================================================= + // Blast Wave Tower + //================================================================================= + "npc_aghsfort_tower_blast_wave" + { + // General + // + "BaseClass" "npc_dota_building" // Class of entity of link to. + "Model" "models/props_structures/good_statue010.vmdl" // Model. + "SoundSet" "Creep_Good_Melee" // Name of sound set. + "MinimapIcon" "minimap_miscbuilding" + + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "aghsfort_tower_blast_wave"// Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "15" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" // Damage range min. + "AttackDamageMax" "0" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" // Speed of attack. + "AttackAnimationPoint" "0" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "0" // Range within a target can be acquired. + "AttackRange" "0" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "0" // Speed of projectile. + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" // Base strength + "AttributeStrengthGain" "0" // Strength bonus per level. + "AttributeBaseIntelligence" "0" // Base intelligence + "AttributeIntelligenceGain" "0" // Intelligence bonus per level. + "AttributeBaseAgility" "0" // Base agility + "AttributeAgilityGain" "0" // Agility bonus per level. + + // Bounty + //---------------------------------------------------------------- + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_FILLER" // Hull type used for navigation/locomotion. + "RingRadius" "100" + "HealthBarOffset" "275" + "MinimapIconSize" "375" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "50" // Base health. + "StatusHealthRegen" "1" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_SIEGE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_STRUCTURE" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_BUILDING" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "100" // Range of vision during day light. + "VisionNighttimeRange" "100" // Range of vision at night time. + } + + //================================================================================= + // Free Morty + //================================================================================= + "npc_aghsfort_morty" + { + + // General + //---------------------------------------------------------------- + "Model" "models/heroes/snapfire/snapfire_customgame.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Snapfire" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "0.58" + "ConsideredHero" "1" + "IsAncient" "1" + "skin" "1" + + "MinimapIcon" "minimap_enemyicon" + "MinimapIconSize" "275" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "morty_hop" + "Ability2" "morty_hop_launch" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "3" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "70" + "AttackDamageMax" "80" + "AttackRate" "2.8" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "500" + "AttackRange" "1" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "60" + "HealthBarOffset" "240" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "100" + "BountyGoldMin" "65" + "BountyGoldMax" "75" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + "MovementTurnRate" "0.2" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "500" + "StatusHealthRegen" "2" + "StatusMana" "400" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "694" // Morty + } + } + } + } + + //================================================================================= + // Splitter A + //================================================================================= + "npc_dota_creature_rock_golem_a" + { + // Script + "vscripts" "ai/big_golem.lua" + + // General + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/neutral_creeps/n_creep_golem_a/neutral_creep_golem_a.vmdl" + "ModelScale" "1.8" + "Level" "1" + "CanBeDominated" "0" + "ConsideredHero" "1" + "SoundSet" "n_creep_Melee" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "rock_golem_split_a" + "Ability2" "aghsfort_rock_golem_smash" + "Ability3" "ability_absolute_no_cc" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "12" + "MagicalResistance" "60" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "690" + "AttackDamageMax" "710" + "AttackRate" "1.6" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1400" + "AttackRange" "128" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "410" + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "150" + "MovementTurnRate" "0.5" + + //"VoiceFile" "soundevents/voscripts/game_sounds_vo_life_stealer.vsndevts" + //"GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_life_stealer.vsndevts" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "4000" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1400" + "VisionNighttimeRange" "1400" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + "RoamDistance" "150.0" + } + } + + "DefaultState" "Invade" + } + } + + //================================================================================= + // Splitter B + //================================================================================= + "npc_dota_creature_rock_golem_b" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/creeps/neutral_creeps/n_creep_golem_b/n_creep_golem_b.vmdl" // Model. + "ModelScale" "1.2" + "Level" "1" + "CanBeDominated" "0" + "ConsideredHero" "1" + "SoundSet" "n_creep_Melee" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "rock_golem_split_b" // Ability 1. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "8" // Physical protection. + "MagicalResistance" "45" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "480" // Damage range min. + "AttackDamageMax" "480" // Damage range max. + "AttackRate" "1.0" // Speed of attack. + "AttackAnimationPoint" "0.3" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "700" // Range within a target can be acquired. + "AttackRange" "60" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "50" + "HealthBarOffset" "240" + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "240" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + "VoiceFile" "soundevents/voscripts/game_sounds_vo_life_stealer.vsndevts" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_life_stealer.vsndevts" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1800" // Base health. + "StatusHealthRegen" "1.0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1400" // Range of vision during day light. + "VisionNighttimeRange" "1400" // Range of vision at night time. + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + "RoamDistance" "150.0" + } + } + + "DefaultState" "Invade" + + "DisableClumpingBehavior" "1" + } + } + + //================================================================================= + // Splitter C + //================================================================================= + "npc_dota_creature_rock_golem_c" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/creeps/neutral_creeps/n_creep_golem_b/n_creep_golem_b.vmdl" // Model. + "ModelScale" "0.6" + "Level" "1" + "SoundSet" "n_creep_Melee" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "4" // Physical protection. + "MagicalResistance" "30" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "300" // Damage range min. + "AttackDamageMax" "300" // Damage range max. + "AttackRate" "0.4" // Speed of attack. + "AttackAnimationPoint" "0.3" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "500" // Range within a target can be acquired. + "AttackRange" "40" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "15" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "20" + "HealthBarOffset" "125" + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "300" // Speed + "MovementTurnRate" "1.0" // Turning rate. + + "VoiceFile" "soundevents/voscripts/game_sounds_vo_life_stealer.vsndevts" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_life_stealer.vsndevts" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "450" // Base health. + "StatusHealthRegen" "1.0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1400" // Range of vision during day light. + "VisionNighttimeRange" "1400" // Range of vision at night time. + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + "RoamDistance" "150.0" + } + } + + "DefaultState" "Invade" + + "DisableClumpingBehavior" "1" + } + } + + + //================================================================================= + // Creature: Bomb Squad + //================================================================================= + "npc_aghsfort_creature_bomb_squad" + { + // Script + "vscripts" "ai/bomb_squad_ai.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/techies/techies.vmdl" + "SoundSet" "Hero_Techies" + "IdleSoundLoop" "Hero_Techies.IdleLoop" + "Level" "1" + "ModelScale" "0.9" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + //"Ability1" "bomb_squad_self_cast" + "Ability1" "bomb_squad_mine_charge" + "Ability2" "bomb_squad_stasis_launch" + + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "15" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "35" + "AttackDamageMax" "37" + "AttackRate" "1.5" + "AttackAnimationPoint" "0.36" + "AttackAcquisitionRange" "500" + "AttackRange" "500" + "ProjectileModel" "particles/units/heroes/hero_necrolyte/necrolyte_base_attack.vpcf" + "ProjectileSpeed" "400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "350" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "6000" + "StatusHealthRegen" "1" + "StatusMana" "200" + "StatusManaRegen" "4" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "1.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "DisableResistance" "100" + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "12833" // Spleen + } + "Wearable2" + { + "ItemDef" "12834" // Cannon + } + "Wearable3" + { + "ItemDef" "12835" // arms + } + "Wearable4" + { + "ItemDef" "12836" // sled + } + "Wearable5" + { + "ItemDef" "12839" // shoulder + } + "Wearable6" + { + "ItemDef" "12840" // back + } + } + } + } + + //================================================================================= + // Creature: Bomb Squad Landmine + //================================================================================= + "npc_aghsfort_creature_bomb_squad_landmine" + { + // Script + "vscripts" "ai/bomb_squad_landmine_ai.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/items/techies/frostivus2018_techies_squad_penguins_bomb/frostivus2018_techies_squad_penguins_bomb.vmdl" + "SoundSet" "Hero_Techies" + "IdleSoundLoop" "Hero_Techies.IdleLoop" + "Level" "1" + "ModelScale" "0.8" + + + // Abilities + //---------------------------------------------------------------- + "Ability1" "bomb_squad_landmine_detonate" + + + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "1000" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "35" + "AttackDamageMax" "37" + "AttackRate" "1.5" + "AttackAnimationPoint" "0.36" + "AttackAcquisitionRange" "500" + "AttackRange" "500" + "ProjectileModel" "particles/units/heroes/hero_necrolyte/necrolyte_base_attack.vpcf" + "ProjectileSpeed" "400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "50" + "StatusHealthRegen" "1" + "StatusMana" "200" + "StatusManaRegen" "4" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + "PathfindingSearchDepthScale" "1.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + } + } + //================================================================================= + // Creature: Bomb Squad Landmine + //================================================================================= + "npc_aghsfort_creature_bomb_squad_stasis_trap" + { + // Script + + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/techies/fx_techiesfx_stasis.vmdl" + "SoundSet" "Hero_Techies" + "IdleSoundLoop" "Hero_Techies.IdleLoop" + "Level" "1" + "ModelScale" "1.1" + + + // Abilities + //---------------------------------------------------------------- + //"Ability1" "bomb_squad_landmine_detonate" + + + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "1000" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "35" + "AttackDamageMax" "37" + "AttackRate" "1.5" + "AttackAnimationPoint" "0.36" + "AttackAcquisitionRange" "500" + "AttackRange" "500" + "ProjectileModel" "particles/units/heroes/hero_necrolyte/necrolyte_base_attack.vpcf" + "ProjectileSpeed" "400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "50" + "StatusHealthRegen" "1" + "StatusMana" "200" + "StatusManaRegen" "4" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + "PathfindingSearchDepthScale" "1.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + } + } + //================================================================================= + // Creature: Walrus Pudge + //================================================================================= + "npc_aghsfort_creature_walrus_pudge" + { + // Script + "vscripts" "ai/walrus_pudge_ai.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/pudge/pudge.vmdl" + "SoundSet" "Hero_Pudge" + "IdleSoundLoop" "Hero_Pudge.IdleLoop" + "Level" "1" + "ModelScale" "1.2" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_walrus_pudge_harpoon" + + + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "20" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "820" + "AttackDamageMax" "920" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.36" + "AttackAcquisitionRange" "500" + "AttackRange" "150" + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "380" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "9500" + "StatusHealthRegen" "1" + "StatusMana" "200" + "StatusManaRegen" "4" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "1.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "DisableResistance" "25.0" + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "12803" // Arm + } + "Wearable2" + { + "ItemDef" "12804" // bracer + } + "Wearable3" + { + "ItemDef" "12805" // shoulder + } + "Wearable4" + { + "ItemDef" "12806" // belt + } + "Wearable5" + { + "ItemDef" "12807" // offhand + } + "Wearable6" + { + "ItemDef" "12808" // head + } + "Wearable7" + { + "ItemDef" "12809" // hook + } + } + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + + "DefaultState" "Invade" + } + } + + //================================================================================= + // Assault Bad Melee Creep + //================================================================================= + "npc_dota_assault_bad_melee_creep" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/creeps/lane_creeps/creep_bad_melee/creep_bad_melee_mega.vmdl" // Model. + "SoundSet" "Creep_Bad_Melee_Mega" // Name of sound set. + "ModelScale" "1.5" + "Level" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "8" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "75" // Damage range min. + "AttackDamageMax" "105" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1" // Speed of attack. + "AttackAnimationPoint" "0.467" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "900" // Range within a target can be acquired. + "AttackRange" "100" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "" // Speed of projectile. + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" // Base strength + "AttributeStrengthGain" "0" // Strength bonus per level. + "AttributeBaseIntelligence" "0" // Base intelligence + "AttributeIntelligenceGain" "0" // Intelligence bonus per level. + "AttributeBaseAgility" "0" // Base agility + "AttributeAgilityGain" "0" // Agility bonus per level. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" // Hull type used for navigation/locomotion. + "RingRadius" "45" + "HealthBarOffset" "200" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "300" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1000" // Base health. + "StatusHealthRegen" "0.5" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "850" // Range of vision during day light. + "VisionNighttimeRange" "800" // Range of vision at night time. + + "PathfindingSearchDepthScale" "0.1" + } + + //================================================================================= + // Assault Bad Ranged Creep + //================================================================================= + "npc_dota_assault_bad_ranged_creep" + { + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/creeps/lane_creeps/creep_bad_ranged/lane_dire_ranged_mega.vmdl" // Model. + "SoundSet" "Tower.Fire" // Name of sound set. + "ModelScale" "1.3" + "Level" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "4" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "90" // Damage range min. + "AttackDamageMax" "120" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1" // Speed of attack. + "AttackAnimationPoint" "0.5" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "1200" // Range within a target can be acquired. + "AttackRange" "600" // Range within a target can be attacked. + "ProjectileModel" "particles/base_attacks/ranged_tower_bad.vpcf" // Particle system model for projectile. + "ProjectileSpeed" "900" // Speed of projectile. + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" // Base strength + "AttributeStrengthGain" "0" // Strength bonus per level. + "AttributeBaseIntelligence" "0" // Base intelligence + "AttributeIntelligenceGain" "0" // Intelligence bonus per level. + "AttributeBaseAgility" "0" // Base agility + "AttributeAgilityGain" "0" // Agility bonus per level. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion. + "RingRadius" "45" + "HealthBarOffset" "150" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "300" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "700" // Base health. + "StatusHealthRegen" "2" // Health regeneration rate. + "StatusMana" "500" // Base mana. + "StatusManaRegen" "0.75" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "850" // Range of vision during day light. + "VisionNighttimeRange" "800" // Range of vision at night time. + + "PathfindingSearchDepthScale" "0.1" + } + + //================================================================================= + // Catapult + //================================================================================= + "npc_dota_creature_catapult" + { + // General + //---------------------------------------------------------------- + "vscripts" "ai/ai_catapult.lua" + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/creeps/lane_creeps/creep_bad_siege/creep_bad_siege.mdl" // Model. + "SoundSet" "Creep_Bad_Engine" // Name of sound set. + "MinimapIcon" "minimap_siege" + "MinimapIconSize" "250" + "ModelScale" "1.0" + "Level" "1" + "ConsideredHero" "1" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "catapult_attack" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "10" // Physical protection. + "MagicalResistance" "25" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" // Damage range min. + "AttackDamageMax" "0" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "100.0" // Speed of attack. + "AttackAnimationPoint" "0.7" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "1500" // Range within a target can be acquired. + "AttackRange" "1500" // Range within a target can be attacked. + "ProjectileModel" "ranged_siege_bad" // Particle system model for projectile. + "ProjectileSpeed" "1100" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SIEGE" // Hull type used for navigation/locomotion. + "RingRadius" "80" + "HealthBarOffset" "160" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1300" // Base health. + "StatusHealthRegen" "0" // Health regeneration rate. + "StatusMana" "1500" // Base mana. + "StatusManaRegen" "5" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_SIEGE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_STRUCTURE" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "2500" // Range of vision during day light. + "VisionNighttimeRange" "2500" // Range of vision at night time. + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + "DefaultState" "Invade" + } + } + + + //================================================================================= + // Upheaval Urn + //================================================================================= + "npc_dota_creature_upheaval_urn" + { + // General + //---------------------------------------------------------------- + "vscripts" "ai/ai_upheaval_urn.lua" + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/gameplay/breakingvase_dest.vmdl" // Model + "SoundSet" "Creep_Bad_Engine" // Name of sound set. + "ModelScale" "1.0" + "Level" "1" + + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_warlock.vsndevts" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "urn_upheaval" // Ability 1. + "Ability2" "upheaval_urn_incoming_damage_rules" // Ability 2. + "Ability3" "no_health_bar" // Ability 3. + "Ability4" "modifier_no_minimap" // Ability 4. + "Ability5" "" //"upheaval_urn_reincarnation" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "10" // Physical protection. + "MagicalResistance" "25" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" // Damage range min. + "AttackDamageMax" "0" // Damage range max. + "AttackAcquisitionRange" "1500" // Range within a target can be acquired. + "AttackRange" "1500" // Range within a target can be attacked. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SIEGE" // Hull type used for navigation/locomotion. + "RingRadius" "80" + "HealthBarOffset" "160" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "3" // Base health. + "StatusHealthRegen" "0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_SIEGE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_STRUCTURE" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "2500" // Range of vision during day light. + "VisionNighttimeRange" "2500" // Range of vision at night time. + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "1" + + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + "DefaultState" "Invade" + } + } + + + //================================================================================= + // Dire Assault Captain + //================================================================================= + "npc_aghsfort_creature_dire_assault_captain" + { + // General + //---------------------------------------------------------------- + "vscripts" "ai/ai_assault_captain.lua" + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/lane_creeps/creep_dire_hulk/creep_dire_ancient_hulk.vmdl" + "SoundSet" "Creep_Good_Melee_Mega" + "ModelScale" "1.5" + "Level" "1" + "ConsideredHero" "1" + "MinimapIcon" "minimap_ancient" + "MinimapIconSize" "200" + "RunAIWhenControllableByPlayer" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "assault_captain_sun_ray" + "Ability2" "assault_captain_searing_chains" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "20" + "MagicalResistance" "20" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "160" + "AttackDamageMax" "220" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1" + "AttackAnimationPoint" "0.467" + "AttackAcquisitionRange" "800" + "AttackRange" "130" + "ProjectileModel" "" + "ProjectileSpeed" "" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "380" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "320" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "5000" + "StatusHealthRegen" "0" + "StatusMana" "6000" + "StatusManaRegen" "30" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1200" + "VisionNighttimeRange" "1200" + + //Inventory + "HasInventory" "1" + "Creature" + { + //Basic AI State + //------------------------------------------------------------ + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "70.0" + "Avoidance" "0.0" + "Support" "50.0" + } + } + + "DisableResistance" "100.0" + + "EquippedItems" + { + "Assault" + { + "Item" "item_assault" + } + "Blademail" + { + "Item" "item_blade_mail" + } + //"Octarine" + //{ + // "Item" "item_octarine_core" + //} + "MKB" + { + "Item" "item_monkey_king_bar" + } + } + } + } + + //================================================================================= + // Creature: Luna + //================================================================================= + "npc_dota_creature_luna_mini" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/luna/luna.vmdl" + "SoundSet" "Hero_Luna" + "Level" "1" + "ModelScale" "0.5" + "GameSoundsFile" "soundevents/game_sounds_heroes/gamE_sounds_luna.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "luna_moon_glaive" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "25" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "120" + "AttackDamageMax" "120" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.46" + "AttackAcquisitionRange" "1000" + "AttackRange" "250" + "ProjectileModel" "particles/units/heroes/hero_luna/luna_base_attack.vpcf" + "ProjectileSpeed" "900" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "130" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "320" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "450" + "StatusHealthRegen" "2.0" + "StatusMana" "400" + "StatusManaRegen" "5.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "80.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "448" + } + "Wearable2" + { + "ItemDef" "449" + } + "Wearable3" + { + "ItemDef" "450" + } + "Wearable4" + { + "ItemDef" "451" + } + "Wearable5" + { + "ItemDef" "452" + } + "Wearable6" + { + "ItemDef" "453" + } + } + } + } + + + //================================================================================= + // Creature: Mirana + // Round 12 + //================================================================================= + "npc_dota_creature_mirana" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/mirana/mirana.vmdl" + "SoundSet" "Hero_Mirana" + "Level" "1" + "ModelScale" "1.1" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_mirana.vsndevts" + "ConsideredHero" "1" + //"IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "mirana_starfall" + "Ability2" "mirana_arrow" + "Ability3" "mirana_leap" + "Ability4" "mirana_invis" + "Ability5" "" // creature_mirana_global_vision + "Ability6" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "25" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "125" + "AttackDamageMax" "150" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "15000" + "AttackRange" "600" + "ProjectileModel" "particles/units/heroes/hero_mirana/mirana_base_attack.vpcf" + "ProjectileSpeed" "900" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "210" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "330" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "900" + "StatusHealthRegen" "10.0" + "StatusMana" "2000" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "15000" + "VisionNighttimeRange" "15000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + "vscripts" "ai/mirana_ai.lua" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "50.0" + } + } + + "EquippedItems" + { + "PhaseBoots" + { + "Item" "item_phase_boots" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "6658" // weapon: Crescent Bow + } + "Wearable2" + { + "ItemDef" "404" + } + "Wearable3" + { + "ItemDef" "405" + } + "Wearable4" + { + "ItemDef" "406" + } + "Wearable5" + { + "ItemDef" "407" + } + "Wearable6" + { + "ItemDef" "408" + } + } + } + } + + //================================================================================= + // Creature: Alchemist + //================================================================================= + "npc_dota_creature_alchemist" + { + // General + //---------------------------------------------------------------- + "vscripts" "ai/alchemist_ai.lua" + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/alchemist/alchemist.vmdl" + "SoundSet" "Hero_Alchemist" + "Level" "1" + "ModelScale" "1.4" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_alchemist.vsndevts" + "ConsideredHero" "1" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "alchemist_acid_spray" + "Ability2" "alchemist_unstable_concoction" + "Ability3" "alchemist_goblins_greed" + "Ability4" "alchemist_chemical_rage" + "Ability5" "alchemist_unstable_concoction_throw" + "Ability6" "creature_generic_high_status_resist_passive" + "Ability7" "ability_absolute_no_cc" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "30" + "MagicalResistance" "25" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "550" + "AttackDamageMax" "550" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.35" + "AttackAcquisitionRange" "1200" + "AttackRange" "170" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "210" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "220" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "16000" + "StatusHealthRegen" "0" + "StatusMana" "2000" + "StatusManaRegen" "30.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "70.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DisableClumpingBehavior" "1" + + "EquippedItems" + { + "ShivasGuard" + { + "Item" "item_shivas_guard" + } + "PhaseBoots" + { + "Item" "item_phase_boots" + } + "MKB" + { + "Item" "item_monkey_king_bar" + } + } + + "DisableResistance" "50.0" + "UltimateDisableResistance" "50.0" + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "117" + } + "Wearable2" + { + "ItemDef" "118" + } + "Wearable3" + { + "ItemDef" "119" + } + "Wearable4" + { + "ItemDef" "120" + } + "Wearable5" + { + "ItemDef" "121" + } + "Wearable6" + { + "ItemDef" "122" + } + "Wearable7" + { + "ItemDef" "123" + } + "Wearable8" + { + "ItemDef" "124" + } + } + } + } + + //================================================================================= + // Neutral: Enraged Wildkin + //================================================================================= + "npc_aghsfort_creature_enraged_wildwing" + { + // General + //---------------------------------------------------------------- + "vscripts" "ai/enraged_wildwing_ai.lua" + + "Model" "models/creeps/neutral_creeps/n_creep_vulture_a/n_creep_vulture_a.vmdl" // Model. + "BaseClass" "npc_dota_creature" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "1.4" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "enraged_wildwing_create_tornado" // Ability 1 + //"Ability2" "aghsfort_wildwing_tornado_blast" // Ability 2 + "Ability2" "aghsfort_enraged_wildwing_tornado_blast" // Ability 3 + "Ability4" "" // Ability 4 + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "4" // Physical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "800" + "AttackDamageMax" "900" + "AttackRate" "0.9" // Speed of attack. + "AttackAnimationPoint" "0.3" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "1200" // Range within a target can be acquired. + "AttackRange" "150" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "0" // Speed of projectile. + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "50" + "HealthBarOffset" "220" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "90" // Experience earn. + "BountyGoldMin" "54" // Gold earned min. + "BountyGoldMax" "70" // Gold earned max. + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "320" // Speed. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "22000" // Base health. + "StatusHealthRegen" "0.5" // Health regeneration rate. + "StatusMana" "400" // Base mana. + "StatusManaRegen" "1" // Mana regeneration rate. + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "2400" // Range of vision during day light. + "VisionNighttimeRange" "2400" // Range of vision at night time. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "DisableResistance" "95.0" + + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "50.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + } + } + + + "npc_aghsfort_creature_enraged_wildwing_tornado" + { + // General + // + "BaseClass" "npc_dota_base_additive" // Class of entity of link to. + "Model" "models/heroes/attachto_ghost/attachto_ghost.vmdl" // Model. + "SoundSet" "Creep_Good_Melee" // Name of sound set. + "ModelScale" "16.0" + "Level" "1" + "IsSummoned" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "enraged_wildkin_tornado_passive" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //------------------------------------------e---------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" // Hull type used for navigation/locomotion. + "HealthBarOffset" "140" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_FLY" // Type of locomotion - ground, air + "MovementSpeed" "125" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "500" // Base health. + "StatusHealthRegen" "0.5" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "300" // Range of vision during day light. + "VisionNighttimeRange" "300" // Range of vision at night time. + } + + //================================================================================= + // Neutral: Harpy Storm + //================================================================================= + "npc_aghsfort_creature_tornado_harpy" + { + // General + //---------------------------------------------------------------- + + //---------------------------------------------------------------- + "vscripts" "ai/tornado_harpy_ai.lua" + "Model" "models/creeps/neutral_creeps/n_creep_harpy_b/n_creep_harpy_b.vmdl" // Model. + "BaseClass" "npc_dota_creature" + "SoundSet" "n_creep_Ranged" + "Level" "1" + "ModelScale" "0.55" + "IsNeutralUnitType" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "harpy_storm_chain_lightning" // Ability 1 + "Ability2" "tornado_harpy_intrinsic" // Ability 2 + "Ability3" "" // Ability 3 + "Ability4" "" // Ability 4 + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" // Physical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "360" // Damage range min. + "AttackDamageMax" "380" // Damage range max. + "AttackRate" "1.3" // Speed of attack. + "AttackAnimationPoint" "0.3" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "400" // Range within a target can be acquired. + "AttackRange" "350" // Range within a target can be attacked. + "ProjectileModel" "particles/units/heroes/hero_necrolyte/necrolyte_base_attack.vpcf" + + "ProjectileSpeed" "1200" // Speed of projectile. + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "50" + "HealthBarOffset" "190" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_FLY" + "MovementSpeed" "325" // Speed. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "700" // Base health. + "StatusHealthRegen" "5" // Health regeneration rate. + "StatusMana" "150" // Base mana. + "StatusManaRegen" "3" // Mana regeneration rate. + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1800" // Range of vision during day light. + "VisionNighttimeRange" "1800" // Range of vision at night time. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + } + + + //================================================================================= + // Creature: Worg + //================================================================================= + "npc_dota_creature_dire_hound" + { + // Script + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/creeps/neutral_creeps/n_creep_worg_small/n_creep_worg_small.vmdl" // precache issue with this asset + "SoundSet" "DireHound" + "Level" "1" + "ModelScale" ".97" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "33" + "AttackDamageMax" "38" + "AttackRate" "1.55" + "AttackAnimationPoint" "0.33" + "AttackAcquisitionRange" "500" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "45" + "HealthBarOffset" "90" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "20" + "BountyGoldMin" "11" + "BountyGoldMax" "15" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "270" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "40" + "StatusHealthRegen" "0.5" + "StatusMana" "100" + "StatusManaRegen" "1" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.2" + } + + //================================================================================= + // Creature: Dire Hound Boss + //================================================================================= + "npc_dota_creature_dire_hound_boss" + { + // Script + "vscripts" "ai/ai_dire_hound_boss.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/items/beastmaster/boar/beast_deming/beast_deming.vmdl" + "SoundSet" "Beastmaster_Boar" + "Level" "1" + "ModelScale" "1.0" + "IsNeutralUnitType" "1" + + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ranged_quill_attack" + "Ability2" "" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "33" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "60" + "AttackDamageMax" "75" + "AttackRate" "1.45" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "600" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "1200" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "160" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "35" + "BountyGoldMin" "20" + "BountyGoldMax" "24" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "260" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "170" + "StatusHealthRegen" "0.5" + "StatusMana" "350" + "StatusManaRegen" "1" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.3" + + // Creature Data + //---------------------------------------------------------------- + + } + + //================================================================================= + // Creature: Fire Roshan + //================================================================================= + "npc_dota_creature_fire_roshan" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/creeps/blazhan/blazhan.vmdl" // Model. + "SoundSet" "Roshan" // Name of sound set. + "ModelScale" "1.75" + "Level" "1" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_fire_breath" // Ability 1. + "Ability2" "ability_absolute_no_cc" // Ability 2. + "Ability3" "ability_attack_speed_unslowable" + "Ability4" "ability_move_speed_unslowable" + "Ability5" "aggro_on_damage" // Ability 5 + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "10" // Physical protection. + "MagicalResistance" "35" // Magical protection (percentage). + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2400" // Damage range min. + "AttackDamageMax" "2600" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "2" // Speed of attack. + "AttackAnimationPoint" "0.6" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "3000" // Range within a target can be acquired. + "AttackRange" "200" // Range within a target can be attacked. + "ProjectileModel" "particles/base_attacks/ranged_goodguy.vpcf" // Particle system model for projectile. + "ProjectileSpeed" "1000" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "100" // Experience earn. + "BountyGoldMin" "105" // Gold earned min. + "BountyGoldMax" "125" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_HERO" // Hull type used for navigation/locomotion. + "RingRadius" "60" + "HealthBarOffset" "550" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "175" // Speed + "MovementTurnRate" "1.0" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "42000" // Base health. + "StatusHealthRegen" "0" // Health regeneration rate. + "StatusMana" "250" // Base mana. + "StatusManaRegen" "5" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_LIGHT" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_STRONG" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1400" // Range of vision during day light. + "VisionNighttimeRange" "1400" // Range of vision at night time. + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "OffensiveAbilities" + { + "Ability1" + { + "Name" "creature_fire_breath" + "AOE" "1" + "Radius" "900" + "MinimumTargets" "1" + } + } + } + } + + //================================================================================= + // Creature: Ice Roshan + //================================================================================= + "npc_dota_creature_ice_roshan" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/creeps/blazhan/blazhan.vmdl" // Model. + "SoundSet" "Roshan" // Name of sound set. + "ModelScale" "0.7" + "Level" "1" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_ice_slam" // Ability 1. + "Ability2" "ability_absolute_no_cc" // Ability 2. + "Ability3" "ability_attack_speed_unslowable" // Ability 3. + "Ability4" "ability_move_speed_unslowable" // Ability 4. + "Ability5" "aggro_on_damage" // Ability 5 + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "25" // Physical protection. + "MagicalResistance" "25" // Magical protection (percentage). + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "1600" // Damage range min. + "AttackDamageMax" "1800" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1" // Speed of attack. + "AttackAnimationPoint" "0.6" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "1800" // Range within a target can be acquired. + "AttackRange" "200" // Range within a target can be attacked. + "ProjectileModel" "particles/base_attacks/ranged_goodguy.vpcf" // Particle system model for projectile. + "ProjectileSpeed" "1000" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "100" // Experience earn. + "BountyGoldMin" "105" // Gold earned min. + "BountyGoldMax" "125" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_HERO" // Hull type used for navigation/locomotion. + "RingRadius" "60" + "HealthBarOffset" "300" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "320" // Speed + "MovementTurnRate" "1.0" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "30000" // Base health. + "StatusHealthRegen" "5" // Health regeneration rate. + "StatusMana" "250" // Base mana. + "StatusManaRegen" "5" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_LIGHT" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_STRONG" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1400" // Range of vision during day light. + "VisionNighttimeRange" "1400" // Range of vision at night time. + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "DefaultState" "Invade" + + "OffensiveAbilities" + { + "Ability1" + { + "Name" "creature_ice_slam" + "AOE" "1" + "Radius" "375" + "MinimumTargets" "1" + } + } + } + } + + //================================================================================= + // Creature: Baby Roshan + //================================================================================= + "npc_dota_creature_baby_roshan" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/courier/baby_rosh/babyroshan_alt.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "1.0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "440" + "AttackDamageMax" "465" + "AttackRate" "1.3" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "3000" + "AttackRange" "125" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "140" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "380" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1800" + "StatusHealthRegen" "2" + "StatusMana" "500" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "50.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + } + } + + + //================================================================================= + // Creature: Undead Woods Skeleton + //================================================================================= + "npc_dota_wraith_king_skeleton_warrior" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/items/wraith_king/arcana/wk_arcana_skeleton.vmdl" // Model. + "SoundSet" "Creep_Good_Melee" // Name of sound set. + "ModelScale" "1.3" + "Level" "1" + "IsSummoned" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "75" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "300" // Damage range min. + "AttackDamageMax" "350" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1.2" // Speed of attack. + "AttackAnimationPoint" "0.56" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "500" // Range within a target can be acquired. + "AttackRange" "128" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "" // Speed of projectile. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALLEST" // Hull type used for navigation/locomotion. + "HealthBarOffset" "140" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "300" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "550" // Base health. + "StatusHealthRegen" "0.0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "500" // Range of vision during day light. + "VisionNighttimeRange" "500" // Range of vision at night time. + } + + //================================================================================= + // Undead Woods Skeleton King + //================================================================================= + "npc_dota_undead_woods_skeleton_king" + { + // Script + "vscripts" "ai/skeleton_king.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/items/wraith_king/arcana/wraith_king_arcana.vmdl" + "IdleExpression" "scenes/skeleton_king/skeleton_king_exp_idle_01.vcd" + "SoundSet" "Hero_SkeletonKing" + "Level" "1" + "ModelScale" "2" + "ConsideredHero" "1" + + // Minimap + //---------------------------------------------------------------- + "MinimapIcon" "minimap_roshancamp" + "MinimapIconSize" "250" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "undead_woods_skeleton_king_hellfire_blast" + "Ability2" "aghsfort_skeleton_king_vampiric_aura" + "Ability3" "undead_woods_skeleton_king_mortal_strike" + "Ability4" "undead_woods_skeleton_king_reincarnation" + "Ability5" "skeleton_king_run_passive" + "Ability6" "ability_attack_speed_unslowable" + "Ability7" "creature_generic_high_status_resist_passive" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "25" + "MagicalResistance" "25" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "800" + "AttackDamageMax" "900" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.56" + "AttackAcquisitionRange" "1800" + "AttackRange" "250" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "75" + "HealthBarOffset" "400" + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "1000" + "BountyGoldMin" "500" + "BountyGoldMax" "1000" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "325" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "6500" + "StatusHealthRegen" "15" + "StatusMana" "25000" + "StatusManaRegen" "250" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1800" + "VisionNighttimeRange" "1800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "1" + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "13571" + } + "Wearable2" + { + "ItemDef" "13569" + } + "Wearable3" + { + "ItemDef" "13473" + } + "Wearable4" + { + "ItemDef" "13760" + } + "Wearable5" + { + "ItemDef" "13456" + } + "Wearable6" + { + "ItemDef" "13743" + } + } + } + } + + + //================================================================================= + // Creature: Dark Seer + //================================================================================= + "npc_dota_creature_dark_seer" + { + // Script + //"vscripts" "ai/dark_seer.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/dark_seer/dark_seer.vmdl" + "IdleExpression" "scenes/dark_seer/dark_seer_exp_idle_01.vcd" + "SoundSet" "Hero_DarkSeer" + "Level" "1" + "ModelScale" "1.5" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_dark_seer_vacuum" + "Ability2" "creature_dark_seer_wall_of_replica" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "15" + "MagicalResistance" "25" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "450" + "AttackDamageMax" "550" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.75" + "AttackAcquisitionRange" "1000" + "AttackRange" "128" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "140" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "280" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "8500" + "StatusHealthRegen" "2" + "StatusMana" "5000" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + //Inventory + "HasInventory" "1" + + //---------------------------------------------------------------- + "Creature" + { + "OffensiveAbilities" + { + "Ability1" + { + "Name" "creature_dark_seer_wall_of_replica" + "AOE" "1" + "Radius" "400" + "MinimumTargets" "2" + } + "Ability2" + { + "Name" "creature_dark_seer_vacuum" + "AOE" "1" + "Radius" "400" + "MinimumTargets" "2" + } + } + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "524" + } + "Wearable2" + { + "ItemDef" "348" + } + "Wearable3" + { + "ItemDef" "352" + } + "Wearable4" + { + "ItemDef" "351" + } + "Wearable5" + { + "ItemDef" "349" + } + "Wearable6" + { + "ItemDef" "350" + } + } + } + } + + //================================================================================= + // Frost Kobold + //================================================================================= + "npc_dota_creature_frost_kobold" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/creeps/neutral_creeps/n_creep_kobold/kobold_c/n_creep_kobold_frost.vmdl" // Model. + "SoundSet" "Creep_Bad_Melee_Mega" // Name of sound set. + "ModelScale" "1.2" + "Level" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + "Ability6" "" // Ability 6 - Extra. + "Ability7" "" // Ability 7 - Extra. + "Ability8" "" // Ability 8 - Extra. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "8" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "175" // Damage range min. + "AttackDamageMax" "225" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1" // Speed of attack. + "AttackAnimationPoint" "0.38" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "900" // Range within a target can be acquired. + "AttackRange" "128" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "" // Speed of projectile. + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" // Base strength + "AttributeStrengthGain" "0" // Strength bonus per level. + "AttributeBaseIntelligence" "0" // Base intelligence + "AttributeIntelligenceGain" "0" // Intelligence bonus per level. + "AttributeBaseAgility" "0" // Base agility + "AttributeAgilityGain" "0" // Agility bonus per level. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" // Hull type used for navigation/locomotion. + "RingRadius" "45" + "HealthBarOffset" "200" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "335" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "650" // Base health. + "StatusHealthRegen" "0.5" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "850" // Range of vision during day light. + "VisionNighttimeRange" "800" // Range of vision at night time. + + "PathfindingSearchDepthScale" "0.1" + } + + //================================================================================= + // Creature: Lich + //================================================================================= + "npc_dota_creature_lich" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/lich/lich.vmdl" + "SoundSet" "Hero_Lich" + "IdleSoundLoop" "Hero_Lich.IdleLoop" + "Level" "1" + "ModelScale" "1.5" + + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_lich.vsndevts" + + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_lich_chain_frost" + "Ability2" "creature_lich_sinister_gaze" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "50" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "150" + "AttackDamageMax" "200" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.46" + "AttackAcquisitionRange" "1000" + "AttackRange" "550" + "ProjectileModel" "particles/units/heroes/hero_lich/lich_base_attack.vpcf" + "ProjectileSpeed" "900" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "400" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "300" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "3000" + "StatusHealthRegen" "1" + "StatusMana" "4000" + "StatusManaRegen" "1.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "OffensiveAbilities" + { + "Ability1" + { + "Name" "creature_lich_sinister_gaze" + } + "Ability2" + { + "Name" "creature_lich_chain_frost" + } + } + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "331" + } + "Wearable2" + { + "ItemDef" "332" + } + "Wearable3" + { + "ItemDef" "333" + } + "Wearable4" + { + "ItemDef" "571" + } + "Wearable5" + { + "ItemDef" "506" + } + "Wearable6" + { + "ItemDef" "334" + } + } + } + } + + //================================================================================================================= + // Breakable Cage + //================================================================================================================= + "npc_dota_cage" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_rotatable_building" + "Model" "models/gameplay/breakingcrate_dest.vmdl" + "SoundSet" "Creep_Good_Melee" + "Level" "1" + "ModelScale" "1.2" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "45" + "HealthBarOffset" "110" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + //"UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + "DisableDamageDisplay" "1" + "PathfindingSearchDepthScale" "0.0" + } + + //================================================================================= + // Creature: Sheep Hostage + //================================================================================= + "npc_dota_creature_sheep_hostage" + { + // Script + "vscripts" "ai/sheep.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/items/hex/sheep_hex/sheep_hex.vmdl" + "SoundSet" "DireHound" + "Level" "1" + "ModelScale" "1" + + + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_unselectable" + "Ability2" "modifier_invulnerable" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "45" + "HealthBarOffset" "90" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "20" + "BountyGoldMin" "11" + "BountyGoldMax" "15" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "300" + "StatusHealthRegen" "0.5" + "StatusMana" "100" + "StatusManaRegen" "1" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "EquippedItems" + { + "Travels" + { + "Item" "item_travel_boots" + } + } + } + } + + //================================================================================= + // Beastmaster Boss + //================================================================================= + "npc_dota_creature_beastmaster_boss" + { + // Script + "vscripts" "ai/beastmaster.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/heroes/beastmaster/beastmaster.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Beastmaster" + "Level" "1" + "ModelScale" "1" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "beastmaster_wild_axes" + "Ability2" "beastmaster_primal_roar" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "3" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "125" + "AttackDamageMax" "175" + "AttackRate" "1.55" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "170" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "55" + "BountyGoldMin" "29" + "BountyGoldMax" "35" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "250" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1600" + "StatusHealthRegen" "10" + "StatusMana" "2000" + "StatusManaRegen" "10" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "4704" // weapons: default + } + "Wearable2" + { + "ItemDef" "4706" // head: default + } + "Wearable3" + { + "ItemDef" "4705" // shoulders: default + } + "Wearable4" + { + "ItemDef" "4716" // arms: default + } + "Wearable5" + { + "ItemDef" "4887" // belt: default + } + } + } + } + + //================================================================================= + // Creature: Beastmaster Boar + //================================================================================= + "npc_dota_creature_beastmaster_boar" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/beastmaster/beastmaster_beast.vmdl" + "SoundSet" "Beastmaster_Boar" + "Level" "1" + "ModelScale" "0.7" + "IsNeutralUnitType" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + "Ability2" "" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "33" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "100" // Damage range min. + "AttackDamageMax" "150" // Damage range max. + "AttackRate" "1.5" // Speed of attack. + "AttackAnimationPoint" "0.633" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "600" // Range within a target can be acquired. + "AttackRange" "550" // Range within a target can be attacked. + "ProjectileModel" "particles/units/heroes/hero_beastmaster/beastmaster_boar_attack.vpcf" // Particle system model for projectile. + "ProjectileSpeed" "1500" // Speed of projectile. + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "160" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "35" + "BountyGoldMin" "20" + "BountyGoldMax" "24" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "250" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "700" + "StatusHealthRegen" "1" + "StatusMana" "500" + "StatusManaRegen" "1" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.1" + + // Creature Data + //---------------------------------------------------------------- + + } + + //================================================================================= + // Troll Warlord Boss Melee + //================================================================================= + "npc_dota_creature_troll_warlord_melee" + { + // Script + "vscripts" "ai/troll_warlord_melee.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/heroes/troll_warlord/troll_warlord.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_TrollWarlord" + "Level" "1" + "ModelScale" "1.5" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "troll_warlord_fervor" + "Ability2" "troll_warlord_whirling_axes_melee" + "Ability3" "skeleton_king_run_passive" + "Ability4" "troll_warlord_battle_trance" + "Ability5" "lone_druid_spirit_bear_entangle" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "3" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "450" + "AttackDamageMax" "500" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "150" + "ProjectileModel" "particles/units/heroes/hero_troll_warlord/troll_warlord_base_attack.vpcf" + "ProjectileSpeed" "1200" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "170" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "55" + "BountyGoldMin" "29" + "BountyGoldMax" "35" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "9000" + "StatusHealthRegen" "0" + "StatusMana" "5000" + "StatusManaRegen" "10" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "EquippedItems" + { + "BlackKingBar" + { + "Item" "item_creature_black_king_bar" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "9597" // weapon: default + } + "Wearable2" + { + "ItemDef" "9597" // offhand: default + } + "Wearable3" + { + "ItemDef" "9597" // melee: default + } + "Wearable4" + { + "ItemDef" "9597" // melee offhand: default + } + "Wearable5" + { + "ItemDef" "9676" // shoulders: default + } + "Wearable6" + { + "ItemDef" "9595" // head: default + } + "Wearable7" + { + "ItemDef" "9596" // armor: default + } + } + } + } + + //================================================================================= + // Troll Warlord Boss Ranged + //================================================================================= + "npc_dota_creature_troll_warlord_ranged" + { + // Script + "vscripts" "ai/troll_warlord_ranged.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/heroes/troll_warlord/troll_warlord.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_TrollWarlord" + "Level" "1" + "ModelScale" "1.5" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "troll_warlord_fervor" + "Ability2" "troll_warlord_whirling_axes_ranged" + "Ability3" "skeleton_king_run_passive" + "Ability4" "troll_warlord_battle_trance" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "3" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "350" + "AttackDamageMax" "450" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "500" + "ProjectileModel" "particles/units/heroes/hero_troll_warlord/troll_warlord_base_attack.vpcf" + "ProjectileSpeed" "1200" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "170" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "55" + "BountyGoldMin" "29" + "BountyGoldMax" "35" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "9000" + "StatusHealthRegen" "0" + "StatusMana" "5000" + "StatusManaRegen" "10" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "EquippedItems" + { + "BlackKingBar" + { + "Item" "item_creature_black_king_bar" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "373" // weapon: default + } + "Wearable2" + { + "ItemDef" "374" // offhand: default + } + "Wearable3" + { + "ItemDef" "379" // melee: default + } + "Wearable4" + { + "ItemDef" "380" // melee offhand: default + } + "Wearable5" + { + "ItemDef" "410" // shoulders: default + } + "Wearable6" + { + "ItemDef" "411" // head: default + } + "Wearable7" + { + "ItemDef" "412" // armor: default + } + } + } + } + + //================================================================================= + // Creature: Skywrath Mage Gladiator + //================================================================================= + "npc_dota_creature_skywrath_mage" + { + // Script + "vscripts" "ai/skywrath_mage.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/heroes/skywrath_mage/skywrath_mage.vmdl" + "IdleExpression" "scenes/skywrath_mage/skywrath_mage_exp_idle_01.vcd" + "SoundSet" "Hero_SkywrathMage" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "skywrath_mage_arcane_bolt" + "Ability2" "skywrath_mage_concussive_shot" + "Ability3" "skywrath_mage_mystic_flare" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "2" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "125" + "AttackDamageMax" "125" + "AttackRate" "1.35" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_skywrath_mage/skywrath_mage_base_attack.vpcf" + "ProjectileSpeed" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "50" + "HealthBarOffset" "300" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "30" + "BountyGoldMin" "21" + "BountyGoldMax" "24" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "295" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "800" + "StatusHealthRegen" "0" + "StatusMana" "1000" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ParticleFile" "particles/units/heroes/hero_dazzle.pcf" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "DisableClumpingBehavior" "1" + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "4995" // gloves: default + } + "Wearable2" + { + "ItemDef" "4999" // staff: default + } + "Wearable3" + { + "ItemDef" "5000" // helmet: default + } + "Wearable4" + { + "ItemDef" "5001" // belt: default + } + "Wearable5" + { + "ItemDef" "5002" // armor: default + } + "Wearable6" + { + "ItemDef" "5003" // wings: default + } + } + } + } + + //================================================================================= + // Legion Commander Gladiator + //================================================================================= + "npc_dota_creature_legion_commander" + { + // Script + "vscripts" "ai/legion_commander.lua" + + // General + //---------------------------------------------------------------- + "Model" "models/heroes/legion_commander/legion_commander.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_LegionCommander" + "Level" "1" + "ModelScale" "2" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "legion_commander_overwhelming_odds" + "Ability2" "legion_commander_duel" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "3" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "150" + "AttackDamageMax" "175" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.46" + "AttackAcquisitionRange" "600" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "350" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "55" + "BountyGoldMin" "29" + "BountyGoldMax" "35" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "2000" + "StatusHealthRegen" "10" + "StatusMana" "2000" + "StatusManaRegen" "10" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "DisableClumpingBehavior" "1" + "EquippedItems" + { + "Blademail" + { + "Item" "item_blade_mail" + } + } + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "8824" // helmet: default + } + "Wearable2" + { + "ItemDef" "8821" // shoulder: default + } + "Wearable3" + { + "ItemDef" "8822" // banner: default + } + "Wearable4" + { + "ItemDef" "8823" // weapon: default + } + "Wearable5" + { + "ItemDef" "8820" // bracers: default + } + } + } + } + + //================================================================================= + // Creature: Gladiator Creep + //================================================================================= + "npc_dota_creature_gladiator_creep" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/items/wraith_king/wk_ti8_creep/wk_ti8_creep_crimson.vmdl" + "SoundSet" "n_creep_Melee" + "Level" "1" + "ModelScale" "1.5" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "15" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "88" + "AttackDamageMax" "99" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.36" + "AttackAcquisitionRange" "1000" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALLEST" + "RingRadius" "40" + "HealthBarOffset" "250" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "270" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "550" + "StatusHealthRegen" "1" + "StatusMana" "50" + "StatusManaRegen" "2" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "0.5" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + "DefaultState" "Invade" + } + } + + //================================================================================================================= + // Bonus Cog + //================================================================================================================= + "npc_dota_bonus_cog" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_rattletrap_cog" + "Model" "models/items/rattletrap/mechanised_pilgrim_cog/mechanised_pilgrim_cog.vmdl" + "SoundSet" "0" + "Level" "1" + "ModelScale" "2" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "modifier_invulnerable" + "Ability2" "ability_unselectable" + "Ability3" "no_health_bar" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1.0" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" + "AttributeStrengthGain" "0" + "AttributeBaseIntelligence" "0" + "AttributeIntelligenceGain" "0" + "AttributeBaseAgility" "0" + "AttributeAgilityGain" "0" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + "RingRadius" "45" + "HealthBarOffset" "120" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "1.0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "99999" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusStartingMana" "0" + "StatusManaRegen" "0" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1" + "VisionNighttimeRange" "1" + + "DisableDamageDisplay" "1" + "PathfindingSearchDepthScale" "0.0" + } + + //================================================================================= + // Creature: Bonus Greevil + //================================================================================= + "npc_dota_creature_bonus_greevil" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/courier/gold_mega_greevil/gold_mega_greevil.vmdl" + "SoundSet" "Greevil" + "ModelScale" "1.25" + "IsNeutralUnitType" "1" + "IsAncient" "1" + "ConsideredHero" "1" + "HasInventory" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "creature_bonus_greevil" + "Ability2" "no_health_bar" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "1" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "1" + "AttackDamageMax" "2" + "AttackRate" "1.45" + "AttackAnimationPoint" "0.33" + "AttackAcquisitionRange" "500" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "45" + "HealthBarOffset" "150" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "62" + "BountyGoldMin" "22" + "BountyGoldMax" "26" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "500" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1" + "StatusHealthRegen" "0.5" + "StatusMana" "60000" + "StatusManaRegen" "500" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Minimap + //---------------------------------------------------------------- + "MinimapIcon" "minimap_roshancamp" + "MinimapIconSize" "450" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "EquippedItems" + { + "Travels" + { + "Item" "item_travel_boots" + } + } + } + } + + //================================================================================= + // Creature: Evil Greevil + //================================================================================= + "npc_dota_creature_evil_greevil" + { + // Script + "vscripts" "ai/evil_greevil.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/courier/greevil/greevil.vmdl" + "SoundSet" "Miniboss_Greevil" + "ModelScale" "1.5" + "IsNeutralUnitType" "1" + "IsAncient" "1" + "ConsideredHero" "1" + "HasInventory" "1" + "AnimationModifier" "miniboss" + "skin" "7" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "evil_greevil_passive" + "Ability2" "obsidian_destroyer_astral_imprisonment" + "Ability3" "" + "Ability4" "no_health_bar" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "1" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "1" + "AttackDamageMax" "2" + "AttackRate" "1.45" + "AttackAnimationPoint" "0.33" + "AttackAcquisitionRange" "500" + "AttackRange" "100" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "45" + "HealthBarOffset" "150" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "100" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "10000" + "StatusHealthRegen" "0.5" + "StatusMana" "1000" + "StatusManaRegen" "500" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Minimap + //---------------------------------------------------------------- + "MinimapIcon" "minimap_roshancamp" + "MinimapIconSize" "450" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + "EquippedItems" + { + "Travels" + { + "Item" "item_travel_boots" + } + } + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "10071" // ears: default + } + "Wearable2" + { + "ItemDef" "10074" // hair: default + } + "Wearable3" + { + "ItemDef" "10075" // horns: default + } + "Wearable4" + { + "ItemDef" "10083" // tail: default + } + "Wearable5" + { + "ItemDef" "10084" // teeth: default + } + "Wearable6" + { + "ItemDef" "10130" // feathers: default + } + } + } + } + + //================================================================================= + // Observer Ward - Beach + //================================================================================= + + "npc_dota_observer_ward_beach" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/items/wards/esl_wardchest_rockshell_terrapin/esl_wardchest_rockshell_terrapin.vmdl" // Model. + "SoundSet" "" // Name of sound set. + "Level" "1" + "ModelScale" "1" + "MinimapIcon" "minimap_ward_obs" + "MinimapIconSize" "300" + "wearable" "7555" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "no_health_bar" + "Ability2" "ability_unselectable" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion. + "HealthBarOffset" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" // Base health. + "StatusHealthRegen" "0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "100" // Experience earn. + "BountyGoldMin" "100" // Gold earned min. + "BountyGoldMax" "100" // Gold earned max. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1600" // Range of vision during day light. + "VisionNighttimeRange" "1600" // Range of vision at night time. + } + + //================================================================================= + // Observer Ward - Journey + //================================================================================= + + "npc_dota_observer_ward_journey" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/items/wards/chinese_ward/chinese_ward.vmdl" // Model. + "SoundSet" "" // Name of sound set. + "Level" "1" + "ModelScale" "1" + "MinimapIcon" "minimap_ward_obs" + "MinimapIconSize" "300" + "wearable" "7555" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "no_health_bar" + "Ability2" "ability_unselectable" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion. + "HealthBarOffset" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" // Base health. + "StatusHealthRegen" "0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "100" // Experience earn. + "BountyGoldMin" "100" // Gold earned min. + "BountyGoldMax" "100" // Gold earned max. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1600" // Range of vision during day light. + "VisionNighttimeRange" "1600" // Range of vision at night time. + } + + //================================================================================= + // Observer Ward - Crypt + //================================================================================= + + "npc_dota_observer_ward_crypt" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/items/wards/dire_ward_eye/dire_ward_eye.vmdl" // Model. + "SoundSet" "" // Name of sound set. + "Level" "1" + "ModelScale" "1" + "MinimapIcon" "minimap_ward_obs" + "MinimapIconSize" "300" + "wearable" "7555" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "no_health_bar" + "Ability2" "ability_unselectable" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion. + "HealthBarOffset" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" // Base health. + "StatusHealthRegen" "0" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "100" // Experience earn. + "BountyGoldMin" "100" // Gold earned min. + "BountyGoldMax" "100" // Gold earned max. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1600" // Range of vision during day light. + "VisionNighttimeRange" "1600" // Range of vision at night time. + } + + //================================================================================= + // Aghanim + //================================================================================= + "npc_dota_boss_aghanim" + { + // Script + "vscripts" "ai/boss_aghanim.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/aghanim/aghanim_model.vmdl" + "SoundSet" "Hero_Oracle" + "IdleSoundLoop" "Hero_Oracle.IdleLoop" + "Level" "1" + "ModelScale" "1.8" + "ConsideredHero" "1" + "IsAncient" "1" + "IsBossMonster" "1" + "IdleExpression" "scenes/aghanim/aghanim_exp_idle.vcd" + "VoiceFile" "soundevents/voscripts/game_sounds_vo_aghanim.vsndevts" + + // Minimap + //---------------------------------------------------------------- + "MinimapIcon" "minimap_roshancamp" + "MinimapIconSize" "250" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghanim_crystal_attack" + "Ability2" "aghanim_staff_beams" + "Ability3" "aghanim_blink" + "Ability4" "aghanim_summon_portals" + "Ability5" "aghanim_spell_swap" + "Ability6" "aghanim_shard_attack" + "Ability7" "aghanim_passive" + "Ability8" "aghanim_spear" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "65" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "1500" + "AttackDamageMax" "1750" + "AttackRate" "1.7" + "AttackAnimationPoint" "0.53" + "AttackAcquisitionRange" "1800" + "AttackRange" "1000" + "ProjectileModel" "particles/units/heroes/hero_oracle/oracle_base_attack.vpcf" + "ProjectileSpeed" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "75" + "HealthBarOffset" "645" + "BoundsHullName" "DOTA_HULL_SIZE_HUGE" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "450" + "MovementTurnRate" "0.5" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "135000" + "StatusHealthRegen" "0" + "StatusMana" "10000" + "StatusManaRegen" "250" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "5000" + "VisionNighttimeRange" "5000" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "HasInventory" "1" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "AttachWearables" + { + } + + "HPGain" "22500" + } + } + + //================================================================================= + // Aghanim Crystal + //================================================================================= + "npc_dota_boss_aghanim_crystal" + { + // General + //---------------------------------------------------------------- + "Model" "models/gameplay/aghanim_crystal.vmdl" // Model. + "BaseClass" "npc_dota_base_additive" + "SoundSet" "Pugna_NetherWard" // Name of sound set. + "Level" "0" + "ModelScale" "2.5" + "ConsideredHero" "1" + + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" // Ability 1 + "Ability2" "" // Ability 2 + "Ability3" "" // Ability 3 + "Ability4" "" // Ability 4 + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" // Damage range min. + "AttackDamageMax" "0" // Damage range max. + "AttackRate" "1.0" // Speed of attack. + "AttackAnimationPoint" "0.0" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "0" // Range within a target can be acquired. + "AttackRange" "0" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "0" // Speed of projectile. + + // Bounds + //---------------------------------------------------------------- + "HealthBarOffset" "145" + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_FLY" + "MovementSpeed" "0" // Speed. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "10" // Base health. + "StatusHealthRegen" "0.0" // Health regeneration rate. + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "600" // Range of vision during day light. + "VisionNighttimeRange" "600" // Range of vision at night time. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + } + + //================================================================================= + // Aghanim Spear + //================================================================================= + "npc_dota_boss_aghanim_spear" + { + // General + //---------------------------------------------------------------- + "Model" "models/gameplay/aghanim_staff.vmdl" // Model. + + "BaseClass" "npc_dota_base_additive" + "SoundSet" "Pugna_NetherWard" // Name of sound set. + "Level" "0" + "ModelScale" "1.5" + + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" // Ability 1 + "Ability2" "" // Ability 2 + "Ability3" "" // Ability 3 + "Ability4" "" // Ability 4 + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" // Damage range min. + "AttackDamageMax" "0" // Damage range max. + "AttackRate" "1.0" // Speed of attack. + "AttackAnimationPoint" "0.0" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "0" // Range within a target can be acquired. + "AttackRange" "0" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "0" // Speed of projectile. + + // Bounds + //---------------------------------------------------------------- + "HealthBarOffset" "145" + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_FLY" + "MovementSpeed" "0" // Speed. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "10" // Base health. + "StatusHealthRegen" "0.0" // Health regeneration rate. + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "300" // Range of vision during day light. + "VisionNighttimeRange" "300" // Range of vision at night time. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + } + + //================================================================================= + // Aghanim Minion + //================================================================================= + "npc_dota_creature_aghanim_minion" + { + // General + // + "BaseClass" "npc_dota_creature" // Class of entity of link to. + "Model" "models/items/warlock/golem/ti_8_warlock_darkness_apostate_golem/ti_8_warlock_darkness_apostate_golem.vmdl" + "SoundSet" "Hero_WarlockGolem" // Name of sound set. + "ModelScale" "1.0" + "Level" "1" + + // Abilities + //---------------------------------------------------------------- + + "Ability1" "ghost_frost_attack" // Ability 1. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "25" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "1360" // Damage range min. + "AttackDamageMax" "1360" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "1.2" // Speed of attack. + "AttackAnimationPoint" "0.26" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "5000" // Range within a target can be acquired. + "AttackRange" "150" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "" // Speed of projectile. + + // Attributes + //---------------------------------------------------------------- + "AttributePrimary" "DOTA_ATTRIBUTE_STRENGTH" + "AttributeBaseStrength" "0" // Base strength + "AttributeStrengthGain" "0" // Strength bonus per level. + "AttributeBaseIntelligence" "0" // Base intelligence + "AttributeIntelligenceGain" "0" // Intelligence bonus per level. + "AttributeBaseAgility" "0" // Base agility + "AttributeAgilityGain" "0" // Agility bonus per level. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" // Hull type used for navigation/locomotion. + "RingRadius" "45" + "HealthBarOffset" "300" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" // Type of locomotion - ground, air + "MovementSpeed" "300" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1800" // Base health. + "StatusHealthRegen" "0.5" // Health regeneration rate. + "StatusMana" "75" // Base mana. + "StatusManaRegen" "1.0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "850" // Range of vision during day light. + "VisionNighttimeRange" "800" // Range of vision at night time. + + // Creature Data + //---------------------------------------------------------------------------------------------------------------------- + "Creature" + { + } + } + + //================================================================================= + // Story Crystal + //================================================================================= + "npc_dota_story_crystal" + { + // General + //---------------------------------------------------------------- + "Model" "models/gameplay/aghanim_crystal.vmdl" // Model. + "BaseClass" "npc_dota_creature" + "SoundSet" "Pugna_NetherWard" // Name of sound set. + "Level" "1" + "ModelScale" "2.5" + "ConsideredHero" "1" + + + // Abilities + //---------------------------------------------------------------- + "Ability1" "story_crystal" // Ability 1 + "Ability2" "" // Ability 2 + "Ability3" "" // Ability 3 + "Ability4" "" // Ability 4 + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" // Damage range min. + "AttackDamageMax" "0" // Damage range max. + "AttackRate" "1.0" // Speed of attack. + "AttackAnimationPoint" "0.0" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "0" // Range within a target can be acquired. + "AttackRange" "0" // Range within a target can be attacked. + "ProjectileModel" "" // Particle system model for projectile. + "ProjectileSpeed" "0" // Speed of projectile. + + // Bounds + //---------------------------------------------------------------- + "HealthBarOffset" "145" + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" // Hull type used for navigation/locomotion. + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" // Experience earn. + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_FLY" + "MovementSpeed" "0" // Speed. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "10" // Base health. + "StatusHealthRegen" "0.0" // Health regeneration rate. + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "600" // Range of vision during day light. + "VisionNighttimeRange" "600" // Range of vision at night time. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + } + + + //================================================================================= + // Creature: Mireska + //================================================================================= + "npc_dota_creature_mireska" + { + // Script + //"vscripts" "ai/mireska_ai.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/dark_willow/dark_willow.vmdl" + "IdleExpression" "scenes/sylph/sylph_exp_idle_01.vcd" + "SoundSet" "Hero_DarkWillow" + "IdleSoundLoop" "Hero_DarkWillow.IdleLoop" + "Level" "1" + "ModelScale" "1.2" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + //"Ability1" "aghsfort_mireska_mega_brambles" + //"Ability2" "aghsfort_mireska_terrorize" + + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "27" + "AttackDamageMax" "35" + "AttackRate" "1.500000" + "BaseAttackSpeed" "115" + "AttackSpeedActivityModifiers" + { + "fast" "200" + "faster" "300" + } + "AttackAnimationPoint" "0.30000" + "AttackAcquisitionRange" "800" + "AttackRange" "475" + "ProjectileModel" "particles/units/heroes/hero_dark_willow/dark_willow_base_attack.vpcf" + "ProjectileSpeed" "1200" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "310" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "1220" + "StatusHealthRegen" "1" + "StatusMana" "200" + "StatusManaRegen" "4" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "1.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "CanRespawn" "0" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "100.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + "DefaultState" "Invade" + } + } + + //------------------------------------------------------------------------- + // Creature Tiny + //------------------------------------------------------------------------- + "npc_dota_creature_elemental_tiny" + { + // Script + "vscripts" "ai/elemental_tiny_ai.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/tiny/tiny_03/tiny_03.vmdl" + "SoundSet" "Hero_Tiny" + "Level" "1" + "ModelScale" "1.2" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_elemental_tiny_toss" + "Ability2" "aghsfort_elemental_tiny_create_io" + "Ability3" "elemental_tiny_tree_attack" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "1000" + "AttackDamageMax" "1150" + "AttackRate" "1.500000" + "BaseAttackSpeed" "90" + "AttackAnimationPoint" "0.40000" + "AttackAcquisitionRange" "900" + "AttackRange" "170" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "300" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "23000" + "StatusHealthRegen" "1" + "StatusMana" "200" + "StatusManaRegen" "4" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "1.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + "DisableResistance" "95.0" + + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "50.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "13551" + } + + } + } + + } + + //------------------------------------------------------------------------- + // Creature Elemental Io + //------------------------------------------------------------------------- + "npc_dota_creature_elemental_io" + { + // Script + "vscripts" "ai/elemental_io_ai.lua" + + // General + //---------------------------------------------------------------- + "BaseClass" "npc_dota_creature" + "Model" "models/heroes/wisp/wisp.vmdl" + "SoundSet" "Hero_Wisp" + "IdleSoundLoop" "Hero_Wisp.IdleLoop" + "Level" "1" + "ModelScale" "1" + "ConsideredHero" "0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "aghsfort_wisp_tether" + "Ability2" "aghsfort_wisp_autoattack" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + "MagicalResistance" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "300" + "AttackDamageMax" "350" + "AttackRate" "1.800000" + "AttackAnimationPoint" "0.150000" + "AttackAcquisitionRange" "800" + "AttackRange" "500" + "ProjectileModel" "particles/units/heroes/hero_wisp/wisp_base_attack.vpcf" + "ProjectileSpeed" "1200" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "60" + "HealthBarOffset" "200" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "290" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "4000" + "StatusHealthRegen" "00" + "StatusMana" "200" + "StatusManaRegen" "4" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_BADGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "PathfindingSearchDepthScale" "1.0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + //Basic AI State + //----------------------------------------------------------------- + "DefaultState" "Invade" + "States" + { + "Invade" + { + "Name" "Invade" + "Aggression" "50.0" + "Avoidance" "0.0" + "Support" "0.0" + } + } + + "AttachWearables" + { + "Wearable1" + { + "ItemDef" "536" + } + "Wearable2" + { + "ItemDef" "639" + } + + } + } + + } + + "npc_aghsfort_witch_doctor_death_ward" + { + // General + //---------------------------------------------------------------- + "BaseClass" "npc_aghsfort_witch_doctor_death_ward" // Class of entity of link to. + "Model" "models/heroes/witchdoctor/witchdoctor_ward.vmdl"// Model. + "SoundSet" "Hero_WitchDoctor_Ward" // Name of sound set. + "Level" "3" + "wearable" "602" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" // Ability 1. + "Ability2" "" // Ability 2. + "Ability3" "" // Ability 3. + "Ability4" "" // Ability 4. + "Ability5" "" // Ability 5. + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" // Physical protection. + "MagicalResistance" "0" // Magical protection. + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "0" // Damage range min. + "AttackDamageMax" "0" // Damage range max. + "AttackDamageType" "DAMAGE_TYPE_ArmorPhysical" + "AttackRate" "0.15" // Speed of attack. + "AttackAnimationPoint" "0.0" // Normalized time in animation cycle to attack. + "AttackAcquisitionRange" "700" // Range within a target can be acquired. + "AttackRange" "700" // Range within a target can be attacked. + "ProjectileModel" "particles/units/heroes/hero_witchdoctor/witchdoctor_ward_attack.vpcf" // Particle system model for projectile. + "ProjectileSpeed" "1000" // Speed of projectile. + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SIEGE" // Hull type used for navigation/locomotion. + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" // Type of locomotion - ground, air + "MovementSpeed" "0" // Speed + "MovementTurnRate" "0.5" // Turning rate. + + // Bounty + //---------------------------------------------------------------- + "BountyGoldMin" "0" // Gold earned min. + "BountyGoldMax" "0" // Gold earned max. + + // Status + //---------------------------------------------------------------- + "StatusHealth" "135" // Base health. + "StatusHealthRegen" "0.25" // Health regeneration rate. + "StatusMana" "0" // Base mana. + "StatusManaRegen" "0" // Mana regeneration rate. + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" // Team name. + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_HERO" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "1200" // Range of vision during day light. + "VisionNighttimeRange" "800" // Range of vision at night time. + + //Inventory + "HasInventory" "0" + } + + //================================================================================= + // Mars Bulwark Soldier + //================================================================================= + "aghsfort_mars_bulwark_soldier" + { + // Script + + // General + //---------------------------------------------------------------- + "Model" "models/heroes/mars/mars_soldier.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Mars" + "Level" "1" + "ModelScale" "1" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + "Ability2" "" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "3" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "23" + "AttackDamageMax" "27" + "AttackRate" "0.5" + "AttackAnimationPoint" "0.26" + "AttackAcquisitionRange" "300" + "AttackRange" "300" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "170" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "150" + "StatusHealthRegen" "10" + "StatusMana" "150" + "StatusManaRegen" "10" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "HasInventory" "0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + } + } + + //================================================================================= + // Shop + //================================================================================= + "boss_shop" + { + "BaseClass" "ent_dota_shop" + "Model" "models/heroes/bristleback/bristleback.vmdl" + "ModelScale" "1" + "MinimapIcon" "minimap_miscbuilding" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "20" + "MagicalResistance" "100" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES | DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Bounds + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_REGULAR" + "RingRadius" "150" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "MovementSpeed" "0" + "MovementTurnRate" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "50" + "StatusHealthRegen" "0" + } + "aghsfort_ursa_minor" + { + // Script + + // General + //---------------------------------------------------------------- + "Model" "models/heroes/ursa/ursa.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Ursa" + "Level" "1" + "ModelScale" "0.45" + "ConsideredHero" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_unselectable" + "Ability2" "" + "Ability3" "" + "Ability4" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "3" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "99999" + "AttackRange" "150" + "ProjectileModel" "" + "ProjectileSpeed" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "70" + "HealthBarOffset" "170" + + // Bounty + //---------------------------------------------------------------- + "BountyXP" "0" + "BountyGoldMin" "0" + "BountyGoldMax" "0" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "400" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "150" + "StatusHealthRegen" "10" + "StatusMana" "150" + "StatusManaRegen" "10" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_GOODGUYS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_HERO" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "HasInventory" "0" + + // Creature Data + //---------------------------------------------------------------- + "Creature" + { + } + } +} + diff --git a/aghanim_singleplayer/scripts/npc/portraits_custom.txt b/aghanim_singleplayer/scripts/npc/portraits_custom.txt new file mode 100755 index 0000000..c4eee60 --- /dev/null +++ b/aghanim_singleplayer/scripts/npc/portraits_custom.txt @@ -0,0 +1,1929 @@ +"Portraits" +{ + "models/creeps/ogre_1/boss_ogre.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "285.532532 -157.419052 125.110092" + "PortraitAngles" "357.690033 149.630325 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "193.257233 71.127800 292.348755" + "PortraitLightAngles" "46.848206 -161.587860 -1.843557" + "PortraitLightFOV" "115.716003" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "159 211 246" + "PortraitLightScale" "3.619000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_oracle.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ogre_1/large_ogre.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "307.912964 -139.564285 20.279293" + "PortraitAngles" "341.690002 155.230209 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "95.904312 -85.244843 248.650040" + "PortraitLightAngles" "40.585789 153.034225 25.976814" + "PortraitLightFOV" "120.000000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "123 135 137" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "0 0 0" + "PortraitShadowScale" "1.540000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.494 0.867 0.070" + "PortraitAmbientColor" "255 184 137" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "0.921569 0.572549 0.572549" + "PortraitBackgroundColor4" "0.462745 0.262745 0.262745" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_light.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ogre_1/small_ogre.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "425.931244 -53.044758 200.493240" + "PortraitAngles" "9.690046 172.030136 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "302.719849 142.602951 302.535004" + "PortraitLightAngles" "37.054520 -152.895279 6.741128" + "PortraitLightFOV" "85.966003" + "PortraitLightDistance" "608.989990" + "PortraitLightColor" "77 122 118" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "0.175 0.961 -0.214" + "PortraitAmbientColor" "145 161 154" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_graveyard.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/spiders/spider_kidnap.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "311.567780 -207.298904 -82.259613" + "PortraitAngles" "340.090027 146.430099 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "14.158791 -23.150000 345.279388" + "PortraitLightAngles" "54.789997 -151.152817 0.000000" + "PortraitLightFOV" "120.000000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "58 139 169" + "PortraitLightScale" "1.459000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.012 -0.740 0.672" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "3.763000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_oracle.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/spiders/spider_poison.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "440.821289 184.421082 118.411781" + "PortraitAngles" "7.690018 203.629974 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "202.699997 -23.150000 308.170013" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "120.000000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "254 248 242" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.000000 0.000000 0.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_graveyard.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/npc/npc_wisp/temple_wisp.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "362.306671 10.254235 206.463531" + "PortraitAngles" "19.290014 182.429947 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "202.699997 -23.150000 308.170013" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "120.000000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "254 248 242" + "PortraitLightScale" "3.295000" + "PortraitShadowColor" "78 237 255" + "PortraitShadowScale" "6.958000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.038 -0.217 -0.975" + "PortraitAmbientColor" "0 157 255" + "PortraitAmbientScale" "10.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.023529 0.690196 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.200000 0.733333 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_water.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/gameplay/journalpaper.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "86.001663 14.635841 48.204613" + "PortraitAngles" "19.690016 190.430115 0.000000" + "PortraitFOV" "10.256000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "1.805794 8.897464 53.885773" + "PortraitLightAngles" "64.053482 -178.772263 3.786871" + "PortraitLightFOV" "29.322001" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "217 216 216" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_courier_ground.vmat" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/npc/npc_folks/desert_folk001.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "218.308029 -58.210037 192.955902" + "PortraitAngles" "6.490023 166.030151 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "79.464294 -23.150000 269.867035" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "44.196999" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "254 248 242" + "PortraitLightScale" "4.150000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_desert.vmat" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/npc/npc_folks/desert_folk002.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "214.153183 -90.650284 144.909882" + "PortraitAngles" "356.490021 156.830261 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "79.464294 98.231102 269.867035" + "PortraitLightAngles" "54.789997 -122.334579 0.000000" + "PortraitLightFOV" "44.196999" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "254 248 242" + "PortraitLightScale" "4.348000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.210 -0.954 -0.214" + "PortraitAmbientColor" "250 162 39" + "PortraitAmbientScale" "2.575000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_desert.vmat" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/npc/npc_folks/desert_folk003.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "354.857513 -289.512756 211.193390" + "PortraitAngles" "6.090022 142.430252 0.000000" + "PortraitFOV" "7.675000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "79.464294 -23.150000 269.867035" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "44.196999" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "254 248 242" + "PortraitLightScale" "4.150000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.977 -0.022 -0.214" + "PortraitAmbientColor" "255 255 255" + "PortraitAmbientScale" "5.653000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_desert.vmat" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/npc/npc_folks/townsfolk.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "-24.529058 -159.713211 102.171181" + "PortraitAngles" "7.289993 111.229836 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "-111.232269 183.694397 205.360962" + "PortraitLightAngles" "48.574100 -125.365105 59.748795" + "PortraitLightFOV" "98.698997" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "253 176 100" + "PortraitLightScale" "6.121000" + "PortraitShadowColor" "48 48 48" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.955 -0.298 -0.007" + "PortraitAmbientColor" "32 138 251" + "PortraitAmbientScale" "2.260000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "0.313726 0.501961 0.878431" + "PortraitBackgroundColor3" "1.000000 0.768627 0.549020" + "PortraitBackgroundColor4" "0.211765 0.839216 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_forest_two.vmat" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + } + "models/npc/npc_bristlegrandpa/grandpa_bristleback.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "221.029953 -9.687691 146.264603" + "PortraitAngles" "14.490012 182.030014 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "128.886810 -23.150000 210.119583" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "120.000000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "245 204 163" + "PortraitLightScale" "4.411000" + "PortraitShadowColor" "149 162 160" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.739 -0.606 -0.294" + "PortraitAmbientColor" "226 156 116" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.411765 0.000000 0.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.780392 0.337255 0.082353" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_desert.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/centaurs/centaur_002.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "275.331360 -202.780762 129.922104" + "PortraitAngles" "344.089996 141.230057 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "202.699997 -23.150000 308.170013" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "120.000000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "255 220 185" + "PortraitLightScale" "5.662000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 0.662745 0.254902" + "PortraitBackgroundColor3" "1.000000 0.529412 0.117647" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_whiteexterior.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/centaurs/centaur_003_shaman.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "312.618408 223.865875 323.244019" + "PortraitAngles" "16.090017 217.230057 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "172.023727 -23.150000 449.994629" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "120.000000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "220 215 210" + "PortraitLightScale" "2.503000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.860 0.462 -0.214" + "PortraitAmbientColor" "255 223 149" + "PortraitAmbientScale" "2.341000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.262745 0.000000 0.000000" + "PortraitBackgroundColor2" "0.925490 0.847059 0.549020" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_white.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/centaurs/centaur_001.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "591.053650 -213.619522 99.479233" + "PortraitAngles" "352.490021 158.830002 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "202.699997 -23.150000 308.170013" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "120.000000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "254 248 242" + "PortraitLightScale" "3.097000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.231373 0.027451 0.027451" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.000000 0.000000 0.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_desert.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/heroes/siltbreaker/siltbreaker.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "167.864029 -106.971283 91.027992" + "PortraitAngles" "342.078979 145.227020 0.720001" + "PortraitFOV" "22.716000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "-129.156662 173.248566 318.490112" + "PortraitLightAngles" "52.406750 -66.741592 -15.414065" + "PortraitLightFOV" "56.930000" + "PortraitLightDistance" "404.019989" + "PortraitLightColor" "255 157 65" + "PortraitLightScale" "3.619000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "3.493000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.093 -0.991 -0.094" + "PortraitAmbientColor" "56 120 173" + "PortraitAmbientScale" "10.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.231373 0.027451 0.027451" + "PortraitBackgroundColor2" "0.164706 0.266667 0.309804" + "PortraitBackgroundColor3" "0.254902 0.541176 0.556863" + "PortraitBackgroundColor4" "0.000000 0.000000 0.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_bluebloom.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/tuskfolk/tuskfolk001a_f.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "369.171082 45.326221 177.126129" + "PortraitAngles" "7.690009 187.230118 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "140.898422 2.266296 296.776184" + "PortraitLightAngles" "54.789997 -166.331360 0.000000" + "PortraitLightFOV" "49.076000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "242 255 253" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "167 203 235" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "72 215 255" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_water.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/tuskfolk/tuskfolk001b_f.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "224.792770 -135.066467 276.588318" + "PortraitAngles" "29.290001 150.830124 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "140.898422 2.266296 296.776184" + "PortraitLightAngles" "54.789997 -166.331360 0.000000" + "PortraitLightFOV" "49.076000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "242 255 253" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "167 203 235" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "72 215 255" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_water.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/tuskfolk/tuskfolk001c_f.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "281.950043 -75.401611 217.701248" + "PortraitAngles" "18.089998 166.830170 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "140.898422 2.266296 296.776184" + "PortraitLightAngles" "54.789997 -166.331360 0.000000" + "PortraitLightFOV" "49.076000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "242 255 253" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "167 203 235" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "72 215 255" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_whiteexteriornight.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/gameplay/wardenpaper.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "86.001663 14.635841 48.204613" + "PortraitAngles" "19.690016 190.430115 0.000000" + "PortraitFOV" "10.256000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "1.805794 8.897464 53.885773" + "PortraitLightAngles" "64.053482 -178.772263 3.786871" + "PortraitLightFOV" "29.322001" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "217 216 216" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.274510 0.913725 1.000000" + "PortraitBackgroundColor2" "0.274510 0.913725 1.000000" + "PortraitBackgroundColor3" "0.274510 0.913725 1.000000" + "PortraitBackgroundColor4" "0.274510 0.913725 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_purple.vmat" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/darkreef/gaoler/darkreef_gaoler.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "522.468567 112.990021 325.938782" + "PortraitAngles" "15.690003 194.030075 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "140.898422 34.019657 387.350006" + "PortraitLightAngles" "54.789997 -166.331360 0.000000" + "PortraitLightFOV" "49.076000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "255 210 155" + "PortraitLightScale" "1.648000" + "PortraitShadowColor" "167 203 235" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "72 215 255" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 0.454902 0.090196" + "PortraitBackgroundColor2" "0.341176 1.000000 0.694118" + "PortraitBackgroundColor3" "0.341176 1.000000 0.694118" + "PortraitBackgroundColor4" "1.000000 0.454902 0.090196" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_water.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/darkreef/blob/darkreef_blob_01.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "100.056023 441.802124 181.071396" + "PortraitAngles" "12.090031 256.829956 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "140.898422 34.019657 387.350006" + "PortraitLightAngles" "54.789997 -166.331360 0.000000" + "PortraitLightFOV" "49.076000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "35 120 48" + "PortraitLightScale" "3.295000" + "PortraitShadowColor" "167 203 235" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "72 215 255" + "PortraitAmbientScale" "2.728000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.678431 1.000000 0.184314" + "PortraitBackgroundColor2" "0.341176 1.000000 0.694118" + "PortraitBackgroundColor3" "0.341176 1.000000 0.694118" + "PortraitBackgroundColor4" "0.678431 1.000000 0.184314" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_whiteexteriornight.vmat" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/darkreef/blob/darkreef_blob_02_small.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "589.451294 340.209564 109.183395" + "PortraitAngles" "0.490028 210.430115 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "140.898422 34.019657 387.350006" + "PortraitLightAngles" "54.789997 -166.331360 0.000000" + "PortraitLightFOV" "49.076000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "35 120 48" + "PortraitLightScale" "3.295000" + "PortraitShadowColor" "167 203 235" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "72 215 255" + "PortraitAmbientScale" "2.728000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "0.341176 1.000000 0.694118" + "PortraitBackgroundColor3" "0.341176 1.000000 0.694118" + "PortraitBackgroundColor4" "0.000000 0.000000 0.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_whiteexteriornight.vmat" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/darkreef/meranth_guard/meranth_guard.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "160.342834 -54.270111 244.286865" + "PortraitAngles" "31.483950 163.251785 -17.639999" + "PortraitFOV" "24.763000" + "PortraitFar" "994.000000" + } + } + "PortraitLightPosition" "66.208466 -33.883713 262.190643" + "PortraitLightAngles" "59.593109 172.040665 105.739372" + "PortraitLightFOV" "49.790001" + "PortraitLightDistance" "268.700012" + "PortraitLightColor" "151 192 243" + "PortraitLightScale" "2.305000" + "PortraitShadowColor" "35 55 0" + "PortraitShadowScale" "5.221000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-9.384 144.695 -43.888" + "PortraitAmbientColor" "30 182 183" + "PortraitAmbientScale" "5.734000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.149020 0.117647 0.117647" + "PortraitBackgroundColor2" "0.000000 0.498039 1.000000" + "PortraitBackgroundColor3" "0.000000 1.000000 0.815686" + "PortraitBackgroundColor4" "0.000000 0.133333 0.239216" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_bluebloom.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/darkreef/prisoner_swoledar/prisoner_swoledar.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "258.820313 -39.034023 186.384750" + "PortraitAngles" "10.683962 172.851608 5.039993" + "PortraitFOV" "24.763000" + "PortraitFar" "994.000000" + } + } + "PortraitLightPosition" "66.208466 -33.883713 262.190643" + "PortraitLightAngles" "59.593109 172.040665 105.739372" + "PortraitLightFOV" "49.790001" + "PortraitLightDistance" "268.700012" + "PortraitLightColor" "116 116 116" + "PortraitLightScale" "2.305000" + "PortraitShadowColor" "35 55 0" + "PortraitShadowScale" "5.221000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-9.384 144.695 -43.888" + "PortraitAmbientColor" "131 117 106" + "PortraitAmbientScale" "1.234000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.149020 0.117647 0.117647" + "PortraitBackgroundColor2" "0.000000 0.498039 1.000000" + "PortraitBackgroundColor3" "0.000000 0.764706 1.000000" + "PortraitBackgroundColor4" "0.000000 0.133333 0.239216" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_bluebloom.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/darkreef/prisoner_swoledar/prisoner_swoledar02.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "254.748489 -97.658119 170.065262" + "PortraitAngles" "7.883964 158.851761 5.039993" + "PortraitFOV" "24.763000" + "PortraitFar" "994.000000" + } + } + "PortraitLightPosition" "66.208466 -33.883713 262.190643" + "PortraitLightAngles" "59.593109 172.040665 105.739372" + "PortraitLightFOV" "49.790001" + "PortraitLightDistance" "268.700012" + "PortraitLightColor" "116 116 116" + "PortraitLightScale" "2.305000" + "PortraitShadowColor" "35 55 0" + "PortraitShadowScale" "5.221000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-9.384 144.695 -43.888" + "PortraitAmbientColor" "131 117 106" + "PortraitAmbientScale" "1.234000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.149020 0.117647 0.117647" + "PortraitBackgroundColor2" "0.000000 0.498039 1.000000" + "PortraitBackgroundColor3" "0.000000 0.764706 1.000000" + "PortraitBackgroundColor4" "0.000000 0.133333 0.239216" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_brokenlight.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/darkreef/prisoner_swoledar/prisoner_swoledar03.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "366.905670 5.333752 148.083664" + "PortraitAngles" "4.283964 180.851532 5.039993" + "PortraitFOV" "24.763000" + "PortraitFar" "994.000000" + } + } + "PortraitLightPosition" "66.208466 -33.883713 262.190643" + "PortraitLightAngles" "59.593109 172.040665 105.739372" + "PortraitLightFOV" "49.790001" + "PortraitLightDistance" "268.700012" + "PortraitLightColor" "116 116 116" + "PortraitLightScale" "2.305000" + "PortraitShadowColor" "35 55 0" + "PortraitShadowScale" "5.221000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-9.384 144.695 -43.888" + "PortraitAmbientColor" "198 102 102" + "PortraitAmbientScale" "1.234000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.149020 0.117647 0.117647" + "PortraitBackgroundColor2" "1.000000 0.000000 0.031373" + "PortraitBackgroundColor3" "0.913725 0.000000 1.000000" + "PortraitBackgroundColor4" "0.000000 0.133333 0.239216" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_bluebloom.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/darkreef/prisoner_swoledar/prisoner_swoledar04.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "211.065170 222.482635 175.869308" + "PortraitAngles" "9.883963 227.651489 5.039993" + "PortraitFOV" "24.763000" + "PortraitFar" "994.000000" + } + } + "PortraitLightPosition" "66.208466 -33.883713 262.190643" + "PortraitLightAngles" "59.593109 172.040665 105.739372" + "PortraitLightFOV" "49.790001" + "PortraitLightDistance" "268.700012" + "PortraitLightColor" "116 116 116" + "PortraitLightScale" "2.305000" + "PortraitShadowColor" "35 55 0" + "PortraitShadowScale" "5.221000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-9.384 144.695 -43.888" + "PortraitAmbientColor" "131 117 106" + "PortraitAmbientScale" "1.234000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.149020 0.117647 0.117647" + "PortraitBackgroundColor2" "0.000000 0.498039 1.000000" + "PortraitBackgroundColor3" "0.000000 0.764706 1.000000" + "PortraitBackgroundColor4" "0.000000 0.133333 0.239216" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_bluebloom.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/forest_bear/forest_bear.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "601.071899 -234.016907 106.335442" + "PortraitAngles" "1.190000 157.750061 0.000000" + "PortraitFOV" "15.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "202.699997 -23.150000 308.170013" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "69.000000" + "PortraitLightDistance" "377.000000" + "PortraitLightColor" "254 249 240" + "PortraitLightScale" "2.850000" + "PortraitShadowColor" "239 167 167" + "PortraitShadowScale" "5.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "0.300000 0.300000 0.300000" + "PortraitBackgroundColor3" "0.700000 0.700000 0.700000" + "PortraitBackgroundColor4" "0.300000 0.300000 0.300000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_forest.vmat" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/diregull/diregull.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "459.369995 -76.199997 142.399994" + "PortraitAngles" "9.190000 169.750000 0.000000" + "PortraitFOV" "15.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "202.699997 -23.150000 308.170013" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "69.000000" + "PortraitLightDistance" "377.000000" + "PortraitLightColor" "221 255 252" + "PortraitLightScale" "1.585000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.129412 0.317647 0.023529" + "PortraitBackgroundColor2" "0.300008 0.300008 0.300008" + "PortraitBackgroundColor3" "0.709804 0.933333 0.874510" + "PortraitBackgroundColor4" "0.300008 0.300008 0.300008" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_whiteexterior.vmat" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/darkreef/prisoner_crab/darkreef_prisoner_crab.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "349.377197 -114.488297 332.253479" + "PortraitAngles" "38.090019 159.630371 5.039993" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "58.985580 -23.150000 292.959351" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "120.000000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "217 167 247" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.555 -0.810 -0.187" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_purple.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/frostbitten/n_creep_frostbitten_shaman01.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "649.956177 126.472054 318.315338" + "PortraitAngles" "17.589989 193.349854 0.000000" + "PortraitFOV" "15.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "202.699997 -23.150000 308.170013" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "69.000000" + "PortraitLightDistance" "377.000000" + "PortraitLightColor" "179 199 221" + "PortraitLightScale" "2.850000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.300008 0.300008 0.300008" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_bluebloom.vmat" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/frostbitten/n_creep_frostbitten_swollen01.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "352.023315 83.781914 244.603638" + "PortraitAngles" "17.589987 193.349854 0.000000" + "PortraitFOV" "15.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "202.699997 -23.150000 308.170013" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "69.000000" + "PortraitLightDistance" "377.000000" + "PortraitLightColor" "179 199 221" + "PortraitLightScale" "2.850000" + "PortraitShadowColor" "27 22 22" + "PortraitShadowScale" "1.756000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.515 0.830 -0.214" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "4.465000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.300008 0.300008 0.300008" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_bluebloom.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/giant/ice_giant01.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "705.156006 -134.714417 -138.242218" + "PortraitAngles" "340.389984 169.750000 0.000000" + "PortraitFOV" "12.837000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "202.699997 -23.150000 308.170013" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "64.665001" + "PortraitLightDistance" "336.359985" + "PortraitLightColor" "202 202 202" + "PortraitLightScale" "2.850000" + "PortraitShadowColor" "45 31 31" + "PortraitShadowScale" "5.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.000000 0.498039 0.835294" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_bluesky_gyro.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/ogreseal/ogreseal.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "291.250702 199.080109 345.397705" + "PortraitAngles" "20.789995 221.350098 0.000000" + "PortraitFOV" "24.229000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "167.996323 -26.108185 421.442078" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "69.000000" + "PortraitLightDistance" "377.000000" + "PortraitLightColor" "179 199 221" + "PortraitLightScale" "2.850000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.300008 0.300008 0.300008" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_bluebloom.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/ogreseal/ogreseal_undead.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "291.250702 199.080109 345.397705" + "PortraitAngles" "20.789995 221.350098 0.000000" + "PortraitFOV" "24.229000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "167.996323 -26.108185 421.442078" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "69.000000" + "PortraitLightDistance" "377.000000" + "PortraitLightColor" "179 199 221" + "PortraitLightScale" "2.850000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "0.000000 1.000000 0.600000" + "PortraitBackgroundColor3" "0.980392 0.380392 0.858824" + "PortraitBackgroundColor4" "0.300008 0.300008 0.300008" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_bluebloom.vmat" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/penguin/penguin.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "67.086113 51.671745 81.598038" + "PortraitAngles" "20.789993 221.350098 0.000000" + "PortraitFOV" "24.229000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "167.996323 -26.108185 421.442078" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "69.000000" + "PortraitLightDistance" "377.000000" + "PortraitLightColor" "179 199 221" + "PortraitLightScale" "2.850000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.300008 0.300008 0.300008" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_coolinterior.vmat" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/relict/relict.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "258.925323 -169.467941 57.042080" + "PortraitAngles" "349.190002 143.350067 0.000000" + "PortraitFOV" "24.229000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "167.996323 -26.108185 421.442078" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "69.000000" + "PortraitLightDistance" "377.000000" + "PortraitLightColor" "179 199 221" + "PortraitLightScale" "2.850000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.300008 0.300008 0.300008" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_slark.vmat" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/storegga/storegga.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "252.929169 219.337494 161.700378" + "PortraitAngles" "5.590010 222.149918 0.000000" + "PortraitFOV" "24.229000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "167.996323 -26.108185 421.442078" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "69.000000" + "PortraitLightDistance" "377.000000" + "PortraitLightColor" "179 199 221" + "PortraitLightScale" "2.850000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.904 0.371 -0.214" + "PortraitAmbientColor" "3 93 167" + "PortraitAmbientScale" "6.202000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.300008 0.300008 0.300008" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_underwater.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/undeadtusk/undead_tuskskeleton01.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "410.226532 79.388649 200.932877" + "PortraitAngles" "13.690006 189.630371 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "140.898422 2.266296 296.776184" + "PortraitLightAngles" "54.789997 -166.331360 0.000000" + "PortraitLightFOV" "49.076000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "242 255 253" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "167 203 235" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "72 215 255" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.388235 0.388235 0.388235" + "PortraitBackgroundColor2" "0.388235 0.388235 0.388235" + "PortraitBackgroundColor3" "0.388235 0.388235 0.388235" + "PortraitBackgroundColor4" "0.388235 0.388235 0.388235" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_whiteexteriornight.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/undeadtusk/undead_tuskskeleton02.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "158.483231 370.042816 196.657455" + "PortraitAngles" "14.090014 246.430573 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "140.898422 2.266296 296.776184" + "PortraitLightAngles" "54.789997 -166.331360 0.000000" + "PortraitLightFOV" "49.076000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "242 255 253" + "PortraitLightScale" "1.000000" + "PortraitShadowColor" "167 203 235" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "72 215 255" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.388235 0.388235 0.388235" + "PortraitBackgroundColor2" "0.388235 0.388235 0.388235" + "PortraitBackgroundColor3" "0.388235 0.388235 0.388235" + "PortraitBackgroundColor4" "0.388235 0.388235 0.388235" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_whiteexteriornight.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/undeadtusk/undead_tuskskeleton_armor01.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "342.096802 -322.455048 35.410965" + "PortraitAngles" "352.890015 136.830353 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "140.898422 2.266296 296.776184" + "PortraitLightAngles" "54.789997 -166.331360 0.000000" + "PortraitLightFOV" "49.076000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "242 255 253" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "167 203 235" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "72 215 255" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.388235 0.388235 0.388235" + "PortraitBackgroundColor2" "0.388235 0.388235 0.388235" + "PortraitBackgroundColor3" "0.388235 0.388235 0.388235" + "PortraitBackgroundColor4" "0.388235 0.388235 0.388235" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_whiteexteriornight.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_biome/yak/yakyok.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "348.165314 199.353378 106.218689" + "PortraitAngles" "5.290011 210.830490 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "140.898422 2.266296 296.776184" + "PortraitLightAngles" "54.789997 -166.331360 0.000000" + "PortraitLightFOV" "49.076000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "242 255 253" + "PortraitLightScale" "3.817000" + "PortraitShadowColor" "167 203 235" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.914 0.344 -0.214" + "PortraitAmbientColor" "71 181 255" + "PortraitAmbientScale" "6.445000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.000000 0.000000 0.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_whiteexteriornight.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/creeps/ice_boss/ice_boss_egg.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "-57.487949 212.053238 34.660862" + "PortraitAngles" "359.690002 285.230225 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "140.898422 2.266296 296.776184" + "PortraitLightAngles" "54.789997 -166.331360 0.000000" + "PortraitLightFOV" "49.076000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "242 255 253" + "PortraitLightScale" "3.160000" + "PortraitShadowColor" "115 177 232" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.914 0.344 -0.214" + "PortraitAmbientColor" "34 125 187" + "PortraitAmbientScale" "6.445000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.000000 0.000000 0.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_underwater.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/npc/npc_folks/chef_folk001.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "215.757019 -15.945593 71.186996" + "PortraitAngles" "334.090027 172.830414 11.160004" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "202.699997 -23.150000 233.000000" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "120.000000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "223 226 255" + "PortraitLightScale" "5.527000" + "PortraitShadowColor" "20 19 19" + "PortraitShadowScale" "1.864000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-0.976 0.193 -0.096" + "PortraitAmbientColor" "46 143 196" + "PortraitAmbientScale" "4.393000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_purple.vmat" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/props_structures/aghanim_outpost.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "483.367493 37.716194 812.176086" + "PortraitAngles" "37.690010 184.430054 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "279.904907 -133.021133 721.532715" + "PortraitLightAngles" "54.790001 139.855438 0.000000" + "PortraitLightFOV" "120.000000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "254 248 242" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "1.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "1.000000 1.000000 1.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_gradient_top.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitPlayIdleExpression" "0" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } + "models/heroes/aghanim/aghanim_model.vmdl" + { + "cameras" + { + "Default" + { + "PortraitPosition" "363.305603 -0.790975 278.112701" + "PortraitAngles" "350.352570 179.537857 0.000000" + "PortraitFOV" "16.000000" + "PortraitFar" "1000.000000" + } + } + "PortraitLightPosition" "202.699997 -23.150000 308.170013" + "PortraitLightAngles" "54.790001 171.699997 0.000000" + "PortraitLightFOV" "120.000000" + "PortraitLightDistance" "336.000000" + "PortraitLightColor" "254 248 242" + "PortraitLightScale" "2.000000" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "10.000000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "1.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitSpecularDirection" "0.000000 0.000000 -1.000000" + "PortraitSpecularPower" "16.000000" + "PortraitBackgroundColor1" "0.000000 0.000000 0.000000" + "PortraitBackgroundColor2" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor3" "1.000000 1.000000 1.000000" + "PortraitBackgroundColor4" "0.000000 0.000000 0.000000" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_laboratory.vmat" + "PortraitAnimationActivity" "ACT_DOTA_CAPTURE" + "PortraitAnimationCycle" "0.000000" + "PortraitAnimationRate" "1.000000" + "PortraitPlayIdleExpression" "0" + "PortraitHideHero" "0" + "PortraitHideParticles" "0" + "PortraitHideDropShadow" "0" + "PortraitDesaturateParticles" "0" + "PortraitDesaturateHero" "1" + } +} diff --git a/aghanim_singleplayer/scripts/shops.txt b/aghanim_singleplayer/scripts/shops.txt new file mode 100755 index 0000000..b1b022e --- /dev/null +++ b/aghanim_singleplayer/scripts/shops.txt @@ -0,0 +1,282 @@ +"dota_shops" +{ + "consumables" + { + "item" "item_tpscroll" + "item" "item_clarity" + "item" "item_greater_clarity" + "item" "item_faerie_fire" + "item" "item_smoke_of_deceit" + "item" "item_ward_observer" + "item" "item_ward_sentry" + "item" "item_enchanted_mango" + "item" "item_flask" + "item" "item_greater_salve" + "item" "item_tango" + "item" "item_tome_of_knowledge" + "item" "item_dust" + "item" "item_bottle" + } + + "attributes" + { + "item" "item_branches" + + "item" "item_gauntlets" + "item" "item_slippers" + "item" "item_mantle" + + "item" "item_circlet" + + "item" "item_belt_of_strength" + "item" "item_boots_of_elves" + "item" "item_robe" + + "item" "item_crown" + + "item" "item_ogre_axe" + "item" "item_blade_of_alacrity" + "item" "item_staff_of_wizardry" + "item" "item_river_painter7" + "item" "item_river_painter6" + "item" "item_river_painter5" + "item" "item_river_painter4" + "item" "item_river_painter3" + "item" "item_river_painter2" + "item" "item_river_painter" + } + + "weapons_armor" + { + "item" "item_ring_of_protection" + "item" "item_stout_shield" + "item" "item_quelling_blade" + "item" "item_infused_raindrop" + "item" "item_orb_of_venom" + "item" "item_blight_stone" + "item" "item_blades_of_attack" + "item" "item_chainmail" + "item" "item_quarterstaff" + "item" "item_helm_of_iron_will" + "item" "item_broadsword" + "item" "item_javelin" + "item" "item_claymore" + "item" "item_mithril_hammer" + } + + "misc" + { + "item" "item_magic_stick" + "item" "item_wind_lace" + "item" "item_ring_of_regen" + "item" "item_sobi_mask" + "item" "item_boots" + "item" "item_gloves" + "item" "item_cloak" + "item" "item_ring_of_tarrasque" + "item" "item_gem" + "item" "item_lifesteal" + "item" "item_shadow_amulet" + "item" "item_ghost" + "item" "item_blink" + } + + // Level 1 - Green Recipes + "basics" + { + "item" "item_magic_wand" + "item" "item_null_talisman" + "item" "item_wraith_band" + "item" "item_bracer" + "item" "item_soul_ring" + "item" "item_power_treads" + "item" "item_phase_boots" + "item" "item_oblivion_staff" + "item" "item_pers" + "item" "item_mask_of_madness" + "item" "item_helm_of_the_dominator" + "item" "item_hand_of_midas" + "item" "item_travel_boots" + "item" "item_moon_shard" + } + + // Level 2 - Blue Recipes + "support" + { + "item" "item_ring_of_basilius" + "item" "item_headdress" + "item" "item_buckler" + "item" "item_urn_of_shadows" + "item" "item_tranquil_boots" + "item" "item_medallion_of_courage" + "item" "item_arcane_boots" + "item" "item_ancient_janggo" + "item" "item_vladmir" + "item" "item_mekansm" + "item" "item_holy_locket" + "item" "item_spirit_vessel" + "item" "item_pipe" + "item" "item_guardian_greaves" + } + + "magics" + { + "item" "item_glimmer_cape" + "item" "item_veil_of_discord" + "item" "item_force_staff" + "item" "item_aether_lens" + "item" "item_necronomicon" + "item" "item_dagon" + "item" "item_cyclone" + "item" "item_rod_of_atos" + "item" "item_solar_crest" + "item" "item_orchid" + "item" "item_ultimate_scepter" + "item" "item_nullifier" + "item" "item_refresher" + "item" "item_sheepstick" + "item" "item_octarine_core" + } + + // Level 3 - Purple Recipes + "defense" + { + "item" "item_hood_of_defiance" + "item" "item_vanguard" + "item" "item_blade_mail" + "item" "item_soul_booster" + "item" "item_aeon_disk" + "item" "item_crimson_guard" + "item" "item_lotus_orb" + "item" "item_black_king_bar" + "item" "item_hurricane_pike" + "item" "item_shivas_guard" + "item" "item_manta" + "item" "item_bloodstone" + "item" "item_sphere" + "item" "item_heart" + "item" "item_assault" + } + + "weapons" + { + "item" "item_lesser_crit" + "item" "item_armlet" + "item" "item_meteor_hammer" + "item" "item_invis_sword" + "item" "item_basher" + "item" "item_monkey_king_bar" + "item" "item_bfury" + "item" "item_ethereal_blade" + "item" "item_radiance" + "item" "item_greater_crit" + "item" "item_butterfly" + "item" "item_silver_edge" + "item" "item_rapier" + "item" "item_abyssal_blade" + "item" "item_bloodthorn" + } + + // Level 4 - Orange / Orb / Artifacts + "artifacts" + { + "item" "item_dragon_lance" + "item" "item_sange" + "item" "item_yasha" + "item" "item_kaya" + "item" "item_echo_sabre" + "item" "item_maelstrom" + "item" "item_diffusal_blade" + "item" "item_heavens_halberd" + "item" "item_desolator" + "item" "item_kaya_and_sange" + "item" "item_sange_and_yasha" + "item" "item_yasha_and_kaya" + "item" "item_satanic" + "item" "item_skadi" + "item" "item_mjollnir" + } + + "sideshop1" + { + "item" "item_tpscroll" + "item" "item_magic_stick" + "item" "item_quelling_blade" + "item" "item_boots" + "item" "item_boots_of_elves" + "item" "item_belt_of_strength" + "item" "item_robe" + "item" "item_crown" + } + + "sideshop2" + { + "item" "item_gloves" + "item" "item_chainmail" + "item" "item_cloak" + "item" "item_void_stone" + "item" "item_helm_of_iron_will" + "item" "item_energy_booster" + "item" "item_vitality_booster" + "item" "item_lifesteal" + "item" "item_broadsword" + "item" "item_blink" + } + + "secretshop" + { + "item" "item_ring_of_health" + "item" "item_void_stone" + "item" "item_energy_booster" + "item" "item_vitality_booster" + "item" "item_point_booster" + "item" "item_platemail" + "item" "item_talisman_of_evasion" + "item" "item_hyperstone" + "item" "item_ultimate_orb" + "item" "item_demon_edge" + "item" "item_mystic_staff" + "item" "item_reaver" + "item" "item_eagle" + "item" "item_relic" + } + + "pregame" + { + "item" "item_clarity" + "item" "item_faerie_fire" + "item" "item_enchanted_mango" + "item" "item_tango" + "item" "item_flask" + "item" "item_smoke_of_deceit" + "item" "item_dust" + "item" "item_courier" + "item" "item_ward_observer" + "item" "item_ward_sentry" + "item" "item_branches" + "item" "item_gauntlets" + "item" "item_slippers" + "item" "item_mantle" + "item" "item_circlet" + "item" "item_recipe_magic_wand" + "item" "item_ring_of_protection" + "item" "item_stout_shield" + "item" "item_quelling_blade" + "item" "item_blight_stone" + "item" "item_orb_of_venom" + "item" "item_wind_lace" + "item" "item_magic_stick" + "item" "item_sobi_mask" + "item" "item_ring_of_regen" + "item" "item_boots" + "item" "item_gloves" + "item" "item_crown" + "item" "item_wraith_band" + "item" "item_null_talisman" + "item" "item_bracer" + "item" "item_blades_of_attack" + "item" "item_ring_of_basilius" + "item" "item_buckler" + "item" "item_headdress" + } +} \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/shops/main_shops.txt b/aghanim_singleplayer/scripts/shops/main_shops.txt new file mode 100755 index 0000000..2d4b65c --- /dev/null +++ b/aghanim_singleplayer/scripts/shops/main_shops.txt @@ -0,0 +1,289 @@ +"dota_shops" +{ + "custom" + { + "boss_shop" + { + "1" + { + "item" "item_life_rune" + "item" "item_small_scepter_fragment" + "item" "item_book_of_strength" + "item" "item_book_of_agility" + "item" "item_book_of_intelligence" + "item" "item_purification_potion" + "item" "item_ravage_potion" + "item" "item_echo_slam_potion" + "item" "item_arcanist_potion" + "item" "item_dragon_potion" + } + "2" + { + + } + } + } + + + "attributes" + { + "item" "item_branches" + + "item" "item_gauntlets" + "item" "item_slippers" + "item" "item_mantle" + + "item" "item_circlet" + + "item" "item_belt_of_strength" + "item" "item_boots_of_elves" + "item" "item_robe" + + "item" "item_crown" + + "item" "item_ogre_axe" + "item" "item_blade_of_alacrity" + "item" "item_staff_of_wizardry" + "item" "item_river_painter7" + "item" "item_river_painter6" + "item" "item_river_painter5" + "item" "item_river_painter4" + "item" "item_river_painter3" + "item" "item_river_painter2" + "item" "item_river_painter" + } + + "weapons_armor" + { + "item" "item_ring_of_protection" + "item" "item_stout_shield" + "item" "item_quelling_blade" + "item" "item_infused_raindrop" + "item" "item_orb_of_venom" + "item" "item_blight_stone" + "item" "item_blades_of_attack" + "item" "item_chainmail" + "item" "item_quarterstaff" + "item" "item_helm_of_iron_will" + "item" "item_broadsword" + "item" "item_javelin" + "item" "item_claymore" + "item" "item_mithril_hammer" + } + + "misc" + { + "item" "item_magic_stick" + "item" "item_wind_lace" + "item" "item_ring_of_regen" + "item" "item_sobi_mask" + "item" "item_boots" + "item" "item_gloves" + "item" "item_cloak" + "item" "item_ring_of_tarrasque" + "item" "item_gem" + "item" "item_lifesteal" + "item" "item_shadow_amulet" + "item" "item_ghost" + "item" "item_blink" + } + + // Level 1 - Green Recipes + "basics" + { + "item" "item_magic_wand" + "item" "item_null_talisman" + "item" "item_wraith_band" + "item" "item_bracer" + "item" "item_soul_ring" + "item" "item_power_treads" + "item" "item_phase_boots" + "item" "item_oblivion_staff" + "item" "item_pers" + "item" "item_mask_of_madness" + "item" "item_helm_of_the_dominator" + "item" "item_hand_of_midas" + "item" "item_travel_boots" + "item" "item_moon_shard" + } + + // Level 2 - Blue Recipes + "support" + { + "item" "item_ring_of_basilius" + "item" "item_headdress" + "item" "item_buckler" + "item" "item_urn_of_shadows" + "item" "item_tranquil_boots" + "item" "item_medallion_of_courage" + "item" "item_arcane_boots" + "item" "item_ancient_janggo" + "item" "item_vladmir" + "item" "item_mekansm" + "item" "item_holy_locket" + "item" "item_spirit_vessel" + "item" "item_pipe" + "item" "item_guardian_greaves" + } + + "magics" + { + "item" "item_glimmer_cape" + "item" "item_veil_of_discord" + "item" "item_force_staff" + "item" "item_aether_lens" + "item" "item_necronomicon" + "item" "item_dagon" + "item" "item_cyclone" + "item" "item_rod_of_atos" + "item" "item_solar_crest" + "item" "item_orchid" + "item" "item_ultimate_scepter" + "item" "item_nullifier" + "item" "item_refresher" + "item" "item_sheepstick" + "item" "item_octarine_core" + } + + // Level 3 - Purple Recipes + "defense" + { + "item" "item_hood_of_defiance" + "item" "item_vanguard" + "item" "item_blade_mail" + "item" "item_soul_booster" + "item" "item_aeon_disk" + "item" "item_crimson_guard" + "item" "item_lotus_orb" + "item" "item_black_king_bar" + "item" "item_hurricane_pike" + "item" "item_shivas_guard" + "item" "item_manta" + "item" "item_bloodstone" + "item" "item_sphere" + "item" "item_heart" + "item" "item_assault" + } + + "weapons" + { + "item" "item_lesser_crit" + "item" "item_armlet" + "item" "item_meteor_hammer" + "item" "item_invis_sword" + "item" "item_basher" + "item" "item_monkey_king_bar" + "item" "item_bfury" + "item" "item_ethereal_blade" + "item" "item_radiance" + "item" "item_greater_crit" + "item" "item_butterfly" + "item" "item_silver_edge" + "item" "item_rapier" + "item" "item_abyssal_blade" + "item" "item_bloodthorn" + } + + // Level 4 - Orange / Orb / Artifacts + "artifacts" + { + "item" "item_dragon_lance" + "item" "item_sange" + "item" "item_yasha" + "item" "item_kaya" + "item" "item_echo_sabre" + "item" "item_maelstrom" + "item" "item_diffusal_blade" + "item" "item_heavens_halberd" + "item" "item_desolator" + "item" "item_kaya_and_sange" + "item" "item_sange_and_yasha" + "item" "item_yasha_and_kaya" + "item" "item_satanic" + "item" "item_skadi" + "item" "item_mjollnir" + } + + "sideshop1" + { + "item" "item_tpscroll" + "item" "item_magic_stick" + "item" "item_quelling_blade" + "item" "item_boots" + "item" "item_boots_of_elves" + "item" "item_belt_of_strength" + "item" "item_robe" + "item" "item_crown" + } + + "sideshop2" + { + "item" "item_gloves" + "item" "item_chainmail" + "item" "item_cloak" + "item" "item_void_stone" + "item" "item_helm_of_iron_will" + "item" "item_energy_booster" + "item" "item_vitality_booster" + "item" "item_lifesteal" + "item" "item_broadsword" + "item" "item_blink" + } + + "secretshop" + { + "item" "item_ring_of_health" + "item" "item_void_stone" + "item" "item_energy_booster" + "item" "item_vitality_booster" + "item" "item_point_booster" + "item" "item_platemail" + "item" "item_talisman_of_evasion" + "item" "item_hyperstone" + "item" "item_ultimate_orb" + "item" "item_demon_edge" + "item" "item_mystic_staff" + "item" "item_reaver" + "item" "item_eagle" + "item" "item_relic" + } + + "pregame" + { + "item" "item_clarity" + "item" "item_faerie_fire" + "item" "item_enchanted_mango" + "item" "item_tango" + "item" "item_flask" + "item" "item_smoke_of_deceit" + "item" "item_dust" + "item" "item_courier" + "item" "item_ward_observer" + "item" "item_ward_sentry" + "item" "item_branches" + "item" "item_gauntlets" + "item" "item_slippers" + "item" "item_mantle" + "item" "item_circlet" + "item" "item_recipe_magic_wand" + "item" "item_ring_of_protection" + "item" "item_stout_shield" + "item" "item_quelling_blade" + "item" "item_blight_stone" + "item" "item_orb_of_venom" + "item" "item_wind_lace" + "item" "item_magic_stick" + "item" "item_sobi_mask" + "item" "item_ring_of_regen" + "item" "item_boots" + "item" "item_gloves" + "item" "item_crown" + "item" "item_wraith_band" + "item" "item_null_talisman" + "item" "item_bracer" + "item" "item_blades_of_attack" + "item" "item_ring_of_basilius" + "item" "item_buckler" + "item" "item_headdress" + } +} \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/soundscapes_aghanim.txt b/aghanim_singleplayer/scripts/soundscapes_aghanim.txt new file mode 100755 index 0000000..3f70830 --- /dev/null +++ b/aghanim_singleplayer/scripts/soundscapes_aghanim.txt @@ -0,0 +1,27 @@ + +//default +"default_aghanim" +{ + "dsp" "0" + "fadetime" "3" + "Soundmixer" "Aghanim_Mix" + + "playlooping" + { + "volume" ".4" + "pitch" "100" + "wave" "sounds/ambient/soundscapes/temple_lp.vsnd" + } + "playrandom" + { + "volume" "0.4, 0.6" + "pitch" "95, 105" + "time" "18, 24" + "position" "random" + "rndwave" + { + "wave" "sounds/ambient/soundscapes/temple_drone.vsnd" + "wave" "sounds/ambient/soundscapes/deathmaze_drone.vsnd" + } + } +} diff --git a/aghanim_singleplayer/scripts/soundscapes_manifest.txt b/aghanim_singleplayer/scripts/soundscapes_manifest.txt new file mode 100755 index 0000000..40533db --- /dev/null +++ b/aghanim_singleplayer/scripts/soundscapes_manifest.txt @@ -0,0 +1,8 @@ +soundscapes_manifest +{ + // List additional soundscape files here + + "file" "scripts/soundscapes_aghanim.txt" + "file" "scripts/soundscapes_dota.txt" +} + diff --git a/aghanim_singleplayer/scripts/talker/response_rules_aghanim.txt b/aghanim_singleplayer/scripts/talker/response_rules_aghanim.txt new file mode 100755 index 0000000..9d46022 --- /dev/null +++ b/aghanim_singleplayer/scripts/talker/response_rules_aghanim.txt @@ -0,0 +1,222 @@ +criterion "Isaghanim" "classname" "npc_dota_boss_aghanim" weight 5 required +criterion "IsEnemyaghanim" "targetclassname" "npc_dota_boss_aghanim" weight 5 required +criterion "IsAllyaghanim" "nearby_ally" "npc_dota_boss_aghanim" weight 5 required +criterion "IsBossIntro" "announce_event" "boss_intro" weight 5 required +criterion "IsBested" "announce_event" "bested" weight 5 required +criterion "IsLaugh" "announce_event" "laugh" weight 5 required +criterion "IsAbilityUse" "announce_event" "ability_use" weight 5 required +criterion "IsCrystalAttack" "ability_name" "aghanim_crystal_attack" weight 5 required +criterion "IsStaffBeams" "ability_name" "aghanim_staff_beams" weight 5 required +criterion "IsBlink" "ability_name" "aghanim_blink" weight 5 required +criterion "IsSummonPortals" "ability_name" "aghanim_summon_portals" weight 5 required +criterion "IsSpellSwap" "ability_name" "aghanim_spell_swap" weight 5 required +criterion "IsShardAttack" "ability_name" "aghanim_shard_attack" weight 5 required + +Response aghanim_CustomIsBossIntro +{ + scene "scenes/aghanim/aghanim_aghs_battle_intro_01.vcd" nodelay noscene + scene "scenes/aghanim/aghanim_aghs_battle_intro_03.vcd" nodelay noscene + scene "scenes/aghanim/aghanim_aghs_battle_intro_04.vcd" nodelay noscene + scene "scenes/aghanim/aghanim_aghs_battle_intro_05.vcd" nodelay noscene +} + +Rule aghanim_CustomIsBossIntro_Rule +{ + criteria Custom Isaghanim IsBossIntro + response aghanim_CustomIsBossIntro +} + +Response aghanim_CustomIsBossIntroChance_10% +{ + scene "scenes/aghanim/aghanim_aghs_battle_intro_02.vcd" nodelay noscene +} + +Rule aghanim_CustomIsBossIntroChance_10%_Rule +{ + criteria Custom Isaghanim IsBossIntro Chance_10% + response aghanim_CustomIsBossIntroChance_10% +} + +Response aghanim_CustomIsAbilityUseIsCrystalAttack +{ + scene "scenes/aghanim/aghanim_aghs_battle_bark_01.vcd" nodelay noscene defaultdelay respeakdelay 60 + scene "scenes/aghanim/aghanim_aghs_conjures_magic_01.vcd" nodelay noscene defaultdelay respeakdelay 60 +} + +Rule aghanim_CustomIsAbilityUseIsCrystalAttack_Rule +{ + criteria Custom Isaghanim IsAbilityUse IsCrystalAttack + response aghanim_CustomIsAbilityUseIsCrystalAttack +} + +Response aghanim_CustomIsAbilityUse +{ + scene "scenes/aghanim/aghanim_aghs_battle_bark_02.vcd" nodelay noscene defaultdelay respeakdelay 20 + scene "scenes/aghanim/aghanim_aghs_battle_bark_06.vcd" nodelay noscene defaultdelay respeakdelay 20 + scene "scenes/aghanim/aghanim_aghs_battle_bark_07.vcd" nodelay noscene defaultdelay respeakdelay 20 +} + +Rule aghanim_CustomIsAbilityUse_Rule +{ + criteria Custom Isaghanim IsAbilityUse + response aghanim_CustomIsAbilityUse +} + +Response aghanim_CustomIsAbilityUseIsSpellSwap +{ + scene "scenes/aghanim/aghanim_aghs_battle_bark_03.vcd" nodelay noscene defaultdelay respeakdelay 20 + scene "scenes/aghanim/aghanim_aghs_teleportation_03.vcd" nodelay noscene defaultdelay respeakdelay 20 +} + +Rule aghanim_CustomIsAbilityUseIsSpellSwap_Rule +{ + criteria Custom Isaghanim IsAbilityUse IsSpellSwap + response aghanim_CustomIsAbilityUseIsSpellSwap +} + +Response aghanim_CustomIsAbilityUseIsShardAttack +{ + scene "scenes/aghanim/aghanim_aghs_battle_bark_04.vcd" nodelay noscene defaultdelay respeakdelay 20 + scene "scenes/aghanim/aghanim_aghs_teleportation_02.vcd" nodelay noscene defaultdelay respeakdelay 20 +} + +Rule aghanim_CustomIsAbilityUseIsShardAttack_Rule +{ + criteria Custom Isaghanim IsAbilityUse IsShardAttack + response aghanim_CustomIsAbilityUseIsShardAttack +} + +Response aghanim_CustomIsAbilityUseIsBlink +{ + scene "scenes/aghanim/aghanim_aghs_battle_bark_05.vcd" nodelay noscene defaultdelay respeakdelay 60 + scene "scenes/aghanim/aghanim_aghs_teleportation_01.vcd" nodelay noscene defaultdelay respeakdelay 20 +} + +Rule aghanim_CustomIsAbilityUseIsBlink_Rule +{ + criteria Custom Isaghanim IsAbilityUse IsBlink + response aghanim_CustomIsAbilityUseIsBlink +} + +Response aghanim_CustomIsAbilityUseIsStaffBeams +{ + scene "scenes/aghanim/aghanim_aghs_battle_bark_08.vcd" nodelay noscene defaultdelay respeakdelay 20 + scene "scenes/aghanim/aghanim_aghs_conjures_magic_02.vcd" nodelay noscene defaultdelay respeakdelay 20 +} + +Rule aghanim_CustomIsAbilityUseIsStaffBeams_Rule +{ + criteria Custom Isaghanim IsAbilityUse IsStaffBeams + response aghanim_CustomIsAbilityUseIsStaffBeams +} + +Response aghanim_CustomIsAbilityUseIsSummonPortals +{ + scene "scenes/aghanim/aghanim_aghs_battle_bark_09.vcd" nodelay noscene defaultdelay respeakdelay 20 + scene "scenes/aghanim/aghanim_aghs_conjures_magic_03.vcd" nodelay noscene defaultdelay respeakdelay 20 +} + +Rule aghanim_CustomIsAbilityUseIsSummonPortals_Rule +{ + criteria Custom Isaghanim IsAbilityUse IsSummonPortals + response aghanim_CustomIsAbilityUseIsSummonPortals +} + +Response aghanim_CustomIsLaugh +{ + scene "scenes/aghanim/aghanim_aghs_battle_bark_laugh_01.vcd" nodelay noscene defaultdelay respeakdelay 20 + scene "scenes/aghanim/aghanim_aghs_battle_bark_laugh_02.vcd" nodelay noscene defaultdelay respeakdelay 20 + scene "scenes/aghanim/aghanim_aghs_battle_bark_laugh_03.vcd" nodelay noscene defaultdelay respeakdelay 20 +} + +Rule aghanim_CustomIsLaugh_Rule +{ + criteria Custom Isaghanim IsLaugh + response aghanim_CustomIsLaugh +} + +Response aghanim_CustomIsHeroKilled +{ + scene "scenes/aghanim/aghanim_aghs_kills_hero_final_battle_01.vcd" nodelay noscene speakonce + scene "scenes/aghanim/aghanim_aghs_kills_hero_final_battle_02.vcd" nodelay noscene speakonce + scene "scenes/aghanim/aghanim_aghs_kills_hero_final_battle_03.vcd" nodelay noscene speakonce + scene "scenes/aghanim/aghanim_aghs_kills_hero_final_battle_04.vcd" nodelay noscene speakonce +} + +Rule aghanim_CustomIsHeroKilled_Rule +{ + criteria Custom Isaghanim IsHeroKilled + response aghanim_CustomIsHeroKilled +} + +Response aghanim_CustomIsBested +{ + scene "scenes/aghanim/aghanim_aghs_bested_noise_01.vcd" nodelay noscene + scene "scenes/aghanim/aghanim_aghs_bested_noise_02.vcd" nodelay noscene + scene "scenes/aghanim/aghanim_aghs_bested_noise_final_01.vcd" nodelay noscene +} + +Rule aghanim_CustomIsBested_Rule +{ + criteria Custom Isaghanim IsBested + response aghanim_CustomIsBested +} + +Response aghanim_CustomIsTeamWipe +{ + scene "scenes/aghanim/aghanim_aghs_beats_player_01.vcd" nodelay noscene + scene "scenes/aghanim/aghanim_aghs_beats_player_02.vcd" nodelay noscene + scene "scenes/aghanim/aghanim_aghs_beats_player_03.vcd" nodelay noscene +} + +Rule aghanim_CustomIsTeamWipe_Rule +{ + criteria Custom Isaghanim IsTeamWipe + response aghanim_CustomIsTeamWipe +} + +Response aghanim_CustomIsAghanimLosesIsAscension0 +{ + scene "scenes/aghanim/aghanim_aghs_player_beats_aghs_lvl_1_01.vcd" nodelay noscene +} + +Rule aghanim_CustomIsAghanimLosesIsAscension0_Rule +{ + criteria Custom Isaghanim IsAghanimLoses IsAscension0 + response aghanim_CustomIsAghanimLosesIsAscension0 +} + +Response aghanim_CustomIsAghanimLosesIsAscension1 +{ + scene "scenes/aghanim/aghanim_aghs_player_beats_aghs_lvl_2_01.vcd" nodelay noscene +} + +Rule aghanim_CustomIsAghanimLosesIsAscension1_Rule +{ + criteria Custom Isaghanim IsAghanimLoses IsAscension1 + response aghanim_CustomIsAghanimLosesIsAscension1 +} + +Response aghanim_CustomIsAghanimLosesIsAscension2 +{ + scene "scenes/aghanim/aghanim_aghs_player_beats_aghs_lvl_3_01.vcd" nodelay noscene + scene "scenes/aghanim/aghanim_aghs_player_beats_aghs_lvl_4_01.vcd" nodelay noscene +} + +Rule aghanim_CustomIsAghanimLosesIsAscension2_Rule +{ + criteria Custom Isaghanim IsAghanimLoses IsAscension2 + response aghanim_CustomIsAghanimLosesIsAscension2 +} + +Response aghanim_CustomIsAghanimLosesIsAscension3 +{ + scene "scenes/aghanim/aghanim_aghs_player_beats_aghs_lvl_5_01.vcd" nodelay noscene +} + +Rule aghanim_CustomIsAghanimLosesIsAscension3_Rule +{ + criteria Custom Isaghanim IsAghanimLoses IsAscension3 + response aghanim_CustomIsAghanimLosesIsAscension3 +} + diff --git a/aghanim_singleplayer/scripts/talker/response_rules_announcer_aghanim.txt b/aghanim_singleplayer/scripts/talker/response_rules_announcer_aghanim.txt new file mode 100755 index 0000000..8ecde84 --- /dev/null +++ b/aghanim_singleplayer/scripts/talker/response_rules_announcer_aghanim.txt @@ -0,0 +1,1463 @@ +criterion "Isannouncer_aghanim" "classname" "npc_dota_announcer_aghanim" weight 5 required +criterion "IsEnemyannouncer_aghanim" "targetclassname" "npc_dota_announcer_aghanim" weight 5 required +criterion "IsAllyannouncer_aghanim" "nearby_ally" "npc_dota_announcer_aghanim" weight 5 required +criterion "IsDisabled" "disabled" "1" weight 5 required +criterion "NoNewPlayers" "has_new_players" "0" weight 5 required +criterion "HasNewPlayers" "has_new_players" "1" weight 5 required +criterion "IsStartingHeroSelection" "announce_event" "hero_selection" weight 5 required +criterion "IsHeroSelected" "announce_event" "hero_selected" weight 5 required +criterion "IsGameStart" "announce_event" "game_started" weight 5 required +criterion "IsRoomSuccess" "announce_event" "encounter_completed" weight 5 required +criterion "IsRoomChoice" "announce_event" "encounter_selected" weight 5 required +criterion "IsRoomStarted" "announce_event" "encounter_started" weight 5 required +criterion "IsNormalRoom" "encounter_type" "2" weight 5 required +criterion "IsTrapRoom" "encounter_type" "3" weight 5 required +criterion "IsBossRoom" "encounter_type" "4" weight 5 required +criterion "IsEmptyRoom" "encounter_type" "5" weight 5 required +criterion "IsRewardRoom" "encounter_type" "6" weight 5 required +criterion "IsTeamWipe" "announce_event" "game_lost" weight 5 required +criterion "IsVictory" "announce_event" "game_won" weight 5 required +criterion "IsItemPurchase" "announce_event" "item_purchased" weight 5 required +criterion "IsRewardSelectionAvailable" "announce_event" "select_rewards" weight 5 required +criterion "IsRewardSelected" "announce_event" "reward_selected" weight 5 required +criterion "IsMajorAbilityUpgrade" "reward_type" "REWARD_TYPE_ABILITY_UPGRADE" weight 5 required +criterion "IsMinorAbilityUpgrade" "reward_type" "REWARD_TYPE_MINOR_ABILITY_UPGRADE" weight 5 required +criterion "IsMinorStatsUpgrade" "reward_type" "REWARD_TYPE_MINOR_STATS_UPGRADE" weight 5 required +criterion "IsDepth1" "depth" "1" weight 5 required +criterion "IsDepth2" "depth" "2" weight 5 required +criterion "IsDepth3" "depth" "3" weight 5 required +criterion "IsAscension0" "ascension_level" "0" weight 5 required +criterion "IsAscension1" "ascension_level" "1" weight 5 required +criterion "IsAscension2" "ascension_level" "2" weight 5 required +criterion "IsAscension3" "ascension_level" "3" weight 5 required +criterion "IsTournamentMode" "tournament_mode" "1" weight 5 required +criterion "IsCreatureKilled" "announce_event" "creature_killed" weight 5 required +criterion "IsBoss" "boss" "1" weight 5 required +criterion "IsCaptain" "captain" "1" weight 5 required +criterion "IsHeroSniper" "hero_name" "npc_dota_hero_sniper" weight 5 required +criterion "IsHeroWeaver" "hero_name" "npc_dota_hero_weaver" weight 5 required +criterion "IsHeroDisruptor" "hero_name" "npc_dota_hero_disruptor" weight 5 required +criterion "IsHeroUrsa" "hero_name" "npc_dota_hero_ursa" weight 5 required +criterion "IsHeroMars" "hero_name" "npc_dota_hero_mars" weight 5 required +criterion "IsHeroViper" "hero_name" "npc_dota_hero_viper" weight 5 required +criterion "IsHeroTusk" "hero_name" "npc_dota_hero_tusk" weight 5 required +criterion "IsHeroSnapfire" "hero_name" "npc_dota_hero_snapfire" weight 5 required +criterion "IsHeroOmniknight" "hero_name" "npc_dota_hero_omniknight" weight 5 required +criterion "IsHeroWinterWyvern" "hero_name" "npc_dota_hero_winter_wyvern" weight 5 required +criterion "IsHeroMagnus" "hero_name" "npc_dota_hero_magnataur" weight 5 required +criterion "IsHeroWitchDoctor" "hero_name" "npc_dota_hero_witch_doctor" weight 5 required +criterion "IsIntroEncounter" "encounter_name" "encounter_starting_room" weight 5 required +criterion "IsQuillBoarEncounter" "encounter_name" "encounter_quill_beasts" weight 5 required +criterion "IsDazzleEncounter" "encounter_name" "encounter_wildwings" weight 5 required +criterion "IsScarabEncounter" "encounter_name" "encounter_zealot_scarabs" weight 5 required +criterion "IsMorphlingEncounter" "encounter_name" "encounter_morphlings_b" weight 5 required +criterion "IsTuskSkeletonEncounter" "encounter_name" "encounter_tusk_skeletons" weight 5 required +criterion "IsBomberEncounter" "encounter_name" "encounter_bombers" weight 5 required +criterion "IsOgreSealEncounter" "encounter_name" "encounter_ogre_seals" weight 5 required +criterion "IsTempleGuardiansEncounter" "encounter_name" "encounter_temple_guardians" weight 5 required +criterion "IsTimbersawBossEncounter" "encounter_name" "encounter_boss_timbersaw" weight 5 required +criterion "IsStoreggaBossEncounter" "encounter_name" "encounter_storegga" weight 5 required +criterion "IsDireSiegeEncounter" "encounter_name" "encounter_dire_siege" weight 5 required +criterion "IsWarlocksEncounter" "encounter_name" "encounter_warlocks" weight 5 required +criterion "IsChickenEncounter" "encounter_name" "encounter_bonus_chicken" weight 5 required +criterion "IsRockGolemEncounter" "encounter_name" "encounter_rock_golems" weight 5 required +criterion "IsRoshanEncounter" "encounter_name" "encounter_fire_roshan" weight 5 required +criterion "IsPickNumber4" "pick_number" "4" weight 5 required +criterion "IsMushroomMinesEncounter" "encounter_name" "encounter_mushroom_mines" weight 5 required +criterion "IsBombSquadEncounter" "encounter_name" "encounter_bomb_squad" weight 5 required +criterion "IsPudge" "encounter_name" "encounter_pudge_miniboss" weight 5 required +criterion "IsAghanimEncounter" "encounter_name" "encounter_aghanim" weight 5 required +criterion "IsVoidSpiritBossEncounter" "encounter_name" "encounter_boss_void_spirit" weight 5 required +criterion "IsMortyEncounter" "encounter_name" "encounter_morty_transition" weight 5 required +criterion "IsTempleGuardian" "unit" "npc_dota_creature_temple_guardian" weight 5 required +criterion "IsElite" "elite" "1" weight 5 required +criterion "IsHeroKilled" "announce_event" "hero_killed" weight 5 required +criterion "IsLastLife" "respawns_remaining" "0" weight 5 required +criterion "IsActBossStoregga" "act_boss" "npc_dota_creature_storegga" weight 5 required +criterion "IsActBossVoidSpirit" "act_boss" "npc_dota_boss_void_spirit" weight 5 required +criterion "IsCowardly" "announce_event" "hero_cowardly" weight 5 required +criterion "IsAghanimLoses" "announce_event" "victory_speech" weight 5 required +criterion "IsLagging" "announce_event" "lagging_hero" weight 5 required +criterion "IsNotElite" "elite" "0" weight 5 required +criterion "IsEncounterFireMaze" "encounter_name" "encounter_jungle_fire_maze" weight 5 required + +Response announcer_aghanim_CustomIsRewardSelectionAvailableNoNewPlayersIsAscension0IsDepth1 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_intro_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRewardSelectionAvailableNoNewPlayersIsAscension0IsDepth1_Rule +{ + criteria Custom Isannouncer_aghanim IsRewardSelectionAvailable NoNewPlayers IsAscension0 IsDepth1 + response announcer_aghanim_CustomIsRewardSelectionAvailableNoNewPlayersIsAscension0IsDepth1 +} + +Response announcer_aghanim_CustomIsGameStartIsAscension0HasNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_abridged_pt3_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsGameStartIsAscension0HasNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsGameStart IsAscension0 HasNewPlayers + response announcer_aghanim_CustomIsGameStartIsAscension0HasNewPlayers +} + +Response announcer_aghanim_CustomIsStartingHeroSelection +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_hero_select_start_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_hero_select_start_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_hero_select_start_04.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_hero_select_start_05.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_hero_select_start_06.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsStartingHeroSelection_Rule +{ + criteria Custom Isannouncer_aghanim IsStartingHeroSelection + response announcer_aghanim_CustomIsStartingHeroSelection +} + +Response announcer_aghanim_CustomIsDisabled +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_hero_select_start_03.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_fire_maze_02.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_agh_story_time_1_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_story_time_2_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_story_time_3_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_story_time_4_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_story_time_5_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_shopkeeper_bristleback_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_fire_maze_03.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_intro_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_intro_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_intro_03.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_intro_01_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_intro_02_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_intro_03_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_room_choice_mystery_encounter_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_room_choice_mystery_encounter_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_room_choice_mystery_encounter_03.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghs_mushroom_mines_intro_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_choose_difficulty_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_choose_difficulty_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_choose_difficulty_03.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_choose_difficulty_04.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_choose_difficulty_05.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_progress_act_ii_03.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_temple_guardians_intro_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_morphlings_intro_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_morphlings_intro_01_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_morphlings_intro_01_03.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_01_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_03.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_03_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_04.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_05.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_06.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_06_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_07.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_07_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_08.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_ability_select_09.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_explain_room_choice_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_explain_room_choice_01_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_fire_maze_follow_up_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_temple_arena_intro_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_temple_arena_success_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsDisabled_Rule +{ + criteria Custom Isannouncer_aghanim IsDisabled + response announcer_aghanim_CustomIsDisabled +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroWeaverNoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_weaver_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_weaver_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroWeaverNoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroWeaver NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroWeaverNoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroWinterWyvernNoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_wyvern_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_wyvern_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroWinterWyvernNoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroWinterWyvern NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroWinterWyvernNoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroTuskNoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_tusk_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroTuskNoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroTusk NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroTuskNoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroMarsNoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_mars_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroMarsNoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroMars NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroMarsNoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroWitchDoctorNoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_witch_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_witch_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroWitchDoctorNoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroWitchDoctor NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroWitchDoctorNoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroMagnusNoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_magnus_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroMagnusNoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroMagnus NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroMagnusNoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroMagnusChance_25%NoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_magnus_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroMagnusChance_25%NoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroMagnus Chance_25% NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroMagnusChance_25%NoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroSnapfireNoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_snapfire_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroSnapfireNoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroSnapfire NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroSnapfireNoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroSnapfireChance_25%NoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_snapfire_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroSnapfireChance_25%NoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroSnapfire Chance_25% NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroSnapfireChance_25%NoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroSniperNoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_sniper_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroSniperNoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroSniper NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroSniperNoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroUrsaNoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_ursa_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_ursa_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroUrsaNoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroUrsa NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroUrsaNoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroViperNoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_viper_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_viper_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroViperNoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroViper NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroViperNoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroOmniknightNoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_omni_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_omni_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroOmniknightNoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroOmniknight NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroOmniknightNoNewPlayers +} + +Response announcer_aghanim_CustomIsHeroSelectedIsHeroOmniknightIsPickNumber4NoNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pick_omni_03.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsHeroSelectedIsHeroOmniknightIsPickNumber4NoNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroSelected IsHeroOmniknight IsPickNumber4 NoNewPlayers + response announcer_aghanim_CustomIsHeroSelectedIsHeroOmniknightIsPickNumber4NoNewPlayers +} + +Response announcer_aghanim_CustomIsStartingHeroSelectionHasNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_abridged_pt1_01.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 1.5 +} + +Rule announcer_aghanim_CustomIsStartingHeroSelectionHasNewPlayers_Rule +{ + criteria Custom Isannouncer_aghanim IsStartingHeroSelection HasNewPlayers + response announcer_aghanim_CustomIsStartingHeroSelectionHasNewPlayers +} + +Response announcer_aghanim_CustomIsGameStartIsAscension0 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_01.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 0.75 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_02.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 0.75 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_follow_up_01.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 0.75 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_05.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 0.75 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_03.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 0.75 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_04.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 0.75 +} + +Rule announcer_aghanim_CustomIsGameStartIsAscension0_Rule +{ + criteria Custom Isannouncer_aghanim IsGameStart IsAscension0 + response announcer_aghanim_CustomIsGameStartIsAscension0 +} + +Response announcer_aghanim_CustomIsGameStartIsAscension1 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_player_return_ascension_i_01.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 0.75 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_player_return_ascenion_ii_01.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 0.75 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_player_return_ascenion_ii_02.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 0.75 +} + +Rule announcer_aghanim_CustomIsGameStartIsAscension1_Rule +{ + criteria Custom Isannouncer_aghanim IsGameStart IsAscension1 + response announcer_aghanim_CustomIsGameStartIsAscension1 +} + +Response announcer_aghanim_CustomIsGameStartIsAscension2 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_player_return_ascenion_iii_01.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 0.75 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_player_return_ascenion_iii_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsGameStartIsAscension2_Rule +{ + criteria Custom Isannouncer_aghanim IsGameStart IsAscension2 + response announcer_aghanim_CustomIsGameStartIsAscension2 +} + +Response announcer_aghanim_CustomIsGameStartIsAscension3 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_player_return_ascenion_iv_01.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 0.75 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_player_return_ascenion_v_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_player_return_ascenion_v_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsGameStartIsAscension3_Rule +{ + criteria Custom Isannouncer_aghanim IsGameStart IsAscension3 + response announcer_aghanim_CustomIsGameStartIsAscension3 +} + +Response announcer_aghanim_CustomIsRoomChoiceIsDepth1IsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_choice_select_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsDepth1IsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsDepth1 IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsDepth1IsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceHasNewPlayersIsDepth2 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_explain_room_choice_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceHasNewPlayersIsDepth2_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice HasNewPlayers IsDepth2 + response announcer_aghanim_CustomIsRoomChoiceHasNewPlayersIsDepth2 +} + +Response announcer_aghanim_CustomIsRoomChoiceIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_generic_room_intro_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_generic_room_intro_02.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_generic_room_intro_03.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_generic_room_intro_04.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_generic_room_intro_05.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_generic_room_intro_06.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_generic_room_intro_07.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_generic_room_intro_08.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_generic_room_intro_09.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_generic_room_intro_10.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsQuillBoarEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_quill_boars_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsQuillBoarEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsQuillBoarEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsQuillBoarEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsDazzleEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_dazzles_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsDazzleEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsDazzleEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsDazzleEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsScarabEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_zealot_scarabs_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsScarabEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsScarabEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsScarabEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsTuskSkeletonEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_tusk_skeleton_mages_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsTuskSkeletonEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsTuskSkeletonEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsTuskSkeletonEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsBomberEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_bombers_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsBomberEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsBomberEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsBomberEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsOgreSealEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_walruses_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsOgreSealEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsOgreSealEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsOgreSealEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsTempleGuardiansEncounterIsBossRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_temple_guardians_intro_01_02.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsTempleGuardiansEncounterIsBossRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsTempleGuardiansEncounter IsBossRoom + response announcer_aghanim_CustomIsRoomChoiceIsTempleGuardiansEncounterIsBossRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsTimbersawBossEncounterIsBossRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_rizz_rick_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsTimbersawBossEncounterIsBossRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsTimbersawBossEncounter IsBossRoom + response announcer_aghanim_CustomIsRoomChoiceIsTimbersawBossEncounterIsBossRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsStoreggaBossEncounterIsBossRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_storegga_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsStoreggaBossEncounterIsBossRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsStoreggaBossEncounter IsBossRoom + response announcer_aghanim_CustomIsRoomChoiceIsStoreggaBossEncounterIsBossRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsDireSiegeEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_siege_wagons_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsDireSiegeEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsDireSiegeEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsDireSiegeEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsWarlocksEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_scored_plains_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsWarlocksEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsWarlocksEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsWarlocksEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsChickenEncounterIsRewardRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_chicken_intro_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_chicken_intro_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsChickenEncounterIsRewardRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsChickenEncounter IsRewardRoom + response announcer_aghanim_CustomIsRoomChoiceIsChickenEncounterIsRewardRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsRoshanEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_roshans_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsRoshanEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsRoshanEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsRoshanEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsRockGolemEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghs_rock_golems_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsRockGolemEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsRockGolemEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsRockGolemEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsMortyEncounterIsRewardRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghs_leaping_lizards_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsMortyEncounterIsRewardRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsMortyEncounter IsRewardRoom + response announcer_aghanim_CustomIsRoomChoiceIsMortyEncounterIsRewardRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsMushroomMinesEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghs_mushroom_mines_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsMushroomMinesEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsMushroomMinesEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsMushroomMinesEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsPudgeIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghs_pudge_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsPudgeIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsPudge IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsPudgeIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsRewardRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_treasure_room_intro_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsRewardRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsRewardRoom + response announcer_aghanim_CustomIsRoomChoiceIsRewardRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsEliteIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_elite_encounter_intro_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_elite_encounter_intro_02.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_elite_encounter_intro_03.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_elite_encounter_intro_04.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsEliteIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsElite IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsEliteIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsVoidSpiritBossEncounterIsBossRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_room_choice_void_spirit_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsVoidSpiritBossEncounterIsBossRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsVoidSpiritBossEncounter IsBossRoom + response announcer_aghanim_CustomIsRoomChoiceIsVoidSpiritBossEncounterIsBossRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsBombSquadEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_room_choice_walrus_hooks_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsBombSquadEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsBombSquadEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomChoiceIsBombSquadEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsEncounterFireMazeIsTrapRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_fire_maze_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsEncounterFireMazeIsTrapRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsEncounterFireMaze IsTrapRoom + response announcer_aghanim_CustomIsRoomChoiceIsEncounterFireMazeIsTrapRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessHasNewPlayersIsDepth1 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_explain_room_choice_01_03.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRoomSuccessHasNewPlayersIsDepth1_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess HasNewPlayers IsDepth1 + response announcer_aghanim_CustomIsRoomSuccessHasNewPlayersIsDepth1 +} + +Response announcer_aghanim_CustomIsRoomSuccessIsQuillBoarEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_quill_boars_success_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsQuillBoarEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsQuillBoarEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomSuccessIsQuillBoarEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsDazzleEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_dazzles_success_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsDazzleEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsDazzleEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomSuccessIsDazzleEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsCreatureKilledIsCaptainIsScarabEncounter +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_zealot_scarabs_bark_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsCreatureKilledIsCaptainIsScarabEncounter_Rule +{ + criteria Custom Isannouncer_aghanim IsCreatureKilled IsCaptain IsScarabEncounter + response announcer_aghanim_CustomIsCreatureKilledIsCaptainIsScarabEncounter +} + +Response announcer_aghanim_CustomIsRoomSuccessIsScarabEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_zealot_scarabs_success_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsScarabEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsScarabEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomSuccessIsScarabEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsTuskSkeletonEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_tusk_skeleton_mages_success_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsTuskSkeletonEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsTuskSkeletonEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomSuccessIsTuskSkeletonEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsOgreSealEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_walruses_success_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsOgreSealEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsOgreSealEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomSuccessIsOgreSealEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsChickenEncounterIsRewardRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_chicken_success_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsChickenEncounterIsRewardRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsChickenEncounter IsRewardRoom + response announcer_aghanim_CustomIsRoomSuccessIsChickenEncounterIsRewardRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_10.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_10_02.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_11.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_12.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_02.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_03.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_04.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_05.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_06.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_07.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_08.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_success_09.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsNormalRoom + response announcer_aghanim_CustomIsRoomSuccessIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsStoreggaBossEncounterIsBossRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_storegga_success_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_progress_act_i_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsStoreggaBossEncounterIsBossRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsStoreggaBossEncounter IsBossRoom + response announcer_aghanim_CustomIsRoomSuccessIsStoreggaBossEncounterIsBossRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsTimbersawBossEncounterIsBossRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_progress_act_i_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_progress_act_i_04.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_progress_act_i_05.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsTimbersawBossEncounterIsBossRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsTimbersawBossEncounter IsBossRoom + response announcer_aghanim_CustomIsRoomSuccessIsTimbersawBossEncounterIsBossRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsTempleGuardiansEncounterIsBossRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_progress_act_i_03.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_progress_act_ii_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_progress_act_ii_04.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsTempleGuardiansEncounterIsBossRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsTempleGuardiansEncounter IsBossRoom + response announcer_aghanim_CustomIsRoomSuccessIsTempleGuardiansEncounterIsBossRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsVoidSpiritBossEncounterIsBossRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_progress_act_ii_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsVoidSpiritBossEncounterIsBossRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsVoidSpiritBossEncounter IsBossRoom + response announcer_aghanim_CustomIsRoomSuccessIsVoidSpiritBossEncounterIsBossRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsRockGolemEncounterIsNormalRoomIsNotElite +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghs_rock_golems_outro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsRockGolemEncounterIsNormalRoomIsNotElite_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsRockGolemEncounter IsNormalRoom IsNotElite + response announcer_aghanim_CustomIsRoomSuccessIsRockGolemEncounterIsNormalRoomIsNotElite +} + +Response announcer_aghanim_CustomIsRoomSuccessIsMortyEncounterIsRewardRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghs_leaping_lizards_outro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsMortyEncounterIsRewardRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsMortyEncounter IsRewardRoom + response announcer_aghanim_CustomIsRoomSuccessIsMortyEncounterIsRewardRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsMushroomMinesEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghs_mushroom_mines_outro_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsMushroomMinesEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsMushroomMinesEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomSuccessIsMushroomMinesEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsPudgeIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghs_pudge_outro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsPudgeIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsPudge IsNormalRoom + response announcer_aghanim_CustomIsRoomSuccessIsPudgeIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsBombSquadEncounterIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_room_choice_walrus_hooks_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_room_success_walrus_hooks_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsBombSquadEncounterIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsBombSquadEncounter IsNormalRoom + response announcer_aghanim_CustomIsRoomSuccessIsBombSquadEncounterIsNormalRoom +} + +Response announcer_aghanim_CustomIsRoomSuccessIsRewardRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_treasure_room_outro_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRoomSuccessIsRewardRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomSuccess IsRewardRoom + response announcer_aghanim_CustomIsRoomSuccessIsRewardRoom +} + +Response announcer_aghanim_CustomIsRoomChoiceIsAghanimEncounterIsBossRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pre_aghs_room_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pre_aghs_room_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pre_aghs_room_03.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_pre_aghs_room_04.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsRoomChoiceIsAghanimEncounterIsBossRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsRoomChoice IsAghanimEncounter IsBossRoom + response announcer_aghanim_CustomIsRoomChoiceIsAghanimEncounterIsBossRoom +} + +Response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroWeaver +{ + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_weaver_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_weaver_02.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroWeaver_Rule +{ + criteria Custom Isannouncer_aghanim IsRewardSelected Chance_25% IsHeroWeaver + response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroWeaver +} + +Response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroWinterWyvern +{ + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_wyvern_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_wyvern_02.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroWinterWyvern_Rule +{ + criteria Custom Isannouncer_aghanim IsRewardSelected Chance_25% IsHeroWinterWyvern + response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroWinterWyvern +} + +Response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroMars +{ + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_mars_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_mars_02.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroMars_Rule +{ + criteria Custom Isannouncer_aghanim IsRewardSelected Chance_25% IsHeroMars + response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroMars +} + +Response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroSniper +{ + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_sniper_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_sniper_02.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroSniper_Rule +{ + criteria Custom Isannouncer_aghanim IsRewardSelected Chance_25% IsHeroSniper + response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroSniper +} + +Response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroViper +{ + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_viper_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_viper_02.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroViper_Rule +{ + criteria Custom Isannouncer_aghanim IsRewardSelected Chance_25% IsHeroViper + response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroViper +} + +Response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroOmniknight +{ + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_omniknight_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_omniknight_02.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroOmniknight_Rule +{ + criteria Custom Isannouncer_aghanim IsRewardSelected Chance_25% IsHeroOmniknight + response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroOmniknight +} + +Response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroTusk +{ + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_tusk_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_tusk_02.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroTusk_Rule +{ + criteria Custom Isannouncer_aghanim IsRewardSelected Chance_25% IsHeroTusk + response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroTusk +} + +Response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroWitchDoctor +{ + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_witch_doctor_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_witch_doctor_02.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroWitchDoctor_Rule +{ + criteria Custom Isannouncer_aghanim IsRewardSelected Chance_25% IsHeroWitchDoctor + response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroWitchDoctor +} + +Response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroUrsa +{ + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_ursa_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_ursa_02.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroUrsa_Rule +{ + criteria Custom Isannouncer_aghanim IsRewardSelected Chance_25% IsHeroUrsa + response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroUrsa +} + +Response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroSnapfire +{ + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_snapfire_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_ability_select_snapfire_02.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroSnapfire_Rule +{ + criteria Custom Isannouncer_aghanim IsRewardSelected Chance_25% IsHeroSnapfire + response announcer_aghanim_CustomIsRewardSelectedChance_25%IsHeroSnapfire +} + +Response announcer_aghanim_CustomIsCreatureKilledIsBossIsTempleGuardian +{ + scene "scenes/announcer_aghanim/announcer_aghanim_first_temple_guardian_dies_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsCreatureKilledIsBossIsTempleGuardian_Rule +{ + criteria Custom Isannouncer_aghanim IsCreatureKilled IsBoss IsTempleGuardian + response announcer_aghanim_CustomIsCreatureKilledIsBossIsTempleGuardian +} + +Response announcer_aghanim_CustomIsCowardly +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_attack_not_in_room_01.vcd" nodelay noscene speakonce respeakdelay 10 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_attack_not_in_room_02.vcd" nodelay noscene speakonce respeakdelay 10 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_attack_not_in_room_04.vcd" nodelay noscene speakonce respeakdelay 10 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_attack_not_in_room_05.vcd" nodelay noscene speakonce respeakdelay 10 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_attack_not_in_room_06.vcd" nodelay noscene speakonce respeakdelay 10 +} + +Rule announcer_aghanim_CustomIsCowardly_Rule +{ + criteria Custom Isannouncer_aghanim IsCowardly + response announcer_aghanim_CustomIsCowardly +} + +Response announcer_aghanim_CustomIsCowardlyIsHeroOmniknight +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_attack_not_in_room_03.vcd" nodelay noscene speakonce respeakdelay 10 +} + +Rule announcer_aghanim_CustomIsCowardlyIsHeroOmniknight_Rule +{ + criteria Custom Isannouncer_aghanim IsCowardly IsHeroOmniknight + response announcer_aghanim_CustomIsCowardlyIsHeroOmniknight +} + +Response announcer_aghanim_CustomIsLagging +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_players_lag_behind_01.vcd" nodelay noscene respeakdelay 10 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_players_lag_behind_02.vcd" nodelay noscene respeakdelay 10 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_players_lag_behind_03.vcd" nodelay noscene respeakdelay 10 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_players_lag_behind_04.vcd" nodelay noscene respeakdelay 10 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_players_lag_behind_05.vcd" nodelay noscene respeakdelay 10 +} + +Rule announcer_aghanim_CustomIsLagging_Rule +{ + criteria Custom Isannouncer_aghanim IsLagging + response announcer_aghanim_CustomIsLagging +} + +Response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroWeaver +{ + scene "scenes/announcer_aghanim/announcer_aghanim_character_death_weaver_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroWeaver_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroKilled IsLastLife IsHeroWeaver + response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroWeaver +} + +Response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroMars +{ + scene "scenes/announcer_aghanim/announcer_aghanim_character_death_mars_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroMars_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroKilled IsLastLife IsHeroMars + response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroMars +} + +Response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroWitchDoctor +{ + scene "scenes/announcer_aghanim/announcer_aghanim_character_death_witch_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroWitchDoctor_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroKilled IsLastLife IsHeroWitchDoctor + response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroWitchDoctor +} + +Response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroTusk +{ + scene "scenes/announcer_aghanim/announcer_aghanim_character_death_tusk_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroTusk_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroKilled IsLastLife IsHeroTusk + response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroTusk +} + +Response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroSniper +{ + scene "scenes/announcer_aghanim/announcer_aghanim_character_death_sniper_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroSniper_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroKilled IsLastLife IsHeroSniper + response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroSniper +} + +Response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroViper +{ + scene "scenes/announcer_aghanim/announcer_aghanim_character_death_viper_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroViper_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroKilled IsLastLife IsHeroViper + response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroViper +} + +Response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroWinterWyvern +{ + scene "scenes/announcer_aghanim/announcer_aghanim_character_death_wyvern_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroWinterWyvern_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroKilled IsLastLife IsHeroWinterWyvern + response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroWinterWyvern +} + +Response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroOmniknight +{ + scene "scenes/announcer_aghanim/announcer_aghanim_character_death_omni_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroOmniknight_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroKilled IsLastLife IsHeroOmniknight + response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroOmniknight +} + +Response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroUrsa +{ + scene "scenes/announcer_aghanim/announcer_aghanim_character_death_ursa_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroUrsa_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroKilled IsLastLife IsHeroUrsa + response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroUrsa +} + +Response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroSnapfire +{ + scene "scenes/announcer_aghanim/announcer_aghanim_character_death_snapfire_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroSnapfire_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroKilled IsLastLife IsHeroSnapfire + response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroSnapfire +} + +Response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroMagnus +{ + scene "scenes/announcer_aghanim/announcer_aghanim_character_death_magnus_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroMagnus_Rule +{ + criteria Custom Isannouncer_aghanim IsHeroKilled IsLastLife IsHeroMagnus + response announcer_aghanim_CustomIsHeroKilledIsLastLifeIsHeroMagnus +} + +Response announcer_aghanim_CustomIsItemPurchaseChance_25% +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_shopkeeper_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_agh_shopkeeper_02.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_agh_shopkeeper_03.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsItemPurchaseChance_25%_Rule +{ + criteria Custom Isannouncer_aghanim IsItemPurchase Chance_25% + response announcer_aghanim_CustomIsItemPurchaseChance_25% +} + +Response announcer_aghanim_CustomIsItemPurchaseHasNewPlayersIsDepth2 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_shopkeeper_intro_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsItemPurchaseHasNewPlayersIsDepth2_Rule +{ + criteria Custom Isannouncer_aghanim IsItemPurchase HasNewPlayers IsDepth2 + response announcer_aghanim_CustomIsItemPurchaseHasNewPlayersIsDepth2 +} + +Response announcer_aghanim_CustomIsTeamWipe +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_team_wipe_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_team_wipe_01_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_team_wipe_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_team_wipe_03.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_team_wipe_03_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_team_wipe_04.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_team_wipe_05.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_team_wipe_06.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_team_wipe_07.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_team_wipe_08.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsTeamWipe_Rule +{ + criteria Custom Isannouncer_aghanim IsTeamWipe + response announcer_aghanim_CustomIsTeamWipe +} + +Response announcer_aghanim_CustomIsTournamentModeIsStartingHeroSelection +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_intro_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsTournamentModeIsStartingHeroSelection_Rule +{ + criteria Custom Isannouncer_aghanim IsTournamentMode IsStartingHeroSelection + response announcer_aghanim_CustomIsTournamentModeIsStartingHeroSelection +} + +Response announcer_aghanim_CustomIsTournamentModeIsGameStart +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_intro_follow_up_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_intro_follow_up_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_intro_follow_up_03.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsTournamentModeIsGameStart_Rule +{ + criteria Custom Isannouncer_aghanim IsTournamentMode IsGameStart + response announcer_aghanim_CustomIsTournamentModeIsGameStart +} + +Response announcer_aghanim_CustomIsTournamentModeIsRoomSuccessIsBossRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_first_boss_bad_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_first_boss_good_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_first_boss_neut_01.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsTournamentModeIsRoomSuccessIsBossRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsTournamentMode IsRoomSuccess IsBossRoom + response announcer_aghanim_CustomIsTournamentModeIsRoomSuccessIsBossRoom +} + +Response announcer_aghanim_CustomIsTournamentModeIsTeamWipe +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_team_wipe_01.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_team_wipe_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_team_wipe_03.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_team_wipe_04.vcd" nodelay noscene then self TLK_DOTA_FOLLOWUP_GENERIC foo:0 1.5 +} + +Rule announcer_aghanim_CustomIsTournamentModeIsTeamWipe_Rule +{ + criteria Custom Isannouncer_aghanim IsTournamentMode IsTeamWipe + response announcer_aghanim_CustomIsTournamentModeIsTeamWipe +} + +Response announcer_aghanim_CustomIsTournamentModeIsHeroKilledIsLastLife +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_hero_death_01.vcd" nodelay noscene respeakdelay 7 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_hero_death_02.vcd" nodelay noscene respeakdelay 7 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_hero_death_03.vcd" nodelay noscene respeakdelay 7 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_hero_death_04.vcd" nodelay noscene respeakdelay 7 + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_hero_death_05.vcd" nodelay noscene respeakdelay 7 +} + +Rule announcer_aghanim_CustomIsTournamentModeIsHeroKilledIsLastLife_Rule +{ + criteria Custom Isannouncer_aghanim IsTournamentMode IsHeroKilled IsLastLife + response announcer_aghanim_CustomIsTournamentModeIsHeroKilledIsLastLife +} + +Response announcer_aghanim_CustomIsTournamentModeIsRoomChoiceIsEliteIsNormalRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_room_choice_elite_01.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_room_choice_elite_02.vcd" nodelay noscene speakonce + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_room_choice_elite_03.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_CustomIsTournamentModeIsRoomChoiceIsEliteIsNormalRoom_Rule +{ + criteria Custom Isannouncer_aghanim IsTournamentMode IsRoomChoice IsElite IsNormalRoom + response announcer_aghanim_CustomIsTournamentModeIsRoomChoiceIsEliteIsNormalRoom +} + +Response announcer_aghanim_CustomIsDisabledIsRoomChoiceHasNewPlayersIsDepth2 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_explain_room_choice_02_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsDisabledIsRoomChoiceHasNewPlayersIsDepth2_Rule +{ + criteria Custom Isannouncer_aghanim IsDisabled IsRoomChoice HasNewPlayers IsDepth2 + response announcer_aghanim_CustomIsDisabledIsRoomChoiceHasNewPlayersIsDepth2 +} + +Response announcer_aghanim_CustomIsDisabledIsRoomChoice +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_room_choice_select_01_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_CustomIsDisabledIsRoomChoice_Rule +{ + criteria Custom Isannouncer_aghanim IsDisabled IsRoomChoice + response announcer_aghanim_CustomIsDisabledIsRoomChoice +} + +Response announcer_aghanim_Followup_GenericIsStartingHeroSelectionHasNewPlayers +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_abridged_pt2_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_Followup_GenericIsStartingHeroSelectionHasNewPlayers_Rule +{ + criteria Followup_Generic Isannouncer_aghanim IsStartingHeroSelection HasNewPlayers + response announcer_aghanim_Followup_GenericIsStartingHeroSelectionHasNewPlayers +} + +Response announcer_aghanim_Followup_GenericIsGameStartIsAscension0 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_follow_up_02.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_follow_up_03.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_follow_up_08.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_follow_up_09.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_follow_up_10.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_follow_up_11.vcd" nodelay noscene +} + +Rule announcer_aghanim_Followup_GenericIsGameStartIsAscension0_Rule +{ + criteria Followup_Generic Isannouncer_aghanim IsGameStart IsAscension0 + response announcer_aghanim_Followup_GenericIsGameStartIsAscension0 +} + +Response announcer_aghanim_Followup_GenericIsGameStartIsAscension2 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_follow_up_04.vcd" nodelay noscene +} + +Rule announcer_aghanim_Followup_GenericIsGameStartIsAscension2_Rule +{ + criteria Followup_Generic Isannouncer_aghanim IsGameStart IsAscension2 + response announcer_aghanim_Followup_GenericIsGameStartIsAscension2 +} + +Response announcer_aghanim_Followup_GenericIsGameStartIsAscension1 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_follow_up_05.vcd" nodelay noscene + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_follow_up_07.vcd" nodelay noscene +} + +Rule announcer_aghanim_Followup_GenericIsGameStartIsAscension1_Rule +{ + criteria Followup_Generic Isannouncer_aghanim IsGameStart IsAscension1 + response announcer_aghanim_Followup_GenericIsGameStartIsAscension1 +} + +Response announcer_aghanim_Followup_GenericIsGameStartIsAscension3 +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_intro_player_return_follow_up_06.vcd" nodelay noscene +} + +Rule announcer_aghanim_Followup_GenericIsGameStartIsAscension3_Rule +{ + criteria Followup_Generic Isannouncer_aghanim IsGameStart IsAscension3 + response announcer_aghanim_Followup_GenericIsGameStartIsAscension3 +} + +Response announcer_aghanim_Followup_GenericIsRoomStartedIsEncounterFireMazeIsTrapRoom +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_fire_maze_follow_up_01_02.vcd" nodelay noscene speakonce +} + +Rule announcer_aghanim_Followup_GenericIsRoomStartedIsEncounterFireMazeIsTrapRoom_Rule +{ + criteria Followup_Generic Isannouncer_aghanim IsRoomStarted IsEncounterFireMaze IsTrapRoom + response announcer_aghanim_Followup_GenericIsRoomStartedIsEncounterFireMazeIsTrapRoom +} + +Response announcer_aghanim_Followup_GenericIsDisabled +{ + scene "scenes/announcer_aghanim/announcer_aghanim_aghanim_fire_maze_follow_up_02.vcd" nodelay noscene +} + +Rule announcer_aghanim_Followup_GenericIsDisabled_Rule +{ + criteria Followup_Generic Isannouncer_aghanim IsDisabled + response announcer_aghanim_Followup_GenericIsDisabled +} + +Response announcer_aghanim_Followup_GenericIsTournamentModeIsTeamWipe +{ + scene "scenes/announcer_aghanim/announcer_aghanim_agh_timetrial_team_wipe_follow_up_01.vcd" nodelay noscene +} + +Rule announcer_aghanim_Followup_GenericIsTournamentModeIsTeamWipe_Rule +{ + criteria Followup_Generic Isannouncer_aghanim IsTournamentMode IsTeamWipe + response announcer_aghanim_Followup_GenericIsTournamentModeIsTeamWipe +} + diff --git a/aghanim_singleplayer/scripts/talker/response_rules_custom.txt b/aghanim_singleplayer/scripts/talker/response_rules_custom.txt new file mode 100755 index 0000000..c6e4949 --- /dev/null +++ b/aghanim_singleplayer/scripts/talker/response_rules_custom.txt @@ -0,0 +1,164 @@ +// This is the base rule script file for the AI response system for Expressive AI's who speak based on certain "Concepts" +// You can think of a concept as a high level state that the code is trying to convey, such as say hello, or say you're mad, etc. +// +// The format of this file is that there are five main types of commands: +// 1) #include "filename" // This just causes the included scriptfile to be parsed and added to the database +// 2) enumeration: this declares an enumerated type so that comparisons can be matched against the string versions of the type +// 3) response: this specifies a response to issue. A response consists of a weighted set of options and can recursively reference +// other responses by name +// 4) criterion: This is a match condition +// 5) rule: a rule consists of one or more criteria and a response +// +// In general, the system is presented with a criteria set, which is a set of key value pairs generated by the game code and +// various entity I/O and keyfields. For instance, the following criteria set was created in a map with a train terminal +// "speaker" entity wishing to fire random station announcements +// concept = 'train_speaker' (weight 5.000000) ; the high level concept for the search request +// map = 'terminal_pa' ; the name of the map +// classname = 'speaker' ; the classname and name of the "speaking" entity +// name = 'terminal_pa' +// health = '10' ; the absolute health of the speaking entity +// healthfrac = '0.000' ; the health fraction (health/maxhealth) of the speaking entity +// playerhealth = '100' ; similar data related to the current player: +// playerhealthfrac = '1.000' +// playerweapon = 'none' ; the name of the weapon the player is carrying +// playeractivity = 'ACT_WALK' ; animating activity of the player +// playerspeed = '0.000' ; how fast the player is moving +// +// Based on such a criteria set, the system checks each rule against the set. To do this, each criterion of the rule is +// given a numeric score as follows: +// score = 0 if criteria doesn't match or, criterion weight * keyvaliue weight if it does match +// The final score for a rule is the sum of all of the scores of its criteria. The best rule is the one with the highest +// score. Once a best rule is selected, then a response is looked up based on the response definitions and the engine is +// asked to dispatch that response. +// +// The specific syntax for the various keywords is as follows: +// +// ENUMERATIONS: +// +// enumeration +// { +// "key1" "value1" +// "key2" "value2" +// ...etc. +// } +// The code and criteria refer to enumerations with square brackets and a double colon separator, e.g.: +// [enumerationname::key1] +// +// +// RESPONSES: +// +// Single line: +// response [nodelay | defaultdelay | delay interval ] [speakonce] [noscene] [odds nnn] [respeakdelay interval] [soundelvel "SNDLVL_xxx"] responsetype parameters +// Multiple lines +// response +// { +// [permitrepeats] ; optional parameter, by default we visit all responses in group before repeating any +// [sequential] ; optional parameter, by default we randomly choose responses, but with this we walk through the list starting at the first and going to the last +// [norepeat] ; Once we've run through all of the entries, disable the response group +// responsetype1 parameters1 [nodelay | defaultdelay | delay interval ] [speakonce] [odds nnn] [respeakdelay interval] [soundelvel "SNDLVL_xxx"] [displayfirst] [ displaylast ] weight nnn +// responsetype2 parameters2 [nodelay | defaultdelay | delay interval ] [speakonce] [odds nnn] [respeakdelay interval] [soundelvel "SNDLVL_xxx"] [displayfirst] [ displaylast ] weight nnn +// etc. +// } +// Where: +// interval = "startnumber,endnumber" or "number" (e.g., "2.8,3.2" or "3.2") +// responsetype =: +// speak ; it's an entry in sounds.txt +// sentence ; it's a sentence name from sentences.txt +// scene ; it's a .vcd file +// response ; it's a reference to another response group by name +// print ; print the text in developer 2 (for placeholder responses) +// nodelay = an additional delay of 0 after speaking +// defaultdelay = an additional delay of 2.8 to 3.2 seconds after speaking +// delay interval = an additional delay based on a random sample from the interval after speaking +// predelay interval = delays the speech for the time interval. NOTE: Only works on scenes (i.e. no sentences/speak/print) +// speakonce = don't use this response more than one time (default off) +// noscene = For an NPC, play the sound immediately using EmitSound, don't play it through the scene system. Good for playing sounds on dying or dead NPCs. +// odds = if this response is selected, if odds < 100, then there is a chance that nothing will be said (default 100) +// respeakdelay = don't use this response again for at least this long (default 0) +// soundlevel = use this soundlevel for the speak/sentence (default SNDLVL_TALKING) +// weight = if there are multiple responses, this is a selection weighting so that certain responses are favored over others in the group (default 1) +// displayfirst/displaylast : this should be the first/last item selected (ignores weight) +// +// CRITERIA: +// +// criterion weight nnn required +// Where: +// matchkey matches one of the criteria in the set as shown above +// matchvalue is a string or number value or a range, the following are all valid: +// "0" ; numeric match to value 0 +// "1" ; numeric match to value 1 +// "weapon_smg1" ; string match to weapon_smg1 string +// "[npcstate::idle]" ; match enumeration by looking up numeric value +// ">0" ; match if greater than zero +// ">10,<=50" ; match if greater than ten and less than or equal to 50 +// ">0,<[npcstate::alert]" ; match if greater than zer and les then value of enumeration for alert +// "!=0" ; match if not equal to zero +// weight = floating point weighting for score assuming criteria match (default value 1.0) +// required: if a rule has one or more criteria with the required flag set, then if any such criteria +// fail, the entire rule receives a score of zero +// +// RULE: +// +// rule +// { +// criteria name1 [name2 name3 etc.] +// response responsegroupname [responsegroupname2 etc.] +// [matchonce] ; optional parameter +// [ weight nnn required ] +// } +// Where: +// criteria just lies one more more criterion names from above and response list one or more of the response +// names from above (usually just one) +// matchonce (off by default): means that the rule is deactivated after the first time it is matched +// Note that additional "unnamed" criteria can be specified inline in the rule using the same syntax +// as for defining a criterion, except for the criterion keyword and the criterion name keys +// +// Interaction with entity I/O system +// CBaseEntity contains an inputfunc called "DispatchResponse" which accepts a string which is a concept name +// Thus, a game entity can fire this input on another entity with a concept string and a criteria set will +// be generated and searched against the entities current response system rule set. +// Right now only the speaker entity and NPC_Talker derived NPCs have any response rules loaded +// In addition, map placed entities have up to three "context" keypairs that can be specified. +// They take the form: "key:value" (key, single colon separator, value) +// When an entity with any such context keypairs is asked to dispatch a response, the keypairs are added to the +// criteria set passed to the rule system. Thus, map placed entities and triggers can specify their +// own context keypairs and these can be hooked up to response rules to do map-specific and appropriate +// responses +// In addition, entity I/O can be used to add, remove and clear any such context keypairs via the +// AddContext, RemoveContext, and ClearContext input functions. +// AddContext takes a keypair of the "key:value" format, while RemoveContext take just the "key" +// ClearContext removes all context keypairs +// The game .dll code can enumerate context keypairs and change them via code based methods +// +// The player and the world have their context added with the string player or world as a prefix, e.g.: +// "playerkey:value" or "worldkey:value" to differentiate world/player context from the context of the +// responding entity. + +criterion "Custom" "Concept" "TLK_DOTA_CUSTOM" required +criterion "Followup_Positive" "Concept" "TLK_DOTA_FOLLOWUP_POSITIVE" required +criterion "Followup_Negative" "Concept" "TLK_DOTA_FOLLOWUP_NEGATIVE" required +criterion "Followup_Negative_Ongoing" "Concept" "TLK_DOTA_FOLLOWUP_NEGATIVE_ONGOING" required +criterion "Followup_Generic" "Concept" "TLK_DOTA_FOLLOWUP_GENERIC" required + +criterion "Chance_1%" "randomnum" "99" required +criterion "Chance_2%" "randomnum" ">=97,<=98" required +criterion "Chance_3%" "randomnum" ">=94,<=96" required +criterion "Chance_5%" "randomnum" ">=89,<=93" required +criterion "Chance_10%" "randomnum" ">=79,<=88" required +criterion "Chance_12%" "randomnum" "<=12" required +criterion "Chance_15%" "randomnum" ">=64,<=78" required +criterion "Chance_20%" "randomnum" "<=20" required +criterion "Chance_25%" "randomnum" "<=25" required +criterion "Chance_30%" "randomnum" "<=30" required +criterion "Chance_35%" "randomnum" "<=35" required +criterion "Chance_40%" "randomnum" "<=40" required +criterion "Chance_45%" "randomnum" "<=45" required +criterion "Chance_50%" "randomnum" "<=50" required +criterion "Chance_55%" "randomnum" "<=55" required +criterion "Chance_60%" "randomnum" "<=60" required +criterion "Chance_65%" "randomnum" "<=65" required +criterion "Chance_70%" "randomnum" "<=70" required +criterion "Chance_75%" "randomnum" "<=75" required + +#include "talker/response_rules_announcer_aghanim.txt" +#include "talker/response_rules_aghanim.txt" diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ability_absolute_no_cc.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ability_absolute_no_cc.lua new file mode 100755 index 0000000..e39e7fb --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ability_absolute_no_cc.lua @@ -0,0 +1,11 @@ +ability_absolute_no_cc = class( {} ) + +LinkLuaModifier( "modifier_absolute_no_cc", "modifiers/modifier_absolute_no_cc", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function ability_absolute_no_cc:GetIntrinsicModifierName() + return "modifier_absolute_no_cc" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ability_ascension.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ability_ascension.lua new file mode 100755 index 0000000..36503ef --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ability_ascension.lua @@ -0,0 +1,11 @@ +ability_ascension = class( {} ) + +LinkLuaModifier( "modifier_ascension", "modifiers/modifier_ascension", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function ability_ascension:GetIntrinsicModifierName() + return "modifier_ascension" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ability_attack_speed_unslowable.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ability_attack_speed_unslowable.lua new file mode 100755 index 0000000..83ef6a9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ability_attack_speed_unslowable.lua @@ -0,0 +1,9 @@ +ability_attack_speed_unslowable = class( {} ) + +LinkLuaModifier( "modifier_attack_speed_unslowable", "modifiers/modifier_attack_speed_unslowable", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function ability_attack_speed_unslowable:GetIntrinsicModifierName() + return "modifier_attack_speed_unslowable" +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ability_move_speed_unslowable.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ability_move_speed_unslowable.lua new file mode 100755 index 0000000..563c57b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ability_move_speed_unslowable.lua @@ -0,0 +1,9 @@ +ability_move_speed_unslowable = class( {} ) + +LinkLuaModifier( "modifier_move_speed_unslowable", "modifiers/modifier_move_speed_unslowable", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function ability_move_speed_unslowable:GetIntrinsicModifierName() + return "modifier_move_speed_unslowable" +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/aggro_on_damage.lua b/aghanim_singleplayer/scripts/vscripts/abilities/aggro_on_damage.lua new file mode 100755 index 0000000..525bfd0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/aggro_on_damage.lua @@ -0,0 +1,8 @@ +aggro_on_damage = class({}) +LinkLuaModifier( "modifier_aggro_on_damage", "modifiers/modifier_aggro_on_damage", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function aggro_on_damage:GetIntrinsicModifierName() + return "modifier_aggro_on_damage" +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_armor.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_armor.lua new file mode 100755 index 0000000..cc8e2ec --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_armor.lua @@ -0,0 +1,11 @@ +ascension_armor = class( {} ) + +LinkLuaModifier( "modifier_ascension_armor", "modifiers/modifier_ascension_armor", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function ascension_armor:GetIntrinsicModifierName() + return "modifier_ascension_armor" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_armor_sapping.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_armor_sapping.lua new file mode 100755 index 0000000..fa33810 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_armor_sapping.lua @@ -0,0 +1,70 @@ + +ascension_armor_sapping = class({}) +LinkLuaModifier( "modifier_ascension_armor_sapping", "modifiers/modifier_ascension_armor_sapping", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_ascension_armor_sapping_display", "modifiers/modifier_ascension_armor_sapping_display", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_ascension_armor_sapping_instance", "modifiers/modifier_ascension_armor_sapping_instance", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function ascension_armor_sapping:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_undying/undying_decay_strength_xfer.vpcf", context ) + PrecacheResource( "particle", "particles/ascension/ascension_armor_sapping_target.vpcf", context ) + PrecacheResource( "particle", "particles/items2_fx/medallion_of_courage.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function ascension_armor_sapping:Spawn() + -- So the modifier can be seen + if IsServer() == true then + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_ascension_armor_sapping_display", nil ) + end +end + +-------------------------------------------------------------------------------- + +function ascension_armor_sapping:OnSpellStart() + + if not IsServer() then + return + end + + local hTarget = self:GetCursorTarget() + if hTarget == nil then + return + end + + local nSapFX = ParticleManager:CreateParticle( "particles/units/heroes/hero_undying/undying_decay_strength_xfer.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( nSapFX, 0, hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", hTarget:GetAbsOrigin(), true )-- CP0: Target + ParticleManager:SetParticleControlEnt( nSapFX, 1, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetAbsOrigin(), true )-- CP1: Caster + ParticleManager:SetParticleControlEnt( nSapFX, 2, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetAbsOrigin(), true )-- CP2: Caster's hand + ParticleManager:ReleaseParticleIndex( nSapFX ); + + local nSapTargetFX = ParticleManager:CreateParticle( "particles/ascension/ascension_armor_sapping_target.vpcf", PATTACH_ABSORIGIN_FOLLOW, hTarget ) + ParticleManager:ReleaseParticleIndex( nSapTargetFX ); + + EmitSoundOn( "Ability.ArmorSapping.Target", hTarget ); + + local nDuration = self:GetSpecialValueFor( "duration" ) + + local kv = + { + duration = nDuration + } + local hDebuff = hTarget:AddNewModifier( self:GetCaster(), self, "modifier_ascension_armor_sapping_instance", kv ) + if hDebuff == nil then + return + end + + -- add debuff counter + local hDebuffCounter = hTarget:FindModifierByName( "modifier_ascension_armor_sapping" ) + if hDebuffCounter == nil then + hDebuffCounter = hTarget:AddNewModifier( self:GetCaster(), self, "modifier_ascension_armor_sapping", nil ) + end + + if hDebuffCounter ~= nil then + hDebuffCounter:SetDuration( nDuration, true ); + hDebuffCounter:SetStackCount( hDebuffCounter:GetStackCount() + 1 ) + end + +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_attack_speed.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_attack_speed.lua new file mode 100755 index 0000000..497b15e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_attack_speed.lua @@ -0,0 +1,23 @@ +ascension_attack_speed = class( {} ) + +LinkLuaModifier( "modifier_ascension_attack_speed", "modifiers/modifier_ascension_attack_speed", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function ascension_attack_speed:Precache( context ) + PrecacheResource( "particle", "particles/items2_fx/mask_of_madness.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function ascension_attack_speed:OnSpellStart() + + if not IsServer() then + return + end + + local flDuration = self:GetSpecialValueFor( "duration" ) + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_ascension_attack_speed", { duration = flDuration } ) + +end + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_bomb.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_bomb.lua new file mode 100755 index 0000000..d315259 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_bomb.lua @@ -0,0 +1,28 @@ + +ascension_bomb = class({}) +LinkLuaModifier( "modifier_bomber_death_explosion", "modifiers/creatures/modifier_bomber_death_explosion", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function ascension_bomb:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_techies/techies_remote_mines_detonate.vpcf", context ) + PrecacheResource( "particle", "particles/dark_moon/darkmoon_calldown_marker_ring.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_gyrocopter/gyro_guided_missile_target.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function ascension_bomb:OnSpellStart() + + if not IsServer() then + return + end + + local hTarget = self:GetCursorTarget() + if hTarget == nil then + return + end + + hTarget:AddNewModifier( hTarget, self, "modifier_bomber_death_explosion", {} ) + +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_chilling_touch.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_chilling_touch.lua new file mode 100755 index 0000000..48c49a2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_chilling_touch.lua @@ -0,0 +1,18 @@ +ascension_chilling_touch = class( {} ) + +LinkLuaModifier( "modifier_ascension_chilling_touch", "modifiers/modifier_ascension_chilling_touch", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function ascension_chilling_touch:Precache( context ) + PrecacheResource( "particle", "particles/generic_gameplay/generic_slowed_cold.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_frost.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function ascension_chilling_touch:GetIntrinsicModifierName() + return "modifier_ascension_chilling_touch" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_crit.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_crit.lua new file mode 100755 index 0000000..a57ec41 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_crit.lua @@ -0,0 +1,19 @@ +ascension_crit = class( {} ) + +LinkLuaModifier( "modifier_ascension_crit", "modifiers/modifier_ascension_crit", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function ascension_crit:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function ascension_crit:GetIntrinsicModifierName() + return "modifier_ascension_crit" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_damage.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_damage.lua new file mode 100755 index 0000000..67911ec --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_damage.lua @@ -0,0 +1,11 @@ +ascension_damage = class( {} ) + +LinkLuaModifier( "modifier_ascension_damage", "modifiers/modifier_ascension_damage", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function ascension_damage:GetIntrinsicModifierName() + return "modifier_ascension_damage" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_drunken.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_drunken.lua new file mode 100755 index 0000000..de7baba --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_drunken.lua @@ -0,0 +1,40 @@ +ascension_drunken = class( {} ) + +LinkLuaModifier( "modifier_ascension_drunken_display", "modifiers/modifier_ascension_drunken_display", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function ascension_drunken:Precache( hContext ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_brewmaster.vsndevts", hContext ) + PrecacheResource( "particle", "particles/status_fx/status_effect_drunken_brawler.vpcf", hContext ) + PrecacheResource( "particle", "particles/units/heroes/hero_brewmaster/brewmaster_drunkenbrawler_evade.vpcf", hContext ) + PrecacheResource( "particle", "particles/units/heroes/hero_brewmaster/brewmaster_drunkenbrawler_crit.vpcf", hContext ) +end + +-------------------------------------------------------------------------------- + +function ascension_drunken:Spawn() + -- So the modifier can be seen + if IsServer() == true then + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_ascension_drunken_display", nil ) + end +end + + +-------------------------------------------------------------------------------- + +function ascension_drunken:OnSpellStart() + + if not IsServer() then + return + end + + --print( "casting drunken ") + + EmitSoundOn( "Hero_Brewmaster.Brawler.Cast", self:GetCaster() ) + + local flDuration = self:GetSpecialValueFor( "duration" ) + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_brewmaster_drunken_brawler", { duration = flDuration } ) + +end + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_extra_fast.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_extra_fast.lua new file mode 100755 index 0000000..7703638 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_extra_fast.lua @@ -0,0 +1,18 @@ +ascension_extra_fast = class( {} ) + +LinkLuaModifier( "modifier_ascension_extra_fast", "modifiers/modifier_ascension_extra_fast", LUA_MODIFIER_MOTION_NONE ) + + +function ascension_extra_fast:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_dark_seer/dark_seer_surge.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function ascension_extra_fast:GetIntrinsicModifierName() + return "modifier_ascension_extra_fast" +end + +-------------------------------------------------------------------------------- + + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_flicker.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_flicker.lua new file mode 100755 index 0000000..b2d762a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_flicker.lua @@ -0,0 +1,55 @@ +ascension_flicker = class( {} ) + +LinkLuaModifier( "modifier_ascension_flicker_display", "modifiers/modifier_ascension_flicker_display", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function ascension_flicker:Precache( context ) + PrecacheResource( "particle", "particles/items_fx/blink_dagger_start.vpcf", context ) + PrecacheResource( "particle", "particles/items_fx/blink_dagger_end.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function ascension_flicker:Spawn() + -- So the modifier can be seen + if IsServer() == true then + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_ascension_flicker_display", nil ) + end +end + +-------------------------------------------------------------------------------- + +function ascension_flicker:OnSpellStart() + + if not IsServer() then + return + end + + local range = self:GetSpecialValueFor( "range" ) + local nAttempts = 0 + local vEndPos = self:GetCaster():GetAbsOrigin() + RandomVector( 1 ) * range; + while ( ( not GridNav:CanFindPath( self:GetCaster():GetOrigin(), vEndPos ) ) and ( nAttempts < 5 ) ) do + vEndPos = self:GetCaster():GetOrigin() + RandomVector( 1 ) * range; + nAttempts = nAttempts + 1 + + if nAttempts >= 5 then + vEndPos = self:GetCaster():GetAbsOrigin() + end + end + + + + local nFXStart = ParticleManager:CreateParticle( "particles/items_fx/blink_dagger_start.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXStart, 0, self:GetCaster():GetAbsOrigin() ) + ParticleManager:ReleaseParticleIndex( nFXStart ) + + FindClearSpaceForUnit( self:GetCaster(), vEndPos, true ) + ProjectileManager:ProjectileDodge( self:GetCaster() ) + EmitSoundOn( "DOTA_Item.BlinkDagger.Activate", self:GetCaster() ) + self:GetCaster():Purge( false, true, false, false, false ) + + local nFXEnd = ParticleManager:CreateParticle( "particles/items_fx/blink_dagger_end.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:ReleaseParticleIndex( nFXEnd ) +end + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_heal_suppression.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_heal_suppression.lua new file mode 100755 index 0000000..49feb0c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_heal_suppression.lua @@ -0,0 +1,18 @@ + +ascension_heal_suppression = class({}) +LinkLuaModifier( "modifier_ascension_heal_suppression", "modifiers/modifier_ascension_heal_suppression", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_ascension_heal_suppression_aura", "modifiers/modifier_ascension_heal_suppression_aura", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function ascension_heal_suppression:Precache( context ) + PrecacheResource( "particle", "particles/items4_fx/spirit_vessel_damage.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_necrolyte_spirit.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_necrolyte/necrolyte_spirit.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function ascension_heal_suppression:GetIntrinsicModifierName() + return "modifier_ascension_heal_suppression_aura" +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_magic_immunity.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_magic_immunity.lua new file mode 100755 index 0000000..4331c44 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_magic_immunity.lua @@ -0,0 +1,24 @@ +ascension_magic_immunity = class( {} ) + +LinkLuaModifier( "modifier_ascension_magic_immunity", "modifiers/modifier_ascension_magic_immunity", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function ascension_magic_immunity:Precache( hContext ) + PrecacheResource( "particle", "particles/items_fx/black_king_bar_avatar.vpcf", hContext ) + PrecacheResource( "particle", "particles/status_fx/status_effect_avatar.vpcf", hContext ) +end + +-------------------------------------------------------------------------------- + +function ascension_magic_immunity:OnSpellStart() + + if not IsServer() then + return + end + + local flDuration = self:GetSpecialValueFor( "duration" ) + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_ascension_magic_immunity", { duration = flDuration } ) + +end + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_magic_resist.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_magic_resist.lua new file mode 100755 index 0000000..8f7a833 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_magic_resist.lua @@ -0,0 +1,11 @@ +ascension_magic_resist = class( {} ) + +LinkLuaModifier( "modifier_ascension_magic_resist", "modifiers/modifier_ascension_magic_resist", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function ascension_magic_resist:GetIntrinsicModifierName() + return "modifier_ascension_magic_resist" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/ascension_vampiric.lua b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_vampiric.lua new file mode 100755 index 0000000..fc8c039 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/ascension_vampiric.lua @@ -0,0 +1,28 @@ +ascension_vampiric = class( {} ) + +LinkLuaModifier( "modifier_ascension_vampiric", "modifiers/modifier_ascension_vampiric", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function ascension_vampiric:Precache( context ) + PrecacheResource( "particle", "particles/items2_fx/satanic_buff.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_life_stealer_rage.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_life_stealer/life_stealer_rage.vpcf", context ) + PrecacheResource( "particle", "particles/items3_fx/octarine_core_lifesteal.vpcf", context ) + PrecacheResource( "particle", "particles/generic_gameplay/generic_lifesteal.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function ascension_vampiric:OnSpellStart() + + if not IsServer() then + return + end + + EmitSoundOn( "DOTA_Item.Satanic.Activate", self:GetCaster() ) + + local flDuration = self:GetSpecialValueFor( "duration" ) + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_ascension_vampiric", { duration = flDuration } ) +end + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/breakable_container.lua b/aghanim_singleplayer/scripts/vscripts/abilities/breakable_container.lua new file mode 100755 index 0000000..21887b1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/breakable_container.lua @@ -0,0 +1,11 @@ + +breakable_container = class({}) +LinkLuaModifier( "modifier_breakable_container", "modifiers/modifier_breakable_container", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function breakable_container:GetIntrinsicModifierName() + return "modifier_breakable_container" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_announcer_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_announcer_passive.lua new file mode 100755 index 0000000..dfb380c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_announcer_passive.lua @@ -0,0 +1,13 @@ + +aghanim_announcer_passive = class({}) + +LinkLuaModifier( "modifier_aghanim_announcer_passive", "modifiers/creatures/modifier_aghanim_announcer_passive", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function aghanim_announcer_passive:GetIntrinsicModifierName() + return "modifier_aghanim_announcer_passive" +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_blink.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_blink.lua new file mode 100755 index 0000000..86e679c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_blink.lua @@ -0,0 +1,75 @@ +aghanim_blink = class{} + +---------------------------------------------------------------------------------------- + +function aghanim_blink:Precache( context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_preimage.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_faceless_void.vsndevts", context ) +end + +---------------------------------------------------------------------------------------- + +function aghanim_blink:OnSpellStart() + if IsServer() == false then + return + end + + local vPos = self:GetCursorPosition() + local vDirection = vPos - self:GetCaster():GetOrigin() + local flDist = vDirection:Length2D() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + --local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_preimage.vpcf", PATTACH_CUSTOMORIGIN, nil )-- + --ParticleManager:SetParticleControl( nFXIndex, 0, self:GetCaster():GetAbsOrigin() ) + --ParticleManager:SetParticleControl( nFXIndex, 1, vPos ) + --ParticleManager:SetParticleControlEnt( nFXIndex, 2, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetAbsOrigin(), true ) + --ParticleManager:SetParticleFoWProperties( nFXIndex, 0, 2, 64.0 ) + --ParticleManager:ReleaseParticleIndex( nFXIndex ) + + self.vStartLocation = self:GetCaster():GetAbsOrigin() + + local info = + { + Ability = self, + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = 0, + fEndRadius = 0, + vVelocity = vDirection * flDist, + fDistance = flDist, + Source = self:GetCaster(), + --iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_NONE, + --iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING, + } + + ProjectileManager:CreateLinearProjectile( info ) + EmitSoundOn( "Hero_FacelessVoid.TimeWalk", self:GetCaster() ) +end + +---------------------------------------------------------------------------------------- + +function aghanim_blink:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + local vDirection = vLocation - self:GetCaster():GetAbsOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + EmitSoundOn( "Hero_FacelessVoid.TimeWalk", self:GetCaster() ) + + FindClearSpaceForUnit( self:GetCaster(), vLocation, true ) + --self:GetCaster():FaceTowards( self:GetCaster().vHomePosition ) + + ProjectileManager:ProjectileDodge( self:GetCaster() ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_preimage.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self.vStartLocation ) + ParticleManager:SetParticleControl( nFXIndex, 1, self:GetCaster():GetAbsOrigin() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 2, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self.vStartLocation, true ) + ParticleManager:SetParticleFoWProperties( nFXIndex, 0, 2, 64.0 ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + + return true +end + +---------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_crystal_attack.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_crystal_attack.lua new file mode 100755 index 0000000..ace0cc3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_crystal_attack.lua @@ -0,0 +1,170 @@ +aghanim_crystal_attack = class({}) + +_G.CRYSTAL_ATTACKS_PHASE = {} +_G.CRYSTAL_ATTACKS_PHASE[1] = 0 +_G.CRYSTAL_ATTACKS_PHASE[2] = 1 +_G.CRYSTAL_ATTACKS_PHASE[3] = 2 +_G.CRYSTAL_ATTACKS_PHASE[4] = 0 +_G.CRYSTAL_ATTACKS_PHASE[5] = 1 +_G.CRYSTAL_ATTACKS_PHASE[6] = 2 + + +_G.CRYSTAL_ATTACKS_COOLDOWN = 10.0 + + +LinkLuaModifier( "modifier_aghanim_crystal_attack_active", "modifiers/creatures/modifier_aghanim_crystal_attack_active", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_aghanim_crystal_attack_debuff", "modifiers/creatures/modifier_aghanim_crystal_attack_debuff", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function aghanim_crystal_attack:Precache( context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_crystal_attack.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_crystal_attack_telegraph.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_crystal_attack_impact.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_iceblast.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ancient_apparition/ancient_apparition_ice_blast_debuff.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_winter_wyvern.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_mars.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_leshrac.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_lich.vsndevts", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_self_dmg.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_pulse_nova.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_pulse_ambient.vpcf", context ) + self.nPhase = 1 +end + +-------------------------------------------------------------------------------- + +function aghanim_crystal_attack:OnSpellStart() + if IsServer() then + if self.nPhase == 1 then + self.hActiveBuff = self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_aghanim_crystal_attack_active", {} ) + end + + self.attack_time = self:GetSpecialValueFor( "attack_time" ) + self.attack_damage = self:GetSpecialValueFor( "attack_damage" ) + self.explosion_radius = self:GetSpecialValueFor( "explosion_radius" ) + self.pulse_radius = self:GetSpecialValueFor( "pulse_radius" ) + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetAbsOrigin(), nil, 10000, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_FARTHEST, false ) + + local nCrystalsLeft = CRYSTAL_ATTACKS_PHASE[ self.nPhase ] + 1 + for _,enemy in pairs( enemies ) do + local flDist = ( enemy:GetAbsOrigin() - self:GetCaster():GetAbsOrigin() ):Length2D() + if flDist > self.pulse_radius then + self:LaunchCrystals( enemy:GetAbsOrigin() + ( enemy:GetForwardVector() * self.pulse_radius * 0.5 ) ) + nCrystalsLeft = nCrystalsLeft - 1 + if nCrystalsLeft == 0 then + break + end + end + end + + self.nPhase = self.nPhase + 1 + if self.hActiveBuff then + self.hActiveBuff:Pulse() + end + + if self.nPhase > 6 then + self.nPhase = 1 + self:StartCooldown( CRYSTAL_ATTACKS_COOLDOWN ) + self.hActiveBuff:Destroy() + end + end +end + +-------------------------------------------------------------------------------- + +function aghanim_crystal_attack:LaunchCrystals( vPos ) + local vDirection = vPos - self:GetCaster():GetAttachmentOrigin( self:GetCaster():ScriptLookupAttachment( "attach_staff_fx" ) ) + local flDist2d = vDirection:Length2D() + local flDist = vDirection:Length() + vDirection = vDirection:Normalized() + vDirection.z = 0.0 + + local flSpeed = flDist / self.attack_time + + local info = + { + EffectName = "particles/creatures/aghanim/aghanim_crystal_attack.vpcf", + Ability = self, + vSpawnOrigin = self:GetCaster():GetAttachmentOrigin( self:GetCaster():ScriptLookupAttachment( "attach_staff_fx" ) ), + fStartRadius = 0, + fEndRadius = 0, + vVelocity = vDirection * flSpeed, + fDistance = flDist2d, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + } + + ProjectileManager:CreateLinearProjectile( info ) + EmitSoundOn( "Hero_Winter_Wyvern.SplinterBlast.Splinter", self:GetCaster() ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_crystal_attack_telegraph.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, vPos ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.explosion_radius, self.attack_time, self.attack_time ) ) + ParticleManager:SetParticleControl( nFXIndex, 15, Vector( 214, 236, 239 ) ) + ParticleManager:SetParticleControl( nFXIndex, 16, Vector( 1, 0, 0 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) +end + +-------------------------------------------------------------------------------- + +function aghanim_crystal_attack:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + if hTarget ~= nil then + return false + end + + local knockback_duration = self:GetSpecialValueFor( "knockback_duration" ) + local knockback_distance = self:GetSpecialValueFor( "knockback_distance" ) + local knockback_height = self:GetSpecialValueFor( "knockback_height" ) + local debuff_duration = self:GetSpecialValueFor( "debuff_duration" ) + + local vPosOnGround = GetGroundPosition( vLocation, self:GetCaster() ) + + EmitSoundOnLocationWithCaster( vPosOnGround, "Hero_Winter_Wyvern.SplinterBlast.Target", self:GetCaster() ) + + local nDetonationFX = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_crystal_attack_impact.vpcf", PATTACH_WORLDORIGIN, nil ) + ParticleManager:SetParticleControl( nDetonationFX, 0, vPosOnGround ) + ParticleManager:SetParticleControl( nDetonationFX, 1, Vector( self.explosion_radius, self.explosion_radius, self.explosion_radius ) ) + ParticleManager:ReleaseParticleIndex( nDetonationFX ) + + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), vPosOnGround, nil, self.explosion_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and enemy:IsMagicImmune() == false then + local kv = + { + center_x = vPosOnGround.x, + center_y = vPosOnGround.y, + center_z = vPosOnGround.z, + should_stun = true, + duration = knockback_duration, + knockback_duration = knockback_duration, + knockback_distance = knockback_distance, + knockback_height = knockback_height, + } + + enemy:AddNewModifier( self:GetCaster(), self, "modifier_knockback", kv ) + --enemy:AddNewModifier( self:GetCaster(), self, "modifier_aghanim_crystal_attack_debuff", { duration = debuff_duration } ) + + local damage = { + victim = enemy, + attacker = self:GetCaster(), + damage = self.attack_damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self + } + + ApplyDamage( damage ) + end + end + end + + return true +end + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_passive.lua new file mode 100755 index 0000000..a0d4112 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_passive.lua @@ -0,0 +1,17 @@ +aghanim_passive = class( {} ) + +LinkLuaModifier( "modifier_aghanim_passive", "modifiers/creatures/modifier_aghanim_passive", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function aghanim_passive:Precache( context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_outro_linger.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function aghanim_passive:GetIntrinsicModifierName() + return "modifier_aghanim_passive" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_shard_attack.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_shard_attack.lua new file mode 100755 index 0000000..4d1b748 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_shard_attack.lua @@ -0,0 +1,326 @@ +aghanim_shard_attack = class( {} ) + +LinkLuaModifier( "modifier_aghanim_shard_attack", "modifiers/creatures/modifier_aghanim_shard_attack", LUA_MODIFIER_MOTION_NONE ) + +_G.PATTERN_SPIRAL = 0 +_G.PATTERN_REBOUND = 1 +_G.PATTERN_JITTER = 2 +_G.CAST_ESCLATION_PCT = 17 + +_G.FAST_COLOR = Vector( 0, 0, 255 ) +_G.SLOW_COLOR = Vector( 350, 0, 0 ) -- looks weird, but it's because it can't go to 0 speed +_G.HEAL_COLOR = Vector( 0, 255, 0 ) + +---------------------------------------------------------------------------------------- + +function aghanim_shard_attack:Precache( context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_shard_channel.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_shard_proj.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_lich/lich_frost_nova.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_dark_willow.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_silencer.vsndevts", context ) + + self.nPattern = PATTERN_SPIRAL + self.nCastCount = 0 + self.Projectiles = {} +end + +---------------------------------------------------------------------------------------- + +function aghanim_shard_attack:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function aghanim_shard_attack:OnAbilityPhaseStart() + if IsServer() then + StartSoundEventFromPositionReliable( "Aghanim.ShardAttack.Channel", self:GetCaster():GetAbsOrigin() ) + self.nChannelFX = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_shard_channel.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + end + return true +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:OnChannelThink( flInterval ) + if IsServer() then + if self.nPattern == PATTERN_SPIRAL then + self:ThinkSpirals( flInterval ) + end + end +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:OnChannelFinish( bInterrupted ) + if IsServer() then + StopSoundOn( "Aghanim.ShardAttack.Loop", self:GetCaster() ) + ParticleManager:DestroyParticle( self.nChannelFX, false ) + self.nCastCount = self.nCastCount + 1 + end +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:OnSpellStart() + if IsServer() then + EmitSoundOn( "Aghanim.ShardAttack.Loop", self:GetCaster() ) + if self.nPattern == PATTERN_SPIRAL then + self:BeginSpirals() + end + if self.nPattern == PATTERN_REBOUND then + self:BeginRebound() + end + if self.nPattern == PATTERN_JITTER then + self:BeginJitter() + end + end +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:BeginSpirals() + self.Projectiles = {} + + self.spiral_projectiles = self:GetSpecialValueFor( "spiral_projectiles" ) + self.spiral_projectile_waves = self:GetSpecialValueFor( "spiral_projectile_waves" ) + self.spiral_projectile_speed = self:GetSpecialValueFor( "spiral_projectile_speed" ) + + self.spiral_projectiles = math.min( self.spiral_projectiles * 2, math.floor( self.spiral_projectiles + ( self.spiral_projectiles * CAST_ESCLATION_PCT * self.nCastCount / 100 ) ) ) + self.spiral_projectile_waves = math.min( self.spiral_projectile_waves * 2, math.floor( self.spiral_projectile_waves + ( self.spiral_projectile_waves * CAST_ESCLATION_PCT * self.nCastCount / 100 ) ) ) + self.spiral_projectile_speed = math.min( self.spiral_projectile_speed * 2, math.floor( self.spiral_projectile_speed + ( self.spiral_projectile_speed * CAST_ESCLATION_PCT * self.nCastCount / 100 ) ) ) + + self.spiral_projectile_rotation_speed = self:GetSpecialValueFor( "spiral_projectile_rotation_speed" ) + self.spiral_projectile_width = self:GetSpecialValueFor( "spiral_projectile_width" ) + self.spiral_projectile_damage = self:GetSpecialValueFor( "spiral_projectile_damage" ) + self.spiral_projectile_speed_change_interval = self:GetSpecialValueFor( "spiral_projectile_speed_change_interval" ) + + self.flSpiralYaw = RandomInt( 0, 360 ) + self.flSpiralWaveInterval = self:GetChannelTime() / self.spiral_projectile_waves + self.flSpiralNextWaveTime = GameRules:GetGameTime() + self.flSpiralYawStep = 360 / self.spiral_projectiles + self.bReverse = false + + if RandomInt( 0, 1 ) == 1 then + self.bReverse = true + end + + self.flSpiralSpeedToggleTime = GameRules:GetGameTime() + self.spiral_projectile_speed_change_interval + self.bSpiralSpeedingUp = true + self.flCurSpeed = self.spiral_projectile_speed + self.nToggleCount = 0 +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:ThinkSpirals( flInterval ) + local flNow = GameRules:GetGameTime() + if flNow > self.flSpiralSpeedToggleTime then + self.flSpiralSpeedToggleTime = flNow + self.spiral_projectile_speed_change_interval + self.bSpiralSpeedingUp = not self.bSpiralSpeedingUp + self.nToggleCount = self.nToggleCount + 1 + if self.nToggleCount == 2 then + self.bReverse = not self.bReverse + self.nToggleCount = 0 + end + end + + local flRate = ( self.spiral_projectile_speed / self.spiral_projectile_speed_change_interval ) * flInterval + if self.bSpiralSpeedingUp then + self.flCurSpeed = math.min( self.spiral_projectile_speed, self.flCurSpeed + flRate ) + else + self.flCurSpeed = math.max( 100, self.flCurSpeed - flRate ) + end + + if self.flSpiralNextWaveTime > flNow then + return + end + + self.flSpiralNextWaveTime = flNow + self.flSpiralWaveInterval + EmitSoundOn( "Aghanim.ShardAttack.Wave", self:GetCaster() ) + + for i=1,self.spiral_projectiles do + local Angle = QAngle( 0, self.flSpiralYaw, 0 ) + local vVelocity = ( RotatePosition( Vector( 0, 0, 0 ), Angle, Vector( 1, 0, 0 ) ) ) * self.flCurSpeed + local nProjectileHandle = self:LaunchCrystals( vVelocity, 5000, self.spiral_projectile_width ) + + local ProjectileInfo = {} + ProjectileInfo.nHandle = nProjectileHandle + ProjectileInfo.flYaw = self.flSpiralYaw + ProjectileInfo.nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_shard_proj.vpcf", PATTACH_CUSTOMORIGIN, nil ) + + local vLoc = self:GetCaster():GetAbsOrigin() + vLoc.z = GetGroundHeight( vLoc, self:GetCaster() ) + 50 + ProjectileInfo.attachEnt = CreateUnitByName( "npc_dota_wisp_spirit", vLoc, false, self:GetCaster(), self:GetCaster(), DOTA_TEAM_GOODGUYS ) + if ProjectileInfo.attachEnt ~= nil then + ProjectileInfo.attachEnt:AddNewModifier( self:GetCaster(), self, "modifier_wisp_spirit_invulnerable", {} ) + end + ParticleManager:SetParticleControlEnt( ProjectileInfo.nFXIndex, 0, ProjectileInfo.attachEnt, PATTACH_ABSORIGIN_FOLLOW, nil, vLoc, false ) + ParticleManager:SetParticleControl( ProjectileInfo.nFXIndex, 1, Vector( self.spiral_projectile_width, self.spiral_projectile_width, self.spiral_projectile_width ) ) + ParticleManager:SetParticleControl( ProjectileInfo.nFXIndex, 2, Vector( 6, 6, 6 ) ) + + --local flSpeedColorFactor = self.flCurSpeed / self.spiral_projectile_speed + --local vColor = LerpVectors( SLOW_COLOR, FAST_COLOR, flSpeedColorFactor ) + --ParticleManager:SetParticleControl( ProjectileInfo.nFXIndex, 15, vColor ) + + table.insert( self.Projectiles, ProjectileInfo ) + + if self.bReverse then + self.flSpiralYaw = self.flSpiralYaw - self.flSpiralYawStep + else + self.flSpiralYaw = self.flSpiralYaw + self.flSpiralYawStep + end + end + + self.flSpiralYaw = self.flSpiralYaw + self.flSpiralYawStep * 0.5 +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:ThinkSpiralProjectile( info ) + if self:IsChanneling() then + local flNewYaw = 0 + if self.bReverse then + flNewYaw = info.flYaw - self.spiral_projectile_rotation_speed + else + flNewYaw = info.flYaw + self.spiral_projectile_rotation_speed + end + + info.flYaw = flNewYaw + + local Angle = QAngle( 0, flNewYaw, 0 ) + local vNewVelocity = ( RotatePosition( Vector( 0, 0, 0 ), Angle, Vector( 1, 0, 0 ) ) ) * self.flCurSpeed + ProjectileManager:UpdateLinearProjectileDirection( info.nHandle, vNewVelocity, 5000 ) + end + + + local vLoc = ProjectileManager:GetLinearProjectileLocation( info.nHandle ) + vLoc.z = GetGroundHeight( vLoc, self:GetCaster() ) + 50 + info.attachEnt:SetAbsOrigin( vLoc ) + --ParticleManager:SetParticleControl( info.nFXIndex, 0, vLoc ) + + --local flSpeedColorFactor = self.flCurSpeed / self.spiral_projectile_speed +--local vColor = LerpVectors( SLOW_COLOR, FAST_COLOR, flSpeedColorFactor ) + --ParticleManager:SetParticleControl( info.nFXIndex, 15, vColor ) + + --rint( "setting new velocity on spiral projectile" ) +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:BeginRebound() +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:ThinkRebound( flInterval ) +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:ThinkReboundProjectile( info ) +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:BeginJitter() +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:ThinkJitter( flInterval ) +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:ThinkJitterProjectile( info ) +end + +-------------------------------------------------------------------------------- + +function aghanim_shard_attack:LaunchCrystals( vVel, flDist, flRadius ) + local info = + { + Ability = self, + vSpawnOrigin = self:GetCaster():GetAbsOrigin(), + fStartRadius = flRadius, + fEndRadius = flRadius, + vVelocity = vVel, + fDistance = flDist, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + fExpireTime = GameRules:GetGameTime() + 10.0, + } + + return ProjectileManager:CreateLinearProjectile( info ) +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:OnProjectileThinkHandle( iProjectileHandle ) + if IsServer() then + local info = nil + for _,v in pairs ( self.Projectiles ) do + if v.nHandle == iProjectileHandle then + info = v + break + end + end + + if info == nil then + return + end + + if self.nPattern == PATTERN_SPIRAL then + self:ThinkSpiralProjectile( info ) + end + end +end + +------------------------------------------------------------------------------- + +function aghanim_shard_attack:OnProjectileHitHandle( hTarget, vLocation, iProjectileHandle ) + if IsServer() then + local info = nil + for _,v in pairs ( self.Projectiles ) do + if v.nHandle == iProjectileHandle then + info = v + break + end + end + + if info == nil then + return false + end + + if self.nPattern == PATTERN_SPIRAL then + ParticleManager:DestroyParticle( info.nFXIndex, false ) + UTIL_Remove( info.attachEnt ) + info.attachEnt = nil + end + + if hTarget and not hTarget:IsMagicImmune() and not hTarget:IsInvulnerable() then + local damage = + { + victim = hTarget, + attacker = self:GetCaster(), + damage = self.spiral_projectile_damage, + damage_type = DAMAGE_TYPE_PURE, + ability = self, + } + + ApplyDamage( damage ) + + EmitSoundOn( "Hero_Silencer.LastWord.Damage", hTarget ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_lich/lich_frost_nova.vpcf", PATTACH_WORLDORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, hTarget:GetAbsOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.spiral_projectile_width, self.spiral_projectile_width, self.spiral_projectile_width ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + + return true +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_spell_swap.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_spell_swap.lua new file mode 100755 index 0000000..280bc76 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_spell_swap.lua @@ -0,0 +1,146 @@ + +aghanim_spell_swap = class({}) + +LinkLuaModifier( "modifier_aghanim_spell_swap", "modifiers/creatures/modifier_aghanim_spell_swap", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_aghanim_spell_swap_crystal", "modifiers/creatures/modifier_aghanim_spell_swap_crystal", LUA_MODIFIER_MOTION_BOTH ) + +---------------------------------------------------------------------------------------- + +function aghanim_spell_swap:Precache( context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_beam_channel.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_spell_swap_beam.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_wisp/wisp_tether_hit.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_wisp/wisp_guardian_explosion.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_crystal_spellswap_replenish.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_crystal_spellswap_ambient.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_crystal_destroy.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_crystal_impact.vpcf", context ) + + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_warlock.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_pugna.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_wisp.vsndevts", context ) + + PrecacheResource( "model", "models/gameplay/aghanim_crystal.vmdl", context ) +end + +-------------------------------------------------------------------------------- + +function aghanim_spell_swap:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function aghanim_spell_swap:OnAbilityPhaseStart() + if IsServer() then + self.nChannelFX = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_beam_channel.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + end + return true +end + + +------------------------------------------------------------------------------- + +function aghanim_spell_swap:GetChannelTime() + if IsServer() then + local flChannelTime = self.BaseClass.GetChannelTime( self ) + local nHealthPct = self:GetCaster():GetHealthPercent() + if nHealthPct < 50 then + flChannelTime = flChannelTime - 1.0 + end + if nHealthPct < 25 then + flChannelTime = flChannelTime - 1.0 + end + return flChannelTime + end + return self.BaseClass.GetChannelTime( self ) +end + +------------------------------------------------------------------------------- + +function aghanim_spell_swap:OnChannelThink( flInterval ) + if IsServer() then + end +end + +------------------------------------------------------------------------------- + +function aghanim_spell_swap:OnChannelFinish( bInterrupted ) + if IsServer() then + ParticleManager:DestroyParticle( self.nChannelFX, false ) + + for _,nFXIndex in pairs ( self.nBeamFXIndices ) do + ParticleManager:DestroyParticle( nFXIndex, true ) + end + + StopSoundOn( "Hero_Pugna.LifeDrain.Loop", self:GetCaster() ) + + for k,hHero in pairs ( self.Heroes ) do + if hHero ~= nil and hHero:IsRealHero() then + hHero:RemoveModifierByName( "modifier_arc_warden_spark_wraith_purge" ) + hHero:AddNewModifier( self:GetCaster(), self, "modifier_aghanim_spell_swap", {} ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function aghanim_spell_swap:OnSpellStart() + if IsServer() then + self.nBeamFXIndices = {} + + local hSummonPortals = self:GetCaster():FindAbilityByName( "aghanim_summon_portals" ) + if hSummonPortals then + local kv = + { + duration = self:GetChannelTime(), + mode = hSummonPortals.PORTAL_MODE_ALL_ENEMIES, + depth = 0, + target_entindex = -1, + } + + local vRightPos = self:GetCaster():GetAbsOrigin() + self:GetCaster():GetRightVector() * 300 + local vLeftPos = self:GetCaster():GetAbsOrigin() - self:GetCaster():GetRightVector() * 300 + CreateModifierThinker( self:GetCaster(), self, "modifier_aghanim_summon_portals_thinker", kv, vRightPos, self:GetCaster():GetTeamNumber(), false ) + CreateModifierThinker( self:GetCaster(), self, "modifier_aghanim_summon_portals_thinker", kv, vLeftPos, self:GetCaster():GetTeamNumber(), false ) + end + + EmitSoundOn( "Hero_Pugna.LifeDrain.Cast", self:GetCaster() ) + EmitSoundOn( "Hero_Pugna.LifeDrain.Loop", self:GetCaster() ) + + self.Heroes = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetAbsOrigin(), nil, 5000, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false ) + for k,hHero in pairs ( self.Heroes ) do + if hHero ~= nil and hHero:IsRealHero() then + + local nNumAghDummies = 0 + for j=1,4 do + local szName = tostring( "aghanim_empty_spell" .. j ) + local hDummyAbility = hHero:FindAbilityByName( szName ) + if hDummyAbility then + nNumAghDummies = nNumAghDummies + 1 + end + end + + if nNumAghDummies == 4 then + print( "I have 4 agh dummies! Getting slowed." ) + hHero:AddNewModifier( self:GetCaster(), self, "modifier_arc_warden_spark_wraith_purge", { duration = self:GetChannelTime() } ) + end + + local nBeamFX = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_spell_swap_beam.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + + local szAttachment = "attach_hand_R" + if RandomInt( 0, 1 ) == 1 then + szAttachment = "attach_lower_hand_R" + end + ParticleManager:SetParticleControlEnt( nBeamFX, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, szAttachment, self:GetCaster():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nBeamFX, 1, hHero, PATTACH_POINT_FOLLOW, "attach_hitloc", hHero:GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nBeamFX, 11, Vector( 1, 0, 0 ) ) + + table.insert( self.nBeamFXIndices, nBeamFX ) + end + end + end +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_staff_beams.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_staff_beams.lua new file mode 100755 index 0000000..34ab548 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_staff_beams.lua @@ -0,0 +1,147 @@ + +aghanim_staff_beams = class({}) + +LinkLuaModifier( "modifier_aghanim_staff_beams_thinker", "modifiers/creatures/modifier_aghanim_staff_beams_thinker", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_aghanim_staff_beams_linger_thinker", "modifiers/creatures/modifier_aghanim_staff_beams_linger_thinker", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_aghanim_staff_beams_debuff", "modifiers/creatures/modifier_aghanim_staff_beams_debuff", LUA_MODIFIER_MOTION_NONE ) + + +---------------------------------------------------------------------------------------- + +function aghanim_staff_beams:Precache( context ) + PrecacheResource( "particle", "particles/creatures/aghanim/staff_beam.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_beam_channel.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_beam_burn.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/staff_beam_linger.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/staff_beam_tgt_ring.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_debug_ring.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_phoenix.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_huskar.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_jakiro.vsndevts", context ) +end + +-------------------------------------------------------------------------------- + +function aghanim_staff_beams:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function aghanim_staff_beams:OnAbilityPhaseStart() + if IsServer() then + StartSoundEventFromPositionReliable( "Aghanim.StaffBeams.WindUp", self:GetCaster():GetAbsOrigin() ) + self.nChannelFX = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_beam_channel.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + self.vecTargets = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetAbsOrigin(), nil, 5000, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false ) + for k,enemy in pairs ( self.vecTargets ) do + if enemy ~= nil then + enemy.nWarningFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_debug_ring.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( enemy.nWarningFXIndex, 0, enemy:GetAbsOrigin() ) + enemy.vSourceLoc = enemy:GetAbsOrigin() + end + end + end + return true +end + +-------------------------------------------------------------------------------- + +function aghanim_staff_beams:OnSpellStart() + if IsServer() then + --EmitSoundOn( "Aghanim.ShardAttack.Channel", self:GetCaster() ) + EmitSoundOn( "Hero_Phoenix.SunRay.Cast", self:GetCaster() ) + EmitSoundOn( "Hero_Phoenix.SunRay.Loop", self:GetCaster() ) + + self.Projectiles = {} + + for k,enemy in pairs ( self.vecTargets ) do + if enemy ~= nil then + local hBeamThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_aghanim_staff_beams_thinker", { duration = self:GetChannelTime() }, enemy.vSourceLoc, self:GetCaster():GetTeamNumber(), false ) + ParticleManager:DestroyParticle( enemy.nWarningFXIndex, false ) + local projectile = + { + Target = enemy, + Source = hBeamThinker, + Ability = self, + EffectName = "", + iMoveSpeed = self:GetSpecialValueFor( "beam_speed" ), + vSourceLoc = enemy.vSourceLoc, + bDodgeable = false, + bProvidesVision = false, + flExpireTime = GameRules:GetGameTime() + self:GetChannelTime(), + bIgnoreObstructions = true, + bSuppressTargetCheck = true, + } + + projectile.hThinker = hBeamThinker + + local nProjectileHandle = ProjectileManager:CreateTrackingProjectile( projectile ) + projectile.nProjectileHandle = nProjectileHandle + + local nBeamFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/staff_beam.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( nBeamFXIndex, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_staff_fx", self:GetCaster():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nBeamFXIndex, 1, projectile.hThinker, PATTACH_ABSORIGIN_FOLLOW, nil, projectile.hThinker:GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nBeamFXIndex, 2, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, projectile.hThinker:GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nBeamFXIndex, 9, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetAbsOrigin(), true ) + projectile.nFXIndex = nBeamFXIndex + + table.insert( self.Projectiles, projectile ) + end + end + --self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_aghanim_staff_beams", kv ) + end +end + +------------------------------------------------------------------------------- + +function aghanim_staff_beams:OnProjectileThinkHandle( nProjectileHandle ) + if IsServer() then + local Projectile = nil + for k,v in pairs( self.Projectiles ) do + if v.nProjectileHandle == nProjectileHandle then + Projectile = v + break + end + end + + if Projectile == nil then + return + end + + local vLocation = ProjectileManager:GetTrackingProjectileLocation( nProjectileHandle ) + if Projectile.hThinker ~= nil and not Projectile.hThinker:IsNull() then + vLocation = GetGroundPosition( vLocation, Projectile.hThinker ) + Projectile.hThinker:SetOrigin( vLocation ) + + ParticleManager:SetParticleControlFallback( Projectile.nFXIndex, 0, self:GetCaster():GetAbsOrigin() ) + ParticleManager:SetParticleControlFallback( Projectile.nFXIndex, 1, vLocation ) + ParticleManager:SetParticleControlFallback( Projectile.nFXIndex, 9, self:GetCaster():GetAbsOrigin() ) + end + end +end + +------------------------------------------------------------------------------- + +function aghanim_staff_beams:OnChannelThink( flInterval ) + if IsServer() then + end +end + +------------------------------------------------------------------------------- + +function aghanim_staff_beams:OnChannelFinish( bInterrupted ) + if IsServer() then + ParticleManager:DestroyParticle( self.nChannelFX, false ) + StopSoundOn( "Hero_Phoenix.SunRay.Cast", self:GetCaster() ) + StopSoundOn( "Hero_Phoenix.SunRay.Loop", self:GetCaster() ) + EmitSoundOn( "Hero_Phoenix.SunRay.Stop", self:GetCaster() ) + + for _,v in pairs ( self.Projectiles ) do + ParticleManager:DestroyParticle( v.nFXIndex, false ) + if v.hThinker and v.hThinker:IsNull() == false then + UTIL_Remove( v.hThinker ) + end + end + --self:GetCaster():RemoveModifierByName( "modifier_aghanim_staff_beams" ) + end +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_summon_portals.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_summon_portals.lua new file mode 100755 index 0000000..46eb766 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghanim_summon_portals.lua @@ -0,0 +1,315 @@ +aghanim_summon_portals = class( {} ) + +LinkLuaModifier( "modifier_aghanim_portal_spawn_effect", "modifiers/creatures/modifier_aghanim_portal_spawn_effect", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_aghanim_summon_portals_thinker", "modifiers/creatures/modifier_aghanim_summon_portals_thinker", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function aghanim_summon_portals:Precache( context ) + PrecacheResource( "particle", "particles/econ/events/ti10/portal/portal_open_bad.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/portal_summon.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_portal_summon.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_portal_emit.vpcf", context ) + PrecacheResource( "particle", "particles/econ/events/ti10/portal/portal_emit_large.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_pugna/pugna_decrepify.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_ghost.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_stomp_magical.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_elder_titan/elder_titan_echo_stomp_impact_magical.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_elder_titan.vsndevts", context ) + + PrecacheUnitByNameSync( "npc_dota_creature_aghanim_minion", context, -1 ) + PrecacheUnitByNameSync( "npc_dota_boss_aghanim_spear", context, -1 ) + + self.PORTAL_MODE_ALL_SPEARS = 0 + self.PORTAL_MODE_ALL_ENEMIES = 1 + self.PORTAL_MODE_BOTH = 2 + + self.nLastPortalMode = self.PORTAL_MODE_ALL_ENEMIES + self.nMode = 0 + self.nDepthRemaining = 20 + self.nPortals = 0 + self.nNumPortalsThisCast = 0 + self.flPortalSummmonTime = self:GetSpecialValueFor( "portal_time" ) + self.flStartGestureTime = 999999999999 + + self.bSynchedPortalRelease = false +end + +-------------------------------------------------------------------------------- + +function aghanim_summon_portals:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function aghanim_summon_portals:OnAbilityPhaseStart() + if IsServer() then + self.nPortals = self:GetPortalCount() + self.flPortalSummmonTime = self:GetSpecialValueFor( "portal_time" ) + + self.nChannelFX = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_portal_summon.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + EmitSoundOn( "Hero_ElderTitan.EchoStomp.Channel", self:GetCaster() ) + + self.staff_crush_radius = self:GetSpecialValueFor( "staff_crush_radius" ) + self.staff_crush_damage = self:GetSpecialValueFor( "staff_crush_damage" ) + self.staff_crush_stun_duration = self:GetSpecialValueFor( "staff_crush_stun_duration" ) + self.staff_crush_delay = self:GetSpecialValueFor( "staff_crush_delay" ) + + + local vToTarget = self:GetCursorPosition() - self:GetCaster():GetAbsOrigin() + vToTarget.z = 0 + vToTarget = vToTarget:Normalized() + + self.vStaffEndPos = self:GetCaster():GetAbsOrigin() + ( vToTarget * 200.0 )--+ ( self:GetCaster():GetRightVector() * -30 ) + self.vStaffEndPos = GetGroundPosition( self.vStaffEndPos, self:GetCaster() ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_crystal_attack_telegraph.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self.vStaffEndPos ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.staff_crush_radius, 1.6, 1.6 ) ) + ParticleManager:SetParticleControl( nFXIndex, 15, Vector( 255, 0, 0 ) ) + ParticleManager:SetParticleControl( nFXIndex, 16, Vector( 1, 0, 0 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + return true +end + +------------------------------------------------------------------------------- + +function aghanim_summon_portals:OnChannelThink( flInterval ) + if IsServer() then + if self.nPortals > 0 and GameRules:GetGameTime() > self.flNextPortalTime then + self.flNextPortalTime = GameRules:GetGameTime() + self.flPortalInterval + if self.nNumPortalsInLine > 0 then + self:CreateNextPortalAlongLine() + self.nNumPortalsInLine = self.nNumPortalsInLine - 1 + self.nNumPortalsThisCast = self.nNumPortalsThisCast + 1 + end + + if self.nNumPortalsNearHeroes > 0 then + self:CreateNearHeroPortal() + self.nNumPortalsNearHeroes = self.nNumPortalsNearHeroes - 1 + self.nNumPortalsThisCast = self.nNumPortalsThisCast + 1 + end + end + + if self.bHasStaffCrushed == false then + self.staff_crush_delay = self.staff_crush_delay - flInterval + if self.staff_crush_delay < 0 then + self.bHasStaffCrushed = true + self:StaffCrush() + end + end + + if GameRules:GetGameTime() > self.flStartGestureTime then + self:GetCaster():StartGesture( ACT_DOTA_IDLE ) + self.flStartGestureTime = 9999999999999 + end + end +end + +------------------------------------------------------------------------------- + +function aghanim_summon_portals:OnChannelFinish( bInterrupted ) + if IsServer() then + ParticleManager:DestroyParticle( self.nChannelFX, false ) + self:GetCaster():RemoveGesture( ACT_DOTA_IDLE ) + end +end + +------------------------------------------------------------------------------- + +function aghanim_summon_portals:OnSpellStart() + if IsServer() then + self.flStartGestureTime = GameRules:GetGameTime() + 2.5 + self.bHasStaffCrushed = false + + self.flPortalInterval = self:GetChannelTime() / self.nPortals + self.flNextPortalTime = -1 + self.nDepthRemaining = self:GetSpecialValueFor( "total_portal_depth" ) + self.nLastPortalMode = self.nMode + self.nMode = self:GetPortalMode() + + self.nNumPortalsThisCast = 0 + + self.nNumPortalsInLine = self:GetSpecialValueFor( "base_portals" ) + self.nNumPortalsNearHeroes = self.nPortals - self.nNumPortalsInLine + + if self.nMode == self.PORTAL_MODE_ALL_SPEARS then + local vMidPoint = nil + + local vLineDir = nil + self.Heroes = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetAbsOrigin(), nil, 5000, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false ) + + vMidPoint = self:GetCaster():GetAbsOrigin() + self:GetCaster():GetForwardVector() * 500 + vLineDir = self:GetCaster():GetRightVector() + + vLineDir.z = 0.0 + vLineDir = vLineDir:Normalized() + + local nPortalsRemaining = self.nNumPortalsInLine - 1 + local flLineStep = 450 + local flTotalLineDist = flLineStep * self.nNumPortalsInLine + local vFirstPortalPos = vMidPoint - ( vLineDir * ( flLineStep * nPortalsRemaining / 2 ) ) + + self.SpearLinePositions = {} + table.insert( self.SpearLinePositions, vFirstPortalPos ) + + for i=1,nPortalsRemaining do + local vNewPortalPos = vFirstPortalPos + ( vLineDir * i * flLineStep ) + table.insert( self.SpearLinePositions, vNewPortalPos ) + end + end + end +end + +------------------------------------------------------------------------------- + +function aghanim_summon_portals:StaffCrush() + if IsServer() then + + local nFXCastIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_stomp_magical.vpcf", PATTACH_WORLDORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXCastIndex, 0, self.vStaffEndPos ) + ParticleManager:SetParticleControl( nFXCastIndex, 1, Vector( self.radius, self.radius, self.radius ) ) + ParticleManager:ReleaseParticleIndex( nFXCastIndex ) + + EmitSoundOn( "Hero_ElderTitan.EchoStomp", self:GetCaster() ) + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self.vStaffEndPos, self:GetCaster(), self.staff_crush_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.staff_crush_damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + + enemy:AddNewModifier( self:GetCaster(), self, "modifier_stunned", { duration = self.staff_crush_stun_duration } ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_elder_titan/elder_titan_echo_stomp_impact_magical.vpcf", PATTACH_ABSORIGIN_FOLLOW, enemy ) + local vDirection = enemy:GetOrigin() - self.vStaffEndPos + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + ParticleManager:SetParticleControl( nFXIndex, 1, enemy:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, vDirection ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + end +end + +------------------------------------------------------------------------------- + +function aghanim_summon_portals:GetPortalCount() + if IsServer() then + local nBasePortals = self:GetSpecialValueFor( "base_portals" ) + local nHealthPctPerPortal = self:GetSpecialValueFor( "portal_health_pct" ) + local nAdditionalPortals = math.floor( ( 100 - self:GetCaster():GetHealthPercent() ) / nHealthPctPerPortal ) + + return nBasePortals + nAdditionalPortals + end + + return 0 +end + +------------------------------------------------------------------------------- + +function aghanim_summon_portals:GetPortalMode() + if IsServer() then + return self.PORTAL_MODE_ALL_SPEARS + end + return 0 +end + +------------------------------------------------------------------------------- + +function aghanim_summon_portals:CreateNearHeroPortal() + if IsServer() then + local nCountLeft = self.nNumPortalsNearHeroes + if nCountLeft <= 0 then + return + end + + local Heroes = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetAbsOrigin(), nil, 5000, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false ) + if #Heroes == 0 then + return + end + + local hTarget = Heroes[ RandomInt( 1, #Heroes ) ] + if hTarget == nil then + return + end + + local vToAghanim = self:GetCaster():GetAbsOrigin() - hTarget:GetAbsOrigin() + vToAghanim.z = 0.0 + vToAghanim = vToAghanim:Normalized() + + local vPos = hTarget:GetAbsOrigin() - vToAghanim * RandomFloat( self:GetSpecialValueFor( "min_portal_offset" ), self:GetSpecialValueFor( "max_portal_offset" ) ) + if GridNav:CanFindPath( hTarget:GetAbsOrigin(), vPos ) == false then + return + end + + local flDuration = 0.5 + ( self:GetChannelStartTime() + self:GetChannelTime() ) - GameRules:GetGameTime() - ( nCountLeft * 0.3 ) + + local kv = + { + duration = flDuration, + mode = self.PORTAL_MODE_ALL_SPEARS, + depth = 0, + target_entindex = hTarget:entindex(), + } + + CreateModifierThinker( self:GetCaster(), self, "modifier_aghanim_summon_portals_thinker", kv, vPos, self:GetCaster():GetTeamNumber(), false ) + end +end + +------------------------------------------------------------------------------- + +function aghanim_summon_portals:CreateNextPortalAlongLine() + if IsServer() then + local nCountLeft = #self.SpearLinePositions + if nCountLeft == 0 then + return + end + + local vPos = self.SpearLinePositions[ 1 ] + + local hTarget = nil + if #self.Heroes == 0 then + local Heroes = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetAbsOrigin(), nil, 5000, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false ) + if #Heroes == 0 then + return + end + hTarget = Heroes[ RandomInt( 1, #Heroes ) ] + else + local nIndex = RandomInt( 1, #self.Heroes ) + hTarget = self.Heroes[ nIndex ] + table.remove( self.Heroes, nIndex ) + end + + if hTarget == nil then + return + end + + local flDuration = 0.5 + ( self:GetChannelStartTime() + self:GetChannelTime() ) - GameRules:GetGameTime() - ( nCountLeft * 0.3 ) + table.remove( self.SpearLinePositions, 1 ) + + local kv = + { + duration = flDuration, + mode = self.PORTAL_MODE_ALL_SPEARS, + depth = 0, + target_entindex = hTarget:entindex(), + } + + CreateModifierThinker( self:GetCaster(), self, "modifier_aghanim_summon_portals_thinker", kv, vPos, self:GetCaster():GetTeamNumber(), false ) + end +end + +------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_brewmaster_primal_split.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_brewmaster_primal_split.lua new file mode 100755 index 0000000..33f026c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_brewmaster_primal_split.lua @@ -0,0 +1,37 @@ +aghsfort_brewmaster_primal_split = class({}) +LinkLuaModifier( "modifier_brewmaster_split", "modifiers/creatures/modifier_brewmaster_split", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function aghsfort_brewmaster_primal_split:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_brewmaster/brewmaster_primal_split.vpcf", context ) + PrecacheUnitByNameSync( "npc_dota_brewmaster_earth_unit", context, -1 ) + PrecacheUnitByNameSync( "npc_dota_brewmaster_storm_unit", context, -1 ) + PrecacheUnitByNameSync( "npc_dota_brewmaster_fire_unit", context, -1 ) +end + +-------------------------------------------------------------------------------- + +function aghsfort_brewmaster_primal_split:OnAbilityPhaseStart() + if IsServer() then + local hLines = { "Hero_Brewmaster.PrimalSplit.VO6", "Hero_Brewmaster.PrimalSplit.VO7", "Hero_Brewmaster.PrimalSplit.VO8", } + local nRandomInt = RandomInt(1,3) + local hSplitLine = hLines[nRandomInt] + EmitSoundOn( hSplitLine, self:GetCaster() ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function aghsfort_brewmaster_primal_split:OnSpellStart() + if IsServer() == false then + return + end + + EmitSoundOn( "Hero_Brewmaster.PrimalSplit.Cast", self:GetCaster() ) + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_brewmaster_split", { duration = self:GetSpecialValueFor( "split_duration" ) } ) +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_brewmaster_thunderclap.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_brewmaster_thunderclap.lua new file mode 100755 index 0000000..b616df3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_brewmaster_thunderclap.lua @@ -0,0 +1,76 @@ +aghsfort_brewmaster_thunderclap = class({}) + +---------------------------------------------------------------------------------------- + +function aghsfort_brewmaster_thunderclap:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_brewmaster/brewmaster_thunder_clap.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function aghsfort_brewmaster_thunderclap:OnAbilityPhaseStart() + if IsServer() then + self.radius = self:GetSpecialValueFor( "radius" ) + self.duration = self:GetSpecialValueFor( "duration" ) + self.damage = self:GetSpecialValueFor( "damage" ) + self.speed = self:GetSpecialValueFor( "speed" ) + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( radius, radius, radius ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 26, 26 ) ) + + EmitSoundOn( "Hero_Brewmaster.ThunderClap.Target", self:GetCaster() ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function aghsfort_brewmaster_thunderclap:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function aghsfort_brewmaster_thunderclap:GetPlaybackRateOverride() + return 0.5 +end + +-------------------------------------------------------------------------------- + +function aghsfort_brewmaster_thunderclap:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_brewmaster/brewmaster_thunder_clap.vpcf", PATTACH_ABSORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.radius, self.radius, self.radius ) ) + ParticleManager:SetParticleControlEnt( nFXIndex, 2, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_attack1", self:GetCaster():GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Hero_Brewmaster.ThunderClap", self:GetCaster() ) + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetOrigin(), nil, self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self, + } + ApplyDamage( damageInfo ) + enemy:AddNewModifier( self:GetCaster(), self, "modifier_polar_furbolg_ursa_warrior_thunder_clap", { duration = self.duration } ) + end + end + + end +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_elemental_tiny_create_io.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_elemental_tiny_create_io.lua new file mode 100755 index 0000000..ea176eb --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_elemental_tiny_create_io.lua @@ -0,0 +1,83 @@ + +aghsfort_elemental_tiny_create_io = class({}) +LinkLuaModifier( "modifier_elemental_tiny_create_io_dummy", "modifiers/creatures/modifier_elemental_tiny_create_io_dummy", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function aghsfort_elemental_tiny_create_io:Precache( context ) + + PrecacheUnitByNameSync( "npc_dota_creature_elemental_io", context, -1 ) + +end + +-------------------------------------------------------------------------------- + +function aghsfort_elemental_tiny_create_io:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function aghsfort_elemental_tiny_create_io:OnSpellStart() + if not IsServer() then + return + end + + if self:GetCaster() == nil or self:GetCaster():IsNull() then + return + end + + local nSummonCount = self:GetSpecialValueFor( "spawn_count" ) + local nMaxSummons = self:GetSpecialValueFor( "max_summons" ) + local flSpawnDistance = self:GetSpecialValueFor( "spawn_distance" ) + + local flDeltaAngle = 360 / nSummonCount + local vAngles = QAngle( 0, math.random( 0, flDeltaAngle ), 0 ) + + --first time we spawn, create 2 the hIos + if not self:GetCaster():FindModifierByName( "modifier_elemental_tiny_create_io_dummy" ) then + nSummonCount = 2 + local kv2 = {} + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_elemental_tiny_create_io_dummy", kv2 ) + end + + for i = 1,nSummonCount do + + local vSpawnPosition = nil + for s = 1,36 do + + local vDir = AnglesToVector( vAngles ) + local vTest = self:GetCaster():GetAbsOrigin() + vDir * flSpawnDistance + math.random( -25, 25 ) + + if GameRules.Aghanim:GetCurrentRoom():IsValidSpawnPoint( vTest ) then + vSpawnPosition = vTest + break + end + + vAngles.y = vAngles.y + 10 + + end + + vAngles.y = vAngles.y + flDeltaAngle + math.random( -20, 20 ) + + if vSpawnPosition ~= nil then + + local kv = + { + vLocX = vSpawnPosition.x, + vLocY = vSpawnPosition.y, + vLocZ = vSpawnPosition.z, + } + local hIo = CreateUnitByName( "npc_dota_creature_elemental_io", self:GetCaster():GetAbsOrigin(), true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + if hIo ~= nil then + hIo:AddNewModifier( self:GetCaster(), self, "modifier_frostivus2018_broodbaby_launch", kv ) + hIo:SetOwner(self:GetCaster()) + table.insert( self:GetCaster().hIos, hIo ) + end + end + + end + +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_elemental_tiny_toss.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_elemental_tiny_toss.lua new file mode 100755 index 0000000..d20f4a0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_elemental_tiny_toss.lua @@ -0,0 +1,129 @@ + +aghsfort_elemental_tiny_toss = class({}) +LinkLuaModifier( "modifier_elemental_tiny_grab", "modifiers/creatures/modifier_elemental_tiny_grab", LUA_MODIFIER_MOTION_HORIZONTAL ) +---------------------------------------------------------------------------------------- + +function aghsfort_elemental_tiny_toss:Precache( context ) + + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_tiny/tiny_toss_blur.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_crystal_attack_telegraph.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_wisp/wisp_tether.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_wisp/wisp_tether_hit.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/target_telegraph_attack.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/elemental_tiny_ping.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function aghsfort_elemental_tiny_toss:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function aghsfort_elemental_tiny_toss:OnAbilityPhaseStart() + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 50, 50, 50 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 0, 0 ) ) + + self.hProjectile = nil + -- We want to find an Io to toss + self:FindProjectile() + if self.hProjectile ~= nil then + return true + end + + end + return false + +end +-------------------------------------------------------------------------------- + +function aghsfort_elemental_tiny_toss:OnAbilityPhaseInterrupted() + + if IsServer() then + -- We were interrupted. Drop our Io and stop our warnings + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + self.hProjectile:RemoveModifierByName( "modifier_elemental_tiny_grab" ) + self.hProjectile = nil + end +end + +-------------------------------------------------------------------------------- + +function aghsfort_elemental_tiny_toss:FindProjectile() + + if IsServer() then + self.grab_radius = self:GetSpecialValueFor( "grab_radius" ) + + local entities = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetOrigin(), self:GetCaster(), self.grab_radius, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, DOTA_UNIT_TARGET_FLAG_NO_INVIS + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS, FIND_CLOSEST, false ) + + for _, hAlly in pairs( entities ) do + if hAlly ~= nil and not hAlly:IsNull() and hAlly:IsAlive() == true and hAlly:GetUnitName() == "npc_dota_creature_elemental_io" then + if not hAlly:FindModifierByName("modifier_tiny_toss") and not hAlly:FindModifierByName("modifier_elemental_tiny_grab") then + -- We found an Io, it's going to be our projectile + self.hProjectile = hAlly + end + end + end + + if self.hProjectile ~= nil then + -- Position Io into our hand + self.hProjectile:AddNewModifier( self:GetCaster(), self, "modifier_elemental_tiny_grab", nil ) + + local nDestinationPreviewFX = ParticleManager:CreateParticle( "particles/creatures/elemental_tiny_ping.vpcf", PATTACH_CUSTOMORIGIN, nil ) + --local nDestinationPreviewFX = ParticleManager:CreateParticle( "particles/ui_mouseactions/ping_retreat.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nDestinationPreviewFX, 0, self:GetCaster():GetCursorPosition() ) + --ParticleManager:SetParticleControl( nDestinationPreviewFX, 1, Vector( 275, 1.8, 1.8 ) ) + ParticleManager:SetParticleControl( nDestinationPreviewFX, 7, Vector( 255, 10, 10 ) ) + --ParticleManager:SetParticleControl( nDestinationPreviewFX, 16, Vector( 1, 0, 0 ) ) + ParticleManager:ReleaseParticleIndex( nDestinationPreviewFX ) + EmitSoundOnLocationWithCaster( self:GetCaster():GetCursorPosition(), "General.PingWarning", self:GetCaster() ) + + AddFOWViewer( DOTA_TEAM_GOODGUYS, self:GetCaster():GetCursorPosition(), self:GetSpecialValueFor( "radius" ), self:GetSpecialValueFor( "duration" ) + 0.5, false ) + + + else + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + self:StartCooldown(2) + end + end +end + +-------------------------------------------------------------------------------- + +function aghsfort_elemental_tiny_toss:OnSpellStart() + + if IsServer() then + + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + local vPos = nil + if self:GetCursorTarget() then + vPos = self:GetCursorTarget():GetOrigin() + else + vPos = self:GetCursorPosition() + end + + local kv = { + x = vPos.x, + y = vPos.y, + z = vPos.z + } + if self.hProjectile ~= nil and self.hProjectile:IsAlive() then + -- Leave our hand, Io + self.hProjectile:RemoveModifierByName( "modifier_elemental_tiny_grab" ) + -- And fly like the wind! + self.hProjectile:AddNewModifier( self:GetCaster(), self, "modifier_tiny_toss", kv ) + self:GetCaster():StartGesture( ACT_TINY_TOSS ) + + + + EmitSoundOn( "Ability.TossThrow", self:GetCaster() ) + + end + end +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_enraged_wildwing_tornado_blast.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_enraged_wildwing_tornado_blast.lua new file mode 100755 index 0000000..d293c8d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_enraged_wildwing_tornado_blast.lua @@ -0,0 +1,150 @@ +aghsfort_enraged_wildwing_tornado_blast = class({}) + +---------------------------------------------------------------------------------------- + +function aghsfort_enraged_wildwing_tornado_blast:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_invoker/invoker_tornado.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/wildwing_tornado_blast_debuff.vpcf", context ) + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + +end +-------------------------------------------------------------------------------- + +function aghsfort_enraged_wildwing_tornado_blast:OnAbilityPhaseStart() + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 175, 175, 175 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 140, 0 ) ) + end + return true +end + +-------------------------------------------------------------------------------- + +function aghsfort_enraged_wildwing_tornado_blast:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function aghsfort_enraged_wildwing_tornado_blast:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + local vDirection = self:GetCursorPosition() - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + self.travel_speed = self:GetSpecialValueFor( "travel_speed" ) + self.area_of_effect = self:GetSpecialValueFor( "area_of_effect" ) + self.damage = self:GetSpecialValueFor( "damage" ) + self.disable_duration = self:GetSpecialValueFor( "disable_duration" ) + self.travel_distance = self:GetSpecialValueFor( "travel_distance" ) + self.spawns_per_blast = self:GetSpecialValueFor( "spawns_per_blast" ) + self.harpy_spawn_amount = self:GetSpecialValueFor( "harpy_spawn_amount" ) + + self.spawn_interval = (self.travel_distance / self.travel_speed) / self.harpy_spawn_amount - 0.1 + + local info = { + EffectName = "particles/units/heroes/hero_invoker/invoker_tornado.vpcf", + Ability = self, + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = self.area_of_effect, + fEndRadius = self.area_of_effect, + vVelocity = vDirection * self.travel_speed, + fDistance = self.travel_distance, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, + iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + } + + + self.flLastThinkTime = GameRules:GetGameTime() + self.nProjID = ProjectileManager:CreateLinearProjectile( info ) + EmitSoundOn( "Ability.TornadoBlast.Cast" , self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function aghsfort_enraged_wildwing_tornado_blast:OnProjectileThink( vLocation ) + if GameRules:GetGameTime() - self.flLastThinkTime >= self.spawn_interval then + self.flLastThinkTime = GameRules:GetGameTime() + + if self:GetCaster().Encounter and self:GetCaster().Encounter:GetRoom() and self:GetCaster().Encounter:GetRoom():IsInRoomBounds( vLocation ) then + self:SpawnHarpy(vLocation) + end + end +end + + +-------------------------------------------------------------------------------- + +function aghsfort_enraged_wildwing_tornado_blast:OnProjectileHit( hTarget, vLocation ) + if hTarget ~= nil then + local damage = { + victim = hTarget, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = this, + } + + ApplyDamage( damage ) + if not hTarget:FindModifierByName("modifier_aghsfort_wildwing_tornado_blast_debuff") then + hTarget:AddNewModifier( self:GetCaster(), self, "modifier_aghsfort_wildwing_tornado_blast_debuff", { duration = self.disable_duration} ) + end + end + + return false +end + +-------------------------------------------------------------------------------- + + +-------------------------------------------------------------------------------- + +function aghsfort_enraged_wildwing_tornado_blast:SpawnHarpy( vLocation ) + if IsServer() then + + for i = 1, self.harpy_spawn_amount do + local hHarpy = CreateUnitByName( "npc_aghsfort_creature_tornado_harpy", vLocation, true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + local nMaxDistance = 200 + local vLoc = FindPathablePositionNearby(vLocation, 150, nMaxDistance ) + if hHarpy ~= nil then + hHarpy:SetInitialGoalEntity( self:GetCaster().hInitialGoalEntity ) + hHarpy:SetDeathXP( 0 ) + hHarpy:SetMinimumGoldBounty( 0 ) + hHarpy:SetMaximumGoldBounty( 0 ) + + local kv = + { + vLocX = vLoc.x, + vLocY = vLoc.y, + vLocZ = vLoc.z, + } + hHarpy:AddNewModifier( self:GetCaster(), self, "modifier_frostivus2018_broodbaby_launch", kv ) + end + end + + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_CUSTOMORIGIN, nil, vLocation, true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 100, 100, 100 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 29, 55, 184 ) ) + + + self.flLastHarpyTime = GameRules:GetGameTime() + EmitSoundOn( "Creature_Bomb_Squad.LandMine.Plant", hHarpy ) + + end + + return +end + +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_naga_siren_mirror_image.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_naga_siren_mirror_image.lua new file mode 100755 index 0000000..6189565 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_naga_siren_mirror_image.lua @@ -0,0 +1,37 @@ +aghsfort_naga_siren_mirror_image = class({}) + +-------------------------------------------------------------------------------- + +function aghsfort_naga_siren_mirror_image:Precache( context ) + +end + +-------------------------------------------------------------------------------- + +function aghsfort_naga_siren_mirror_image:OnSpellStart() + print("Mirror Image") + local caster = self:GetCaster() + local vPos = caster:GetOrigin() + + local effect_name = "particles/units/heroes/hero_siren/naga_siren_mirror_image.vpcf" + local hEffects = ParticleManager:CreateParticle( effect_name, PATTACH_CUSTOMORIGIN, caster ) + caster:SetContextThink( "KillEffects", function() return self:KillEffects( hEffects ) end, 2 ) + EmitSoundOn( "Hero_NagaSiren.MirrorImage", self:GetCaster() ) + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, vPos, nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + + local illusion_name = "npc_dota_creature_naga_siren_illusion" + local illusion_origin = vPos + local illusion = CreateUnitByName(illusion_name, illusion_origin, true, caster, nil, DOTA_TEAM_BADGUYS) + illusion:SetInitialGoalEntity( enemies ) + +end + +-------------------------------------------------------------------------------- + +function aghsfort_naga_siren_mirror_image:KillEffects( hEffects ) + if hEffects ~= nil then + ParticleManager:DestroyParticle( hEffects, false ) + end +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_waveblaster_summon_ghost.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_waveblaster_summon_ghost.lua new file mode 100755 index 0000000..37ec19d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_waveblaster_summon_ghost.lua @@ -0,0 +1,69 @@ + +aghsfort_waveblaster_summon_ghost = class({}) +LinkLuaModifier( "modifier_aghsfort_waveblaster_summon_ghost_thinker", "modifiers/creatures/modifier_aghsfort_waveblaster_summon_ghost_thinker", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function aghsfort_waveblaster_summon_ghost:Precache( context ) + + PrecacheResource( "particle", "particles/themed_fx/tower_dragon_black_smokering.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", context ) + PrecacheResource( "particle", "particles/nyx_swarm_explosion/nyx_swarm_explosion.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow_exit.vpcf", context ) + PrecacheUnitByNameSync( "npc_dota_creature_zealot_mound", context, -1 ) + PrecacheUnitByNameSync( "npc_dota_creature_zealot_scarab", context, -1 ) + +end + +-------------------------------------------------------------------------------- + +function aghsfort_waveblaster_summon_ghost:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function aghsfort_waveblaster_summon_ghost:OnSpellStart() + if not IsServer() then + return + end + + if self:GetCaster() == nil or self:GetCaster():IsNull() then + return + end + + local nSummonCount = self:GetSpecialValueFor( "spawn_count" ) + local flSpawnDistance = self:GetSpecialValueFor( "spawn_distance" ) + local flDuration = self:GetSpecialValueFor( "spawn_delay" ) + local flDeltaAngle = 360 / nSummonCount + local vAngles = QAngle( 0, math.random( 0, flDeltaAngle ), 0 ) + + for i = 1,nSummonCount do + + local vSpawnPosition = nil + for s = 1,36 do + + local vDir = AnglesToVector( vAngles ) + local vTest = self:GetCaster():GetAbsOrigin() + vDir * flSpawnDistance + math.random( -25, 25 ) + + if GameRules.Aghanim:GetCurrentRoom():IsValidSpawnPoint( vTest ) then + vSpawnPosition = vTest + break + end + + vAngles.y = vAngles.y + 10 + + end + + vAngles.y = vAngles.y + flDeltaAngle + math.random( -20, 20 ) + + if vSpawnPosition ~= nil then + + CreateModifierThinker( self:GetCaster(), self, "modifier_aghsfort_waveblaster_summon_ghost_thinker", {duration = flDuration }, self:GetCaster():GetAbsOrigin(), self:GetCaster():GetTeamNumber(), false ) + + end + + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_wisp_autoattack.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_wisp_autoattack.lua new file mode 100755 index 0000000..cf6659c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/aghsfort_wisp_autoattack.lua @@ -0,0 +1,11 @@ + +aghsfort_wisp_autoattack = class({}) +LinkLuaModifier( "modifier_aghsfort_wisp_autoattack", "modifiers/creatures/modifier_aghsfort_wisp_autoattack", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function aghsfort_wisp_autoattack:GetIntrinsicModifierName() + return "modifier_aghsfort_wisp_autoattack" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/baby_broodmother_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/baby_broodmother_passive.lua new file mode 100755 index 0000000..d953c03 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/baby_broodmother_passive.lua @@ -0,0 +1,26 @@ + +baby_broodmother_passive = class({}) + +LinkLuaModifier( "modifier_baby_broodmother_passive", "modifiers/creatures/modifier_baby_broodmother_passive", LUA_MODIFIER_MOTION_NONE ) +--LinkLuaModifier( "modifier_baby_broodmother_venom_pool", "modifiers/creatures/modifier_baby_broodmother_venom_pool", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function baby_broodmother_passive:Precache( context ) + + PrecacheResource( "particle", "particles/baby_brood_venom_pool.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_viper/viper_nethertoxin_debuff.vpcf", context ) + PrecacheResource( "particle", "particles/generic_gameplay/generic_silenced_lanecreeps.vpcf", context ) + PrecacheResource( "particle", "particles/generic_gameplay/generic_silenced.vpcf", context ) + PrecacheResource( "particle", "particles/generic_gameplay/generic_break.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function baby_broodmother_passive:GetIntrinsicModifierName() + return "modifier_baby_broodmother_passive" +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/baby_ogre_magi_area_ignite.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/baby_ogre_magi_area_ignite.lua new file mode 100755 index 0000000..32edd70 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/baby_ogre_magi_area_ignite.lua @@ -0,0 +1,57 @@ + +baby_ogre_magi_area_ignite = class ({}) +LinkLuaModifier( "modifier_ogre_magi_area_ignite_thinker", "modifiers/creatures/modifier_ogre_magi_area_ignite_thinker", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function baby_ogre_magi_area_ignite:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_ignite.vpcf", context ) + PrecacheResource( "particle", "particles/neutral_fx/black_dragon_fireball.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_ignite_debuff.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_burn.vpcf", context ) + +end + +---------------------------------------------------------------------------------------- + +function baby_ogre_magi_area_ignite:OnSpellStart() + if IsServer() then + self.hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_ogre_magi_area_ignite_thinker", { duration = -1 }, self:GetCursorPosition(), self:GetCaster():GetTeamNumber(), false ) + if self.hThinker ~= nil then + local projectile = + { + Target = self.hThinker, + Source = self:GetCaster(), + Ability = self, + EffectName = "particles/units/heroes/hero_ogre_magi/ogre_magi_ignite.vpcf", + iMoveSpeed = self:GetSpecialValueFor( "projectile_speed" ), + vSourceLoc = self:GetCaster():GetOrigin(), + bDodgeable = false, + bProvidesVision = false, + } + + ProjectileManager:CreateTrackingProjectile( projectile ) + + EmitSoundOn( "OgreMagi.Ignite.Cast", self:GetCaster() ) + end + end +end + +---------------------------------------------------------------------------------------- + +function baby_ogre_magi_area_ignite:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + if self.hThinker ~= nil then + local hBuff = self.hThinker:FindModifierByName( "modifier_ogre_magi_area_ignite_thinker" ) + if hBuff ~= nil then + hBuff:OnIntervalThink() + end + self.hThinker = nil; + end + end + + return true +end + +---------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/baby_ogre_tank_jump_smash.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/baby_ogre_tank_jump_smash.lua new file mode 100755 index 0000000..1ea20ed --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/baby_ogre_tank_jump_smash.lua @@ -0,0 +1,35 @@ + +baby_ogre_tank_jump_smash = class({}) +LinkLuaModifier( "modifier_ogre_tank_melee_smash_thinker", "modifiers/creatures/modifier_ogre_tank_melee_smash_thinker", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function baby_ogre_tank_jump_smash:Precache( context ) + + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) + +end + +----------------------------------------------------------------------------- + +function baby_ogre_tank_jump_smash:ProcsMagicStick() + return false +end + +----------------------------------------------------------------------------- + +function baby_ogre_tank_jump_smash:GetPlaybackRateOverride() + return 0.75 +end + + +----------------------------------------------------------------------------- + +function baby_ogre_tank_jump_smash:OnSpellStart() + if IsServer() then + local hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_ogre_tank_melee_smash_thinker", { duration = self:GetSpecialValueFor( "jump_speed") }, self:GetCaster():GetOrigin(), self:GetCaster():GetTeamNumber(), false ) + end +end + +----------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/baby_ogre_tank_melee_smash.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/baby_ogre_tank_melee_smash.lua new file mode 100755 index 0000000..77b2490 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/baby_ogre_tank_melee_smash.lua @@ -0,0 +1,44 @@ + +baby_ogre_tank_melee_smash = class({}) + +---------------------------------------------------------------------------------------- + +function baby_ogre_tank_melee_smash:Precache( context ) + + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) + +end + +----------------------------------------------------------------------------- + +function baby_ogre_tank_melee_smash:ProcsMagicStick() + return false +end + +----------------------------------------------------------------------------- + +function baby_ogre_tank_melee_smash:GetCooldown( iLevel ) + return self.BaseClass.GetCooldown( self, self:GetLevel() ) / self:GetCaster():GetHasteFactor() +end + +----------------------------------------------------------------------------- + +function baby_ogre_tank_melee_smash:GetPlaybackRateOverride() + return math.min( 2.0, math.max( self:GetCaster():GetHasteFactor(), 0.75 ) ) +end + +----------------------------------------------------------------------------- + +function baby_ogre_tank_melee_smash:OnSpellStart() + if IsServer() then + EmitSoundOn( "OgreTank.Grunt", self:GetCaster() ) + local flSpeed = self:GetSpecialValueFor( "base_swing_speed" ) / self:GetPlaybackRateOverride() + local vToTarget = self:GetCursorPosition() - self:GetCaster():GetOrigin() + vToTarget = vToTarget:Normalized() + local vTarget = self:GetCaster():GetOrigin() + vToTarget * self:GetCastRange( self:GetCaster():GetOrigin(), nil ) + local hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_ogre_tank_melee_smash_thinker", { duration = flSpeed }, vTarget, self:GetCaster():GetTeamNumber(), false ) + end +end + +----------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bandit_archer_arrow.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bandit_archer_arrow.lua new file mode 100755 index 0000000..c8d8e09 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bandit_archer_arrow.lua @@ -0,0 +1,137 @@ + +bandit_archer_arrow = class({}) + +LinkLuaModifier( "modifier_bandit_archer_arrow_debuff", "modifiers/creatures/modifier_bandit_archer_arrow_debuff", LUA_MODIFIER_MOTION_BOTH ) + +-------------------------------------------------------------------------------- + +function bandit_archer_arrow:Precache( context ) + PrecacheResource( "particle", "particles/dungeon_bandit_archer_crescent_arrow.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function bandit_archer_arrow:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function bandit_archer_arrow:OnAbilityPhaseStart() + if IsServer() then + --[[ + self.nPreviewFX = ParticleManager:CreateParticle( "particles/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 60, 60, 60 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 188, 26, 26 ) ) + ]] + + --EmitSoundOn( "Dungeon.ArcherPullArrow", self:GetCaster() ) + + --self:GetCaster():AddNewModifier( self:GetCaster(), nil, "modifier_provide_vision", { duration = 1.5 } ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function bandit_archer_arrow:OnAbilityPhaseInterrupted() + if IsServer() then + --ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + --StopSoundOn( "Dungeon.ArcherPullArrow", self:GetCaster() ) + end +end + +----------------------------------------------------------------------------- + +--[[ +function bandit_archer_arrow:GetPlaybackRateOverride() + return 0.75 +end +]] + +-------------------------------------------------------------------------------- + +function bandit_archer_arrow:OnSpellStart() + if IsServer() then + --ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + --StopSoundOn( "Dungeon.ArcherPullArrow", self:GetCaster() ) + + self.attack_speed = self:GetSpecialValueFor( "attack_speed" ) + self.attack_width_initial = self:GetSpecialValueFor( "attack_width_initial" ) + self.attack_width_end = self:GetSpecialValueFor( "attack_width_end" ) + self.attack_distance = self:GetSpecialValueFor( "attack_distance" ) + self.attack_damage = self:GetSpecialValueFor( "attack_damage" ) + self.duration = self:GetSpecialValueFor( "duration" ) + self.break_duration = self:GetSpecialValueFor( "break_duration" ) + + local vPos = nil + if self:GetCursorTarget() then + vPos = self:GetCursorTarget():GetOrigin() + else + vPos = self:GetCursorPosition() + end + + local vDirection = vPos - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + self.attack_speed = self.attack_speed * ( self.attack_distance / ( self.attack_distance - self.attack_width_initial ) ) + + local info = { + EffectName = "particles/dungeon_bandit_archer_crescent_arrow.vpcf", + Ability = self, + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = self.attack_width_initial, + fEndRadius = self.attack_width_end, + vVelocity = vDirection * self.attack_speed, + fDistance = self.attack_distance, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO, + } + + ProjectileManager:CreateLinearProjectile( info ) + + EmitSoundOn( "Dungeon.ArcherShootArrow", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function bandit_archer_arrow:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + if hTarget ~= nil and ( not hTarget:IsMagicImmune() ) and ( not hTarget:IsInvulnerable() ) then + local damage = { + victim = hTarget, + attacker = self:GetCaster(), + damage = self.attack_damage, + damage_type = self:GetAbilityDamageType(), + ability = self + } + ApplyDamage( damage ) + + hTarget:AddNewModifier( self:GetCaster(), nil, "modifier_bandit_archer_arrow_debuff", { duration = self.break_duration } ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", hTarget:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, hTarget:GetOrigin() ) + if self:GetCaster() then + ParticleManager:SetParticleControlForward( nFXIndex, 1, -self:GetCaster():GetForwardVector() ) + end + ParticleManager:SetParticleControlEnt( nFXIndex, 10, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Dungeon.BloodSplatterImpact", hTarget ) + end + + return true + end +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bandit_stifling_dagger.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bandit_stifling_dagger.lua new file mode 100755 index 0000000..5ce6e7f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bandit_stifling_dagger.lua @@ -0,0 +1,133 @@ + +bandit_stifling_dagger = class({}) +LinkLuaModifier( "modifier_phantom_assassin_stiflingdagger_caster", "modifiers/creatures/modifier_phantom_assassin_stiflingdagger_caster", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_phantom_assassin_stiflingdagger", "modifiers/creatures/modifier_phantom_assassin_stiflingdagger", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function bandit_stifling_dagger:Precache( context ) + PrecacheResource( "particle", "particles/creatures/bandit_captain/phantom_assassin_linear_dagger.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function bandit_stifling_dagger:OnAbilityPhaseStart() + if IsServer() then + local nRadius = 100 + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( nRadius, nRadius, nRadius ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 26, 26 ) ) + + EmitSoundOn( "Creature.StartCast", self:GetCaster() ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function bandit_stifling_dagger:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + StopSoundOn( "Creature.StartCast", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function bandit_stifling_dagger:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + StopSoundOn( "Creature.StartCast", self:GetCaster() ) + end + + self.duration = self:GetSpecialValueFor( "duration" ) + self.dagger_speed = self:GetSpecialValueFor( "dagger_speed" ) + self.dagger_offset = self:GetSpecialValueFor( "dagger_offset" ) + self.dagger_count = self:GetSpecialValueFor( "dagger_count" ) + self.dagger_rate = self:GetSpecialValueFor( "dagger_rate" ) + self.dagger_range = self:GetSpecialValueFor( "dagger_range" ) + + self.vTargetLocation = self:GetCursorPosition() + self.flAccumulatedTime = 0.0 + self.vDirection = self.vTargetLocation - self:GetCaster():GetOrigin() + self.nDaggersThrown = 0 + + local vDirection = self.vTargetLocation - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + self:ThrowDagger( vDirection ) +end + +-------------------------------------------------------------------------------- + +function bandit_stifling_dagger:OnChannelThink( flInterval ) + self.flAccumulatedTime = self.flAccumulatedTime + flInterval + if self.flAccumulatedTime >= self.dagger_rate then + self.flAccumulatedTime = self.flAccumulatedTime - self.dagger_rate + + local vOffset = RandomVector( self.dagger_offset ) + vOffset.z = 0.0 + + local vDirection = ( self.vTargetLocation + vOffset ) - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + self:ThrowDagger( vDirection ) + end +end + +-------------------------------------------------------------------------------- + +function bandit_stifling_dagger:OnProjectileHit( hTarget, vLocation ) + if hTarget ~= nil and ( not hTarget:IsInvulnerable() ) then + local kv = {} + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_phantom_assassin_stiflingdagger_caster", kv ) + self:GetCaster():PerformAttack( hTarget, false, true, true, true, true, false, true ) + self:GetCaster():RemoveModifierByName( "modifier_phantom_assassin_stiflingdagger_caster" ) + + local kv = + { + duration = self.duration, + } + + hTarget:AddNewModifier( self:GetCaster(), self, "modifier_phantom_assassin_stiflingdagger", kv) + EmitSoundOn( "Dungeon.BanditDagger.Target", hTarget ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function bandit_stifling_dagger:ThrowDagger( vDirection ) + local info = + { + EffectName = "particles/creatures/bandit_captain/phantom_assassin_linear_dagger.vpcf", + Ability = self, + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = 50.0, + fEndRadius = 50.0, + vVelocity = vDirection * self.dagger_speed, + fDistance = self.dagger_range, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + } + + ProjectileManager:CreateLinearProjectile( info ) + EmitSoundOn( "Dungeon.BanditDagger.Cast", self:GetCaster() ) + + self.nDaggersThrown = self.nDaggersThrown + 1 + if self.nDaggersThrown >= self.dagger_count then + self:EndChannel( false ) + else + self:GetCaster():StartGestureWithPlaybackRate( ACT_DOTA_CAST_ABILITY_1, 1.33 ) + end +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomb_squad_landmine_detonate.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomb_squad_landmine_detonate.lua new file mode 100755 index 0000000..5979640 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomb_squad_landmine_detonate.lua @@ -0,0 +1,26 @@ +bomb_squad_landmine_detonate = class({}) +LinkLuaModifier( "modifier_bomb_squad_landmine_detonate", "modifiers/creatures/modifier_bomb_squad_landmine_detonate", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_bomb_squad_landmine_intrinsic", "modifiers/creatures/modifier_bomb_squad_landmine_intrinsic", LUA_MODIFIER_MOTION_NONE ) + + +---------------------------------------------------------------------------------------- + +function bomb_squad_landmine_detonate:Precache( context ) + PrecacheResource( "particle", "particles/econ/events/darkmoon_2017/darkmoon_calldown_marker_ring.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_techies/techies_land_mine_explode.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function bomb_squad_landmine_detonate:GetIntrinsicModifierName() + return "modifier_bomb_squad_landmine_intrinsic" +end + +-------------------------------------------------------------------------------- + +function bomb_squad_landmine_detonate:OnSpellStart() + if IsServer() then + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_bomb_squad_landmine_detonate", { duration = self:GetSpecialValueFor( "duration" ) } ) + end +end + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomb_squad_mine_charge.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomb_squad_mine_charge.lua new file mode 100755 index 0000000..d8b7463 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomb_squad_mine_charge.lua @@ -0,0 +1,51 @@ + +bomb_squad_mine_charge = class({}) +LinkLuaModifier( "modifier_bomb_squad_mine_charge", "modifiers/creatures/modifier_bomb_squad_mine_charge", LUA_MODIFIER_MOTION_HORIZONTAL ) + +---------------------------------------------------------------------------------------- + +function bomb_squad_mine_charge:Precache( context ) + +end + + +-------------------------------------------------------------------------------- + +function bomb_squad_mine_charge:OnAbilityPhaseStart() + if IsServer() then + self:GetCaster():StartGesture( ACT_DOTA_CAST_ABILITY_2 ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function bomb_squad_mine_charge:OnAbilityPhaseInterrupted() + if IsServer() then + self:GetCaster():RemoveGesture( ACT_DOTA_CAST_ABILITY_2 ) + end +end + +-------------------------------------------------------------------------------- + +function bomb_squad_mine_charge:OnSpellStart() + if IsServer() then + local vTarget = self:GetCursorPosition() + local flDist = (vTarget - self:GetCaster():GetOrigin()):Length2D() + self.speed = self:GetSpecialValueFor( "speed" ) + local flDuration = flDist / self.speed + + local kv = + { + vLocX = vTarget.x, + vLocY = vTarget.y, + vLocZ = vTarget.z, + duration = flDuration + } + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_bomb_squad_mine_charge", kv ) + EmitSoundOn( "OgreTank.Grunt", self:GetCaster() ) + end +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomb_squad_self_cast.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomb_squad_self_cast.lua new file mode 100755 index 0000000..02881b2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomb_squad_self_cast.lua @@ -0,0 +1,16 @@ + +-- + +bomb_squad_self_cast = class({}) +LinkLuaModifier( "modifier_bomb_squad_self_cast", "modifiers/creatures/modifier_bomb_squad_self_cast", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function bomb_squad_self_cast:OnSpellStart() + if IsServer() then + local kv + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_bomb_squad_self_cast", kv ) + end +end + +----------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomb_squad_stasis_launch.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomb_squad_stasis_launch.lua new file mode 100755 index 0000000..c035b62 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomb_squad_stasis_launch.lua @@ -0,0 +1,38 @@ +bomb_squad_stasis_launch = class({}) +LinkLuaModifier( "modifier_bomb_squad_stasis_trap", "modifiers/creatures/modifier_bomb_squad_stasis_trap", LUA_MODIFIER_MOTION_NONE ) +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- + +function bomb_squad_stasis_launch:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_techies/techies_stasis_trap_plant.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_techies/techies_stasis_trap_explode.vpcf", context ) + PrecacheResource("model", "models/heroes/techies/fx_techiesfx_stasis.vmdl", context) +end + + + + + +function bomb_squad_stasis_launch:OnSpellStart() + if IsServer() then + + self.vTarget = self:GetCursorPosition() + local hMine = CreateUnitByName( "npc_aghsfort_creature_bomb_squad_stasis_trap", self:GetCaster():GetAbsOrigin(), true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + hMine:AddNewModifier( self:GetCaster(), self, "modifier_bomb_squad_stasis_trap", { duration = self:GetSpecialValueFor( "mine_lifetime" ) } ) + + + hMine:SetDeathXP( 0 ) + hMine:SetMinimumGoldBounty( 0 ) + hMine:SetMaximumGoldBounty( 0 ) + + local kv = + { + vLocX = self.vTarget.x, + vLocY = self.vTarget.y, + vLocZ = self.vTarget.z, + } + hMine:SetAbsAngles( 0 , self.vTarget.y, 0 ) + hMine:AddNewModifier( self:GetCaster(), self, "modifier_frostivus2018_broodbaby_launch", kv ) + + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomber_death_explosion.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomber_death_explosion.lua new file mode 100755 index 0000000..b12a708 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomber_death_explosion.lua @@ -0,0 +1,19 @@ + +bomber_death_explosion = class({}) +LinkLuaModifier( "modifier_bomber_death_explosion_trigger", "modifiers/creatures/modifier_bomber_death_explosion_trigger", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_bomber_death_explosion", "modifiers/creatures/modifier_bomber_death_explosion", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function bomber_death_explosion:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_techies/techies_remote_mines_detonate.vpcf", context ) + PrecacheResource( "particle", "particles/dark_moon/darkmoon_calldown_marker_ring.vpcf", context ) +end + +----------------------------------------------------------------------------------------- + +function bomber_death_explosion:GetIntrinsicModifierName() + return "modifier_bomber_death_explosion_trigger" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomber_suicide_on_attack.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomber_suicide_on_attack.lua new file mode 100755 index 0000000..47066ec --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/bomber_suicide_on_attack.lua @@ -0,0 +1,11 @@ + +bomber_suicide_on_attack = class({}) +LinkLuaModifier( "modifier_bomber_suicide_on_attack", "modifiers/creatures/modifier_bomber_suicide_on_attack", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function bomber_suicide_on_attack:GetIntrinsicModifierName() + return "modifier_bomber_suicide_on_attack" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_timbersaw_chakram_dance.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_timbersaw_chakram_dance.lua new file mode 100755 index 0000000..a060de9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_timbersaw_chakram_dance.lua @@ -0,0 +1,143 @@ + +require( "utility_functions" ) + +boss_timbersaw_chakram_dance = class({}) +LinkLuaModifier( "modifier_boss_timbersaw_chakram_dance", "modifiers/creatures/modifier_boss_timbersaw_chakram_dance", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------- + +function boss_timbersaw_chakram_dance:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_chakram_aghs.vpcf", context ) + PrecacheResource( "particle", "particles/test_particle/dungeon_sand_king_channel.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_chakram_hit.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_iceblast_half.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_chakram.vpcf", context ) +end + +------------------------------------------------------------------------------- + +function boss_timbersaw_chakram_dance:OnAbilityPhaseStart() + if IsServer() then + --EmitSoundOn( "SandKingBoss.Epicenter.spell", self:GetCaster() ) + if IsGlobalAscensionCaster( self:GetCaster() ) == false then + self.nChannelFX = ParticleManager:CreateParticle( "particles/test_particle/dungeon_sand_king_channel.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + end + end + return true +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_chakram_dance:OnAbilityPhaseInterrupted() + if IsServer() then + if self.nChannelFX ~= nil then + ParticleManager:DestroyParticle( self.nChannelFX, false ) + end + end +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_chakram_dance:GetChannelAnimation() + return ACT_DOTA_GENERIC_CHANNEL_1 +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_chakram_dance:GetPlaybackRateOverride() + return 1 +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_chakram_dance:OnSpellStart() + if IsServer() then + self.hChakramAbility = self:GetCaster():FindAbilityByName( "shredder_chakram" ) + if self.hChakramAbility == nil then + self.hChakramAbility = self + end + self.pass_slow_duration = self.hChakramAbility:GetSpecialValueFor( "pass_slow_duration" ) + self.pass_damage = self.hChakramAbility:GetSpecialValueFor( "pass_damage" ) + self.radius = self.hChakramAbility:GetSpecialValueFor( "radius" ) + self.is_ascension_ability = 0 + if IsGlobalAscensionCaster( self:GetCaster() ) == true then + self.is_ascension_ability = 1 + end + + local kv = {} + kv[ "is_ascension_ability" ] = self.is_ascension_ability + kv[ "radius"] = self.radius + self.hBuff = self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_boss_timbersaw_chakram_dance", kv ) + end +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_chakram_dance:OnChannelFinish( bInterrupted ) + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_boss_timbersaw_chakram_dance" ) + self.hBuff = nil + if self.nChannelFX ~= nil then + ParticleManager:DestroyParticle( self.nChannelFX, false ) + end + end +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_chakram_dance:OnProjectileThink( vLocation ) + if IsServer() then + GridNav:DestroyTreesAroundPoint( vLocation, self.radius, true ) + end +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_chakram_dance:OnProjectileHitHandle( hTarget, vLocation, nProjectileHandle ) + if IsServer() then + if hTarget == nil then + if self.hBuff == nil then + return true + end + local Chakram = self.hBuff:GetChakram( nProjectileHandle ) + if Chakram == nil then + -- print( "error, chakram is nil? ") + return true + end + if Chakram.bReturning == false then + self.hBuff:ReturnChakram( Chakram, vLocation ) + return true + end + elseif hTarget:IsMagicImmune() == false and hTarget:IsInvulnerable() == false then + local damageInfo = + { + victim = hTarget, + attacker = self:GetCaster(), + damage = self.pass_damage, + damage_type = DAMAGE_TYPE_PURE, + ability = self.hChakramAbility, + } + if self.is_ascension_ability == 1 then + damageInfo.damage = damageInfo.damage * hTarget:GetMaxHealth() / 100.0 + end + + ApplyDamage( damageInfo ) + + hTarget:AddNewModifier( self:GetCaster(), self.hChakramAbility, "modifier_shredder_chakram_debuff", { duration = self.pass_slow_duration } ) + EmitSoundOn( "Boss_Timbersaw.Chakram.Target", hTarget ) + if hTarget:IsHero() then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_shredder/shredder_chakram_hit.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", hTarget:GetAbsOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + return false + end + end + + return true +end + +----------------------------------------------------------------------------- + +ascension_timbersaw_chakram_dance = boss_timbersaw_chakram_dance \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_timbersaw_reactive_armor.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_timbersaw_reactive_armor.lua new file mode 100755 index 0000000..2f797e0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_timbersaw_reactive_armor.lua @@ -0,0 +1,26 @@ + +boss_timbersaw_reactive_armor = class({}) +LinkLuaModifier( "modifier_boss_timbersaw_reactive_armor", "modifiers/creatures/modifier_boss_timbersaw_reactive_armor", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function boss_timbersaw_reactive_armor:Precache( context ) + + PrecacheResource( "particle", "particles/items2_fx/vanguard_active_launch.vpcf", context ) + PrecacheResource( "particle", "particles/items2_fx/pipe_of_insight_launch.vpcf", context ) + PrecacheResource( "particle", "particles/items2_fx/vanguard_active.vpcf", context ) + PrecacheResource( "particle", "particles/items2_fx/pipe_of_insight.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/boss_timbersaw/shredder_armor_lyr1.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/boss_timbersaw/shredder_armor_lyr2.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/boss_timbersaw/shredder_armor_lyr3.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/boss_timbersaw/shredder_armor_lyr4.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_reactive_hit.vpcf", context ) +end + +----------------------------------------------------------------------------------------- + +function boss_timbersaw_reactive_armor:GetIntrinsicModifierName() + return "modifier_boss_timbersaw_reactive_armor" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_timbersaw_timber_chain.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_timbersaw_timber_chain.lua new file mode 100755 index 0000000..e52bf78 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_timbersaw_timber_chain.lua @@ -0,0 +1,181 @@ +boss_timbersaw_timber_chain = class({}) + +---------------------------------------------------------------------------------------- + +function boss_timbersaw_timber_chain:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_timberchain.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_timber_chain_tree.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_timber_chain_trail.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_timber_dmg.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_tree_dmg.vpcf", context ) + +end + +-------------------------------------------------------------------------------- +--[[ +function boss_timbersaw_timber_chain:OnAbilityPhaseStart() + if IsServer() then + self.chain_radius = self:GetSpecialValueFor( "chain_radius" ) + + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( self.chain_radius, self.chain_radius, self.chain_radius ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 0, 0, 200 ) ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_timber_chain:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end +]]-- +-------------------------------------------------------------------------------- + +function boss_timbersaw_timber_chain:OnSpellStart() + if IsServer() then + --ParticleManager:DestroyParticle( self.nPreviewFX, false ) + self.chain_radius = self:GetSpecialValueFor( "chain_radius" ) + self.radius = self:GetSpecialValueFor( "radius" ) + self.speed = self:GetSpecialValueFor( "speed" ) + self.range = self:GetSpecialValueFor( "range" ) + self.stun_duration = self:GetSpecialValueFor( "stun_duration" ) + self.bRetracting = false + self.hHitTargets = {} + + local vDirection = self:GetCursorPosition() - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + local vTargetPos = self:GetCaster():GetAbsOrigin() + ( vDirection * self.range ) + Vector( 0, 0, 96 ) + self.vVelocity = vDirection * self.speed + local info = + { + Ability = self, + vSpawnOrigin = self:GetCaster():GetAbsOrigin(), + fStartRadius = self.chain_radius, + fEndRadius = self.chain_radius, + vVelocity = self.vVelocity, + fDistance = self.range, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_BOTH, + iUnitTargetType = DOTA_UNIT_TARGET_TREE, + } + + ProjectileManager:CreateLinearProjectile( info ) + + self.nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_shredder/shredder_timberchain.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nFXIndex, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_attack1", self:GetCaster():GetAbsOrigin() + Vector( 0, 0, 96 ), true ) + ParticleManager:SetParticleControl( self.nFXIndex, 1, vTargetPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 2, Vector( self.speed, 0, 0 ) ) + ParticleManager:SetParticleControl( self.nFXIndex, 3, Vector( 10, 0, 0 ) ) + + EmitSoundOn( "Hero_Shredder.TimberChain.Cast", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_timber_chain:OnProjectileThink( vLocation ) + if IsServer() then + + if self.bRetracting == false then + local hTrees = GridNav:GetAllTreesAroundPoint( vLocation, self.chain_radius, true ) + if #hTrees > 0 then + for _,Tree in pairs ( hTrees ) do + if Tree and Tree:IsStanding() then + local vTreeOrigin = Tree:GetAbsOrigin() + if self:GetCaster().Encounter and self:GetCaster().Encounter:GetRoom() and self:GetCaster().Encounter:GetRoom():IsInRoomBounds( vTreeOrigin ) then + self:OnProjectileHit( Tree, vTreeOrigin ) + return + end + end + end + end + else + if self:GetCaster():FindModifierByName( "modifier_shredder_timber_chain" ) then + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetOrigin(), me, self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, 0, 0, false ) + if #enemies > 0 then + for _,enemy in pairs( enemies ) do + if enemy and self:HasHitTarget( enemy ) == false then + table.insert( self.hHitTargets, enemy ) + enemy:AddNewModifier( self:GetCaster(), self, "modifier_stunned", { duration = self.stun_duration } ) + end + end + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_timber_chain:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + if self.bRetracting == false then + StopSoundOn( "Hero_Shredder.TimberChain.Cast", self:GetCaster() ) + + if hTarget ~= nil then + print( "found a tree" ) + EmitSoundOnLocationWithCaster( vLocation, "Hero_Shredder.TimberChain.Impact", self:GetCaster() ) + local nTreeFX = ParticleManager:CreateParticle( "particles/units/heroes/hero_shredder/shredder_timber_chain_tree.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nTreeFX, 0, vLocation + Vector( 0, 0, 96 ) ) + ParticleManager:ReleaseParticleIndex( nTreeFX ) + + local flDist = ( vLocation - self:GetCaster():GetAbsOrigin() ):Length2D() + local flDuration = flDist / self.speed + local kv = {} + kv[ "duration" ] = flDuration + kv[ "tree_index" ] = hTarget:entindex() + + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_shredder_timber_chain", kv ) + ParticleManager:SetParticleControl( self.nFXIndex, 1, vLocation + Vector( 0, 0, 96 ) ) + ParticleManager:SetParticleControl( self.nFXIndex, 3, Vector( flDuration * 2 - 0.1, 0, 0 ) ) + else + ParticleManager:SetParticleControlEnt( self.nFXIndex, 1, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, "attach_attack1", self:GetCaster():GetAbsOrigin() + Vector( 0, 0, 96 ), true ) + + local flFailChainDuration = ( self.range * 2 ) / self.speed + ParticleManager:SetParticleControl( self.nFXIndex, 3, Vector( flFailChainDuration - 0.1, 0, 0 ) ) + end + + EmitSoundOn( "Hero_Shredder.TimberChain.Retract", self:GetCaster() ) + + self.bRetracting = true + ParticleManager:ReleaseParticleIndex( self.nFXIndex ) + + local info = + { + Ability = self, + vSpawnOrigin = vLocation, + vVelocity = self.vVelocity * -1, + fDistance = self.range, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_BOTH, + iUnitTargetType = DOTA_UNIT_TARGET_TREE, + } + + ProjectileManager:CreateLinearProjectile( info ) + else + self.hHitTargets = {} + end + end + + return true +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_timber_chain:HasHitTarget( hTarget ) + for _, target in pairs( self.hHitTargets ) do + if target == hTarget then + return true + end + end + + return false +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_timbersaw_whirling_death.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_timbersaw_whirling_death.lua new file mode 100755 index 0000000..08618bc --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_timbersaw_whirling_death.lua @@ -0,0 +1,84 @@ +boss_timbersaw_whirling_death = class({}) + +---------------------------------------------------------------------------------------- + +function boss_timbersaw_whirling_death:Precache( context ) + + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/boss_timbersaw/boss_timbersaw_whirling_death.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_whirling_death_debuff.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_whirling_death:OnAbilityPhaseStart() + if IsServer() then + self.whirling_radius = self:GetSpecialValueFor( "whirling_radius" ) + + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( self.whirling_radius, self.whirling_radius, self.whirling_radius ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 26, 26 ) ) + + EmitSoundOn( "Hero_Shredder.WhirlingDeath.Cast", self:GetCaster() ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_whirling_death:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function boss_timbersaw_whirling_death:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + self.duration = self:GetSpecialValueFor( "duration" ) + self.whirling_damage = self:GetSpecialValueFor( "whirling_damage" ) + self.tree_damage_scale = self:GetSpecialValueFor( "tree_damage_scale" ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/boss_timbersaw/boss_timbersaw_whirling_death.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( self.whirling_radius, self.whirling_radius, self.whirling_radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Hero_Shredder.WhirlingDeath.Cast", self:GetCaster() ) + + local nTreeBonusDmg = 0 + local hTrees = GridNav:GetAllTreesAroundPoint( self:GetCaster():GetAbsOrigin(), self.whirling_radius, true ) + for _,Tree in pairs ( hTrees ) do + if Tree.IsStanding and Tree:IsStanding() then + nTreeBonusDmg = nTreeBonusDmg + self.tree_damage_scale + Tree:CutDown( self:GetTeamNumber() ) + end + end + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetOrigin(), nil, self.whirling_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false then + enemy:AddNewModifier( self:GetCaster(), self, "modifier_shredder_whirling_death_debuff", { duration = self.duration } ) + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.whirling_damage + nTreeBonusDmg, + damage_type = DAMAGE_TYPE_PURE, + ability = self, + } + ApplyDamage( damageInfo ) + end + end + + end +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_visage_familiar_stone_form.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_visage_familiar_stone_form.lua new file mode 100755 index 0000000..898bd64 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_visage_familiar_stone_form.lua @@ -0,0 +1,34 @@ + +boss_visage_familiar_stone_form = class({}) +LinkLuaModifier( "modifier_boss_visage_familiar_stone_form_buff", "modifiers/creatures/modifier_boss_visage_familiar_stone_form_buff", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_boss_visage_familiar_statue_stone_form", "modifiers/creatures/modifier_boss_visage_familiar_statue_stone_form", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_boss_visage_familiar_passive", "modifiers/creatures/modifier_boss_visage_familiar_passive", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function boss_visage_familiar_stone_form:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_visage/visage_stone_form.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_earth_spirit_petrify.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_visage.vsndevts", context ) +end + +----------------------------------------------------------------------------- + +function boss_visage_familiar_stone_form:GetIntrinsicModifierName() + return "modifier_boss_visage_familiar_passive" +end + +----------------------------------------------------------------------------- + +function boss_visage_familiar_stone_form:OnSpellStart() + if IsServer() then + local szBuffName = "modifier_boss_visage_familiar_stone_form_buff" + if self:GetCaster():GetUnitName() == "npc_dota_boss_visage_familiar_statue" then + szBuffName = "modifier_boss_visage_familiar_statue_stone_form" + end + self:GetCaster():AddNewModifier( self:GetCaster(), self, szBuffName, {} ) + self:GetCaster():StartGesture( ACT_DOTA_CAST_ABILITY_1 ) + end +end + +----------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_visage_grave_chill.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_visage_grave_chill.lua new file mode 100755 index 0000000..33d6322 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_visage_grave_chill.lua @@ -0,0 +1,145 @@ +boss_visage_grave_chill = class({}) + + +---------------------------------------------------------------------------------------- + +function boss_visage_grave_chill:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_visage/visage_base_attack.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_visage.vsndevts", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_necrolyte/necrolyte_pulse_enemy.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_vengeful/vengeful_wave_of_terror.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function boss_visage_grave_chill:OnAbilityPhaseStart() + if IsServer() then + EmitSoundOn( "Hero_Visage.preAttack", self:GetCaster() ) + end + return true +end + +-------------------------------------------------------------------------------- + +function boss_visage_grave_chill:OnSpellStart() + if IsServer() then + self.chill_speed = self:GetSpecialValueFor( "chill_speed" ) + self.chill_radius = self:GetSpecialValueFor( "chill_radius" ) + self.chill_count = self:GetSpecialValueFor( "chill_count" ) + self.chill_damage = self:GetSpecialValueFor( "chill_damage" ) + + if self:GetCaster():GetHealthPercent() < 60 then + self.chill_speed = self.chill_speed * 2 + self.chill_count = self.chill_count + 2 + end + + if self.bStatuesInit == nil then + --print( "setting statue pairs ") + --print ( "Num east statues " .. #self:GetCaster().EastStatues ) + --print ( "Num west statues " .. #self:GetCaster().WestStatues ) + for k,v in pairs ( self:GetCaster().EastStatues ) do + local flShortestDist = 9999999 + local nPairIndex = nil + for i,j in pairs ( self:GetCaster().WestStatues ) do + local flDist = ( v:GetAbsOrigin() - j:GetAbsOrigin() ):Length2D() + if flDist < flShortestDist then + flShortestDist = flDist + nPairIndex = i + end + end + --print( "East statue at key " .. k .. " has partner in west at key " .. nPairIndex ) + v.nTargetPairIndex = nPairIndex + self:GetCaster().WestStatues[ nPairIndex ].nTargetPairIndex = k + end + self.bStatuesInit = true + end + + local bEast = true + local EastStatues = deepcopy( self:GetCaster().EastStatues ) + local WestStatues = deepcopy( self:GetCaster().WestStatues ) + for i=1,self.chill_count do + local hSource = nil + local hTarget = nil + local k = nil + if bEast then + k = RandomInt( 1, #EastStatues ) + hSource = EastStatues[ k ] + hTarget = WestStatues[ hSource.nTargetPairIndex ] + table.remove( EastStatues, k ) + table.remove( WestStatues, hSource.nTargetPairIndex ) + else + k = RandomInt( 1, #WestStatues ) + hSource = WestStatues[ k ] + hTarget = EastStatues[ hSource.nTargetPairIndex ] + table.remove( WestStatues, k ) + table.remove( EastStatues, hSource.nTargetPairIndex ) + end + + if hTarget ~= nil and hSource ~= nil then + local vDirection = hTarget:GetAbsOrigin() - hSource:GetAbsOrigin() + local flDist = vDirection:Length2D() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + local info = + { + EffectName = "particles/units/heroes/hero_vengeful/vengeful_wave_of_terror.vpcf", + Ability = self, + vSpawnOrigin = hSource:GetAbsOrigin(), + fStartRadius = self.chill_radius, + fEndRadius = self.chill_radius, + vVelocity = vDirection * self.chill_speed, + fDistance = flDist, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING, + } + + ProjectileManager:CreateLinearProjectile( info ) + EmitSoundOn( "Hero_Visage.Attack", hSource ) + end + + bEast = not bEast + end + end +end + +-------------------------------------------------------------------------------- + +function boss_visage_grave_chill:OnProjectileThinkHandle( nProjectileHandle ) + if IsServer() then + local vLocation = ProjectileManager:GetTrackingProjectileLocation( nProjectileHandle ) + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), vLocation, nil, self.chill_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false ) + if #enemies == 0 then + return + end + + + ProjectileManager:DestroyTrackingProjectile( nProjectileHandle ) + end +end + +---------------------------------------------------------------------------------------- + +function boss_visage_grave_chill:OnProjectileHitHandle( hTarget, vLocation, nProjectileHandle ) + if IsServer() then + if hTarget and hTarget:IsMagicImmune() == false and hTarget:IsInvulnerable() == false then + self.chill_duration = self:GetSpecialValueFor( "chill_duration" ) + hTarget:AddNewModifier( self:GetCaster(), self, "modifier_visage_grave_chill_debuff", { duration = self.chill_duration } ) + EmitSoundOn( "Hero_Visage.GraveChill.Target", hTarget ) + + local damage = + { + victim = hTarget, + attacker = self:GetCaster(), + damage = self.chill_damage, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self, + } + + ApplyDamage( damage ) + end + end + return true +end + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_visage_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_visage_passive.lua new file mode 100755 index 0000000..83789a0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_visage_passive.lua @@ -0,0 +1,69 @@ +boss_visage_passive = class({}) + +LinkLuaModifier( "modifier_boss_visage_passive", "modifiers/creatures/modifier_boss_visage_passive", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function boss_visage_passive:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_visage/visage_soul_assumption_bolt6.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_earth_spirit_petrify.vpcf", context ) + PrecacheResource( "particle", "particles/act_2/storegga_channel.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_visage.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/voscripts/game_sounds_vo_visage.vsndevts", context ) +end + +---------------------------------------------------------------------------------------- + +function boss_visage_passive:GetIntrinsicModifierName() + return "modifier_boss_visage_passive" +end + +------------------------------------------------------------------------------- + +function boss_visage_passive:OnProjectileThinkHandle( nProjectileHandle ) + if IsServer() and self:GetCaster() ~= nil then + self.soul_assumption_radius = self:GetSpecialValueFor( "soul_assumption_radius" ) + local vLocation = ProjectileManager:GetTrackingProjectileLocation( nProjectileHandle ) + local hFamiliars = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), vLocation, nil, self.soul_assumption_radius, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false ) + for _,Familiar in pairs ( hFamiliars ) do + if Familiar ~= nil and Familiar:GetUnitName() == "npc_dota_boss_visage_familiar" then + self:WakeFamiliar( Familiar ) + ProjectileManager:DestroyTrackingProjectile( nProjectileHandle ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function boss_visage_passive:WakeFamiliar( hFamiliar ) + if IsServer() then + print( "Waking familiar!" ) + hFamiliar:RemoveModifierByName( "modifier_boss_visage_familiar_stone_form_buff" ) + end +end + +-------------------------------------------------------------------------------- + +function boss_visage_passive:OnProjectileHit( hTarget, vLocation ) + if IsServer() == false or hTarget == nil then + return true + end + + if hTarget:IsMagicImmune() == false and hTarget:IsInvulnerable() == false then + local damageInfo = + { + victim = hTarget, + attacker = self:GetCaster(), + damage = self:GetSpecialValueFor( "soul_assumption_damage" ), + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + + EmitSoundOn( "Hero_Visage.SoulAssumption.Target", hTarget ) + end + + return true +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_visage_ranged_attack.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_visage_ranged_attack.lua new file mode 100755 index 0000000..21e5e97 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/boss_visage_ranged_attack.lua @@ -0,0 +1,93 @@ +boss_visage_ranged_attack = class({}) + +---------------------------------------------------------------------------------------- + +function boss_visage_ranged_attack:Precache( context ) + PrecacheResource( "particle", "particles/creatures/visage_boss_base_attack.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/quill_beast/test_model_cluster_linear_projectile.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_bristleback/bristleback_quill_spray_impact.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_visage.vsndevts", context ) + + self.Projectiles = {} +end + +-------------------------------------------------------------------------------- + +function boss_visage_ranged_attack:OnAbilityPhaseStart() + if IsServer() then + EmitSoundOn( "Hero_Visage.preAttack", self:GetCaster() ) + end + return true +end + +-------------------------------------------------------------------------------- + +function boss_visage_ranged_attack:OnSpellStart() + if IsServer() then + self.attack_speed = self:GetSpecialValueFor( "attack_speed" ) + self.attack_width_initial = self:GetSpecialValueFor( "attack_width_initial" ) + self.attack_width_end = self:GetSpecialValueFor( "attack_width_end" ) + self.attack_distance = self:GetSpecialValueFor( "attack_distance" ) + self.attack_damage = self:GetSpecialValueFor( "attack_damage" ) + + local vPos = nil + if self:GetCursorTarget() then + vPos = self:GetCursorTarget():GetOrigin() + else + vPos = self:GetCursorPosition() + end + + local vDirection = vPos - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + self.attack_speed = self.attack_speed * ( self.attack_distance / ( self.attack_distance - self.attack_width_initial ) ) + + local info = { + EffectName = "particles/creatures/quill_beast/test_model_cluster_linear_projectile.vpcf", + Ability = self, + vSpawnOrigin = self:GetCaster():GetAttachmentOrigin( self:GetCaster():ScriptLookupAttachment( "attach_attack1" ) ), + fStartRadius = self.attack_width_initial, + fEndRadius = self.attack_width_end, + vVelocity = vDirection * self.attack_speed, + fDistance = self.attack_distance, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING, + } + + ProjectileManager:CreateLinearProjectile( info ) + EmitSoundOn( "Hero_Visage.Attack", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function boss_visage_ranged_attack:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + if hTarget ~= nil and ( not hTarget:IsMagicImmune() ) and ( not hTarget:IsInvulnerable() ) then + local damage = { + victim = hTarget, + attacker = self:GetCaster(), + damage = self.attack_damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self + } + + ApplyDamage( damage ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_bristleback/bristleback_quill_spray_impact.vpcf", PATTACH_CUSTOMORIGIN, hTarget ); + ParticleManager:SetParticleControlEnt( nFXIndex, 0, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetOrigin(), true ); + ParticleManager:SetParticleControlEnt( nFXIndex, 1, hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", hTarget:GetOrigin(), true ); + ParticleManager:SetParticleControlEnt( nFXIndex, 2, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetOrigin(), true ); + ParticleManager:ReleaseParticleIndex( nFXIndex ); + + EmitSoundOn( "Hero_Visage.projectileImpact", hTarget ) + end + + return true + end +end + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/brewmaster_unit_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/brewmaster_unit_passive.lua new file mode 100755 index 0000000..49f62de --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/brewmaster_unit_passive.lua @@ -0,0 +1,12 @@ + +brewmaster_unit_passive = class({}) +LinkLuaModifier( "modifier_brewmaster_unit_passive", "modifiers/creatures/modifier_brewmaster_unit_passive", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function brewmaster_unit_passive:GetIntrinsicModifierName() + return "modifier_brewmaster_unit_passive" +end + +----------------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/broodmother_accrue_children.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/broodmother_accrue_children.lua new file mode 100755 index 0000000..512eb54 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/broodmother_accrue_children.lua @@ -0,0 +1,22 @@ + +broodmother_accrue_children = class({}) +LinkLuaModifier( "modifier_broodmother_accrue_children", "modifiers/creatures/modifier_broodmother_accrue_children", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_broodmother_generate_children", "modifiers/creatures/modifier_broodmother_generate_children", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function broodmother_accrue_children:Precache( context ) + + PrecacheUnitByNameSync( "npc_dota_dummy_caster", context, -1 ) + PrecacheResource( "particle", "particles/baby_brood_venom_pool.vpcf", context ) + PrecacheUnitByNameSync( "npc_dota_creature_broodmother_baby_c", context, -1 ) + +end + +-------------------------------------------------------------------------------- + +function broodmother_accrue_children:GetIntrinsicModifierName() + return "modifier_broodmother_accrue_children" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/broodmother_generate_children.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/broodmother_generate_children.lua new file mode 100755 index 0000000..4f7e14d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/broodmother_generate_children.lua @@ -0,0 +1,22 @@ + +-- Note: this ability gets added by hand to the dummy unit that Broodmother creates. + +broodmother_generate_children = class({}) +LinkLuaModifier( "modifier_broodmother_generate_children", "modifiers/creatures/modifier_broodmother_generate_children", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function broodmother_generate_children:Precache( context ) + + PrecacheResource( "particle", "particles/baby_brood_venom_pool.vpcf", context ) + PrecacheUnitByNameSync( "npc_dota_creature_broodmother_baby_c", context, -1 ) + +end + +-------------------------------------------------------------------------------- + +function broodmother_generate_children:GetIntrinsicModifierName() + return "modifier_broodmother_generate_children" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/broodmother_web.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/broodmother_web.lua new file mode 100755 index 0000000..6dac21f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/broodmother_web.lua @@ -0,0 +1,123 @@ + +broodmother_web = class({}) +LinkLuaModifier( "modifier_broodmother_web", "modifiers/creatures/modifier_broodmother_web", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function broodmother_web:Precache( context ) + + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_venomancer/venomancer_venomous_gale.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_venomancer/venomancer_venomous_gale_impact.vpcf", context ) + PrecacheResource( "particle", "particles/items2_fx/rod_of_atos.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function broodmother_web:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function broodmother_web:OnAbilityPhaseStart() + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 100, 100, 100 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 0, 100 ) ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function broodmother_web:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function broodmother_web:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + self.projectile_distance = self:GetSpecialValueFor( "projectile_distance" ) + self.projectile_speed = self:GetSpecialValueFor( "projectile_speed" ) + self.projectile_radius = self:GetSpecialValueFor( "projectile_radius" ) + self.damage = self:GetSpecialValueFor( "damage" ) + self.root_duration = self:GetSpecialValueFor( "root_duration" ) + + self.knockback_distance = self:GetSpecialValueFor( "knockback_distance" ) + self.knockback_height = self:GetSpecialValueFor( "knockback_height" ) + self.knockback_duration = self:GetSpecialValueFor( "knockback_duration" ) + + local vPos = self:GetCursorPosition() + local vDirection = vPos - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + local info = { + EffectName = "particles/units/heroes/hero_venomancer/venomancer_venomous_gale.vpcf", + Ability = self, + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = self.projectile_radius, + fEndRadius = self.projectile_radius, + vVelocity = vDirection * self.projectile_speed, + fDistance = self.projectile_distance, + Source = self:GetCaster(), + iUnitTargetTeam = self:GetAbilityTargetTeam(), + iUnitTargetType = self:GetAbilityTargetType(), + } + + ProjectileManager:CreateLinearProjectile( info ) + + EmitSoundOn( "Spider.PoisonSpit", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function broodmother_web:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + if hTarget ~= nil and ( not hTarget:IsMagicImmune() ) and ( not hTarget:IsInvulnerable() ) then + local damage = + { + victim = hTarget, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = self:GetAbilityDamageType(), + ability = self, + } + ApplyDamage( damage ) + + local kv_knockback = + { + center_x = vLocation.x, + center_y = vLocation.y, + center_z = vLocation.z, + should_stun = false, + duration = self.knockback_duration, + knockback_duration = self.knockback_duration, + knockback_distance = self.knockback_distance, + knockback_height = self.knockback_height, + } + hTarget:AddNewModifier( self:GetCaster(), self, "modifier_knockback", kv_knockback ) + + hTarget:AddNewModifier( self:GetCaster(), self, "modifier_broodmother_web", { duration = self.root_duration } ) + + ParticleManager:ReleaseParticleIndex( ParticleManager:CreateParticle( "particles/units/heroes/hero_venomancer/venomancer_venomous_gale_impact.vpcf", PATTACH_ABSORIGIN_FOLLOW, hTarget ) ) + + EmitSoundOn( "Spider.PoisonSpit.Impact", self:GetCaster() ) + end + + return true + end +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/burrower_big_explosion.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/burrower_big_explosion.lua new file mode 100755 index 0000000..60bce7c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/burrower_big_explosion.lua @@ -0,0 +1,75 @@ + +burrower_big_explosion = class({}) + +---------------------------------------------------------------------------------------- + +function burrower_big_explosion:Precache( context ) + + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + PrecacheResource( "particle", "particles/nyx_swarm_explosion/nyx_swarm_explosion.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function burrower_big_explosion:OnAbilityPhaseStart() + if IsServer() then + self.radius = self:GetSpecialValueFor( "radius" ) + --self.duration = self:GetSpecialValueFor( "duration" ) + self.damage = self:GetSpecialValueFor( "damage" ) + + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( radius, radius, radius ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 26, 26 ) ) + + EmitSoundOn( "Burrower.PreSuicide", self:GetCaster() ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function burrower_big_explosion:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function burrower_big_explosion:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + local nFXIndex2 = ParticleManager:CreateParticle( "particles/nyx_swarm_explosion/nyx_swarm_explosion.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex2, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex2, 1, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex2, 2, Vector( self.radius, self.radius, self.radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex2 ) + + EmitSoundOn( "Burrower.Explosion", self:GetCaster() ) + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetOrigin(), nil, self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BUILDING, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + for _,hEnemy in pairs( enemies ) do + if hEnemy ~= nil and hEnemy:IsAlive() and hEnemy:IsInvulnerable() == false then + local damageInfo = + { + victim = hEnemy, + attacker = self:GetCaster(), + damage = self.damage, + --damage_type = DAMAGE_TYPE_MAGICAL, + damage_type = self:GetAbilityDamageType(), + ability = self, + } + ApplyDamage( damageInfo ) + --hEnemy:AddNewModifier( self:GetCaster(), self, "modifier_polar_furbolg_ursa_warrior_thunder_clap", { duration = self.duration } ) + end + end + + self:GetCaster():ForceKill( false ) + end +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_bonus_chicken.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_bonus_chicken.lua new file mode 100755 index 0000000..0485b29 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_bonus_chicken.lua @@ -0,0 +1,14 @@ +creature_bonus_chicken = class({}) +LinkLuaModifier( "modifier_creature_bonus_chicken", "modifiers/modifier_creature_bonus_chicken", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function creature_bonus_chicken:Precache( context ) + PrecacheItemByNameSync( "item_bag_of_gold", context ) +end + +-------------------------------------------------------------------------------- + +function creature_bonus_chicken:GetIntrinsicModifierName() + return "modifier_creature_bonus_chicken" +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_bonus_greevil.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_bonus_greevil.lua new file mode 100755 index 0000000..d305ad1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_bonus_greevil.lua @@ -0,0 +1,14 @@ +creature_bonus_greevil = class({}) +LinkLuaModifier( "modifier_creature_bonus_greevil", "modifiers/modifier_creature_bonus_greevil", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function creature_bonus_greevil:Precache( context ) + PrecacheItemByNameSync( "item_bag_of_gold", context ) +end + +-------------------------------------------------------------------------------- + +function creature_bonus_greevil:GetIntrinsicModifierName() + return "modifier_creature_bonus_greevil" +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_generic_high_status_resist_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_generic_high_status_resist_passive.lua new file mode 100755 index 0000000..7142c43 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_generic_high_status_resist_passive.lua @@ -0,0 +1,8 @@ +creature_generic_high_status_resist_passive = class({}) +LinkLuaModifier( "modifier_creature_generic_high_status_resist_passive", "modifiers/creatures/modifier_creature_generic_high_status_resist_passive", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function creature_generic_high_status_resist_passive:GetIntrinsicModifierName() + return "modifier_creature_generic_high_status_resist_passive" +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_landmine_detonate.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_landmine_detonate.lua new file mode 100755 index 0000000..12b7b7a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_landmine_detonate.lua @@ -0,0 +1,10 @@ +creature_landmine_detonate = class({}) +LinkLuaModifier( "modifier_creature_landmine_detonate", "modifiers/creatures/modifier_creature_landmine_detonate", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function creature_landmine_detonate:OnSpellStart() + if IsServer() then + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_creature_landmine_detonate", { duration = self:GetSpecialValueFor( "duration" ) } ) + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_pudge_miniboss_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_pudge_miniboss_passive.lua new file mode 100755 index 0000000..cea7456 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_pudge_miniboss_passive.lua @@ -0,0 +1,8 @@ +creature_pudge_miniboss_passive = class({}) +LinkLuaModifier( "modifier_creature_pudge_miniboss_passive", "modifiers/creatures/modifier_creature_pudge_miniboss_passive", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function creature_pudge_miniboss_passive:GetIntrinsicModifierName() + return "modifier_creature_pudge_miniboss_passive" +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_shadow_wave.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_shadow_wave.lua new file mode 100755 index 0000000..ef2d22e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_shadow_wave.lua @@ -0,0 +1,156 @@ +creature_shadow_wave = class({}) + +---------------------------------------------------------------------------------------- + +function creature_shadow_wave:Precache( context ) + + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_dazzle/dazzle_shadow_wave.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_dazzle/dazzle_shadow_wave_impact_damage.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function creature_shadow_wave:OnAbilityPhaseStart() + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 75, 75, 75 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 230, 100, 223 ) ) + end + return true +end + +-------------------------------------------------------------------------------- + +function creature_shadow_wave:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end +-------------------------------------------------------------------------------- + +function creature_shadow_wave:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + local hTarget = self:GetCursorTarget() + if hTarget ~= nil then + self.bounce_radius = self:GetSpecialValueFor( "bounce_radius" ) + self.damage_radius = self:GetSpecialValueFor( "damage_radius" ) + self.damage = self:GetSpecialValueFor( "damage" ) + self.max_targets = self:GetSpecialValueFor( "max_targets" ) + + self.nCurJumpCount = 1 + self.hHitEntities = {} + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_dazzle/dazzle_shadow_wave.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_attack1", self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", hTarget:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( self.damage_radius, 0, 0 ) ) + ParticleManager:SetParticleControlEnt( nFXIndex, 3, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + self.vTargetLoc = self:GetCaster():GetOrigin() + + self:DoHealAndDamage( self:GetCaster() ) + table.insert( self.hHitEntities, self:GetCaster() ) + + EmitSoundOn( "Wildwing.Shadow_Wave", self:GetCaster() ) + + local nFXIndex2 = ParticleManager:CreateParticle( "particles/units/heroes/hero_dazzle/dazzle_shadow_wave.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex2, 0, self:GetCaster():GetOrigin() ) + ParticleManager:SetParticleControlEnt( nFXIndex2, 1, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex2, 2, Vector( self.damage_radius, 0, 0 ) ) + ParticleManager:SetParticleControlEnt( nFXIndex2, 3, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex2 ) + + self.vTargetLoc = hTarget:GetOrigin() + if self:GetCaster() ~= hTarget then + self:DoHealAndDamage( hTarget ) + + local nFXIndex3 = ParticleManager:CreateParticle( "particles/units/heroes/hero_dazzle/dazzle_shadow_wave.vpcf", PATTACH_CUSTOMORIGIN, hTarget ) + ParticleManager:SetParticleControl( nFXIndex3, 0, self.vTargetLoc ) + ParticleManager:SetParticleControlEnt( nFXIndex3, 1, hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", hTarget:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex3, 2, Vector( self.damage_radius, 0, 0 ) ) + ParticleManager:SetParticleControlEnt( nFXIndex3, 3, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex3 ) + + self.vTargetLoc = hTarget:GetOrigin() + table.insert( self.hHitEntities, hTarget ) + else + self.nCurJumpCount = self.nCurJumpCount - 1 + end + + while self.nCurJumpCount < self.max_targets do + local hBestJumpTarget = nil + + local friendlies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self.vTargetLoc, self:GetCaster(), self.bounce_radius, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,friendly in pairs(friendlies) do + if friendly ~= nil and not self:HasHitTarget( friendly ) then + hBestJumpTarget = friendly + end + end + + if hBestJumpTarget ~= nil then + + self:DoHealAndDamage( hBestJumpTarget ) + + local nFXIndex4 = ParticleManager:CreateParticle( "particles/units/heroes/hero_dazzle/dazzle_shadow_wave.vpcf", PATTACH_CUSTOMORIGIN, hBestJumpTarget ) + ParticleManager:SetParticleControl( nFXIndex4, 0, self.vTargetLoc ) + ParticleManager:SetParticleControlEnt( nFXIndex4, 1, hBestJumpTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", hBestJumpTarget:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex4, 2, Vector( self.damage_radius, 0, 0 ) ) + ParticleManager:SetParticleControlEnt( nFXIndex4, 3, hBestJumpTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hBestJumpTarget:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex4 ) + + self.vTargetLoc = hBestJumpTarget:GetOrigin() + table.insert( self.hHitEntities, hTarget ) + end + self.nCurJumpCount = self.nCurJumpCount + 1 + end + end + end +end + +-------------------------------------------------------------------------------- + +function creature_shadow_wave:DoHealAndDamage( hTarget ) + if IsServer() then + hTarget:Heal( self.damage, self ) + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), hTarget:GetOrigin(), self:GetCaster(), self.damage_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + if #enemies > 0 then + for _,enemy in pairs(enemies) do + if enemy ~= nil then + local damage = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + damage_flags = DOTA_DAMAGE_FLAG_BYPASSES_BLOCK, + ability = self + } + ApplyDamage( damage ) + local vDir = enemy:GetOrigin() - hTarget:GetOrigin() + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_dazzle/dazzle_shadow_wave_impact_damage.vpcf", PATTACH_CUSTOMORIGIN, enemy ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, vDir ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function creature_shadow_wave:HasHitTarget( hTarget ) + for _,hHitTarget in pairs ( self.hHitEntities ) do + if hHitTarget == hTarget then + return true + end + end + + return false +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_techies_land_mine.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_techies_land_mine.lua new file mode 100755 index 0000000..3fbc7b7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/creature_techies_land_mine.lua @@ -0,0 +1,13 @@ + +creature_techies_land_mine = class({}) +LinkLuaModifier( "modifier_creature_techies_land_mine", "modifiers/creatures/modifier_creature_techies_land_mine", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function creature_techies_land_mine:OnSpellStart() + if IsServer() then + + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/dummy_caster_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/dummy_caster_passive.lua new file mode 100755 index 0000000..fdfa122 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/dummy_caster_passive.lua @@ -0,0 +1,13 @@ + +dummy_caster_passive = class({}) + +LinkLuaModifier( "modifier_dummy_caster_passive", "modifiers/creatures/modifier_dummy_caster_passive", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function dummy_caster_passive:GetIntrinsicModifierName() + return "modifier_dummy_caster_passive" +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/dummy_target_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/dummy_target_passive.lua new file mode 100755 index 0000000..1580b65 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/dummy_target_passive.lua @@ -0,0 +1,13 @@ + +dummy_target_passive = class({}) + +LinkLuaModifier( "modifier_dummy_target_passive", "modifiers/creatures/modifier_dummy_target_passive", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function dummy_target_passive:GetIntrinsicModifierName() + return "modifier_dummy_target_passive" +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/earth_spirit_statue_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/earth_spirit_statue_passive.lua new file mode 100755 index 0000000..ec7409b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/earth_spirit_statue_passive.lua @@ -0,0 +1,18 @@ + +earth_spirit_statue_passive = class({}) +LinkLuaModifier( "modifier_earth_spirit_statue_passive", "modifiers/creatures/modifier_earth_spirit_statue_passive", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_earth_spirit_statue_stoneform", "modifiers/creatures/modifier_earth_spirit_statue_stoneform", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function earth_spirit_statue_passive:Precache( context ) + PrecacheModel( "models/heroes/attachto_ghost/attachto_ghost.vmdl", context ) +end + +----------------------------------------------------------------------------------------- + +function earth_spirit_statue_passive:GetIntrinsicModifierName() + return "modifier_earth_spirit_statue_passive" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/elemental_tiny_tree_attack.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/elemental_tiny_tree_attack.lua new file mode 100755 index 0000000..668c3c1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/elemental_tiny_tree_attack.lua @@ -0,0 +1,15 @@ + +elemental_tiny_tree_attack = class({}) + + +function elemental_tiny_tree_attack:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_tiny/tiny_craggy_cleave.vpcf", context ) +end + +----------------------------------------------------------------------------------------- + +function elemental_tiny_tree_attack:GetIntrinsicModifierName() + return "modifier_tiny_tree_grab" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ember_spirit_fireball.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ember_spirit_fireball.lua new file mode 100755 index 0000000..c867c02 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ember_spirit_fireball.lua @@ -0,0 +1,107 @@ + +ember_spirit_fireball = class({}) + +-------------------------------------------------------------------------------- + +function ember_spirit_fireball:Precache( context ) + PrecacheResource( "particle", "particles/lycanboss_ruptureball_gale.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function ember_spirit_fireball:GetPlaybackRateOverride() + return 0.3333 +end + +-------------------------------------------------------------------------------- + +function ember_spirit_fireball:OnAbilityPhaseStart() + if IsServer() then + --EmitSoundOn( "lycan_lycan_attack_09", self:GetCaster() ) + + self.preview_fx_radius = self:GetSpecialValueFor( "preview_fx_radius" ) + + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( self.preview_fx_radius, self.preview_fx_radius, self.preview_fx_radius ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 247, 86, 9 ) ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function ember_spirit_fireball:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function ember_spirit_fireball:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + self.projectile_speed = self:GetSpecialValueFor( "projectile_speed" ) + self.projectile_width_initial = self:GetSpecialValueFor( "projectile_width_initial" ) + self.projectile_width_end = self:GetSpecialValueFor( "projectile_width_end" ) + self.projectile_distance = self:GetSpecialValueFor( "projectile_distance" ) + self.impact_damage = self:GetSpecialValueFor( "impact_damage" ) + + local vPos = nil + if self:GetCursorTarget() then + vPos = self:GetCursorTarget():GetOrigin() + else + vPos = self:GetCursorPosition() + end + + local vDirection = vPos - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + self.projectile_speed = self.projectile_speed * ( self.projectile_distance / ( self.projectile_distance - self.projectile_width_initial ) ) + + local info = { + EffectName = "particles/lycanboss_ruptureball_gale.vpcf", + Ability = self, + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = self.projectile_width_initial, + fEndRadius = self.projectile_width_end, + vVelocity = vDirection * self.projectile_speed, + fDistance = self.projectile_distance, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO, + } + + ProjectileManager:CreateLinearProjectile( info ) + --EmitSoundOn( "Lycan.RuptureBall", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function ember_spirit_fireball:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + if hTarget ~= nil and ( not hTarget:IsMagicImmune() ) and ( not hTarget:IsInvulnerable() ) then + --EmitSoundOn( "Lycan.RuptureBall.Impact", hTarget ); + + hTarget:AddNewModifier( self:GetCaster(), self, "modifier_disarmed", { duration = self:GetSpecialValueFor( "disarm_duration" ) } ) + + local damage = { + victim = hTarget, + attacker = self:GetCaster(), + damage = self.impact_damage, + damage_type = self:GetAbilityDamageType(), + ability = self + } + ApplyDamage( damage ) + end + + return true + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/enraged_wildkin_tornado_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/enraged_wildkin_tornado_passive.lua new file mode 100755 index 0000000..93ed3da --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/enraged_wildkin_tornado_passive.lua @@ -0,0 +1,11 @@ + +enraged_wildkin_tornado_passive = class({}) +LinkLuaModifier( "modifier_enraged_wildkin_tornado_passive", "modifiers/creatures/modifier_enraged_wildkin_tornado_passive", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function enraged_wildkin_tornado_passive:GetIntrinsicModifierName() + return "modifier_enraged_wildkin_tornado_passive" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/enraged_wildwing_create_tornado.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/enraged_wildwing_create_tornado.lua new file mode 100755 index 0000000..fc217f9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/enraged_wildwing_create_tornado.lua @@ -0,0 +1,95 @@ + +enraged_wildwing_create_tornado = class({}) +LinkLuaModifier( "modifier_enraged_wildkin_tornado_passive", "modifiers/creatures/modifier_enraged_wildkin_tornado_passive", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_enraged_wildkin_tornado_passive_debuff", "modifiers/creatures/modifier_enraged_wildkin_tornado_passive_debuff", LUA_MODIFIER_MOTION_NONE ) + +require( "aghanim_utility_functions" ) +-------------------------------------------------------------------- + +function enraged_wildwing_create_tornado:Precache( context ) + + PrecacheResource( "particle", "particles/neutral_fx/tornado_ambient.vpcf", context ) + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/enraged_wildkin/enraged_wildkin_tornado.vpcf", context ) + PrecacheUnitByNameSync( "npc_aghsfort_creature_enraged_wildwing_tornado", context, -1 ) +end + +-------------------------------------------------------------------------------- + +function enraged_wildwing_create_tornado:OnAbilityPhaseStart() + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 175, 175, 175 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 140, 0 ) ) + end + return true +end + +-------------------------------------------------------------------------------- + +function enraged_wildwing_create_tornado:OnAbilityPhaseInterrupted() + if IsServer() then + --ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +--function enraged_wildwing_create_tornado:GetChannelAnimation() +-- return ACT_DOTA_CHANNEL_ABILITY_1 +--end + +-------------------------------------------------------------------------------- + +function enraged_wildwing_create_tornado:OnSpellStart() + if IsServer() then + + + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + local vPos = self:GetCaster():GetAbsOrigin() + for i=1,32 do + local vLoc = FindPathablePositionNearby(self:GetCaster():GetAbsOrigin(), 400, 800 ) + + if GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vLoc ) then + vPos = vLoc + break + end + end + + local hTornado = CreateUnitByName( "npc_aghsfort_creature_enraged_wildwing_tornado", vPos, true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + hTornado:EmitSound( "n_creep_Wildkin.Tornado" ) + + local szAbilityName = "enraged_wildkin_tornado_passive" + local hAbility = hTornado:FindAbilityByName(szAbilityName) + if hAbility == nil then + hAbility = hTornado:AddAbility(szAbilityName) + end + hAbility:UpgradeAbility( true ) + + + + --local kv = { + -- movespeed_pct = self:GetSpecialValueFor( "movespeed_pct" ), + -- damage = self:GetSpecialValueFor( "damage" ), + --} + --hTornado:AddNewModifier( self:GetCaster(), self, "modifier_enraged_wildkin_tornado_passive", kv ) + + --self.m_hTornado = hTornado + end +end + + +-------------------------------------------------------------------------------- +-- +--function enraged_wildwing_create_tornado:OnChannelFinish( bInterrupted ) +-- if IsServer() then +-- if self.m_hTornado ~= nil then +-- self.m_hTornado:StopSound( "n_creep_Wildkin.Tornado" ) +-- self.m_hTornado:RemoveModifierByName("modifier_enraged_wildkin_tornado_passive") +-- self.m_hTornado:ForceKill( false ) +-- end +-- ParticleManager:DestroyParticle( self.nPreviewFX, false ) +-- end +--end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/evil_greevil_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/evil_greevil_passive.lua new file mode 100755 index 0000000..90270e1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/evil_greevil_passive.lua @@ -0,0 +1,12 @@ + +evil_greevil_passive = class({}) +LinkLuaModifier( "modifier_evil_greevil_passive", "modifiers/creatures/modifier_evil_greevil_passive", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function evil_greevil_passive:GetIntrinsicModifierName() + return "modifier_evil_greevil_passive" +end + +----------------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/friendly_ogreseal_flop.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/friendly_ogreseal_flop.lua new file mode 100755 index 0000000..63c9013 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/friendly_ogreseal_flop.lua @@ -0,0 +1,103 @@ + +friendly_ogreseal_flop = class({}) +LinkLuaModifier( "modifier_ogreseal_flop", "modifiers/creatures/modifier_ogreseal_flop", LUA_MODIFIER_MOTION_BOTH ) + +---------------------------------------------------------------------------------------- + +function friendly_ogreseal_flop:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/ogre_seal/ogre_seal_warcry.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function friendly_ogreseal_flop:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function friendly_ogreseal_flop:OnAbilityPhaseStart() + if IsServer() then + self:GetCaster():StartGesture( ACT_DOTA_CAST_ABILITY_2 ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function friendly_ogreseal_flop:OnAbilityPhaseInterrupted() + if IsServer() then + self:GetCaster():RemoveGesture( ACT_DOTA_CAST_ABILITY_2 ) + self:GetCaster():RemoveModifierByName( "modifier_techies_suicide_leap_animation" ) + end +end + +-------------------------------------------------------------------------------- + +function friendly_ogreseal_flop:OnSpellStart() + if IsServer() then + self.stun_duration = self:GetSpecialValueFor("stun_duration") + + local vToTarget = self:GetCursorPosition() - self:GetCaster():GetOrigin() + vToTarget = vToTarget:Normalized() + local vLocation = self:GetCaster():GetOrigin() + vToTarget * 25 + local kv = + { + vLocX = vLocation.x, + vLocY = vLocation.y, + vLocZ = vLocation.z + } + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_ogreseal_flop", kv ) + EmitSoundOn( "OgreTank.Grunt", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function friendly_ogreseal_flop:TryToDamage() + if IsServer() then + local radius = self:GetSpecialValueFor( "radius" ) + local damage = self:GetSpecialValueFor( "damage" ) + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetOrigin(), self:GetCaster(), radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS, 0, false ) + if #enemies > 0 then + for _,enemy in pairs(enemies) do + if enemy ~= nil and enemy:IsNull() == false and ( not enemy:IsMagicImmune() ) and ( not enemy:IsInvulnerable() ) then + local DamageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + ability = self, + damage = damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + } + ApplyDamage( DamageInfo ) + if enemy:IsAlive() == false then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, enemy:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, -self:GetCaster():GetForwardVector() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 10, enemy, PATTACH_ABSORIGIN_FOLLOW, nil, enemy:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Dungeon.BloodSplatterImpact", enemy ) + else + enemy:AddNewModifier( self:GetCaster(), self, "modifier_stunned", { duration = self.stun_duration } ) + end + end + end + end + + EmitSoundOnLocationWithCaster( self:GetCaster():GetOrigin(), "OgreTank.GroundSmash", self:GetCaster() ) + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/ogre/ogre_melee_smash.vpcf", PATTACH_WORLDORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetCaster():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.radius, self.radius, self.radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + GridNav:DestroyTreesAroundPoint( self:GetCaster():GetOrigin(), radius, false ) + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/hellbear_smash.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/hellbear_smash.lua new file mode 100755 index 0000000..0a80b20 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/hellbear_smash.lua @@ -0,0 +1,76 @@ +hellbear_smash = class({}) + +---------------------------------------------------------------------------------------- + +function hellbear_smash:Precache( context ) + + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + PrecacheResource( "particle", "particles/neutral_fx/ursa_thunderclap.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function hellbear_smash:OnAbilityPhaseStart() + if IsServer() then + self.radius = self:GetSpecialValueFor( "radius" ) + self.duration = self:GetSpecialValueFor( "duration" ) + self.damage = self:GetSpecialValueFor( "damage" ) + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( radius, radius, radius ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 26, 26 ) ) + + EmitSoundOn( "n_creep_Ursa.Clap", self:GetCaster() ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function hellbear_smash:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function hellbear_smash:GetPlaybackRateOverride() + return 0.5 +end + +-------------------------------------------------------------------------------- + +function hellbear_smash:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/neutral_fx/ursa_thunderclap.vpcf", PATTACH_ABSORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.radius, self.radius, self.radius ) ) + ParticleManager:SetParticleControlEnt( nFXIndex, 2, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_attack1", self:GetCaster():GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Hellbear.Smash", self:GetCaster() ) + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetOrigin(), nil, self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self, + } + ApplyDamage( damageInfo ) + enemy:AddNewModifier( self:GetCaster(), self, "modifier_polar_furbolg_ursa_warrior_thunder_clap", { duration = self.duration } ) + end + end + + end +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/huge_brood_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/huge_brood_passive.lua new file mode 100755 index 0000000..f68342f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/huge_brood_passive.lua @@ -0,0 +1,11 @@ + +huge_brood_passive = class({}) +LinkLuaModifier( "modifier_huge_brood_passive", "modifiers/creatures/modifier_huge_brood_passive", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function huge_brood_passive:GetIntrinsicModifierName() + return "modifier_huge_brood_passive" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/huge_brood_summon_eggs.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/huge_brood_summon_eggs.lua new file mode 100755 index 0000000..72c03b9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/huge_brood_summon_eggs.lua @@ -0,0 +1,132 @@ + +huge_brood_summon_eggs = class({}) + +-------------------------------------------------------------------------------- + +function huge_brood_summon_eggs:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", context ) + + PrecacheUnitByNameSync( "npc_dota_creature_broodmother_baby_d", context, -1 ) +end + +-------------------------------------------------------------------------------- + +function huge_brood_summon_eggs:OnAbilityPhaseStart() + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 150, 150, 150 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 26, 26 ) ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function huge_brood_summon_eggs:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function huge_brood_summon_eggs:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + if self.hSummonedUnits == nil then + self.hSummonedUnits = {} + end + + self.egg_spawns = self:GetSpecialValueFor( "egg_spawns" ) + self.spider_spawns = self:GetSpecialValueFor( "spider_spawns" ) + self.max_summoned_units = self:GetSpecialValueFor( "max_summoned_units" ) + self.summon_radius = self:GetSpecialValueFor( "summon_radius" ) + + EmitSoundOn( "Creature.Summon", self:GetCaster() ) + + for i = 1, self.egg_spawns do + if #self.hSummonedUnits + 1 < self.max_summoned_units then + local nMaxDistance = self.summon_radius + local vSpawnLoc = nil + + local nMaxAttempts = 5 + local nAttempts = 0 + + repeat + if nAttempts > nMaxAttempts then + vSpawnLoc = nil + printf( "WARNING - huge_brood_summon_eggs - failed to find valid spawn loc for egg" ) + break + end + + local vPos = self:GetCaster():GetAbsOrigin() + RandomVector( nMaxDistance ) + vSpawnLoc = FindPathablePositionNearby( vPos, 0, 50 ) + nAttempts = nAttempts + 1 + until ( GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vSpawnLoc ) ) + + if vSpawnLoc == nil then + vSpawnLoc = self:GetCaster():GetAbsOrigin() + end + + local hEgg = CreateUnitByName( "npc_dota_spider_sac", vSpawnLoc, true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + if hEgg ~= nil then + table.insert( self.hSummonedUnits, hEgg ) + --local vRandomOffset = Vector( RandomInt( -self.summon_radius, self.summon_radius ), RandomInt( -self.summon_radius, self.summon_radius ), 0 ) + --local vSpawnPoint = self:GetCaster():GetAbsOrigin() + vRandomOffset + FindClearSpaceForUnit( hEgg, vSpawnLoc, true ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, vSpawnLoc ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + end + + for i = 1, self.spider_spawns do + if #self.hSummonedUnits + 1 < self.max_summoned_units then + local nMaxDistance = self.summon_radius + local vSpawnLoc = nil + + local nMaxAttempts = 5 + local nAttempts = 0 + + repeat + if nAttempts > nMaxAttempts then + vSpawnLoc = nil + printf( "WARNING - huge_brood_summon_eggs - failed to find valid spawn loc for spider" ) + break + end + + local vPos = self:GetCaster():GetAbsOrigin() + RandomVector( nMaxDistance ) + vSpawnLoc = FindPathablePositionNearby( vPos, 0, 50 ) + nAttempts = nAttempts + 1 + until ( GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vSpawnLoc ) ) + + if vSpawnLoc == nil then + vSpawnLoc = self:GetCaster():GetAbsOrigin() + end + + if vSpawnLoc ~= nil then + local hSummonedSpider = CreateUnitByName( "npc_dota_creature_broodmother_baby_d", vSpawnLoc, true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + if hSummonedSpider ~= nil then + table.insert( self.hSummonedUnits, hSummonedSpider ) + hSummonedSpider:SetInitialGoalEntity( self:GetCaster():GetInitialGoalEntity() ) + + --local vRandomOffset = Vector( RandomInt( -600, 600 ), RandomInt( -600, 600 ), 0 ) + --local vSpawnPoint = self:GetCaster():GetAbsOrigin() + vRandomOffset + FindClearSpaceForUnit( hSummonedSpider, vSpawnLoc, true ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, vSpawnLoc ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + end + end + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/huge_broodmother_accrue_children.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/huge_broodmother_accrue_children.lua new file mode 100755 index 0000000..4aab30e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/huge_broodmother_accrue_children.lua @@ -0,0 +1,22 @@ + +huge_broodmother_accrue_children = class({}) +LinkLuaModifier( "modifier_huge_broodmother_accrue_children", "modifiers/creatures/modifier_huge_broodmother_accrue_children", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_huge_broodmother_generate_children_thinker", "modifiers/creatures/modifier_huge_broodmother_generate_children_thinker", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function huge_broodmother_accrue_children:Precache( context ) + + PrecacheUnitByNameSync( "npc_dota_dummy_caster", context, -1 ) + PrecacheResource( "particle", "particles/baby_brood_venom_pool.vpcf", context ) + PrecacheUnitByNameSync( "npc_dota_creature_broodmother_baby_d", context, -1 ) + +end + +-------------------------------------------------------------------------------- + +function huge_broodmother_accrue_children:GetIntrinsicModifierName() + return "modifier_huge_broodmother_accrue_children" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/huge_broodmother_generate_children.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/huge_broodmother_generate_children.lua new file mode 100755 index 0000000..14a4cee --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/huge_broodmother_generate_children.lua @@ -0,0 +1,22 @@ + +-- Note: this ability gets added by hand to the dummy unit that Broodmother creates. + +huge_broodmother_generate_children = class({}) +LinkLuaModifier( "modifier_huge_broodmother_generate_children_thinker", "modifiers/creatures/modifier_huge_broodmother_generate_children_thinker", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function huge_broodmother_generate_children:Precache( context ) + + PrecacheResource( "particle", "particles/baby_brood_venom_pool.vpcf", context ) + PrecacheUnitByNameSync( "npc_dota_creature_broodmother_baby_d", context, -1 ) + +end + +-------------------------------------------------------------------------------- + +function huge_broodmother_generate_children:GetIntrinsicModifierName() + return "modifier_huge_broodmother_generate_children_thinker" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/kidnap_spider_summon_eggs.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/kidnap_spider_summon_eggs.lua new file mode 100755 index 0000000..6bbfa2f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/kidnap_spider_summon_eggs.lua @@ -0,0 +1,88 @@ + +kidnap_spider_summon_eggs = class({}) + +-------------------------------------------------------------------------------- + +function kidnap_spider_summon_eggs:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function kidnap_spider_summon_eggs:OnAbilityPhaseStart() + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 150, 150, 150 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 26, 26 ) ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function kidnap_spider_summon_eggs:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function kidnap_spider_summon_eggs:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + if self.hSummonedUnits == nil then + self.hSummonedUnits = {} + end + + self.egg_spawns = self:GetSpecialValueFor( "egg_spawns" ) + self.spider_spawns = self:GetSpecialValueFor( "spider_spawns" ) + self.max_summoned_units = self:GetSpecialValueFor( "max_summoned_units" ) + self.summon_radius = self:GetSpecialValueFor( "summon_radius" ) + + EmitSoundOn( "Creature.Summon", self:GetCaster() ) + + for i = 1, self.egg_spawns do + if #self.hSummonedUnits + 1 < self.max_summoned_units then + local nMaxDistance = self.summon_radius + local vSpawnLoc = nil + + local nMaxAttempts = 5 + local nAttempts = 0 + + repeat + if nAttempts > nMaxAttempts then + vSpawnLoc = nil + printf( "WARNING - kidnap_spider_summon_eggs - failed to find valid spawn loc for egg" ) + break + end + + local vPos = self:GetCaster():GetAbsOrigin() + RandomVector( nMaxDistance ) + vSpawnLoc = FindPathablePositionNearby( vPos, 0, 50 ) + nAttempts = nAttempts + 1 + until ( GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vSpawnLoc ) ) + + if vSpawnLoc == nil then + vSpawnLoc = self:GetCaster():GetAbsOrigin() + end + + local hEgg = CreateUnitByName( "npc_dota_spider_sac", vSpawnLoc, true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + if hEgg ~= nil then + table.insert( self.hSummonedUnits, hEgg ) + --local vRandomOffset = Vector( RandomInt( -self.summon_radius, self.summon_radius ), RandomInt( -self.summon_radius, self.summon_radius ), 0 ) + --local vSpawnPoint = self:GetCaster():GetAbsOrigin() + vRandomOffset + FindClearSpaceForUnit( hEgg, vSpawnLoc, true ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, vSpawnLoc ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + end + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/kunkka_torrent_dm.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/kunkka_torrent_dm.lua new file mode 100755 index 0000000..d0ddec2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/kunkka_torrent_dm.lua @@ -0,0 +1,21 @@ + +kunkka_torrent_dm = class({}) + +-------------------------------------------------------------------------------- + +function kunkka_torrent_dm:OnSpellStart() + if IsServer() then + local hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_kunkka_torrent_thinker", {}, self:GetCursorPosition(), self:GetCaster():GetTeamNumber(), false ) + if hThinker ~= nil then + local hBuff = hThinker:FindModifierByName( "modifier_kunkka_torrent_thinker" ) + if hBuff ~= nil then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_kunkka/kunkka_spell_torrent_bubbles.vpcf", PATTACH_ABSORIGIN, hThinker ) + hBuff:AddParticle( nFXIndex, false, false, -1, false, false ) + end + + EmitSoundOn( "Ability.pre.Torrent", self:GetCaster() ) + end + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/lifestealer_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/lifestealer_passive.lua new file mode 100755 index 0000000..3432d91 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/lifestealer_passive.lua @@ -0,0 +1,21 @@ + +lifestealer_passive = class({}) +LinkLuaModifier( "modifier_lifestealer_passive", "modifiers/creatures/modifier_lifestealer_passive", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_lifestealer_damage_counter", "modifiers/creatures/modifier_lifestealer_damage_counter", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_lifestealer_enraged", "modifiers/creatures/modifier_lifestealer_enraged", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function lifestealer_passive:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_life_stealer/life_stealer_rage.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_life_stealer_rage.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/lifestealer/lifestealer_damage_counter_overhead.vpcf", context ) +end + +----------------------------------------------------------------------------------------- + +function lifestealer_passive:GetIntrinsicModifierName() + return "modifier_lifestealer_passive" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/mini_spider_slow_attack.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/mini_spider_slow_attack.lua new file mode 100755 index 0000000..fc27d58 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/mini_spider_slow_attack.lua @@ -0,0 +1,12 @@ + +mini_spider_slow_attack = class({}) +LinkLuaModifier( "modifier_mini_spider_slow_attack", "modifiers/creatures/modifier_mini_spider_slow_attack", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_mini_spider_slow_attack_debuff", "modifiers/creatures/modifier_mini_spider_slow_attack_debuff", LUA_MODIFIER_MOTION_NONE ) + +------------------------------------------------------------------------- + +function mini_spider_slow_attack:GetIntrinsicModifierName() + return "modifier_mini_spider_slow_attack" +end + +------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/mushroom_split.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/mushroom_split.lua new file mode 100755 index 0000000..c200110 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/mushroom_split.lua @@ -0,0 +1,24 @@ +mushroom_split = class({}) + +LinkLuaModifier( "modifier_rock_golem_split", "modifiers/creatures/modifier_rock_golem_split", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function mushroom_split:Precache( context ) + + self.strSplitFx = "particles/creature_splitter/splitter_a.vpcf" + self.strSummonedUnit = "npc_dota_creature_shroomling" + + PrecacheResource( "particle", self.strSplitFx, context ) + PrecacheUnitByNameSync( self.strSummonedUnit, context, -1 ) + +end + +-------------------------------------------------------------------------------- + +function mushroom_split:GetIntrinsicModifierName() + return "modifier_rock_golem_split" +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/nyx_suicide_heal.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/nyx_suicide_heal.lua new file mode 100755 index 0000000..5d70a30 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/nyx_suicide_heal.lua @@ -0,0 +1,28 @@ + +nyx_suicide_heal = class({}) +LinkLuaModifier( "modifier_nyx_suicide_heal", "modifiers/creatures/modifier_nyx_suicide_heal", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function nyx_suicide_heal:Precache( context ) + + PrecacheResource( "particle", "particles/items3_fx/fish_bones_active.vpcf", context ) + PrecacheResource( "particle", "particles/nyx_swarm_explosion/nyx_swarm_explosion.vpcf", context ) + +end + +-------------------------------------------------------------- + +function nyx_suicide_heal:GetIntrinsicModifierName() + return "modifier_nyx_suicide_heal" +end + +-------------------------------------------------------------- + +function nyx_suicide_heal:OnSpellStart() + if IsServer() then + self:GetCaster():ForceKill( false ) + end +end + +-------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_magi_area_ignite.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_magi_area_ignite.lua new file mode 100755 index 0000000..9541d1b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_magi_area_ignite.lua @@ -0,0 +1,55 @@ + +ogre_magi_area_ignite = class ({}) +LinkLuaModifier( "modifier_ogre_magi_area_ignite_thinker", "modifiers/creatures/modifier_ogre_magi_area_ignite_thinker", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function ogre_magi_area_ignite:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_ignite.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_ignite_cast.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_ignite_debuff.vpcf", context ) + PrecacheResource( "particle", "particles/neutral_fx/black_dragon_fireball.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_burn.vpcf", context ) +end + +---------------------------------------------------------------------------------------- + +function ogre_magi_area_ignite:OnSpellStart() + if IsServer() then + self.hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_ogre_magi_area_ignite_thinker", { duration = -1 }, self:GetCursorPosition(), self:GetCaster():GetTeamNumber(), false ) + if self.hThinker ~= nil then + local projectile = + { + Target = self.hThinker, + Source = self:GetCaster(), + Ability = self, + EffectName = "particles/units/heroes/hero_ogre_magi/ogre_magi_ignite.vpcf", + iMoveSpeed = self:GetSpecialValueFor( "projectile_speed" ), + vSourceLoc = self:GetCaster():GetOrigin(), + bDodgeable = false, + bProvidesVision = false, + } + + ProjectileManager:CreateTrackingProjectile( projectile ) + EmitSoundOn( "OgreMagi.Ignite.Cast", self:GetCaster() ) + end + end +end + +---------------------------------------------------------------------------------------- + +function ogre_magi_area_ignite:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + if self.hThinker ~= nil then + local hBuff = self.hThinker:FindModifierByName( "modifier_ogre_magi_area_ignite_thinker" ) + if hBuff ~= nil then + hBuff:OnIntervalThink() + end + self.hThinker = nil; + end + end + + return true +end + +---------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_magi_channelled_bloodlust.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_magi_channelled_bloodlust.lua new file mode 100755 index 0000000..d32bf49 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_magi_channelled_bloodlust.lua @@ -0,0 +1,58 @@ + +ogre_magi_channelled_bloodlust = class({}) +LinkLuaModifier( "modifier_ogre_magi_channelled_bloodlust", "modifiers/creatures/modifier_ogre_magi_channelled_bloodlust", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function ogre_magi_channelled_bloodlust:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_bloodlust_cast.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_bloodlust_buff.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_pugna/pugna_life_drain.vpcf", context ) + +end + +----------------------------------------------------------------------------- + +function ogre_magi_channelled_bloodlust:OnSpellStart() + if IsServer() then + local hTarget = self:GetCursorTarget() + if hTarget ~= nil then + self.hTarget = hTarget + self.hTarget:AddNewModifier( self:GetCaster(), self, "modifier_ogre_magi_channelled_bloodlust", { duration = -1 } ) + + EmitSoundOn( "OgreMagi.Bloodlust.Target", self.hTarget ) + EmitSoundOn( "OgreMagi.Bloodlust.Target.FP", self.hTarget ) + EmitSoundOn( "OgreMagi.Bloodlust.Loop", self:GetCaster() ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_ogre_magi/ogre_magi_bloodlust_cast.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_attack1", self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 2, self.hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", self.hTarget:GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 3, self.hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, self.hTarget:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end +end + +----------------------------------------------------------------------------- + +function ogre_magi_channelled_bloodlust:OnChannelFinish( bInterrupted ) + if IsServer() then + if bInterrupted then + self:StartCooldown( self:GetSpecialValueFor( "interrupted_cooldown" ) ) + end + + if self.hTarget ~= nil then + local hMyBuff = self.hTarget:FindModifierByNameAndCaster( "modifier_ogre_magi_channelled_bloodlust", self:GetCaster() ) + if hMyBuff then + hMyBuff:Destroy() + end + StopSoundOn( "OgreMagi.Bloodlust.Loop", self:GetCaster() ) + self.hTarget = nil + end + end +end + +----------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_seer_area_ignite.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_seer_area_ignite.lua new file mode 100755 index 0000000..087bbe4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_seer_area_ignite.lua @@ -0,0 +1,66 @@ + +ogre_seer_area_ignite = class ({}) +LinkLuaModifier( "modifier_ogre_seer_area_ignite_thinker", "modifiers/creatures/modifier_ogre_seer_area_ignite_thinker", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function ogre_seer_area_ignite:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_ignite.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_ignite_cast.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_ignite_debuff.vpcf", context ) + PrecacheResource( "particle", "particles/neutral_fx/black_dragon_fireball.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_burn.vpcf", context ) +end + +---------------------------------------------------------------------------------------- + +function ogre_seer_area_ignite:OnSpellStart() + if IsServer() then + local vTargetPositions = { } + vTargetPositions[ 1 ] = self:GetCursorPosition() + vTargetPositions[ 2 ] = self:GetCursorPosition() + RandomVector( RandomFloat( 250, 300 ) ) + vTargetPositions[ 3 ] = self:GetCursorPosition() + RandomVector( RandomFloat( 250, 300 ) ) + + self.hThinkers = { } + + for i, vTargetPos in ipairs( vTargetPositions ) do + self.hThinkers[ i ] = CreateModifierThinker( self:GetCaster(), self, "modifier_ogre_seer_area_ignite_thinker", { duration = -1 }, vTargetPos, self:GetCaster():GetTeamNumber(), false ) + if self.hThinkers[ i ] ~= nil then + local projectile = + { + Target = self.hThinkers[ i ], + Source = self:GetCaster(), + Ability = self, + EffectName = "particles/units/heroes/hero_ogre_magi/ogre_magi_ignite.vpcf", + iMoveSpeed = self:GetSpecialValueFor( "projectile_speed" ), + vSourceLoc = self:GetCaster():GetOrigin(), + bDodgeable = false, + bProvidesVision = false, + } + + ProjectileManager:CreateTrackingProjectile( projectile ) + EmitSoundOn( "OgreMagi.Ignite.Cast", self:GetCaster() ) + end + end + end +end + +---------------------------------------------------------------------------------------- + +function ogre_seer_area_ignite:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + for i, hThinker in pairs( self.hThinkers ) do + if hThinker ~= nil then + local hBuff = hThinker:FindModifierByName( "modifier_ogre_seer_area_ignite_thinker" ) + if hBuff ~= nil then + hBuff:OnIntervalThink() + end + hThinker = nil; + end + end + end + + return true +end + +---------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_tank_boss_jump_smash.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_tank_boss_jump_smash.lua new file mode 100755 index 0000000..2c58559 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_tank_boss_jump_smash.lua @@ -0,0 +1,26 @@ + +ogre_tank_boss_jump_smash = class({}) +LinkLuaModifier( "modifier_ogre_tank_melee_smash_thinker", "modifiers/creatures/modifier_ogre_tank_melee_smash_thinker", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------- + +function ogre_tank_boss_jump_smash:ProcsMagicStick() + return false +end + +----------------------------------------------------------------------------- + +function ogre_tank_boss_jump_smash:GetPlaybackRateOverride() + return 0.9 -- keep this proportional to jump_speed +end + + +----------------------------------------------------------------------------- + +function ogre_tank_boss_jump_smash:OnSpellStart() + if IsServer() then + local hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_ogre_tank_melee_smash_thinker", { duration = self:GetSpecialValueFor( "jump_speed") }, self:GetCaster():GetOrigin(), self:GetCaster():GetTeamNumber(), false ) + end +end + +----------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_tank_boss_melee_smash.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_tank_boss_melee_smash.lua new file mode 100755 index 0000000..b274094 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_tank_boss_melee_smash.lua @@ -0,0 +1,42 @@ + +ogre_tank_boss_melee_smash = class({}) + +----------------------------------------------------------------------------- + +function ogre_tank_boss_melee_smash:Precache( context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) +end + +----------------------------------------------------------------------------- + +function ogre_tank_boss_melee_smash:ProcsMagicStick() + return false +end + +----------------------------------------------------------------------------- + +function ogre_tank_boss_melee_smash:GetCooldown( iLevel ) + return self.BaseClass.GetCooldown( self, self:GetLevel() ) / self:GetCaster():GetHasteFactor() +end + +----------------------------------------------------------------------------- + +function ogre_tank_boss_melee_smash:GetPlaybackRateOverride() + return math.min( 2.0, math.max( self:GetCaster():GetHasteFactor(), 1.0 ) ) +end + +----------------------------------------------------------------------------- + +function ogre_tank_boss_melee_smash:OnSpellStart() + if IsServer() then + EmitSoundOn( "OgreTank.Grunt", self:GetCaster() ) + local flSpeed = self:GetSpecialValueFor( "base_swing_speed" ) / self:GetPlaybackRateOverride() + local vToTarget = self:GetCursorPosition() - self:GetCaster():GetOrigin() + vToTarget = vToTarget:Normalized() + local vTarget = self:GetCaster():GetOrigin() + vToTarget * self:GetCastRange( self:GetCaster():GetOrigin(), nil ) + local hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_ogre_tank_melee_smash_thinker", { duration = flSpeed }, vTarget, self:GetCaster():GetTeamNumber(), false ) + end +end + +----------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_tank_jump_smash.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_tank_jump_smash.lua new file mode 100755 index 0000000..76a2126 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_tank_jump_smash.lua @@ -0,0 +1,35 @@ + +ogre_tank_jump_smash = class({}) +LinkLuaModifier( "modifier_ogre_tank_melee_smash_thinker", "modifiers/creatures/modifier_ogre_tank_melee_smash_thinker", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function ogre_tank_jump_smash:Precache( context ) + + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) + +end + +----------------------------------------------------------------------------- + +function ogre_tank_jump_smash:ProcsMagicStick() + return false +end + +----------------------------------------------------------------------------- + +function ogre_tank_jump_smash:GetPlaybackRateOverride() + return 0.75 +end + + +----------------------------------------------------------------------------- + +function ogre_tank_jump_smash:OnSpellStart() + if IsServer() then + local hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_ogre_tank_melee_smash_thinker", { duration = self:GetSpecialValueFor( "jump_speed") }, self:GetCaster():GetOrigin(), self:GetCaster():GetTeamNumber(), false ) + end +end + +----------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_tank_melee_smash.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_tank_melee_smash.lua new file mode 100755 index 0000000..c5add47 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogre_tank_melee_smash.lua @@ -0,0 +1,42 @@ + +ogre_tank_melee_smash = class({}) + +---------------------------------------------------------------------------------------- + +function ogre_tank_melee_smash:Precache( context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) +end + +----------------------------------------------------------------------------- + +function ogre_tank_melee_smash:ProcsMagicStick() + return false +end + +----------------------------------------------------------------------------- + +function ogre_tank_melee_smash:GetCooldown( iLevel ) + return self.BaseClass.GetCooldown( self, self:GetLevel() ) / self:GetCaster():GetHasteFactor() +end + +----------------------------------------------------------------------------- + +function ogre_tank_melee_smash:GetPlaybackRateOverride() + return math.min( 2.0, math.max( self:GetCaster():GetHasteFactor(), 0.75 ) ) +end + +----------------------------------------------------------------------------- + +function ogre_tank_melee_smash:OnSpellStart() + if IsServer() then + EmitSoundOn( "OgreTank.Grunt", self:GetCaster() ) + local flSpeed = self:GetSpecialValueFor( "base_swing_speed" ) / self:GetPlaybackRateOverride() + local vToTarget = self:GetCursorPosition() - self:GetCaster():GetOrigin() + vToTarget = vToTarget:Normalized() + local vTarget = self:GetCaster():GetOrigin() + vToTarget * self:GetCastRange( self:GetCaster():GetOrigin(), nil ) + local hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_ogre_tank_melee_smash_thinker", { duration = flSpeed }, vTarget, self:GetCaster():GetTeamNumber(), false ) + end +end + +----------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogreseal_flop.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogreseal_flop.lua new file mode 100755 index 0000000..722758d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ogreseal_flop.lua @@ -0,0 +1,106 @@ + +ogreseal_flop = class({}) +LinkLuaModifier( "modifier_ogreseal_flop", "modifiers/creatures/modifier_ogreseal_flop", LUA_MODIFIER_MOTION_BOTH ) + +---------------------------------------------------------------------------------------- + +function ogreseal_flop:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/ogre_seal/ogre_seal_warcry.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function ogreseal_flop:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function ogreseal_flop:OnAbilityPhaseStart() + if IsServer() then + self:GetCaster():StartGesture( ACT_DOTA_CAST_ABILITY_2 ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function ogreseal_flop:OnAbilityPhaseInterrupted() + if IsServer() then + self:GetCaster():RemoveGesture( ACT_DOTA_CAST_ABILITY_2 ) + self:GetCaster():RemoveModifierByName( "modifier_techies_suicide_leap_animation" ) + end +end + +-------------------------------------------------------------------------------- + +function ogreseal_flop:OnSpellStart() + if IsServer() then + self.stun_duration = self:GetSpecialValueFor("stun_duration") + + local vToTarget = self:GetCursorPosition() - self:GetCaster():GetOrigin() + vToTarget = vToTarget:Normalized() + local vLocation = self:GetCaster():GetOrigin() + vToTarget * 25 + local kv = + { + vLocX = vLocation.x, + vLocY = vLocation.y, + vLocZ = vLocation.z + } + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_ogreseal_flop", kv ) + EmitSoundOn( "OgreTank.Grunt", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function ogreseal_flop:TryToDamage() + if IsServer() then + local radius = self:GetSpecialValueFor( "radius" ) + local damage = self:GetSpecialValueFor( "damage" ) + local silence_duration = self:GetSpecialValueFor( "silence_duration" ) + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetOrigin(), self:GetCaster(), radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS, 0, false ) + if #enemies > 0 then + for _,enemy in pairs(enemies) do + if enemy ~= nil and enemy:IsNull() == false and ( not enemy:IsMagicImmune() ) and ( not enemy:IsInvulnerable() ) then + local DamageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + ability = self, + damage = damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + } + ApplyDamage( DamageInfo ) + if enemy:IsAlive() == false then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, enemy:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, -self:GetCaster():GetForwardVector() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 10, enemy, PATTACH_ABSORIGIN_FOLLOW, nil, enemy:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Dungeon.BloodSplatterImpact", enemy ) + else + enemy:AddNewModifier( self:GetCaster(), self, "modifier_stunned", { duration = self.stun_duration } ) + end + end + end + end + + EmitSoundOnLocationWithCaster( self:GetCaster():GetOrigin(), "OgreTank.GroundSmash", self:GetCaster() ) + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/ogre/ogre_melee_smash.vpcf", PATTACH_WORLDORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetCaster():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.radius, self.radius, self.radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + GridNav:DestroyTreesAroundPoint( self:GetCaster():GetOrigin(), radius, false ) + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/phoenix_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/phoenix_passive.lua new file mode 100755 index 0000000..4340996 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/phoenix_passive.lua @@ -0,0 +1,11 @@ +phoenix_passive = class( {} ) + +LinkLuaModifier( "modifier_phoenix_passive", "modifiers/creatures/modifier_phoenix_passive", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function phoenix_passive:GetIntrinsicModifierName() + return "modifier_phoenix_passive" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/preview_intrinsic.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/preview_intrinsic.lua new file mode 100755 index 0000000..e8320d0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/preview_intrinsic.lua @@ -0,0 +1,11 @@ + +preview_intrinsic = class({}) +LinkLuaModifier( "modifier_ability_cast_warning", "modifiers/modifier_ability_cast_warning", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function preview_intrinsic:GetIntrinsicModifierName() + return "modifier_ability_cast_warning" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/puck_flying_bomb.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/puck_flying_bomb.lua new file mode 100755 index 0000000..818568c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/puck_flying_bomb.lua @@ -0,0 +1,64 @@ + +puck_flying_bomb = class({}) +LinkLuaModifier( "modifier_puck_flying_bomb", "modifiers/creatures/modifier_puck_flying_bomb", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function puck_flying_bomb:Precache( context ) + PrecacheResource( "particle", "particles/test_particle/generic_attack_charge.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/puck/puck_flying_bomb.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/puck/puck_bomb_detonation.vpcf", context ) + --PrecacheResource( "particle", "particles/test_particle/omniknight_wildaxe.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_beastmaster/beastmaster_wildaxes_hit.vpcf", context ) + PrecacheUnitByNameSync( "npc_dota_beastmaster_axe", context, -1 ) +end + +-------------------------------------------------------------------------------- + +function puck_flying_bomb:OnAbilityPhaseStart() + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/test_particle/generic_attack_charge.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_attack2", self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 135, 192, 235 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 16, Vector( 1, 0, 0 ) ) + ParticleManager:ReleaseParticleIndex( self.nPreviewFX ) + + EmitSoundOn( "TempleGuardian.PreAttack", self:GetCaster() ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function puck_flying_bomb:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, true ) + end +end + +-------------------------------------------------------------------------------- + +function puck_flying_bomb:GetPlaybackRateOverride() + return 0.75 +end + +-------------------------------------------------------------------------------- + +function puck_flying_bomb:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + local vLocation = self:GetCursorPosition() + + local kv = + { + x = vLocation.x, + y = vLocation.y, + duration = self:GetSpecialValueFor( "flight_duration" ), + } + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_puck_flying_bomb", kv ) + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ranged_quill_attack.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ranged_quill_attack.lua new file mode 100755 index 0000000..fb953da --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/ranged_quill_attack.lua @@ -0,0 +1,85 @@ +ranged_quill_attack = class({}) + +---------------------------------------------------------------------------------------- + +function ranged_quill_attack:Precache( context ) + + PrecacheResource( "particle", "particles/creatures/quill_beast/test_model_cluster_linear_projectile.vpcf", context ) + PrecacheResource( "particle", "particles/neutral_fx/black_dragon_fireball.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_ignite_debuff.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_burn.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_bristleback/bristleback_quill_spray_impact.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function ranged_quill_attack:OnSpellStart() + if IsServer() then + self.attack_speed = self:GetSpecialValueFor( "attack_speed" ) + self.attack_width_initial = self:GetSpecialValueFor( "attack_width_initial" ) + self.attack_width_end = self:GetSpecialValueFor( "attack_width_end" ) + self.attack_distance = self:GetSpecialValueFor( "attack_distance" ) + self.attack_damage = self:GetSpecialValueFor( "attack_damage" ) + + local vPos = nil + if self:GetCursorTarget() then + vPos = self:GetCursorTarget():GetOrigin() + else + vPos = self:GetCursorPosition() + end + + local vDirection = vPos - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + self.attack_speed = self.attack_speed * ( self.attack_distance / ( self.attack_distance - self.attack_width_initial ) ) + + local info = { + EffectName = "particles/creatures/quill_beast/test_model_cluster_linear_projectile.vpcf", + Ability = self, + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = self.attack_width_initial, + fEndRadius = self.attack_width_end, + vVelocity = vDirection * self.attack_speed, + fDistance = self.attack_distance, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING, + } + + ProjectileManager:CreateLinearProjectile( info ) + EmitSoundOn( "Hound.QuillAttack.Cast", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function ranged_quill_attack:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + if hTarget ~= nil and ( not hTarget:IsMagicImmune() ) and ( not hTarget:IsInvulnerable() ) then + local damage = { + victim = hTarget, + attacker = self:GetCaster(), + damage = self.attack_damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self + } + + ApplyDamage( damage ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_bristleback/bristleback_quill_spray_impact.vpcf", PATTACH_CUSTOMORIGIN, hTarget ); + ParticleManager:SetParticleControlEnt( nFXIndex, 0, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetOrigin(), true ); + ParticleManager:SetParticleControlEnt( nFXIndex, 1, hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", hTarget:GetOrigin(), true ); + ParticleManager:SetParticleControlEnt( nFXIndex, 2, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetOrigin(), true ); + ParticleManager:ReleaseParticleIndex( nFXIndex ); + + EmitSoundOn( "Hound.QuillAttack.Target", hTarget ); + end + + return true + end +end + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/rock_golem_split_a.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/rock_golem_split_a.lua new file mode 100755 index 0000000..76907f8 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/rock_golem_split_a.lua @@ -0,0 +1,26 @@ +rock_golem_split_a = class({}) + +LinkLuaModifier( "modifier_rock_golem_split", "modifiers/creatures/modifier_rock_golem_split", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function rock_golem_split_a:Precache( context ) + + self.strSplitFx = "particles/creature_splitter/splitter_a.vpcf" + self.strSummonedUnit = "npc_dota_creature_rock_golem_b" + + PrecacheResource( "particle", "particles/units/heroes/hero_sandking/sandking_caustic_finale_debuff.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_sandking/sandking_caustic_finale_explode.vpcf", context ) + PrecacheResource( "particle", self.strSplitFx, context ) + PrecacheUnitByNameSync( self.strSummonedUnit, context, -1 ) + +end + +-------------------------------------------------------------------------------- + +function rock_golem_split_a:GetIntrinsicModifierName() + return "modifier_rock_golem_split" +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/rock_golem_split_b.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/rock_golem_split_b.lua new file mode 100755 index 0000000..eefee15 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/rock_golem_split_b.lua @@ -0,0 +1,23 @@ +rock_golem_split_b = class({}) + +LinkLuaModifier( "modifier_rock_golem_split", "modifiers/creatures/modifier_rock_golem_split", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function rock_golem_split_b:Precache( context ) + + self.strSplitFx = "particles/units/heroes/hero_life_stealer/life_stealer_infest_cast_mid.vpcf" + self.strSummonedUnit = "npc_dota_creature_rock_golem_c" + + PrecacheResource( "particle", self.strSplitFx, context ) + PrecacheUnitByNameSync( self.strSummonedUnit, context, -1 ) + +end + +-------------------------------------------------------------------------------- + +function rock_golem_split_b:GetIntrinsicModifierName() + return "modifier_rock_golem_split" +end +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_burrow.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_burrow.lua new file mode 100755 index 0000000..3f22e7a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_burrow.lua @@ -0,0 +1,44 @@ + +sand_king_boss_burrow = class({}) +LinkLuaModifier( "modifier_sand_king_boss_burrow", "modifiers/creatures/modifier_sand_king_boss_burrow", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------- + +function sand_king_boss_burrow:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow_inground.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_huskar/huskar_inner_vitality.vpcf", context ) + PrecacheUnitByNameSync( "npc_dota_creature_healing_burrower", context, -1 ) + PrecacheUnitByNameSync( "npc_dota_creature_big_exploding_burrower", context, -1 ) + +end + +-------------------------------------------------------------------- + +function sand_king_boss_burrow:OnAbilityPhaseStart() + if IsServer() then + EmitSoundOn( "Hero_NyxAssassin.Burrow.In", self:GetCaster() ) + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetCaster():GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 0, self:GetCaster():GetForwardVector() ) + end + return true +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_burrow:GetPlaybackRateOverride() + return 0.75 +end + +-------------------------------------------------------------------- + +function sand_king_boss_burrow:OnSpellStart() + if IsServer() then + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sand_king_boss_burrow", {} ) + self:GetCaster().nBurrowFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow_inground.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControl( self:GetCaster().nBurrowFXIndex, 0, self:GetCaster():GetOrigin() ) + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_burrowstrike.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_burrowstrike.lua new file mode 100755 index 0000000..56a1149 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_burrowstrike.lua @@ -0,0 +1,75 @@ + +sand_king_boss_burrowstrike = class({}) +LinkLuaModifier( "modifier_sand_king_boss_burrowstrike", "modifiers/creatures/modifier_sand_king_boss_burrowstrike", LUA_MODIFIER_MOTION_HORIZONTAL ) +LinkLuaModifier( "modifier_sand_king_boss_burrowstrike_end", "modifiers/creatures/modifier_sand_king_boss_burrowstrike_end", LUA_MODIFIER_MOTION_HORIZONTAL ) + +-------------------------------------------------------------------- + +function sand_king_boss_burrowstrike:Precache( context ) + + PrecacheResource( "particle", "particles/test_particle/sandking_burrowstrike_no_models.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow_inground.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_elder_titan/elder_titan_echo_stomp_physical.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_elder_titan/elder_titan_echo_stomp_impact_physical.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_burrowstrike:OnAbilityPhaseStart() + if IsServer() then + end + + return true +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_burrowstrike:OnAbilityPhaseInterrupted() + if IsServer() then + end +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_burrowstrike:GetCastPoint() + return 1.0625 - ( 0.53125 * ( 1 - ( self:GetCaster():GetHealthPercent() / 100 ) ) ) +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_burrowstrike:GetPlaybackRateOverride() + return 0.3045 + ( 0.3045 * ( 1 - ( self:GetCaster():GetHealthPercent() / 100 ) ) ) +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_burrowstrike:OnSpellStart() + if IsServer() then + local vToTarget = self:GetCursorPosition() - self:GetCaster():GetOrigin() + local flDist = RandomFloat( 1000.0, 2000.0 ) + local vDir = vToTarget:Normalized() + vDir.z = 0.0 + + local vTarget = self:GetCaster():GetOrigin() + vDir * flDist + + local flHealthPct = self:GetCaster():GetHealthPercent() / 100 + local kv = + { + x = vTarget.x, + y = vTarget.y, + z = vTarget.z, + duration = flDist / ( self:GetSpecialValueFor( "speed" ) + ( self:GetSpecialValueFor( "scaling_speed" ) * ( 1 - flHealthPct ) ) ) + } + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sand_king_boss_burrowstrike", kv ) + EmitSoundOn( "SandKingBoss.BurrowStrike", self:GetCaster() ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/test_particle/sandking_burrowstrike_no_models.vpcf", PATTACH_WORLDORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetCaster():GetOrigin() + self:GetCaster():GetForwardVector() * 225 ) + ParticleManager:SetParticleControl( nFXIndex, 1, self:GetCaster():GetOrigin() + self:GetCaster():GetForwardVector() * 225 ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_epicenter.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_epicenter.lua new file mode 100755 index 0000000..0ebbaf6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_epicenter.lua @@ -0,0 +1,170 @@ + +sand_king_boss_epicenter = class({}) +LinkLuaModifier( "modifier_sand_king_boss_epicenter", "modifiers/creatures/modifier_sand_king_boss_epicenter", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------- + +function sand_king_boss_epicenter:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_sandking/sandking_epicenter_tell.vpcf", context ) + PrecacheResource( "particle", "particles/test_particle/dungeon_sand_king_channel.vpcf", context ) + PrecacheResource( "particle", "particles/test_particle/dungeon_sand_king_blocker.vpcf", context ) + PrecacheResource( "particle", "particles/test_particle/sand_king_projectile.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_epicenter:OnAbilityPhaseStart() + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/units/heroes/hero_sandking/sandking_epicenter_tell.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_tail", self:GetCaster():GetOrigin(), true ) + EmitSoundOn( "SandKingBoss.Epicenter.spell", self:GetCaster() ) + self.nChannelFX = ParticleManager:CreateParticle( "particles/test_particle/dungeon_sand_king_channel.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + end + return true +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_epicenter:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_epicenter:GetChannelAnimation() + return ACT_DOTA_CAST_ABILITY_4 +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_epicenter:GetPlaybackRateOverride() + return 1 +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_epicenter:OnSpellStart() + if IsServer() then + self.Projectiles = {} + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sand_king_boss_epicenter", {} ) + end +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_epicenter:OnChannelFinish( bInterrupted ) + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_sand_king_boss_epicenter" ) + ParticleManager:DestroyParticle( self.nChannelFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_epicenter:OnProjectileThinkHandle( nProjectileHandle ) + if IsServer() then + local projectile = nil + for _,proj in pairs( self.Projectiles ) do + if proj ~= nil and proj.handle == nProjectileHandle then + projectile = proj + end + end + if projectile ~= nil then + local flRadius = ProjectileManager:GetLinearProjectileRadius( nProjectileHandle ) + ParticleManager:SetParticleControl( projectile.nFXIndex, 2, Vector( flRadius, flRadius, 0 ) ) + end + end +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_epicenter:OnProjectileHitHandle( hTarget, vLocation, nProjectileHandle ) + if IsServer() then + if hTarget ~= nil then + local blocker_radius = self:GetSpecialValueFor( "blocker_radius" ) + + + local vFromCaster = vLocation - self:GetCaster():GetOrigin() + vFromCaster = vFromCaster:Normalized() + local vToCasterPerp = Vector( -vFromCaster.y, vFromCaster.x, 0 ) + + local vLoc1 = vLocation + vFromCaster * 200 + local vLoc2 = vLocation + vFromCaster * 200 + vToCasterPerp * 65 + local vLoc3 = vLocation + vFromCaster * 200 + vToCasterPerp * -65 + + local hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_earthshaker_fissure", {}, vLoc1, self:GetCaster():GetTeamNumber(), true ) + local hThinker2 = CreateModifierThinker( self:GetCaster(), self, "modifier_earthshaker_fissure", {}, vLoc2, self:GetCaster():GetTeamNumber(), true ) + local hThinker3 = CreateModifierThinker( self:GetCaster(), self, "modifier_earthshaker_fissure", {}, vLoc3, self:GetCaster():GetTeamNumber(), true ) + if hThinker ~= nil then + hThinker:SetHullRadius( 65 ) + local nFXIndex = ParticleManager:CreateParticle( "particles/test_particle/dungeon_sand_king_blocker.vpcf", PATTACH_WORLDORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, vLoc1 ) + ParticleManager:SetParticleControl( nFXIndex, 1, vLoc1 ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 99999, 0, 0 ) ) + + end + if hThinker2 ~= nil then + hThinker2:SetHullRadius( 65 ) + local nFXIndex = ParticleManager:CreateParticle( "particles/test_particle/dungeon_sand_king_blocker.vpcf", PATTACH_WORLDORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, vLoc2 ) + ParticleManager:SetParticleControl( nFXIndex, 1, vLoc2 ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 99999, 0, 0 ) ) + end + if hThinker3 ~= nil then + hThinker3:SetHullRadius( 65 ) + local nFXIndex = ParticleManager:CreateParticle( "particles/test_particle/dungeon_sand_king_blocker.vpcf", PATTACH_WORLDORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, vLoc3 ) + ParticleManager:SetParticleControl( nFXIndex, 1, vLoc3 ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 99999, 0, 0 ) ) + end + EmitSoundOn( "SandKingBoss.Epicenter.Impact", hTarget ) + + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), hTarget:GetOrigin(), self:GetCaster(), blocker_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and enemy:IsMagicImmune() == false then + local kv = + { + center_x = hTarget:GetOrigin().x, + center_y = hTarget:GetOrigin().y, + center_z = hTarget:GetOrigin().z, + should_stun = true, + duration = 0.25, + knockback_duration = 0.25, + knockback_distance = 250, + knockback_height = 125, + } + enemy:AddNewModifier( self:GetCaster(), self, "modifier_knockback", kv ) + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self:GetSpecialValueFor( "damage" ), + damage_type = DAMAGE_TYPE_PURE, + ability = self, + } + ApplyDamage( damageInfo ) + end + end + end + + local projectile = nil + for _,proj in pairs( self.Projectiles ) do + if proj ~= nil and proj.handle == nProjectileHandle then + projectile = proj + end + end + if projectile ~= nil then + ParticleManager:DestroyParticle( projectile.nFXIndex, false ) + end + end + + return true +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_move_back.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_move_back.lua new file mode 100755 index 0000000..f1530dd --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_move_back.lua @@ -0,0 +1,26 @@ + +sand_king_boss_move_back = class({}) + +----------------------------------------------------------------- + +function sand_king_boss_move_back:OnAbilityPhaseStart() + if IsServer() then + local flMin = self:GetSpecialValueFor( "minimum_duration" ) + local flMax = self:GetSpecialValueFor( "maximum_duration" ) + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sand_king_boss_directional_move", { duration = RandomFloat( flMin, flMax ) } ) + end + return true +end + +----------------------------------------------------------------------------- + +function sand_king_boss_move_back:GetPlaybackRateOverride() + return 0.6 +end + +----------------------------------------------------------------- + +function sand_king_boss_move_back:OnSpellStart() + if IsServer() then + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_move_left.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_move_left.lua new file mode 100755 index 0000000..a4a07bb --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_move_left.lua @@ -0,0 +1,27 @@ + +sand_king_boss_move_left = class({}) +LinkLuaModifier( "modifier_sand_king_boss_directional_move", "modifiers/creatures/modifier_sand_king_boss_directional_move", LUA_MODIFIER_MOTION_HORIZONTAL ) + +----------------------------------------------------------------- + +function sand_king_boss_move_left:OnAbilityPhaseStart() + if IsServer() then + local flMin = self:GetSpecialValueFor( "minimum_duration" ) + local flMax = self:GetSpecialValueFor( "maximum_duration" ) + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sand_king_boss_directional_move", { duration = RandomFloat( flMin, flMax ) } ) + end + return true +end + +----------------------------------------------------------------------------- + +function sand_king_boss_move_left:GetPlaybackRateOverride() + return 1 +end + +----------------------------------------------------------------- + +function sand_king_boss_move_left:OnSpellStart() + if IsServer() then + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_move_right.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_move_right.lua new file mode 100755 index 0000000..c61e873 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_move_right.lua @@ -0,0 +1,27 @@ + +sand_king_boss_move_right = class({}) + +----------------------------------------------------------------- + +function sand_king_boss_move_right:OnAbilityPhaseStart() + if IsServer() then + local flMin = self:GetSpecialValueFor( "minimum_duration" ) + local flMax = self:GetSpecialValueFor( "maximum_duration" ) + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sand_king_boss_directional_move", { duration = RandomFloat( flMin, flMax ) } ) + end + return true +end + + +----------------------------------------------------------------------------- + +function sand_king_boss_move_right:GetPlaybackRateOverride() + return 1 +end + +----------------------------------------------------------------- + +function sand_king_boss_move_right:OnSpellStart() + if IsServer() then + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_passive.lua new file mode 100755 index 0000000..7f0da6f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_passive.lua @@ -0,0 +1,20 @@ + +sand_king_boss_passive = class({}) +LinkLuaModifier( "modifier_sand_king_boss_passive", "modifiers/creatures/modifier_sand_king_boss_passive", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------- + +function sand_king_boss_passive:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_sandking/sandking_caustic_finale_debuff.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_sandking/sandking_caustic_finale_explode.vpcf", context ) + +end + +----------------------------------------------------------------------------------------- + +function sand_king_boss_passive:GetIntrinsicModifierName() + return "modifier_sand_king_boss_passive" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_sandstorm.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_sandstorm.lua new file mode 100755 index 0000000..504deaa --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_sandstorm.lua @@ -0,0 +1,191 @@ + +sand_king_boss_sandstorm = class({}) + +-------------------------------------------------------------------- + +function sand_king_boss_sandstorm:Precache( context ) + + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + PrecacheResource( "particle", "particles/test_particle/sand_king_cyclone.vpcf", context ) + PrecacheUnitByNameSync( "npc_dota_sand_king_sandstorm", context, -1 ) + +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_sandstorm:OnAbilityPhaseStart() + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 325, 325, 325 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 140, 0 ) ) + end + return true +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_sandstorm:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_sandstorm:GetChannelAnimation() + return ACT_DOTA_OVERRIDE_ABILITY_2 +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_sandstorm:GetPlaybackRateOverride() + return 0.5 +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_sandstorm:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + self:GetCaster().bInSandStorm = true + + if self.nCastCount == nil then + self.nCastCount = 0 + else + self.nCastCount = self.nCastCount + 1 + end + + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sandking_sand_storm", { duration = self:GetSpecialValueFor( "channel_time" ) } ) + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sandking_sand_storm_invis", { duration = self:GetSpecialValueFor( "channel_time" ) } ) + self.storm_count_per_player = self:GetSpecialValueFor( "storm_count_per_player" ) + self.storm_angle_step = self:GetSpecialValueFor( "storm_angle_step" ) + self.storm_speed = self:GetSpecialValueFor( "storm_speed" ) + self:GetSpecialValueFor( "storm_speed_step" ) * self.nCastCount + self.spiral_storm_count = self:GetSpecialValueFor( "spiral_storm_count" ) + + local bReverse = RandomInt( 0, 1 ) + if bReverse == 1 then + self.storm_angle_step = self.storm_angle_step * -1 + end + + self.Storms = {} + + local angle = QAngle( 0, 0, 0 ) + + local Heroes = HeroList:GetAllHeroes() + for _,Hero in pairs( Heroes ) do + if Hero ~= nil then + for i=1,self.storm_count_per_player do + local hStorm = CreateUnitByName( "npc_dota_sand_king_sandstorm", self:GetCaster():GetAbsOrigin(), true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + if hStorm ~= nil then + if self:GetCaster().zone ~= nil then + self:GetCaster().zone:AddEnemyToZone( hStorm ) + end + hStorm.hParent = self:GetCaster() + + hStorm:AddNewModifier( Hero, nil, "modifier_provides_vision", {} ) + hStorm.nFXIndex = ParticleManager:CreateParticle( "particles/test_particle/sand_king_cyclone.vpcf", PATTACH_ABSORIGIN_FOLLOW, hStorm ) + + hStorm:SetForceAttackTarget( Hero ) + hStorm.Target = Hero + hStorm.storm_speed = self.storm_speed + local vSpawnPoint = Hero:GetOrigin() + RandomVector( 1 ) * 2000 + FindClearSpaceForUnit( hStorm, vSpawnPoint, true ) + + + + hStorm:AddNewModifier( hStorm, hStorm:FindAbilityByName( "sand_king_boss_sandstorm_storm_passive" ), "modifier_sand_king_boss_sandstorm", {} ) + + table.insert( self.Storms, hStorm ) + end + end + end + end + + for i=1, self.spiral_storm_count do + local hStorm = CreateUnitByName( "npc_dota_sand_king_sandstorm", self:GetCaster():GetAbsOrigin(), true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + if hStorm ~= nil then + if self:GetCaster().zone ~= nil then + self:GetCaster().zone:AddEnemyToZone( hStorm ) + end + hStorm.hParent = self:GetCaster() + + hStorm:AddNewModifier( Hero, nil, "modifier_provides_vision", {} ) + hStorm.nFXIndex = ParticleManager:CreateParticle( "particles/test_particle/sand_king_cyclone.vpcf", PATTACH_ABSORIGIN_FOLLOW, hStorm ) + local vSpawnPoint = self:GetCaster():GetOrigin() + FindClearSpaceForUnit( hStorm, vSpawnPoint, true ) + + local info = + { + EffectName = "", + Ability = self, + vSpawnOrigin = vSpawnPoint, + fDistance = 5000, + fStartRadius = 50, + fEndRadius = 50, + Source = self:GetCaster(), + } + + info.vVelocity = ( RotatePosition( Vector( 0, 0, 0 ), angle, Vector( 1, 0, 0 ) ) ) * self.storm_speed + + hStorm.nProjHandle = ProjectileManager:CreateLinearProjectile( info ) + hStorm.y = angle.y + angle.y = angle.y + self.storm_angle_step + + hStorm.flAngleUpdate = 3.0 + if bReverse then + hStorm.flAngleUpdate = hStorm.flAngleUpdate * -1 + hStorm.bReverse = bReverse + end + hStorm:AddNewModifier( hStorm, hStorm:FindAbilityByName( "sand_king_boss_sandstorm_storm_passive" ), "modifier_sand_king_boss_sandstorm", {} ) + table.insert( self.Storms, hStorm ) + end + end + end +end + +------------------------------------------------------------------------------- + +function sand_king_boss_sandstorm:OnProjectileThinkHandle( iProjectileHandle ) + if IsServer() then + if self:GetCaster() and self:GetCaster():IsChanneling() == false then + return + end + + for _,Storm in pairs( self.Storms ) do + if Storm ~= nil and Storm.nProjHandle == iProjectileHandle then + Storm.y = Storm.y + Storm.flAngleUpdate + if Storm.bReverse then + Storm.flAngleUpdate = math.min( Storm.flAngleUpdate + 0.03, -1 ) + else + Storm.flAngleUpdate = math.max( Storm.flAngleUpdate - 0.03, 1 ) + end + + local angle = QAngle( 0, Storm.y, 0 ) + local vVelocity = ( RotatePosition( Vector( 0, 0, 0 ), angle, Vector( 1, 0, 0 ) ) ) * self.storm_speed + ProjectileManager:UpdateLinearProjectileDirection( iProjectileHandle, vVelocity, 5000 ) + + end + end + end +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_sandstorm:OnChannelFinish( bInterrupted ) + if IsServer() then + for _,Storm in pairs( self.Storms ) do + if Storm ~= nil then + if Storm.nProjHandle ~= nil then + ProjectileManager:DestroyLinearProjectile( Storm.nProjHandle ) + end + + ParticleManager:DestroyParticle( Storm.nFXIndex, false ) + Storm:ForceKill( false ) + end + end + + self:GetCaster().bInSandStorm = false + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_sandstorm_storm_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_sandstorm_storm_passive.lua new file mode 100755 index 0000000..36c5ec2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_sandstorm_storm_passive.lua @@ -0,0 +1,13 @@ + +sand_king_boss_sandstorm_storm_passive = class({}) +LinkLuaModifier( "modifier_sand_king_boss_sandstorm", "modifiers/creatures/modifier_sand_king_boss_sandstorm", LUA_MODIFIER_MOTION_HORIZONTAL ) +LinkLuaModifier( "modifier_sand_king_boss_sandstorm_effect", "modifiers/creatures/modifier_sand_king_boss_sandstorm_effect", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_sand_king_boss_sandstorm_blind", "modifiers/creatures/modifier_sand_king_boss_sandstorm_blind", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function sand_king_boss_sandstorm_storm_passive:GetIntrinsicModifierName() + return "modifier_sand_king_boss_sandstorm" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_unburrow.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_unburrow.lua new file mode 100755 index 0000000..06dcb1d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_boss_unburrow.lua @@ -0,0 +1,42 @@ + +sand_king_boss_unburrow = class({}) + +-------------------------------------------------------------------- + +function sand_king_boss_unburrow:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow_exit.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_huskar/huskar_inner_vitality.vpcf", context ) + +end + +-------------------------------------------------------------------- + +function sand_king_boss_unburrow:OnAbilityPhaseStart() + if IsServer() then + if self:GetCaster().nBurrowFXIndex == nil then + return true + end + ParticleManager:DestroyParticle( self:GetCaster().nBurrowFXIndex, false ) + + EmitSoundOn( "Hero_NyxAssassin.Burrow.Out", self:GetCaster() ) + local nFXIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow_exit.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetCaster():GetOrigin() ) + end + return true +end + +-------------------------------------------------------------------------------- + +function sand_king_boss_unburrow:GetPlaybackRateOverride() + return 0.5 +end + +-------------------------------------------------------------------- + +function sand_king_boss_unburrow:OnSpellStart() + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_sand_king_boss_burrow" ) + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_burrowed_backward_strike.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_burrowed_backward_strike.lua new file mode 100755 index 0000000..a0838e9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_burrowed_backward_strike.lua @@ -0,0 +1,52 @@ + +sand_king_burrowed_backward_strike = class({}) + +-------------------------------------------------------------------- + +function sand_king_burrowed_backward_strike:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_sandking/sandking_epicenter_tell.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function sand_king_burrowed_backward_strike:OnAbilityPhaseStart() + if IsServer() then + self.animation_time = self:GetSpecialValueFor( "animation_time" ) + self.initial_delay = self:GetSpecialValueFor( "initial_delay" ) + + local kv = {} + kv["duration"] = self.animation_time + kv["initial_delay"] = self.initial_delay + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sand_king_tail_swipe", kv ) + end + return true +end + +-------------------------------------------------------------------------------- + +function sand_king_burrowed_backward_strike:OnAbilityPhaseInterrupted() + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_sand_king_tail_swipe" ) + end +end + +-------------------------------------------------------------------------------- + +function sand_king_burrowed_backward_strike:GetPlaybackRateOverride() + return 0.38 +end + +-------------------------------------------------------------------------------- + +function sand_king_burrowed_backward_strike:GetCastRange( vLocation, hTarget ) + if IsServer() then + if self:GetCaster():FindModifierByName( "modifier_sand_king_tail_swipe" ) ~= nil then + return 99999 + end + end + + return self.BaseClass.GetCastRange( self, vLocation, hTarget ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_burrowed_forward_strike.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_burrowed_forward_strike.lua new file mode 100755 index 0000000..1f6e728 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_burrowed_forward_strike.lua @@ -0,0 +1,52 @@ + +sand_king_burrowed_forward_strike = class({}) + +-------------------------------------------------------------------- + +function sand_king_burrowed_forward_strike:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_sandking/sandking_epicenter_tell.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function sand_king_burrowed_forward_strike:OnAbilityPhaseStart() + if IsServer() then + self.animation_time = self:GetSpecialValueFor( "animation_time" ) + self.initial_delay = self:GetSpecialValueFor( "initial_delay" ) + + local kv = {} + kv["duration"] = self.animation_time + kv["initial_delay"] = self.initial_delay + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sand_king_tail_swipe", kv ) + end + return true +end + +-------------------------------------------------------------------------------- + +function sand_king_burrowed_forward_strike:OnAbilityPhaseInterrupted() + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_sand_king_tail_swipe" ) + end +end + +-------------------------------------------------------------------------------- + +function sand_king_burrowed_forward_strike:GetPlaybackRateOverride() + return 0.70 +end + +-------------------------------------------------------------------------------- + +function sand_king_burrowed_forward_strike:GetCastRange( vLocation, hTarget ) + if IsServer() then + if self:GetCaster():FindModifierByName( "modifier_sand_king_tail_swipe" ) ~= nil then + return 99999 + end + end + + return self.BaseClass.GetCastRange( self, vLocation, hTarget ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_claw_attack.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_claw_attack.lua new file mode 100755 index 0000000..1ff283d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_claw_attack.lua @@ -0,0 +1,44 @@ + +sand_king_claw_attack = class({}) +LinkLuaModifier( "modifier_sand_king_claw_attack", "modifiers/creatures/modifier_sand_king_claw_attack", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function sand_king_claw_attack:OnAbilityPhaseStart() + if IsServer() then + self.animation_time = self:GetSpecialValueFor( "animation_time" ) + self.initial_delay = self:GetSpecialValueFor( "initial_delay" ) + + local kv = {} + kv["duration"] = self.animation_time + kv["initial_delay"] = self.initial_delay + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sand_king_claw_attack", kv ) + end + return true +end + +-------------------------------------------------------------------------------- + +function sand_king_claw_attack:OnAbilityPhaseInterrupted() + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_sand_king_claw_attack" ) + end +end + +-------------------------------------------------------------------------------- + +function sand_king_claw_attack:GetPlaybackRateOverride() + return 0.6 +end + +-------------------------------------------------------------------------------- + +function sand_king_claw_attack:GetCastRange( vLocation, hTarget ) + if IsServer() then + if self:GetCaster():FindModifierByName( "modifier_sand_king_claw_attack" ) ~= nil then + return 99999 + end + end + + return self.BaseClass.GetCastRange( self, vLocation, hTarget ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_tail_swipe.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_tail_swipe.lua new file mode 100755 index 0000000..1aa30f6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_tail_swipe.lua @@ -0,0 +1,53 @@ + +sand_king_tail_swipe_left = class({}) +LinkLuaModifier( "modifier_sand_king_tail_swipe", "modifiers/creatures/modifier_sand_king_tail_swipe", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------- + +function sand_king_tail_swipe_left:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_sandking/sandking_epicenter_tell.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function sand_king_tail_swipe_left:OnAbilityPhaseStart() + if IsServer() then + self.animation_time = self:GetSpecialValueFor( "animation_time" ) + self.initial_delay = self:GetSpecialValueFor( "initial_delay" ) + + local kv = {} + kv["duration"] = self.animation_time + kv["initial_delay"] = self.initial_delay + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sand_king_tail_swipe", kv ) + end + return true +end + +-------------------------------------------------------------------------------- + +function sand_king_tail_swipe_left:OnAbilityPhaseInterrupted() + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_sand_king_tail_swipe" ) + end +end + +-------------------------------------------------------------------------------- + +function sand_king_tail_swipe_left:GetPlaybackRateOverride() + return 0.75 +end + +-------------------------------------------------------------------------------- + +function sand_king_tail_swipe_left:GetCastRange( vLocation, hTarget ) + if IsServer() then + if self:GetCaster():FindModifierByName( "modifier_sand_king_tail_swipe" ) ~= nil then + return 99999 + end + end + + return self.BaseClass.GetCastRange( self, vLocation, hTarget ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_tail_swipe_left.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_tail_swipe_left.lua new file mode 100755 index 0000000..ffcedfa --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_tail_swipe_left.lua @@ -0,0 +1,53 @@ + +sand_king_tail_swipe_left = class({}) +LinkLuaModifier( "modifier_sand_king_tail_swipe", "modifiers/creatures/modifier_sand_king_tail_swipe", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------- + +function sand_king_tail_swipe_left:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_sandking/sandking_epicenter_tell.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function sand_king_tail_swipe_left:OnAbilityPhaseStart() + if IsServer() then + self.animation_time = self:GetSpecialValueFor( "animation_time" ) + self.initial_delay = self:GetSpecialValueFor( "initial_delay" ) + + local kv = {} + kv["duration"] = self.animation_time + kv["initial_delay"] = self.initial_delay + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sand_king_tail_swipe", kv ) + end + return true +end + +-------------------------------------------------------------------------------- + +function sand_king_tail_swipe_left:OnAbilityPhaseInterrupted() + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_sand_king_tail_swipe" ) + end +end + +-------------------------------------------------------------------------------- + +function sand_king_tail_swipe_left:GetPlaybackRateOverride() + return 0.6 +end + +-------------------------------------------------------------------------------- + +function sand_king_tail_swipe_left:GetCastRange( vLocation, hTarget ) + if IsServer() then + if self:GetCaster():FindModifierByName( "modifier_sand_king_tail_swipe" ) ~= nil then + return 99999 + end + end + + return self.BaseClass.GetCastRange( self, vLocation, hTarget ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_tail_swipe_right.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_tail_swipe_right.lua new file mode 100755 index 0000000..ec61ba5 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/sand_king_tail_swipe_right.lua @@ -0,0 +1,52 @@ + +sand_king_tail_swipe_right = class({}) + +-------------------------------------------------------------------- + +function sand_king_tail_swipe_right:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_sandking/sandking_epicenter_tell.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function sand_king_tail_swipe_right:OnAbilityPhaseStart() + if IsServer() then + self.animation_time = self:GetSpecialValueFor( "animation_time" ) + self.initial_delay = self:GetSpecialValueFor( "initial_delay" ) + + local kv = {} + kv["duration"] = self.animation_time + kv["initial_delay"] = self.initial_delay + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_sand_king_tail_swipe", kv ) + end + return true +end + +-------------------------------------------------------------------------------- + +function sand_king_tail_swipe_right:OnAbilityPhaseInterrupted() + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_sand_king_tail_swipe" ) + end +end + +-------------------------------------------------------------------------------- + +function sand_king_tail_swipe_right:GetPlaybackRateOverride() + return 0.6 +end + +-------------------------------------------------------------------------------- + +function sand_king_tail_swipe_right:GetCastRange( vLocation, hTarget ) + if IsServer() then + if self:GetCaster():FindModifierByName( "modifier_sand_king_tail_swipe" ) ~= nil then + return 99999 + end + end + + return self.BaseClass.GetCastRange( self, vLocation, hTarget ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/scarab_priest_summon_zealots.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/scarab_priest_summon_zealots.lua new file mode 100755 index 0000000..0a7be82 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/scarab_priest_summon_zealots.lua @@ -0,0 +1,85 @@ + +scarab_priest_summon_zealots = class({}) +LinkLuaModifier( "modifier_scarab_priest_summon_mound", "modifiers/creatures/modifier_scarab_priest_summon_mound", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function scarab_priest_summon_zealots:Precache( context ) + + PrecacheResource( "particle", "particles/themed_fx/tower_dragon_black_smokering.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", context ) + PrecacheResource( "particle", "particles/nyx_swarm_explosion/nyx_swarm_explosion.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow_exit.vpcf", context ) + PrecacheUnitByNameSync( "npc_dota_creature_zealot_mound", context, -1 ) + PrecacheUnitByNameSync( "npc_dota_creature_zealot_scarab", context, -1 ) + +end + +-------------------------------------------------------------------------------- + +function scarab_priest_summon_zealots:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function scarab_priest_summon_zealots:OnSpellStart() + if not IsServer() then + return + end + + if self:GetCaster() == nil or self:GetCaster():IsNull() then + return + end + +-- print( "scarab_priest_summon_zealots:OnSpellStart " ) + + local nSummonCount = self:GetSpecialValueFor( "spawn_count" ) + local flSpawnDistance = self:GetSpecialValueFor( "spawn_distance" ) + local flDuration = self:GetSpecialValueFor( "mound_duration" ) + local flDeltaAngle = 360 / nSummonCount + local vAngles = QAngle( 0, math.random( 0, flDeltaAngle ), 0 ) + + for i = 1,nSummonCount do + + local vSpawnPosition = nil + for s = 1,36 do + + local vDir = AnglesToVector( vAngles ) + local vTest = self:GetCaster():GetAbsOrigin() + vDir * flSpawnDistance + math.random( -25, 25 ) + + if GameRules.Aghanim:GetCurrentRoom():IsValidSpawnPoint( vTest ) then + vSpawnPosition = vTest + break + end + + vAngles.y = vAngles.y + 10 + + end + + vAngles.y = vAngles.y + flDeltaAngle + math.random( -20, 20 ) + + if vSpawnPosition ~= nil then + + EmitSoundOn( "Hero_NyxAssassin.Vendetta", self:GetCaster() ) + + local hMound = CreateUnitByName( "npc_dota_creature_zealot_mound", vSpawnPosition, true, + self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + + if hMound ~= nil then + hMound:AddNewModifier( self:GetCaster(), self, "modifier_scarab_priest_summon_mound", + { + duration = flDuration, + summoned_unit = "npc_dota_creature_zealot_scarab" + } ) + hMound:AddNewModifier( self:GetCaster(), self, "modifier_provides_fow_position", { duration = -1 } ) + hMound:AddNewModifier( self:GetCaster(), self, "modifier_fixed_number_of_hits_to_kill", { duration = -1 } ) + end + + end + + end + +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/skeleton_king_run_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/skeleton_king_run_passive.lua new file mode 100755 index 0000000..e75e831 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/skeleton_king_run_passive.lua @@ -0,0 +1,13 @@ + +skeleton_king_run_passive = class({}) + +LinkLuaModifier( "modifier_skeleton_king_boss_run", "modifiers/creatures/modifier_skeleton_king_boss_run", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function skeleton_king_run_passive:GetIntrinsicModifierName() + return "modifier_skeleton_king_boss_run" +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/spider_egg_sack.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/spider_egg_sack.lua new file mode 100755 index 0000000..943aa91 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/spider_egg_sack.lua @@ -0,0 +1,18 @@ + +spider_egg_sack = class({}) +LinkLuaModifier( "modifier_spider_egg_sack", "modifiers/creatures/modifier_spider_egg_sack", LUA_MODIFIER_MOTION_NONE ) + +------------------------------------------------------------------------- + +function spider_egg_sack:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_venomancer/venomancer_poison_nova.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_venomancer/venomancer_poison_debuff_nova.vpcf", context ) + + PrecacheUnitByNameSync( "npc_dota_creature_newborn_spider", context, -1 ) +end + +-------------------------------------------------------------------------------- + +function spider_egg_sack:GetIntrinsicModifierName() + return "modifier_spider_egg_sack" +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_arm_slam.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_arm_slam.lua new file mode 100755 index 0000000..145df4d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_arm_slam.lua @@ -0,0 +1,60 @@ + +storegga_arm_slam = class({}) +LinkLuaModifier( "modifier_storegga_arm_slam", "modifiers/creatures/modifier_storegga_arm_slam", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function storegga_arm_slam:Precache( context ) + + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function storegga_arm_slam:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function storegga_arm_slam:OnAbilityPhaseStart() + if IsServer() then + --self.animation_time = self:GetSpecialValueFor( "animation_time" ) + self.initial_delay = self:GetSpecialValueFor( "initial_delay" ) + + local kv = {} + kv["duration"] = self:GetCastPoint() + --kv["duration"] = self.animation_time + kv["initial_delay"] = self.initial_delay + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_storegga_arm_slam", kv ) + end + return true +end + +-------------------------------------------------------------------------------- + +function storegga_arm_slam:OnAbilityPhaseInterrupted() + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_storegga_arm_slam" ) + end +end + +-------------------------------------------------------------------------------- + +function storegga_arm_slam:GetPlaybackRateOverride() + return 0.55 +end + +-------------------------------------------------------------------------------- + +function storegga_arm_slam:GetCastRange( vLocation, hTarget ) + if IsServer() then + if self:GetCaster():FindModifierByName( "modifier_storegga_arm_slam" ) ~= nil then + return 99999 + end + end + + return self.BaseClass.GetCastRange( self, vLocation, hTarget ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_avalanche.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_avalanche.lua new file mode 100755 index 0000000..13b37b2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_avalanche.lua @@ -0,0 +1,81 @@ + +storegga_avalanche = class({}) +LinkLuaModifier( "modifier_storegga_avalanche_thinker", "modifiers/creatures/modifier_storegga_avalanche_thinker", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function storegga_avalanche:Precache( context ) + + PrecacheResource( "particle", "particles/act_2/storegga_channel.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/storegga/storegga_avalanche.vpcf", context ) + +end + +----------------------------------------------------------------------- + +function storegga_avalanche:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function storegga_avalanche:GetChannelAnimation() + return ACT_DOTA_CHANNEL_ABILITY_1 +end + +-------------------------------------------------------------------------------- + +function storegga_avalanche:GetPlaybackRateOverride() + return 1 +end + +-------------------------------------------------------------------------------- + +function storegga_avalanche:OnAbilityPhaseStart() + if IsServer() then + self.nChannelFX = ParticleManager:CreateParticle( "particles/act_2/storegga_channel.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + end + + return true +end + +----------------------------------------------------------------------- + +function storegga_avalanche:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nChannelFX, false ) + end +end + +----------------------------------------------------------------------- + +function storegga_avalanche:OnSpellStart() + if IsServer() then + self.flChannelTime = 0.0 + self.hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_storegga_avalanche_thinker", { duration = self:GetChannelTime() }, self:GetCaster():GetOrigin(), self:GetCaster():GetTeamNumber(), false ) + end +end + +-------------------------------------------------------------------------------- + +function storegga_avalanche:OnChannelThink( flInterval ) + if IsServer() then + self.flChannelTime = self.flChannelTime + flInterval + if self.flChannelTime > 9.2 and self.bStartedGesture ~= true then + self.bStartedGesture = true + self:GetCaster():StartGesture( ACT_DOTA_CAST_ABILITY_2_END ) + end + end +end + +----------------------------------------------------------------------- + +function storegga_avalanche:OnChannelFinish( bInterrpted ) + if IsServer() then + ParticleManager:DestroyParticle( self.nChannelFX, false ) + if self.hThinker ~= nil and self.hThinker:IsNull() == false then + self.hThinker:ForceKill( false ) + end + + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_grab.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_grab.lua new file mode 100755 index 0000000..910c383 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_grab.lua @@ -0,0 +1,68 @@ + +storegga_grab = class({}) +LinkLuaModifier( "modifier_storegga_grab", "modifiers/creatures/modifier_storegga_grab", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_storegga_grabbed_buff", "modifiers/creatures/modifier_storegga_grabbed_buff", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_storegga_grabbed_debuff", "modifiers/creatures/modifier_storegga_grabbed_debuff", LUA_MODIFIER_MOTION_BOTH ) + +---------------------------------------------------------------------------------------- + +function storegga_grab:Precache( context ) + + PrecacheResource( "particle", "particles/test_particle/generic_attack_crit_blur.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function storegga_grab:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function storegga_grab:OnAbilityPhaseStart() + if IsServer() then + if self:GetCaster():FindModifierByName( "modifier_storegga_grabbed_buff" ) ~= nil then + return false + end + self.animation_time = self:GetSpecialValueFor( "animation_time" ) + self.initial_delay = self:GetSpecialValueFor( "initial_delay" ) + + local kv = {} + kv["duration"] = self.animation_time + kv["initial_delay"] = self.initial_delay + local hBuff = self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_storegga_grab", kv ) + if hBuff ~= nil then + hBuff.hTarget = self:GetCursorTarget() + end + end + return true +end + +-------------------------------------------------------------------------------- + +function storegga_grab:OnAbilityPhaseInterrupted() + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_storegga_grab" ) + end +end + +-------------------------------------------------------------------------------- + +--[[ +function storegga_grab:GetPlaybackRateOverride() + return 0.35 +end +]] + +-------------------------------------------------------------------------------- + +function storegga_grab:GetCastRange( vLocation, hTarget ) + if IsServer() then + if self:GetCaster():FindModifierByName( "modifier_storegga_grab" ) ~= nil then + return 99999 + end + end + + return self.BaseClass.GetCastRange( self, vLocation, hTarget ) +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_grab_throw.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_grab_throw.lua new file mode 100755 index 0000000..c60d860 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_grab_throw.lua @@ -0,0 +1,214 @@ + +storegga_grab_throw = class({}) + +---------------------------------------------------------------------------------------- + +function storegga_grab_throw:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function storegga_grab_throw:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function storegga_grab_throw:OnAbilityPhaseStart() + if IsServer() then + + end + return true +end + +-------------------------------------------------------------------------------- + +function storegga_grab_throw:OnAbilityPhaseInterrupted() + if IsServer() then + --ParticleManager:DestroyParticle( self.nTargetFX, false ) + end +end + +-------------------------------------------------------------------------------- + +--[[ +function storegga_grab_throw:GetPlaybackRateOverride() + return 0.7 +end +]] + +-------------------------------------------------------------------------------- + +function storegga_grab_throw:OnSpellStart() + if IsServer() then + self.hBuff = self:GetCaster():FindModifierByName( "modifier_storegga_grabbed_buff" ) + if self.hBuff == nil then + return false + end + + self.hThrowTarget = self.hBuff.hThrowObject + if self.hThrowTarget == nil then + self:GetCaster():RemoveModifierByName( "modifier_storegga_grabbed_buff" ) + return false + end + + self.hThrowBuff = self.hThrowTarget:FindModifierByName( "modifier_storegga_grabbed_debuff" ) + if self.hThrowBuff == nil then + self:GetCaster():RemoveModifierByName( "modifier_storegga_grabbed_buff" ) + return false + end + + self.throw_speed = self:GetSpecialValueFor( "throw_speed" ) + self.impact_radius = self:GetSpecialValueFor( "impact_radius" ) + self.stun_duration = self:GetSpecialValueFor( "stun_duration" ) + self.knockback_duration = self:GetSpecialValueFor( "knockback_duration" ) + self.knockback_distance = self:GetSpecialValueFor( "knockback_distance" ) + self.knockback_damage = self:GetSpecialValueFor( "knockback_damage" ) + self.knockback_height = self:GetSpecialValueFor( "knockback_height" ) + + if self.hThrowTarget:GetUnitName() == "npc_dota_storegga_rock" then + self.throw_speed = self.throw_speed * 1.4 + self.impact_radius = self.impact_radius * 0.75 + self.knockback_damage = self.knockback_damage * 1 + end + if self.hThrowTarget:GetUnitName() == "npc_dota_storegga_rock2" then + self.throw_speed = self.throw_speed * 1 + self.impact_radius = self.impact_radius * 1.25 + self.knockback_damage = self.knockback_damage * 2 + end + if self.hThrowTarget:GetUnitName() == "npc_dota_storegga_rock3" then + self.throw_speed = self.throw_speed * 0.6 + self.impact_radius = self.impact_radius * 1.5 + self.knockback_damage = self.knockback_damage * 3 + end + + self.attach = self:GetCaster():ScriptLookupAttachment( "attach_attack2" ) + self.vSpawnLocation = self:GetCaster():GetAttachmentOrigin( self.attach ) + + self.vDirection = self:GetCursorPosition() - self.vSpawnLocation + self.flDist = self.vDirection:Length2D() + --self.vDirection = self:GetCursorPosition() - self:GetCaster():GetOrigin() + --self.flDist = self.vDirection:Length2D() - 300 -- the direction is offset due to the attachment point + self.vDirection.z = 0.0 + self.vDirection = self.vDirection:Normalized() + + self.vEndPos = self.vSpawnLocation + self.vDirection * self.flDist + + local info = { + EffectName = "", + Ability = self, + vSpawnOrigin = self.vSpawnLocation, + fStartRadius = self.impact_radius, + fEndRadius = self.impact_radius, + vVelocity = self.vDirection * self.throw_speed, + fDistance = self.flDist, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO, + } + + self.hThrowBuff.nProjHandle = ProjectileManager:CreateLinearProjectile( info ) + self.hThrowBuff.flHeight = self.vSpawnLocation.z - GetGroundHeight( self:GetCaster():GetOrigin(), self:GetCaster() ) + self.hThrowBuff.flTime = self.flDist / self.throw_speed + self:GetCaster():RemoveModifierByName( "modifier_storegga_grabbed_buff" ) + EmitSoundOn( "Hero_Tiny.Toss.Target", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function storegga_grab_throw:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + if hTarget ~= nil then + return + end + + --ParticleManager:DestroyParticle( self.nTargetFX, false ) + + EmitSoundOnLocationWithCaster( vLocation, "Ability.TossImpact", self:GetCaster() ) + EmitSoundOnLocationWithCaster( vLocation, "OgreTank.GroundSmash", self:GetCaster() ) + + if self.hThrowTarget ~= nil then + self.hThrowBuff:Destroy() + if self.hThrowTarget:IsRealHero() then + local damageInfo = + { + victim = self.hThrowTarget, + attacker = self:GetCaster(), + damage = self.knockback_damage * 0.6, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + if self.hThrowTarget:IsAlive() == false then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self.hThrowTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", self.hThrowTarget:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, self.hThrowTarget:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, -self:GetCaster():GetForwardVector() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 10, self.hThrowTarget, PATTACH_ABSORIGIN_FOLLOW, nil, self.hThrowTarget:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Dungeon.BloodSplatterImpact", self.hThrowTarget ) + else + self.hThrowTarget:AddNewModifier( self:GetCaster(), self, "modifier_stunned", { duration = self.stun_duration } ) + end + end + + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/ogre/ogre_melee_smash.vpcf", PATTACH_WORLDORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, GetGroundPosition( vLocation, self.hThrowTarget ) ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.impact_radius, self.impact_radius, self.impact_radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), vLocation, self:GetCaster(), self.impact_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and enemy ~= self.hThrowTarget then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.knockback_damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + if enemy:IsAlive() == false then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, enemy:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, -self:GetCaster():GetForwardVector() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 10, enemy, PATTACH_ABSORIGIN_FOLLOW, nil, enemy:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Dungeon.BloodSplatterImpact", enemy ) + else + local kv = + { + center_x = vLocation.x, + center_y = vLocation.y, + center_z = vLocation.z, + should_stun = true, + duration = self.knockback_duration, + knockback_duration = self.knockback_duration, + knockback_distance = self.knockback_distance, + knockback_height = self.knockback_height, + } + enemy:AddNewModifier( self:GetCaster(), self, "modifier_stunned", { duration = self.knockback_duration } ) + end + + end + end + end + + + + return false + end +end + +----------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_ground_pound.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_ground_pound.lua new file mode 100755 index 0000000..486ee33 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_ground_pound.lua @@ -0,0 +1,98 @@ + +storegga_ground_pound = class({}) +LinkLuaModifier( "modifier_storegga_ground_pound_thinker", "modifiers/creatures/modifier_storegga_ground_pound_thinker", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function storegga_ground_pound:Precache( context ) + PrecacheResource( "particle", "particles/test_particle/dungeon_sand_king_channel.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function storegga_ground_pound:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function storegga_ground_pound:GetChannelAnimation() + return ACT_DOTA_CHANNEL_ABILITY_1 +end + +-------------------------------------------------------------------------------- + +function storegga_ground_pound:GetPlaybackRateOverride() + if IsServer() then + if self.fChannelTime == nil then + return self.cast_point_playback_rate + else + return self.channel_playback_rate + end + end +end + +-------------------------------------------------------------------------------- + +function storegga_ground_pound:OnAbilityPhaseStart() + if IsServer() then + self.cast_point_playback_rate = self:GetSpecialValueFor( "cast_point_playback_rate" ) + self.channel_playback_rate = self:GetSpecialValueFor( "channel_playback_rate" ) + + local hArm = self:GetCaster():ScriptLookupAttachment( "attach_attack1" ) + local vArmPos = self:GetCaster():GetAttachmentOrigin( hArm ) + self.nPreviewFX = ParticleManager:CreateParticle( "particles/test_particle/dungeon_sand_king_channel.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( self.nPreviewFX, 0, vArmPos ) + end + + return true +end + +----------------------------------------------------------------------- + +function storegga_ground_pound:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function storegga_ground_pound:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + self.fChannelTime = 0.0 + + local hArm = self:GetCaster():ScriptLookupAttachment( "attach_attack1" ) + local vArmPos = self:GetCaster():GetAttachmentOrigin( hArm ) + self.hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_storegga_ground_pound_thinker", { duration = self:GetChannelTime() }, vArmPos, self:GetCaster():GetTeamNumber(), false ) + end +end + +-------------------------------------------------------------------------------- + +function storegga_ground_pound:OnChannelThink( flInterval ) + if IsServer() then + self.fChannelTime = self.fChannelTime + flInterval + local fFirstAnimDuration = 2.2321 --2.5 + if self.fChannelTime > fFirstAnimDuration and self.bStartedGesture ~= true then + self.bStartedGesture = true + self:GetCaster():StartGesture( ACT_DOTA_CAST_ABILITY_2_END ) + end + end +end + +-------------------------------------------------------------------------------- + +function storegga_ground_pound:OnChannelFinish( bInterrpted ) + if IsServer() then + if self.hThinker ~= nil and self.hThinker:IsNull() == false then + self.hThinker:ForceKill( false ) + end + + self.fChannelTime = nil + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_passive.lua new file mode 100755 index 0000000..358886e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/storegga_passive.lua @@ -0,0 +1,11 @@ + +storegga_passive = class({}) +LinkLuaModifier( "modifier_storegga_passive", "modifiers/creatures/modifier_storegga_passive", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function storegga_passive:GetIntrinsicModifierName() + return "modifier_storegga_passive" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/story_crystal.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/story_crystal.lua new file mode 100755 index 0000000..11e512a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/story_crystal.lua @@ -0,0 +1,18 @@ +story_crystal = class( {} ) + +LinkLuaModifier( "modifier_story_crystal", "modifiers/creatures/modifier_story_crystal", LUA_MODIFIER_MOTION_VERTICAL ) + +-------------------------------------------------------------------------------- + +function story_crystal:Precache( context ) + PrecacheResource( "particle", "particles/creatures/aghanim/aghanim_crystal_spellswap_ambient.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/voscripts/game_sounds_vo_wisp.vsndevts", context ) +end + +-------------------------------------------------------------------------------- + +function story_crystal:GetIntrinsicModifierName() + return "modifier_story_crystal" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_hammer_smash.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_hammer_smash.lua new file mode 100755 index 0000000..4f65d2e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_hammer_smash.lua @@ -0,0 +1,41 @@ + +temple_guardian_hammer_smash = class({}) +LinkLuaModifier( "modifier_ogre_tank_melee_smash_thinker", "modifiers/creatures/modifier_ogre_tank_melee_smash_thinker", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function temple_guardian_hammer_smash:Precache( context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function temple_guardian_hammer_smash:OnAbilityPhaseStart() + self.playback_rate = self:GetSpecialValueFor( "playback_rate" ) + + if IsServer() then + EmitSoundOn( "TempleGuardian.PreAttack", self:GetCaster() ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function temple_guardian_hammer_smash:GetPlaybackRateOverride() + return self.playback_rate +end + +----------------------------------------------------------------------------- + +function temple_guardian_hammer_smash:OnSpellStart() + if IsServer() then + local vToTarget = self:GetCursorPosition() - self:GetCaster():GetOrigin() + vToTarget = vToTarget:Normalized() + local vTarget = self:GetCaster():GetOrigin() + vToTarget * self:GetCastRange( self:GetCaster():GetOrigin(), nil ) + CreateModifierThinker( self:GetCaster(), self, "modifier_ogre_tank_melee_smash_thinker", { duration = 0 }, vTarget, self:GetCaster():GetTeamNumber(), false ) + end +end + +----------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_hammer_throw.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_hammer_throw.lua new file mode 100755 index 0000000..1932ba4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_hammer_throw.lua @@ -0,0 +1,64 @@ + +temple_guardian_hammer_throw = class({}) +LinkLuaModifier( "modifier_temple_guardian_hammer_throw", "modifiers/creatures/modifier_temple_guardian_hammer_throw", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function temple_guardian_hammer_throw:Precache( context ) + PrecacheResource( "particle", "particles/test_particle/generic_attack_charge.vpcf", context ) + PrecacheResource( "particle", "particles/test_particle/omniknight_wildaxe.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_beastmaster/beastmaster_wildaxes_hit.vpcf", context ) + + PrecacheUnitByNameSync( "npc_dota_beastmaster_axe", context, -1 ) +end + +-------------------------------------------------------------------------------- + +function temple_guardian_hammer_throw:OnAbilityPhaseStart() + self.playback_rate = self:GetSpecialValueFor( "playback_rate" ) + + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/test_particle/generic_attack_charge.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_attack2", self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 135, 192, 235 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 16, Vector( 1, 0, 0 ) ) + ParticleManager:ReleaseParticleIndex( self.nPreviewFX ) + + EmitSoundOn( "TempleGuardian.PreAttack", self:GetCaster() ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function temple_guardian_hammer_throw:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, true ) + end +end + +-------------------------------------------------------------------------------- + +function temple_guardian_hammer_throw:GetPlaybackRateOverride() + return self.playback_rate +end + +-------------------------------------------------------------------------- + +function temple_guardian_hammer_throw:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + local vLocation = self:GetCursorPosition() + + local kv = + { + x = vLocation.x, + y = vLocation.y, + } + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_temple_guardian_hammer_throw", kv ) + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_passive.lua new file mode 100755 index 0000000..678a264 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_passive.lua @@ -0,0 +1,11 @@ + +temple_guardian_passive = class({}) +LinkLuaModifier( "modifier_temple_guardian_passive", "modifiers/creatures/modifier_temple_guardian_passive", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function temple_guardian_passive:GetIntrinsicModifierName() + return "modifier_temple_guardian_passive" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_purification.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_purification.lua new file mode 100755 index 0000000..15dec06 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_purification.lua @@ -0,0 +1,91 @@ + +temple_guardian_purification = class({}) + +---------------------------------------------------------------------------------------- + +function temple_guardian_purification:Precache( context ) + PrecacheResource( "particle", "particles/test_particle/generic_attack_charge.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_purification.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_purification_cast.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_purification_hit.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function temple_guardian_purification:OnAbilityPhaseStart() + self.playback_rate = self:GetSpecialValueFor( "playback_rate" ) + + if IsServer() then + local radius = self:GetSpecialValueFor( "radius" ) + self.nPreviewFX = ParticleManager:CreateParticle( "particles/test_particle/generic_attack_charge.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_attack2", self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 215, 0 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 16, Vector( 1, 0, 0 ) ) + ParticleManager:ReleaseParticleIndex( self.nPreviewFX ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function temple_guardian_purification:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function temple_guardian_purification:GetPlaybackRateOverride() + return self.playback_rate +end + +-------------------------------------------------------------------------------- +function temple_guardian_purification:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, true ) + + local hTarget = self:GetCursorTarget() + if hTarget == nil or hTarget:IsInvulnerable() or hTarget:IsMagicImmune() then + return + end + + local radius = self:GetSpecialValueFor( "radius" ) + local heal = self:GetSpecialValueFor( "heal" ) + + hTarget:Heal( heal, self ) + + local nFXIndex1 = ParticleManager:CreateParticle( "particles/units/heroes/hero_omniknight/omniknight_purification.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( nFXIndex1, 0, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetOrigin(), true ); + ParticleManager:SetParticleControl( nFXIndex1, 1, Vector( radius, radius, radius ) ); + ParticleManager:ReleaseParticleIndex( nFXIndex1 ); + + local nFXIndex2 = ParticleManager:CreateParticle( "particles/units/heroes/hero_omniknight/omniknight_purification_cast.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( nFXIndex2, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_attack2", self:GetCaster():GetOrigin(), true ); + ParticleManager:SetParticleControlEnt( nFXIndex2, 1, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetOrigin(), true ); + ParticleManager:ReleaseParticleIndex( nFXIndex2 ); + + EmitSoundOn( "TempleGuardian.Purification", hTarget ) + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), hTarget:GetOrigin(), nil, radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and enemy:IsMagicImmune() == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = heal, + damage_type = DAMAGE_TYPE_PURE, + ability = self, + } + ApplyDamage( damageInfo ) + + local nFXIndex3 = ParticleManager:CreateParticle( "particles/units/heroes/hero_omniknight/omniknight_purification_hit.vpcf", PATTACH_ABSORIGIN_FOLLOW, enemy ); + ParticleManager:SetParticleControlEnt( nFXIndex3, 1, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ); + ParticleManager:ReleaseParticleIndex( nFXIndex3 ); + end + end + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_rage_hammer_smash.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_rage_hammer_smash.lua new file mode 100755 index 0000000..51681af --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_rage_hammer_smash.lua @@ -0,0 +1,41 @@ + +temple_guardian_rage_hammer_smash = class({}) +LinkLuaModifier( "modifier_ogre_tank_melee_smash_thinker", "modifiers/creatures/modifier_ogre_tank_melee_smash_thinker", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function temple_guardian_rage_hammer_smash:Precache( context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function temple_guardian_rage_hammer_smash:OnAbilityPhaseStart() + self.playback_rate = self:GetSpecialValueFor( "playback_rate" ) + + if IsServer() then + EmitSoundOn( "TempleGuardian.PreAttack", self:GetCaster() ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function temple_guardian_rage_hammer_smash:GetPlaybackRateOverride() + return self.playback_rate +end + +----------------------------------------------------------------------------- + +function temple_guardian_rage_hammer_smash:OnSpellStart() + if IsServer() then + local vToTarget = self:GetCursorPosition() - self:GetCaster():GetOrigin() + vToTarget = vToTarget:Normalized() + local vTarget = self:GetCaster():GetOrigin() + vToTarget * self:GetCastRange( self:GetCaster():GetOrigin(), nil ) + local hThinker = CreateModifierThinker( self:GetCaster(), self, "modifier_ogre_tank_melee_smash_thinker", { duration = 0 }, vTarget, self:GetCaster():GetTeamNumber(), false ) + end +end + +----------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_wrath.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_wrath.lua new file mode 100755 index 0000000..b25e6e9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/temple_guardian_wrath.lua @@ -0,0 +1,132 @@ + +require( "utility_functions" ) + +temple_guardian_wrath = class({}) +LinkLuaModifier( "modifier_temple_guardian_wrath_thinker", "modifiers/creatures/modifier_temple_guardian_wrath_thinker", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_temple_guardian_immunity", "modifiers/creatures/modifier_temple_guardian_immunity", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function temple_guardian_wrath:Precache( context ) + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_guardian_angel_omni.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_guardian_angel_ally.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_guardian_angel_wings_buff.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_guardian_angel_halo_buff.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_guardian_angel.vpcf", context ) + PrecacheResource( "particle", "particles/test_particle/dungeon_generic_blast_pre.vpcf", context ) + PrecacheResource( "particle", "particles/test_particle/dungeon_generic_blast.vpcf", context ) + + self.nNumCasts = 0 +end + +-------------------------------------------------------------------------------- + +function temple_guardian_wrath:GetChannelAnimation() + return ACT_DOTA_CHANNEL_ABILITY_4 +end + +-------------------------------------------------------------------------------- + +function temple_guardian_wrath:OnAbilityPhaseStart() + if IsServer() and IsGlobalAscensionCaster( self:GetCaster() ) == false then + self.channel_duration = self:GetSpecialValueFor( "channel_duration" ) + local fImmuneDuration = self.channel_duration + self:GetCastPoint() + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_temple_guardian_immunity", { duration = fImmuneDuration } ) + + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 250, 250, 250 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 176, 224, 230 ) ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function temple_guardian_wrath:OnAbilityPhaseInterrupted() + if IsServer() then + if self.nPreviewFX ~= nil then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end + end +end + +----------------------------------------------------------------------------- + +function temple_guardian_wrath:OnSpellStart() + if IsServer() then + if self.nPreviewFX ~= nil then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end + + self.effect_radius = self:GetSpecialValueFor( "effect_radius" ) + self.interval = self:GetSpecialValueFor( "interval" ) + self.flNextCast = 0.0 + + EmitSoundOn( "TempleGuardian.Wrath.Cast", self:GetCaster() ) + + if IsGlobalAscensionCaster( self:GetCaster() ) == false then + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_omninight_guardian_angel", {} ) + end + end +end + +----------------------------------------------------------------------------- + +function temple_guardian_wrath:OnChannelThink( flInterval ) + if IsServer() then + + self.flNextCast = self.flNextCast + flInterval + if self.flNextCast >= self.interval then + + -- Try not to overlap wrath_thinker locations, but use the last position attempted if we spend too long in the loop + local nMaxAttempts = 14 + local nAttempts = 0 + local vPos = nil + + repeat + vPos = self:GetCaster():GetOrigin() + RandomVector( RandomInt( 50, self.effect_radius ) ) + vPos.z = GetGroundHeight( vPos, self:GetCaster() ) + local hThinkersNearby = Entities:FindAllByClassnameWithin( "npc_dota_thinker", vPos, 600 ) + local hOverlappingWrathThinkers = {} + + for _, hThinker in pairs( hThinkersNearby ) do + if ( hThinker:HasModifier( "modifier_temple_guardian_wrath_thinker" ) ) then + table.insert( hOverlappingWrathThinkers, hThinker ) + end + end + + nAttempts = nAttempts + 1 + if nAttempts >= nMaxAttempts then + break + end + until ( #hOverlappingWrathThinkers == 0 ) + + local kv = + { + extra_radius = 0 + } + if IsGlobalAscensionCaster( self:GetCaster() ) == false then + kv.extra_radius = self.nNumCasts * 40 + end + CreateModifierThinker( self:GetCaster(), self, "modifier_temple_guardian_wrath_thinker", kv, vPos, self:GetCaster():GetTeamNumber(), false ) + self.flNextCast = self.flNextCast - self.interval + end + + end +end + +----------------------------------------------------------------------------- + +function temple_guardian_wrath:OnChannelFinish( bInterrupted ) + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_omninight_guardian_angel" ) + self.nNumCasts = self.nNumCasts + 1 + end +end + +----------------------------------------------------------------------------- + +ascension_temple_guardian_wrath = temple_guardian_wrath diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/tidehunter_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/tidehunter_passive.lua new file mode 100755 index 0000000..dd28311 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/tidehunter_passive.lua @@ -0,0 +1,19 @@ + +tidehunter_passive = class({}) +LinkLuaModifier( "modifier_tidehunter_passive", "modifiers/creatures/modifier_tidehunter_passive", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_tidehunter_damage_counter", "modifiers/creatures/modifier_tidehunter_damage_counter", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function tidehunter_passive:Precache( context ) + PrecacheResource( "particle", "particles/creatures/lifestealer/lifestealer_damage_counter_overhead.vpcf", context ) +end + +----------------------------------------------------------------------------------------- + +function tidehunter_passive:GetIntrinsicModifierName() + return "modifier_tidehunter_passive" +end + +----------------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/tornado_harpy_intrinsic.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/tornado_harpy_intrinsic.lua new file mode 100755 index 0000000..e7aaced --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/tornado_harpy_intrinsic.lua @@ -0,0 +1,12 @@ + +tornado_harpy_intrinsic = class({}) +LinkLuaModifier( "modifier_tornado_harpy_intrinsic", "modifiers/creatures/modifier_tornado_harpy_intrinsic", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_tornado_harpy_surge", "modifiers/creatures/modifier_tornado_harpy_surge", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function tornado_harpy_intrinsic:GetIntrinsicModifierName() + return "modifier_tornado_harpy_intrinsic" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/tusk_mage_freezing_blast.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/tusk_mage_freezing_blast.lua new file mode 100755 index 0000000..10e3695 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/tusk_mage_freezing_blast.lua @@ -0,0 +1,112 @@ + +tusk_mage_freezing_blast = class({}) +LinkLuaModifier( "modifier_tusk_mage_freezing_blast", "modifiers/creatures/modifier_tusk_mage_freezing_blast", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function tusk_mage_freezing_blast:Precache( context ) + + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + PrecacheResource( "particle", "particles/act_2/troll_projectile_gale.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_winter_wyvern/wyvern_arctic_burn_slow.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_wyvern_arctic_burn.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function tusk_mage_freezing_blast:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function tusk_mage_freezing_blast:OnAbilityPhaseStart() + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 50, 50, 50 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 0, 0 ) ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function tusk_mage_freezing_blast:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function tusk_mage_freezing_blast:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + self.projectile_speed = self:GetSpecialValueFor( "projectile_speed" ) + self.attack_radius = self:GetSpecialValueFor( "projectile_radius" ) + self.projectile_distance = self:GetSpecialValueFor( "projectile_distance" ) + self.impact_damage = self:GetSpecialValueFor( "impact_damage" ) + self.movespeed_slow = self:GetSpecialValueFor( "movespeed_slow" ) + self.attackspeed_slow = self:GetSpecialValueFor( "attackspeed_slow" ) + self.slow_duration = self:GetSpecialValueFor( "slow_duration" ) + + local vPos = nil + if self:GetCursorTarget() then + vPos = self:GetCursorTarget():GetOrigin() + else + vPos = self:GetCursorPosition() + end + + local vDirection = vPos - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + local info = { + EffectName = "particles/act_2/troll_projectile_gale.vpcf", + Ability = self, + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = self.attack_radius, + fEndRadius = self.attack_radius, + vVelocity = vDirection * self.projectile_speed, + fDistance = self.projectile_distance, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO, + } + + ProjectileManager:CreateLinearProjectile( info ) + + EmitSoundOn( "SpectralTuskMage.FreezingBlast.Cast", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function tusk_mage_freezing_blast:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + --print( "frostbitten projectile hit" ) + if hTarget ~= nil and ( not hTarget:IsMagicImmune() ) and ( not hTarget:IsInvulnerable() ) then + local damage = + { + victim = hTarget, + attacker = self:GetCaster(), + damage = self.impact_damage, + damage_type = self:GetAbilityDamageType(), + ability = self + } + ApplyDamage( damage ) + + hTarget:AddNewModifier( self:GetCaster(), self, "modifier_tusk_mage_freezing_blast", { duration = self.slow_duration } ) + + EmitSoundOn( "SpectralTuskMage.FreezingBlast.Impact", self:GetCaster() ) + end + + return true + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/undead_tusk_mage_tombstone.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/undead_tusk_mage_tombstone.lua new file mode 100755 index 0000000..1ec48e2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/undead_tusk_mage_tombstone.lua @@ -0,0 +1,74 @@ + +undead_tusk_mage_tombstone = class({}) +LinkLuaModifier( "modifier_undead_tusk_mage_tombstone", "modifiers/creatures/modifier_undead_tusk_mage_tombstone", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function undead_tusk_mage_tombstone:Precache( context ) + + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_undying/undying_tombstone.vpcf", context ) + PrecacheResource( "particle", "particles/act_2/undead_tusk_mage_sigil.vpcf", context ) + PrecacheResource( "particle", "particles/neutral_fx/skeleton_spawn.vpcf", context ) + PrecacheUnitByNameSync( "npc_dota_undead_tusk_tombstone", context, -1 ) + PrecacheUnitByNameSync( "npc_dota_creature_tusk_skeleton", context, -1 ) + +end + +-------------------------------------------------------------------------------- + +function undead_tusk_mage_tombstone:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function undead_tusk_mage_tombstone:OnAbilityPhaseStart() + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 60, 60, 60 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 255, 0, 0 ) ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function undead_tusk_mage_tombstone:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end +end + +-------------------------------------------------------------------------------- + +function undead_tusk_mage_tombstone:OnSpellStart() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + + if self:GetCaster() == nil or self:GetCaster():IsNull() then + return + end + local hTombstone = CreateUnitByName( "npc_dota_undead_tusk_tombstone", self:GetCursorPosition(), true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + if hTombstone ~= nil then + table.insert( self:GetCaster().hTombstones, hTombstone ) + + local flDuration = self:GetSpecialValueFor( "duration" ) + hTombstone:AddNewModifier( self:GetCaster(), self, "modifier_undead_tusk_mage_tombstone", { duration = flDuration } ) + hTombstone:AddNewModifier( self:GetCaster(), self, "modifier_kill", { duration = flDuration } ) + hTombstone:AddNewModifier( self:GetCaster(), nil, "modifier_provides_fow_position", { duration = -1 } ) + + local nTombstoneFX = ParticleManager:CreateParticle( "particles/units/heroes/hero_undying/undying_tombstone.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nTombstoneFX, 0, self:GetCursorPosition() ) + ParticleManager:SetParticleControlEnt( nTombstoneFX, 1, self:GetCaster(), flDuration, "attach_attack1", self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( nTombstoneFX, 2, Vector( flDuration, flDuration, duration ) ) + ParticleManager:ReleaseParticleIndex( nTombstoneFX ) + + EmitSoundOn( "UndeadTuskMage.Tombstone", hTombstone ) + end + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/underlord_channelled_buff.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/underlord_channelled_buff.lua new file mode 100755 index 0000000..8e3f6df --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/underlord_channelled_buff.lua @@ -0,0 +1,56 @@ + +underlord_channelled_buff = class({}) +LinkLuaModifier( "modifier_underlord_channelled_buff", "modifiers/creatures/modifier_underlord_channelled_buff", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function underlord_channelled_buff:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_bloodlust_cast.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_bloodlust_buff.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_pugna/pugna_life_drain.vpcf", context ) +end + +----------------------------------------------------------------------------- + +function underlord_channelled_buff:OnSpellStart() + if IsServer() then + local hTarget = self:GetCursorTarget() + if hTarget ~= nil then + self.hTarget = hTarget + self.hTarget:AddNewModifier( self:GetCaster(), self, "modifier_underlord_channelled_buff", { duration = -1 } ) + + EmitSoundOn( "OgreMagi.Bloodlust.Target", self.hTarget ) + EmitSoundOn( "OgreMagi.Bloodlust.Target.FP", self.hTarget ) + EmitSoundOn( "OgreMagi.Bloodlust.Loop", self:GetCaster() ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_ogre_magi/ogre_magi_bloodlust_cast.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_attack1", self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 2, self.hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", self.hTarget:GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 3, self.hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, self.hTarget:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end +end + +----------------------------------------------------------------------------- + +function underlord_channelled_buff:OnChannelFinish( bInterrupted ) + if IsServer() then + if bInterrupted then + self:StartCooldown( self:GetSpecialValueFor( "interrupted_cooldown" ) ) + end + + if self.hTarget ~= nil then + local hMyBuff = self.hTarget:FindModifierByNameAndCaster( "modifier_underlord_channelled_buff", self:GetCaster() ) + if hMyBuff then + hMyBuff:Destroy() + end + StopSoundOn( "OgreMagi.Bloodlust.Loop", self:GetCaster() ) + self.hTarget = nil + end + end +end + +----------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/upheaval_urn_incoming_damage_rules.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/upheaval_urn_incoming_damage_rules.lua new file mode 100755 index 0000000..d65f521 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/upheaval_urn_incoming_damage_rules.lua @@ -0,0 +1,11 @@ + +upheaval_urn_incoming_damage_rules = class({}) +LinkLuaModifier( "modifier_upheaval_urn_incoming_damage_rules", "modifiers/creatures/modifier_upheaval_urn_incoming_damage_rules", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function upheaval_urn_incoming_damage_rules:GetIntrinsicModifierName() + return "modifier_upheaval_urn_incoming_damage_rules" +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/void_spirit_boss_activate_earth_spirits.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/void_spirit_boss_activate_earth_spirits.lua new file mode 100755 index 0000000..6eb256e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/void_spirit_boss_activate_earth_spirits.lua @@ -0,0 +1,114 @@ + +require( "utility_functions" ) + +void_spirit_boss_activate_earth_spirits = class({}) +LinkLuaModifier( "modifier_void_spirit_boss_immunity", "modifiers/creatures/modifier_void_spirit_boss_immunity", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function void_spirit_boss_activate_earth_spirits:Precache( context ) + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_guardian_angel_omni.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_guardian_angel_ally.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_guardian_angel_wings_buff.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_guardian_angel_halo_buff.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_guardian_angel.vpcf", context ) + + self.nNumCasts = 0 +end + +-------------------------------------------------------------------------------- + +function void_spirit_boss_activate_earth_spirits:GetChannelAnimation() + return ACT_DOTA_CHANNEL_ABILITY_4 +end + +-------------------------------------------------------------------------------- + +function void_spirit_boss_activate_earth_spirits:OnAbilityPhaseStart() + if IsServer() and IsGlobalAscensionCaster( self:GetCaster() ) == false then + self.channel_duration = self:GetSpecialValueFor( "channel_duration" ) + local fImmuneDuration = self.channel_duration + self:GetCastPoint() + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_void_spirit_boss_immunity", { duration = fImmuneDuration } ) + + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 250, 250, 250 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 176, 224, 230 ) ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function void_spirit_boss_activate_earth_spirits:OnAbilityPhaseInterrupted() + if IsServer() then + if self.nPreviewFX ~= nil then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end + end +end + +----------------------------------------------------------------------------- + +function void_spirit_boss_activate_earth_spirits:OnSpellStart() + if IsServer() then + --printf( "void_spirit_boss_activate_earth_spirits:OnSpellStart" ) + + if self.nPreviewFX ~= nil then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end + + self.flNextCast = 0.0 + + --EmitSoundOn( "TempleGuardian.Wrath.Cast", self:GetCaster() ) + + if IsGlobalAscensionCaster( self:GetCaster() ) == false then + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_omninight_guardian_angel", {} ) + end + + --[[ + local nFlags = DOTA_UNIT_TARGET_FLAG_INVULNERABLE + DOTA_UNIT_TARGET_FLAG_OUT_OF_WORLD + self.hEarthSpiritStatues = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetOrigin(), nil, 4000, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, nFlags, FIND_CLOSEST, false ) + --printf( "self.hEarthSpiritStatues:" ) + --PrintTable( self.hEarthSpiritStatues, " -- " ) + printf( "#self.hEarthSpiritStatues == %d", #self.hEarthSpiritStatues ) + ]] + local hEncounter = GameRules.Aghanim:GetCurrentRoom():GetEncounter() + local hEarthSpirits = hEncounter.hEarthSpirits + local kv = { duration = -1 } + for _, hEarthSpirit in pairs( hEarthSpirits ) do + if hEarthSpirit ~= nil and hEarthSpirit:IsNull() == false then + --printf( "OnSpellStart - found an earth spirit, removing stoneform" ) + hEarthSpirit:RemoveModifierByName( "modifier_earth_spirit_statue_stoneform" ) + end + end + end +end + +----------------------------------------------------------------------------- + +function void_spirit_boss_activate_earth_spirits:OnChannelFinish( bInterrupted ) + if IsServer() then + --printf( "void_spirit_boss_activate_earth_spirits:OnChannelFinish" ) + + self:GetCaster():RemoveModifierByName( "modifier_omninight_guardian_angel" ) + + local hEncounter = GameRules.Aghanim:GetCurrentRoom():GetEncounter() + local hEarthSpirits = hEncounter.hEarthSpirits + local kv = { duration = -1 } + for _, hEarthSpirit in pairs ( hEarthSpirits ) do + if hEarthSpirit ~= nil and hEarthSpirit:IsNull() == false and hEarthSpirit:IsAlive() then + --printf( "OnChannelFinish - found an earth spirit, adding stoneform" ) + hEarthSpirit:AddNewModifier( hEarthSpirit, hEarthSpirit, "modifier_earth_spirit_statue_stoneform", kv ) + end + end + + self.nNumCasts = self.nNumCasts + 1 + end +end + +----------------------------------------------------------------------------- + +--ascension_void_spirit_boss_activate_earth_spirits = void_spirit_boss_activate_earth_spirits diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/wandering_ogre_seal_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/wandering_ogre_seal_passive.lua new file mode 100755 index 0000000..6f7ee9c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/wandering_ogre_seal_passive.lua @@ -0,0 +1,11 @@ + +wandering_ogre_seal_passive = class({}) +LinkLuaModifier( "modifier_wandering_ogre_seal", "modifiers/creatures/modifier_wandering_ogre_seal", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function wandering_ogre_seal_passive:GetIntrinsicModifierName() + return "modifier_wandering_ogre_seal" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/creatures/warlock_hp_aura.lua b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/warlock_hp_aura.lua new file mode 100755 index 0000000..80e2c76 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/creatures/warlock_hp_aura.lua @@ -0,0 +1,12 @@ + +warlock_hp_aura = class({}) +LinkLuaModifier( "modifier_warlock_hp_aura", "modifiers/creatures/modifier_warlock_hp_aura", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_warlock_hp_aura_effect", "modifiers/creatures/modifier_warlock_hp_aura_effect", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function warlock_hp_aura:GetIntrinsicModifierName() + return "modifier_warlock_hp_aura" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/heroes/monkey_king_jingu_mastery_aghsfort.lua b/aghanim_singleplayer/scripts/vscripts/abilities/heroes/monkey_king_jingu_mastery_aghsfort.lua new file mode 100755 index 0000000..c1696b1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/heroes/monkey_king_jingu_mastery_aghsfort.lua @@ -0,0 +1,12 @@ + +monkey_king_jingu_mastery_aghsfort = class({}) + +-------------------------------------------------------------------------------- + +function monkey_king_jingu_mastery_aghsfort:OnSpellStart() + if IsServer() then + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_monkey_king_quadruple_tap_bonuses", { duration = self:GetSpecialValueFor( "max_duration" ) } ) + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/phased.lua b/aghanim_singleplayer/scripts/vscripts/abilities/phased.lua new file mode 100755 index 0000000..9df8390 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/phased.lua @@ -0,0 +1,10 @@ + +phased = class({}) + +-------------------------------------------------------------------------------- + +function phased:GetIntrinsicModifierName() + return "modifier_phased" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/provides_fow_position.lua b/aghanim_singleplayer/scripts/vscripts/abilities/provides_fow_position.lua new file mode 100755 index 0000000..4158012 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/provides_fow_position.lua @@ -0,0 +1,10 @@ + +provides_fow_position = class({}) + +-------------------------------------------------------------------------------- + +function provides_fow_position:GetIntrinsicModifierName() + return "modifier_provides_fow_position" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/sled_penguin_passive.lua b/aghanim_singleplayer/scripts/vscripts/abilities/sled_penguin_passive.lua new file mode 100755 index 0000000..3c45f0d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/sled_penguin_passive.lua @@ -0,0 +1,22 @@ + +sled_penguin_passive = class({}) + +LinkLuaModifier( "modifier_sled_penguin_passive", "modifiers/modifier_sled_penguin_passive", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_sled_penguin_movement", "modifiers/modifier_sled_penguin_movement", LUA_MODIFIER_MOTION_HORIZONTAL ) +LinkLuaModifier( "modifier_sled_penguin_crash", "modifiers/modifier_sled_penguin_crash", LUA_MODIFIER_MOTION_HORIZONTAL ) +LinkLuaModifier( "modifier_sled_penguin_impairment", "modifiers/modifier_sled_penguin_impairment", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function sled_penguin_passive:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_brewmaster/brewmaster_drunken_haze_debuff.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_brewmaster_drunken_haze.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function sled_penguin_passive:GetIntrinsicModifierName() + return "modifier_sled_penguin_passive" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/traps/arrow.lua b/aghanim_singleplayer/scripts/vscripts/abilities/traps/arrow.lua new file mode 100755 index 0000000..91e0559 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/traps/arrow.lua @@ -0,0 +1,110 @@ + +--[[ abilities/traps/arrow.lua ]] + +arrow = class({}) + +---------------------------------------------------------------------------------------- + +function arrow:Precache( context ) + + PrecacheResource( "particle", "particles/traps/temple_trap_arrow.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function arrow:OnSpellStart() + self.start_radius = self:GetSpecialValueFor( "start_radius" ) + self.end_radius = self:GetSpecialValueFor( "end_radius" ) + self.speed = self:GetLevelSpecialValueFor( "speed", GameRules.Aghanim:GetAscensionLevel() ) + self.max_hp_pct_damage = self:GetLevelSpecialValueFor( "max_hp_pct_damage", GameRules.Aghanim:GetAscensionLevel() ) + --printf( "ascension level: %d; speed: %d; percent damage: %d", GameRules.Aghanim:GetAscensionLevel(), self.speed, self.max_hp_pct_damage ) + + local vPos = nil + if self:GetCursorTarget() then + vPos = self:GetCursorTarget():GetOrigin() + else + vPos = self:GetCursorPosition() + end + + local fRangeToTarget = ( self:GetCaster():GetOrigin() - vPos ):Length2D() + + local vDirection = vPos - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + self.speed = self.speed * ( ( fRangeToTarget ) / ( fRangeToTarget -self.start_radius ) ) + + local info = { + EffectName = "particles/traps/temple_trap_arrow.vpcf", + Ability = self, + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = self.start_radius, + fEndRadius = self.end_radius, + vVelocity = vDirection * self.speed, + fDistance = fRangeToTarget, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + } + + ProjectileManager:CreateLinearProjectile( info ) + + EmitSoundOn( "AghanimsFortress.FireTrap", self:GetCaster() ) +end + +-------------------------------------------------------------------------------- + +function arrow:OnProjectileHit( hTarget, vLocation ) + if hTarget ~= nil and ( not hTarget:IsMagicImmune() ) and ( not hTarget:IsInvulnerable() ) then + if hTarget:HasModifier( "modifier_treasure_chest" ) then + return false + end + + --[[ + local modifierKnockback = + { + center_x = vLocation.x, + center_y = vLocation.y, + center_z = vLocation.z, + duration = 0.3, + knockback_duration = 0.3, + knockback_distance = 450, + knockback_height = 50, + } + hTarget:AddNewModifier( hTarget, nil, "modifier_knockback", modifierKnockback ) + ]] + + local fMaxHealth = hTarget:GetMaxHealth() + local fDamage = math.ceil( fMaxHealth * ( self.max_hp_pct_damage / 100.0 ) ) + --printf( "arrow:OnProjectileHit - applying %.2f damage to target with %.2f max health", fDamage, fMaxHealth ) + + local damageSource = self:GetCaster() + local damage = { + victim = hTarget, + attacker = damageSource, + damage = fDamage, + damage_type = DAMAGE_TYPE_PURE, + ability = self + } + ApplyDamage( damage ) + + if not ( hTarget:IsNull() ) and hTarget ~= nil then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", hTarget:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, hTarget:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, -self:GetCaster():GetForwardVector() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 10, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Dungeon.BloodSplatterImpact", hTarget ) + end + + return true + end + + return false +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/traps/blast_wave.lua b/aghanim_singleplayer/scripts/vscripts/abilities/traps/blast_wave.lua new file mode 100755 index 0000000..0e73981 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/traps/blast_wave.lua @@ -0,0 +1,81 @@ + +breathe_fire = class({}) + +---------------------------------------------------------------------------------------- + +function breathe_fire:Precache( context ) + + PrecacheResource( "particle", "particles/fire_trap/trap_breathe_fire.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function breathe_fire:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function breathe_fire:OnSpellStart() + self.start_radius = self:GetSpecialValueFor( "start_radius" ) + self.end_radius = self:GetSpecialValueFor( "end_radius" ) + self.speed = self:GetSpecialValueFor( "speed" ) + self.fire_damage = self:GetSpecialValueFor( "fire_damage" ) + --self.range = self:GetSpecialValueFor( "range" ) + + local vPos = nil + if self:GetCursorTarget() then + vPos = self:GetCursorTarget():GetOrigin() + else + vPos = self:GetCursorPosition() + end + + local fRangeToTarget = ( self:GetCaster():GetOrigin() - vPos ):Length2D() + + local vDirection = vPos - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + self.speed = self.speed * ( ( fRangeToTarget ) / ( fRangeToTarget -self.start_radius ) ) + + local info = { + EffectName = "particles/fire_trap/trap_breathe_fire.vpcf", + Ability = self, + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = self.start_radius, + fEndRadius = self.end_radius, + vVelocity = vDirection * self.speed, + fDistance = fRangeToTarget, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + } + + ProjectileManager:CreateLinearProjectile( info ) + + EmitSoundOn( "AghanimsFortress.FireTrap", self:GetCaster() ) +end + +-------------------------------------------------------------------------------- + +function breathe_fire:OnProjectileHit( hTarget, vLocation ) + local fireDamage = self.fire_damage + if hTarget ~= nil and ( not hTarget:IsMagicImmune() ) and ( not hTarget:IsInvulnerable() ) then + + local damageSource = self:GetCaster() + local damage = { + victim = hTarget, + attacker = damageSource, + damage = fireDamage, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self + } + + ApplyDamage( damage ) + end + + return false +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/traps/breathe_fire.lua b/aghanim_singleplayer/scripts/vscripts/abilities/traps/breathe_fire.lua new file mode 100755 index 0000000..188281a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/traps/breathe_fire.lua @@ -0,0 +1,83 @@ + +breathe_fire = class({}) + +---------------------------------------------------------------------------------------- + +function breathe_fire:Precache( context ) + + PrecacheResource( "particle", "particles/fire_trap/trap_breathe_fire.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function breathe_fire:ProcsMagicStick() + return false +end + +-------------------------------------------------------------------------------- + +function breathe_fire:OnSpellStart() + self.start_radius = self:GetSpecialValueFor( "start_radius" ) + self.end_radius = self:GetSpecialValueFor( "end_radius" ) + self.speed = self:GetSpecialValueFor( "speed" ) + self.max_hp_pct_damage = self:GetLevelSpecialValueFor( "max_hp_pct_damage", GameRules.Aghanim:GetAscensionLevel() ) + --printf( "ascension level: %d; percent damage: %d", GameRules.Aghanim:GetAscensionLevel(), self.max_hp_pct_damage ) + + local vPos = nil + if self:GetCursorTarget() then + vPos = self:GetCursorTarget():GetOrigin() + else + vPos = self:GetCursorPosition() + end + + local fRangeToTarget = ( self:GetCaster():GetOrigin() - vPos ):Length2D() + + local vDirection = vPos - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + self.speed = self.speed * ( ( fRangeToTarget ) / ( fRangeToTarget -self.start_radius ) ) + + local info = { + EffectName = "particles/fire_trap/trap_breathe_fire.vpcf", + Ability = self, + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = self.start_radius, + fEndRadius = self.end_radius, + vVelocity = vDirection * self.speed, + fDistance = fRangeToTarget, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + } + + ProjectileManager:CreateLinearProjectile( info ) + + EmitSoundOn( "AghanimsFortress.FireTrap", self:GetCaster() ) +end + +-------------------------------------------------------------------------------- + +function breathe_fire:OnProjectileHit( hTarget, vLocation ) + if hTarget ~= nil and ( not hTarget:IsMagicImmune() ) and ( not hTarget:IsInvulnerable() ) then + local fMaxHealth = hTarget:GetMaxHealth() + local fDamage = math.ceil( fMaxHealth * ( self.max_hp_pct_damage / 100.0 ) ) + --printf( "breathe_fire:OnProjectileHit - applying %.2f damage to target with %.2f max health", fDamage, fMaxHealth ) + + local damageSource = self:GetCaster() + local damage = { + victim = hTarget, + attacker = damageSource, + damage = fDamage, + damage_type = self:GetAbilityDamageType(), + ability = self + } + + ApplyDamage( damage ) + end + + return false +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/traps/pendulum_swing.lua b/aghanim_singleplayer/scripts/vscripts/abilities/traps/pendulum_swing.lua new file mode 100755 index 0000000..966dbf5 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/traps/pendulum_swing.lua @@ -0,0 +1,120 @@ + +pendulum_swing = class({}) + +-------------------------------------------------------------------------------- + +function pendulum_swing:Precache( context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) + PrecacheResource( "particle", "particles/econ/courier/courier_mechjaw/mechjaw_death_sparks.vpcf", context ) + + self.HitEntsThisSwing = {} + self.bDamagePathOutgoing = false + self.bDamagePathReturning = false +end + +-------------------------------------------------------------------------------- + +function pendulum_swing:GetChannelAnimation() + return ACT_DOTA_CHANNEL_ABILITY_1 +end + +-------------------------------------------------------------------------------- + +function pendulum_swing:OnChannelThink( flInterval ) + if IsServer() then + if self.max_hp_pct_damage == nil then + self.max_hp_pct_damage = self:GetLevelSpecialValueFor( "max_hp_pct_damage", GameRules.Aghanim:GetAscensionLevel() ) + --printf( "ascension level: %d; percent damage: %d", GameRules.Aghanim:GetAscensionLevel(), self.max_hp_pct_damage ) + self.radius = self:GetSpecialValueFor( "radius" ) + self.attachHitloc = self:GetCaster():ScriptLookupAttachment( "attach_hitloc" ) + self.attachLeftBlade = self:GetCaster():ScriptLookupAttachment( "attach_leftblade" ) + self.attachRightBlade = self:GetCaster():ScriptLookupAttachment( "attach_rightblade" ) + self.attachFrontBlade = self:GetCaster():ScriptLookupAttachment( "attach_frontblade" ) + self.attachBackBlade = self:GetCaster():ScriptLookupAttachment( "attach_backblade" ) + end + + -- We're checking which part of the pendulum_swing_loop animation we're in. + local flCycle = self:GetCaster():GetCycle() + local bDamagePathOutgoing = ( flCycle > 0.19 and flCycle < 0.26 ) + local bDamagePathReturning = ( flCycle > 0.69 and flCycle < 0.76 ) + if self.bDamagePathOutgoing ~= bDamagePathOutgoing then + self.bDamagePathOutgoing = bDamagePathOutgoing + self.HitEntsThisSwing = {} + end + if self.bDamagePathReturning ~= bDamagePathReturning then + self.bDamagePathReturning = bDamagePathReturning + self.HitEntsThisSwing = {} + end + + if bDamagePathOutgoing or bDamagePathReturning then + if ( flCycle > 0.15 and flCycle < 0.16 ) or ( flCycle > 0.70 and flCycle < 0.71 ) then + -- Ugly: we're relying on the speed of the pendulum and the length of our channelthink interval in order to not play this sound more than once per outgoing or returning swing + EmitSoundOn( "Pendulum.Swing", self:GetCaster() ) + end + + local Locations = { + self:GetCaster():GetAttachmentOrigin( self.attachHitloc ), + self:GetCaster():GetAttachmentOrigin( self.attachLeftBlade ), + self:GetCaster():GetAttachmentOrigin( self.attachRightBlade ), + self:GetCaster():GetAttachmentOrigin( self.attachFrontBlade ), + self:GetCaster():GetAttachmentOrigin( self.attachBackBlade ), + } + + + + for i = 1, #Locations do + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), Locations[i], self:GetCaster(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + --DebugDrawCircle( Locations[i], Vector( 0, 255, 0 ), 255, self.radius, false, 0.1 ) + for _,enemy in pairs( enemies ) do + local bAlreadyHit = false + for _,HitEnt in pairs ( self.HitEntsThisSwing ) do + if HitEnt == enemy then + bAlreadyHit = true + break + end + end + + if not ( enemy:IsNull() ) and enemy ~= nil and enemy:IsInvulnerable() == false and not bAlreadyHit then + local fMaxHealth = enemy:GetMaxHealth() + local fDamage = math.ceil( fMaxHealth * ( self.max_hp_pct_damage / 100.0 ) ) + --printf( "pendulum_swing:OnChannelThink - applying %.2f damage to target with %.2f max health", fDamage, fMaxHealth ) + + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = fDamage, + damage_type = DAMAGE_TYPE_PURE, + ability = self, + } + + table.insert( self.HitEntsThisSwing, enemy ) + + ApplyDamage( damageInfo ) + if not ( enemy:IsNull() ) and enemy ~= nil then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, enemy:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, -self:GetCaster():GetForwardVector() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 10, enemy, PATTACH_ABSORIGIN_FOLLOW, nil, enemy:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Dungeon.BloodSplatterImpact", enemy ) + end + end + end + + + end + + local nFXIndex2 = ParticleManager:CreateParticle( "particles/econ/courier/courier_mechjaw/mechjaw_death_sparks.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex2, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_leftblade", self:GetCaster():GetOrigin(), true ) + + local nFXIndex3 = ParticleManager:CreateParticle( "particles/econ/courier/courier_mechjaw/mechjaw_death_sparks.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex3, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_rightblade", self:GetCaster():GetOrigin(), true ) + end + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/traps/spike_trap.lua b/aghanim_singleplayer/scripts/vscripts/abilities/traps/spike_trap.lua new file mode 100755 index 0000000..c33158b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/traps/spike_trap.lua @@ -0,0 +1,37 @@ +spike_trap = class({}) + +LinkLuaModifier( "modifier_spike_trap_lua", "modifiers/modifier_spike_trap_lua", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_spike_trap_thinker_lua", "modifiers/modifier_spike_trap_thinker_lua", LUA_MODIFIER_MOTION_NONE ) + + +function spike_trap:Precache( context ) + + PrecacheResource( "particle", "particles/traps/spikes/spiketrap_anticipate.vpcf", context ) + PrecacheResource( "particle", "particles/traps/spikes/spiketrap_anticipate_base.vpcf", context ) + PrecacheResource( "particle", "particles/traps/spikes/spiketrap_pull.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_axe/axe_culling_blade.vpcf", context ) +end + + +-------------------------------------------------------------------------------- + +function spike_trap:GetAOERadius() + return self:GetSpecialValueFor( "light_strike_array_aoe" ) +end + +-------------------------------------------------------------------------------- + +function spike_trap:OnSpellStart() + self.light_strike_array_aoe = self:GetSpecialValueFor( "light_strike_array_aoe" ) + self.light_strike_array_delay_time = self:GetSpecialValueFor( "light_strike_array_delay_time" ) + + local kv = {} + CreateModifierThinker( self:GetCaster(), self, "modifier_spike_trap_thinker_lua", kv, self:GetCursorPosition(), self:GetCaster():GetTeamNumber(), false ) +end + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- + + + + diff --git a/aghanim_singleplayer/scripts/vscripts/abilities/treasure_chest.lua b/aghanim_singleplayer/scripts/vscripts/abilities/treasure_chest.lua new file mode 100755 index 0000000..080c718 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/abilities/treasure_chest.lua @@ -0,0 +1,11 @@ + +treasure_chest = class({}) +LinkLuaModifier( "modifier_treasure_chest", "modifiers/modifier_treasure_chest", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function treasure_chest:GetIntrinsicModifierName() + return "modifier_treasure_chest" +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/addon_game_mode.lua b/aghanim_singleplayer/scripts/vscripts/addon_game_mode.lua new file mode 100755 index 0000000..d4ed356 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/addon_game_mode.lua @@ -0,0 +1,2298 @@ + +if CAghanim == nil then + CAghanim = class({}) + _G.CAghanim = CAghanim +end + +------------------------------------------------------------------------------------------------------------------------------------------------------ +-- Required .lua files, which help organize functions contained in our addon. +-- Make sure to call these beneath the mode's class creation. +------------------------------------------------------------------------------------------------------------------------------------------------------ +require( "constants" ) -- require constants first +require( "aghanim_ability_upgrade_constants" ) -- lists of ability upgrades per hero +require( "aghanim_ability_upgrade_interface" ) -- upgrading abilities can go through the interface +require( "utility_functions" ) -- require utility_functions early (other required files may use its functions) +require( "aghanim_utility_functions" ) +require( "precache" ) +require( "blessings" ) +require( "events" ) +require( "filters" ) +require( "room_tables" ) +require( "ascension_levels" ) +require( "triggers" ) +require( "map_room" ) +require( "rewards" ) +require( "containers/breakable_containers_data" ) +require( "containers/breakable_container_surprises" ) +require( "containers/treasure_chest_data" ) +require( "containers/treasure_chest_surprises" ) +require( "containers/explosive_barrel_data" ) +--require( "map_generation" ) + +-------------------------------------------------------------------------------- + +function Precache( context ) + print( "Precaching Aghanim assets..." ) + + for _,Item in pairs( g_ItemPrecache ) do + PrecacheItemByNameSync( Item, context ) + end + + for Item,Price in pairs( PRICED_ITEM_REWARD_LIST ) do + PrecacheItemByNameSync( Item, context ) + end + + for i=1,#TREASURE_REWARDS do + for j=1,#TREASURE_REWARDS[i] do + PrecacheItemByNameSync( TREASURE_REWARDS[i][j], context ) + end + end + + for _, breakableData in ipairs( BreakablesData ) do + for i=1,#breakableData.CommonItems do + PrecacheItemByNameSync( breakableData.CommonItems[i], context ) + end + + for i=1,#breakableData.MonsterUnits do + PrecacheUnitByNameSync( breakableData.MonsterUnits[i], context, -1 ) + end + + for i=1,#breakableData.RareItems do + PrecacheItemByNameSync( breakableData.RareItems[i], context ) + end + end + + for _,Unit in pairs( g_UnitPrecache ) do + PrecacheUnitByNameSync( Unit, context, -1 ) + end + + for AbilityName,Ability in pairs( ASCENSION_ABILITIES ) do + -- Yes, it's not an item, but this works anyways since abilities are similar to items + PrecacheItemByNameSync( AbilityName, context ) + end + + for _,Model in pairs( g_ModelPrecache ) do + PrecacheResource( "model", Model, context ) + end + + for _,Particle in pairs( g_ParticlePrecache ) do + PrecacheResource( "particle", Particle, context ) + end + + for _,Sound in pairs( g_SoundPrecache ) do + PrecacheResource( "soundfile", Sound, context ) + end +end + +-------------------------------------------------------------------------------- + +-- Create the game mode when we activate +function Activate() + GameRules.Aghanim = CAghanim() + GameRules.Aghanim:InitGameMode() + LinkModifiers() +end + +-------------------------------------------------------------------------------- + +function SpawnGroupPrecache( hSpawnGroup, context ) + + local room = GameRules.Aghanim:FindRoomBySpawnGroupHandle( hSpawnGroup ) + if room ~= nil then + --print( "Precaching room " .. room:GetName() .. "..." ) + room:GetEncounter():Precache( context ) + end + +end + +-------------------------------------------------------------------------------- + +function LinkModifiers() +-- This is the modifier that pukeeps morty in the level + LinkLuaModifier( "modifier_bonus_room_start", "modifiers/modifier_bonus_room_start", LUA_MODIFIER_MOTION_NONE ) + LinkLuaModifier( "modifier_morty_leash", "modifiers/modifier_morty_leash", LUA_MODIFIER_MOTION_NONE ) + LinkLuaModifier( "modifier_provides_fow_position", "modifiers/modifier_provides_fow_position", LUA_MODIFIER_MOTION_NONE ) + LinkLuaModifier( "modifier_sand_king_boss_caustic_finale", "modifiers/creatures/modifier_sand_king_boss_caustic_finale", LUA_MODIFIER_MOTION_NONE ) + LinkLuaModifier( "modifier_breakable_container", "modifiers/modifier_breakable_container", LUA_MODIFIER_MOTION_NONE ) + LinkLuaModifier( "modifier_boss_intro", "modifiers/modifier_boss_intro", LUA_MODIFIER_MOTION_NONE ) + LinkLuaModifier( "modifier_attack_speed_unslowable", "modifiers/modifier_attack_speed_unslowable", LUA_MODIFIER_MOTION_NONE ) + LinkLuaModifier( "modifier_move_speed_unslowable", "modifiers/modifier_move_speed_unslowable", LUA_MODIFIER_MOTION_NONE ) +end + + +-------------------------------------------------------------------------------- + +function GetExitOptionData( nOptionNumber ) + return GameRules.Aghanim:GetExitOptionData( nOptionNumber ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:InitGameMode() + print( "Aghanim addon is loaded." ) + + self.CurrentRoom = nil + self.bStreamedStartingRoomExits = false + self.bIsInTournamentMode = false + self.nSeed = 0 + self.bFastTestEncounter = false + + if GameRules:GetGameModeEntity():GetEventWindowStartTime() > 0 then + self.nSeed = GameRules:GetGameModeEntity():GetEventGameSeed() + if self.nSeed > 0 then + self.bIsInTournamentMode = true + end + end + + if self.nSeed == 0 then + self.nSeed = math.floor( GetSystemTimeMS() ) + else + print( "Using fixed seed from the GC: " .. self.nSeed ) + end + + self.nAscensionLevel = 0 + self.bHasSetAscensionLevel = false + self.bWonGame = false + self.bHasAnyNewPlayers = false + self.bHasSetNewPlayers = false + self.bHasInitializedSpectatorCameras = false + self.AghanimSummons = {} + self.hMapRandomStream = CreateUniformRandomStream( self.nSeed ) + self.hPlayerRandomStreams = {} + + math.randomseed( self.nSeed ) + + GameRules:GetGameModeEntity():SetAnnouncerDisabled( true ) + GameRules:SetCustomGameSetupTimeout( 0 ) + GameRules:SetCustomGameSetupAutoLaunchDelay( 0 ) + GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 1 ) + GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 0 ) + GameRules:SetTimeOfDay( 0.25 ) + GameRules:SetStrategyTime( 0.0 ) + GameRules:SetShowcaseTime( 0.0 ) + GameRules:SetPreGameTime( 5.0 ) + GameRules:SetPostGameTime( 45.0 ) + GameRules:SetHeroSelectionTime( 90 ) + GameRules:SetTreeRegrowTime( 60.0 ) + GameRules:SetStartingGold( AGHANIM_STARTING_GOLD ) + GameRules:SetGoldTickTime( 999999.0 ) + GameRules:SetGoldPerTick( 0 ) + GameRules:SetUseUniversalShopMode( true ) + GameRules:GetGameModeEntity():SetRemoveIllusionsOnDeath( true ) + GameRules:GetGameModeEntity():SetDaynightCycleDisabled( true ) + GameRules:GetGameModeEntity():SetStashPurchasingDisabled( true ) + GameRules:GetGameModeEntity():SetRandomHeroBonusItemGrantDisabled( true ) + GameRules:GetGameModeEntity():SetDefaultStickyItem( "item_boots" ) + GameRules:GetGameModeEntity():SetForceRightClickAttackDisabled( true ) + GameRules:GetGameModeEntity():DisableClumpingBehaviorByDefault( true ) + GameRules:GetGameModeEntity():SetMinimumAttackSpeed( 0.4 ) + GameRules:GetGameModeEntity():SetNeutralStashTeamViewOnlyEnabled( true ) + GameRules:GetGameModeEntity():SetNeutralItemHideUndiscoveredEnabled( true ) + + --Temp for tesitng new lives rules + if AGHANIM_TIMED_RESPAWN_MODE == true then + GameRules:GetGameModeEntity():SetBuybackEnabled( false ) + GameRules:GetGameModeEntity():SetFixedRespawnTime( AGHANIM_TIMED_RESPAWN_TIME ) + else + GameRules:GetGameModeEntity():SetCustomBuybackCooldownEnabled( true ) + GameRules:GetGameModeEntity():SetCustomBuybackCostEnabled( true ) + GameRules:SetHeroRespawnEnabled( false ) + end + + GameRules:GetGameModeEntity():SetLoseGoldOnDeath( false ) + GameRules:GetGameModeEntity():SetFriendlyBuildingMoveToEnabled( true ) + GameRules:GetGameModeEntity():SetHudCombatEventsDisabled( true ) + GameRules:GetGameModeEntity():SetWeatherEffectsDisabled( true ) + GameRules:GetGameModeEntity():SetCameraSmoothCountOverride( 2 ) + GameRules:GetGameModeEntity():SetSelectionGoldPenaltyEnabled( false ) + GameRules:GetGameModeEntity():SetUnseenFogOfWarEnabled( true ) + GameRules:GetGameModeEntity():SetTPScrollSlotItemOverride( "item_bottle" ) + + GameRules:GetGameModeEntity():SetSendToStashEnabled( false ) + self.hFowBlockerRegion = GameRules:GetGameModeEntity():AllocateFowBlockerRegion( -16384, -16384, 16384, 16384, 128 ) + + GameRules:SetCustomGameAllowHeroPickMusic( false ) + GameRules:SetCustomGameAllowBattleMusic( false ) + GameRules:SetCustomGameAllowMusicAtGameStart( true ) + + -- Make the camera not z clip + GameRules:GetGameModeEntity():SetCameraZRange( 11, 3800 ) + + -- Event Registration: Functions are found in dungeon_events.lua + ListenToGameEvent( "game_rules_state_change", Dynamic_Wrap( CAghanim, 'OnGameRulesStateChange' ), self ) + ListenToGameEvent( "player_connect_full", Dynamic_Wrap( CAghanim, 'OnPlayerConnected' ), self ) + ListenToGameEvent( "dota_player_reconnected", Dynamic_Wrap( CAghanim, 'OnPlayerReconnected' ), self ) + ListenToGameEvent( "hero_selected", Dynamic_Wrap( CAghanim, 'OnHeroSelected' ), self ) + ListenToGameEvent( "npc_spawned", Dynamic_Wrap( CAghanim, "OnNPCSpawned" ), self ) + ListenToGameEvent( "entity_killed", Dynamic_Wrap( CAghanim, 'OnEntityKilled' ), self ) + ListenToGameEvent( "dota_player_gained_level", Dynamic_Wrap( CAghanim, "OnPlayerGainedLevel" ), self ) + ListenToGameEvent( "dota_item_picked_up", Dynamic_Wrap( CAghanim, "OnItemPickedUp" ), self ) + ListenToGameEvent( "dota_holdout_revive_complete", Dynamic_Wrap( CAghanim, "OnPlayerRevived" ), self ) + ListenToGameEvent( "dota_buyback", Dynamic_Wrap( CAghanim, "OnPlayerBuyback" ), self ) + ListenToGameEvent( "dota_item_spawned", Dynamic_Wrap( CAghanim, "OnItemSpawned" ), self ) + ListenToGameEvent( "dota_item_purchased", Dynamic_Wrap( CAghanim, "OnItemPurchased" ), self ) + --ListenToGameEvent( "dota_non_player_used_ability", Dynamic_Wrap( CAghanim, "OnNonPlayerUsedAbility" ), self ) + ListenToGameEvent( "trigger_start_touch", Dynamic_Wrap( CAghanim, "OnTriggerStartTouch" ), self ) + ListenToGameEvent( "trigger_end_touch", Dynamic_Wrap( CAghanim, "OnTriggerEndTouch" ), self ) + ListenToGameEvent( "aghsfort_path_selected", Dynamic_Wrap( CAghanim, "OnNextRoomSelected" ), self ) + ListenToGameEvent( "dota_hero_entered_shop", Dynamic_Wrap( CAghanim, "OnHeroEnteredShop" ), self ) + ListenToGameEvent( "dota_player_team_changed", Dynamic_Wrap( CAghanim, "OnPlayerTeamChanged" ), self ) + ListenToGameEvent( "player_chat", Dynamic_Wrap(CAghanim, "PlayerChat") , self) + + -- Filter Registration: Functions are found in filters.lua + --GameRules:GetGameModeEntity():SetHealingFilter( Dynamic_Wrap( CAghanim, "HealingFilter" ), self ) + --GameRules:GetGameModeEntity():SetDamageFilter( Dynamic_Wrap( CAghanim, "DamageFilter" ), self ) + --GameRules:GetGameModeEntity():SetItemAddedToInventoryFilter( Dynamic_Wrap( CAghanim, "ItemAddedToInventoryFilter" ), self ) + GameRules:GetGameModeEntity():SetModifierGainedFilter( Dynamic_Wrap( CAghanim, "ModifierGainedFilter" ), self ) + + self.nCrystalsLeft = 5 + self.PlayerCrystals = {} + self.PlayerCurrentRooms = {} + for nPlayerID = 0, AGHANIM_PLAYERS-1 do + PlayerResource:SetCustomTeamAssignment( nPlayerID, DOTA_TEAM_GOODGUYS ) + table.insert( self.PlayerCurrentRooms, nPlayerID , {} ) + table.insert( self.PlayerCrystals, nPlayerID , {} ) + end + + for szHeroName,HeroUpgrades in pairs ( MINOR_ABILITY_UPGRADES ) do + for k,v in pairs ( HeroUpgrades ) do + v[ "id" ] = k + end + --PrintTable( HeroUpgrades, szHeroName .. ": " ) + end + + GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 0.5 ) + + -- Used to display the blessings + CustomNetTables:SetTableValue( "game_global", "blessings", {} ) + + -- parse dev mode starting flags + self._bDevMode = (GameRules:GetGameSessionConfigValue("DevMode", "false") == "true") + self._szDevHero = GameRules:GetGameSessionConfigValue("DevHero", nil) + self._szDevEncounter = GameRules:GetGameSessionConfigValue("DevEncounter", nil) + + if self._bDevMode then + GameRules:SetHeroSelectionTime( 20.0 ) + GameRules:SetHeroSelectPenaltyTime( 0.0 ) + GameRules:SetPostGameTime( 10.0 ) + end + + self:RegisterConCommands() + + self.nNumViableRoomsForItems = NUM_VIABLE_ROOMS_FOR_DROPPED_ITEMS + self.nNumNeutralItems = NUM_NEUTRAL_ITEMS_DROPPED + self.DroppedNeutralItems = {} + + self:InitScoreboardInfo() + self:InitPlayerInfo() + self:AllocateRoomLayout() + self:AssignEncountersToRooms() + self:SetupSpawnLocations() + + -- Mark the first room as loaded, and start streaming the exit rooms immediately + local room = self:GetStartingRoom() + if room~= nil then + room:OnSpawnRoomComplete( room:GetSpawnGroupHandle() ) + end + + -- Listener for the ability upgrade + CustomGameEventManager:RegisterListener( "ability_upgrade_button_clicked", function(...) return self:OnAbilityUpgradeButtonClicked( ... ) end ) + self.bTestingAbilityUpgrades = false + + -- Listener for reward choice + CustomGameEventManager:RegisterListener( "reward_choice", function(...) return OnRewardChoice( ... ) end ) + + if self.bIsInTournamentMode == true then + self:SetAscensionLevel( 1 ) + print( "Tournament game difficulty is " .. self:GetAscensionLevel() ) + else + local nCustomGameDifficulty = GameRules:GetCustomGameDifficulty() + if nCustomGameDifficulty > 0 then + print( "Lobby game difficulty is " .. nCustomGameDifficulty ) + self:SetAscensionLevel( nCustomGameDifficulty - 1 ) + end + end + + -- Create announcer Unit + local dummyTable = + { + MapUnitName = "npc_dota_announcer_aghanim", + teamnumber = DOTA_TEAM_GOODGUYS, + } + CreateUnitFromTable( dummyTable, Vector( 0, 0, 0 ) ) + + self:InitializeMetagame() + self.BristlebackItems = {} +end +--------------------------------------------------------- +-- function CAghanim:showworldranklisk( keys ) +-- local worldranklist = {rank01,rank02,rank03,rank04,rank05,rand06,rank07,rank08,rank09,rank10} +-- rank01 = {"playerid","3600","diffcult","heroid","4800"} +-- local gametime = GameRules:GetGameTime() +-- if gametime == 10 then +-- print("30") +-- GameRules:SendCustomMessage(string.format("01 : %s",rank01[00])+string.format("time : %d",rank01[01])+string.format("diffcult : %d",rank01[02])+string.format("hero : %d",rank01[03])+string.format("score : %d",rank01[04]),DOTA_TEAM_GOODGUYS, 0) +-- end +-- return 1 +-- end + + +--聊天检测 +--------------------------------------------------------- +local expertmode = false +function CAghanim:PlayerChat( keys ) + print("PlayerSay") + DeepPrintTable(keys) + local worldranklist = {rank01,rank02,rank03,rank04,rank05,rand06,rank07,rank08,rank09,rank10} + rank01 = {"playerid","3600","diffcult","heroid","4800"} + local chattext = keys.text + local gametime = GameRules:GetGameTime() + if gametime < 120 then + if chattext == "expert" + then + expertmode = true + _G.AGHANIM_MAX_LIVES = 1 + _G.HEALTH_POTION_DROP_PCT = 15 + _G.MANA_POTION_DROP_PCT = 15 + _G.ELITE_VALUE_MODIFIER = 3 + print("expertmode on") + GameRules:SendCustomMessage("expertmode on", DOTA_TEAM_GOODGUYS, 0) + + -- CustomGameEventManager:Send_ServerToAllClients("bullet", { + -- player_id = keys.playerid + -- }) + return true + end + if chattext == "worldrank" then + GameRules:SendCustomMessage(string.format("01---time---diffcult---hero---score"),DOTA_TEAM_GOODGUYS, 0) + GameRules:SendCustomMessage(string.format("%s---%s---%s---%s---%s",rank01[1],rank01[2], rank01[3], rank01[4],rank01[5]),DOTA_TEAM_GOODGUYS, 0) + return true + end + else return false + end +end +-------------------------------------------------------------------------------- + +function CAghanim:GetRandomSeed( ) + return self.nSeed +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetHeroRandomStream( nPlayerID ) + + local hStream = self.hPlayerRandomStreams[ tostring( nPlayerID ) ] + if hStream ~= nil then + return hStream + end + + local nHeroID = PlayerResource:GetSelectedHeroID( nPlayerID ) + if nHeroID == 0 then + print( "GetHeroRandomStream: Warning! Encountered hero id " .. nHeroID ) + end + + local hStream = CreateUniformRandomStream( self.nSeed + nHeroID ) + self.hPlayerRandomStreams[ tostring( nPlayerID ) ] = hStream + return hStream + +end + +-------------------------------------------------------------------------------- + +function CAghanim:SetAnnouncer( hAnnouncer ) + self.hAnnouncer = hAnnouncer +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetAnnouncer( ) + return self.hAnnouncer +end + +-------------------------------------------------------------------------------- + + +function CAghanim:InitPlayerInfo() + + self.playerInfo = {} + + local hEventGameDetails = GetLobbyEventGameDetails() + + print("[Aghanim] EventGameDetails table:") + if hEventGameDetails == nil then + print("NOT FOUND!!") + hEventGameDetails = {} + end + + DeepPrintTable(hEventGameDetails) + + for nPlayerID = 0, AGHANIM_PLAYERS - 1 do + + local szAccountID = tostring( PlayerResource:GetSteamAccountID( nPlayerID ) ) + + local hPlayerDetails = {} + local szPlayerRecord = string.format( "Player%d", nPlayerID ) + if hEventGameDetails[szPlayerRecord] ~= nil then + local szRecordAccountID = hEventGameDetails[szPlayerRecord]['account_id'] + if szRecordAccountID ~= nil and szRecordAccountID == szAccountID then + hPlayerDetails = hEventGameDetails[szPlayerRecord] + end + end + + local info = + { + nBPCapTotal = hPlayerDetails["pointcap_total"] or 0, + nBPCapRemaining = hPlayerDetails["pointcap_remaining"] or 0, + nArcaneFragmentCapTotal = hPlayerDetails["premium_pointcap_total"] or 0, + nArcaneFragmentCapRemaining = hPlayerDetails["premium_pointcap_remaining"] or 0, + } + + self.playerInfo[ tostring( nPlayerID ) ] = info + end + +end + +-------------------------------------------------------------------------------- + +function CAghanim:CanPlayersAcceptCurrency( bBattlePoints ) + + if bBattlePoints == false then + return true + end + + local connectedPlayers = self:GetConnectedPlayers() + for i=1,#connectedPlayers do + local nPlayerID = connectedPlayers[i] + + local player = self.playerInfo[ tostring( nPlayerID ) ] + if player ~= nil then + if player.nBPCapRemaining > 0 then + return true + end + end + end + return false + +end + + + +-------------------------------------------------------------------------------- + +function CAghanim:RegisterCurrencyGrant( nPlayerID, nPoints, bBattlePoints ) + + local player = self.playerInfo[ tostring( nPlayerID ) ] + if player == nil then + return 0 + end + + if bBattlePoints == true then + if nPoints > player.nBPCapRemaining then + nPoints = player.nBPCapRemaining + end + player.nBPCapRemaining = player.nBPCapRemaining - nPoints + else + local nBonusPoints = nPoints * 2 + if nBonusPoints > player.nArcaneFragmentCapRemaining then + nBonusPoints = player.nArcaneFragmentCapRemaining + end + player.nArcaneFragmentCapRemaining = player.nArcaneFragmentCapRemaining - nBonusPoints + nPoints = nPoints + nBonusPoints + end + + return nPoints +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetPointsCapRemaining( nPlayerID, bBattlePoints, bTotal ) + + local player = self.playerInfo[ tostring( nPlayerID ) ] + if player == nil then + return 0 + end + + if bBattlePoints == true then + if bTotal == false then + return player.nBPCapRemaining + else + return player.nBPCapTotal + end + end + + if bTotal == false then + return player.nArcaneFragmentCapRemaining + else + return player.nArcaneFragmentCapTotal + end +end + +-------------------------------------------------------------------------------- + +function CAghanim:InitScoreboardInfo() + + for nPlayerID = 0, AGHANIM_PLAYERS - 1 do + local kv = + { + kills = 0, + death_count = 0, + gold_bags = 0 + } + CustomNetTables:SetTableValue( "aghanim_scores", tostring( nPlayerID ), kv ) + end + +end + +-------------------------------------------------------------------------------- + +function CAghanim:RegisterPlayerKillStat( nPlayerID, nDepth ) + + local scores = CustomNetTables:GetTableValue( "aghanim_scores", tostring(nPlayerID) ) + scores.kills = scores.kills + 1 + CustomNetTables:SetTableValue( "aghanim_scores", tostring(nPlayerID), scores ) + + local szRoomDepth = tostring( nDepth ) + self:EnsurePlayerStatAtDepth( nPlayerID, szRoomDepth ) + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].kills = + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].kills + 1 + +end + +-------------------------------------------------------------------------------- + +function CAghanim:RegisterGoldBagCollectedStat( nPlayerID ) + + local scores = CustomNetTables:GetTableValue( "aghanim_scores", tostring(nPlayerID) ) + scores.gold_bags = scores.gold_bags + 1 + CustomNetTables:SetTableValue( "aghanim_scores", tostring(nPlayerID), scores ) + + if self:GetCurrentRoom() ~= nil then + local szRoomDepth = tostring( self:GetCurrentRoom():GetDepth() ) + self:EnsurePlayerStatAtDepth( nPlayerID, szRoomDepth ) + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].gold_bags = + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].gold_bags + 1 + end + +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetNewPlayerList( ) + + local vecPlayerIDs = {} + for nPlayerID = 0, AGHANIM_PLAYERS - 1 do + if PlayerResource:IsValidPlayerID( nPlayerID ) and PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + local nGamePlayedCount = PlayerResource:GetEventGameCustomActionClaimCountByName( nPlayerID, "ti10_event_game_num_games_played" ) + if nGamePlayedCount < 3 then + table.insert( vecPlayerIDs, nPlayerID ) + end + end + end + return vecPlayerIDs + +end + +-------------------------------------------------------------------------------- + +function CAghanim:ReassignTrapRoomToNormalEncounter( nAct ) + + local hRoom = nil + for _,room in pairs(self.rooms) do + if room:GetAct() == nAct and room:GetType() == ROOM_TYPE_TRAPS then + hRoom = room + break + end + end + + if hRoom == nil then + return + end + + -- Reassign this room back to a normal room + hRoom.nRoomType = ROOM_TYPE_ENEMY + + -- Select a new encounter, and make sure no room has the same encounter on both exits + local vecSiblingRoomNames = self:GetSiblingRoomNames( hRoom:GetName() ) + + local vecEncounterOptions = {} + for encounterName,encounterDef in pairs(ENCOUNTER_DEFINITIONS) do + + if not self:IsEncounterDefAppropriateForRoom( encounterDef, hRoom ) then + goto continue + end + + for s=1,#vecSiblingRoomNames do + local szOtherEncounterName = self.rooms[ vecSiblingRoomNames[s] ]:GetEncounterName() + if szOtherEncounterName == encounterName then + goto continue + end + end + + table.insert( vecEncounterOptions, encounterName ) + ::continue:: + end + + if #vecEncounterOptions > 0 then + local nPick = self.hMapRandomStream:RandomInt( 1, #vecEncounterOptions ) + --print( "Replacing trap encounter " .. hRoom:GetEncounterName() .. " with encounter " .. vecEncounterOptions[nPick] .. " in room " .. hRoom:GetName() ) + hRoom:AssignEncounter( vecEncounterOptions[nPick] ) + hRoom:GetEncounter():SelectAscensionAbilities() + end + +end + +-------------------------------------------------------------------------------- + +function CAghanim:ComputeHasNewPlayers() + + if self.bHasSetNewPlayers == true then + return + end + + if PlayerResource:HasSetEventGameCustomActionClaimCount() == false then + return + end + + self.bHasSetNewPlayers = true + + -- Determine whether there are any new players + local vecPlayerIDs = self:GetNewPlayerList( ) + self.bHasAnyNewPlayers = ( #vecPlayerIDs > 0 ) + + -- Show new player popup for new players + CustomNetTables:SetTableValue( "game_global", "new_players", vecPlayerIDs ) + + if self.bHasAnyNewPlayers == true and self:GetAscensionLevel() == 0 then + self:ReassignTrapRoomToNormalEncounter( 1 ) + end + + print( "New players " .. tostring( self.bHasAnyNewPlayers ) ) + + -- Can't do this until we know whether we have new players + self:GetAnnouncer():OnHeroSelectionStarted() + +end + +-------------------------------------------------------------------------------- + +function CAghanim:OnHeroSelectionStarted() + +end + +-------------------------------------------------------------------------------- + +function CAghanim:HasAnyNewPlayers() + return self.bHasAnyNewPlayers +end + +-------------------------------------------------------------------------------- + +function CAghanim:IsInTournamentMode() + return self.bIsInTournamentMode +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetPlayerCurrentRoom( nPlayerID ) + return self.PlayerCurrentRooms[ nPlayerID ] +end + +-------------------------------------------------------------------------------- + +function CAghanim:ClampMinimapToRoom( nPlayerID, hRoom ) + + local flSize = hRoom:GetMaxs().x - hRoom:GetMins().x + local flSizeY = hRoom:GetMaxs().y - hRoom:GetMins().y + if flSizeY > flSize then + flSize = flSizeY + end + + local netTable = {} + netTable[ "room_name" ] = hRoom:GetName() + netTable[ "map_name" ] = hRoom:GetMapName() + netTable[ "x" ] = hRoom:GetOrigin().x + netTable[ "y" ] = hRoom:GetOrigin().y + netTable[ "size" ] = flSize + netTable[ "scale" ] = 8 + + if hRoom:GetType() == ROOM_TYPE_BOSS then + netTable[ "scale" ] = 4 + end + + if hRoom:GetName() == "a2_transition" then + netTable[ "scale" ] = 2 + end + + if hRoom:GetType() == ROOM_TYPE_STARTING then + netTable[ "map_name" ] = "main" + end + + CustomNetTables:SetTableValue( "game_global", "minimap_info" .. nPlayerID, netTable ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:SetPlayerCurrentRoom( nPlayerID, hRoom ) + self.PlayerCurrentRooms[ nPlayerID ] = hRoom + self:ClampMinimapToRoom( nPlayerID, hRoom ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetStartingRoom() + for _,room in pairs(self.rooms) do + if room:GetAct() == 1 and room:GetType() == ROOM_TYPE_STARTING then + return room + end + end + return nil +end + +-------------------------------------------------------------------------------- + +function CAghanim:RegisterConCommands() + print("Registering ConCommands..."); + local eCommandFlags = FCVAR_CHEAT + Convars:RegisterCommand( "test_room_reward", function( ... ) return TestRoomRewardConsoleCommand(...) end, "Usage: test_room_reward ", eCommandFlags ); + -- use aghanim_ability_upgrades to open the ability upgrade dev interface + Convars:RegisterCommand( "aghanim_ability_upgrades", function(...) return self:TestAbilityUpgradesUICC( ... ) end, "", eCommandFlags ) + Convars:RegisterCommand( "win_encounter", function(...) return self:Dev_WinEncounter( ... ) end, "Completes the current encounter.", eCommandFlags ) + Convars:RegisterCommand( "win_game", function(...) return self:Dev_WinGame( ... ) end, "Completes the current game.", eCommandFlags ) + Convars:RegisterCommand( "set_ascension_level", function(...) return self:Dev_SetAscensionLevel( ... ) end, "Sets the current ascension level", eCommandFlags ) + Convars:RegisterCommand( "extra_lives", function(...) return self:Dev_ExtraLives( ... ) end, "Completes the current encounter.", eCommandFlags ) + Convars:RegisterCommand( "aghanim_test_encounter", function(...) return self:Dev_TestEncounter( ... ) end, "Tests a specific encounter at a specific level", eCommandFlags ) + Convars:RegisterCommand( "fast_test_encounter", function(...) self.bFastTestEncounter = true; return self:Dev_TestEncounter( ... ) end, "Tests a specific encounter at a specific level", eCommandFlags ) + Convars:RegisterCommand( "set_new_players", function(...) return self:Dev_SetNewPlayers( ... ) end, "Sets whether there are new players or not", eCommandFlags ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:SetAscensionLevel( nLevel ) + + if nLevel < 0 then + nLevel = 0 + elseif nLevel > self:GetMaxAllowedAscensionLevel() then + nLevel = self:GetMaxAllowedAscensionLevel() + end + + print( 'Setting Ascension Level to ' .. nLevel ) + self.nAscensionLevel = nLevel + self.bHasSetAscensionLevel = true + CustomNetTables:SetTableValue( "game_global", "ascension_level", { nLevel } ) + + -- Assign elite rooms, since the #s are dependent on the ascension level + local vecEliteRooms = { {}, {}, {} } + + -- Which rooms can be elite? + for k,roomDef in pairs(MAP_ATLAS) do + -- Clear out any previous state + local hRoom = self.rooms[ roomDef.name ] + hRoom:SetEliteDepthBonus( 0 ) + + -- No elites at depth 2 for ascension 0 or 1 + local bSuppress = ( nLevel <= 1 ) and ( roomDef.nDepth == 2 ) + if bSuppress == false and not roomDef.bCannotBeElite and hRoom:GetType() == ROOM_TYPE_ENEMY then + table.insert( vecEliteRooms[ hRoom.nAct ], roomDef.name ) + end + end + + for nAct=1,3 do + + -- Assign elite rooms + for nEliteRoom=1, MAP_ATLAS_ELITE_ROOMS_PER_ACT[nLevel+1][nAct] do + if #vecEliteRooms[nAct] == 0 then + break + end + local nPick = self.hMapRandomStream:RandomInt( 1, #vecEliteRooms[nAct] ) + + local szEliteRoom = vecEliteRooms[nAct][nPick] + --print( "Selecting elite room " .. szEliteRoom ) + self.rooms[ szEliteRoom ]:SetEliteDepthBonus( 1 ) + self.rooms[ szEliteRoom ]:SendRoomToClient() + table.remove( vecEliteRooms[nAct], nPick ) + + -- Make sure no room has 2 elite exits at asc 0 and 1 + if nLevel <= 1 then + local vecSiblingRoomNames = self:GetSiblingRoomNames( szEliteRoom ) + for s=1,#vecSiblingRoomNames do + for h=1,#vecEliteRooms[nAct] do + if vecEliteRooms[nAct][h] == vecSiblingRoomNames[s] then + --print( "Removing elite room option " .. vecEliteRooms[nAct][h] ) + table.remove( vecEliteRooms[nAct], h ) + break + end + end + end + end + end + + end + + -- Now that we know our ascension level and eliteness, we can pick the abilities we want to use + for k,room in pairs(self.rooms) do + room:GetEncounter():SelectAscensionAbilities() + end + +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetMaxAllowedAscensionLevel( ) + return 3 +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetAscensionLevel( ) + return self.nAscensionLevel +end + +-------------------------------------------------------------------------------- + +function CAghanim:HasSetAscensionLevel( ) + return self.bHasSetAscensionLevel +end + +-------------------------------------------------------------------------------- + +function CAghanim:DepthHasEliteEncounters( nDepth ) + + local bSkippedOptions = false + for encounterName,encounterDef in pairs(ENCOUNTER_DEFINITIONS) do + + if ( nDepth >= encounterDef.nMinDepth and nDepth <= encounterDef.nMaxDepth ) then +-- if encounterDef.nMaxEliteRank ~= nil and encounterDef.nMaxEliteRank > 0 then + if encounterDef.nEncounterType == ROOM_TYPE_ENEMY then + return true + end + end + end + + return false +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetSiblingRoomNames( szRoomName ) + -- Find the room(s) that can be entered from the same room as hRoom can be + local hParentRooms = {} + + for _,otherRoom in pairs(self.rooms) do + local vecExits = otherRoom:GetExits() + for _,exit in pairs(vecExits) do + if exit == szRoomName then + table.insert( hParentRooms, otherRoom ) + end + end + end + + local szOtherExits = {} + for i=1,#hParentRooms do + local vecExits = hParentRooms[i]:GetExits() + for _,szExit in pairs(vecExits) do + if szExit ~= szRoomName then + table.insert( szOtherExits, szExit ) + end + end + end + + return szOtherExits + +end + +-------------------------------------------------------------------------------- +-- Assign room reward +function CAghanim:AssignRoomReward( szRoomName, RewardPossibilites ) + + local flRoll = self.hMapRandomStream:RandomFloat( 0, 100.0 ) + local flThreshold = 0.0 + + for k,v in pairs( RewardPossibilites ) do + flThreshold = flThreshold + v + if flRoll <= flThreshold then + szRewardResult = k + break + end + end + + local nExitRoomType = MAP_ATLAS[ szRoomName ].nRoomType + if nExitRoomType == ROOM_TYPE_BOSS then + if szRoomName ~= "a3_boss" then + szRewardResult = "REWARD_TYPE_GOLD" + else + szRewardResult = "REWARD_TYPE_NONE" + end + elseif nExitRoomType == ROOM_TYPE_BONUS then + szRewardResult = "REWARD_TYPE_GOLD" + elseif nExitRoomType == ROOM_TYPE_TRANSITIONAL or nExitRoomType == ROOM_TYPE_STARTING then + szRewardResult = "REWARD_TYPE_NONE" + end + + --print( "Setting Room Reward for " .. szRoomName .. " to " .. szRewardResult ) + return szRewardResult + +end + + +-------------------------------------------------------------------------------- +-- Allocates the room layout +function CAghanim:AllocateRoomLayout() + + self.bMapFlipped = false --( self.hMapRandomStream:RandomInt( 0, 1 ) == 1 ) + + local vecPotentialTrapRooms = { {}, {}, {} } + local vecHiddenRooms = { {}, {}, {} } + self.nMaxDepth = 0 + + -- Assign room positions + exits, given flip horizontal logic + self.rooms = {} + self.RoomRewards = {} + + for k,roomDef in pairs(MAP_ATLAS) do + local fHeightOffset = 512 + local vCenter = Vector( roomDef.vCenter.x, roomDef.vCenter.y, roomDef.vCenter.z + fHeightOffset ) + if self.bMapFlipped then + vCenter.x = -vCenter.x + end + + if roomDef.nRoomType == ROOM_TYPE_ENEMY and roomDef.nDepth > self.nMaxDepth then + self.nMaxDepth = roomDef.nDepth + end + + local vMins = vCenter - roomDef.vSize / 2 + local vMaxs = vCenter + roomDef.vSize / 2 + self.rooms[ roomDef.name ] = CMapRoom( roomDef.name, roomDef.nRoomType, roomDef.nDepth, vMins, vMaxs, vCenter ) + + local nGoldValue = ENCOUNTER_DEPTH_GOLD_REWARD[ roomDef.nDepth + 1 ] + + local RewardPossibilites = deepcopy( ROOM_CHOICE_REWARDS ) + ShuffleListInPlace( RewardPossibilites, self.hMapRandomStream ) + + -- If the side exit was previously assigned, remove it from the list of possible rewards + if self.RoomRewards[ roomDef.exit_side ] ~= nil then + RewardPossibilites[ self.RoomRewards[ roomDef.exit_side ] ] = nil + NormalizeFloatArrayInPlace( RewardPossibilites, 100.0 ) + end + + if ( roomDef.exit_up ~= nil ) then + self.rooms[ roomDef.name ]:AddExit( ROOM_EXIT_TOP, roomDef.exit_up ) + + if self.RoomRewards[ roomDef.exit_up ] == nil then + self.RoomRewards[ roomDef.exit_up ] = self:AssignRoomReward( roomDef.exit_up, RewardPossibilites ) + end + + -- Remove the reward assigned to exit_up as a possibility for exit_side + if self.RoomRewards[ roomDef.exit_up ] ~= nil then + RewardPossibilites[ self.RoomRewards[ roomDef.exit_up ] ] = nil + end + NormalizeFloatArrayInPlace( RewardPossibilites, 100.0 ) + end + + if ( roomDef.exit_side ~= nil ) then + + -- Deal with map flip + local exitDirection = ROOM_EXIT_LEFT + if MAP_ATLAS[ roomDef.exit_side ].vCenter.x < roomDef.vCenter.x then + if self.bMapFlipped then + exitDirection = ROOM_EXIT_RIGHT + end + else + if not self.bMapFlipped then + exitDirection = ROOM_EXIT_RIGHT + end + end + + self.rooms[ roomDef.name ]:AddExit( exitDirection, roomDef.exit_side ) + + if self.RoomRewards[ roomDef.exit_side ] == nil then + self.RoomRewards[ roomDef.exit_side ] = self:AssignRoomReward( roomDef.exit_side, RewardPossibilites ) + end + end + + if ( roomDef.nRoomType == ROOM_TYPE_ENEMY ) and ( roomDef.bCannotBeTrap == nil or roomDef.bCannotBeTrap == false ) then + table.insert( vecPotentialTrapRooms[ self.rooms[ roomDef.name ].nAct ], roomDef.name ) + end + + local bSuppress = ( roomDef.nDepth == 2 ) + if ( not roomDef.bCannotBeElite ) and ( bSuppress == false ) then + table.insert( vecHiddenRooms[ self.rooms[ roomDef.name ].nAct ], roomDef.name ) + end + end + + for nAct=1,3 do + + -- Assign trap rooms + for nTrapRoom=1, MAP_TRAP_ROOMS_PER_ACT[nAct] do + local nPick = self.hMapRandomStream:RandomInt( 1, #vecPotentialTrapRooms[nAct] ) + --print( "Selecting trap room option " .. vecPotentialTrapRooms[nAct][nPick] ) + self.rooms[ vecPotentialTrapRooms[nAct][nPick] ].nRoomType = ROOM_TYPE_TRAPS + table.remove( vecPotentialTrapRooms[nAct], nPick ) + end + + -- Assign hidden rooms + for nHiddenRoom=1, MAP_HIDDEN_ENCOUNTERS_PER_ACT[nAct] do + local nPick = self.hMapRandomStream:RandomInt( 1, #vecHiddenRooms[nAct] ) + local szHiddenRoomName = vecHiddenRooms[nAct][nPick] + --print( "Selecting hidden room option " .. szHiddenRoomName ) + self.rooms[ szHiddenRoomName ]:SetHidden( ) + table.remove( vecHiddenRooms[nAct], nPick ) + + -- Make sure no room has 2 hidden exits + local vecSiblingRoomNames = self:GetSiblingRoomNames( szHiddenRoomName ) + for s=1,#vecSiblingRoomNames do + for h=1,#vecHiddenRooms[nAct] do + if vecHiddenRooms[nAct][h] == vecSiblingRoomNames[s] then + --print( "Removing hidden room option " .. vecHiddenRooms[nAct][h] ) + table.remove( vecHiddenRooms[nAct], h ) + break + end + end + end + end + + local nNumCrystalsPerAct = 2 + if nAct == 3 then + nNumCrystalsPerAct = 1 + end + for nCrystalRoom=1,nNumCrystalsPerAct do + local nPick = self.hMapRandomStream:RandomInt( 1, #vecPotentialTrapRooms[nAct] ) + self.rooms[ vecPotentialTrapRooms[nAct][nPick] ].bHasCrystal = true + print( "assigning " .. vecPotentialTrapRooms[nAct][nPick] .. " a crystal " ) + table.remove( vecPotentialTrapRooms[nAct], nPick ) + end + end + + for k,v in pairs ( self.rooms ) do + v:SetRoomChoiceReward( self.RoomRewards[ v:GetName() ] ) + if self.RoomRewards[ v:GetName() ] ~= nil then + print( "Room " .. v:GetName() .. " reward: " .. self.RoomRewards[ v:GetName() ] ) + end + end +end + +-------------------------------------------------------------------------------- +function CAghanim:IsEncounterDefAppropriateForRoom( encounterDef, room ) + + if room:GetType() ~= encounterDef.nEncounterType then + return false + end + + local requiredDepth = room:GetDepth() + if ( requiredDepth < encounterDef.nMinDepth ) or ( requiredDepth > encounterDef.nMaxDepth ) then + return false + end + + return true + +end + +-------------------------------------------------------------------------------- + +-- Allocates the room layout +function CAghanim:AssignEncountersToRooms() + + local vecAlreadySelectedEncounters = {} + for k,room in pairs(self.rooms) do + + local vecEncounterOptions = {} + + while true do + + local bSkippedOptions = false + for encounterName,encounterDef in pairs(ENCOUNTER_DEFINITIONS) do + + if not self:IsEncounterDefAppropriateForRoom( encounterDef, room ) then + goto continue + end + + if vecAlreadySelectedEncounters[ encounterName ] == true then + bSkippedOptions = true + goto continue + end + + -- Make sure no room has the same encounter on both exits, + -- possible because we're shipping with only 3 options in act 3 + local vecSiblingRoomNames = self:GetSiblingRoomNames( room:GetName() ) + for s=1,#vecSiblingRoomNames do + local szOtherEncounterName = self.rooms[ vecSiblingRoomNames[s] ]:GetEncounterName() + if szOtherEncounterName == encounterName then + --print( "Suppressing duplicate encounter " .. szOtherEncounterName .. " in room " .. room:GetName() ) + goto continue + end + end + + table.insert( vecEncounterOptions, encounterName ) + ::continue:: + end + + if #vecEncounterOptions > 0 then + break + end + + -- This logic causes us to re-use encounters if we've already used them all once + if bSkippedOptions == false then + vecEncounterOptions = { "encounter_test_immediate_victory" } + break + else + for encounterName,encounterDef in pairs(ENCOUNTER_DEFINITIONS) do + + if self:IsEncounterDefAppropriateForRoom( encounterDef, room ) then + vecAlreadySelectedEncounters[ encounterName ] = nil + end + end + + end + end + + -- FOR DEBUGGING, USE A FIXED ENCOUNTER LAYOUT WITH SPECIFIC DUPES + if USE_ENCOUNTER_FIXED_LAYOUT == true then + vecEncounterOptions = { ENCOUNTER_FIXED_LAYOUT[room:GetName()] } + room.nRoomType = ENCOUNTER_DEFINITIONS[ vecEncounterOptions[1] ].nEncounterType + end + + if self._szDevEncounter and room:GetName() == "a1_2a" then + vecEncounterOptions = { self._szDevEncounter } + room.nRoomType = ENCOUNTER_DEFINITIONS[ vecEncounterOptions[1] ].nEncounterType + end + + if #vecEncounterOptions > 0 then + local nPick = self.hMapRandomStream:RandomInt( 1, #vecEncounterOptions ) + room:AssignEncounter( vecEncounterOptions[nPick] ) + vecAlreadySelectedEncounters[ vecEncounterOptions[nPick] ] = true + else + print( "Unable to find valid encounter for room " .. k ) + end + end +end + +-------------------------------------------------------------------------------- + +-- Sets up the spawn locations for the players +function CAghanim:SetupSpawnLocations() + + if ( not self.bMapFlipped ) then + return + end + + local hLeftEnt = Entities:FindByName( nil, "a1_1a_teamspawn_left" ) + if hLeftEnt == nil then + print( "Unable to find a1_1a_teamspawn_left" ) + end + + local hRightEnt = Entities:FindByName( nil, "a1_1a_teamspawn_right" ) + if hRightEnt == nil then + print( "Unable to find a1_1a_teamspawn_right" ) + end + + local vOffset = hRightEnt:GetAbsOrigin() - hLeftEnt:GetAbsOrigin() + + local hPlayerStarts = Entities:FindAllByClassname( "info_player_start_goodguys" ) + if #hPlayerStarts == 0 then + print( "Failed to find any info_player_start_goodguys entities" ) + end + + for i=1, #hPlayerStarts do + local vNewPosition = hPlayerStarts[i]:GetAbsOrigin() + vOffset + hPlayerStarts[i]:SetAbsOrigin( vNewPosition ) + end + + local entitiesToFlip = + { + "encounter_end_locator", + "encounter_boss_preview_locator", + "encounter_outpost_1_override", + "encounter_outpost_2_override", + } + + for i=1, #entitiesToFlip do + + local hLocator = Entities:FindByName( nil, entitiesToFlip[i] ) + if hLocator ~= nil then + local vNewPosition = hLocator:GetAbsOrigin() + vNewPosition.x = -vNewPosition.x + hLocator:SetAbsOrigin( vNewPosition ) + end + + end +end + +-------------------------------------------------------------------------------- + +function CAghanim:FindRoomBySpawnGroupHandle( hSpawnGroupHandle ) + + for k,room in pairs(self.rooms) do + if room:GetSpawnGroupHandle() == hSpawnGroupHandle then + return room + end + end + + return nil +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetExitOptionData( nOptionNumber ) + + if self:GetCurrentRoom() == nil then + print( "GetExitOptionData has no room") + return nil + end + + local exits = {} + local exitDirections = {} + local exitLocations = {} + + for direction=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do + + local room = self:GetCurrentRoom():GetExit( direction ) + local vExitLocation = self:GetCurrentRoom():GetExitLocation( direction ) + if ( room ~= nil ) then + table.insert( exits, self:GetRoom( room ) ) + table.insert( exitDirections, direction ) + table.insert( exitLocations, vExitLocation ) + end + end + + -- No exits? we're done + if #exits == 0 then + return nil + end + + -- Gotta do this before we tweak the option number for the rest of this algorithm + local hOverrideLocators = self:GetCurrentRoom():FindAllEntitiesInRoomByName( "encounter_outpost_" .. nOptionNumber .. "_override" ) + + if ( nOptionNumber > #exits ) then + nOptionNumber = #exits + end + + local hRequestedExit = exits[nOptionNumber] + local strPreviewUnit = hRequestedExit:GetEncounter():GetPreviewUnit() + local hAscensionAbilities = hRequestedExit:GetEncounter():GetAscensionAbilities() + local szAscensionAbilities = "" + for i = 1,#hAscensionAbilities do + if i ~= 1 then + szAscensionAbilities = szAscensionAbilities .. ";" + end + szAscensionAbilities = szAscensionAbilities .. hAscensionAbilities[i] + end + + local exitData = + { + nExitDirection = exitDirections[nOptionNumber], + vExitLocation = exitLocations[nOptionNumber], + szEncounterPreviewUnit = strPreviewUnit, + flEncounterPreviewModelScale = ENCOUNTER_PREVIEW_SCALES[ strPreviewUnit ], + nEncounterType = hRequestedExit:GetType(), + bIsEliteEncounter = ( hRequestedExit:GetEliteRank() > 0 ), + szNextRoomName = hRequestedExit:GetName(), + szRewardType = hRequestedExit:GetRoomChoiceReward(), + szEncounterName = hRequestedExit:GetEncounter():GetName(), + szAscensionNames = szAscensionAbilities, + nExitCount = #exits, + nDepth = hRequestedExit:GetDepth(), + flZOffset = 0, + } + + --if self:GetCurrentRoom():GetExitReward( nOptionNumber ) then +-- print( "Exit option " .. nOptionNumber .. " for room " .. self:GetCurrentRoom().szRoomName .. " has reward type " .. exits[nOptionNumber]:GetRoomChoiceReward() .. " in room " .. exits[nOptionNumber].szRoomName ) +-- end + + if exitData.flEncounterPreviewModelScale == nil then + exitData.flEncounterPreviewModelScale = 1.0 + end + + if #hOverrideLocators > 0 then + exitData.vOverrideLocation = hOverrideLocators[1]:GetAbsOrigin() + end + + if exits[nOptionNumber]:IsHidden() then + exitData.szEncounterPreviewUnit = "models/ui/exclamation/questionmark.vmdl" + exitData.flEncounterPreviewModelScale = 0.0015 + if exitData.nEncounterType == ROOM_TYPE_TRAPS then + exitData.bIsEliteEncounter = hRequestedExit:ShouldDisplayHiddenAsElite() + end + exitData.nEncounterType = ROOM_TYPE_ENEMY + exitData.flZOffset = 25 + end + + return exitData +end + +-------------------------------------------------------------------------------- + +function CAghanim:OnNextRoomSelected( event ) + self:GetCurrentRoom():OnNextRoomSelected( event.selected_room ) +end + +-------------------------------------------------------------------------------- + +-- Evaluate the state of the game +function CAghanim:OnThink() + + local nGameState = GameRules:State_Get() + if nGameState == DOTA_GAMERULES_STATE_HERO_SELECTION then + self:ComputeHasNewPlayers() + if not self.bStreamedStartingRoomExits then + -- Stream the starting room exits here so people don't have to wait for those + -- First exits to appear, gives more time for the streamer to do its work too + self.bStreamedStartingRoomExits = true + local room = self:GetStartingRoom() + if room ~= nil then + self:SetCurrentRoom( room ) + room:LoadExitRooms() + end + end + elseif nGameState == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then + if self:GetCurrentRoom() and self:GetCurrentRoom():GetEncounter() and self:GetCurrentRoom():GetEncounter():HasStarted() and self:GetCurrentRoom():GetEncounter():NeedsToThink() then + self:GetCurrentRoom():GetEncounter():OnThink() + self:_CheckForDefeat() + end + elseif nGameState >= DOTA_GAMERULES_STATE_POST_GAME then + return nil + end + + --CustomNetTables:SetTableValue( "special_ability_upgrades", tostring( 0 ), SPECIAL_ABILITY_UPGRADES[szHeroName] ) + return 1 +end + +-------------------------------------------------------------------------------- +-- +-------------------------------------------------------------------------------- +function CAghanim:ForceAssignHeroes() + + for nPlayerID = 0, ( DOTA_MAX_TEAM_PLAYERS - 1 ) do + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + local hPlayer = PlayerResource:GetPlayer( nPlayerID ) + if hPlayer and not PlayerResource:HasSelectedHero( nPlayerID ) then + hPlayer:MakeRandomHeroSelection() + end + end + end + +end + +-------------------------------------------------------------------------------- + +function CAghanim:SetCurrentRoom( hRoom ) + if hRoom ~= self.CurrentRoom then + self.CurrentRoom = hRoom + self.flCurrentRoomChangeTime = GameRules:GetGameTime() + + for k,v in pairs ( self.rooms ) do + v:SendRoomToClient() + end + + for nPlayerID = 0, ( DOTA_MAX_TEAM_PLAYERS - 1 ) do + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + self:RegisterEncounterStartStats( nPlayerID, hRoom:GetDepth() ) + end + end + + end +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetCurrentRoom() + return self.CurrentRoom +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetCurrentRoomChangeTime() + return self.flCurrentRoomChangeTime +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetRoom( szRoomName ) + return self.rooms[ szRoomName ] +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetRoomList() + return self.rooms +end + +-------------------------------------------------------------------------------- + +function CAghanim:FindRoomForPoint( vPoint ) + for _,room in pairs(self.rooms) do + if room:IsInRoomBounds( vPoint ) then + return room + end + end + return nil +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetMaxDepth() + return self.nMaxDepth +end + +-------------------------------------------------------------------------------- + +function CAghanim:IsMapFlipped() + return self.bMapFlipped +end + + -------------------------------------------------------------------------------- + +function CAghanim:GetBossUnitForAct( nAct ) + for _,room in pairs(self.rooms) do + if room:GetType() == ROOM_TYPE_BOSS then + if room:GetAct() == nAct then + return room:GetEncounter():GetPreviewUnit() + end + end + end + + return nil +end + +-------------------------------------------------------------------------------- + +function CAghanim:AddFowOutlineBlocker( vMins, vMaxs ) + self.hFowBlockerRegion:AddRectangularOutlineBlocker( vMins, vMaxs, false ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:ClearFowBlockers( vMins, vMaxs ) + self.hFowBlockerRegion:AddRectangularBlocker( vMins, vMaxs, true ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:AddMinorAbilityUpgrade( hHero, upgradeTable ) + print( "Adding minor ability upgrade for playerID " .. hHero:GetPlayerOwnerID() ) + --PrintTable( upgradeTable, "upgrade" ) + + if hHero.MinorAbilityUpgrades == nil then + hHero.MinorAbilityUpgrades = {} + end + + local szAbilityName = upgradeTable[ "ability_name" ] + if hHero.MinorAbilityUpgrades[ szAbilityName ] == nil then + hHero.MinorAbilityUpgrades[ szAbilityName ] = {} + end + + local szSpecialValueName = upgradeTable[ "special_value_name" ] + if hHero.MinorAbilityUpgrades[ szAbilityName ][ szSpecialValueName ] == nil then + hHero.MinorAbilityUpgrades[ szAbilityName ][ szSpecialValueName ] = {} + end + + local newUpgradeTable = {} + newUpgradeTable[ "operator" ] = upgradeTable[ "operator" ] + newUpgradeTable[ "value" ] = upgradeTable[ "value" ] + table.insert( hHero.MinorAbilityUpgrades[ szAbilityName ][ szSpecialValueName ], newUpgradeTable ) + + CustomNetTables:SetTableValue( "minor_ability_upgrades", tostring( hHero:GetPlayerOwnerID() ), hHero.MinorAbilityUpgrades ) + + --PrintTable( hHero.MinorAbilityUpgrades, " -- " ) + + local Buff = hHero:FindModifierByName( "modifier_minor_ability_upgrades" ) + if Buff == nil then + print( "Error - No minor ability upgrade buff!" ) + return + end + Buff:ForceRefresh() +end +-------------------------------------------------------------------------------- + +function CAghanim:VerifyStatsAbility( hHero, szAbilityName ) + --print( "Verifying stats upgrade for playerID " .. hHero:GetPlayerOwnerID() ) + if hHero == nil or szAbilityName == nil then + return + end + + local hAbility = hHero:FindAbilityByName(szAbilityName) + if hAbility == nil then + hAbility = hHero:AddAbility(szAbilityName) + hAbility:UpgradeAbility( true ) + --printf("Adding Stats Ability...", szAbilityName) + end + + -- Currently there's only one buff for all the stats, so just refresh it here. + -- If we decide to spread them out, the buffs should be refreshed based on their ability. + local StatsBuff = hHero:FindModifierByName( "modifier_aghsfort_minor_stats_upgrade" ) + if StatsBuff == nil then + print( "Error - No minor ability upgrade buff!" ) + return + end + StatsBuff:ForceRefresh() + + return + + +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetFragmentDropEV() + local fDropEV = 0 + for _, odds in pairs( ARCANE_FRAGMENT_RANDOM_DROP_CHANCES ) do + fDropEV = fDropEV + ( ( odds.high_chance - odds.low_chance ) * odds.num_fragments ) + end + fDropEV = fDropEV / 100 + + print( 'CAghanim:GetFragmentDropEV() calculated an average number of drops: ' .. fDropEV ) + + return fDropEV +end + +-------------------------------------------------------------------------------- + +function CAghanim:RollRandomFragmentDrops() + local fRoll = RandomFloat( 0, 100.0 ) + print( 'CAghanim:RollRandomFragmentDrops() rolled a ' .. fRoll ) + + for _, odds in pairs( ARCANE_FRAGMENT_RANDOM_DROP_CHANCES ) do + if fRoll >= odds.low_chance and fRoll <= odds.high_chance then + print( 'CAghanim:RollRandomFragmentDrops() selecting ' .. odds.num_fragments .. ' fragment drops for this room' ) + return odds.num_fragments + end + end + + print( 'WARNING: CAghanim:RollRandomFragmentDrops() did not find a valid entry for this roll ' .. fRoll ) + return 0 +end + +-------------------------------------------------------------------------------- + +function CAghanim:RollRandomNeutralItemDrops( hEncounter ) + if self.nNumNeutralItems <= 0 then + return 0 + end + + local nPctChance = ( 100 * self.nNumNeutralItems ) / self.nNumViableRoomsForItems + local nItemsToDrop = 0 + while hEncounter:RoomRandomInt( 1, 100 ) < nPctChance do + nItemsToDrop = nItemsToDrop + 1 + + if nItemsToDrop == 2 then + break + end + + local nRemainingItems = self.nNumNeutralItems - nItemsToDrop + if nRemainingItems < self.nNumViableRoomsForItems then + nPctChance = PCT_BASE_TWO_ITEM_DROP + else + nPctChance = ( nRemainingItems / self.nNumViableRoomsForItems ) * 100 + end + end + + nItemsToDrop = math.min( self.nNumNeutralItems, nItemsToDrop ) + self.nNumNeutralItems = self.nNumNeutralItems - nItemsToDrop + self.nNumViableRoomsForItems = self.nNumViableRoomsForItems - 1 + return nItemsToDrop +end + + +-------------------------------------------------------------------------------- + +function CAghanim:PrepareNeutralItemDrop( hRoom, bElite ) + + local nDepth = hRoom:GetDepth() + local vecPotentialItems = GetPricedNeutralItems( nDepth, bElite ) + local vecFilteredItems = GameRules.Aghanim:FilterPreviouslyDroppedItems( vecPotentialItems ) + + local vecTable = vecFilteredItems + if #vecTable == 0 then + print( "WARNING! All potential items have been dropped, falling back to original depth list. ") + vecTable = vecPotentialItems + if #vecPotentialItems == 0 then + print( "WARNING! trying to drop a neutral item in a place where there is no priced list, depth " .. nDepth ) + return nil + end + end + + local szItemDrop = vecFilteredItems[ hRoom:RoomRandomInt( 1, #vecFilteredItems ) ] + if szItemDrop == nil then + return nil + end + + if self:GetTestEncounterDebugRoom() ~= nil then + print( "adding neutral item to debug crate:" .. szItemDrop ) + table.insert( self.debugItemsToStuffInCrate.RoomReward, szItemDrop ) + end + + self:MarkNeutralItemAsDropped( szItemDrop ) + return szItemDrop +end + +-------------------------------------------------------------------------------- + +function CAghanim:MarkNeutralItemAsDropped( szItemName ) + table.insert( self.DroppedNeutralItems, szItemName ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:FilterPreviouslyDroppedItems( vecPotentialItems ) + for i = #vecPotentialItems,1,-1 do + local szItemName = vecPotentialItems[ i ] + for _,szDroppedItemName in pairs ( self.DroppedNeutralItems ) do + if szItemName == szDroppedItemName then + table.remove( vecPotentialItems, i ) + end + end + end + + return vecPotentialItems +end + +-------------------------------------------------------------------------------- + +function CAghanim:RegisterSummonForAghanim( nDepth, szUnitName ) + local Summon = {} + Summon[ "depth" ] = nDepth + Summon[ "unit_name" ] = szUnitName + table.insert( self.AghanimSummons, Summon ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetSummonsForAghanim() + return self.AghanimSummons +end + +-------------------------------------------------------------------------------- + +function CAghanim:InitializeMetagame() + self.SignOutTable = {} + self.SignOutTable[ "event_name" ] = "aghanim" + self.SignOutTable[ "player_list" ] = {} + self.SignOutTable[ "team_depth_list" ] = {} + + for nPlayerID = 0, AGHANIM_PLAYERS - 1 do + local SignOutPlayer = + { + steam_id = 0, + hero_id = 0, + battle_points = 0, + arcane_fragments = 0, + bonus_arcane_fragments = 0, + current_ascension_level = 0, + blessings = {}, + depth_list = {}, + } + table.insert( self.SignOutTable[ "player_list" ], nPlayerID, SignOutPlayer ) + + local netTable = {} + netTable[ "arcane_fragments" ] = 0 + netTable[ "battle_points" ] = 0 + CustomNetTables:SetTableValue( "currency_rewards", tostring( nPlayerID ), netTable ) + end +end + +-------------------------------------------------------------------------------- + +function CAghanim:RegisterEncounterStats( stats ) + + if stats.selectedRoom == nil and stats.unselectedRoom == nil then + return + end + + local depthInfo = {} + + if stats.selectedRoom ~= nil then + depthInfo.selected_encounter = stats.selectedRoom.szEncounterName + depthInfo.selected_elite = stats.selectedRoom.bIsElite + depthInfo.selected_hidden = stats.selectedRoom.bIsHidden + depthInfo.selected_reward = stats.selectedRoom.szReward + depthInfo.selected_encounter_type = stats.selectedRoom.nRoomType + + if stats.selectedRoom.ascensionAbilities ~= nil and #stats.selectedRoom.ascensionAbilities > 0 then + depthInfo.ascension_abilities = {} + for i=1,#stats.selectedRoom.ascensionAbilities do + local szAscensionAbility = stats.selectedRoom.ascensionAbilities[i] + depthInfo.ascension_abilities[ szAscensionAbility ] = GetAbilityTextureNameForAbility( szAscensionAbility ) + end + end + + end + + if stats.unselectedRoom ~= nil then + depthInfo.unselected_encounter = stats.unselectedRoom.szEncounterName + depthInfo.unselected_elite = stats.unselectedRoom.bIsElite + depthInfo.unselected_hidden = stats.unselectedRoom.bIsHidden + depthInfo.unselected_reward = stats.unselectedRoom.szReward + end + + self.SignOutTable[ "team_depth_list" ][ stats.depth ] = depthInfo + +end + +-------------------------------------------------------------------------------- + +function CAghanim:RegisterBlessingStat( nPlayerID, szBlessingName, nLevel, szActionName, nOrder ) + self.SignOutTable[ "player_list" ][ nPlayerID ].blessings[szBlessingName] = nLevel + + local blessings = CustomNetTables:GetTableValue( "game_global", "blessings" ) + if blessings[ tostring( nPlayerID) ] == nil then + blessings[ tostring( nPlayerID ) ] = {} + end + + blessings[ tostring( nPlayerID ) ][ szActionName ] = nOrder + CustomNetTables:SetTableValue( "game_global", "blessings", blessings ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:EnsurePlayerStatAtDepth( nPlayerID, szRoomDepth ) + + if self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth] == nil then + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth] = {} + end + +end + +-------------------------------------------------------------------------------- + +function CAghanim:RegisterRewardStats( nPlayerID, szRoomDepth, stats ) + + self:EnsurePlayerStatAtDepth( nPlayerID, szRoomDepth ) + + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].rarity = stats.selected_reward.rarity + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].selected_reward = stats.selected_reward.ability_name + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].selected_reward_value = stats.selected_reward.value + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].selected_reward_texture = stats.selected_reward.ability_texture + + for nIndex = 1,#stats.unselected_rewards do + local keyName = "unselected_reward" .. nIndex + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth][ keyName ] = stats.unselected_rewards[ nIndex ].ability_name + end + +end + +-------------------------------------------------------------------------------- + +function CAghanim:RegisterEncounterStartStats( nPlayerID, nDepth ) + + local szRoomDepth = tostring( nDepth ) + self:EnsurePlayerStatAtDepth( nPlayerID, szRoomDepth ) + + if self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].net_worth ~= nil then + return + end + + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].net_worth = PlayerResource:GetNetWorth( nPlayerID ) + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].level = PlayerResource:GetLevel( nPlayerID ) + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].death_count = 0 + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].kills = 0 + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].gold_bags = 0 + + --PrintTable( self.SignOutTable[ "player_list" ][ nPlayerID ] ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:RegisterPlayerDeathStat( nPlayerID, nDepth ) + + local scores = CustomNetTables:GetTableValue( "aghanim_scores", tostring(nPlayerID) ) + scores.death_count = scores.death_count + 1 + CustomNetTables:SetTableValue( "aghanim_scores", tostring(nPlayerID), scores ) + + local szRoomDepth = tostring( nDepth ) + self:EnsurePlayerStatAtDepth( nPlayerID, szRoomDepth ) + + if self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].death_count == nil then + return + end + + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].death_count = + self.SignOutTable[ "player_list" ][ nPlayerID ].depth_list[szRoomDepth].death_count + 1 + + --PrintTable( self.SignOutTable[ "player_list" ][ nPlayerID ] ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:GetConnectedPlayers( ) + local connectedPlayers = {} + for nPlayerID = 0, AGHANIM_PLAYERS - 1 do + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + if PlayerResource:IsValidPlayerID( nPlayerID ) and PlayerResource:GetConnectionState( nPlayerID ) ~= DOTA_CONNECTION_STATE_ABANDONED then + table.insert( connectedPlayers, nPlayerID ) + end + end + end + return connectedPlayers +end + +-------------------------------------------------------------------------------- + +function CAghanim:GrantAllPlayersPoints( nPoints, bBattlePoints, szReason ) + + local vecPoints = {} + + local connectedPlayers = self:GetConnectedPlayers() + for i=1,#connectedPlayers do + local nPlayerID = connectedPlayers[i] + vecPoints[ tostring(nPlayerID) ] = self:GrantPlayerPoints( nPlayerID, nPoints, bBattlePoints, szReason ) + end + + return vecPoints + +end + +-------------------------------------------------------------------------------- + +function CAghanim:GrantPlayerPoints( nPlayerID, nDesiredPoints, bBattlePoints, szReason ) + local Hero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + + -- Clamps the amount of points to the amount remaining + -- QUESTION: Should this also multiply the fragments by the bonus? + -- If so, we need to fix the GC to not do the 2x bonus grant, + -- or change the display to not match the underlying grant amount sent to the GC + local nPoints = self:RegisterCurrencyGrant( nPlayerID, nDesiredPoints, bBattlePoints ) + if nPoints == 0 then + return 0 + end + + local nDigits = string.len( tostring( nPoints ) ) + if bBattlePoints then + print ( "Awarding player " .. nPlayerID .. " " .. nPoints .. " battle points for " .. szReason ) + self.SignOutTable[ "player_list" ][ nPlayerID ][ "battle_points" ] = self.SignOutTable[ "player_list" ][ nPlayerID ][ "battle_points" ] + nPoints + if Hero then + local nFXIndex = ParticleManager:CreateParticleForPlayer( "particles/msg_fx/msg_bp.vpcf", PATTACH_CUSTOMORIGIN, nil, Hero:GetPlayerOwner() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, Hero, PATTACH_OVERHEAD_FOLLOW, nil, Hero:GetOrigin() + Vector( 0, 64, 96 ), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( 0, nPoints, -1 ) ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 1.0, nDigits + 1, 0 ) ) + ParticleManager:SetParticleControl( nFXIndex, 3, Vector( 255, 255, 0 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local nFXIndex2 = ParticleManager:CreateParticleForPlayer( "particles/generic_gameplay/battle_point_splash.vpcf", PATTACH_WORLDORIGIN, nil, Hero:GetPlayerOwner() ) + ParticleManager:SetParticleControl( nFXIndex2, 1, Hero:GetOrigin() ) + ParticleManager:ReleaseParticleIndex( nFXIndex2 ) + end + else + print ( "Awarding player " .. nPlayerID .. " " .. nPoints .. " arcane fragments for " .. szReason ) + self.SignOutTable[ "player_list" ][ nPlayerID ][ "arcane_fragments" ] = self.SignOutTable[ "player_list" ][ nPlayerID ][ "arcane_fragments" ] + nDesiredPoints + self.SignOutTable[ "player_list" ][ nPlayerID ][ "bonus_arcane_fragments" ] = self.SignOutTable[ "player_list" ][ nPlayerID ][ "bonus_arcane_fragments" ] + ( nPoints - nDesiredPoints ) + if Hero then + local nFXIndex = ParticleManager:CreateParticleForPlayer( "particles/msg_fx/msg_bp.vpcf", PATTACH_CUSTOMORIGIN, nil, Hero:GetPlayerOwner() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, Hero, PATTACH_OVERHEAD_FOLLOW, nil, Hero:GetOrigin() + Vector( 0, 64, 96 ), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( 0, nPoints, -1 ) ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 1.0, nDigits + 1, 0 ) ) + ParticleManager:SetParticleControl( nFXIndex, 3, Vector( 0, 255, 255 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local nFXIndex2 = ParticleManager:CreateParticleForPlayer( "particles/generic_gameplay/arcane_fragments_splash.vpcf", PATTACH_WORLDORIGIN, nil, Hero:GetPlayerOwner() ) + ParticleManager:SetParticleControl( nFXIndex2, 1, Hero:GetOrigin() ) + ParticleManager:ReleaseParticleIndex( nFXIndex2 ) + end + end + + local netTable = {} + netTable[ "arcane_fragments" ] = self.SignOutTable[ "player_list" ][ nPlayerID ][ "arcane_fragments" ] + self.SignOutTable[ "player_list" ][ nPlayerID ][ "bonus_arcane_fragments" ] + netTable[ "battle_points" ] = self.SignOutTable[ "player_list" ][ nPlayerID ][ "battle_points" ] + CustomNetTables:SetTableValue( "currency_rewards", tostring( nPlayerID ), netTable ) + + return nPoints + +end + + -------------------------------------------------------------------------------- + +function CAghanim:MarkGameWon() + self.bWonGame = true + + printf("======== ENDING GAME - VICTORY ==========\n"); + self:GetAnnouncer():OnGameWon() + GameRules.Aghanim:OnGameFinished() + GameRules:MakeTeamLose( DOTA_TEAM_BADGUYS ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:_CheckForDefeat() + if self.bPlayerHasSpawned == false then + return + end + + local bAnyHeroesAlive = false + local Heroes = HeroList:GetAllHeroes() + for _,Hero in pairs ( Heroes ) do + if Hero ~= nil then + -- TODO: make sure that servers will die when everyone DCs, since we don't want AFK checks for this mode + if Hero:IsRealHero() and Hero:GetTeamNumber() == DOTA_TEAM_GOODGUYS and + ( Hero:IsAlive() or Hero:IsReincarnating() or ( Hero:GetRespawnsDisabled() == false ) ) then + bAnyHeroesAlive = true + end + end + end + + if bAnyHeroesAlive == false then + printf("======== ENDING GAME ==========\n"); + self:GetAnnouncer():OnGameLost() + GameRules.Aghanim:OnGameFinished() + GameRules:MakeTeamLose( DOTA_TEAM_GOODGUYS ) + end + +end + +-------------------------------------------------------------------------------- + +function CAghanim:Dev_WinGame() + self:MarkGameWon() +end + +-------------------------------------------------------------------------------- + +function CAghanim:Dev_WinEncounter() + if self:GetCurrentRoom() and self:GetCurrentRoom():IsActivated() and self:GetCurrentRoom():GetEncounter() then + self:GetCurrentRoom():GetEncounter():Dev_ForceCompleteEncounter() + else + printf( "ERROR - win_encounter command failed" ) + end +end + +-------------------------------------------------------------------------------- + +function CAghanim:Dev_SetAscensionLevel( cmdName, szLevel ) + local nLevel = tonumber( szLevel ) + self:SetAscensionLevel( nLevel ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:Dev_SetNewPlayers( cmdName, szNewPlayers ) + self.bHasAnyNewPlayers = tonumber( szNewPlayers ) > 0 +end + +-------------------------------------------------------------------------------- + +function CAghanim:Dev_ExtraLives() + + local nPlayerID = Entities:GetLocalPlayer():GetPlayerID() + + --for nPlayerID = 0, ( DOTA_MAX_TEAM_PLAYERS - 1 ) do + -- if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero ~= nil then + printf("adding lives to %d", nPlayerID) + hPlayerHero.nRespawnsRemaining = math.min( AGHANIM_MAX_LIVES, hPlayerHero.nRespawnsRemaining + 1 ) + CustomGameEventManager:Send_ServerToPlayer( hPlayerHero:GetPlayerOwner(), "gained_life", {} ) + CustomNetTables:SetTableValue( "respawns_remaining", string.format( "%d", hPlayerHero:entindex() ), { respawns = hPlayerHero.nRespawnsRemaining } ) + end + + --end + --end +end + +-------------------------------------------------------------------------------- + +function CAghanim:Dev_TestEncounter( cmdName, szEncounterName, szIsElite ) + + local nEliteDepthBonus = 0 + if szIsElite ~= nil then + nEliteDepthBonus = tonumber( szIsElite ) + if nEliteDepthBonus > 0 then + nEliteDepthBonus = 1 + end + end + + local encounterDef = ENCOUNTER_DEFINITIONS[ szEncounterName ] + if encounterDef == nil then + printf( "%s: Invalid encounter %s", cmdName, szEncounterName ) + return + end + + local nRoomDepth = encounterDef.nMinDepth + + local hFinalRoom = self:GetCurrentRoom() + if hFinalRoom == nil then + printf( "%s: Can't use since we're still loading", cmdName ) + return + end + + local nCurrDepth = hFinalRoom:GetDepth() + + if nRoomDepth <= nCurrDepth then + printf( "%s: You're already at the same or lower depth %d than you requested [%d]", cmdName, nCurrDepth, nRoomDepth ) + return + end + + printf( "Running %s %s %d %d [%s %d]...", cmdName, szEncounterName, nRoomDepth, nEliteDepthBonus, hFinalRoom:GetName(), nCurrDepth ) + + -- Find the room we will do the encounter in, as well as the previous room + self.testEncounter = + { + hPrevPrevRoom = nil, + hPrevRoom = nil, + hFinalRoom = hFinalRoom, + rewardClaimList = {}, + } + + self.debugItemsToStuffInCrate = + { + RoomReward = {} + } + + for i=nCurrDepth+1, nRoomDepth do + + -- Find the first valid exit + self.testEncounter.hPrevPrevRoom = self.testEncounter.hPrevRoom + self.testEncounter.hPrevRoom = self.testEncounter.hFinalRoom + for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do + local szExitRoomName = self.testEncounter.hPrevRoom:GetExit( nExitDirection ) + if szExitRoomName ~= nil then + self.testEncounter.hFinalRoom = GameRules.Aghanim:GetRoom( szExitRoomName ) + if self.testEncounter.hFinalRoom:GetDepth() ~= i then + print( "unexpected depth in room " .. self.testEncounter.hFinalRoom:GetName() ) + end + table.insert( self.testEncounter.rewardClaimList, self.testEncounter.hFinalRoom ) + break + end + end + + end + + -- Don't claim the room we're going to, not should we claim the one right before the selected room; + -- we're going to Dev_WinEncounter that one after teleporting there + + -- This is the target room + table.remove( self.testEncounter.rewardClaimList, #self.testEncounter.rewardClaimList ) + + -- This is the room before the target room + if #self.testEncounter.rewardClaimList > 0 then + table.remove( self.testEncounter.rewardClaimList, #self.testEncounter.rewardClaimList ) + end + + -- Win the current room assuming we haven't already won + if self:GetCurrentRoom():GetDepth() ~= 1 and self:GetCurrentRoom():GetEncounter():IsComplete() == false then + self:Dev_WinEncounter() + self:GetCurrentRoom():GetEncounter():TryCompletingMapEncounter() + self:GetCurrentRoom():GetEncounter():GenerateRewards() + end + + -- Change the encounter in the final room to the desired one + self.testEncounter.hFinalRoom:SetEliteDepthBonus( nEliteDepthBonus ) + self.testEncounter.hFinalRoom:AssignEncounter( szEncounterName ) + self.testEncounter.hFinalRoom:GetEncounter():SelectAscensionAbilities() + + -- We're going to be teleporting into the previous room, so we need to stream that in + if self.testEncounter.hPrevPrevRoom ~= nil then + self.testEncounter.hPrevPrevRoom:LoadExitRooms() + end + + -- Also start the previous room streaming in the final room. Note that this can + -- be done simultaneously as the prev prev room, since once LoadExitRooms was called, + -- the system knows the height of the maps to spawn to correct connect to prev prev + -- NOTE that if hPrevRoom == the current room, this will be the second call to + -- LoadExitRooms on the same room, but the code is tolerant of that + self.testEncounter.hPrevRoom:LoadExitRooms() + + -- Next we must start a think function where we do two things + -- 1) Wait for the exit rooms to be loaded + -- 2) Make all players claim rewards for all intervening rooms + GameRules:GetGameModeEntity():SetThink( "OnTestEncounterThink", self, "TestEncounterThink", 0.5 ) + +end + +-------------------------------------------------------------------------------- + +function CAghanim:GrantEstimatedRoomRewards( hRoom ) + + local nMinValue, nMaxValue = GetMinMaxGoldChoiceReward( hRoom:GetEncounter():GetDepth(), false ) + local nQuantity = math.random( nMinValue, nMaxValue ) / 3 -- *1/3 since it's 1/3 likely you'll pick it + + for nPlayerID = 0, ( DOTA_MAX_TEAM_PLAYERS - 1 ) do + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + PlayerResource:ModifyGold( nPlayerID, nQuantity, true, DOTA_ModifyGold_Unspecified ) + end + end + +end + +-------------------------------------------------------------------------------- + +function CAghanim:DetermineRewardSelectionState() + + local CurrentRoom = CustomNetTables:GetTableValue( "reward_options", "current_depth" ) + if CurrentRoom == nil then + return nil + end + + local szRoomDepth = CurrentRoom["1"]; + local rewardOptions = CustomNetTables:GetTableValue( "reward_options", szRoomDepth ) + if rewardOptions == nil then + return nil + end + + local netTable = CustomNetTables:GetTableValue( "reward_choices", szRoomDepth ) + if netTable == nil then + return nil + end + + local vecPlayerIDs = self:GetConnectedPlayers( ) + if #vecPlayerIDs == 0 then + return nil + end + + local rewardState = {} + for i=1,#vecPlayerIDs do + local nPlayerID = vecPlayerIDs[i] + local bHasChosen = ( netTable[ tostring(nPlayerID) ] ~= nil ) + rewardState[ tostring(nPlayerID) ] = bHasChosen + end + + return rewardState +end + +-------------------------------------------------------------------------------- + +function CAghanim:HaveAllRewardsBeenSelected() + + local CurrentRoom = CustomNetTables:GetTableValue( "reward_options", "current_depth" ) + if CurrentRoom == nil then + return false + end + + local szRoomDepth = CurrentRoom["1"]; + + --print( "HaveAllRewardsBeenSelected depth " .. szRoomDepth ) + + -- Some depths don't give rewards. If we hit this, then it's ok; exit out. + local rewardOptions = CustomNetTables:GetTableValue( "reward_options", szRoomDepth ) + if rewardOptions == nil then + return true + end + + --print( "Waiting for choices " ) + + -- Check to see if all players have made choices yet at the current depth + local netTable = CustomNetTables:GetTableValue( "reward_choices", szRoomDepth ) + if netTable == nil then + return false + end + + local vecPlayerIDs = self:GetConnectedPlayers( ) + for i=1,#vecPlayerIDs do + local nPlayerID = vecPlayerIDs[i] + if netTable[ tostring(nPlayerID) ] == nil then + --print( "Player not done choosing " .. nPlayerID ) + return false + end + end + + return true +end + + +-------------------------------------------------------------------------------- + +function CAghanim:OnTestEncounterThink() + + -- First handle all rewards being selected + local CurrentRoom = CustomNetTables:GetTableValue( "reward_options", "current_depth" ) + if CurrentRoom == nil then + return 1 + end + + local szRoomDepth = CurrentRoom["1"]; + + --print( "OnTestEncounterThink depth " .. szRoomDepth ) + + if self:HaveAllRewardsBeenSelected() == false then + return 1 + end + + -- Once all players have made a choice, deal with claiming the next depth + --print( "Claiming next depth " ) + if #self.testEncounter.rewardClaimList > 0 then + --print( "Claiming rewards for room " .. self.testEncounter.rewardClaimList[1]:GetName() .. " depth " .. self.testEncounter.rewardClaimList[1]:GetDepth() ) + if ( tonumber( szRoomDepth ) + 1 ) ~= self.testEncounter.rewardClaimList[1]:GetDepth() then + printf( "Warning!! Unexpected depth in claim list [was %d, expected %d]!!", self.testEncounter.rewardClaimList[1]:GetDepth(), tonumber( szRoomDepth ) + 1 ) + end + + local hRoom = self.testEncounter.rewardClaimList[1] + hRoom:GetEncounter():RegisterSummonForAghanim() + hRoom:GetEncounter():GenerateRewards() + self:GrantEstimatedRoomRewards( hRoom ) + table.remove( self.testEncounter.rewardClaimList, 1 ) + + if self.bFastTestEncounter == true then + for nPlayerID = 0, ( DOTA_MAX_TEAM_PLAYERS - 1 ) do + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + -- Select the first option for each player + local hChoice = + { + PlayerID = nPlayerID, + room_depth = hRoom:GetDepth(), + reward_index = 1, + } + OnRewardChoice( nil, hChoice ) + end + end + end + + return 1 + end + + -- If we're here, then all players have selected all rewards + -- Next handle streaming of the rooms + if self.testEncounter.hPrevPrevRoom ~= nil then + --print( "Testing for stream in" .. self.testEncounter.hPrevPrevRoom:GetName() ) + if not self.testEncounter.hPrevPrevRoom:AreAllExitRoomsReady() then + return 1 + end + + --print( "Selected " .. self.testEncounter.hPrevPrevRoom:GetName() .. " -> " .. self.testEncounter.hPrevRoom:GetName() ) + self.testEncounter.hPrevPrevRoom:OnNextRoomSelected( self.testEncounter.hPrevRoom:GetName() ) + self.testEncounter.hPrevPrevRoom = nil + + -- Wait for a tick to make sure all the spawn group shenanigans are done so we can teleport in + return 1 + end + + if self:GetCurrentRoom() ~= self.testEncounter.hPrevRoom then + + if self.testEncounter.bHasTeleported then + return 1 + end + + --print( "Testing for stream in" .. self.testEncounter.hPrevRoom:GetName() ) + if not self.testEncounter.hPrevRoom:AreAllExitRoomsReady() then + return 1 + end + + -- teleport all players into the prev room, we're ready to go + local vTeleportTarget = self.testEncounter.hPrevRoom:GetOrigin() + local hEndLocators = self.testEncounter.hPrevRoom:FindAllEntitiesInRoomByName( "encounter_end_locator", true ) + if #hEndLocators > 0 then + vTeleportTarget = hEndLocators[1]:GetAbsOrigin() + end + + for nPlayerID = 0, ( DOTA_MAX_TEAM_PLAYERS - 1 ) do + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero ~= nil then + FindClearSpaceForUnit( hPlayerHero, vTeleportTarget, true ) + CenterCameraOnUnit( nPlayerID, hPlayerHero ) + end + end + end + + self.testEncounter.bHasTeleported = true + return 1 + end + + -- Ok, we've teleported. Now we can finish the prev room and get its rewards + self:Dev_WinEncounter() + self.testEncounter = nil + + -- Disable thinking + return nil +end + +function CAghanim:GetTestEncounterDebugRoom() + if self.testEncounter == nil then + return nil + end + return self.testEncounter.hPrevRoom +end diff --git a/aghanim_singleplayer/scripts/vscripts/aghanim_ability_upgrade_constants.lua b/aghanim_singleplayer/scripts/vscripts/aghanim_ability_upgrade_constants.lua new file mode 100755 index 0000000..3bdd090 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/aghanim_ability_upgrade_constants.lua @@ -0,0 +1,404 @@ +LinkLuaModifier( "modifier_minor_ability_upgrades", "modifiers/modifier_minor_ability_upgrades", LUA_MODIFIER_MOTION_NONE ) + +_G.MINOR_ABILITY_UPGRADE_OP_ADD = 1 +_G.MINOR_ABILITY_UPGRADE_OP_MUL = 2 + + +_G.MINOR_ABILITY_UPGRADES = +{ + npc_dota_hero_magnataur = require( "minor_ability_upgrades/minor_ability_upgrades_magnataur" ), + npc_dota_hero_phantom_assassin = require( "minor_ability_upgrades/minor_ability_upgrades_phantom_assassin" ), + npc_dota_hero_snapfire = require( "minor_ability_upgrades/minor_ability_upgrades_snapfire" ), + npc_dota_hero_disruptor = require( "minor_ability_upgrades/minor_ability_upgrades_disruptor" ), + npc_dota_hero_winter_wyvern = require( "minor_ability_upgrades/minor_ability_upgrades_winter_wyvern" ), + npc_dota_hero_tusk = require( "minor_ability_upgrades/minor_ability_upgrades_tusk" ), + npc_dota_hero_ursa = require( "minor_ability_upgrades/minor_ability_upgrades_ursa" ), + npc_dota_hero_sniper = require( "minor_ability_upgrades/minor_ability_upgrades_sniper" ), + npc_dota_hero_mars = require( "minor_ability_upgrades/minor_ability_upgrades_mars" ), + npc_dota_hero_viper = require( "minor_ability_upgrades/minor_ability_upgrades_viper" ), + npc_dota_hero_weaver = require( "minor_ability_upgrades/minor_ability_upgrades_weaver" ), + npc_dota_hero_omniknight = require( "minor_ability_upgrades/minor_ability_upgrades_omniknight" ), + npc_dota_hero_witch_doctor = require( "minor_ability_upgrades/minor_ability_upgrades_witch_doctor" ), + + + --non hero specific upgrades (bonus HP/mana/damage/etc.) + base_stats_upgrades = require( "minor_ability_upgrades/base_minor_stats_upgrades" ), +} +_G.STAT_UPGRADE_EXCLUDES = +{ + npc_dota_hero_omniknight = + { + "aghsfort_minor_stat_upgrade_bonus_attack_speed", + }, + + npc_dota_hero_magnataur = + { + "aghsfort_minor_stat_upgrade_bonus_health", + }, + + npc_dota_hero_winter_wyvern = + { + "aghsfort_minor_stat_upgrade_bonus_evasion", + }, + + npc_dota_hero_disruptor = + { + "aghsfort_minor_stat_upgrade_bonus_evasion", + }, + + npc_dota_hero_snapfire = + { + "aghsfort_minor_stat_upgrade_bonus_evasion", + }, + + npc_dota_hero_tusk = + { + "aghsfort_minor_stat_upgrade_bonus_health", + }, + + npc_dota_hero_ursa = + { + "aghsfort_minor_stat_upgrade_bonus_spell_amp", + }, + + npc_dota_hero_sniper = + { + "aghsfort_minor_stat_upgrade_bonus_evasion", + }, + + npc_dota_hero_mars = + { + "aghsfort_minor_stat_upgrade_bonus_health", + }, + + npc_dota_hero_viper = + { + "aghsfort_minor_stat_upgrade_bonus_magic_resist", + }, + + npc_dota_hero_weaver = + { + "aghsfort_minor_stat_upgrade_bonus_spell_amp", + }, + + npc_dota_hero_witch_doctor = + { + "aghsfort_minor_stat_upgrade_bonus_attack_damage", + "aghsfort_minor_stat_upgrade_bonus_evasion", + }, +} + +_G.ULTIMATE_ABILITY_NAMES = +{ + npc_dota_hero_omniknight = "omniknight_guardian_angel", + npc_dota_hero_magnataur = "magnataur_reverse_polarity_radius", + npc_dota_hero_phantom_assassin = "phantom_assassin_coup_de_grace", + npc_dota_hero_winter_wyvern = "winter_wyvern_winters_curse", + npc_dota_hero_disruptor = "disruptor_static_storm", + npc_dota_hero_snapfire = "snapfire_mortimer_kisses", + npc_dota_hero_tusk = "tusk_walrus_punch", + npc_dota_hero_ursa = "ursa_enrage", + npc_dota_hero_sniper = "sniper_assassinate", + npc_dota_hero_mars = "mars_arena_of_blood", + npc_dota_hero_viper = "viper_viper_strike", + npc_dota_hero_weaver = "weaver_time_lapse", + npc_dota_hero_witch_doctor = "witch_doctor_death_ward", + +} + +-- Lists for ability upgrades go here +_G.SPECIAL_ABILITY_UPGRADES = {} + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_omniknight"] = +{ + -- "aghsfort_special_omniknight_purification_cast_radius", + "aghsfort_special_omniknight_purification_charges", + -- "aghsfort_special_omniknight_purification_cooldown_reduction", + "aghsfort_special_omniknight_purification_multicast", + + "aghsfort_special_omniknight_repel_procs_purification", + "aghsfort_special_omniknight_repel_outgoing_damage", + --"aghsfort_special_omniknight_repel_applies_degen_aura", --needs some re-write to make it work in all cases and doesn't seem interesting anyway + "aghsfort_special_omniknight_repel_damage_instance_refraction", + "aghsfort_special_omniknight_repel_knockback_on_cast", + + "aghsfort_special_omniknight_degen_aura_toggle", + "aghsfort_special_omniknight_degen_aura_damage", + "aghsfort_special_omniknight_degen_aura_restoration", + + "aghsfort_special_omniknight_guardian_angel_purification", + -- "aghsfort_special_omniknight_guardian_angel_immune_flight", + --"aghsfort_special_omniknight_guardian_angel_single_target", + -- "aghsfort_special_omniknight_guardian_angel_single_target_dummy", + +} + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_magnataur"] = +{ + "aghsfort_special_magnataur_shockwave_multishot", + -- "aghsfort_special_magnataur_shockwave_damage_reduction", + "aghsfort_special_magnataur_shockwave_boomerang", + + -- "aghsfort_special_magnataur_empower_all_allies", + "aghsfort_special_magnataur_empower_lifesteal", + "aghsfort_special_magnataur_empower_shockwave_on_attack", + + --"aghsfort_special_magnataur_skewer_original_scepter", + --"aghsfort_special_magnataur_friendly_skewer", + "aghsfort_special_magnataur_skewer_bonus_strength", + -- "aghsfort_special_magnataur_skewer_heal", + "aghsfort_special_magnataur_skewer_shockwave", + + --"aghsfort_special_magnataur_reverse_polarity_radius", + -- "aghsfort_special_magnataur_reverse_polarity_polarity_dummy", + "aghsfort_special_magnataur_reverse_polarity_allies_crit", + "aghsfort_special_magnataur_reverse_polarity_steroid", +} + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_phantom_assassin"] = +{ + -- "aghsfort_special_phantom_assassin_coup_de_grace_marks_target", + "aghsfort_special_phantom_assassin_coup_de_grace_bloody_debuff", + "aghsfort_special_phantom_assassin_coup_de_grace_kills_refresh", + + "aghsfort_special_phantom_assassin_stifling_dagger_no_secondary_dagger_restriction", + "aghsfort_special_phantom_assassin_stifling_dagger_on_attack", + "aghsfort_special_phantom_assassin_stifling_dagger_autodagger", + + "aghsfort_special_phantom_assassin_blur_regen_when_active", + -- "aghsfort_special_phantom_assassin_blur_dagger_on_end", + "aghsfort_special_phantom_assassin_blur_immediate", + + -- "aghsfort_special_phantom_assassin_phantom_strike_buff_allies", + "aghsfort_special_phantom_assassin_phantom_strike_mastery", + "aghsfort_special_phantom_assassin_phantom_strike_damage_reduction", +} + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_luna"] = +{ + "omniknight_guardian_angel", + "aghsfort_special_omniknight_purification_cast_radius", + "omniknight_purification", +} + + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_winter_wyvern"] = +{ + "aghsfort_special_winter_wyvern_arctic_burn_splitshot", + -- "aghsfort_special_winter_wyvern_arctic_burn_doubleattack", + --"aghsfort_special_winter_wyvern_arctic_burn_nomana", + "aghsfort_special_winter_wyvern_arctic_burn_splash_damage", + + "aghsfort_special_winter_wyvern_splinter_blast_main_target_hit", + "aghsfort_special_winter_wyvern_splinter_blast_vacuum", + -- "aghsfort_special_winter_wyvern_splinter_blast_heal", + + -- "aghsfort_special_winter_wyvern_cold_embrace_charges", + "aghsfort_special_winter_wyvern_cold_embrace_blast_on_end", + "aghsfort_special_winter_wyvern_cold_embrace_magic_damage_block", + + "aghsfort_special_winter_wyvern_winters_curse_transfer", + "aghsfort_special_winter_wyvern_winters_curse_damage_amp", + -- "aghsfort_special_winter_wyvern_winters_curse_heal_on_death", +} + + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_disruptor"] = +{ + "aghsfort_special_disruptor_thunder_strike_interval_upgrade", + -- "aghsfort_special_disruptor_thunder_strike_mana_restore", + "aghsfort_special_disruptor_thunder_strike_crit_chance", + "aghsfort_special_disruptor_thunder_strike_on_attack", + +-- "aghsfort_special_disruptor_glimpse_cast_aoe", + -- "aghsfort_special_disruptor_glimpse_hit_on_arrival", + -- "aghsfort_special_disruptor_glimpse_travel_damage", + + --"aghsfort_special_disruptor_kinetic_field_instant_setup", + "aghsfort_special_disruptor_kinetic_field_damage", + "aghsfort_special_disruptor_kinetic_field_allied_heal", + "aghsfort_special_disruptor_kinetic_field_allied_attack_buff", + "aghsfort_special_disruptor_kinetic_field_double_ring", + + "aghsfort_special_disruptor_static_storm_kinetic_field_on_cast", + "aghsfort_special_disruptor_static_storm_crits_on_attacks", + -- "aghsfort_special_disruptor_static_storm_damage_reduction", +} + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_snapfire"] = +{ + "aghsfort_special_snapfire_scatterblast_double_barrel", + -- "aghsfort_special_snapfire_scatterblast_knockback", + -- "aghsfort_special_snapfire_scatterblast_fullrange_pointblank", + "aghsfort_special_snapfire_scatterblast_barrage", + + -- "aghsfort_special_snapfire_firesnap_cookie_multicookie", + -- "aghsfort_special_snapfire_firesnap_cookie_enemytarget", + "aghsfort_special_snapfire_firesnap_cookie_allied_buff", + + "aghsfort_special_snapfire_lil_shredder_explosives", + -- "aghsfort_special_snapfire_lil_shredder_ally_cast", + "aghsfort_special_snapfire_lil_shredder_bouncing_bullets", + + "aghsfort_special_snapfire_mortimer_kisses_fragmentation", +-- "aghsfort_special_snapfire_mortimer_kisses_fire_trail", + "aghsfort_special_snapfire_mortimer_kisses_autoattack", + "aghsfort_special_snapfire_mortimer_kisses_incoming_damage_reduction", +} + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_tusk"] = +{ + "aghsfort_special_tusk_ice_shards_circle", + -- "aghsfort_special_tusk_ice_shards_secondary", + "aghsfort_special_tusk_ice_shards_explode", + "aghsfort_special_tusk_ice_shards_stun", + + -- "aghsfort_special_tusk_snowball_heal", + "aghsfort_special_tusk_snowball_end_damage", + -- "aghsfort_special_tusk_snowball_global", + + "aghsfort_special_tusk_tag_team_lifesteal", + "aghsfort_special_tusk_tag_team_toggle", + -- "aghsfort_special_tusk_tag_team_global", + + "aghsfort_special_tusk_walrus_punch_reset", + "aghsfort_special_tusk_walrus_punch_land_damage", + "aghsfort_special_tusk_walrus_punch_wallop", +} + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_ursa"] = +{ + "aghsfort_special_ursa_earthshock_invis", + "aghsfort_special_ursa_earthshock_knockback", + "aghsfort_special_ursa_earthshock_apply_fury_swipes", + "aghsfort_special_ursa_earthshock_overpower_stack", + --"aghsfort_special_ursa_earthshock_apply_fury_swipes", -- bugged + + "aghsfort_special_ursa_overpower_crit", + -- "aghsfort_special_ursa_overpower_evasion", + "aghsfort_special_ursa_overpower_cleave", + -- "aghsfort_special_ursa_overpower_taunt", + + "aghsfort_special_ursa_fury_swipes_armor_reduction", + "aghsfort_special_ursa_fury_swipes_lifesteal", + -- "aghsfort_special_ursa_fury_swipes_ursa_minor", + + --"aghsfort_special_ursa_enrage_magic_immunity", + -- "aghsfort_special_ursa_enrage_allies", + -- "aghsfort_special_ursa_enrage_fear", + "aghsfort_special_ursa_enrage_earthshock", + "aghsfort_special_ursa_enrage_attack_speed", +} + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_sniper"] = +{ + "aghsfort_special_sniper_shrapnel_bombs", + "aghsfort_special_sniper_shrapnel_attack_speed", + "aghsfort_special_sniper_shrapnel_miss_chance", + --"aghsfort_special_sniper_shrapnel_move_speed", + + "aghsfort_special_sniper_headshot_crits", + -- "aghsfort_special_sniper_headshot_stuns", + + "aghsfort_special_sniper_take_aim_self_purge", + --"aghsfort_special_sniper_take_aim_aoe", -- bugged + "aghsfort_special_sniper_take_aim_hop_backwards", + "aghsfort_special_sniper_take_aim_armor_reduction", + -- "aghsfort_special_sniper_take_aim_rapid_fire", + + "aghsfort_special_sniper_assassinate_buckshot", + -- "aghsfort_special_sniper_assassinate_original_scepter", + -- "aghsfort_special_sniper_assassinate_killshot", +} + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_mars"] = +{ + "aghsfort_special_mars_spear_multiskewer", + "aghsfort_special_mars_spear_impale_explosion", + "aghsfort_special_mars_spear_burning_trail", + + "aghsfort_special_mars_gods_rebuke_full_circle", + "aghsfort_special_mars_gods_rebuke_stun", + "aghsfort_special_mars_gods_rebuke_strength_buff", + + --"aghsfort_special_mars_bulwark_counter_rebuke", + --"aghsfort_special_mars_bulwark_healing", + "aghsfort_special_mars_bulwark_return", + "aghsfort_special_mars_bulwark_spears", + -- "aghsfort_special_mars_bulwark_soldiers", + + "aghsfort_special_mars_arena_of_blood_outside_perimeter", + --"aghsfort_special_mars_arena_of_blood_fear", + "aghsfort_special_mars_arena_of_blood_global", + -- "aghsfort_special_mars_arena_of_blood_attack_buff", +} +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_viper"] = +{ + "aghsfort_special_viper_poison_attack_spread", + "aghsfort_special_viper_poison_attack_explode", + "aghsfort_special_viper_poison_snap", + + "aghsfort_special_viper_nethertoxin_lifesteal", + "aghsfort_special_viper_nethertoxin_charges", + "aghsfort_special_viper_nethertoxin_persist", + + -- "aghsfort_special_viper_corrosive_skin_speed_steal", + "aghsfort_special_viper_corrosive_skin_flying", + -- "aghsfort_special_viper_corrosive_skin_aura", + + -- "aghsfort_special_viper_viper_strike_allies", + --"aghsfort_special_viper_channeled_viper_strike", + "aghsfort_special_viper_periodic_strike", + "aghsfort_special_viper_chain_viper_strike", +} + + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_weaver"] = +{ + -- "aghsfort_special_weaver_swarm_allies", + "aghsfort_special_weaver_swarm_explosion", + "aghsfort_special_weaver_swarm_damage_transfer", + + "aghsfort_special_weaver_geminate_attack_splitshot", + "aghsfort_special_weaver_geminate_attack_applies_swarm", + "aghsfort_special_weaver_geminate_attack_lifesteal", + -- "aghsfort_special_weaver_geminate_attack_knockback", + + + + -- "aghsfort_special_weaver_shukuchi_pull", + "aghsfort_special_weaver_shukuchi_trail", + -- "aghsfort_special_weaver_shukuchi_heal", + "aghsfort_special_weaver_shukuchi_attack_on_completion", + "aghsfort_special_weaver_shukuchi_swarm", + --"aghsfort_special_weaver_shukuchi_greater_invisibility", + + -- "aghsfort_special_weaver_time_lapse_allies", + -- "aghsfort_special_weaver_time_lapse_restoration", + "aghsfort_special_weaver_time_lapse_explosion", +} + +SPECIAL_ABILITY_UPGRADES["npc_dota_hero_witch_doctor"] = +{ + + "aghsfort_special_witch_doctor_paralyzing_cask_multicask", + "aghsfort_special_witch_doctor_paralyzing_cask_applies_maledict", + "aghsfort_special_witch_doctor_paralyzing_cask_aoe_damage", + "aghsfort_special_witch_doctor_paralyzing_cask_attack_procs", + + --"aghsfort_special_witch_doctor_maledict_ground_curse", + "aghsfort_special_witch_doctor_maledict_aoe_procs", + "aghsfort_special_witch_doctor_maledict_death_restoration", + -- "aghsfort_special_witch_doctor_maledict_affects_allies", + "aghsfort_special_witch_doctor_maledict_infectious", + + "aghsfort_special_witch_doctor_voodoo_restoration_enemy_damage", + -- "aghsfort_special_witch_doctor_voodoo_restoration_lifesteal", + "aghsfort_special_witch_doctor_voodoo_restoration_damage_amp", + -- "aghsfort_special_witch_doctor_voodoo_restoration_mana_restore", + + "aghsfort_special_witch_doctor_death_ward_no_channel", + "aghsfort_special_witch_doctor_death_ward_splitshot", + "aghsfort_special_witch_doctor_death_ward_damage_resist", + --"aghsfort_special_witch_doctor_death_ward_bounce", +} \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/aghanim_ability_upgrade_interface.lua b/aghanim_singleplayer/scripts/vscripts/aghanim_ability_upgrade_interface.lua new file mode 100755 index 0000000..082ae7e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/aghanim_ability_upgrade_interface.lua @@ -0,0 +1,40 @@ +-------------------------------------------------------------------------------- + +function CAghanim:OnAbilityUpgradeButtonClicked( eventSourceIndex, data ) + -- Grants the + local nPlayerID = data["PlayerID"] + local szAbilityName = data["AbilityName"] + local bIsLevelReward = data["LevelReward"] + --print ("OnAbilityUpgradeButtonClicked", nPlayerID, szAbilityName, bIsLevelReward, self.bTestingAbilityUpgrades) + if bIsLevelReward == true or self.bTestingAbilityUpgrades == true then + if nPlayerID ~= nil and szAbilityName ~= nil then + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero ~= nil then + CustomGameEventManager:Send_ServerToAllClients( "special_ability_upgrades_button_clicked", data ) + if ( hPlayerHero:FindAbilityByName(szAbilityName) ~= nil ) then + -- Only grant an ability once (can be changed if necessary) + hPlayerHero:RemoveAbility(szAbilityName) + --print ("Removing ability:", szAbilityName) + else + local hNewAbility = hPlayerHero:AddAbility( szAbilityName ) + if ( hNewAbility ) then + -- Grants and upgrades the ability + hNewAbility:UpgradeAbility( false ) + --print ("Adding new ability", szAbilityName) + end + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function CAghanim:TestAbilityUpgradesUICC ( cmdName, bVisible ) + -- Enables the button to open the dev upgrade UI + print ("TestAbilityUpgradesUI Enabled ") + + self.bTestingAbilityUpgrades = true + CustomGameEventManager:Send_ServerToAllClients( "special_ability_upgrades_enabled", {} ) + +end diff --git a/aghanim_singleplayer/scripts/vscripts/aghanim_utility_functions.lua b/aghanim_singleplayer/scripts/vscripts/aghanim_utility_functions.lua new file mode 100755 index 0000000..368a609 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/aghanim_utility_functions.lua @@ -0,0 +1,111 @@ +function GetAliveHeroesInRoom( ) + + local heroes = {} + for nPlayerID = 0, ( DOTA_MAX_TEAM_PLAYERS - 1 ) do + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero and hPlayerHero:IsAlive() and GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( hPlayerHero:GetAbsOrigin() ) then + table.insert( heroes, hPlayerHero ) + end + end + end + + return heroes + +end + +function GetAliveHeroes( ) + + local heroes = {} + for nPlayerID = 0, ( DOTA_MAX_TEAM_PLAYERS - 1 ) do + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero and hPlayerHero:IsAlive() then + table.insert( heroes, hPlayerHero ) + end + end + end + + return heroes + +end + +function FindRandomPointInRoom( vSourcePos, nMinDistance, nMaxDistance ) + + local nAttempts = 0 + local nMaxAttempts = 16 + + while nAttempts < nMaxAttempts do + local vPos = vSourcePos + RandomVector( RandomFloat( nMinDistance, nMaxDistance ) ) + if GameRules.Aghanim:GetCurrentRoom():IsValidSpawnPoint( vPos ) then + return vPos + end + nAttempts = nAttempts + 1 + end + + -- Failed, just return the center of the room, + randomness + return GameRules.Aghanim:GetCurrentRoom():GetOrigin() + RandomVector( RandomFloat( 0, 500 ) ) + +end + +function FindPathablePositionNearby( vSourcePos, nMinDistance, nMaxDistance ) + local vPos = FindRandomPointInRoom( vSourcePos, nMinDistance, nMaxDistance ) + + local nAttempts = 0 + local nMaxAttempts = 7 + + while ( ( not GridNav:CanFindPath( vSourcePos, vPos ) ) and ( nAttempts < nMaxAttempts ) ) do + vPos = FindRandomPointInRoom( vSourcePos, nMinDistance, nMaxDistance ) + nAttempts = nAttempts + 1 + end + + return vPos +end + +--------------------------------------------------------------------------- + +function LaunchGoldBag( nGoldAmount, vDropPos, vDropTarget ) + + local newItem = CreateItem( "item_bag_of_gold", nil, nil ) + newItem:SetPurchaseTime( 0 ) + newItem.nGoldAmount = nGoldAmount + + -- curve fitting black magic + local flGoldBagScale = 40.63019 + (-0.4869773 - 40.63019)/(1 + math.pow(nGoldAmount/7576116000, 0.1814258)) + + flGoldBagScale = math.min( flGoldBagScale, 3) + flGoldBagScale = math.max( flGoldBagScale, 0.7) + + local newItemPhysical = CreateItemOnPositionSync( vDropPos, newItem ) + newItemPhysical:SetModelScale( flGoldBagScale ) + + if vDropTarget == nil then + vDropTarget = FindRandomPointInRoom( vDropPos, 100, 150 ) + end + + newItem:LaunchLoot( true, 75, 0.75, vDropTarget ) + + return newItem +end + +-------------------------------------------------------------------------------- + +function FindRealLivingEnemyHeroesInRadius( nFriendlyTeamNumber, vPosition, flRange ) + + local hRealHeroes = {} + + local hEnemies = FindUnitsInRadius( nFriendlyTeamNumber, vPosition, nil, flRange, + DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, + DOTA_UNIT_TARGET_FLAG_NOT_ILLUSIONS, FIND_CLOSEST, false ) + + for _,hHero in pairs(hEnemies) do + if hHero:IsAlive() and hHero:IsRealHero() and not hHero:IsTempestDouble() and not hHero:IsClone() then + table.insert( hRealHeroes, hHero ) + end + end + + return hRealHeroes + +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ai_assault_captain.lua b/aghanim_singleplayer/scripts/vscripts/ai/ai_assault_captain.lua new file mode 100755 index 0000000..7fe00fe --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ai_assault_captain.lua @@ -0,0 +1,203 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.fOrigModelScale = thisEntity:GetModelScale() + + thisEntity:AddNewModifier( nil, nil, "modifier_phased", { duration = -1 } ) + + thisEntity.hSunRayAbility = thisEntity:FindAbilityByName( "assault_captain_sun_ray" ) + thisEntity.hChainsAbility = thisEntity:FindAbilityByName( "assault_captain_searing_chains" ) + + thisEntity:SetContextThink( "AssaultCaptainThink", AssaultCaptainThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function Precache( context ) + PrecacheResource( "particle", "particles/creeps/lane_creeps/creep_dire_hulk_swipe_right.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ember_spirit/ember_spirit_searing_chains_start.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ember_spirit/ember_spirit_searing_chains_cast.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ember_spirit/ember_spirit_searing_chains_debuff.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function AssaultCaptainThink() + if not IsServer() then + return + end + + -- Search for items here instead of in Spawn, because they don't seem to exist yet when Spawn runs + if not thisEntity.bSearchedForItems then + SearchForItems() + thisEntity.bSearchedForItems = true + end + + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + --[[ + if thisEntity.fLastSearingCast then + print( "last searing cast: " .. thisEntity.fLastSearingCast ) + end + + if thisEntity.fLastSearingCast ~= nil and GameRules:GetGameTime() > ( thisEntity.fLastSearingCast + 1 ) then + ParticleManager:DestroyParticle( thisEntity.nPreviewFX, false ) + thisEntity.fLastSearingCast = nil + end + ]] + + if thisEntity:HasModifier( "modifier_phoenix_sun_ray" ) then + return 0.25 + else + thisEntity:SetModelScale( thisEntity.fOrigModelScale ) + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 1200, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_FARTHEST, false ) + if #hEnemies == 0 then + return 0.5 + end + + if thisEntity.hChainsAbility ~= nil and thisEntity.hChainsAbility:IsFullyCastable() then + if ( thisEntity:GetHealthPercent() < 95 ) then + return CastSearingChains() + end + end + + local hSunRayTarget = nil + for _, hEnemy in pairs( hEnemies ) do + if hEnemy and hEnemy:IsAlive() and hEnemy:IsRealHero() then + if hEnemy:HasModifier( "modifier_ember_spirit_searing_chains" ) or hEnemy:HasModifier( "modifier_rod_of_atos_debuff" ) then + hSunRayTarget = hEnemy + break + end + end + end + + if hSunRayTarget ~= nil and thisEntity.hSunRayAbility ~= nil and thisEntity.hSunRayAbility:IsFullyCastable() then + if ( thisEntity:GetHealthPercent() < 95 ) then + return CastSunRay( hSunRayTarget ) + end + end + + --[[ + if thisEntity.hRodOfAtosAbility and thisEntity.hRodOfAtosAbility:IsFullyCastable() then + if ( thisEntity:GetHealthPercent() < 100 ) then + print( "try to use atos" ) + return UseRodOfAtos( hEnemies[ RandomInt( 1, #hEnemies ) ] ) + end + end + ]] + + if thisEntity.hBlademailAbility and thisEntity.hBlademailAbility:IsFullyCastable() then + if ( thisEntity:GetHealthPercent() < 80 ) then + return UseBlademail() + end + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function SearchForItems() + for i = 0, 5 do + local item = thisEntity:GetItemInSlot( i ) + if item then + if item:GetAbilityName() == "item_blade_mail" then + thisEntity.hBlademailAbility = item + end + if item:GetAbilityName() == "item_rod_of_atos" then + thisEntity.hRodOfAtosAbility = item + end + end + end +end + +-------------------------------------------------------------------------------- + +function CastSunRay( hEnemy ) + thisEntity:SetModelScale( 2 ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = hEnemy:GetOrigin(), + AbilityIndex = thisEntity.hSunRayAbility:entindex(), + Queue = false, + }) + + return 0.5 +end + +-------------------------------------------------------------------------------- + + +function CastSearingChains() + if IsServer() then + --[[ + print( "creating a warning particle" ) + thisEntity.fLastSearingCast = GameRules:GetGameTime() + thisEntity.nPreviewFX = ParticleManager:CreateParticle( "particles/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, thisEntity ) + ParticleManager:SetParticleControlEnt( thisEntity.nPreviewFX, 0, thisEntity, PATTACH_ABSORIGIN_FOLLOW, nil, thisEntity:GetOrigin(), true ) + ParticleManager:SetParticleControl( thisEntity.nPreviewFX, 1, Vector( 120, 120, 120 ) ) + ParticleManager:SetParticleControl( thisEntity.nPreviewFX, 15, Vector( 180, 40, 10 ) ) + ]] + end + + --thisEntity:SetSequence( "hit" ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hChainsAbility:entindex(), + Queue = false, + }) + + return 0.75 +end + +-------------------------------------------------------------------------------- + +function UseRodOfAtos( hEnemy ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hEnemy:entindex(), + AbilityIndex = thisEntity.hRodOfAtosAbility:entindex(), + Queue = false, + }) + + return 1 +end + +-------------------------------------------------------------------------------- + +function UseBlademail() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hBlademailAbility:entindex(), + Queue = false, + }) + + return 2 +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ai_catapult.lua b/aghanim_singleplayer/scripts/vscripts/ai/ai_catapult.lua new file mode 100755 index 0000000..a77215c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ai_catapult.lua @@ -0,0 +1,108 @@ +--[[ +Catapult AI +]] + +function Spawn( entityKeyValues ) + if IsServer() == false then + return + end + thisEntity:SetContextThink( "CatapultAIThink", CatapultAIThink, 0.25 ) + + thisEntity.hEntityKilledGameEvent = ListenToGameEvent( "entity_killed", Dynamic_Wrap( thisEntity:GetPrivateScriptScope(), 'OnEntityKilled' ), nil ) +end + +function UpdateOnRemove() + StopListeningToGameEvent( thisEntity.hEntityKilledGameEvent ) +end + +function Precache( context ) + PrecacheResource( "particle", "particles/creatures/catapult/catapult_projectile.vpcf", context ) + PrecacheResource( "particle", "particles/siege_fx/siege_bad_death_01.vpcf", context ) +end + + +function CatapultAIThink() + if IsServer() == false then + return + end + + s_AbilityCatapultAttack = thisEntity:FindAbilityByName( "catapult_attack" ) + + -- Get the current time + local currentTime = GameRules:GetGameTime() + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 1500, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #enemies == 0 then + return 1 + end + + + if s_AbilityCatapultAttack ~= nil and s_AbilityCatapultAttack:IsCooldownReady() then + + local radius = s_AbilityCatapultAttack:GetSpecialValueFor("explosion_radius") + local minRange = s_AbilityCatapultAttack:GetSpecialValueFor("mindistance") + local range = s_AbilityCatapultAttack:GetCastRange() + local nMaxAdjacentEnemies = 0 + local bestEnemy = nil + + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsAlive() then + local flDistToEnemy = #(thisEntity:GetOrigin() - enemy:GetOrigin()) + if range > flDistToEnemy and minRange < flDistToEnemy then + local nAdjacentEnemies = 1 + for _,adjacentEnemy in pairs( enemies ) do + if adjacentEnemy ~= nil and adjacentEnemy ~= enemy and adjacentEnemy:IsAlive() then + local vSeparation = enemy:GetOrigin() - adjacentEnemy:GetOrigin() + local flDistBetweenEnemies = #vSeparation + if flDistBetweenEnemies < radius then + nAdjacentEnemies = nAdjacentEnemies + 1 + end + end + end + + if nMaxAdjacentEnemies < nAdjacentEnemies or ( nMaxAdjacentEnemies == nMaxAdjacentEnemies and RandomInt( 0,1 ) == 1 ) then + nMaxAdjacentEnemies = nAdjacentEnemies + bestEnemy = enemy + end + end + end + end + + if bestEnemy ~= nil then + return CatapultAttack( bestEnemy ) + end + end + + return 1.0 +end + +function CatapultAttack( enemy ) + local order = {} + order.UnitIndex = thisEntity:entindex() + order.OrderType = DOTA_UNIT_ORDER_CAST_POSITION + order.Position = enemy:GetOrigin() + order.AbilityIndex = s_AbilityCatapultAttack:entindex() + ExecuteOrderFromTable( order ) + + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 2.0 } ) + + return 3.5 +end + +function OnEntityKilled( event ) + local hVictim = nil + if event.entindex_killed ~= nil then + hVictim = EntIndexToHScript( event.entindex_killed ) + end + + if hVictim ~= thisEntity then + return + end + + EmitSoundOn( "Creep_Siege_Dire.Destruction", hVictim ) + + hVictim:AddEffects( EF_NODRAW ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/siege_fx/siege_bad_death_01.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, hVictim, PATTACH_ABSORIGIN, nil, hVictim:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ai_core.lua b/aghanim_singleplayer/scripts/vscripts/ai/ai_core.lua new file mode 100755 index 0000000..084da2e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ai_core.lua @@ -0,0 +1,162 @@ +--[[ +Tower Defense AI + +These are the valid orders, in case you want to use them (easier here than to find them in the C code): + +DOTA_UNIT_ORDER_NONE +DOTA_UNIT_ORDER_MOVE_TO_POSITION +DOTA_UNIT_ORDER_MOVE_TO_TARGET +DOTA_UNIT_ORDER_ATTACK_MOVE +DOTA_UNIT_ORDER_ATTACK_TARGET +DOTA_UNIT_ORDER_CAST_POSITION +DOTA_UNIT_ORDER_CAST_TARGET +DOTA_UNIT_ORDER_CAST_TARGET_TREE +DOTA_UNIT_ORDER_CAST_NO_TARGET +DOTA_UNIT_ORDER_CAST_TOGGLE +DOTA_UNIT_ORDER_HOLD_POSITION +DOTA_UNIT_ORDER_TRAIN_ABILITY +DOTA_UNIT_ORDER_DROP_ITEM +DOTA_UNIT_ORDER_GIVE_ITEM +DOTA_UNIT_ORDER_PICKUP_ITEM +DOTA_UNIT_ORDER_PICKUP_RUNE +DOTA_UNIT_ORDER_PURCHASE_ITEM +DOTA_UNIT_ORDER_SELL_ITEM +DOTA_UNIT_ORDER_DISASSEMBLE_ITEM +DOTA_UNIT_ORDER_MOVE_ITEM +DOTA_UNIT_ORDER_CAST_TOGGLE_AUTO +DOTA_UNIT_ORDER_STOP +DOTA_UNIT_ORDER_TAUNT +DOTA_UNIT_ORDER_BUYBACK +DOTA_UNIT_ORDER_GLYPH +DOTA_UNIT_ORDER_EJECT_ITEM_FROM_STASH +DOTA_UNIT_ORDER_CAST_RUNE +]] + +AICore = {} + +behaviorSystem = {} -- create the global so we can assign to it + +function AICore:RandomEnemyHeroInRange( entity, range ) + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, entity:GetOrigin(), entity, range, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, 0, 0, false ) + if #enemies > 0 then + local index = RandomInt( 1, #enemies ) + return enemies[index] + else + return nil + end +end + +function AICore:ClosestEnemyHeroInRange( entity, range ) + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, entity:GetOrigin(), entity, range, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #enemies > 0 then + return enemies[1] + else + return nil + end +end + +function AICore:WeakestEnemyHeroInRange( entity, range ) + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, entity:GetOrigin(), entity, range, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, 0, 0, false ) + + local minHP = nil + local target = nil + + for _,enemy in pairs(enemies) do + local distanceToEnemy = (entity:GetOrigin() - enemy:GetOrigin()):Length() + local HP = enemy:GetHealth() + if enemy:IsAlive() and (minHP == nil or HP < minHP) and distanceToEnemy < range then + minHP = HP + target = enemy + end + end + + return target +end + +function AICore:CreateBehaviorSystem( hEntity, behaviors ) + + local BehaviorSystem = {} + + BehaviorSystem.hEntity = hEntity + BehaviorSystem.possibleBehaviors = behaviors + BehaviorSystem.thinkDuration = 0.3 + + BehaviorSystem.currentBehavior = + { + } + BehaviorSystem.currentOrder = { OrderType = DOTA_UNIT_ORDER_NONE } + + function BehaviorSystem:Think( ) + -- Don't do anything if we're in the middle of casting something + if self.hEntity:GetCurrentActiveAbility() ~= nil or GameRules:IsGamePaused() then + return 0.1 + end + + local bIsDone = self.currentBehavior.IsDone == nil or self.currentBehavior:IsDone() + local newOrder = nil + if bIsDone then + local newBehavior = self:ChooseNextBehavior() + if newBehavior == nil then + -- Do nothing here... this covers possible problems with ChooseNextBehavior + elseif newBehavior == self.currentBehavior then + newOrder = self.currentBehavior:Continue() + else + if self.currentBehavior.End then + self.currentBehavior:End() + end + self.currentBehavior = newBehavior + newOrder = self.currentBehavior:Begin() + end + else + if self.currentBehavior.Think then + newOrder = self.currentBehavior:Think() + end + end + + if newOrder ~= nil and newOrder.OrderType ~= DOTA_UNIT_ORDER_NONE then + if self.currentOrder.OrderType ~= newOrder.OrderType or + self.currentOrder.TargetIndex ~= newOrder.TargetIndex or + self.currentOrder.AbilityIndex ~= newOrder.AbilityIndex or + self.currentOrder.Position ~= newOrder.Position then + + --print( "Executing Order " .. tostring(newOrder.OrderType) .. "->" .. tostring(newOrder.TargetIndex).. "->" .. tostring(newOrder.AbilityIndex) .. "->" .. tostring( newOrder.Position ) ) + ExecuteOrderFromTable( newOrder ) + self.currentOrder = newOrder + end + end + + return self.thinkDuration + end + + function BehaviorSystem:ChooseNextBehavior() + local result = nil + local bestDesire = nil + for _,behavior in pairs( self.possibleBehaviors ) do + local thisDesire = behavior:Evaluate() + if bestDesire == nil or thisDesire > bestDesire then + result = behavior + bestDesire = thisDesire + end + end + + return result + end + + function BehaviorSystem:Deactivate() + if self.currentBehavior.End then + self.currentBehavior:End() + end + end + + function BehaviorSystem:Destroy() + for _,behavior in pairs( self.possibleBehaviors ) do + if behavior.Destroy then + behavior:Destroy() + end + end + + return result + end + + return BehaviorSystem +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ai_dire_hound_boss.lua b/aghanim_singleplayer/scripts/vscripts/ai/ai_dire_hound_boss.lua new file mode 100755 index 0000000..aae1e95 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ai_dire_hound_boss.lua @@ -0,0 +1,96 @@ + +function Spawn( entityKeyValues ) + if thisEntity == nil then + return + end + + QuillAttack = thisEntity:FindAbilityByName( "ranged_quill_attack" ) + thisEntity:SetContextThink( "DireHoundBossThink", DireHoundBossThink, 1 ) +end + +function DireHoundBossThink() + if GameRules:IsGamePaused() == true then + return 1 + end + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 1250, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BUILDING, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #enemies == 0 then + return 1 + end + + local hAttackTarget = nil + local hApproachTarget = nil + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsAlive() then + local flDist = ( enemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + if flDist < 200 then + return Retreat( enemy ) + end + if flDist <= 1000 then + hAttackTarget = enemy + end + if flDist > 1000 then + hApproachTarget = enemy + end + end + end + + + + if hAttackTarget == nil and hApproachTarget ~= nil then + return Approach( hApproachTarget ) + end + + if QuillAttack:IsCooldownReady() then + return Attack( hAttackTarget ) + end + + thisEntity:FaceTowards( hAttackTarget:GetOrigin() ) + return 0.5 +end + +function Attack(unit) + thisEntity.bMoving = false + + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 1.1 } ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = QuillAttack:entindex(), + Position = unit:GetOrigin(), + Queue = false, + }) + return 1 +end + + +function Approach(unit) + thisEntity.bMoving = true + + local vToEnemy = unit:GetOrigin() - thisEntity:GetOrigin() + vToEnemy = vToEnemy:Normalized() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity:GetOrigin() + vToEnemy * thisEntity:GetIdealSpeed() + }) + return 1 +end + + + +function Retreat(unit) + thisEntity.bMoving = true + + local vAwayFromEnemy = thisEntity:GetOrigin() - unit:GetOrigin() + vAwayFromEnemy = vAwayFromEnemy:Normalized() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity:GetOrigin() + vAwayFromEnemy * thisEntity:GetIdealSpeed() + }) + return 1.25 +end + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ai_doom.lua b/aghanim_singleplayer/scripts/vscripts/ai/ai_doom.lua new file mode 100755 index 0000000..3e2b9da --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ai_doom.lua @@ -0,0 +1,88 @@ +require( "ai/shared" ) +require( "ai/ai_core" ) + +-------------------------------------------------------------------------------- +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hInfernalBlade = thisEntity:FindAbilityByName( "creature_doom_infernal_blade" ) + thisEntity.nInfernalBladeSearchRange = 700 + + thisEntity.hDoomAbility = thisEntity:FindAbilityByName( "creature_doom_bringer_doom" ) + thisEntity.nDoomAbilitySearchRange = 800 + thisEntity.nDoomAbilityHealthPercentTrigger = 80 + + thisEntity:SetContextThink( "DoomThink", DoomThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_doom_bringer/doom_infernal_blade_impact.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_doom_bringer/doom_infernal_blade_debuff.vpcf", context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_doom_bringer/doom_bringer_doom.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_doom.vpcf", context ) + PrecacheResource( "particle", "particles/generic_gameplay/generic_muted.vpcf", context ) + PrecacheResource( "particle", "particles/generic_gameplay/generic_break.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function DoomThink() + + local flNow = GameRules:GetGameTime() + + if thisEntity.hInfernalBlade and thisEntity.hInfernalBlade:IsFullyCastable() then + local hHeroes = GetEnemyHeroesInRange( thisEntity, thisEntity.nInfernalBladeSearchRange ) + + if #hHeroes > 0 then + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hHeroes[1]:entindex(), + AbilityIndex = thisEntity.hInfernalBlade:entindex(), + Queue = false, + }) + end + + return 0.25 + end + + + if thisEntity.hDoomAbility and thisEntity.hDoomAbility:IsFullyCastable() and thisEntity:GetHealthPercent() < thisEntity.nDoomAbilityHealthPercentTrigger then + local hHeroes = GetEnemyHeroesInRange( thisEntity, thisEntity.nDoomAbilitySearchRange ) + + if #hHeroes > 0 then + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hHeroes[1]:entindex(), + AbilityIndex = thisEntity.hDoomAbility:entindex(), + Queue = false, + }) + end + + return 0.25 + end + + + thisEntity.flLastAggroSwitch = thisEntity.flLastAggroSwitch and thisEntity.flLastAggroSwitch or 0 + + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 9000 ) + + if (flNow - thisEntity.flLastAggroSwitch) > 2 then + AttackTargetOrder( thisEntity, hTarget ) + thisEntity.flLastAggroSwitch = flNow + end + + return 0.25 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ai_drow_ranger_miniboss.lua b/aghanim_singleplayer/scripts/vscripts/ai/ai_drow_ranger_miniboss.lua new file mode 100755 index 0000000..eba7a90 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ai_drow_ranger_miniboss.lua @@ -0,0 +1,291 @@ + +require( "ai/boss_base" ) + +-------------------------------------------------------------------------------- + +if CDrowRangerMiniboss == nil then + CDrowRangerMiniboss = class( {}, {}, CBossBase ) +end + +-------------------------------------------------------------------------------- + +function Precache( context ) +end + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if IsServer() then + if thisEntity == nil then + return + end + + thisEntity.AI = CDrowRangerMiniboss( thisEntity, 1.0 ) + end +end + +-------------------------------------------------------------------------------- + +function CDrowRangerMiniboss:constructor( hUnit, flInterval ) + CBossBase.constructor( self, hUnit, flInterval ) + + self.bEnraged = false + self.nEnragePct = 33 + + self.bTriggerShadowBlade = false + self.nShadowBladeHealthTriggerPct = 75 + self.bTriggerEscape = false + + self.me:SetThink( "OnDrowRangerMinibossThink", self, "OnDrowRangerMinibossThink", self.flDefaultInterval ) +end + +-------------------------------------------------------------------------------- + +function CDrowRangerMiniboss:SetupAbilitiesAndItems() + CBossBase.SetupAbilitiesAndItems( self ) + + self.hGust = self.me:FindAbilityByName( "aghsfort_drow_ranger_wave_of_silence" ) + if self.hGust == nil then + print( 'CDrowRangerMiniboss - Unable to find ability aghsfort_drow_ranger_wave_of_silence') + else + self.hGust.Evaluate = self.EvaluateGust + self.AbilityPriority[ self.hGust:GetAbilityName() ] = 4 + end + + self.hMultishot = self.me:FindAbilityByName( "aghsfort_drow_ranger_multishot" ) + if self.hMultishot == nil then + print( 'CDrowRangerMiniboss - Unable to find ability aghsfort_drow_ranger_multishot') + else + self.hMultishot.Evaluate = self.EvaluateMultishot + self.AbilityPriority[ self.hMultishot:GetAbilityName() ] = 3 + end + + self.hHurricanePike = self.me:FindItemInInventory( "item_hurricane_pike" ) + if self.hHurricanePike == nil then + print( 'CDrowRangerMiniboss - Unable to find ability item_hurricane_pike') + else + self.hHurricanePike.Evaluate = self.EvaluateHurricanePike + self.AbilityPriority[ self.hHurricanePike:GetAbilityName() ] = 2 + end + + self.hShadowBlade = self.me:FindItemInInventory( "item_aghsfort_drow_ranger_invis_sword" ) + if self.hShadowBlade == nil then + print( 'CDrowRangerMiniboss - Unable to find ability item_aghsfort_drow_ranger_invis_sword') + else + self.hShadowBlade.Evaluate = self.EvaluateShadowBlade + self.AbilityPriority[ self.hShadowBlade:GetAbilityName() ] = 1 + end +end + +-------------------------------------------------------------------------------- + +function CDrowRangerMiniboss:OnDrowRangerMinibossThink() + return self:OnBaseThink() +end + +-------------------------------------------------------------------------------- + +function CDrowRangerMiniboss:OnFirstSeen() + CBossBase.OnFirstSeen( self ) +end + +-------------------------------------------------------------------------------- + +function CDrowRangerMiniboss:IsInvisible() + local hBuff = thisEntity:FindModifierByName( "modifier_item_invisibility_edge_windwalk" ) + return hBuff ~= nil +end + +-------------------------------------------------------------------------------- + +function CDrowRangerMiniboss:OnHealthPercentThreshold( nPct ) + CBossBase.OnHealthPercentThreshold( self, nPct ) + if nPct <= self.nEnragePct and self.bEnraged == false then + self.bEnraged = true + end + + if nPct <= self.nShadowBladeHealthTriggerPct then + print( 'Shadow Blade Health Trigger Hit at ' .. self.nShadowBladeHealthTriggerPct ) + self.nShadowBladeHealthTriggerPct = self.nShadowBladeHealthTriggerPct - 25 + self.bTriggerShadowBlade = true + end +end + +-------------------------------------------------------------------------------- + +function CDrowRangerMiniboss:EvaluateGust() + if self:IsInvisible() then + return nil + end + + local Enemies = shallowcopy( self.hPlayerHeroes ) + local nSearchRadius = self.hGust:GetCastRange() + printf( "EvaluateGust - nSearchRadius == %d", nSearchRadius ) + Enemies = GetEnemyHeroesInRange( thisEntity, nSearchRadius ) + --Enemies = FilterEntitiesOutsideOfRange( self.me:GetAbsOrigin(), Enemies, nSearchRadius ) + + local Order = nil + if #Enemies >= 1 then + local hRandomEnemy = Enemies[ RandomInt( 1, #Enemies ) ] + local vTargetLocation = hRandomEnemy:GetAbsOrigin() + if vTargetLocation ~= nil then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetLocation, + AbilityIndex = self.hGust:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hGust ) + end + end + + --[[ + local vTargetLocation = GetBestDirectionalPointTarget( self.hGust ) + if vTargetLocation ~= nil then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetLocation, + AbilityIndex = self.hGust:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hGust ) + end + ]] + + return Order +end + +-------------------------------------------------------------------------------- + +function CDrowRangerMiniboss:EvaluateMultishot() + if self:IsInvisible() then + return nil + end + + local Enemies = shallowcopy( self.hPlayerHeroes ) + local nSearchRadius = self.hMultishot:GetSpecialValueFor( "effective_range" ) + --printf( "EvaluateMultishot - nSearchRadius == %d", nSearchRadius ) + Enemies = GetEnemyHeroesInRange( thisEntity, nSearchRadius ) + --Enemies = FilterEntitiesOutsideOfRange( self.me:GetAbsOrigin(), Enemies, nSearchRadius ) + + local Order = nil + if #Enemies >= 1 then + local hRandomEnemy = Enemies[ RandomInt( 1, #Enemies ) ] + local vTargetLocation = hRandomEnemy:GetAbsOrigin() + if vTargetLocation ~= nil then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetLocation, + AbilityIndex = self.hMultishot:entindex(), + Queue = false, + } + Order.flOrderInterval = self.hMultishot:GetChannelTime() + --print( 'ORDER INTERVAL for Multishot is ' .. Order.flOrderInterval ) + end + end + + -- need to get this entity to issue some command to select the exit portal after the cast + + return Order +end + +-------------------------------------------------------------------------------- + +function CDrowRangerMiniboss:EvaluateHurricanePike() + if self:IsInvisible() then + return nil + end + + local Enemies = shallowcopy( self.hPlayerHeroes ) + local nSearchRadius = self.hHurricanePike:GetCastRange() + printf( "EvaluateHurricanePike - nSearchRadius == %d", nSearchRadius ) + Enemies = GetEnemyHeroesInRange( thisEntity, nSearchRadius ) + --Enemies = FilterEntitiesOutsideOfRange( self.me:GetAbsOrigin(), Enemies, nSearchRadius ) + + local Order = nil + if #Enemies >= 1 then + local hRandomEnemy = Enemies[ RandomInt( 1, #Enemies ) ] + local vTargetLocation = hRandomEnemy:GetAbsOrigin() + if vTargetLocation ~= nil then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hRandomEnemy:entindex(), + AbilityIndex = self.hHurricanePike:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hHurricanePike ) + end + end + + return Order +end + +-------------------------------------------------------------------------------- + +function CDrowRangerMiniboss:EvaluateShadowBlade() + if self:IsInvisible() then + return nil + end + + local Order = nil + + if self.bTriggerShadowBlade == true then + print( 'Triggering Shadow Blade!' ) + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP, + Queue = false, + } + ExecuteOrderFromTable( Order ) + + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.hShadowBlade:entindex(), + Queue = false, + } + Order.flOrderInterval = 1.0 + self.bTriggerShadowBlade = false + self.bTriggerEscape = true + end + + return Order +end + +-------------------------------------------------------------------------------- + +function CDrowRangerMiniboss:GetNonAbilityOrder() + local Order = nil + + -- if we've successfully shadow bladed and we're ready to escape we should move somewhere else + if self:IsInvisible() and self.bTriggerEscape == true then + print( 'INVIS! Setting new escape location' ) + self.bTriggerEscape = false + local vEscapeLoc = FindPathablePositionNearby( thisEntity:GetAbsOrigin(), 1000, 2000 ) + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = vEscapeLoc, + } + Order.flOrderInterval = 10.0 + + if self.Encounter ~= nil then + self.Encounter:OnDrowShadowBladed() + else + print( 'CDrowRangerMiniboss - ENCOUNTER IS NIL' ) + end + end + + return Order +end diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ai_drow_ranger_skeleton_archer.lua b/aghanim_singleplayer/scripts/vscripts/ai/ai_drow_ranger_skeleton_archer.lua new file mode 100755 index 0000000..cd0e3a6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ai_drow_ranger_skeleton_archer.lua @@ -0,0 +1,28 @@ + +LinkLuaModifier( "modifier_drow_ranger_skeleton_archer", "modifiers/creatures/modifier_drow_ranger_skeleton_archer", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_clinkz/clinkz_burning_army_start.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_clinkz/clinkz_burning_army.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + -- reveal our position for spawning + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 0.5 } ) + + -- this modifier will kill them when it falls off + local flDuration = RandomFloat( 9, 12 ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_drow_ranger_skeleton_archer", { duration = flDuration } ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ai_pudge_miniboss.lua b/aghanim_singleplayer/scripts/vscripts/ai/ai_pudge_miniboss.lua new file mode 100755 index 0000000..dfa77bd --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ai_pudge_miniboss.lua @@ -0,0 +1,78 @@ +require( "ai/shared" ) +require( "ai/ai_core" ) + +-------------------------------------------------------------------------------- +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + local hUnit = thisEntity + + thisEntity.hDismember = hUnit:FindAbilityByName( "creature_pudge_dismember" ) + + thisEntity:SetContextThink( "PudgeMinibossThink", PudgeMinibossThink, 1 ) +end + +-------------------------------------------------------------------------------- +function PudgeMinibossThink() + + local hUnit = thisEntity + if hUnit:IsChanneling() then + return 0.25 + end + + if thisEntity.hPhaseBoots == nil then + + for j = 0,DOTA_ITEM_INVENTORY_SIZE-1 do + local hItem = thisEntity:GetItemInSlot( j ) + if hItem and hItem:GetAbilityName() == "item_phase_boots" then + thisEntity.hPhaseBoots = hItem + break + end + end + else + if thisEntity.hPhaseBoots:IsFullyCastable() then + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hPhaseBoots:entindex(), + Queue = false, + }) + end + end + + local flNow = GameRules:GetGameTime() + + + if thisEntity.hDismember and thisEntity.hDismember:IsFullyCastable() then + local hHeroes = GetEnemyHeroesInRange( hUnit, 9000 ) + if #hHeroes >= 1 then + ExecuteOrderFromTable({ + UnitIndex = hUnit:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hHeroes[1]:entindex(), + AbilityIndex = thisEntity.hDismember:entindex(), + Queue = false, + }) + end + + else + hUnit.flLastAggroSwitch = hUnit.flLastAggroSwitch and hUnit.flLastAggroSwitch or 0 + + local hTarget = AICore:ClosestEnemyHeroInRange( hUnit, 9000 ) + + if (flNow - hUnit.flLastAggroSwitch) > 2 then + AttackTargetOrder( hUnit, hTarget ) + hUnit.flLastAggroSwitch = flNow + end + end + + return 0.25 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ai_shadow_demon.lua b/aghanim_singleplayer/scripts/vscripts/ai/ai_shadow_demon.lua new file mode 100755 index 0000000..a064654 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ai_shadow_demon.lua @@ -0,0 +1,202 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + --thisEntity.hShadowPoisonAbility = thisEntity:FindAbilityByName( "aghsfort_shadow_demon_shadow_poison" ) + thisEntity.hDisruptionAbility = thisEntity:FindAbilityByName( "aghsfort_shadow_demon_disruption" ) + if thisEntity.hDisruptionAbility == nil then + print( 'MISSING aghsfort_shadow_demon_disruption on shadow demon ai' ) + end + + thisEntity.flRetreatRange = 500 + thisEntity.flAttackRange = 850 + thisEntity.flDisruptionDelayTime = GameRules:GetGameTime() + RandomFloat( 7, 12 ) -- need to live for this long before we can think about casting disruption + thisEntity.PreviousOrder = "no_order" + + thisEntity:SetContextThink( "ShadowDemonThink", ShadowDemonThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function ShadowDemonThink() + if not IsServer() then + return + end + + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 5000, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return HoldPosition() + end + + local hAttackTarget = nil + local hApproachTarget = nil + for _, hEnemy in pairs( hEnemies ) do + if hEnemy ~= nil and hEnemy:IsAlive() then + local flDist = ( hEnemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + if flDist < thisEntity.flRetreatRange then + if ( thisEntity.fTimeOfLastRetreat and ( GameRules:GetGameTime() < thisEntity.fTimeOfLastRetreat + 3 ) ) then + -- We already retreated recently, so just attack + hAttackTarget = hEnemy + else + return Retreat( hEnemy ) + end + end + if flDist <= thisEntity.flAttackRange then + hAttackTarget = hEnemy + end + if flDist > thisEntity.flAttackRange then + hApproachTarget = hEnemy + end + end + end + + if hAttackTarget == nil and hApproachTarget ~= nil then + return Approach( hApproachTarget ) + end + + if thisEntity.hDisruptionAbility ~= nil and thisEntity.hDisruptionAbility:IsFullyCastable() then + --print( 'disruption check' ) + if GameRules:GetGameTime() > thisEntity.flDisruptionDelayTime and hAttackTarget then + --print( 'Shadow Demon using Disruption on ENEMY!' ) + return CastDisruption( hAttackTarget ) + end + end +--[[ + if hAttackTarget and thisEntity.hShadowPoisonAbility ~= nil and thisEntity.hShadowPoisonAbility:IsFullyCastable() then + return CastPoison( hAttackTarget ) + end +--]] + if hAttackTarget then + thisEntity:FaceTowards( hAttackTarget:GetOrigin() ) + --return HoldPosition() + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function CastPoison( hEnemy ) + --print( "ai_shadow_demon - CastPoison" ) + + local fDist = ( hEnemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + local vTargetPos = hEnemy:GetOrigin() +--[[ + if ( fDist > 400 ) and hEnemy and hEnemy:IsMoving() then + local vLeadingOffset = hEnemy:GetForwardVector() * RandomInt( 200, 400 ) + vTargetPos = hEnemy:GetOrigin() + vLeadingOffset + end +--]] + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetPos, + AbilityIndex = thisEntity.hShadowPoisonAbility:entindex(), + Queue = false, + }) + + thisEntity.PreviousOrder = "poison" + + return 1 +end + +-------------------------------------------------------------------------------- + +function CastDisruption( hEnemy ) + --print( "ai_shadow_demon - CastDisruption" ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hEnemy:entindex(), + AbilityIndex = thisEntity.hDisruptionAbility:entindex(), + Queue = false, + }) + + thisEntity.PreviousOrder = "disruption" + + return 1 +end + +-------------------------------------------------------------------------------- + +function Approach(unit) + --print( "ai_shadow_demon - Approach" ) + + local vToEnemy = unit:GetOrigin() - thisEntity:GetOrigin() + vToEnemy = vToEnemy:Normalized() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity:GetOrigin() + vToEnemy * thisEntity:GetIdealSpeed() + }) + + thisEntity.PreviousOrder = "approach" + + return 1 +end + +-------------------------------------------------------------------------------- + +function Retreat(unit) + --print( "ai_shadow_demon - Retreat" ) + + local vAwayFromEnemy = thisEntity:GetOrigin() - unit:GetOrigin() + vAwayFromEnemy = vAwayFromEnemy:Normalized() + local vMoveToPos = thisEntity:GetOrigin() + vAwayFromEnemy * thisEntity:GetIdealSpeed() + + -- if away from enemy is an unpathable area, find a new direction to run to + local nAttempts = 0 + while ( ( not GridNav:CanFindPath( thisEntity:GetOrigin(), vMoveToPos ) ) and ( nAttempts < 5 ) ) do + vMoveToPos = thisEntity:GetOrigin() + RandomVector( thisEntity:GetIdealSpeed() ) + nAttempts = nAttempts + 1 + end + + thisEntity.fTimeOfLastRetreat = GameRules:GetGameTime() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = vMoveToPos, + }) + + thisEntity.PreviousOrder = "retreat" + + return 1.25 +end + +-------------------------------------------------------------------------------- + +function HoldPosition() + --print( "ai_shadow_demon - Hold Position" ) + if thisEntity.PreviousOrder == "hold_position" then + return 0.5 + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_HOLD_POSITION, + Position = thisEntity:GetOrigin() + }) + + thisEntity.PreviousOrder = "hold_position" + + return 0.5 +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ai_shroom_giant.lua b/aghanim_singleplayer/scripts/vscripts/ai/ai_shroom_giant.lua new file mode 100755 index 0000000..2a9e0c6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ai_shroom_giant.lua @@ -0,0 +1,97 @@ +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.bAcqRangeModified = false + + thisEntity.hEntityKilledGameEvent = ListenToGameEvent( "entity_killed", Dynamic_Wrap( thisEntity:GetPrivateScriptScope(), 'OnEntityKilled' ), nil ) + + thisEntity:SetContextThink( "ShroomGiantThink", ShroomGiantThink, 1 ) +end + +function UpdateOnRemove() + StopListeningToGameEvent( thisEntity.hEntityKilledGameEvent ) +end + +function ShroomGiantThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + -- Increase acquisition range after the initial aggro + if ( not thisEntity.bAcqRangeModified ) and thisEntity:GetAggroTarget() then + thisEntity:SetAcquisitionRange( 850 ) + thisEntity.bAcqRangeModified = true + end + + return 0.5 +end + +function OnEntityKilled( event ) + + local hVictim = nil + if event.entindex_killed ~= nil then + hVictim = EntIndexToHScript( event.entindex_killed ) + end + + if hVictim ~= thisEntity then + return + end + + -- Check all of the other giants, and see if any others are aggroed. + -- If not, then we'll force aggro on the closest one + if thisEntity.Encounter == nil then + print( 'ai_shroom_giant - OnEntityKilled: Encounter is nil!') + return + end + + local flNearDist = 60000 + local hGiant = nil + local hGiants = thisEntity.Encounter:GetSpawnedUnitsOfType( "npc_dota_creature_shroom_giant" ) + for i=1,#hGiants do + if hGiants[i] ~= thisEntity then + + if hGiants[i].bAcqRangeModified then + hGiant = nil + break + end + + local flDist = ( hGiants[i]:GetAbsOrigin() - hVictim:GetAbsOrigin() ):Length2D() + if flDist < flNearDist then + flNearDist = flDist + hGiant = hGiants[i] + end + + end + end + + if hGiant == nil then + return + end + + hGiant:SetDayTimeVisionRange( 5000 ) + hGiant:SetNightTimeVisionRange( 5000 ) + hGiant:SetAcquisitionRange( 5000 ) + hGiant.bAcqRangeModified = true + + -- Order nearby shamans idle unonwned to start attacking also + local hShamans = thisEntity.Encounter:GetSpawnedUnitsOfType( "npc_dota_creature_shadow_shaman" ) + print( 'Shroom Giant Death - Searching for Shadow Shamans... found ' .. #hShamans ) + for i=1,#hShamans do + local hShaman = hShamans[i] + if hShaman:GetOwnerEntity() == nil and hShaman:GetAggroTarget() == nil and ( hGiant:GetAbsOrigin() - hShaman:GetAbsOrigin() ):Length2D() < 800 then + hShaman:SetDayTimeVisionRange( 5000 ) + hShaman:SetNightTimeVisionRange( 5000 ) + hShaman:SetAcquisitionRange( 5000 ) + end + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ai_shroomling.lua b/aghanim_singleplayer/scripts/vscripts/ai/ai_shroomling.lua new file mode 100755 index 0000000..f18b7ee --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ai_shroomling.lua @@ -0,0 +1,81 @@ +require( "ai/shared" ) + +LinkLuaModifier( "modifier_shroomling_enrage", "modifiers/creatures/modifier_shroomling_enrage", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_shroomling_sleep", "modifiers/creatures/modifier_shroomling_sleep", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function Precache( context ) + PrecacheResource( "particle", "particles/items2_fx/mask_of_madness.vpcf", context ) + PrecacheResource( "particle", "particles/generic_gameplay/generic_sleep.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if thisEntity == nil then + return + end + +-- thisEntity.nShackledHeroSearchRadius = 900 +-- thisEntity.hForceAttackTarget = nil + + thisEntity:AddNewModifier( thisEntity, nil, "modifier_shroomling_sleep", { duration = -1.0 } ) + + -- mushrooms are 100% off limits for a bit after spawning + thisEntity:AddNewModifier( thisEntity, nil, "modifier_invulnerable", { duration = 1.5 } ) + +-- thisEntity:SetContextThink( "ShroomlingThink", ShroomlingThink, 1 ) +end + +--[[ +function ShroomlingThink() + if GameRules:IsGamePaused() == true then + return 1 + end + + if thisEntity:IsAlive() == false then + return 1 + end + + if thisEntity.hForceAttackTarget ~= nil then + local hShackleDebuff = thisEntity.hForceAttackTarget:FindModifierByName( "modifier_aghsfort_shadow_shaman_shackles" ) + + if thisEntity.hForceAttackTarget:IsAlive() == false or hShackleDebuff == nil then + -- force attack target is dead or it's alive and the shackle has ended + thisEntity:RemoveModifierByName( "modifier_shroomling_enrage" ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_shroomling_sleep", { duration = -1.0 } ) + thisEntity.hForceAttackTarget = nil + return 1 + end + + -- target is still valid and shackled so have at it + AttackTargetOrder( thisEntity, thisEntity.hForceAttackTarget ) + return 1 + end + + local enemies = GetEnemyHeroesInRange( thisEntity, thisEntity.nShackledHeroSearchRadius ) + + if #enemies == 0 then + return 1 + end + + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsAlive() then + local hShackleDebuff = enemy:FindModifierByName( "modifier_aghsfort_shadow_shaman_shackles" ) + if hShackleDebuff ~= nil then + thisEntity.hForceAttackTarget = enemy + + thisEntity:RemoveModifierByName( "modifier_shroomling_sleep" ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_shroomling_enrage", { duration = -1.0 } ) + + --print( 'Shroomling Attacking!' ) + AttackTargetOrder( thisEntity, enemy ) + return 1 + end + end + end + + return 0.5 +end +--]] \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ai_upheaval_urn.lua b/aghanim_singleplayer/scripts/vscripts/ai/ai_upheaval_urn.lua new file mode 100755 index 0000000..e908be6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ai_upheaval_urn.lua @@ -0,0 +1,95 @@ +--[[ +Upheaval Urn AI +]] + +function Spawn( entityKeyValues ) + if IsServer() == false then + return + end + + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = -1 } ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_magic_immune", { duration = -1 } ) + + AbilityUpheaval = thisEntity:FindAbilityByName( "urn_upheaval" ) + + thisEntity.nPreviewFX = nil + thisEntity.bCastSpell = false + + thisEntity.fWarningTime = 2.5 + + local flInitialThinkDelay = RandomFloat( 1, 3 ) + thisEntity:SetContextThink( "UrnAIThink", UrnAIThink, flInitialThinkDelay ) +end + + +function Precache( context ) + PrecacheResource( "particle", "particles/econ/items/warlock/warlock_staff_hellborn/warlock_upheaval_hellborn.vpcf", context ) + PrecacheResource( "particle", "particles/econ/items/warlock/warlock_staff_hellborn/warlock_upheaval_hellborn_debuff.vpcf", context ) + + PrecacheResource( "particle", "particles/econ/events/darkmoon_2017/darkmoon_calldown_marker_ring.vpcf", context ) + PrecacheResource( "particle", "particles/dark_moon/darkmoon_creep_warning.vpcf", context ) +end + + +function UrnAIThink() + if IsServer() == false then + return + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if thisEntity:IsAlive() == false then + if thisEntity.nPreviewFX ~= nil then + ParticleManager:DestroyParticle( thisEntity.nPreviewFX, false ) + thisEntity.nPreviewFX = nil + end + + return + end + + if thisEntity.bCastSpell == true then + thisEntity.bCastSpell = false + + if thisEntity.nPreviewFX ~= nil then + ParticleManager:DestroyParticle( thisEntity.nPreviewFX, false ) + thisEntity.nPreviewFX = nil + end + + local order = {} + order.UnitIndex = thisEntity:entindex() + order.OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET + order.AbilityIndex = AbilityUpheaval:entindex() + ExecuteOrderFromTable( order ) + + local channelTime = AbilityUpheaval:GetChannelTime() + local downTime = RandomFloat( 3, 7 ) + local flThinkDelay = channelTime + downTime + --print( 'Upheaval Urn sleeping for ' .. flThinkDelay ) + + return flThinkDelay + end + + if AbilityUpheaval ~= nil and AbilityUpheaval:IsFullyCastable() then + thisEntity.bCastSpell = true +--[[ + local radius = AbilityUpheaval:GetSpecialValueFor( "aoe" ) + local nFXIndex = ParticleManager:CreateParticle( "particles/econ/events/darkmoon_2017/darkmoon_calldown_marker_ring.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, thisEntity:GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( radius, radius, radius ) ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( thisEntity.fWarningTime, thisEntity.fWarningTime, thisEntity.fWarningTime ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) +--]] + local warningRadius = 80 + thisEntity.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, thisEntity ) + ParticleManager:SetParticleControlEnt( thisEntity.nPreviewFX, 0, thisEntity, PATTACH_ABSORIGIN_FOLLOW, nil, thisEntity:GetOrigin(), true ) + ParticleManager:SetParticleControl( thisEntity.nPreviewFX, 1, Vector( warningRadius, warningRadius, warningRadius ) ) + ParticleManager:SetParticleControl( thisEntity.nPreviewFX, 15, Vector( 255, 26, 26 ) ) + + return thisEntity.fWarningTime + end + + return 1.0 +end + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/alchemist_ai.lua b/aghanim_singleplayer/scripts/vscripts/ai/alchemist_ai.lua new file mode 100755 index 0000000..ec75b6b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/alchemist_ai.lua @@ -0,0 +1,395 @@ +--[[ Alchemist AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + local hCurrentEncounter = GameRules.Aghanim:GetCurrentRoom():GetEncounter() + if hCurrentEncounter.activeTargets == nil then + hCurrentEncounter.activeTargets = {} + end + + thisEntity:AddNewModifier( thisEntity, nil, "modifier_attack_speed_unslowable", { attack_speed_reduction_pct = 20 } ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_move_speed_unslowable", { move_speed_reduction_pct = 20 } ) + + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorConcoction, BehaviorAcidSpray } ) --, BehaviorRunAway } ) + thisEntity.nextTargetTime = GameRules:GetGameTime() +end + +function UpdateOnRemove() + behaviorSystem:Destroy() +end + +function AIThink() -- For some reason AddThinkToEnt doesn't accept member functions + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +function RemoveAvailableTarget( availableHeroes, nEntIndexToRemove ) + + if #availableHeroes == 1 then + return + end + + for i=1,#availableHeroes do + if availableHeroes[i]:entindex() == nEntIndexToRemove then + table.remove( availableHeroes, i ) + break + end + end + +end + +-------------------------------------------------------------------------------------------------------- + +function SelectNewTarget( ) + + local hCurrentEncounter = GameRules.Aghanim:GetCurrentRoom():GetEncounter() + + -- Mark current target as not active any more + -- Important to do prior to the code that grab a target which is not already being chased + local nEntIndex = -1 + if thisEntity.hTarget ~= nil then + nEntIndex = thisEntity.hTarget:entindex() + hCurrentEncounter.activeTargets[ tostring( nEntIndex ) ] = nil + end + + local availableHeroes = GetAliveHeroesInRoom() + + -- Remove not visible heroes + for i=#availableHeroes,1,-1 do + if not thisEntity:CanEntityBeSeenByMyTeam( availableHeroes[i] ) then + table.remove( availableHeroes, i ) + end + end + + -- Prefer to grab a target which is not already being chased by another alchemist + for szEntIndex,bIsActive in pairs( hCurrentEncounter.activeTargets ) do + if bIsActive == true then + RemoveAvailableTarget( availableHeroes, tonumber( szEntIndex ) ) + end + end + + -- Prefer to pick a different target from last time + RemoveAvailableTarget( availableHeroes, nEntIndex ) + + -- Select a random target from the available ones + local hNewTarget = nil + if #availableHeroes > 0 then + hNewTarget = availableHeroes[ math.random( 1, #availableHeroes ) ] + end + + thisEntity.hTarget = hNewTarget + thisEntity.nextTargetTime = GameRules:GetGameTime() + 10 -- Keep on this guy for 10 seconds at least + + if thisEntity.hTarget ~= nil then + hCurrentEncounter.activeTargets[ tostring( thisEntity.hTarget:entindex() ) ] = true + end + +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Destroy() + + local hCurrentEncounter = GameRules.Aghanim:GetCurrentRoom():GetEncounter() + + -- Mark current target as not active any more + if thisEntity.hTarget ~= nil then + hCurrentEncounter.activeTargets[ tostring( thisEntity.hTarget:entindex() ) ] = nil + thisEntity.hTarget = nil + end + +end + +function BehaviorNone:Begin() + --print( "BehaviorNone:Begin()" ) + local orders = nil + + -- Acquire a new target if necessary + if thisEntity.hTarget == nil or ( thisEntity.nextTargetTime <= GameRules:GetGameTime() ) or + not thisEntity.hTarget:IsAlive() or + ( not thisEntity:CanEntityBeSeenByMyTeam( thisEntity.hTarget ) and ( ( thisEntity:GetAbsOrigin() - thisEntity.lastTargetPosition ):Length2D() < 250 ) ) then + SelectNewTarget() + end + + if thisEntity.hTarget ~= nil then + thisEntity.lastTargetPosition = thisEntity.hTarget:GetAbsOrigin() + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = thisEntity.hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorConcoction = {} + +function BehaviorConcoction:Evaluate() + --print( "BehaviorConcoction:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + -- Got to have a target + if thisEntity.hTarget == nil or not thisEntity.hTarget:IsAlive() or not thisEntity:CanEntityBeSeenByMyTeam( thisEntity.hTarget ) then + return desire + end + + self.concoctionAbility = thisEntity:FindAbilityByName( "alchemist_unstable_concoction" ) + self.nBrewTime = self.concoctionAbility:GetSpecialValueFor( "brew_time") + self.nSelfExplodeTime = self.concoctionAbility:GetSpecialValueFor( "brew_explosion") + + if self.concoctionAbility and self.concoctionAbility:IsFullyCastable() then + + -- Don't do it if other alchemists are currently conconting + local friends = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), thisEntity, 5000, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_HERO, 0, 0, false ) + for i = 1,#friends do + if friends[i] ~= thisEntity and friends[i].bInConcontion ~= nil and friends[i].bInConcontion == true then + return desire + end + end + + --print( "Concoction:Evaluate: thisEntity.hTarget:entindex() == " .. thisEntity.hTarget:entindex() ) + thisEntity.lastTargetPosition = thisEntity.hTarget:GetAbsOrigin() + if thisEntity.hTarget:IsStunned() then + desire = 2 + else + desire = 4 + end + end + + return desire +end + +function BehaviorConcoction:Begin() + --print( "BehaviorConcoction:Begin()" ) + + thisEntity.bInConcontion = true + + if self.startConcoctionTime ~= nil then + return nil + end + + self.shivasAbility = nil + self.phaseAbility = nil + for i = 0, DOTA_ITEM_MAX - 1 do + local item = thisEntity:GetItemInSlot( i ) + if item and item:GetAbilityName() == "item_shivas_guard" then + self.shivasAbility = item + end + if item and item:GetAbilityName() == "item_phase_boots" then + self.phaseAbility = item + end + end + + self.concoctionThrowAbility = thisEntity:FindAbilityByName( "alchemist_unstable_concoction_throw" ) + self.chemicalRageAbility = thisEntity:FindAbilityByName( "alchemist_chemical_rage" ) + + if self.concoctionAbility and self.concoctionAbility:IsFullyCastable() then + self.startConcoctionTime = GameRules:GetGameTime() + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.concoctionAbility:entindex(), + } + return order + end + + return nil +end + +BehaviorConcoction.Continue = BehaviorConcoction.Begin + +function BehaviorConcoction:End() + thisEntity.bInConcontion = false +end + +function BehaviorConcoction:IsDone() + return ( self.startConcoctionTime == nil ) +end + +function BehaviorConcoction:Think( ) + if self.startConcoctionTime == nil then + return nil + end + + --print( "BehaviorConcoction:Think( )" ) + --print( "-----------------------------------" ) + --print( "self.startConcoctionTime == " .. self.startConcoctionTime ) + --print( "GameRules:GetGameTime() == " .. GameRules:GetGameTime() ) + + -- reacquire target if possible + if thisEntity.hTarget == nil or not thisEntity.hTarget:IsAlive() then + SelectNewTarget() + if thisEntity.hTarget == nil then + -- No target? Move to last valid target position + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + return order + end + end + + thisEntity.lastTargetPosition = thisEntity.hTarget:GetAbsOrigin() + + -- if we missed our cast window for some reason + if GameRules:GetGameTime() >= ( self.startConcoctionTime + self.nSelfExplodeTime ) then + --print( "ending") + self.startConcoctionTime = nil + return nil + end + + -- If we're still waiting to throw, then try to close... + if GameRules:GetGameTime() < ( self.startConcoctionTime + self.nBrewTime ) then + + -- Cast phase if we can + if self.phaseAbility and self.phaseAbility:IsFullyCastable() then + --print( "Casting phase" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.phaseAbility:entindex() + } + return order + end + + -- Cast Shiva if we can + if self.shivasAbility and self.shivasAbility:IsFullyCastable() then + --print( "Casting shiva" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.shivasAbility:entindex() + } + return order + end + + else + + -- Ok, we're able to throw, so lets throw + if self.concoctionThrowAbility and not self.concoctionThrowAbility:IsHidden() and self.concoctionThrowAbility:IsFullyCastable() then + --print( "Casting throw" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + AbilityIndex = self.concoctionThrowAbility:entindex(), + TargetIndex = thisEntity.hTarget:entindex() + } + + return order + end + + -- Otherwise, try to cast chemical rage + if self.chemicalRageAbility and self.chemicalRageAbility:IsFullyCastable() then + --print( "Casting Chemical Rage" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.chemicalRageAbility:entindex(), + } + return order + end + + end + + -- Nothing better to do? Chase our target + --print( "Attacking" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = thisEntity.hTarget:entindex() + } + return order + +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorAcidSpray = {} + +function BehaviorAcidSpray:Evaluate() + --print( "BehaviorAcidSpray:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + -- Got to have a target + if thisEntity.hTarget == nil or not thisEntity.hTarget:IsAlive() or not thisEntity:CanEntityBeSeenByMyTeam( thisEntity.hTarget ) then + return desire + end + + self.acidSprayAbility = thisEntity:FindAbilityByName( "alchemist_acid_spray" ) + if self.acidSprayAbility and self.acidSprayAbility:IsFullyCastable() then + if thisEntity.hTarget:IsStunned() then + desire = 6 + else + desire = 4 + end + end + + return desire +end + +function BehaviorAcidSpray:Begin() + --print( "BehaviorAcidSpray:Begin()" ) + + if self.acidSprayAbility and self.acidSprayAbility:IsFullyCastable() then + --print( "Casting Acid Spray" ) + local targetPoint = thisEntity.lastTargetPosition + RandomVector( 100 ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = self.acidSprayAbility:entindex(), + Position = targetPoint + } + return order + end + + return nil +end + +BehaviorAcidSpray.Continue = BehaviorAcidSpray.Begin diff --git a/aghanim_singleplayer/scripts/vscripts/ai/announcer_aghanim.lua b/aghanim_singleplayer/scripts/vscripts/ai/announcer_aghanim.lua new file mode 100755 index 0000000..94be3ee --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/announcer_aghanim.lua @@ -0,0 +1,356 @@ +-------------------------------------------------------------------------------- + +if CAnnouncerAghanim == nil then + CAnnouncerAghanim = class( {} ) +end + +-------------------------------------------------------------------------------- + +function Precache( context ) + +end + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if IsServer() then + if thisEntity == nil then + return + end + + thisEntity.AI = CAnnouncerAghanim( thisEntity, 1.0 ) + GameRules.Aghanim:SetAnnouncer( thisEntity.AI ) + end +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:constructor( hUnit, flInterval ) + self.me = hUnit + self.flDefaultInterval = flInterval + self.nHeroSelected = 1 + self.flLastSpeakTime = -1000 + self.flPostSpeechTime = -1000 + self.flPostSpeechDelay = 0.5 + self.bIsSpeaking = false + self.lastAbilityUpgradeHeroes = {} + self.hSpeakingUnitOverride = nil + self.nLastLaggingDepth = 0 + self.nLastShopDepth = 0 + self.nCallbacksIssued = 0 + self.me:SetThink( "OnAnnouncerThink", self, "OnAnnouncerThink", self.flDefaultInterval ) +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OverrideSpeakingUnit( hOverrideUnit ) + self.hSpeakingUnitOverride = hOverrideUnit +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:SetServerAuthoritative( bServerAuthoritative ) + self.me:SetServerAuthoritative( bServerAuthoritative ) +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnAnnouncerThink() + + -- Anything that needs thinking is here + return self.flDefaultInterval +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:Speak( flDelay, bForce, hCriteriaTable ) + + print( "CAnnouncerAghanim:Speak speaking:" .. tostring( self.bIsSpeaking ) .. " ( force: " .. tostring( bForce ) .. " ) " .. hCriteriaTable.announce_event ) + + -- Safety valve in case the callback breaks + if ( self.bIsSpeaking == true ) and ( self.flLastSpeakTime > 0 ) and ( GameRules:GetGameTime() - self.flLastSpeakTime ) > 30 then + print( "*** ERROR : CAnnouncerAghanim never got the OnSpeechComplete callback!" ) + self.bIsSpeaking = false + end + + -- Don't overlap lines unless this is a required line + if bForce == false and self:IsCurrentlySpeaking( ) == true then + print( "*** CAnnouncerAghanim discarding line -- " .. hCriteriaTable.announce_event .. " ( pst " .. self.flPostSpeechTime .. " cur " .. GameRules:GetGameTime() .. " ) " ) + return false + end + + -- Add standard criteria all speech has + hCriteriaTable[ "has_new_players" ] = GameRules.Aghanim:HasAnyNewPlayers() + hCriteriaTable[ "ascension_level" ] = GameRules.Aghanim:GetAscensionLevel() + hCriteriaTable[ "tournament_mode" ] = GameRules.Aghanim:IsInTournamentMode() + + local hSpeakingUnit = self.me + if self.hSpeakingUnitOverride ~= nil then + hSpeakingUnit = self.hSpeakingUnitOverride + end + + self.nCallbacksIssued = self.nCallbacksIssued + 1 + self.flLastSpeakTime = GameRules:GetGameTime() + flDelay + hSpeakingUnit:QueueConcept( flDelay, hCriteriaTable, Dynamic_Wrap( CAnnouncerAghanim, 'OnSpeechComplete' ), self, { nCallbackIndex = self.nCallbacksIssued } ) + self.bIsSpeaking = true + + return true + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnSpeechComplete( bDidActuallySpeak, hCallbackInfo ) + --print( "CAnnouncerAghanim:OnSpeechComplete " .. tostring( bDidActuallySpeak ) .. " " .. hCallbackInfo.nCallbackIndex .. " - " .. self.nCallbacksIssued ) + if hCallbackInfo.nCallbackIndex == self.nCallbacksIssued then + self.bIsSpeaking = false + self.flPostSpeechTime = GameRules:GetGameTime() + self.flPostSpeechDelay + end +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:IsCurrentlySpeaking( ) + return self.bIsSpeaking or ( self.flPostSpeechTime > GameRules:GetGameTime() ) +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnHeroSelectionStarted( ) + + self:Speak( 1.0, true, + { + announce_event = "hero_selection", + }) + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnHeroSelected( szHeroName ) + + self:Speak( 1.0, false, + { + announce_event = "hero_selected", + hero_name = szHeroName, + pick_number = self.nHeroSelected, + }) + + self.nHeroSelected = self.nHeroSelected + 1 + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnGameStarted( ) + + self:Speak( 3.0, true, + { + announce_event = "game_started", + }) + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnSelectRewards( ) + + self:Speak( 1.0, false, + { + announce_event = "select_rewards", + }) + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnItemPurchased( szHeroName, szItemName ) + + local nDepth = GameRules.Aghanim:GetCurrentRoom():GetDepth() + if self.nLastShopDepth == nDepth then + return + end + + self.nLastShopDepth = nDepth + + self:Speak( 1.0, true, + { + announce_event = "item_purchased", + hero_name = szHeroName, + item = szItemName, + }) + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnGameLost( ) + + self:Speak( 1.0, true, + { + announce_event = "game_lost", + depth = GameRules.Aghanim:GetCurrentRoom():GetDepth(), + }) + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnGameWon( ) + + self:Speak( 1.0, true, + { + announce_event = "game_won", + }) + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnEncounterSelected( hEncounter ) + + if hEncounter:GetRoom():GetDepth() == 1 then + return + end + + self:Speak( 3.0, true, + { + announce_event = "encounter_selected", + encounter_type = hEncounter:GetRoom():GetType(), + encounter_name = hEncounter:GetName(), + encounter_act = hEncounter:GetRoom():GetAct(), + elite = hEncounter:GetRoom():GetEliteRank(), + depth = hEncounter:GetRoom():GetDepth(), + act_boss = GameRules.Aghanim:GetBossUnitForAct( hEncounter:GetRoom():GetAct() ) + }) + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnEncounterStarted( hEncounter ) + + if hEncounter:GetRoom():GetDepth() == 1 then + return + end + + self:Speak( 3.0, false, + { + announce_event = "encounter_started", + encounter_type = hEncounter:GetRoom():GetType(), + encounter_name = hEncounter:GetName(), + encounter_act = hEncounter:GetRoom():GetAct(), + elite = hEncounter:GetRoom():GetEliteRank(), + depth = hEncounter:GetRoom():GetDepth(), + act_boss = GameRules.Aghanim:GetBossUnitForAct( hEncounter:GetRoom():GetAct() ) + }) + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnEncounterComplete( hEncounter ) + +-- local bForceSpeech = false +-- if GameRules.Aghanim:HasAnyNewPlayersForAnnouncer() == true and hEncounter:GetRoom():GetDepth() == 1 then +-- bForceSpeech = true +-- end + + self:Speak( 2.0, true, + { + announce_event = "encounter_completed", + encounter_type = hEncounter:GetRoom():GetType(), + encounter_name = hEncounter:GetName(), + encounter_act = hEncounter:GetRoom():GetAct(), + elite = hEncounter:GetRoom():GetEliteRank(), + depth = hEncounter:GetRoom():GetDepth(), + act_boss = GameRules.Aghanim:GetBossUnitForAct( hEncounter:GetRoom():GetAct() ) + }) + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnRewardSelected( hHero, nDepth, eRewardType, szRewardName ) + + self:Speak( 1.0, false, + { + announce_event = "reward_selected", + hero_name = hHero:GetUnitName(), + depth = nDepth, + reward_type = eRewardType, + reward_name = szRewardName, + }) + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnCreatureKilled( hEncounter, hUnit ) + + self:Speak( 1.0, false, + { + announce_event = "creature_killed", + unit = hUnit:GetUnitName(), + boss = hUnit:IsBoss(), + captain = hUnit:IsConsideredHero() == true and hUnit:IsBoss() == false, + encounter_name = hEncounter:GetName(), + encounter_act = hEncounter:GetRoom():GetAct(), + depth = hEncounter:GetRoom():GetDepth(), + }) + +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnHeroKilled( szHeroName, szKillerUnit, nRespawnsRemaining ) + + local kv = + { + announce_event = "hero_killed", + hero_name = szHeroName, + respawns_remaining = nRespawnsRemaining, + } + + if szKillerUnit ~= nil then + kv.killer = szKillerUnit + end + + -- Long delay to speak after the hero's own death line + self:Speak( 4.0, false, kv ) +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnCowardlyHero( szUnitName, szHeroName ) + + local kv = + { + announce_event = "hero_cowardly", + unit = szUnitName, + hero_name = szHeroName, + } + + self:Speak( 0.5, true, kv ) +end + +-------------------------------------------------------------------------------- + +function CAnnouncerAghanim:OnLaggingHero( szHeroName, nDepth ) + + if self.nLastLaggingDepth >= nDepth then + return + end + + self.nLastLaggingDepth = nDepth + local kv = + { + announce_event = "lagging_hero", + hero_name = szHeroName, + } + + self:Speak( 0.0, true, kv ) +end + + + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/baby_ogre_magi.lua b/aghanim_singleplayer/scripts/vscripts/ai/baby_ogre_magi.lua new file mode 100755 index 0000000..3fa41f8 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/baby_ogre_magi.lua @@ -0,0 +1,116 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + IgniteAbility = thisEntity:FindAbilityByName( "baby_ogre_magi_area_ignite" ) + BloodlustAbility = thisEntity:FindAbilityByName( "ogre_magi_channelled_bloodlust" ) + + thisEntity:SetContextThink( "OgreMagiThink", OgreMagiThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function OgreMagiThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if BloodlustAbility ~= nil and BloodlustAbility:IsChanneling() then + return 0.5 + end + + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + + local bIgniteReady = ( #enemies > 0 and IgniteAbility ~= nil and IgniteAbility:IsFullyCastable() ) + + if BloodlustAbility ~= nil and BloodlustAbility:IsFullyCastable() then + local friendlies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 1500, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _,friendly in pairs ( friendlies ) do + if friendly ~= nil then + if ( friendly:GetUnitName() == "npc_dota_creature_baby_ogre_tank" ) then + local fDist = ( friendly:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + local fCastRange = BloodlustAbility:GetCastRange( thisEntity:GetOrigin(), nil ) + --print( string.format( "fDist == %d, fCastRange == %d", fDist, fCastRange ) ) + if ( fDist <= fCastRange ) and ( ( #enemies > 0 ) or ( friendly:GetAggroTarget() ) ) then + return Bloodlust( friendly ) + elseif ( fDist > 400 ) and ( fDist < 900 ) then + if bIgniteReady == false then + return Approach( friendly ) + end + end + end + end + end + end + + if bIgniteReady then + return IgniteArea( enemies[ RandomInt( 1, #enemies ) ] ) + end + + local fFuzz = RandomFloat( -0.1, 0.1 ) -- Adds some timing separation to these magi + return 0.5 + fFuzz +end + +-------------------------------------------------------------------------------- + +function Approach( hUnit ) + --print( "Ogre Magi is approaching unit named " .. hUnit:GetUnitName() ) + + local vToUnit = hUnit:GetOrigin() - thisEntity:GetOrigin() + vToUnit = vToUnit:Normalized() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity:GetOrigin() + vToUnit * thisEntity:GetIdealSpeed() + }) + + return 1 +end + +-------------------------------------------------------------------------------- + +function Bloodlust( hUnit ) + --print( "Casting bloodlust on " .. hUnit:GetUnitName() ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + AbilityIndex = BloodlustAbility:entindex(), + TargetIndex = hUnit:entindex(), + Queue = false, + }) + + return 1 +end + +-------------------------------------------------------------------------------- + +function IgniteArea( hEnemy ) + --print( "Casting ignite on " .. hEnemy:GetUnitName() ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = IgniteAbility:entindex(), + Position = hEnemy:GetOrigin(), + Queue = false, + }) + + return 0.55 +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/baby_ogre_tank.lua b/aghanim_singleplayer/scripts/vscripts/ai/baby_ogre_tank.lua new file mode 100755 index 0000000..c2092f4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/baby_ogre_tank.lua @@ -0,0 +1,101 @@ +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + SmashAbility = thisEntity:FindAbilityByName( "baby_ogre_tank_melee_smash" ) + JumpAbility = thisEntity:FindAbilityByName( "baby_ogre_tank_jump_smash" ) + + thisEntity:SetContextThink( "OgreTankThink", OgreTankThink, 1 ) +end + +function OgreTankThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + -- Increase acquisition range after the initial aggro + if ( not thisEntity.bAcqRangeModified ) and thisEntity:GetAggroTarget() then + thisEntity:SetAcquisitionRange( 850 ) + thisEntity.bAcqRangeModified = true + end + + local hWintersCurseBuff = thisEntity:FindModifierByName( "modifier_aghsfort_winter_wyvern_winters_curse" ) + if hWintersCurseBuff and hWintersCurseBuff:GetAuraOwner() ~= nil then + if SmashAbility ~= nil and SmashAbility:IsCooldownReady() then + return Smash( hWintersCurseBuff:GetAuraOwner() ) + end + return 0.1 + end + + local nEnemiesRemoved = 0 + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + for i = 1, #enemies do + local enemy = enemies[i] + if enemy ~= nil then + local flDist = ( enemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + if flDist < 210 then + nEnemiesRemoved = nEnemiesRemoved + 1 + table.remove( enemies, i ) + end + end + end + + if JumpAbility ~= nil and JumpAbility:IsFullyCastable() and nEnemiesRemoved > 0 then + return Jump() + end + + if #enemies == 0 then + -- @todo: Could check whether there are ogre magi nearby that I should be positioning myself next to. Either that or have the magi come to me. + return 1 + end + + if SmashAbility ~= nil and SmashAbility:IsFullyCastable() then + return Smash( enemies[ 1 ] ) + end + + return 0.5 +end + + +function Jump() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = JumpAbility:entindex(), + Queue = false, + }) + + return 2.5 +end + + +function Smash( enemy ) + if enemy == nil then + return + end + + if ( not thisEntity:HasModifier( "modifier_provide_vision" ) ) then + --print( "If player can't see me, provide brief vision to his team as I start my Smash" ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 1.5 } ) + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = SmashAbility:entindex(), + Position = enemy:GetOrigin(), + Queue = false, + }) + + return 3 / thisEntity:GetHasteFactor() +end + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/bandit_archer.lua b/aghanim_singleplayer/scripts/vscripts/ai/bandit_archer.lua new file mode 100755 index 0000000..8123545 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/bandit_archer.lua @@ -0,0 +1,203 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hArrowAbility = thisEntity:FindAbilityByName( "bandit_archer_arrow" ) + + thisEntity.flRetreatRange = 600 + thisEntity.flAttackRange = thisEntity.hArrowAbility:GetCastRange( thisEntity:GetOrigin(), nil ) + thisEntity.PreviousOrder = "no_order" + thisEntity.fRetreatCooldown = 5 + + thisEntity:SetContextThink( "BanditArcherThink", BanditArcherThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function BanditArcherThink() + if not IsServer() then + return + end + + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if not thisEntity.bInitialized then + for i = 0, DOTA_ITEM_MAX - 1 do + local item = thisEntity:GetItemInSlot( i ) + if item and item:GetAbilityName() == "item_bandit_archer_shadow_blade" then + thisEntity.hShadowBladeAbility = item + end + end + + thisEntity.bInitialized = true + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity.flAttackRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return 0.1 + end + + local fHealthPctInvis = 15 + if thisEntity:GetHealthPercent() <= fHealthPctInvis and thisEntity.hShadowBladeAbility and thisEntity.hShadowBladeAbility:IsFullyCastable() then + return CastShadowBlade() + end + + if thisEntity:IsInvisible() then + -- Force a retreat, even if we've retreated recently + local hNearestEnemy = hEnemies[ 1 ] + return Retreat( hNearestEnemy ) + end + + local hAttackTarget = nil + local hApproachTarget = nil + for _, hEnemy in pairs( hEnemies ) do + if hEnemy ~= nil and hEnemy:IsAlive() then + local flDist = ( hEnemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + if flDist < thisEntity.flRetreatRange then + if ( thisEntity.fTimeOfLastRetreat and ( GameRules:GetGameTime() < thisEntity.fTimeOfLastRetreat + thisEntity.fRetreatCooldown ) ) then + -- We already retreated recently, so just attack + hAttackTarget = hEnemy + else + return Retreat( hEnemy ) + end + end + if flDist <= thisEntity.flAttackRange then + hAttackTarget = hEnemy + end + if flDist > thisEntity.flAttackRange then + hApproachTarget = hEnemy + end + end + end + + if hAttackTarget == nil and hApproachTarget ~= nil then + return Approach( hApproachTarget ) + end + + if hAttackTarget and thisEntity.hArrowAbility ~= nil and thisEntity.hArrowAbility:IsFullyCastable() then + return CastArrow( hAttackTarget ) + end + + if hAttackTarget then + thisEntity:FaceTowards( hAttackTarget:GetOrigin() ) + return HoldPosition() + end + + return 0.1 +end + +-------------------------------------------------------------------------------- + +function CastArrow( hEnemy ) + --print( "ai_bandit_archer - CastArrow" ) + + local fDist = ( hEnemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + local vTargetPos = hEnemy:GetOrigin() + + if ( fDist > 400 ) and hEnemy and hEnemy:IsMoving() then + local vLeadingOffset = hEnemy:GetForwardVector() * RandomInt( 200, 400 ) + vTargetPos = hEnemy:GetOrigin() + vLeadingOffset + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetPos, + AbilityIndex = thisEntity.hArrowAbility:entindex(), + Queue = false, + }) + + return 2 +end + +-------------------------------------------------------------------------------- + +function Approach(unit) + --print( "ai_bandit_archer - Approach" ) + + local vToEnemy = unit:GetOrigin() - thisEntity:GetOrigin() + vToEnemy = vToEnemy:Normalized() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity:GetOrigin() + vToEnemy * thisEntity:GetIdealSpeed() + }) + + return 1 +end + +-------------------------------------------------------------------------------- + +function Retreat(unit) + --print( "ai_bandit_archer - Retreat" ) + + local vAwayFromEnemy = thisEntity:GetOrigin() - unit:GetOrigin() + vAwayFromEnemy = vAwayFromEnemy:Normalized() + local vMoveToPos = thisEntity:GetOrigin() + vAwayFromEnemy * thisEntity:GetIdealSpeed() + + -- if away from enemy is an unpathable area, find a new direction to run to + local nAttempts = 0 + while ( ( not GridNav:CanFindPath( thisEntity:GetOrigin(), vMoveToPos ) ) and ( nAttempts < 5 ) ) do + vMoveToPos = thisEntity:GetOrigin() + RandomVector( thisEntity:GetIdealSpeed() ) + nAttempts = nAttempts + 1 + end + + thisEntity.fTimeOfLastRetreat = GameRules:GetGameTime() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = vMoveToPos, + }) + + return 1.25 +end + +-------------------------------------------------------------------------------- + +function HoldPosition() + --print( "ai_bandit_archer - Hold Position" ) + if thisEntity.PreviousOrder == "hold_position" then + return 0.5 + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_HOLD_POSITION, + Position = thisEntity:GetOrigin() + }) + + thisEntity.PreviousOrder = "hold_position" + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function CastShadowBlade() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hShadowBladeAbility:entindex(), + Queue = false, + }) + + return 0.5 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/bandit_captain.lua b/aghanim_singleplayer/scripts/vscripts/ai/bandit_captain.lua new file mode 100755 index 0000000..9e706d8 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/bandit_captain.lua @@ -0,0 +1,129 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hStiflingAbility = thisEntity:FindAbilityByName( "bandit_stifling_dagger" ) + thisEntity.hBlinkStrikeAbility = thisEntity:FindAbilityByName( "creature_blink_strike" ) + + thisEntity.hStiflingAbility:SetLevel( 4 ) + thisEntity.hBlinkStrikeAbility:SetLevel( 4 ) + + thisEntity:SetContextThink( "BanditCaptainThink", BanditCaptainThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function BanditCaptainThink() + if not IsServer() then + return + end + + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + -- Get last aggro timestamp + if ( not thisEntity.bHasAggro ) and thisEntity:GetAggroTarget() then + thisEntity.timeOfLastAggro = GameRules:GetGameTime() + thisEntity.bHasAggro = true + end + + if thisEntity.bHasAggro and ( not thisEntity:GetAggroTarget() ) then + thisEntity.bHasAggro = false + end + + if thisEntity.hStiflingAbility ~= nil and thisEntity.hStiflingAbility:IsChanneling() then + return 0.5 + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 900, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return 0.5 + end + + -- Categorize our enemies based on distance + local hMediumDistEnemies = { } + + local hFarthestEnemy = nil + local fFarthestEnemyDist = 0 + + for _, hEnemy in pairs( hEnemies ) do + local fDist = ( hEnemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + if fDist > fFarthestEnemyDist then + fFarthestEnemyDist = fDist + hFarthestEnemy = hEnemy + end + + if fDist > 300 then + table.insert( hMediumDistEnemies, hEnemy ) + end + end + + -- If we've had aggro for a bit, we're willing to launch Stifling Dagger + local fDelayBeforeStifling = RandomFloat( 2, 4 ) + if thisEntity.timeOfLastAggro and ( GameRules:GetGameTime() > ( thisEntity.timeOfLastAggro + fDelayBeforeStifling ) ) then + if thisEntity.hStiflingAbility ~= nil and thisEntity.hStiflingAbility:IsFullyCastable() then + if hFarthestEnemy ~= nil then + return CastStiflingDagger( hFarthestEnemy ) + else + return CastStiflingDagger( hEnemies[ RandomInt( 1, #hEnemies ) ] ) + end + end + end + + -- If we've had aggro for a bit, we're willing to launch Blink Strike + local fDelayBeforeBlinkStrike = RandomFloat( 3, 5 ) + if thisEntity.timeOfLastAggro and ( GameRules:GetGameTime() > ( thisEntity.timeOfLastAggro + fDelayBeforeBlinkStrike ) ) then + if thisEntity.hBlinkStrikeAbility ~= nil and thisEntity.hBlinkStrikeAbility:IsFullyCastable() then + -- Prefer to blinkstrike onto a unit we're not right next to + if #hMediumDistEnemies > 0 then + return CastBlinkStrike( hMediumDistEnemies[ RandomInt( 1, #hMediumDistEnemies ) ] ) + else + return CastBlinkStrike( hEnemies[ RandomInt( 1, #hEnemies ) ] ) + end + end + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function CastStiflingDagger( hEnemy ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = hEnemy:GetOrigin(), + AbilityIndex = thisEntity.hStiflingAbility:entindex(), + Queue = false, + }) + return 2 +end + +-------------------------------------------------------------------------------- + +function CastBlinkStrike( hEnemy ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hEnemy:entindex(), + AbilityIndex = thisEntity.hBlinkStrikeAbility:entindex(), + Queue = false, + }) + return 5 +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/basic_spell_casting_ai.lua b/aghanim_singleplayer/scripts/vscripts/ai/basic_spell_casting_ai.lua new file mode 100755 index 0000000..709d348 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/basic_spell_casting_ai.lua @@ -0,0 +1,376 @@ +require( "utility_functions" ) + +bBasicSpellDebug = false + +--Casting heuristics +CAST_RANGE_BUFFER = 100 +MOVE_TO_CAST_NO_TARGETS = false +NO_TARGET_AOE_ENEMIES_BASIC = 1 +NO_TARGET_AOE_ENEMIES_ULTIMATE = 2 +UNIT_TARGET_AOE_ENEMIES_BASIC = 1 +UNIT_TARGET_AOE_ENEMIES_ULTIMATE = 2 +POINT_TARGET_AOE_ENEMIES_BASIC = 1 +POINT_TARGET_AOE_ENEMIES_ULTIMATE = 2 + +UNIT_TARGET_METHODS = +{ + "closest", + "farthest", + "random", +} +UNIT_TARGET_METHOD = UNIT_TARGET_METHODS[3] + +function IsNoTargetSpellCastValid( hSpell ) + if bBasicSpellDebug then + print( "IsNoTargetSpellCastValid: " .. hSpell:GetAbilityName() ) + end + -- Assume that this spell is centered on me. + local nEnemiesRequired = NO_TARGET_AOE_ENEMIES_BASIC + if hSpell:GetAbilityType() == ABILITY_TYPE_ULTIMATE then + nEnemiesRequired = NO_TARGET_AOE_ENEMIES_ULTIMATE + end + + local nAbilityRadius = hSpell:GetAOERadius() + if nAbilityRadius == 0 then + -- Just slam it for now so the spell goes off. If spells don't have these in basic dota that is generally a bug + if bBasicSpellDebug then + print( "--WARNING - ability " .. hSpell:GetAbilityName() .. " has no defined AOE Radius! " ) + end + nAbilityRadius = 250 + end + + local enemies = FindUnitsInRadius( hSpell:GetCaster():GetTeamNumber(), hSpell:GetCaster():GetOrigin(), hSpell:GetCaster(), nAbilityRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + if #enemies < nEnemiesRequired then + return false + end + + if bBasicSpellDebug then + print( "--Found " .. #enemies .. " : " .. hSpell:GetAbilityName() ) + print( "" ) + end + + return true +end + +function GetBestAOEUnitTarget( hSpell ) + --For now, just use normal unit targeting + return GetBestUnitTarget( hSpell ) +end + +function GetBestDirectionalPointTarget( hSpell ) + if bBasicSpellDebug then + print( "GetBestDirectionalPointTarget: " .. hSpell:GetAbilityName() ) + end + + local nEnemiesRequired = UNIT_TARGET_AOE_ENEMIES_BASIC + if hSpell:GetAbilityType() == ABILITY_TYPE_ULTIMATE then + nEnemiesRequired = UNIT_TARGET_AOE_ENEMIES_ULTIMATE + end + + local nAbilityRadius = hSpell:GetAOERadius() + if nAbilityRadius == 0 then + -- Just slam it for now so the spell goes off. + -- Linear spells will likely need a specific solution, + -- as their radiuses are not universally defined + nAbilityRadius = 250 + if bBasicSpellDebug then + print( "--GetBestDirectionalPointTarget: WARNING - ability " .. hSpell:GetAbilityName() .. " has no defined AOE Radius! " ) + end + end + + local vLocation = GetTargetLinearLocation( hSpell:GetCaster():GetTeamNumber(), + DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, + DOTA_UNIT_TARGET_TEAM_ENEMY, + hSpell:GetCaster():GetOrigin(), + GetTryToUseSpellRange( hSpell:GetCaster(), hSpell ), + nAbilityRadius, + nEnemiesRequired ) + + if vLocation == vec3_invalid then + if bBasicSpellDebug then + print( "--GetBestDirectionalPointTarget: cannot find location with " .. nAbilityRadius .. " radius and " .. nEnemiesRequired .. " required enemies" ) + end + return nil + end + + if bBasicSpellDebug then + print( "--Found directional target point: (" .. vLocation.x .. ", " .. vLocation.y .. ", " .. vLocation.z .. " : " .. hSpell:GetAbilityName() ) + print( "" ) + end + + return vLocation +end + +function GetBestUnitTarget( hSpell ) + if bBasicSpellDebug and hSpell then + print( "GetBestUnitTarget: " .. hSpell:GetAbilityName() ) + end + + local enemies = FindUnitsInRadius( hSpell:GetCaster():GetTeamNumber(), hSpell:GetCaster():GetOrigin(), hSpell:GetCaster(), GetTryToUseSpellRange( hSpell:GetCaster(), hSpell ), DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + if #enemies == 0 then + if bBasicSpellDebug then + print( "--Found 0 enemies") + end + return nil + end + + if UNIT_TARGET_METHOD == "closest" then + return enemies[1] + end + if UNIT_TARGET_METHOD == "random" then + return enemies[RandomInt(1, #enemies)] + end + if UNIT_TARGET_METHOD == "farthest" then + return enemies[#enemies] + end + + return nil +end + +function GetBestAOEPointTarget( hSpell ) + if bBasicSpellDebug then + print( "GetBestAOEPointTarget: " .. hSpell:GetAbilityName() ) + end + + local nEnemiesRequired = UNIT_TARGET_AOE_ENEMIES_BASIC + if hSpell:GetAbilityType() == ABILITY_TYPE_ULTIMATE then + nEnemiesRequired = UNIT_TARGET_AOE_ENEMIES_ULTIMATE + end + + local nAbilityRadius = hSpell:GetAOERadius() + if nAbilityRadius == 0 then + -- Just slam it for now so the spell goes off. If spells don't have these in basic dota that is generally a bug + nAbilityRadius = 250 + if bBasicSpellDebug then + print( "--GetBestAOEPointTarget: WARNING - ability " .. hSpell:GetAbilityName() .. " has no defined AOE Radius! " ) + end + end + + local vLocation = GetTargetAOELocation( hSpell:GetCaster():GetTeamNumber(), + DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, + DOTA_UNIT_TARGET_TEAM_ENEMY, + hSpell:GetCaster():GetOrigin(), + GetTryToUseSpellRange( hSpell:GetCaster(), hSpell ), + nAbilityRadius, + nEnemiesRequired ) + if vLocation == vec3_invalid then + if bBasicSpellDebug then + print( "--GetBestAOEPointTarget: cannot find location with " .. nAbilityRadius .. " radius and " .. nEnemiesRequired .. " required enemies" ) + end + return nil + end + + if bBasicSpellDebug then + print( "--Found aoe target point: (" .. vLocation.x .. ", " .. vLocation.y .. ", " .. vLocation.z .. " : " .. hSpell:GetAbilityName() ) + end + + return vLocation +end + +function GetBestPointTarget( hSpell ) + -- for now just use AOE + return GetBestAOEPointTarget( hSpell ) +end + +function FindTreeTarget( hSpell ) + local Trees = GridNav:GetAllTreesAroundPoint( hSpell:GetCaster():GetOrigin(), GetTryToUseSpellRange( hSpell:GetCaster(), hSpell ), false ) + if #Trees == 0 then + return nil + end + + return Trees[RandomInt( 1, #Trees )] +end + +function CastSpellNoTarget( hSpell ) + if bBasicSpellDebug and hSpell then + print ( "CastSpellNoTarget: " .. hSpell:GetAbilityName() ) + end + ExecuteOrderFromTable({ + UnitIndex = hSpell:GetCaster():entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hSpell:entindex() + }) + + return GetSpellCastTime( hSpell ) +end + +function CastSpellUnitTarget( hSpell, hTarget ) + if bBasicSpellDebug and hSpell and hTarget then + print ( "CastSpellUnitTarget: " .. hSpell:GetAbilityName() .. ", target: ".. hTarget:GetUnitName() ) + end + ExecuteOrderFromTable({ + UnitIndex = hSpell:GetCaster():entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hTarget:entindex(), + AbilityIndex = hSpell:entindex() + }) + + return GetSpellCastTime( hSpell ) +end + +function CastSpellPointTarget( hSpell, vLocation ) + if bBasicSpellDebug and hSpell and vLocation then + print ( "CastSpellPointTarget: " .. hSpell:GetAbilityName() .. ", location: (" .. vLocation.x .. ", " .. vLocation.y .. ", " .. vLocation.z ) + end + ExecuteOrderFromTable({ + UnitIndex = hSpell:GetCaster():entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vLocation, + AbilityIndex = hSpell:entindex(), + }) + + return GetSpellCastTime( hSpell ) +end + +function CastSpellTreeTarget( hSpell, hTree ) + if bBasicSpellDebug and hSpell then + print( "CastSpellTreeTarget: " .. hSpell:GetAbilityName() ) + end + + ExecuteOrderFromTable({ + UnitIndex = hSpell:GetCaster():entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET_TREE, + TargetIndex = GetTreeIdForEntityIndex( hTree:entindex() ), + AbilityIndex = hSpell:entindex(), + }) + return GetSpellCastTime( hSpell ) +end + +function CastSpell( hSpell ) + if bBasicSpellDebug and hSpell then + print ( "CastSpell: " .. hSpell:GetAbilityName() ) + end + if hSpell == nil or hSpell:IsFullyCastable() == false then + if bBasicSpellDebug then + print ( "No valid spell or spell not ready!" ) + end + return 0.1 + end + + local hTarget = nil + local vTargetLoc = nil + + local nBehavior = hSpell:GetBehavior() + local nTargetTeam = hSpell:GetAbilityTargetTeam() + local nTargetType = hSpell:GetAbilityTargetType() + + if bitand( nTargetTeam, DOTA_UNIT_TARGET_TEAM_FRIENDLY ) ~= 0 and hSpell:GetAbilityName() ~= "pugna_life_drain" and hSpell:GetAbilityName() ~= "frostivus2018_luna_eclipse" then + --Maybe target a minion? + if bBasicSpellDebug then + print( "Try to cast friendly spell on myself" ) + end + return CastSpellUnitTarget( hSpell, hSpell:GetCaster() ) + else + if bitand( nTargetType, DOTA_UNIT_TARGET_TREE ) ~= 0 then + if bBasicSpellDebug then + print( "try to cast tree targeting spell" ) + end + local Tree = FindTreeTarget( hSpell ) + if Tree ~= nil then + return CastSpellTreeTarget( hSpell, Tree ) + end + end + + if bitand( nBehavior, DOTA_ABILITY_BEHAVIOR_NO_TARGET ) ~= 0 or bitand( nBehavior, DOTA_ABILITY_BEHAVIOR_IMMEDIATE ) ~= 0 and IsNoTargetSpellCastValid( hSpell ) then + if bBasicSpellDebug then + print( "Try to cast no target or immediate spell" ) + end + return CastSpellNoTarget( hSpell ) + end + + if bitand( nBehavior, DOTA_ABILITY_BEHAVIOR_DIRECTIONAL ) ~= 0 then + if bBasicSpellDebug then + print( "spell is directional" ) + end + local vTargetLoc = GetBestDirectionalPointTarget( hSpell ) + if vTargetLoc ~= nil then + if bBasicSpellDebug then + print( "Try to cast directional spell" ) + end + return CastSpellPointTarget( hSpell, vTargetLoc ) + end + end + + if bitand( nBehavior, DOTA_ABILITY_BEHAVIOR_POINT ) ~= 0 then + if bBasicSpellDebug then + print( "Stolen spell is point" ) + end + if bitand( nBehavior, DOTA_ABILITY_BEHAVIOR_AOE ) ~= 0 then + if bBasicSpellDebug then + print( "Stolen spell is point aoe " ) + end + local vTargetLoc = GetBestAOEPointTarget( hSpell ) + if vTargetLoc ~= nil then + if bBasicSpellDebug then + print( "Try to cast point aoe spell" ) + end + return CastSpellPointTarget( hSpell, vTargetLoc ) + end + else + if bBasicSpellDebug then + print( "spell is point non-aoe" ) + end + local vTargetLoc = GetBestPointTarget( hSpell ) + if vTargetLoc ~= nil then + if bBasicSpellDebug then + print( "Try to cast point non-aoe spell" ) + end + return CastSpellPointTarget( hSpell, vTargetLoc ) + end + end + end + + if bitand( nBehavior, DOTA_ABILITY_BEHAVIOR_UNIT_TARGET ) ~= 0 then + if bBasicSpellDebug then + print( "spell is unit targeted" ) + end + if bitand( nBehavior, DOTA_ABILITY_BEHAVIOR_AOE ) ~= 0 then + if bBasicSpellDebug then + print( "spell is unit targeted aoe " ) + end + local hTarget = GetBestAOEUnitTarget( hSpell ) + if hTarget ~= nil then + if bBasicSpellDebug then + print( "Try to cast unit aoe spell" ) + end + return CastSpellUnitTarget( hSpell, hTarget ) + end + else + if bBasicSpellDebug then + print( "spell is unit targeted non aoe" ) + end + local hTarget = GetBestUnitTarget( hSpell ) + if hTarget ~= nil then + if bBasicSpellDebug then + print( "Try to cast unit spell" ) + end + return CastSpellUnitTarget( hSpell, hTarget ) + end + end + end + end + if bBasicSpellDebug then + print ( "No valid spell casting for my spell" ) + end + return 0.1 +end + +function GetSpellCastTime( hSpell ) + local flCastPoint = math.max( 0.25, hSpell:GetCastPoint() ) + if bBasicSpellDebug then + print( "GetSpellCastTime " .. hSpell:GetAbilityName() .. ": " .. flCastPoint + 0.01 ) + end + return flCastPoint + 0.01 +end + +function GetTryToUseSpellRange( hCaster, hSpell ) + local flCastRange = hSpell:GetCastRange( vec3_invalid, nil ) + local flAcquisitionRange = hCaster:GetAcquisitionRange() + local flTryRange = flCastRange + + if flAcquisitionRange > flCastRange then + flTryRange = flAcquisitionRange + end + + return flTryRange + CAST_RANGE_BUFFER +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/ai/beastmaster.lua b/aghanim_singleplayer/scripts/vscripts/ai/beastmaster.lua new file mode 100755 index 0000000..907b605 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/beastmaster.lua @@ -0,0 +1,174 @@ +--[[ Beastmaster AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorWildAxes, BehaviorPrimalRoar } ) +end + +function AIThink() -- For some reason AddThinkToEnt doesn't accept member functions + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 1000 ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorWildAxes = {} + +function BehaviorWildAxes:Evaluate() + --print( "BehaviorWildAxes:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.wildAxesAbility = thisEntity:FindAbilityByName( "beastmaster_wild_axes" ) + if self.wildAxesAbility and self.wildAxesAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + for _,hUnit in pairs( enemies ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hGushModifier = hUnit:FindModifierByName( "modifier_beastmaster_wild_axes" ) + if hGushModifier ~= nil then + --print("Enemy is already axed") + desire = 0 + else + desire = #enemies + 1 + end + end + end + end + end + + return desire +end + +function BehaviorWildAxes:Begin() + --print( "BehaviorWildAxes:Begin()" ) + if self.wildAxesAbility and self.wildAxesAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #enemies == 0 then + return nil + end + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 1.1 } ) + local target = enemies[#enemies] + local targetPoint = target:GetOrigin() + RandomVector( 100 ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = targetPoint, + AbilityIndex = self.wildAxesAbility:entindex(), + Queue = false, + } + return order + end + + return nil +end + +BehaviorWildAxes.Continue = BehaviorWildAxes.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorPrimalRoar = {} + +function BehaviorPrimalRoar:Evaluate() + --print( "BehaviorPrimalRoar:Evaluate()" ) + local desire = 0 + + self.primalRoarAbility = thisEntity:FindAbilityByName( "beastmaster_primal_roar" ) + if self.primalRoarAbility and self.primalRoarAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 600, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( thisEntity:GetHealthPercent() > 75 ) then + return desire + end + if ( #enemies >= 0 ) then + for _,hUnit in pairs( enemies ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hStunModifier = hUnit:FindModifierByName( "modifier_stunned" ) + if hStunModifier ~= nil then + --print("Enemy is already stunned") + desire = 0 + else + desire = #enemies + 1 + end + end + end + end + end + + return desire +end + +function BehaviorPrimalRoar:Begin() + --print( "BehaviorPrimalRoar:Begin()" ) + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 600, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #enemies == 0 then + return nil + end + local target = enemies[#enemies] + if self.primalRoarAbility and self.primalRoarAbility:IsFullyCastable() then + --print( "Casting Primal Roar" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = target:entindex(), + AbilityIndex = self.primalRoarAbility:entindex(), + Queue = false, + } + return order + end + + return nil +end + +BehaviorPrimalRoar.Continue = BehaviorPrimalRoar.Begin + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorWildAxes, BehaviorPrimalRoar } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/big_golem.lua b/aghanim_singleplayer/scripts/vscripts/ai/big_golem.lua new file mode 100755 index 0000000..88a11e3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/big_golem.lua @@ -0,0 +1,59 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + RockGolemSmashAbility = thisEntity:FindAbilityByName( "aghsfort_rock_golem_smash" ) + + thisEntity:SetContextThink( "BigGolemThink", BigGolemThink, 0.25 ) +end + +-------------------------------------------------------------------------------- + +function BigGolemThink() + if thisEntity == nil or thisEntity:IsNull() or thisEntity:IsAlive() == false then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + local fSmashSearchRadius = RockGolemSmashAbility:GetCastRange() + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, fSmashSearchRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #enemies == 0 then + return 0.25 + end + + if RockGolemSmashAbility ~= nil and RockGolemSmashAbility:IsCooldownReady() then + local hTarget = enemies[ RandomInt( 1, #enemies ) ] + return CastRockSmash( hTarget ) + end + + return 0.25 +end + +-------------------------------------------------------------------------------- + +function CastRockSmash( hTarget ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 1.3 } ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = RockGolemSmashAbility:entindex(), + Position = hTarget:GetAbsOrigin(), + Queue = false, + }) + + return 2.0 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/bomb_squad_ai.lua b/aghanim_singleplayer/scripts/vscripts/ai/bomb_squad_ai.lua new file mode 100755 index 0000000..44e0132 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/bomb_squad_ai.lua @@ -0,0 +1,147 @@ + + + +function Precache( context ) + PrecacheUnitByNameSync( "npc_aghsfort_creature_bomb_squad_landmine", context, -1 ) + PrecacheResource( "particle", "particles/units/heroes/hero_techies/techies_land_mine_explode.vpcf", context ) + PrecacheResource( "particle", "particles/econ/events/darkmoon_2017/darkmoon_calldown_marker_ring.vpcf", context ) +end + + + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.AggroAbility = thisEntity:FindAbilityByName( "bomb_squad_self_cast" ) + thisEntity.MineCharge = thisEntity:FindAbilityByName( "bomb_squad_mine_charge" ) + thisEntity.StasisLaunch = thisEntity:FindAbilityByName( "bomb_squad_stasis_launch" ) + + thisEntity.flLastOrder = GameRules:GetGameTime() + thisEntity:SetContextThink( "BombSquadThink", BombSquadThink, 1 ) +end + + + + +function BombSquadThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if thisEntity == nil or thisEntity:IsNull() or ( not thisEntity:IsAlive() ) then + return -1 + end + + + if (thisEntity:GetAggroTarget() == nil and GameRules:GetGameTime() - thisEntity.flLastOrder) > (4 - RandomFloat(0 ,1 )) then + thisEntity.flLastOrder = GameRules:GetGameTime() + return DoMove() + end + + if thisEntity.StasisLaunch and thisEntity.StasisLaunch:IsFullyCastable() then + local StasisLaunchRadius = 650 + local hEnemiesNearby = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), thisEntity, StasisLaunchRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NONE, FIND_FARTHEST, false ) + if #hEnemiesNearby > 0 then + local hFarthestEnemy = hEnemiesNearby[ 1 ] + return CastStasisLaunch( hFarthestEnemy ) + end + end + + if thisEntity.MineCharge and thisEntity.MineCharge:IsFullyCastable() then + return CastMineCharge() + end + +-- if AggroAbility ~= true and AggroAbility:IsFullyCastable() then +-- bIsAggro = true +-- return CastAggroAbility() +-- end + + return 0.5 +end + + +--function CastAggroAbility() +-- ExecuteOrderFromTable({ +-- UnitIndex = thisEntity:entindex(), +-- OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, +-- AbilityIndex = AggroAbility:entindex(), +-- Queue = false, +-- }) +-- +-- return 1 +--end + + +function DoMove() + if IsServer() then + + for i=1,4 do + local vLoc = FindPathablePositionNearby(thisEntity:GetAbsOrigin(), 100, 400 ) + + if GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vLoc ) then + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = vLoc + }) + break + end + end + end + return 0.5 +end + + +-------------------------------------------------------------------------------- + +function CastMineCharge() + if IsServer() then + + for i=1,12 do + local vLoc = FindPathablePositionNearby(thisEntity:GetAbsOrigin(), 1800, 2400 ) + + if GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vLoc ) then + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vLoc, + AbilityIndex = thisEntity.MineCharge:entindex(), + Queue = false, + }) + break + end + end + return 3 + end +end + + +-------------------------------------------------------------------------------- + +function CastStasisLaunch( hTarget ) + if hTarget == nil or hTarget:IsNull() or hTarget:IsAlive() == false then + return 0.5 + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = hTarget:GetOrigin(), + AbilityIndex = thisEntity.StasisLaunch:entindex(), + Queue = false, + }) + + return 2 +end diff --git a/aghanim_singleplayer/scripts/vscripts/ai/bomb_squad_landmine_ai.lua b/aghanim_singleplayer/scripts/vscripts/ai/bomb_squad_landmine_ai.lua new file mode 100755 index 0000000..797c256 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/bomb_squad_landmine_ai.lua @@ -0,0 +1,65 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + DetonateAblity = thisEntity:FindAbilityByName( "bomb_squad_landmine_detonate" ) + thisEntity:SetContextThink( "LandmineThink", LandmineThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function LandmineThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if not thisEntity.bInitialized then + thisEntity.vInitialSpawnPos = thisEntity:GetOrigin() + thisEntity.bInitialized = true + end + + if DetonateAblity and DetonateAblity:IsFullyCastable() then + local fDetonateRadius = DetonateAblity:GetSpecialValueFor( "detonate_radius" ) + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, fDetonateRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #enemies == 0 then + return 0.5 + end + + if thisEntity:FindModifierByName("modifier_bomb_squad_landmine_detonate") then + --we're already exploding + return -1 + end + + return Detonate() + end + return 1 +end + + +-------------------------------------------------------------------------------- + +function Detonate() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = DetonateAblity:entindex(), + Queue = false, + }) + return -1 +end + + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/boss_aghanim.lua b/aghanim_singleplayer/scripts/vscripts/ai/boss_aghanim.lua new file mode 100755 index 0000000..eaf906e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/boss_aghanim.lua @@ -0,0 +1,444 @@ +require( "ai/boss_base" ) + +-------------------------------------------------------------------------------- + +if CBossAghanim == nil then + CBossAghanim = class( {}, {}, CBossBase ) +end + +-------------------------------------------------------------------------------- + +function Precache( context ) +end + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if IsServer() then + if thisEntity == nil then + return + end + + thisEntity.AI = CBossAghanim( thisEntity, 1.0 ) + end +end + +-------------------------------------------------------------------------------- + +function CBossAghanim:constructor( hUnit, flInterval ) + CBossBase.constructor( self, hUnit, flInterval ) + + self.bDefeated = false + + self.ATTACKS_BETWEEN_TELEPORT = 3 + self.ENRAGE_LESS_ATTACKS_BETWEEN_TELEPORT = 1 + self.nCurrentAttacksBetweenTeleport = self.ATTACKS_BETWEEN_TELEPORT + + self.PHASE_CRYSTAL_ATTACK = 1 + self.PHASE_STAFF_BEAMS = 2 + self.PHASE_SUMMON_PORTALS = 3 + self.PHASE_SPELL_SWAP = 4 + self.PHASE_SHARD_ATTACK = 5 + + self.nSpellSwapPct = 80 + self.bSpellSwapEnabled = false + self.nShardAttackPct = 50 + self.bShardAttackEnabled = false + self.nLevelUpPct = 66 + self.bHasLeveledUp = false + + self.AllowedPhases = + { + self.PHASE_CRYSTAL_ATTACK, + self.PHASE_SUMMON_PORTALS, + self.PHASE_STAFF_BEAMS, + } + + self.flInitialAcquireRange = 5000 + self.flAggroAcquireRange = 5000 + self.nPhaseIndex = 1 + self.nNumAttacksBeforeTeleport = self.nCurrentAttacksBetweenTeleport + self.bReturnHome = true + self.vLastBlinkLocation = Vector( -3328, 3264, 0 ) + + self.me:SetThink( "OnBossAghanimThink", self, "OnBossAghanimThink", self.flDefaultInterval ) +end + +-------------------------------------------------------------------------------- + +function CBossAghanim:GetCurrentPhase() + return self.AllowedPhases[ self.nPhaseIndex ] +end + +-------------------------------------------------------------------------------- + + +function CBossAghanim:SetEncounter( hEncounter ) + CBossBase.SetEncounter( self, hEncounter ) + + self.TeleportPositions = {} + + local TeleportPositions = hEncounter:GetRoom():FindAllEntitiesInRoomByName( "teleport_position" ) + for _,hEnt in pairs ( TeleportPositions ) do + table.insert( self.TeleportPositions, hEnt:GetAbsOrigin() ) + end + + local TeleportPositionMain = hEncounter:GetRoom():FindAllEntitiesInRoomByName( "teleport_position_main" ) + if #TeleportPositionMain > 0 then + self.TeleportPositionMain = TeleportPositionMain[1] + self.me.vHomePosition = self.TeleportPositionMain:GetAbsOrigin() + + table.insert( self.TeleportPositions, self.me.vHomePosition ) + end +end + +-------------------------------------------------------------------------------- + +function CBossAghanim:SetupAbilitiesAndItems() + CBossBase.SetupAbilitiesAndItems( self ) + + self.hBlink = self.me:FindAbilityByName( "aghanim_blink" ) + if self.hBlink ~= nil then + self.hBlink.Evaluate = self.EvaluateBlink + self.AbilityPriority[ self.hBlink:GetAbilityName() ] = 5 + end + + self.hCrystalAttack = self.me:FindAbilityByName( "aghanim_crystal_attack" ) + if self.hCrystalAttack ~= nil then + self.hCrystalAttack.nCrystalAttackPhase = 1 + self.hCrystalAttack.hLastCrystalTarget = nil + self.hCrystalAttack.Evaluate = self.EvaluateCrystalAttack + self.AbilityPriority[ self.hCrystalAttack:GetAbilityName() ] = 4 + end + + self.hStaffBeams = self.me:FindAbilityByName( "aghanim_staff_beams" ) + if self.hStaffBeams ~= nil then + self.hStaffBeams.Evaluate = self.EvaluateStaffBeams + self.AbilityPriority[ self.hStaffBeams:GetAbilityName() ] = 3 + end + + self.hSummonPortals = self.me:FindAbilityByName( "aghanim_summon_portals" ) + if self.hSummonPortals ~= nil then + self.hSummonPortals.Evaluate = self.EvaluateSummonPortals + self.AbilityPriority[ self.hSummonPortals:GetAbilityName() ] = 2 + end + + self.hSpellSwap = self.me:FindAbilityByName( "aghanim_spell_swap" ) + if self.hSpellSwap ~= nil then + self.hSpellSwap.Evaluate = self.EvaluateSpellSwap + self.AbilityPriority[ self.hSpellSwap:GetAbilityName() ] = 1 + end + + self.hShardAttack = self.me:FindAbilityByName( "aghanim_shard_attack" ) + if self.hShardAttack ~= nil then + self.hShardAttack.Evaluate = self.EvaluateShardAttack + self.AbilityPriority[ self.hShardAttack:GetAbilityName() ] = 1 + end +end +-------------------------------------------------------------------------------- + +function CBossAghanim:OnBossAghanimThink() + if self.bDefeated then + return -1 + end + + return self:OnBaseThink() +end + +-------------------------------------------------------------------------------- + +function CBossAghanim:OnFirstSeen() + CBossBase.OnFirstSeen( self ) +end + +-------------------------------------------------------------------------------- + +function CBossAghanim:ChangePhase() + self.nNumAttacksBeforeTeleport = self.nNumAttacksBeforeTeleport - 1 + --print ( "Aghanim is changing phase! old:" .. self:GetCurrentPhase() ) + if self.nPhaseIndex == #self.AllowedPhases then + self.nPhaseIndex = 1 + else + self.nPhaseIndex = self.nPhaseIndex + 1 + end + + self.nPhase = self.AllowedPhases[ self.nPhaseIndex ] + if self.nPhase == self.PHASE_SHARD_ATTACK then + self.nNumAttacksBeforeTeleport = 0 + self.bReturnHome = true + end +end + +-------------------------------------------------------------------------------- + +function CBossAghanim:OnHealthPercentThreshold( nPct ) + CBossBase.OnHealthPercentThreshold( self, nPct ) + + if nPct < self.nSpellSwapPct and self.bSpellSwapEnabled == false then + self.nCurrentAttacksBetweenTeleport = math.max( 1, self.nCurrentAttacksBetweenTeleport - self.ENRAGE_LESS_ATTACKS_BETWEEN_TELEPORT ) + self.bSpellSwapEnabled = true + self.AllowedPhases = + { + self.PHASE_SPELL_SWAP, + self.PHASE_SUMMON_PORTALS, + self.PHASE_STAFF_BEAMS, + self.PHASE_CRYSTAL_ATTACK, + } + + self.nPhaseIndex = #self.AllowedPhases + self:ChangePhase() + + self.nNumAttacksBeforeTeleport = 0 + self.bReturnHome = true + end + + if nPct < self.nLevelUpPct and self.bHasLeveledUp == false then + self.bHasLeveledUp = true + self.me:CreatureLevelUp( 1 ) + end + + + if nPct < self.nShardAttackPct and self.bShardAttackEnabled == false then + self.nCurrentAttacksBetweenTeleport = math.max( 1, self.nCurrentAttacksBetweenTeleport - self.ENRAGE_LESS_ATTACKS_BETWEEN_TELEPORT ) + self.bShardAttackEnabled = true + self.AllowedPhases = + { + self.PHASE_SHARD_ATTACK, + self.PHASE_STAFF_BEAMS, + self.PHASE_CRYSTAL_ATTACK, + self.PHASE_SPELL_SWAP, + self.PHASE_SUMMON_PORTALS, + } + + self.nPhaseIndex = #self.AllowedPhases + self:ChangePhase() + + self.nNumAttacksBeforeTeleport = 0 + self.bReturnHome = true + end +end + +-------------------------------------------------------------------------------- + +function CBossAghanim:EvaluateCrystalAttack() + if self:GetCurrentPhase() ~= self.PHASE_CRYSTAL_ATTACK then + return nil + end + + local Enemies = shallowcopy( self.hPlayerHeroes ) + local Order = nil + if Enemies == nil or #Enemies == 0 then + return Order + end + + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = Enemies[ #Enemies ]:GetAbsOrigin(), + AbilityIndex = self.hCrystalAttack:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hCrystalAttack ) + self.hCrystalAttack.hLastCrystalTarget = Enemies[#Enemies] + + return Order +end + +-------------------------------------------------------------------------------- + +function CBossAghanim:EvaluateStaffBeams() + if self:GetCurrentPhase() ~= self.PHASE_STAFF_BEAMS then + return nil + end + + local vTargetPos = self.me.vHomePosition + if vTargetPos == self.vLastBlinkLocation then + local hEnemies = GetEnemyHeroesInRange( self.me, 5000 ) + if #hEnemies > 0 then + vTargetPos = hEnemies[#hEnemies]:GetAbsOrigin() + end + end + + local Order = nil + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetPos, + AbilityIndex = self.hStaffBeams:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hStaffBeams ) + self.hStaffBeams:GetChannelTime() + + return Order +end + + +-------------------------------------------------------------------------------- + +function CBossAghanim:EvaluateBlink() + if self.nNumAttacksBeforeTeleport > 0 then + return nil + end + + if self.bReturnHome == true and self.vLastBlinkLocation == self.me.vHomePosition then + self.nNumAttacksBeforeTeleport = self.nCurrentAttacksBetweenTeleport + self.bReturnHome = false + return nil + end + + local vTeleportLocations = shallowcopy( self.TeleportPositions ) + for k,v in pairs ( vTeleportLocations ) do + if v == self.vLastBlinkLocation then + table.remove( vTeleportLocations, k ) + break + end + end + + local vPos = nil + if self.bReturnHome == true then + vPos = self.me.vHomePosition + else + if self:GetCurrentPhase() == self.PHASE_SUMMON_PORTALS then + local hEnemies = GetEnemyHeroesInRange( self.me, 5000 ) + if #hEnemies > 0 then + local vFarthestEnemyPos = hEnemies[#hEnemies]:GetAbsOrigin() + local vClosestPosToEnemy = nil + local flShortestDist = 99999 + for _,vTeleportPos in pairs ( vTeleportLocations ) do + local flDistToEnemy = ( vTeleportPos - vFarthestEnemyPos ):Length2D() + if flDistToEnemy < flShortestDist then + flShortestDist = flDistToEnemy + vClosestPosToEnemy = vTeleportPos + end + end + + if vTeleportPos ~= nil then + vPos = vClosestPosToEnemy + end + end + end + + if vPos == nil then + vPos = vTeleportLocations[ RandomInt( 1, #vTeleportLocations ) ] + end + end + + if vPos == nil then + return nil + end + + self.vLastBlinkLocation = vPos + + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vPos, + AbilityIndex = self.hBlink:entindex(), + Queue = false, + } + Order.flOrderInterval = 3.0 + + return Order +end + +-------------------------------------------------------------------------------- + +function CBossAghanim:EvaluateSummonPortals() + if self:GetCurrentPhase() ~= self.PHASE_SUMMON_PORTALS then + return nil + end + + local vTarget = self.me.vHomePosition + local hEnemies = GetEnemyHeroesInRange( self.me, 5000 ) + if #hEnemies > 0 and self.vLastBlinkLocation == self.me.vHomePosition then + vTarget = hEnemies[ 1 ]:GetAbsOrigin() + end + + local Order = nil + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTarget, + AbilityIndex = self.hSummonPortals:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hSummonPortals ) + self.hSummonPortals:GetChannelTime() + + return Order +end + +-------------------------------------------------------------------------------- + +function CBossAghanim:EvaluateSpellSwap() + if self:GetCurrentPhase() ~= self.PHASE_SPELL_SWAP then + return nil + end + + local vTargetPos = self.me.vHomePosition + if vTargetPos == self.vLastBlinkLocation then + local hEnemies = GetEnemyHeroesInRange( self.me, 5000 ) + if #hEnemies > 0 then + vTargetPos = hEnemies[#hEnemies]:GetAbsOrigin() + end + end + + local Order = nil + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetPos, + AbilityIndex = self.hSpellSwap:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hSpellSwap ) + self.hSpellSwap:GetChannelTime() + + return Order +end + +-------------------------------------------------------------------------------- + +function CBossAghanim:EvaluateShardAttack() + if self:GetCurrentPhase() ~= self.PHASE_SHARD_ATTACK then + return nil + end + + local Order = nil + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = self.me.vHomePosition + Vector( 0, -150, 0 ), + AbilityIndex = self.hShardAttack:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hShardAttack ) + self.hShardAttack:GetChannelTime() + + return Order +end + + +-------------------------------------------------------------------------------- + +function CBossAghanim:OnBossUsedAbility( szAbilityName ) + if szAbilityName == "aghanim_blink" then + self.nNumAttacksBeforeTeleport = self.nCurrentAttacksBetweenTeleport + self.bReturnHome = false + return + end + + if szAbilityName == "aghanim_crystal_attack" then + if self.hCrystalAttack.nPhase == 6 then + self:ChangePhase() + end + + return + end + + self:ChangePhase() +end + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/boss_base.lua b/aghanim_singleplayer/scripts/vscripts/ai/boss_base.lua new file mode 100755 index 0000000..da377b2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/boss_base.lua @@ -0,0 +1,206 @@ +require( "ai/shared" ) +require( "ai/basic_spell_casting_ai" ) + +-------------------------------------------------------------------------------- + +if CBossBase == nil then + CBossBase = class({}) +end + +-------------------------------------------------------------------------------- + +function CBossBase:constructor( hUnit, flInterval ) + self.me = hUnit + self.flDefaultInterval = flInterval + self.AbilityPriority = {} + self.hPlayerHeroes = {} + self.QueuedOrders = {} + self.Encounter = nil + self.bSeenAnyEnemy = false + self.nLastHealthPct = 10000 + self.flInitialAcquireRange = 1800 + self.flAggroAcquireRange = 4500 + + self:SetupAbilitiesAndItems() + + self.nAbilityListener = ListenToGameEvent( "dota_non_player_used_ability", Dynamic_Wrap( getclass( self ), 'OnNonPlayerUsedAbility' ), self ) +end + +-------------------------------------------------------------------------------- + +function CBossBase:SetupAbilitiesAndItems() + --empty +end + +-------------------------------------------------------------------------------- + +function CBossBase:SetEncounter( Encounter ) + self.Encounter = Encounter +end + +-------------------------------------------------------------------------------- + +function CBossBase:OnBaseThink() + if self.me == nil or self.me:IsNull() or self.me:IsAlive() == false then + StopListeningToGameEvent( self.nAbilityListener ) + return -1 + end + + Order = nil + + if self.Encounter == nil or self.Encounter:HasStarted() == false then + return 0.01 + end + + if GameRules:IsGamePaused() then + return 0.01 + end + + local flRange = self.flInitialAcquireRange + if self.bSeenAnyEnemy == true then + flRange = self.flAggroAcquireRange + end + self.hPlayerHeroes = GetVisibleEnemyHeroesInRange( self.me, flRange ) + + if #self.hPlayerHeroes == 0 then + goto autoattack + elseif self.bSeenAnyEnemy == false then + self.bSeenAnyEnemy = true + self:OnFirstSeen() + end + + if self.nLastHealthPct > self.me:GetHealthPercent() then + self.nLastHealthPct = self.me:GetHealthPercent() + self:OnHealthPercentThreshold( self.nLastHealthPct ) + end + + AbilitiesReady = self:GetReadyAbilitiesAndItems() + if #AbilitiesReady == 0 then + goto autoattack + end + + if #self.QueuedOrders > 0 then + Order = self.QueuedOrders[ 1 ] + table.remove( self.QueuedOrders, 1 ) + goto execute_order + else + for _,Ability in pairs ( AbilitiesReady ) do + if Ability.Evaluate ~= nil then + local TryOrder = Ability.Evaluate( self ) + if TryOrder ~= nil then + Order = TryOrder + break + end + end + end + end + + ::autoattack:: + + NonAbilityOrder = nil + if Order == nil then + NonAbilityOrder = self:GetNonAbilityOrder() + if NonAbilityOrder ~= nil then + --print( 'NON ABILITY ORDER' ) + Order = NonAbilityOrder + end + end + + if Order == nil and #self.hPlayerHeroes > 0 then + --print( 'autoattack for ' .. self.flDefaultInterval ) + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = self.hPlayerHeroes[ 1 ]:GetAbsOrigin(), + } + Order.flOrderInterval = self.flDefaultInterval + end + + ::execute_order:: + if Order then + --print( 'Executing Order ' .. Order.OrderType .. ' and sleeping for ' .. Order.flOrderInterval ) + ExecuteOrderFromTable( Order ) + return Order.flOrderInterval + end + + ::idle:: + return self.flDefaultInterval +end + +-------------------------------------------------------------------------------- + +function CBossBase:GetReadyAbilitiesAndItems() + local AbilitiesReady = {} + for n=0,self.me:GetAbilityCount() - 1 do + local hAbility = self.me:GetAbilityByIndex( n ) + if hAbility and hAbility:IsFullyCastable() and not hAbility:IsPassive() and not hAbility:IsHidden() and hAbility:IsActivated() then + --print( 'Adding ABILITY ' .. hAbility:GetAbilityName() ) + if self.AbilityPriority[ hAbility:GetAbilityName() ] ~= nil then + table.insert( AbilitiesReady, hAbility ) + end + end + end + + for i = 0, DOTA_ITEM_MAX - 1 do + local hItem = self.me:GetItemInSlot( i ) + if hItem and hItem:IsFullyCastable() and not hItem:IsPassive() and not hItem:IsHidden() and hItem:IsActivated() then + --print( 'Adding ITEM ' .. hItem:GetAbilityName() ) + if self.AbilityPriority[ hItem:GetAbilityName() ] ~= nil then + table.insert( AbilitiesReady, hItem ) + end + end + end + + if #AbilitiesReady > 1 then + table.sort( AbilitiesReady, function( h1, h2 ) + local nAbility1Priority = self.AbilityPriority[ h1:GetAbilityName() ] + local nAbility2Priority = self.AbilityPriority[ h2:GetAbilityName() ] + return nAbility1Priority > nAbility2Priority + end + ) + end + + return AbilitiesReady +end + +-------------------------------------------------------------------------------- + +function CBossBase:GetNonAbilityOrder() + return nil +end + +-------------------------------------------------------------------------------- + +function CBossBase:OnFirstSeen() + -- empty +end + +-------------------------------------------------------------------------------- + +function CBossBase:OnHealthPercentThreshold( nPct ) + -- empty +end +--------------------------------------------------------- +-- dota_non_player_used_ability +-- * abilityname +-- * caster_entindex +--------------------------------------------------------- +function CBossBase:OnNonPlayerUsedAbility( event ) + + local hCaster = nil + if event.caster_entindex ~= nil and event.abilityname ~= nil then + hCaster = EntIndexToHScript( event.caster_entindex ) + if hCaster ~= nil and hCaster == self.me then + self:OnBossUsedAbility( event.abilityname ) + end + end +end + +-------------------------------------------------------------------------------- + +function CBossBase:OnBossUsedAbility( szAbilityName ) + -- empty +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/ai/boss_timbersaw.lua b/aghanim_singleplayer/scripts/vscripts/ai/boss_timbersaw.lua new file mode 100755 index 0000000..715def2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/boss_timbersaw.lua @@ -0,0 +1,272 @@ +require( "ai/boss_base" ) + +-------------------------------------------------------------------------------- + +if CBossTimbersaw == nil then + CBossTimbersaw = class( {}, {}, CBossBase ) +end + +-------------------------------------------------------------------------------- + +function Precache( context ) + PrecacheUnitByNameSync( "npc_dota_furion_treant_4", context, -1 ) +end + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if IsServer() then + if thisEntity == nil then + return + end + + thisEntity.AI = CBossTimbersaw( thisEntity, 1.0 ) + end +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:constructor( hUnit, flInterval ) + CBossBase.constructor( self, hUnit, flInterval ) + + self.nTreeListener = ListenToGameEvent( "tree_cut", Dynamic_Wrap( getclass( self ), 'OnTreeCut' ), self ) + self.bEnraged = false + self.nEnragePct = 60 + self.nNumTreantsPerTree = 1 + self.nMaxTreants = 40 + + self.me:SetThink( "OnBossTimbersawThink", self, "OnBossTimbersawThink", self.flDefaultInterval ) +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:SetupAbilitiesAndItems() + CBossBase.SetupAbilitiesAndItems( self ) + + self.hWhirlingDeath = self.me:FindAbilityByName( "boss_timbersaw_whirling_death" ) + if self.hWhirlingDeath ~= nil then + self.hWhirlingDeath.Evaluate = self.EvaluateWhirlingDeath + self.AbilityPriority[ self.hWhirlingDeath:GetAbilityName() ] = 4 + end + + self.hTimberChain = self.me:FindAbilityByName( "boss_timbersaw_timber_chain" ) + if self.hTimberChain ~= nil then + self.hTimberChain.Evaluate = self.EvaluateTimberChain + self.AbilityPriority[ self.hTimberChain:GetAbilityName() ] = 5 + end + + self.hChakram = self.me:FindAbilityByName( "shredder_chakram" ) + if self.hChakram ~= nil then + self.hChakram.Evaluate = self.EvaluateChakram + self.AbilityPriority[ self.hChakram:GetAbilityName() ] = 2 + end + + self.hReturnChakram = self.me:FindAbilityByName( "shredder_return_chakram" ) + if self.hReturnChakram ~= nil then + self.hReturnChakram.Evaluate = self.EvaluateReturnChakram + self.AbilityPriority[ self.hReturnChakram:GetAbilityName() ] = 6 + end + + self.hChakram2 = self.me:FindAbilityByName( "shredder_chakram_2" ) + if self.hChakram2 ~= nil then + self.hChakram2:SetActivated( true ) + self.hChakram2:SetHidden( false ) + self.hChakram2:UpgradeAbility( true ) + self.hChakram2.Evaluate = self.EvaluateChakram2 + self.AbilityPriority[ self.hChakram2:GetAbilityName() ] = 3 + end + + self.hReturnChakram2 = self.me:FindAbilityByName( "shredder_return_chakram_2" ) + if self.hReturnChakram2 ~= nil then + self.hReturnChakram2.Evaluate = self.EvaluateReturnChakram2 + self.AbilityPriority[ self.hReturnChakram2:GetAbilityName() ] = 7 + end + + self.hChakramDance = self.me:FindAbilityByName( "boss_timbersaw_chakram_dance" ) + if self.hChakramDance then + self.hChakramDance.Evaluate = self.EvaluateChakramDance + self.AbilityPriority[ self.hChakramDance:GetAbilityName() ] = 1 + end +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:OnTreeCut( event ) + + if self.me:IsNull() or not self.me:IsAlive() then + StopListeningToGameEvent( self.nTreeListener ) + return + end + + if self.Encounter and self.Encounter.SpawnedSecondaryEnemies and #self.Encounter.SpawnedSecondaryEnemies > self.nMaxTreants then + --print( "Timbersaw is not creating more treants; hit the maximum alive!" ) + return + end + + local vLocation = Vector( event.tree_x, event.tree_y, 0 ) + for i=1,self.nNumTreantsPerTree do + local hTreant = CreateUnitByName( "npc_dota_creature_timbersaw_treant", vLocation, true, self.me, self.me:GetOwner(), self.me:GetTeamNumber() ) + if hTreant ~= nil then + hTreant:SetControllableByPlayer( self.me:GetPlayerOwnerID(), false ) + hTreant:SetOwner( self.me ) + hTreant.bBossMinion = true + self.Encounter:SuppressRewardsOnDeath( hTreant ) + + if #self.hPlayerHeroes > 0 then + hTreant:SetInitialGoalEntity( self.hPlayerHeroes[ RandomInt( 1, #self.hPlayerHeroes ) ] ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:OnBossTimbersawThink() + return self:OnBaseThink() +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:OnFirstSeen() + CBossBase.OnFirstSeen( self ) +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:OnHealthPercentThreshold( nPct ) + CBossBase.OnHealthPercentThreshold( self, nPct ) + if nPct <= self.nEnragePct and self.bEnraged == false then + self.bEnraged = true + end +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:EvaluateWhirlingDeath() + local Enemies = shallowcopy( self.hPlayerHeroes ) + Enemies = FilterEntitiesOutsideOfRange( self.me:GetAbsOrigin(), Enemies, self.hWhirlingDeath:GetSpecialValueFor( "whirling_radius" ) ) + + local Order = nil + if #Enemies >= 1 then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.hWhirlingDeath:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hWhirlingDeath ) + end + + return Order +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:EvaluateTimberChain() + local Order = nil + local vTargetLocation = GetBestDirectionalPointTarget( self.hTimberChain ) + if vTargetLocation ~= nil then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetLocation, + AbilityIndex = self.hTimberChain:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hTimberChain ) + 0.5 -- Factor in a little travel time + end + + return Order +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:EvaluateChakram() + local Order = nil + local vTargetLocation = GetBestAOEPointTarget( self.hChakram ) + if vTargetLocation ~= nil then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetLocation, + AbilityIndex = self.hChakram:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hChakram ) + self.hReturnChakram:StartCooldown( RandomFloat( 1.5, 4.5 ) ) + end + return Order +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:EvaluateChakram2() + local Order = nil + local vTargetLocation = GetBestAOEPointTarget( self.hChakram2 ) + if vTargetLocation ~= nil then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetLocation, + AbilityIndex = self.hChakram2:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hChakram2 ) + self.hReturnChakram2:StartCooldown( RandomFloat( 1.5, 4.5 ) ) + end + return Order +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:EvaluateReturnChakram() + local Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.hReturnChakram:entindex(), + Queue = false, + } + + Order.flOrderInterval = 0.1 + return Order +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:EvaluateReturnChakram2() + local Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.hReturnChakram2:entindex(), + Queue = false, + } + + Order.flOrderInterval = 0.1 + return Order +end + +-------------------------------------------------------------------------------- + +function CBossTimbersaw:EvaluateChakramDance() + local Order = nil + if self.bEnraged == true then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.hChakramDance:entindex(), + Queue = false, + } + + Order.flOrderInterval = self.hChakramDance:GetChannelTime() + 0.2 + end + return Order +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/ai/boss_visage.lua b/aghanim_singleplayer/scripts/vscripts/ai/boss_visage.lua new file mode 100755 index 0000000..0e5e749 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/boss_visage.lua @@ -0,0 +1,125 @@ +require( "ai/boss_base" ) + +-------------------------------------------------------------------------------- + +if CBossVisage == nil then + CBossVisage = class( {}, {}, CBossBase ) +end + +-------------------------------------------------------------------------------- + +function Precache( context ) + +end + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if IsServer() then + if thisEntity == nil then + return + end + + thisEntity.AI = CBossVisage( thisEntity, 1.0 ) + end +end + +-------------------------------------------------------------------------------- + +function CBossVisage:constructor( hUnit, flInterval ) + CBossBase.constructor( self, hUnit, flInterval ) + self.bEnraged = false + self.nEnragePct = 90 + self.me.bStone = false + + self.me:SetThink( "OnBossVisageThink", self, "OnBossVisageThink", self.flDefaultInterval ) +end + +-------------------------------------------------------------------------------- + +function CBossVisage:SetupAbilitiesAndItems() + CBossBase.SetupAbilitiesAndItems( self ) + + self.hRangedAttack = self.me:FindAbilityByName( "boss_visage_ranged_attack" ) + if self.hRangedAttack ~= nil then + self.hRangedAttack.Evaluate = self.EvaluateRangedAttack + self.AbilityPriority[ self.hRangedAttack:GetAbilityName() ] = 2 + end + self.hGraveChill = self.me:FindAbilityByName( "boss_visage_grave_chill" ) + if self.hGraveChill ~= nil then + self.hGraveChill.Evaluate = self.EvaluateGraveChill + self.AbilityPriority[ self.hGraveChill:GetAbilityName() ] = 1 + end +end + +-------------------------------------------------------------------------------- + +function CBossVisage:OnBossVisageThink() + if self.me.bStone then + return self.flDefaultInterval + end + + return self:OnBaseThink() +end + +-------------------------------------------------------------------------------- + +function CBossVisage:OnFirstSeen() + CBossBase.OnFirstSeen( self ) +end + +-------------------------------------------------------------------------------- + +function CBossVisage:OnHealthPercentThreshold( nPct ) + CBossBase.OnHealthPercentThreshold( self, nPct ) + if nPct <= self.nEnragePct and self.bEnraged == false then + self.bEnraged = true + end +end + +-------------------------------------------------------------------------------- + +function CBossVisage:EvaluateRangedAttack() + local Order = nil + local hTarget = GetBestUnitTarget( self.hRangedAttack ) + if hTarget == nil then + return Order + end + + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = hTarget:GetAbsOrigin(), + AbilityIndex = self.hRangedAttack:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hRangedAttack ) + + + return Order +end + +-------------------------------------------------------------------------------- + +function CBossVisage:EvaluateGraveChill() + local Order = nil + local hTarget = GetBestUnitTarget( self.hGraveChill ) + if hTarget == nil then + return Order + end + + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.hGraveChill:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hGraveChill ) + return Order +end + + + + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/boss_void_spirit.lua b/aghanim_singleplayer/scripts/vscripts/ai/boss_void_spirit.lua new file mode 100755 index 0000000..c6c79c2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/boss_void_spirit.lua @@ -0,0 +1,319 @@ + +require( "ai/boss_base" ) + +-------------------------------------------------------------------------------- + +if CBossVoidSpirit == nil then + CBossVoidSpirit = class( {}, {}, CBossBase ) +end + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if IsServer() then + if thisEntity == nil then + return + end + + thisEntity.AI = CBossVoidSpirit( thisEntity, 1.0 ) + end +end + +-------------------------------------------------------------------------------- + +function CBossVoidSpirit:constructor( hUnit, flInterval ) + CBossBase.constructor( self, hUnit, flInterval ) + + self.fDissimilateStartTime = nil + + self.nEnragePct = 50 + self.bEnraged = false + + self.nAstralPct = 90 + self.bAstralEnabled = false + + self.me:SetThink( "OnBossVoidSpiritThink", self, "OnBossVoidSpiritThink", self.flDefaultInterval ) +end + +-------------------------------------------------------------------------------- + +function CBossVoidSpirit:SetupAbilitiesAndItems() + CBossBase.SetupAbilitiesAndItems( self ) + + self.hAetherRemnant = self.me:FindAbilityByName( "aghsfort_void_spirit_boss_aether_remnant" ) + if self.hAetherRemnant ~= nil then + self.hAetherRemnant.Evaluate = self.EvaluateAetherRemnant + self.AbilityPriority[ self.hAetherRemnant:GetAbilityName() ] = 5 + end + + self.hDissimilate = self.me:FindAbilityByName( "aghsfort_void_spirit_boss_dissimilate" ) + if self.hDissimilate ~= nil then + self.fDissimilatePhaseDuration = self.hDissimilate:GetSpecialValueFor( "phase_duration" ) + self.fPctOfPhaseForSelection = self.hDissimilate:GetSpecialValueFor( "pct_of_phase_for_selection" ) + local first_ring_distance_offset = self.hDissimilate:GetSpecialValueFor( "first_ring_distance_offset" ) + local damage_radius = self.hDissimilate:GetSpecialValueFor( "damage_radius" ) + self.fDissimilateFullRadius = first_ring_distance_offset + damage_radius + + self.hDissimilate.Evaluate = self.EvaluateDissimilate + self.AbilityPriority[ self.hDissimilate:GetAbilityName() ] = 3 + end + + self.hResonantPulse = self.me:FindAbilityByName( "aghsfort_void_spirit_boss_resonant_pulse" ) + if self.hResonantPulse ~= nil then + self.hResonantPulse.Evaluate = self.EvaluateResonantPulse + self.AbilityPriority[ self.hResonantPulse:GetAbilityName() ] = 4 + end + + self.hAstralStep = self.me:FindAbilityByName( "aghsfort_void_spirit_boss_astral_step" ) + if self.hAstralStep ~= nil then + self.hAstralStep.Evaluate = self.EvaluateAstralStep + self.AbilityPriority[ self.hAstralStep:GetAbilityName() ] = 2 + end + + self.hActivateEarthSpirits = self.me:FindAbilityByName( "void_spirit_boss_activate_earth_spirits" ) + if self.hActivateEarthSpirits then + self.hActivateEarthSpirits.Evaluate = self.EvaluateActivateEarthSpirits + self.AbilityPriority[ self.hActivateEarthSpirits:GetAbilityName() ] = 1 + end +end + +-------------------------------------------------------------------------------- + +function CBossVoidSpirit:OnBossVoidSpiritThink() + if GameRules:IsGamePaused() then + return 0.1 + end + + -- Am I in Dissimilate? + if self.fDissimilateStartTime and ( GameRules:GetGameTime() < ( self.fDissimilateStartTime + self.fDissimilatePhaseDuration ) ) then + --printf( "I'm in Dissimilate phase, game time: %.2f; dissimilate start time: %.2f; dissimilate phase duration: %.2f", GameRules:GetGameTime(), self.fDissimilateStartTime, self.fDissimilatePhaseDuration ) + + -- Issue a move command that takes me near a random player within the full Dissimilate radius + local nSearchRangeReduction = self.hDissimilate:GetSpecialValueFor( "search_range_reduction" ) + local fSearchRange = self.fDissimilateFullRadius - nSearchRangeReduction + --printf( "fSearchRange: %d, self.fDissimilateFullRadius: %d, nSearchRangeReduction: %d", fSearchRange, self.fDissimilateFullRadius, nSearchRangeReduction ) + local enemiesInDissimilate = FindUnitsInRadius( self.me:GetTeamNumber(), self.me:GetOrigin(), nil, fSearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #enemiesInDissimilate > 0 then + --printf( "#enemiesInDissimilate: %d; self.fDissimilateFullRadius: %.2f", #enemiesInDissimilate, self.fDissimilateFullRadius ) + local hRandomEnemy = enemiesInDissimilate[ RandomInt( 1, #enemiesInDissimilate ) ] + + local Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = hRandomEnemy:GetOrigin(), + Queue = true, + } + + ExecuteOrderFromTable( Order ) + + --printf( "-----" ) + --printf( "Current time: %.2f, dissimilate phase ends at: %.2f", GameRules:GetGameTime(), ( self.fDissimilateStartTime + self.fDissimilatePhaseDuration ) ) + --printf( "Found a random enemy in Dissimilate (%s); moving to: %s", hRandomEnemy:GetUnitName(), hRandomEnemy:GetOrigin() ) + --printf( "%s was issued move order", self.me:GetUnitName() ) + + local fInterval = self.fDissimilatePhaseDuration + 0.2 + --printf( "returning in %.2f seconds", fInterval ) + + return fInterval + else + -- Nobody's within Dissimilate's full radius, so just try to get to the closest player + local fSearchRadius = 4000 + local enemies = FindUnitsInRadius( self.me:GetTeamNumber(), self.me:GetOrigin(), nil, fSearchRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #enemies > 0 then + local hNearestEnemy = enemies[ 1 ] + local vDir = hNearestEnemy:GetAbsOrigin() - self.me:GetAbsOrigin() + vDir.z = 0.0 + vDir = vDir:Normalized() + + local vRightClickPos = self.me:GetAbsOrigin() + ( vDir * ( self.me:GetDayTimeVisionRange() - 20 ) ) + + local Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = vRightClickPos, + Queue = true, + } + + ExecuteOrderFromTable( Order ) + + --printf( "-----" ) + --printf( "Current time: %.2f, dissimilate phase ends at: %.2f", GameRules:GetGameTime(), ( self.fDissimilateStartTime + self.fDissimilatePhaseDuration ) ) + --printf( "There are no enemies in Dissimilate; moving to nearest enemy \"%s\" at: %s", hNearestEnemy:GetUnitName(), hNearestEnemy:GetOrigin() ) + --printf( "%s was issued move order", self.me:GetUnitName() ) + + local fInterval = self.fDissimilatePhaseDuration + 0.2 + --printf( "returning in %.2f seconds", fInterval ) + + return fInterval + end + end + end + + --printf( "OnBossVoidSpiritThink - Chain to OnBaseThink at time: %.2f", GameRules:GetGameTime() ) + return self:OnBaseThink() +end + +-------------------------------------------------------------------------------- + +function CBossVoidSpirit:OnFirstSeen() + CBossBase.OnFirstSeen( self ) +end + +-------------------------------------------------------------------------------- + +function CBossVoidSpirit:OnHealthPercentThreshold( nPct ) + CBossBase.OnHealthPercentThreshold( self, nPct ) + + if IsServer() then + if nPct <= self.nEnragePct and self.bEnraged == false then + self.bEnraged = true + end + + if nPct <= self.nAstralPct and self.bAstralEnabled == false then + self.bAstralEnabled = true + end + end +end + +-------------------------------------------------------------------------------- + +function CBossVoidSpirit:EvaluateAetherRemnant() + local Enemies = shallowcopy( self.hPlayerHeroes ) + local nSearchRadius = self.hAetherRemnant:GetCastRange() + Enemies = GetEnemyHeroesInRange( self.me, nSearchRadius ) + + local Order = nil + if #Enemies >= 1 then + -- Hack alert: the aghsfort Aether Remnant ability C++ stomps some of this with its own farthest target selection + local hFarthestEnemy = Enemies[ #Enemies ] + local vDir = hFarthestEnemy:GetAbsOrigin() - self.me:GetAbsOrigin() + local fDistance = vDir:Length2D() + vDir.z = 0 + vDir = vDir:Normalized() + + local vTargetLocation = hFarthestEnemy:GetAbsOrigin() - ( vDir * 350 ) + + if fDistance < 400 then + -- Place remnant behind the target enemy instead + vTargetLocation = hFarthestEnemy:GetAbsOrigin() + ( vDir * 200 ) + end + + if vTargetLocation ~= nil then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetLocation, + AbilityIndex = self.hAetherRemnant:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hAetherRemnant ) + end + end + + return Order +end + +-------------------------------------------------------------------------------- + +function CBossVoidSpirit:EvaluateDissimilate() + local Enemies = shallowcopy( self.hPlayerHeroes ) + local nSearchRadius = self.hDissimilate:GetSpecialValueFor( "damage_radius" ) * 3 -- total radius is approx 3 portal radii + --printf( "EvaluateDissimilate - nSearchRadius == %d", nSearchRadius ) + Enemies = GetEnemyHeroesInRange( self.me, nSearchRadius ) + + local Order = nil + if #Enemies >= 1 then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.hDissimilate:entindex(), + Queue = false, + } + + local fPhaseDuration = self.hDissimilate:GetSpecialValueFor( "phase_duration" ) + Order.flOrderInterval = GetSpellCastTime( self.hDissimilate ) + ( fPhaseDuration * ( self.fPctOfPhaseForSelection / 100 ) ) + --printf( "EvaluateDissimilate - order interval: %.2f (spell cast time: %.2f, phase duration: %.2f, pct_of_phase_for_selection: %.2f)", Order.flOrderInterval, GetSpellCastTime( self.hDissimilate ), fPhaseDuration, self.fPctOfPhaseForSelection ) + + self.fDissimilateStartTime = GameRules:GetGameTime() + end + + return Order +end + +-------------------------------------------------------------------------------- + +function CBossVoidSpirit:EvaluateResonantPulse() + local Enemies = shallowcopy( self.hPlayerHeroes ) + local nSearchRadius = self.hResonantPulse:GetSpecialValueFor( "radius" ) + Enemies = GetEnemyHeroesInRange( self.me, nSearchRadius ) + + local Order = nil + if #Enemies >= 1 then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.hResonantPulse:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hResonantPulse ) + end + + return Order +end + +-------------------------------------------------------------------------------- + +function CBossVoidSpirit:EvaluateAstralStep() + if not self.bAstralEnabled then + return + end + + local Order = nil + + local Enemies = shallowcopy( self.hPlayerHeroes ) + local nSearchRadius = self.hAstralStep:GetSpecialValueFor( "max_travel_distance" ) + Enemies = GetEnemyHeroesInRange( self.me, nSearchRadius ) + + if #Enemies >= 1 then + local vTargetLocation = Enemies[ #Enemies ]:GetAbsOrigin() -- target the farthest unit + if vTargetLocation ~= nil then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetLocation, + AbilityIndex = self.hAstralStep:entindex(), + Queue = false, + } + Order.flOrderInterval = GetSpellCastTime( self.hAstralStep ) + 0.5 -- Factor in a little travel time + end + end + + return Order +end + +-------------------------------------------------------------------------------- + +function CBossVoidSpirit:EvaluateActivateEarthSpirits() + local Order = nil + if self.bEnraged == true then + Order = + { + UnitIndex = self.me:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.hActivateEarthSpirits:entindex(), + Queue = false, + } + + Order.flOrderInterval = self.hActivateEarthSpirits:GetChannelTime() + 0.2 + end + + return Order +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/brewmaster.lua b/aghanim_singleplayer/scripts/vscripts/ai/brewmaster.lua new file mode 100755 index 0000000..848d7e2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/brewmaster.lua @@ -0,0 +1,165 @@ +--[[ Brewmaster AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity.bWantsToSplit = false + thisEntity.startSplitTime = -1 + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorThunderClap, BehaviorPrimalSplit } ) +end + +function AIThink() + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + if thisEntity.bWantsToSplit then + return nil + end + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 1000 ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorThunderClap = {} + +function BehaviorThunderClap:Evaluate() + --print( "BehaviorThunderClap:Evaluate()" ) + local desire = 0 + if thisEntity.bWantsToSplit then + return desire + end + + self.thunderClapAbility = thisEntity:FindAbilityByName( "aghsfort_brewmaster_thunderclap" ) + if self.thunderClapAbility and self.thunderClapAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 300, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + for _,hUnit in pairs( enemies ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hGushModifier = hUnit:FindModifierByName( "modifier_brewmaster_thunder_clap" ) + if hGushModifier ~= nil then + --print("Enemy is already thunder clapped") + desire = 0 + else + desire = #enemies + 1 + end + end + end + end + end + + return desire +end + +function BehaviorThunderClap:Begin() + --print( "BehaviorThunderClap:Begin()" ) + if self.thunderClapAbility and self.thunderClapAbility:IsFullyCastable() then + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 350, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return nil + end + local hTarget = hEnemies[#hEnemies] + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.thunderClapAbility:entindex(), + } + return order + end + + return nil +end + +BehaviorThunderClap.Continue = BehaviorThunderClap.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorPrimalSplit = {} + +function BehaviorPrimalSplit:Evaluate() + --print( "BehaviorPrimalSplit:Evaluate()" ) + local desire = 0 + if thisEntity.bWantsToSplit then + return 1000000 + end + -- Bremaster can only use Primal Split once + self.primalSplitAbility = thisEntity:FindAbilityByName( "aghsfort_brewmaster_primal_split" ) + if self.primalSplitAbility and self.primalSplitAbility:IsFullyCastable() then + if thisEntity:GetHealthPercent() < 40 and GameRules:GetGameTime() > thisEntity.startSplitTime then + thisEntity.bWantsToSplit = true + return 10000 + end + end + + return desire +end + +function BehaviorPrimalSplit:Begin() + --print( "BehaviorPrimalSplit:Begin()" ) + + if self.primalSplitAbility and self.primalSplitAbility:IsFullyCastable() and GameRules:GetGameTime() > thisEntity.startSplitTime then + thisEntity.startSplitTime = GameRules:GetGameTime() + 0.7 + --print( "execute order" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.primalSplitAbility:entindex() + } + + ExecuteOrderFromTable( order ) + + return nil + end + + return nil +end + +function BehaviorPrimalSplit:IsDone() + return true +end + +BehaviorPrimalSplit.Continue = BehaviorPrimalSplit.Begin + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorThunderClap, BehaviorPrimalSplit } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/brewmaster_earth.lua b/aghanim_singleplayer/scripts/vscripts/ai/brewmaster_earth.lua new file mode 100755 index 0000000..4ccd601 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/brewmaster_earth.lua @@ -0,0 +1,166 @@ +--[[ Brewling Earth AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity.bInitialized = false + if not thisEntity.bInitialized then + thisEntity.vInitialSpawnPos = thisEntity:GetOrigin() + thisEntity.bInitialized = true + end + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorThunderClap, BehaviorRunAway } ) +end + +function AIThink() + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 1000 ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorThunderClap = {} + +function BehaviorThunderClap:Evaluate() + --print( "BehaviorThunderClap:Evaluate()" ) + local desire = 0 + + self.thunderClapAbility = thisEntity:FindAbilityByName( "aghsfort_brewmaster_thunderclap" ) + if self.thunderClapAbility and self.thunderClapAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 350, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + for _,hUnit in pairs( enemies ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hGushModifier = hUnit:FindModifierByName( "modifier_brewmaster_thunder_clap" ) + if hGushModifier ~= nil then + --print("Enemy is already thunder clapped") + desire = 0 + else + desire = #enemies + 1 + end + end + end + end + end + + return desire +end + +function BehaviorThunderClap:Begin() + --print( "BehaviorThunderClap:Begin()" ) + if self.thunderClapAbility and self.thunderClapAbility:IsFullyCastable() then + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 350, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return nil + end + local hTarget = hEnemies[#hEnemies] + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.thunderClapAbility:entindex(), + } + return order + end + + return nil +end + +BehaviorThunderClap.Continue = BehaviorThunderClap.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorRunAway = {} + +function BehaviorRunAway:Evaluate() + local desire = 0 + + -- let's not choose this twice in a row, or even too close to another escape + if behaviorSystem.currentBehavior == self or + ( self.startEscapeTime ~= nil and ( ( GameRules:GetGameTime() - self.startEscapeTime ) < 3 ) ) then + return desire + end + + self.escapePoint = thisEntity.vInitialSpawnPos + + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 300, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 2 ) and ( thisEntity:GetHealthPercent() < 30 ) then + desire = #enemies + 1 + end + + return desire +end + + +function BehaviorRunAway:Begin() + --print( "BehaviorRunAway:Begin()" ) + self.startEscapeTime = GameRules:GetGameTime() + -- move towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.escapePoint + } + +end + +function BehaviorRunAway:IsDone( ) + return ( GameRules:GetGameTime() > ( self.startEscapeTime + 2 ) ) or + ( ( thisEntity:GetAbsOrigin() - self.escapePoint ):Length2D() < 200 ) +end + +function BehaviorRunAway:Think( ) + -- keep moving towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.escapePoint + } + +end + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorThunderClap, BehaviorRunAway } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/brewmaster_fire.lua b/aghanim_singleplayer/scripts/vscripts/ai/brewmaster_fire.lua new file mode 100755 index 0000000..5f7c4d7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/brewmaster_fire.lua @@ -0,0 +1,115 @@ +--[[ Brewling Fire AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity.bInitialized = false + if not thisEntity.bInitialized then + thisEntity.vInitialSpawnPos = thisEntity:GetOrigin() + thisEntity.bInitialized = true + end + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorRunAway } ) +end + +function AIThink() + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 1000 ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorRunAway = {} + +function BehaviorRunAway:Evaluate() + local desire = 0 + + -- let's not choose this twice in a row, or even too close to another escape + if behaviorSystem.currentBehavior == self or + ( self.startEscapeTime ~= nil and ( ( GameRules:GetGameTime() - self.startEscapeTime ) < 3 ) ) then + return desire + end + + self.escapePoint = thisEntity.vInitialSpawnPos + + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 300, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 2 ) and ( thisEntity:GetHealthPercent() < 30 ) then + desire = #enemies + 1 + end + + return desire +end + + +function BehaviorRunAway:Begin() + --print( "BehaviorRunAway:Begin()" ) + self.startEscapeTime = GameRules:GetGameTime() + -- move towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.escapePoint + } + +end + +function BehaviorRunAway:IsDone( ) + return ( GameRules:GetGameTime() > ( self.startEscapeTime + 2 ) ) or + ( ( thisEntity:GetAbsOrigin() - self.escapePoint ):Length2D() < 200 ) +end + +function BehaviorRunAway:Think( ) + -- keep moving towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.escapePoint + } + +end + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorRunAway } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/brewmaster_storm.lua b/aghanim_singleplayer/scripts/vscripts/ai/brewmaster_storm.lua new file mode 100755 index 0000000..c806f38 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/brewmaster_storm.lua @@ -0,0 +1,115 @@ +--[[ Brewling Storm AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity.bInitialized = false + if not thisEntity.bInitialized then + thisEntity.vInitialSpawnPos = thisEntity:GetOrigin() + thisEntity.bInitialized = true + end + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorRunAway } ) +end + +function AIThink() + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 1000 ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorRunAway = {} + +function BehaviorRunAway:Evaluate() + local desire = 0 + + -- let's not choose this twice in a row, or even too close to another escape + if behaviorSystem.currentBehavior == self or + ( self.startEscapeTime ~= nil and ( ( GameRules:GetGameTime() - self.startEscapeTime ) < 3 ) ) then + return desire + end + + self.escapePoint = thisEntity.vInitialSpawnPos + + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 300, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 2 ) and ( thisEntity:GetHealthPercent() < 30 ) then + desire = #enemies + 1 + end + + return desire +end + + +function BehaviorRunAway:Begin() + --print( "BehaviorRunAway:Begin()" ) + self.startEscapeTime = GameRules:GetGameTime() + -- move towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.escapePoint + } + +end + +function BehaviorRunAway:IsDone( ) + return ( GameRules:GetGameTime() > ( self.startEscapeTime + 2 ) ) or + ( ( thisEntity:GetAbsOrigin() - self.escapePoint ):Length2D() < 200 ) +end + +function BehaviorRunAway:Think( ) + -- keep moving towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.escapePoint + } + +end + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorRunAway } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/broodmother.lua b/aghanim_singleplayer/scripts/vscripts/ai/broodmother.lua new file mode 100755 index 0000000..3abaaa5 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/broodmother.lua @@ -0,0 +1,62 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hWebAbility = thisEntity:FindAbilityByName( "broodmother_web" ) + + thisEntity:SetContextThink( "BroodmotherThink", BroodmotherThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function BroodmotherThink() + if not IsServer() then + return + end + + if thisEntity == nil or thisEntity:IsNull() or ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + local fSearchRange = thisEntity.hWebAbility:GetCastRange( thisEntity:GetOrigin(), nil ) + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, fSearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return 0.1 + end + + if thisEntity.hWebAbility and thisEntity.hWebAbility:IsFullyCastable() then + local hFarthestEnemy = hEnemies[ #hEnemies ] + --local hRandomEnemy = hEnemies[ RandomInt( 1, #hEnemies ) ] + + return CastWeb( hFarthestEnemy ) + end + + return 0.1 +end + +-------------------------------------------------------------------------------- + +function CastWeb( hTarget ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = hTarget:GetOrigin(), + AbilityIndex = thisEntity.hWebAbility:entindex(), + Queue = false, + }) + + local fReturnTime = thisEntity.hWebAbility:GetCastPoint() + 0.1 + return fReturnTime +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/dragon_knight.lua b/aghanim_singleplayer/scripts/vscripts/ai/dragon_knight.lua new file mode 100755 index 0000000..68626ff --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/dragon_knight.lua @@ -0,0 +1,120 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.fMaxSearchRange = 1000 + + thisEntity.hDragonTailAbility = thisEntity:FindAbilityByName( "aghsfort_dragon_knight_dragon_tail" ) + thisEntity.hDragonFormAbility = thisEntity:FindAbilityByName( "aghsfort_dragon_knight_elder_dragon_form" ) + + thisEntity:SetContextThink( "DragonKnightThink", DragonKnightThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function DragonKnightThink() + if not IsServer() then + return + end + + if thisEntity == nil or thisEntity:IsNull() or ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + --[[ + if not thisEntity.bInitialized then + for i = 0, DOTA_ITEM_MAX - 1 do + local item = thisEntity:GetItemInSlot( i ) + if item and item:GetAbilityName() == "item_creature_black_king_bar" then + thisEntity.bkbAbility = item + end + end + + thisEntity.bInitialized = true + end + ]] + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity.fMaxSearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return 0.25 + end + + local fHealthPctToDragon = 50 + if thisEntity:GetHealthPercent() < fHealthPctToDragon and thisEntity.hDragonFormAbility and thisEntity.hDragonFormAbility:IsFullyCastable() then + return CastDragonForm() + end + + --[[ + local fHealthPctToBKB = 30 + if thisEntity:GetHealthPercent() < fHealthPctToBKB and thisEntity.bkbAbility and thisEntity.bkbAbility:IsFullyCastable() then + return CastBKB() + end + ]] + + local fTailSearchRange = thisEntity.hDragonTailAbility:GetCastRange() + local hTailEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, fTailSearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hTailEnemies == 0 then + return 0.25 + end + + local fHealthPctToTail = 90 + if thisEntity:GetHealthPercent() < fHealthPctToTail and thisEntity.hDragonTailAbility and thisEntity.hDragonTailAbility:IsFullyCastable() then + local hRandomTailTarget = hTailEnemies[ RandomInt( 1, #hTailEnemies ) ] + return CastDragonTail( hRandomTailTarget ) + end + + return 0.25 +end + +-------------------------------------------------------------------------------- + +function CastDragonTail( hTarget ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hTarget:entindex(), + AbilityIndex = thisEntity.hDragonTailAbility:entindex(), + Queue = false, + }) + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function CastDragonForm() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hDragonFormAbility:entindex(), + Queue = false, + }) + + return 0.5 +end + +-------------------------------------------------------------------------------- + +--[[ +function CastBKB() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.bkbAbility:entindex() + }) + + return 0.5 +end +]] + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/earth_spirit_statue.lua b/aghanim_singleplayer/scripts/vscripts/ai/earth_spirit_statue.lua new file mode 100755 index 0000000..0bab20b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/earth_spirit_statue.lua @@ -0,0 +1,110 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.fMaxSearchRange = 5000 + + thisEntity.hStoneCallerAbility = thisEntity:FindAbilityByName( "aghsfort_earth_spirit_boss_stone_caller" ) + thisEntity.hBoulderSmashAbility = thisEntity:FindAbilityByName( "aghsfort_earth_spirit_boss_boulder_smash" ) + + thisEntity:SetContextThink( "EarthSpiritStatueThink", EarthSpiritStatueThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function EarthSpiritStatueThink() + if not IsServer() then + return + end + + if thisEntity == nil or thisEntity:IsNull() or ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.05 + end + + --printf( "EarthSpiritStatueThink - before stoneform modifier check" ) + + if thisEntity:HasModifier( "modifier_earth_spirit_statue_stoneform" ) then + return 0.05 + end + + --printf( "EarthSpiritStatueThink" ) + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity.fMaxSearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + --printf( "EarthSpiritStatueThink - hEnemies is empty" ) + return 1 + end + + local hStone = nil + local hAllies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 200, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_NONE, FIND_CLOSEST, false ) + for _, hAlly in pairs( hAllies ) do + if hAlly:GetUnitName() == "npc_dota_aghsfort_earth_spirit_boss_stone" then + hStone = hAlly + --printf( "earth_spirit_statue - found a stone" ) + end + end + + if hStone == nil then + if thisEntity.hStoneCallerAbility and thisEntity.hStoneCallerAbility:IsFullyCastable() then + local hRandomEnemy = hEnemies[ RandomInt( 1, #hEnemies ) ] + local vDir = hRandomEnemy:GetOrigin() - thisEntity:GetOrigin() + vDir.z = 0.0 + vDir = vDir:Normalized() + + local nStoneDistance = 100 + local vStonePos = thisEntity:GetAbsOrigin() + ( vDir * nStoneDistance ) + + return CastStoneCaller( vStonePos ) + end + else + if thisEntity.hBoulderSmashAbility and thisEntity.hBoulderSmashAbility:IsFullyCastable() then + return CastBoulderSmash( hStone ) + end + end + + return 0.05 +end + +-------------------------------------------------------------------------------- + +function CastStoneCaller( vPosition ) + --printf( "CastStoneCaller" ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = thisEntity.hStoneCallerAbility:entindex(), + Position = vPosition, + Queue = false, + }) + + return 0.5 +end + +------------------------------------------------------------------------------- + +function CastBoulderSmash( hStone ) + --printf( "CastBoulderSmash on position: %s", hStone:GetAbsOrigin() ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + AbilityIndex = thisEntity.hBoulderSmashAbility:entindex(), + TargetIndex = hStone:entindex(), + Queue = false, + }) + + return 2.0 +end + +------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/elder_titan.lua b/aghanim_singleplayer/scripts/vscripts/ai/elder_titan.lua new file mode 100755 index 0000000..0dde2f8 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/elder_titan.lua @@ -0,0 +1,84 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hEchoStompAbility = thisEntity:FindAbilityByName( "creature_elder_titan_echo_stomp" ) + thisEntity.hEarthSplitterAbility = thisEntity:FindAbilityByName( "creature_elder_titan_earth_splitter" ) + + thisEntity:SetContextThink( "ElderTitanThink", ElderTitanThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function ElderTitanThink() + if not IsServer() then + return + end + + if thisEntity == nil or thisEntity:IsNull() or ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + if thisEntity.hEchoStompAbility and thisEntity.hEchoStompAbility:IsFullyCastable() then + local fEchoSearchRadius = 400 + local hEnemiesToEcho = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), thisEntity, fEchoSearchRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NONE, FIND_CLOSEST, false ) + if #hEnemiesToEcho > 0 then + return CastEchoStomp() + end + end + + if thisEntity.hEarthSplitterAbility and thisEntity.hEarthSplitterAbility:IsFullyCastable() then + local fSplitterSearchRadius = thisEntity.hEarthSplitterAbility:GetCastRange() -- note: this range is more or less global + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), thisEntity, fSplitterSearchRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NONE, FIND_FARTHEST, false ) + if #hEnemies > 0 then + local hFarthestEnemy = hEnemies[ 1 ] + + return CastEarthSplitter( hFarthestEnemy ) + end + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function CastEchoStomp() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hEchoStompAbility:entindex(), + Queue = false, + }) + + return 3 +end + +-------------------------------------------------------------------------------- + +function CastEarthSplitter( hTarget ) + if hTarget == nil or hTarget:IsNull() or hTarget:IsAlive() == false then + return 0.5 + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = hTarget:GetOrigin(), + AbilityIndex = thisEntity.hEarthSplitterAbility:entindex(), + Queue = false, + }) + + return 2 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/elemental_io_ai.lua b/aghanim_singleplayer/scripts/vscripts/ai/elemental_io_ai.lua new file mode 100755 index 0000000..37607f4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/elemental_io_ai.lua @@ -0,0 +1,65 @@ +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + thisEntity.TetherAbility = thisEntity:FindAbilityByName( "aghsfort_wisp_tether" ) + + thisEntity:SetContextThink( "ElementalIoThink", ElementalIoThink, 0.5 ) +end + +function ElementalIoThink() + if ( not thisEntity:IsAlive() ) then + + return -1 + end + if GameRules:IsGamePaused() == true then + return 1 + end + + if thisEntity:GetOwner() == nil or thisEntity:GetOwner():IsAlive() ~= true then + -- We lost our owner Tiny. Let's find a new one. + local entities = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), thisEntity, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, DOTA_UNIT_TARGET_FLAG_NO_INVIS, FIND_CLOSEST, false ) + local hPossibleOwner = nil + for _, hAlly in pairs( entities ) do + + if hAlly ~= nil and not hAlly:IsNull() and hAlly:IsAlive() == true and hAlly:GetUnitName() == "npc_dota_creature_elemental_tiny" then + printf("Found a valid tiny") + hPossibleOwner = hAlly + break + end + end + + if hPossibleOwner ~= nil then + thisEntity:SetOwner( hPossibleOwner ) + else + --No new owners found. Not even worth thinking anymore + + return -1 + end + end + + if thisEntity.TetherAbility ~= nil and thisEntity.TetherAbility:IsFullyCastable() then + if (thisEntity:GetAbsOrigin() - thisEntity:GetOwner():GetAbsOrigin() ):Length2D() > 350 then + return CastTether(thisEntity:GetOwner()) + end + end + + return 0.5 +end + +function CastTether( hTarget ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + AbilityIndex = thisEntity.TetherAbility:entindex(), + TargetIndex = hTarget:entindex(), + Queue = false, + }) + + return 0.5 +end diff --git a/aghanim_singleplayer/scripts/vscripts/ai/elemental_tiny_ai.lua b/aghanim_singleplayer/scripts/vscripts/ai/elemental_tiny_ai.lua new file mode 100755 index 0000000..122efa6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/elemental_tiny_ai.lua @@ -0,0 +1,128 @@ +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + thisEntity.hIos = {} + thisEntity.TossAbility = thisEntity:FindAbilityByName( "aghsfort_elemental_tiny_toss" ) + thisEntity.CreateIoAbility = thisEntity:FindAbilityByName( "aghsfort_elemental_tiny_create_io" ) + + thisEntity:SetContextThink( "ElementalTinyTossThink", ElementalTinyTossThink, 1 ) +end + +function LastTargetTossTime( hTarget ) + + local flLastTime = thisEntity.Encounter.TossTargets[ tostring( hTarget:entindex() ) ] + if flLastTime == nil then + flLastTime = 0 + end + + return flLastTime + +end + +function ElementalTinyTossThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + --if thisEntity.Encounter.TossTargets == nil then + -- thisEntity.Encounter.TossTargets = {} + --end + + if thisEntity.TossAbility ~= nil and thisEntity.TossAbility:IsFullyCastable() then + + -- Select a unit in range to attack + -- And don't pick a target who was tossed at at in the last 2 seconds + + -- Check to make sure we have an io to toss + local grab_radius = thisEntity.TossAbility:GetSpecialValueFor( "grab_radius") + local entities = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), thisEntity, grab_radius, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, DOTA_UNIT_TARGET_FLAG_NO_INVIS + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS, FIND_CLOSEST, false ) + local hPossibleProjectiles = {} + for _, hAlly in pairs( entities ) do + + if hAlly ~= nil and not hAlly:IsNull() and hAlly:IsAlive() == true and hAlly:GetUnitName() == "npc_dota_creature_elemental_io" then + table.insert( hPossibleProjectiles, hAlly ) + end + end + if #hPossibleProjectiles ~= 0 then + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, + thisEntity.TossAbility:GetCastRange(thisEntity:GetAbsOrigin(), nil), DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + + local hPossibleEnemies = {} + for _,hEnemy in pairs( enemies ) do + --local flTimeSinceLastToss = GameRules:GetGameTime() - LastTargetTossTime( hEnemy ) + if hEnemy ~= nil and hEnemy:IsAlive() and hEnemy:IsInvulnerable() == false then --and + --hEnemy:IsMagicImmune() == false and ( flTimeSinceLastToss > 1.5 ) then + + table.insert( hPossibleEnemies, hEnemy ) + end + end + + -- Pick a random one, but prefer one who is at least 500 away + local hNearEnemy = nil + while #hPossibleEnemies > 0 do + local nIndex = math.random( 1, #hPossibleEnemies ) + local hEnemy = hPossibleEnemies[ nIndex ] + if ( ( hEnemy:GetAbsOrigin() - thisEntity:GetAbsOrigin() ):Length2D() > 500 ) then + return Toss( hEnemy ) + end + hNearEnemy = hEnemy + table.remove( hPossibleEnemies, nIndex ) + end + + -- If not, then pick a close one + if hNearEnemy ~= nil then + return Toss( hNearEnemy ) + end + end + end + + if thisEntity.CreateIoAbility ~= nil and thisEntity.CreateIoAbility:IsFullyCastable() == true then + + -- Only spawn ios if we haven't got too many already + local max_summons = thisEntity.CreateIoAbility:GetSpecialValueFor( "max_summons" ) + + if #thisEntity.hIos <= max_summons then + return CreateIos() + end + end + + return 0.1 +end + +function Toss( hTarget ) + + local vTargetPos = hTarget:GetAbsOrigin() + RandomVector( RandomFloat( 25, 25 ) ) + --thisEntity.Encounter.TossTargets[ tostring( hTarget:entindex() ) ] = GameRules:GetGameTime() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = thisEntity.TossAbility:entindex(), + Position = vTargetPos, + Queue = false, + }) + + return 0.5 +end + + +function CreateIos( ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.CreateIoAbility:entindex(), + Queue = false, + }) + + return 0.5 +end + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ember_spirit.lua b/aghanim_singleplayer/scripts/vscripts/ai/ember_spirit.lua new file mode 100755 index 0000000..916f762 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ember_spirit.lua @@ -0,0 +1,62 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hFireballAbility = thisEntity:FindAbilityByName( "ember_spirit_fireball" ) + + thisEntity:SetContextThink( "EmberSpiritThink", EmberSpiritThink, 0.1 ) +end + +-------------------------------------------------------------------------------- + +function EmberSpiritThink() + if not IsServer() then + return + end + + if thisEntity == nil or thisEntity:IsNull() or ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + local fSearchRange = thisEntity:GetAcquisitionRange() + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, fSearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return 0.1 + end + + local fHealthPctFireball = 50 + if thisEntity:GetHealthPercent() <= fHealthPctFireball then + if thisEntity.hFireballAbility and thisEntity.hFireballAbility:IsFullyCastable() then + local hRandomTarget = hEnemies[ RandomInt( 1, #hEnemies ) ] + return CastFireball( hRandomTarget:GetAbsOrigin() ) + end + end + + return 0.1 +end + +-------------------------------------------------------------------------------- + +function CastFireball( vTargetPos ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = thisEntity.hFireballAbility:entindex(), + Position = vTargetPos, + Queue = false, + }) + + return thisEntity.hFireballAbility:GetCastPoint() + 0.1 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/enraged_wildwing_ai.lua b/aghanim_singleplayer/scripts/vscripts/ai/enraged_wildwing_ai.lua new file mode 100755 index 0000000..dfac7e2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/enraged_wildwing_ai.lua @@ -0,0 +1,117 @@ +function Precache( context ) + + PrecacheUnitByNameSync( "npc_aghsfort_creature_tornado_harpy", context, -1 ) + +end + + + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.TornadoAbility = thisEntity:FindAbilityByName( "enraged_wildwing_create_tornado" ) + thisEntity.BlastAbility = thisEntity:FindAbilityByName( "aghsfort_enraged_wildwing_tornado_blast" ) + thisEntity.flLastOrder = GameRules:GetGameTime() + thisEntity.bHasSummonedTornado = false + + thisEntity:SetContextThink( "EnragedWildwingThink", EnragedWildwingThink, 1 ) + + +end + + + + +function EnragedWildwingThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if thisEntity.TornadoAbility ~= true and thisEntity.TornadoAbility:IsFullyCastable() and thisEntity.bHasSummonedTornado == false then + thisEntity.bHasSummonedTornado = true + --return CastTornadoAbility() + end + + + if (GameRules:GetGameTime() - thisEntity.flLastOrder) > (20 - RandomFloat(0 ,5 )) then + thisEntity.flLastOrder = GameRules:GetGameTime() + return DoMove() + end + + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 900, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #hEnemies == 0 then + + return 0.5 + end + + + if thisEntity.BlastAbility ~= nil and thisEntity.BlastAbility:IsFullyCastable() then + + return CastBlastAbility( hEnemies[ #hEnemies ] ) + end + + return 0.5 +end + + +function CastTornadoAbility() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.TornadoAbility:entindex(), + Queue = true, + }) + + return 0.2 +end + +-------------------------------------------------------------------------------- + +function CastBlastAbility( enemy ) + local vToTarget = enemy:GetOrigin() - thisEntity:GetOrigin() + vToTarget = vToTarget:Normalized() + local vTargetPos = thisEntity:GetOrigin() + vToTarget * 50 + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = thisEntity.BlastAbility:entindex(), + Position = vTargetPos, + Queue = false, + }) + + return 4 +end + + + +function DoMove() + if IsServer() then + + for i=1,4 do + local vLoc = FindPathablePositionNearby(thisEntity:GetAbsOrigin(), 1000, 2000 ) + + if GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vLoc ) then + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = vLoc + }) + break + end + end + end + return 4 +end diff --git a/aghanim_singleplayer/scripts/vscripts/ai/evil_greevil.lua b/aghanim_singleplayer/scripts/vscripts/ai/evil_greevil.lua new file mode 100755 index 0000000..b49d6ee --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/evil_greevil.lua @@ -0,0 +1,134 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + AttachEffects() + + thisEntity.vInitialSpawnPos = nil + thisEntity.bInitialized = false + local retreatPoints = Entities:FindAllByName( "retreat_point" ) + if retreatPoints == nil then + print( "*** WARNING: This AI requires info_targets named retreat_point in the map " .. thisEntity.Encounter:GetRoom():GetName() ) + return + end + local happyPlaceIndex = RandomInt( 1, #retreatPoints ) + thisEntity.vRetreatPoint = retreatPoints[ happyPlaceIndex ]:GetAbsOrigin() + + thisEntity.imprisonAbility = thisEntity:FindAbilityByName( "obsidian_destroyer_astral_imprisonment" ) + thisEntity:SetContextThink( "EvilGreevilThink", EvilGreevilThink, 0.1 ) +end + +-------------------------------------------------------------------------------- + +function AttachEffects() + --local effect_name = "particles/units/unit_greevil/greevil_blackhole.vpcf" + local effect_name = "particles/creatures/greevil/greevil_prison_bottom_ring.vpcf" + local effect = ParticleManager:CreateParticle( effect_name, PATTACH_POINT_FOLLOW, thisEntity ) + ParticleManager:SetParticleControlEnt( effect, 0, thisEntity, PATTACH_POINT_FOLLOW, nil, thisEntity:GetOrigin(), true ) + --[[ + local right_eyeTable = + { + origin = "0 0 0", + angles = "0 0 0", + targetname = "eye_model", + model = "models/particle/mesh/slumbering_terror_eyes.vmdl", + scales = "0.5 0.5 0.5", + } + local hRightEye = SpawnEntityFromTableSynchronous( "prop_dynamic", right_eyeTable ) + hRightEye:SetParent( thisEntity, "attach_eye_r" ) + local left_eyeTable = + { + origin = "0 0 0", + angles = "0 0 0", + targetname = "eye_model", + model = "models/particle/mesh/slumbering_terror_eyes.vmdl", + scales = "0.5 0.5 0.5", + } + local hLeftEye = SpawnEntityFromTableSynchronous( "prop_dynamic", left_eyeTable ) + hLeftEye:SetParent( thisEntity, "attach_eye_l" ) + ]] +end + +-------------------------------------------------------------------------------- + +function EvilGreevilThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 100, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #enemies > 0 then + --print("Enemy is near") + local target = enemies[1] + if thisEntity.imprisonAbility ~= nil and thisEntity.imprisonAbility:IsCooldownReady() then + return CastImprison( target ) + end + end + if not thisEntity.bInitialized then + thisEntity.vInitialSpawnPos = thisEntity:GetAbsOrigin() + thisEntity.bInitialized = true + end + local vPos = thisEntity:GetAbsOrigin() + local difference = vPos - thisEntity.vInitialSpawnPos + local distance = difference:Length() + if distance < 25 then + --print("Move to retreat point") + --RunAround( thisEntity.vRetreatPoint ) + thisEntity:MoveToPosition( thisEntity.vRetreatPoint ) + elseif distance > 150 then + --print("Move to home") + --RunAround( thisEntity.vInitialSpawnPos ) + thisEntity:MoveToPosition( thisEntity.vInitialSpawnPos ) + end + + return .1 +end + +-------------------------------------------------------------------------------- + +function CastImprison( target ) + --print("Casting Astral Imprisonment") + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 1.3 } ) + local difference = target:GetAbsOrigin() - thisEntity:GetAbsOrigin() + local distance = difference:Length() + if distance < thisEntity.imprisonAbility:GetCastRange() then + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = target:entindex(), + AbilityIndex = thisEntity.imprisonAbility:entindex(), + Queue = false, + }) + else + print("Enemy escaped") + print(distance) + end + + return 1 +end + +-------------------------------------------------------------------------------- + +function RunAround( position ) + local destination = position + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = destination + }) + + return 1 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/ai/exploding_big_burrower.lua b/aghanim_singleplayer/scripts/vscripts/ai/exploding_big_burrower.lua new file mode 100755 index 0000000..b98930d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/exploding_big_burrower.lua @@ -0,0 +1,137 @@ + +--[[ ai/exploding_burrower.lua ]] + +---------------------------------------------------------------------------------------------- + +function Precache( context ) + + PrecacheResource( "model", "models/heroes/nerubian_assassin/mound.vmdl", context ) + +end + +---------------------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if thisEntity == nil then + return + end + + hExplosionAbility = thisEntity:FindAbilityByName( "burrower_big_explosion" ) + hBurrowAbility = thisEntity:FindAbilityByName( "nyx_assassin_burrow" ) + hUnburrowAbility = thisEntity:FindAbilityByName( "nyx_assassin_unburrow" ) + + -- Start already burrowed + thisEntity:AddNewModifier( thisEntity, nil, "modifier_nyx_assassin_burrow", { duration = -1 } ) + hUnburrowAbility:SetHidden( false ) + + thisEntity:SetContextThink( "ExplodingNyxThink", ExplodingNyxThink, 0.5 ) +end + +---------------------------------------------------------------------------------------------- + +function ExplodingNyxThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + local bIsBurrowed = ( thisEntity:FindModifierByName( "modifier_nyx_assassin_burrow" ) ~= nil ) + if bIsBurrowed and hUnburrowAbility and hUnburrowAbility:IsFullyCastable() then + return CastUnburrow() + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #hEnemies > 0 then + local enemy = hEnemies[1] + if enemy ~= nil then + local flDist = ( enemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + if flDist <= 150 then + return CastExplosion() + else + return Approach( enemy ) + end + end + end + + return 0.5 +end + +---------------------------------------------------------------------------------------------- + +function CastBurrow() + --print( "ExplodingBurrower - CastBurrow()" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hBurrowAbility:entindex(), + }) + return 2 +end + +---------------------------------------------------------------------------------------------- + +function CastUnburrow() + --print( "ExplodingBurrower - CastUnburrow()" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hUnburrowAbility:entindex(), + }) + return 0.3 +end + +---------------------------------------------------------------------------------------------- + +function CastExplosion() + --print( "ExplodingBurrower - CastExplosion()" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hExplosionAbility:entindex(), + Queue = false, + }) + return 2 +end + +---------------------------------------------------------------------------------------------- + +function Approach( unit ) + --print( "ExplodingBurrower - Approach()" ) + local vToEnemy = unit:GetOrigin() - thisEntity:GetOrigin() + vToEnemy = vToEnemy:Normalized() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity:GetOrigin() + vToEnemy * thisEntity:GetIdealSpeed() + }) + return 0.4 +end + +---------------------------------------------------------------------------------------------- + +function RunToMom() + --print( "ExplodingBurrower - RunToMom()" ) + + if hUnburrowAbility and hUnburrowAbility:IsFullyCastable() then + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hUnburrowAbility:entindex(), + }) + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity.hParent:GetOrigin(), + Queue = true, + }) + return 1 +end + +---------------------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/friendly_baby_ogre_tank.lua b/aghanim_singleplayer/scripts/vscripts/ai/friendly_baby_ogre_tank.lua new file mode 100755 index 0000000..d146c53 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/friendly_baby_ogre_tank.lua @@ -0,0 +1,106 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + SmashAbility = thisEntity:FindAbilityByName( "baby_ogre_tank_melee_smash" ) + JumpAbility = thisEntity:FindAbilityByName( "baby_ogre_tank_jump_smash" ) + + thisEntity:SetContextThink( "OgreTankThink", OgreTankThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function OgreTankThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + -- Increase acquisition range after the initial aggro + if ( not thisEntity.bAcqRangeModified ) and thisEntity:GetAggroTarget() then + thisEntity:SetAcquisitionRange( 850 ) + thisEntity.bAcqRangeModified = true + end + + local nEnemiesRemoved = 0 + local fSearchRange = 700 + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, fSearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + -- Iterate backwards since we're removing entries + for i = #enemies, 1, -1 do + local enemy = enemies[ i ] + if enemy ~= nil then + if enemy:GetUnitName() == "npc_dota_explosive_barrel" or enemy:GetUnitName() == "npc_dota_crate" then + --printf( "OgreTankThink: removed invalid target named %s", enemy:GetUnitName() ) + table.remove( enemies, i ) + else + local flDist = ( enemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + if flDist < 210 then + nEnemiesRemoved = nEnemiesRemoved + 1 + table.remove( enemies, i ) + end + end + end + end + + if JumpAbility ~= nil and JumpAbility:IsFullyCastable() and nEnemiesRemoved > 0 then + return Jump() + end + + if #enemies == 0 then + return 1 + end + + if SmashAbility ~= nil and SmashAbility:IsFullyCastable() then + local hSmashTarget = enemies[ 1 ] + return Smash( hSmashTarget ) + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function Jump() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = JumpAbility:entindex(), + Queue = false, + }) + + return 2.5 +end + +-------------------------------------------------------------------------------- + +function Smash( enemy ) + if enemy == nil then + return + end + + if ( not thisEntity:HasModifier( "modifier_provide_vision" ) ) then + --print( "If player can't see me, provide brief vision to his team as I start my Smash" ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 1.5 } ) + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = SmashAbility:entindex(), + Position = enemy:GetOrigin(), + Queue = false, + }) + + return 3 / thisEntity:GetHasteFactor() +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/friendly_ogre_seal.lua b/aghanim_singleplayer/scripts/vscripts/ai/friendly_ogre_seal.lua new file mode 100755 index 0000000..1488b69 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/friendly_ogre_seal.lua @@ -0,0 +1,72 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hFlop = thisEntity:FindAbilityByName( "friendly_ogreseal_flop" ) + thisEntity.flSearchRadius = 700 + + thisEntity:SetContextThink( "FriendlyOgreSealThink", FriendlyOgreSealThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function FriendlyOgreSealThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity.flSearchRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + for i = #hEnemies, 1, -1 do + local hEnemy = hEnemies[ i ] + if hEnemy ~= nil then + if hEnemy:GetUnitName() == "npc_dota_explosive_barrel" or hEnemy:GetUnitName() == "npc_dota_crate" then + table.remove( hEnemies, i ) + end + end + end + + if #hEnemies == 0 then + return 0.25 + end + + --printf( "hEnemies > 0" ) + + if thisEntity.hFlop ~= nil and thisEntity.hFlop:IsFullyCastable() then + return CastBellyFlop( hEnemies[ #hEnemies ] ) + end + + return 0.25 +end + +-------------------------------------------------------------------------------- + +function CastBellyFlop( enemy ) + printf( "CastBellyFlop" ) + local vToTarget = enemy:GetOrigin() - thisEntity:GetOrigin() + vToTarget = vToTarget:Normalized() + local vTargetPos = thisEntity:GetOrigin() + vToTarget * 50 + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = thisEntity.hFlop:entindex(), + Position = vTargetPos, + Queue = false, + }) + + return 4 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/friendly_ogre_tank.lua b/aghanim_singleplayer/scripts/vscripts/ai/friendly_ogre_tank.lua new file mode 100755 index 0000000..36ac6c9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/friendly_ogre_tank.lua @@ -0,0 +1,106 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + SmashAbility = thisEntity:FindAbilityByName( "ogre_tank_melee_smash" ) + JumpAbility = thisEntity:FindAbilityByName( "ogre_tank_jump_smash" ) + + thisEntity:SetContextThink( "OgreTankThink", OgreTankThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function OgreTankThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + -- Increase acquisition range after the initial aggro + if ( not thisEntity.bAcqRangeModified ) and thisEntity:GetAggroTarget() then + thisEntity:SetAcquisitionRange( 850 ) + thisEntity.bAcqRangeModified = true + end + + local nEnemiesRemoved = 0 + local fSearchRange = 700 + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, fSearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + -- Iterate backwards since we're removing entries + for i = #enemies, 1, -1 do + local enemy = enemies[ i ] + if enemy ~= nil then + if enemy:GetUnitName() == "npc_dota_explosive_barrel" or enemy:GetUnitName() == "npc_dota_crate" then + --printf( "OgreTankThink: removed invalid target named %s", enemy:GetUnitName() ) + table.remove( enemies, i ) + else + local flDist = ( enemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + if flDist < 210 then + nEnemiesRemoved = nEnemiesRemoved + 1 + table.remove( enemies, i ) + end + end + end + end + + if JumpAbility ~= nil and JumpAbility:IsFullyCastable() and nEnemiesRemoved > 0 then + return Jump() + end + + if #enemies == 0 then + return 1 + end + + if SmashAbility ~= nil and SmashAbility:IsFullyCastable() then + local hSmashTarget = enemies[ 1 ] + return Smash( hSmashTarget ) + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function Jump() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = JumpAbility:entindex(), + Queue = false, + }) + + return 2.5 +end + +-------------------------------------------------------------------------------- + +function Smash( enemy ) + if enemy == nil then + return + end + + if ( not thisEntity:HasModifier( "modifier_provide_vision" ) ) then + --print( "If player can't see me, provide brief vision to his team as I start my Smash" ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 1.5 } ) + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = SmashAbility:entindex(), + Position = enemy:GetOrigin(), + Queue = false, + }) + + return 3 / thisEntity:GetHasteFactor() +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/grimstroke.lua b/aghanim_singleplayer/scripts/vscripts/ai/grimstroke.lua new file mode 100755 index 0000000..f70ae86 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/grimstroke.lua @@ -0,0 +1,73 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.fMaxSearchRange = 800 + + thisEntity.hInkSwellAbility = thisEntity:FindAbilityByName( "aghsfort_grimstroke_spirit_walk" ) + + thisEntity:SetContextThink( "GrimstrokeThink", GrimstrokeThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function GrimstrokeThink() + if not IsServer() then + return + end + + if thisEntity == nil or thisEntity:IsNull() or ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity.fMaxSearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return 1 + end + + if thisEntity.hInkSwellAbility and thisEntity.hInkSwellAbility:IsFullyCastable() then + local hInkSwellTarget = nil + local fInkSwellRange = thisEntity.hInkSwellAbility:GetCastRange() + local friendlies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, fInkSwellRange, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _, friendly in pairs ( friendlies ) do + if friendly ~= nil and friendly ~= thisEntity and friendly:GetUnitName() ~= "npc_dota_crate" then + hInkSwellTarget = friendly + if ( friendly:GetUnitName() == "npc_dota_creature_life_stealer" ) then + break + end + end + end + + if hInkSwellTarget then + return CastInkSwell( hInkSwellTarget ) + end + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function CastInkSwell( hTarget ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hTarget:entindex(), + AbilityIndex = thisEntity.hInkSwellAbility:entindex(), + Queue = false, + }) + + return 0.5 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/healing_burrower.lua b/aghanim_singleplayer/scripts/vscripts/ai/healing_burrower.lua new file mode 100755 index 0000000..267aad9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/healing_burrower.lua @@ -0,0 +1,80 @@ + +--[[ ai/healing_burrower.lua ]] + +---------------------------------------------------------------------------------------------- + +function Precache( context ) + + PrecacheResource( "model", "models/heroes/nerubian_assassin/mound.vmdl", context ) + +end + +---------------------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if thisEntity == nil then + return + end + + hHealAbility = thisEntity:FindAbilityByName( "nyx_suicide_heal" ) + hUnburrowAbility = thisEntity:FindAbilityByName( "nyx_assassin_unburrow" ) + + -- Start already burrowed + thisEntity:AddNewModifier( thisEntity, nil, "modifier_nyx_assassin_burrow", { duration = -1 } ) + hUnburrowAbility:SetHidden( false ) + + thisEntity:SetContextThink( "HealingNyxThink", HealingNyxThink, 0.5 ) +end + +---------------------------------------------------------------------------------------------- + +function HealingNyxThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + local bIsBurrowed = ( thisEntity:FindModifierByName( "modifier_nyx_assassin_burrow" ) ~= nil ) + if bIsBurrowed then + return CastUnburrow() + end + + local hCreatures = Entities:FindAllByClassnameWithin( "npc_dota_creature", thisEntity:GetAbsOrigin(), 2000 ) + local hGuardians = {} + for _, hCreature in pairs( hCreatures ) do + if ( hCreature:GetUnitName() == "npc_dota_creature_sand_king" ) and hCreature:IsAlive() then + return CastSuicideHeal( hCreature ) + end + end + + return 0.1 +end + +---------------------------------------------------------------------------------------------- + +function CastUnburrow() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hUnburrowAbility:entindex(), + }) + return 0.3 +end + +---------------------------------------------------------------------------------------------- + +function CastSuicideHeal( hCreature ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + AbilityIndex = hHealAbility:entindex(), + TargetIndex = hCreature:entindex(), + }) + return 1 +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/hellbear.lua b/aghanim_singleplayer/scripts/vscripts/ai/hellbear.lua new file mode 100755 index 0000000..34811cc --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/hellbear.lua @@ -0,0 +1,102 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + SmashAbility = thisEntity:FindAbilityByName( "hellbear_smash" ) + + thisEntity:SetContextThink( "HellbearThink", HellbearThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function HellbearThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if not thisEntity.bInitialized then + thisEntity.vInitialSpawnPos = thisEntity:GetOrigin() + thisEntity.bInitialized = true + end + + -- Increase acquisition range after the initial aggro + if ( not thisEntity.bAcqRangeModified ) and thisEntity:GetAggroTarget() then + thisEntity:SetAcquisitionRange( 750 ) + thisEntity.bAcqRangeModified = true + end + + if thisEntity:GetAggroTarget() then + thisEntity.fTimeWeLostAggro = nil + end + + if thisEntity:GetAggroTarget() and ( thisEntity.fTimeAggroStarted == nil ) then + --print( "Do we have aggro and need to get a timestamp?" ) + thisEntity.fTimeAggroStarted = GameRules:GetGameTime() + end + + if ( not thisEntity:GetAggroTarget() ) and ( thisEntity.fTimeAggroStarted ~= nil ) then + --print( "We lost aggro." ) + thisEntity.fTimeWeLostAggro = GameRules:GetGameTime() + thisEntity.fTimeAggroStarted = nil + end + + if ( not thisEntity:GetAggroTarget() ) then + if thisEntity.fTimeWeLostAggro and ( GameRules:GetGameTime() > ( thisEntity.fTimeWeLostAggro + 1.0 ) ) then + return RetreatHome() + end + end + + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 300, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #enemies == 0 then + return 0.5 + end + + if SmashAbility ~= nil and SmashAbility:IsCooldownReady() then + return Smash() + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function Smash() + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 1.3 } ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = SmashAbility:entindex(), + Queue = false, + }) + + return 1.1 -- was 1.2 +end + +-------------------------------------------------------------------------------- + +function RetreatHome() + --print( "RetreatHome - " .. thisEntity:GetUnitName() .. " is returning to home position" ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.vInitialSpawnPos, + }) + + return 0.5 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/huge_broodmother.lua b/aghanim_singleplayer/scripts/vscripts/ai/huge_broodmother.lua new file mode 100755 index 0000000..5ba3244 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/huge_broodmother.lua @@ -0,0 +1,84 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hWebAbility = thisEntity:FindAbilityByName( "broodmother_web" ) + thisEntity.hSummonEggsAbility = thisEntity:FindAbilityByName( "huge_brood_summon_eggs" ) + thisEntity.nHealthPctForSummon = 90 + + thisEntity:SetContextThink( "HugeBroodmotherThink", HugeBroodmotherThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function HugeBroodmotherThink() + if not IsServer() then + return + end + + if thisEntity == nil or thisEntity:IsNull() or ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + local fSearchRange = thisEntity.hWebAbility:GetCastRange( thisEntity:GetOrigin(), nil ) + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, fSearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return 0.1 + end + + if thisEntity:GetHealthPercent() <= thisEntity.nHealthPctForSummon then + if thisEntity.hSummonEggsAbility and thisEntity.hSummonEggsAbility:IsFullyCastable() then + return CastSummonEggs() + end + end + + if thisEntity.hWebAbility and thisEntity.hWebAbility:IsFullyCastable() then + local hFarthestEnemy = hEnemies[ #hEnemies ] + --local hRandomEnemy = hEnemies[ RandomInt( 1, #hEnemies ) ] + + return CastWeb( hFarthestEnemy ) + end + + return 0.1 +end + +-------------------------------------------------------------------------------- + +function CastWeb( hTarget ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = hTarget:GetOrigin(), + AbilityIndex = thisEntity.hWebAbility:entindex(), + Queue = false, + }) + + local fReturnTime = thisEntity.hWebAbility:GetCastPoint() + 0.1 + return fReturnTime +end + +-------------------------------------------------------------------------------- + +function CastSummonEggs() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hSummonEggsAbility:entindex(), + Queue = false, + }) + + local fReturnTime = thisEntity.hSummonEggsAbility:GetCastPoint() + 0.1 + return fReturnTime +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/kidnap_spider.lua b/aghanim_singleplayer/scripts/vscripts/ai/kidnap_spider.lua new file mode 100755 index 0000000..90244e7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/kidnap_spider.lua @@ -0,0 +1,257 @@ + +require( "aghanim_utility_functions" ) + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if thisEntity == nil then + return + end + + thisEntity.hSummonEggsAbility = thisEntity:FindAbilityByName( "kidnap_spider_summon_eggs" ) + thisEntity.hLassoAbility = thisEntity:FindAbilityByName( "aghsfort_batrider_flaming_lasso" ) + + thisEntity:AddNewModifier( thisEntity, nil, "modifier_phased", { duration = -1 } ) + + thisEntity.vCurrentRunAwayPos = nil + thisEntity.nLassoDragDistance = thisEntity.hLassoAbility:GetSpecialValueFor( "drag_distance" ) + + thisEntity.hEntityKilledGameEvent = ListenToGameEvent( "entity_killed", Dynamic_Wrap( thisEntity:GetPrivateScriptScope(), "OnEntityKilled" ), nil ) + + thisEntity:SetContextThink( "KidnapSpiderThink", KidnapSpiderThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function UpdateOnRemove() + StopListeningToGameEvent( thisEntity.hEntityKilledGameEvent ) +end + +-------------------------------------------------------------------------------- + +function KidnapSpiderThink() + if thisEntity == nil or thisEntity:IsNull() or ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + if not IsServer() then + return + end + + -- This script was being broken by SetInitialGoalEntity in the encounter's OnSpawnerFinished + if not thisEntity.bGoalEntCleared then + thisEntity:SetInitialGoalEntity( nil ) + thisEntity.bGoalEntCleared = true + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 5000, + DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NONE, FIND_CLOSEST, false + ) + + if #hEnemies == 0 then + return 0.1 + end + + -- Summon Eggs + if thisEntity.hSummonEggsAbility and thisEntity.hSummonEggsAbility:IsFullyCastable() then + return CastSummonEggs() + end + + -- Try to Lasso + if thisEntity.hLassoAbility and thisEntity.hLassoAbility:IsFullyCastable() then + for _, hEnemy in pairs( hEnemies ) do + if hEnemy ~= nil and hEnemy:IsRealHero() and hEnemy:IsAlive() and ( not hEnemy:HasModifier( "modifier_batrider_flaming_lasso" ) ) then + -- Ensure I have vision + local hVisionBuff = hEnemy:FindModifierByName( "modifier_provide_vision" ) + if hVisionBuff == nil then + hVisionBuff = hEnemy:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 15 } ) + end + + return CastLasso( hEnemy ) + end + end + end + + if thisEntity.vCurrentRunAwayPos ~= nil then + --printf( "Have I arrived?" ) + local fDistToRunAwayPos = ( thisEntity.vCurrentRunAwayPos - thisEntity:GetAbsOrigin() ):Length2D() + --printf( "fDistToRunAwayPos: %d", fDistToRunAwayPos ) + local nDistThreshold = 50 + if fDistToRunAwayPos <= nDistThreshold then + --printf( "I've arrived close enough to current RunAway position: %s", thisEntity.vCurrentRunAwayPos ) + thisEntity.vCurrentRunAwayPos = nil + return 3.0 + else + --printf( "Have not arrived at current RunAway position of: %s", thisEntity.vCurrentRunAwayPos ) + return 0.1 + end + end + + -- Find eggs at appropriate distances + local nMinEggDistance = 1400 + local nMinEggFarDistance = 2800 + local nMaxEggDistance = 4500 + local hEggs = {} + local hFarEggs = {} + local hAllies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, nMaxEggDistance, + DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_FARTHEST, false + ) + + for _, hAlly in pairs( hAllies ) do + if hAlly:GetUnitName() == "npc_dota_spider_sac" then + --printf( "found \"npc_dota_spider_sac\" ally" ) + local fDistToEgg = ( hAlly:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + if fDistToEgg >= nMinEggFarDistance then + table.insert( hFarEggs, hAlly ) + elseif fDistToEgg >= nMinEggDistance then + table.insert( hEggs, hAlly ) + end + end + end + + -- I can't cast Lasso, and whether I currently have a hero Lasso'd or not I want to run away + -- First try to find a good position using any distant eggs I found + local vRunTargetPos = nil + + ShuffleListInPlace( hFarEggs ) + + if #hFarEggs > 0 then + --printf( "we have %d far egg candidates within %d-%d range", #hFarEggs, nMinEggDistance, nMaxEggDistance ) + for _, hEgg in pairs( hFarEggs ) do + local vToEgg = hEgg:GetOrigin() - thisEntity:GetOrigin() + local fDistToEgg = vToEgg:Length2D() + vToEgg.z = 0.0 + vToEgg = vToEgg:Normalized() + + local nDistPastEgg = thisEntity.nLassoDragDistance + vRunTargetPos = thisEntity:GetAbsOrigin() + ( vToEgg * ( fDistToEgg + nDistPastEgg ) ) + + --printf( "evaluating far egg position's pathability" ) + if GridNav:CanFindPath( thisEntity:GetOrigin(), vRunTargetPos ) then + --printf( "found valid far egg position, so break early -- %s", vRunTargetPos ) + break + end + end + else + --printf( "no far egg candidates" ) + end + + -- If I didn't get a good distant egg position, look through any medium-range eggs + if vRunTargetPos == nil then + ShuffleListInPlace( hEggs ) + + if #hEggs > 0 then + --printf( "we have %d egg candidates within %d-%d range", #hEggs, nMinEggDistance, nMaxEggDistance ) + for _, hEgg in pairs( hEggs ) do + local vToEgg = hEgg:GetOrigin() - thisEntity:GetOrigin() + local fDistToEgg = vToEgg:Length2D() + vToEgg.z = 0.0 + vToEgg = vToEgg:Normalized() + + local nDistPastEgg = thisEntity.nLassoDragDistance + vRunTargetPos = thisEntity:GetAbsOrigin() + ( vToEgg * ( fDistToEgg + nDistPastEgg ) ) + + --printf( "evaluating egg position's pathability" ) + if GridNav:CanFindPath( thisEntity:GetOrigin(), vRunTargetPos ) then + --printf( "found valid egg position, so break early -- %s", vRunTargetPos ) + break + end + end + else + --printf( "no medium distance egg candidates" ) + end + end + + -- If I didn't find any egg positions at all + if vRunTargetPos == nil then + vRunTargetPos = FindRandomPointInRoom( thisEntity:GetAbsOrigin(), 1500, 3000 ) + --printf( "had no vRunTargetPos after all the egg searching, so trying random point in room: %s", vRunTargetPos ) + end + + if vRunTargetPos then + --printf( " going to position: %s", vRunTargetPos ) + return RunAway( vRunTargetPos ) + end + + return 0.1 +end + +-------------------------------------------------------------------------------- + +function CastSummonEggs() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hSummonEggsAbility:entindex(), + Queue = false, + }) + + local fReturnTime = thisEntity.hSummonEggsAbility:GetCastPoint() + 0.2 + return fReturnTime +end + +-------------------------------------------------------------------------------- + +function CastLasso( unit ) + --printf( "kidnap_spider - CastLasso" ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = unit:entindex(), + AbilityIndex = thisEntity.hLassoAbility:entindex(), + Queue = false, + }) + + thisEntity.vCurrentRunAwayPos = nil -- find a new destination + + return thisEntity.hLassoAbility:GetCastPoint() + 0.2 +end + +-------------------------------------------------------------------------------- + +function RunAway( vPos ) + --printf( "kidnap_spider - RunAway" ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = vPos, + Queue = true, + }) + + thisEntity.vCurrentRunAwayPos = vPos + + return 1 --11 +end + +-------------------------------------------------------------------------------- + +function OnEntityKilled( event ) + local hVictim = nil + if event.entindex_killed ~= nil then + hVictim = EntIndexToHScript( event.entindex_killed ) + end + + if hVictim ~= thisEntity then + return + end + + -- Cleanup + for nPlayerID = 0, ( AGHANIM_PLAYERS - 1 ) do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + local hMyBuff = hPlayerHero:FindModifierByNameAndCaster( "modifier_provide_vision", thisEntity ) + if hMyBuff then + hMyBuff:Destroy() + --printf( "kidnap_spider - OnEntityKilled: removing vision buff" ) + end + end + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/kunkka.lua b/aghanim_singleplayer/scripts/vscripts/ai/kunkka.lua new file mode 100755 index 0000000..6de1e56 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/kunkka.lua @@ -0,0 +1,201 @@ +--[[ Kunkka AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorTorrent, BehaviorGhostShip } ) +end + +function AIThink() -- For some reason AddThinkToEnt doesn't accept member functions + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, thisEntity:GetDayTimeVisionRange() ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorTorrent = {} + +function BehaviorTorrent:Evaluate() + --print( "BehaviorTorrent:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.torrentAbility = thisEntity:FindAbilityByName( "kunkka_torrent_dm" ) + if self.torrentAbility and self.torrentAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 600, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + end + + return desire +end + +function BehaviorTorrent:Begin() + --print( "BehaviorTorrent:Begin()" ) + if self.torrentAbility and self.torrentAbility:IsFullyCastable() then + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return nil + end + local hTarget = hEnemies[#hEnemies] + local vTarget = hTarget:GetAbsOrigin() + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = self.torrentAbility:entindex(), + Position = vTarget + } + return order + end + + return nil +end + +BehaviorTorrent.Continue = BehaviorTorrent.Begin + +-------------------------------------------------------------------------------------------------------- +--[[ +BehaviorTidebringer = {} + +function BehaviorTidebringer:Evaluate() + --print( "BehaviorTorrent:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.tidebringerAbility = thisEntity:FindAbilityByName( "kunkka_tidebringer" ) + if self.tidebringerAbility and self.tidebringerAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 150, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies > 2 ) then + desire = #enemies + 2 + end + end + + return desire +end + +function BehaviorTidebringer:Begin() + --print( "BehaviorTorrent:Begin()" ) + if self.tidebringerAbility and self.tidebringerAbility:IsFullyCastable() then + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 150, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return nil + end + local hTarget = hEnemies[#hEnemies] + local vTarget = hTarget:GetAbsOrigin() + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hTarget:entindex(), + AbilityIndex = self.tidebringerAbility:entindex(), + Queue = false, + } + return order + end + + return nil +end + +BehaviorTidebringer.Continue = BehaviorTidebringer.Begin +]] +-------------------------------------------------------------------------------------------------------- + +BehaviorGhostShip = {} + +function BehaviorGhostShip:Evaluate() + --print( "BehaviorGhostShip:Evaluate()" ) + local desire = 0 + + self.ghostShipAbility = thisEntity:FindAbilityByName( "kunkka_ghostship" ) + if self.ghostShipAbility and self.ghostShipAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 1000, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 1 ) then + desire = #enemies + 5 + end + end + + return desire +end + +function BehaviorGhostShip:Begin() + --print( "BehaviorGhostShip:Begin()" ) + + if self.ghostShipAbility and self.ghostShipAbility:IsFullyCastable() then + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 1000, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return nil + end + local hTarget = hEnemies[#hEnemies] + local targetPoint = hTarget:GetOrigin() + RandomVector( 100 ) + if self.ghostShipAbility and self.ghostShipAbility:IsFullyCastable() then + --print( "Casting Ghost Ship" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = self.ghostShipAbility:entindex(), + Position = targetPoint + } + return order + end + end + + return nil +end + +BehaviorGhostShip.Continue = BehaviorGhostShip.Begin + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorTorrent, BehaviorGhostShip } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/landmine_ai.lua b/aghanim_singleplayer/scripts/vscripts/ai/landmine_ai.lua new file mode 100755 index 0000000..5d79b54 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/landmine_ai.lua @@ -0,0 +1,59 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + DetonateAblity = thisEntity:FindAbilityByName( "creature_landmine_detonate" ) + thisEntity:SetContextThink( "LandmineThink", LandmineThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function LandmineThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if not thisEntity.bInitialized then + thisEntity.vInitialSpawnPos = thisEntity:GetOrigin() + thisEntity.bInitialized = true + end + + local fDetonateRadius = thisEntity.DetonateAblity:GetSpecialValueFor( "detonate_radius" ) + + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, fDetonateRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #enemies == 0 then + return 0.5 + end + + return Detonate() +end + + +-------------------------------------------------------------------------------- + +function Detonate() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.DetonateAblity:entindex(), + Queue = false, + }) + + return 3 +end + + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/legion_commander.lua b/aghanim_singleplayer/scripts/vscripts/ai/legion_commander.lua new file mode 100755 index 0000000..46971a4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/legion_commander.lua @@ -0,0 +1,228 @@ +--[[ Legion Commander AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity.bInDuel = false + thisEntity.nDuelDuration = 0 + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorOverwhelmingOdds, BehaviorBlademail, BehaviorDuel } ) +end + +function AIThink() + if thisEntity.bInDuel then + thisEntity.nDuelDuration = thisEntity.nDuelDuration + 1 + end + if thisEntity.nDuelDuration > 6 then + thisEntity.bInDuel = false + thisEntity.nDuelDuration = 0 + end + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 1000 ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorOverwhelmingOdds = {} + +function BehaviorOverwhelmingOdds:Evaluate() + --print( "BehaviorOverwhelmingOdds:Evaluate()" ) + local desire = 0 + --[[ Testing without this ability for now + self.overwhelmingOddsAbility = thisEntity:FindAbilityByName( "legion_commander_overwhelming_odds" ) + if self.overwhelmingOddsAbility and self.overwhelmingOddsAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 500, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 2 ) then + for _,hUnit in pairs( enemies ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hAbilityhModifier = hUnit:FindModifierByName( "modifier_legion_commander_overwhelming_odds" ) + if hAbilityhModifier ~= nil then + --print("Enemy already has Overwhelming Odds") + desire = 0 + else + desire = #enemies + 1 + end + end + end + end + end + ]] + return desire +end + +function BehaviorOverwhelmingOdds:Begin() + --print( "BehaviorOverwhelmingOdds:Begin()" ) + if self.overwhelmingOddsAbility and self.overwhelmingOddsAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 500, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #enemies == 0 then + return nil + end + local target = enemies[#enemies] + local targetPoint = target:GetOrigin() + RandomVector( 100 ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = self.overwhelmingOddsAbility:entindex(), + Position = targetPoint + } + return order + end + + return nil +end + +BehaviorOverwhelmingOdds.Continue = BehaviorOverwhelmingOdds.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorBlademail = {} + +function BehaviorBlademail:Evaluate() + --print( "BehaviorBlademail:Evaluate()" ) + local desire = 0 + for i = 0, DOTA_ITEM_MAX - 1 do + local item = thisEntity:GetItemInSlot( i ) + if item and item:GetAbilityName() == "item_blade_mail" then + self.blademailAbility = item + end + end + if self.blademailAbility and self.blademailAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 500, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( thisEntity:GetHealthPercent() < 100 ) then + if ( #enemies > 0 ) then + if thisEntity.bInDuel then + desire = 8 + else + desire = #enemies + 1 + end + end + end + end + + return desire +end + +function BehaviorBlademail:Begin() + --print( "BehaviorBlademail:Begin()" ) + if self.blademailAbility and self.blademailAbility:IsFullyCastable() then + --print( "Casting Blade Mail" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.blademailAbility:entindex(), + } + return order + end + + return nil +end + +BehaviorBlademail.Continue = BehaviorBlademail.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorDuel = {} + +function BehaviorDuel:Evaluate() + --print( "BehaviorDuel:Evaluate()" ) + local desire = 0 + + self.duelAbility = thisEntity:FindAbilityByName( "legion_commander_duel" ) + if self.duelAbility and self.duelAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 500, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + for _,hUnit in pairs( enemies ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hAbilityModifier = hUnit:FindModifierByName( "modifier_legion_commander_duel" ) + if hAbilityModifier ~= nil then + --print("Enemy is in a duel") + desire = 0 + else + desire = #enemies + 1 + end + end + end + end + end + + return desire +end + +function BehaviorDuel:Begin() + --print( "BehaviorDuel:Begin()" ) + if self.duelAbility and self.duelAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 500, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + for _,hUnit in pairs( enemies ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hAbilityModifier = hUnit:FindModifierByName( "modifier_legion_commander_duel" ) + if hAbilityModifier ~= nil then + return nil + else + --print( "Casting Duel" ) + thisEntity.bInDuel = true + local target = hUnit + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = target:entindex(), + AbilityIndex = self.duelAbility:entindex() + } + return order + end + end + end + end + end + + return nil +end + +BehaviorDuel.Continue = BehaviorDuel.Begin + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorOverwhelmingOdds, BehaviorBlademail, BehaviorDuel } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/mirana_ai.lua b/aghanim_singleplayer/scripts/vscripts/ai/mirana_ai.lua new file mode 100755 index 0000000..d649ad0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/mirana_ai.lua @@ -0,0 +1,279 @@ +--[[ Mirana AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorShootArrow, BehaviorStarfall, BehaviorRunAway } ) +end + +function AIThink() -- For some reason AddThinkToEnt doesn't accept member functions + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, thisEntity:GetDayTimeVisionRange() ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorShootArrow = {} + +function BehaviorShootArrow:Evaluate() + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.arrowAbility = thisEntity:FindAbilityByName( "mirana_arrow" ) + + self.target = nil + local bestDistance = 0 + if not self.arrowAbility or not self.arrowAbility:IsFullyCastable() then + return desire + end + + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), thisEntity, self.arrowAbility:GetCastRange(), DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + if #enemies == 0 then + return desire + end + + for _,enemy in pairs(enemies) do + local enemyVec = enemy:GetOrigin() - thisEntity:GetOrigin() + local myForward = thisEntity:GetForwardVector() + local dotProduct = enemyVec:Dot( myForward ) + local enemyDesire = 5 + if enemy:IsStunned() then + enemyDesire = 3 + elseif dotProduct > 0 then + enemyDesire = 8 + end + + local distance = enemyVec:Length2D() + if distance > 350 then + if ( enemyDesire == desire and bestDistance > distance ) or ( desire < enemyDesire ) then + desire = enemyDesire + bestDistance = distance + self.target = enemy + thisEntity.lastTargetPosition = enemy:GetAbsOrigin() + end + end + end + + return desire +end + +function BehaviorShootArrow:Begin() + + if self.target and self.target:IsAlive() then + local targetPoint = self.target:GetOrigin() + RandomVector( 100 ) + if self.arrowAbility and self.arrowAbility:IsFullyCastable() then + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = self.arrowAbility:entindex(), + Position = targetPoint + } + end + end + + return nil + +end + +BehaviorShootArrow.Continue = BehaviorShootArrow.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorStarfall = {} + +function BehaviorStarfall:Evaluate() + --print( "BehaviorStarfall:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.starFallAbility = thisEntity:FindAbilityByName( "mirana_starfall" ) + if self.starFallAbility and self.starFallAbility:IsFullyCastable() then + local nRange = self.starFallAbility:GetSpecialValueFor( "starfall_radius" ) + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, nRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + end + + return desire +end + +function BehaviorStarfall:Begin() + --print( "BehaviorStarfall:Begin()" ) + + if self.starFallAbility and self.starFallAbility:IsFullyCastable() then + --print( "Casting Star Fall" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.starFallAbility:entindex() + } + return order + end + + return nil +end + +BehaviorStarfall.Continue = BehaviorStarfall.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorRunAway = {} + +function BehaviorRunAway:Evaluate() + local desire = 0 + local retreatPoints = thisEntity.Encounter:GetRetreatPoints() + if retreatPoints == nil then + print( "*** WARNING: This AI requires info_targets named retreat_point in the map " .. thisEntity.Encounter:GetRoom():GetName() ) + return 0 + end + + -- let's not choose this twice in a row, or even too close to another escape + if behaviorSystem.currentBehavior == self or + ( self.startEscapeTime ~= nil and ( ( GameRules:GetGameTime() - self.startEscapeTime ) < 6 ) ) then + return desire + end + + local happyPlaceIndex = RandomInt( 1, #retreatPoints ) + self.escapePoint = retreatPoints[ happyPlaceIndex ]:GetAbsOrigin() + + self.leapAbility = thisEntity:FindAbilityByName( "mirana_leap" ) + + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + local friendlies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_HERO, 0, 0, false ) + --print( string.format( "found %d enemies and %d friendlies near us", #enemies, #friendlies ) ) + + -- Remember that mirana herself will be in the friendlies list, so it's one too big + if ( #enemies >= 2 ) and ( #friendlies <= 1 ) then + desire = #enemies + 1 + end + + return desire +end + + +function BehaviorRunAway:Begin() + --print( "BehaviorRunAway:Begin()" ) + self.startEscapeTime = GameRules:GetGameTime() + self.bHasLeaped = false + + for i = 0, DOTA_ITEM_MAX - 1 do + local item = thisEntity:GetItemInSlot( i ) + if item and item:GetAbilityName() == "item_phase_boots" then + self.phaseAbility = item + end + end + + -- phase right away + if self.phaseAbility and self.phaseAbility:IsFullyCastable() then + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.phaseAbility:entindex() + } + end + + -- move towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.escapePoint + } + +end + +function BehaviorRunAway:IsDone( ) + return ( GameRules:GetGameTime() > ( self.startEscapeTime + 6 ) ) or + ( ( thisEntity:GetAbsOrigin() - self.escapePoint ):Length2D() < 200 ) +end + +function BehaviorRunAway:Think( ) + + -- give ourselves time to turn towards escape point before leaping + if GameRules:GetGameTime() >= self.startEscapeTime + 0.6 and self.bHasLeaped == false then + if self.leapAbility and self.leapAbility:IsFullyCastable() then + -- Make sure we're not going to leap out of the room or into + -- somewhere not navigable + local vMyForward = thisEntity:GetForwardVector() + local vTargetPos = thisEntity:GetOrigin() + vMyForward * self.leapAbility:GetSpecialValueFor( "leap_distance" ) + if thisEntity.Encounter:GetRoom():IsValidSpawnPoint( vTargetPos ) and + GridNav:CanFindPath( thisEntity:GetOrigin(), vTargetPos ) then + self.bHasLeaped = true + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.leapAbility:entindex() + } + end + end + end + + -- keep moving towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.escapePoint + } + +end + +BehaviorRunAway.Continue = BehaviorRunAway.Begin + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorShootArrow, BehaviorRunAway } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/naga_siren.lua b/aghanim_singleplayer/scripts/vscripts/ai/naga_siren.lua new file mode 100755 index 0000000..b88fe0b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/naga_siren.lua @@ -0,0 +1,322 @@ +--[[ Naga Siren AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity.nIllusionsCreated = 0 + thisEntity.nMaxIllusions = 10 + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorMirrorImage, BehaviorEnsnare, BehaviorRipTide, BehaviorSong, BehaviorRunAway } ) + + -- Turn on Radiance + for i = 0, DOTA_ITEM_MAX - 1 do + local item = thisEntity:GetItemInSlot( i ) + if item and item:GetAbilityName() == "item_radiance" then + thisEntity.RadianceAbility = item + end + end + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.RadianceAbility:entindex(), + Queue = false, + }) +end + +function AIThink() -- For some reason AddThinkToEnt doesn't accept member functions + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, thisEntity:GetDayTimeVisionRange() ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorMirrorImage = {} + +function BehaviorMirrorImage:Evaluate() + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + if thisEntity.nIllusionsCreated == thisEntity.nMaxIllusions then + return desire + end + + self.mirrorImageAbility = thisEntity:FindAbilityByName( "aghsfort_naga_siren_mirror_image" ) + if not self.mirrorImageAbility or not self.mirrorImageAbility:IsFullyCastable() then + return desire + end + + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), thisEntity, 600, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + + return desire +end + +function BehaviorMirrorImage:Begin() + --print( "BehaviorMirrorImage:Begin()" ) + if self.mirrorImageAbility and self.mirrorImageAbility:IsFullyCastable() then + thisEntity.nIllusionsCreated = thisEntity.nIllusionsCreated + 1 + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.mirrorImageAbility:entindex(), + } + return order + end + + return nil + +end + +BehaviorMirrorImage.Continue = BehaviorMirrorImage.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorEnsnare = {} + +function BehaviorEnsnare:Evaluate() + --print( "BehaviorEnsnare:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.ensnareAbility = thisEntity:FindAbilityByName( "naga_siren_ensnare" ) + if self.ensnareAbility and self.ensnareAbility:IsFullyCastable() then + local nRange = 600 + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, nRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + end + + return desire +end + +function BehaviorEnsnare:Begin() + --print( "BehaviorEnsnare:Begin()" ) + + self.target = nil + local bestDistance = 0 + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), thisEntity, 600, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + local hTarget = enemies[#enemies] + if not hTarget:IsStunned() then + if self.ensnareAbility and self.ensnareAbility:IsFullyCastable() then + --print( "Casting Star Fall" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hTarget:entindex(), + AbilityIndex = self.ensnareAbility:entindex(), + Queue = false, + } + return order + end + end + + return nil +end + +BehaviorEnsnare.Continue = BehaviorEnsnare.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorRipTide = {} + +function BehaviorRipTide:Evaluate() + --print( "BehaviorRipTide:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.ripTideAbility = thisEntity:FindAbilityByName( "naga_siren_rip_tide" ) + if self.ripTideAbility and self.ripTideAbility:IsFullyCastable() then + local nRange = 300 + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, nRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + end + + return desire +end + +function BehaviorRipTide:Begin() + --print( "BehaviorRipTide:Begin()" ) + + if self.ripTideAbility and self.ripTideAbility:IsFullyCastable() then + --print( "Casting Star Fall" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.ripTideAbility:entindex(), + } + return order + end + + return nil +end + +BehaviorRipTide.Continue = BehaviorRipTide.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorSong = {} + +function BehaviorSong:Evaluate() + --print( "BehaviorSong:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.songAbility = thisEntity:FindAbilityByName( "naga_siren_song_of_the_siren" ) + if self.songAbility and self.songAbility:IsFullyCastable() then + if ( thisEntity:GetHealthPercent() < 65 ) then + local nRange = 1000 + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, nRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + return desire + end + end + + return desire +end + +function BehaviorSong:Begin() + --print( "BehaviorSong:Begin()" ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_invulnerable", { duration = 1 } ) + if self.songAbility and self.songAbility:IsFullyCastable() then + --print( "Casting Song of the Siren" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.songAbility:entindex(), + Queue = false, + } + return order + end + + return nil +end + +BehaviorSong.Continue = BehaviorSong.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorRunAway = {} + +function BehaviorRunAway:Evaluate() + local desire = 0 + local retreatPoints = thisEntity.Encounter:GetRetreatPoints() + if retreatPoints == nil then + print( "*** WARNING: This AI requires info_targets named retreat_point in the map " .. thisEntity.Encounter:GetRoom():GetName() ) + return 0 + end + + local happyPlaceIndex = RandomInt( 1, #retreatPoints ) + self.escapePoint = retreatPoints[ happyPlaceIndex ]:GetAbsOrigin() + + local hSongModifier = thisEntity:FindModifierByName( "modifier_naga_siren_song_of_the_siren_aura" ) + if hSongModifier ~= nil then + --print("Naga Siren is singing!") + desire = 5 + end + + return desire +end + + +function BehaviorRunAway:Begin() + --print( "BehaviorRunAway:Begin()" ) + self.startEscapeTime = GameRules:GetGameTime() + + -- move towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.escapePoint + } + +end + +function BehaviorRunAway:IsDone( ) + return ( GameRules:GetGameTime() > ( self.startEscapeTime + 6 ) ) or + ( ( thisEntity:GetAbsOrigin() - self.escapePoint ):Length2D() < 200 ) +end + +function BehaviorRunAway:Think( ) + -- keep moving towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.escapePoint + } + +end + +BehaviorRunAway.Continue = BehaviorRunAway.Begin + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorMirrorImage, BehaviorEnsnare, BehaviorRipTide, BehaviorSong, BehaviorRunAway } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/naga_siren_illusion.lua b/aghanim_singleplayer/scripts/vscripts/ai/naga_siren_illusion.lua new file mode 100755 index 0000000..b0c957b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/naga_siren_illusion.lua @@ -0,0 +1,176 @@ +--[[ Naga Siren Illusion AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity.nIllusionsCreated = 0 + thisEntity.nMaxIllusions = 10 + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorRipTide, BehaviorRunAway } ) + + -- Turn on Radiance + for i = 0, DOTA_ITEM_MAX - 1 do + local item = thisEntity:GetItemInSlot( i ) + if item and item:GetAbilityName() == "item_radiance" then + thisEntity.RadianceAbility = item + end + end + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.RadianceAbility:entindex(), + Queue = false, + }) +end + +function AIThink() -- For some reason AddThinkToEnt doesn't accept member functions + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, thisEntity:GetDayTimeVisionRange() ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorRipTide = {} + +function BehaviorRipTide:Evaluate() + --print( "BehaviorRipTide:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.ripTideAbility = thisEntity:FindAbilityByName( "naga_siren_rip_tide" ) + if self.ripTideAbility and self.ripTideAbility:IsFullyCastable() then + local nRange = 300 + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, nRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies > 1 ) then + desire = #enemies + 1 + end + end + + return desire +end + +function BehaviorRipTide:Begin() + --print( "BehaviorRipTide:Begin()" ) + + if self.ripTideAbility and self.ripTideAbility:IsFullyCastable() then + --print( "Casting Star Fall" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.ripTideAbility:entindex(), + } + return order + end + + return nil +end + +BehaviorRipTide.Continue = BehaviorRipTide.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorRunAway = {} + +function BehaviorRunAway:Evaluate() + local desire = 0 + local retreatPoints = thisEntity.Encounter:GetRetreatPoints() + if retreatPoints == nil then + print( "*** WARNING: This AI requires info_targets named retreat_point in the map " .. thisEntity.Encounter:GetRoom():GetName() ) + return 0 + end + + local creatures = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_NONE, FIND_ANY_ORDER, false ) + for _,hUnit in pairs( creatures ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hSongModifier = hUnit:FindModifierByName( "modifier_naga_siren_song_of_the_siren_aura" ) + if hSongModifier ~= nil then + --print("Naga Siren is singing!") + thisEntity.vNagaPosition = hUnit:GetAbsOrigin() + desire = 8 + end + end + end + + return desire +end + +function BehaviorRunAway:Begin() + --print( "BehaviorRunAway:Begin()" ) + self.startEscapeTime = GameRules:GetGameTime() + + -- Move towards Naga + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity.vNagaPosition + } + +end + +function BehaviorRunAway:IsDone( ) + return ( GameRules:GetGameTime() > ( self.startEscapeTime + 6 ) ) or + ( ( thisEntity:GetAbsOrigin() - thisEntity.vNagaPosition ):Length2D() < 200 ) +end + +function BehaviorRunAway:Think( ) + -- keep moving towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity.vNagaPosition + } + +end + +BehaviorRunAway.Continue = BehaviorRunAway.Begin + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorRipTide, BehaviorRunAway } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ogre_magi.lua b/aghanim_singleplayer/scripts/vscripts/ai/ogre_magi.lua new file mode 100755 index 0000000..70c5029 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ogre_magi.lua @@ -0,0 +1,116 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + IgniteAbility = thisEntity:FindAbilityByName( "ogre_magi_area_ignite" ) + BloodlustAbility = thisEntity:FindAbilityByName( "ogre_magi_channelled_bloodlust" ) + + thisEntity:SetContextThink( "OgreMagiThink", OgreMagiThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function OgreMagiThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if BloodlustAbility ~= nil and BloodlustAbility:IsChanneling() then + return 0.5 + end + + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + + local bIgniteReady = ( #enemies > 0 and IgniteAbility ~= nil and IgniteAbility:IsFullyCastable() ) + + if BloodlustAbility ~= nil and BloodlustAbility:IsFullyCastable() then + local friendlies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 1500, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _,friendly in pairs ( friendlies ) do + if friendly ~= nil then + if ( friendly:GetUnitName() == "npc_dota_creature_ogre_tank" ) then + local fDist = ( friendly:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + local fCastRange = BloodlustAbility:GetCastRange( thisEntity:GetOrigin(), nil ) + --print( string.format( "fDist == %d, fCastRange == %d", fDist, fCastRange ) ) + if ( fDist <= fCastRange ) and ( ( #enemies > 0 ) or ( friendly:GetAggroTarget() ) ) then + return Bloodlust( friendly ) + elseif ( fDist > 400 ) and ( fDist < 900 ) then + if bIgniteReady == false then + return Approach( friendly ) + end + end + end + end + end + end + + if bIgniteReady then + return IgniteArea( enemies[ RandomInt( 1, #enemies ) ] ) + end + + local fFuzz = RandomFloat( -0.1, 0.1 ) -- Adds some timing separation to these magi + return 0.5 + fFuzz +end + +-------------------------------------------------------------------------------- + +function Approach( hUnit ) + --print( "Ogre Magi is approaching unit named " .. hUnit:GetUnitName() ) + + local vToUnit = hUnit:GetOrigin() - thisEntity:GetOrigin() + vToUnit = vToUnit:Normalized() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity:GetOrigin() + vToUnit * thisEntity:GetIdealSpeed() + }) + + return 1 +end + +-------------------------------------------------------------------------------- + +function Bloodlust( hUnit ) + --print( "Casting bloodlust on " .. hUnit:GetUnitName() ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + AbilityIndex = BloodlustAbility:entindex(), + TargetIndex = hUnit:entindex(), + Queue = false, + }) + + return 1 +end + +-------------------------------------------------------------------------------- + +function IgniteArea( hEnemy ) + --print( "Casting ignite on " .. hEnemy:GetUnitName() ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = IgniteAbility:entindex(), + Position = hEnemy:GetOrigin(), + Queue = false, + }) + + return 0.55 +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ogre_seal.lua b/aghanim_singleplayer/scripts/vscripts/ai/ogre_seal.lua new file mode 100755 index 0000000..d77da33 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ogre_seal.lua @@ -0,0 +1,60 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hFlop = thisEntity:FindAbilityByName( "ogreseal_flop" ) + thisEntity.flSearchRadius = 700 + + thisEntity:SetContextThink( "OgreSealThink", OgreSealThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function OgreSealThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity.flSearchRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return 0.5 + end + + if thisEntity.hFlop ~= nil and thisEntity.hFlop:IsFullyCastable() then + return CastBellyFlop( hEnemies[ #hEnemies ] ) + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function CastBellyFlop( enemy ) + local vToTarget = enemy:GetOrigin() - thisEntity:GetOrigin() + vToTarget = vToTarget:Normalized() + local vTargetPos = thisEntity:GetOrigin() + vToTarget * 50 + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = thisEntity.hFlop:entindex(), + Position = vTargetPos, + Queue = false, + }) + + return 4 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ogre_seer.lua b/aghanim_singleplayer/scripts/vscripts/ai/ogre_seer.lua new file mode 100755 index 0000000..7a3dd2c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ogre_seer.lua @@ -0,0 +1,123 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + IgniteAbility = thisEntity:FindAbilityByName( "ogre_seer_area_ignite" ) + BloodlustAbility = thisEntity:FindAbilityByName( "ogre_magi_channelled_bloodlust" ) + + thisEntity:SetContextThink( "OgreSeerThink", OgreSeerThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function OgreSeerThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if BloodlustAbility ~= nil and BloodlustAbility:IsChanneling() then + return 0.5 + end + + --[[ + local bPrioritizeIgnite = ( RandomFloat( 0, 1 ) > 0.5 ) + print( "bPrioritizeIgnite == " .. tostring( bPrioritizeIgnite ) ) + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 800, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if bPrioritizeIgnite and #enemies > 0 and IgniteAbility ~= nil and IgniteAbility:IsFullyCastable() then + return IgniteArea( enemies[ RandomInt( 1, #enemies ) ] ) + end + ]] + + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 800, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + + local bIgniteReady = ( #enemies > 0 and IgniteAbility ~= nil and IgniteAbility:IsFullyCastable() ) + + if BloodlustAbility ~= nil and BloodlustAbility:IsFullyCastable() then + local friendlies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 1500, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _,friendly in pairs ( friendlies ) do + if friendly ~= nil then + if ( friendly:GetUnitName() == "npc_dota_creature_ogre_tank" ) or ( friendly:GetUnitName() == "npc_dota_creature_ogre_tank_boss" ) then + local fDist = ( friendly:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + local fCastRange = BloodlustAbility:GetCastRange( thisEntity:GetOrigin(), nil ) + --print( string.format( "fDist == %d, fCastRange == %d", fDist, fCastRange ) ) + if ( fDist <= fCastRange ) and ( ( #enemies > 0 ) or ( friendly:GetAggroTarget() ) ) then + return Bloodlust( friendly ) + elseif ( fDist > 400 ) and ( fDist < 1500 ) and friendly:GetUnitName() == "npc_dota_creature_ogre_tank_boss" then + if bIgniteReady == false then + return Approach( friendly ) + end + end + end + end + end + end + + if bIgniteReady then + return IgniteArea( enemies[ RandomInt( 1, #enemies ) ] ) + end + + local fFuzz = RandomFloat( -0.1, 0.1 ) -- Adds some timing separation to these seers + return 0.5 + fFuzz +end + +-------------------------------------------------------------------------------- + +function Approach( hUnit ) + --print( "Ogre Magi is approaching unit named " .. hUnit:GetUnitName() ) + + local vToUnit = hUnit:GetOrigin() - thisEntity:GetOrigin() + vToUnit = vToUnit:Normalized() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity:GetOrigin() + vToUnit * thisEntity:GetIdealSpeed() + }) + + return 1 +end + +-------------------------------------------------------------------------------- + +function Bloodlust( hUnit ) + --print( "Casting bloodlust on " .. hUnit:GetUnitName() ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + AbilityIndex = BloodlustAbility:entindex(), + TargetIndex = hUnit:entindex(), + Queue = false, + }) + + return 1 +end + +-------------------------------------------------------------------------------- + +function IgniteArea( hEnemy ) + --print( "Casting ignite" ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = IgniteAbility:entindex(), + Position = hEnemy:GetOrigin(), + Queue = false, + }) + + return 0.55 +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ogre_tank.lua b/aghanim_singleplayer/scripts/vscripts/ai/ogre_tank.lua new file mode 100755 index 0000000..5bfc3d0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ogre_tank.lua @@ -0,0 +1,100 @@ +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + SmashAbility = thisEntity:FindAbilityByName( "ogre_tank_melee_smash" ) + JumpAbility = thisEntity:FindAbilityByName( "ogre_tank_jump_smash" ) + thisEntity:SetContextThink( "OgreTankThink", OgreTankThink, 1 ) +end + +function OgreTankThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + -- Increase acquisition range after the initial aggro + if ( not thisEntity.bAcqRangeModified ) and thisEntity:GetAggroTarget() then + thisEntity:SetAcquisitionRange( 850 ) + thisEntity.bAcqRangeModified = true + end + + local hWintersCurseBuff = thisEntity:FindModifierByName( "modifier_aghsfort_winter_wyvern_winters_curse" ) + if hWintersCurseBuff and hWintersCurseBuff:GetAuraOwner() ~= nil then + if SmashAbility ~= nil and SmashAbility:IsCooldownReady() then + return Smash( hWintersCurseBuff:GetAuraOwner() ) + end + return 0.1 + end + + local nEnemiesRemoved = 0 + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + for i = 1, #enemies do + local enemy = enemies[i] + if enemy ~= nil then + local flDist = ( enemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + if flDist < 300 then + nEnemiesRemoved = nEnemiesRemoved + 1 + table.remove( enemies, i ) + end + end + end + + if JumpAbility ~= nil and JumpAbility:IsFullyCastable() and nEnemiesRemoved > 0 then + return Jump() + end + + if #enemies == 0 then + -- @todo: Could check whether there are ogre magi nearby that I should be positioning myself next to. Either that or have the magi come to me. + return 1 + end + + if SmashAbility ~= nil and SmashAbility:IsFullyCastable() then + return Smash( enemies[ 1 ] ) + end + + return 0.5 +end + + +function Jump() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = JumpAbility:entindex(), + Queue = false, + }) + + return 2.5 +end + + +function Smash( enemy ) + if enemy == nil then + return + end + + if ( not thisEntity:HasModifier( "modifier_provide_vision" ) ) then + --print( "If player can't see me, provide brief vision to his team as I start my Smash" ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 1.5 } ) + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = SmashAbility:entindex(), + Position = enemy:GetOrigin(), + Queue = false, + }) + + return 3 / thisEntity:GetHasteFactor() +end + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/ogre_tank_boss.lua b/aghanim_singleplayer/scripts/vscripts/ai/ogre_tank_boss.lua new file mode 100755 index 0000000..4a326c7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/ogre_tank_boss.lua @@ -0,0 +1,108 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + SmashAbility = thisEntity:FindAbilityByName( "ogre_tank_boss_melee_smash" ) + JumpAbility = thisEntity:FindAbilityByName( "ogre_tank_boss_jump_smash" ) + + thisEntity:AddNewModifier( thisEntity, nil, "modifier_attack_speed_unslowable", { attack_speed_reduction_pct = 0 } ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_move_speed_unslowable", { move_speed_reduction_pct = 20 } ) + + thisEntity:SetContextThink( "OgreTankBossThink", OgreTankBossThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function OgreTankBossThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if not thisEntity.bInitialized then + thisEntity.vInitialSpawnPos = thisEntity:GetOrigin() + thisEntity.bInitialized = true + end + + local hWintersCurseBuff = thisEntity:FindModifierByName( "modifier_aghsfort_winter_wyvern_winters_curse" ) + if hWintersCurseBuff and hWintersCurseBuff:GetAuraOwner() ~= nil then + if SmashAbility ~= nil and SmashAbility:IsCooldownReady() then + return Smash( hWintersCurseBuff:GetAuraOwner() ) + end + return 0.1 + end + + local nEnemiesRemoved = 0 + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 1200, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + for i = 1, #enemies do + local enemy = enemies[i] + if enemy ~= nil then + local flDist = ( enemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + if flDist < 300 then + nEnemiesRemoved = nEnemiesRemoved + 1 + table.remove( enemies, i ) + end + end + end + + if JumpAbility ~= nil and JumpAbility:IsFullyCastable() and nEnemiesRemoved > 0 then + return Jump() + end + + if #enemies == 0 then + return 0.5 + end + + if SmashAbility ~= nil and SmashAbility:IsFullyCastable() then + return Smash( enemies[ 1 ] ) + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function Jump() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = JumpAbility:entindex(), + Queue = false, + }) + + return 2.5 +end + +-------------------------------------------------------------------------------- + +function Smash( enemy ) + if enemy == nil then + return + end + + if ( not thisEntity:HasModifier( "modifier_provide_vision" ) ) then + --print( "If player can't see me, provide brief vision to his team as I start my Smash" ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 1.5 } ) + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = SmashAbility:entindex(), + Position = enemy:GetOrigin(), + Queue = false, + }) + + return 3 / thisEntity:GetHasteFactor() +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/phoenix.lua b/aghanim_singleplayer/scripts/vscripts/ai/phoenix.lua new file mode 100755 index 0000000..2927340 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/phoenix.lua @@ -0,0 +1,134 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hIcarusDiveAbility = thisEntity:FindAbilityByName( "aghsfort_phoenix_icarus_dive" ) + thisEntity.hIcarusDiveStopAbility = thisEntity:FindAbilityByName( "aghsfort_phoenix_icarus_dive_stop" ) + thisEntity.hActivateSpiritsAbility = thisEntity:FindAbilityByName( "aghsfort_phoenix_fire_spirits" ) + thisEntity.hLaunchSpiritsAbility = thisEntity:FindAbilityByName( "aghsfort_phoenix_launch_fire_spirit" ) + thisEntity.hSupernovaAbility = thisEntity:FindAbilityByName( "aghsfort_phoenix_supernova" ) + + thisEntity.fDiveRange = 1400 + thisEntity.fSupernovaRange = thisEntity.hSupernovaAbility:GetCastRange( thisEntity:GetOrigin(), nil ) + + thisEntity:SetContextThink( "PhoenixThink", PhoenixThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function PhoenixThink() + if not IsServer() then + return + end + + if thisEntity == nil or thisEntity:IsNull() or ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + local hDiveRangeEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity.fDiveRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hDiveRangeEnemies == 0 then + -- thisEntity.fDiveRange is our max ability range so just don't think if there are no enemies within that range + return 0.1 + end + + local hRandomSpiritsTarget = hDiveRangeEnemies[ RandomInt( 1, #hDiveRangeEnemies ) ] + + if thisEntity.hActivateSpiritsAbility then + if thisEntity.hActivateSpiritsAbility:IsHidden() == false and thisEntity.hActivateSpiritsAbility:IsFullyCastable() then + return CastActivateSpirits() + end + end + + if thisEntity.hLaunchSpiritsAbility then + if thisEntity.hLaunchSpiritsAbility:IsHidden() == false and thisEntity.hLaunchSpiritsAbility:IsFullyCastable() then + return CastLaunchSpirits( hRandomSpiritsTarget:GetAbsOrigin() ) + end + end + + local fHealthThresholdPctIcarus = 90 + if thisEntity:GetHealthPercent() <= fHealthThresholdPctIcarus and thisEntity.hIcarusDiveAbility and thisEntity.hIcarusDiveAbility:IsFullyCastable() then + local hRandomDiveTarget = hDiveRangeEnemies[ RandomInt( 1, #hDiveRangeEnemies ) ] + return CastIcarusDive( hRandomDiveTarget:GetAbsOrigin() ) + end + + local hSupernovaRangeEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity.fSupernovaRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + + if #hSupernovaRangeEnemies > 0 then + local fHealthThresholdPctSupernova = 33 + if thisEntity:GetHealthPercent() <= fHealthThresholdPctSupernova and thisEntity.hSupernovaAbility and thisEntity.hSupernovaAbility:IsFullyCastable() then + local hNearestTarget = hSupernovaRangeEnemies[ 1 ] + return CastSupernova( hNearestTarget ) + end + end + + return 0.1 +end + +-------------------------------------------------------------------------------- + +function CastIcarusDive( vTargetPos ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = thisEntity.hIcarusDiveAbility:entindex(), + Position = vTargetPos, + Queue = false, + }) + + local fReturnTime = thisEntity.hIcarusDiveAbility:GetCastPoint() + 0.2 + return fReturnTime +end + +-------------------------------------------------------------------------------- + +function CastActivateSpirits( vTargetPos ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hActivateSpiritsAbility:entindex(), + Queue = false, + }) + + return 0.0 +end + +-------------------------------------------------------------------------------- + +function CastLaunchSpirits( vTargetPos ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = thisEntity.hLaunchSpiritsAbility:entindex(), + Position = vTargetPos, + Queue = false, + }) + + return 1.0 +end + +-------------------------------------------------------------------------------- + +function CastSupernova( hTarget ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + AbilityIndex = thisEntity.hSupernovaAbility:entindex(), + TargetIndex = hTarget:entindex(), + Queue = false, + }) + + local fReturnTime = thisEntity.hSupernovaAbility:GetCastPoint() + 0.2 + return fReturnTime +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/rhyzik.lua b/aghanim_singleplayer/scripts/vscripts/ai/rhyzik.lua new file mode 100755 index 0000000..70d2ccd --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/rhyzik.lua @@ -0,0 +1,506 @@ + +--[[ ai/rhyzik.lua ]] + +PHASE_PHYSICAL = 0 +PHASE_SANDSTORM = 1 +PHASE_EPICENTER = 2 + +TRIGGER_PHASE_CD = 10 +PHASE_DURATION = 12 +BURROW_DURATION = 12 +MIN_BURROWSTRIKES = 4 +MAX_BURROWSTRIKES = 7 + +function Spawn( entityKeyValues ) + if IsServer() then + if thisEntity == nil then + return + end + + TailSwipeLeft = thisEntity:FindAbilityByName( "sand_king_tail_swipe_left" ) + TailSwipeRight = thisEntity:FindAbilityByName( "sand_king_tail_swipe_right" ) + BurrowStrike = thisEntity:FindAbilityByName( "sand_king_boss_burrowstrike" ) + BurrowDown = thisEntity:FindAbilityByName( "sand_king_boss_burrow" ) + BurrowUp = thisEntity:FindAbilityByName( "sand_king_boss_unburrow" ) + SandStorm = thisEntity:FindAbilityByName( "sand_king_boss_sandstorm" ) + Epicenter = thisEntity:FindAbilityByName( "sand_king_boss_epicenter" ) + ForwardTailSwipe = thisEntity:FindAbilityByName( "sand_king_burrowed_forward_strike" ) + BackwardsTailSwipe = thisEntity:FindAbilityByName( "sand_king_burrowed_backward_strike" ) + + DirectionalMoveLeft = thisEntity:FindAbilityByName( "sand_king_boss_move_left" ) + DirectionalMoveRight = thisEntity:FindAbilityByName( "sand_king_boss_move_right" ) + DirectionalMoveBack = thisEntity:FindAbilityByName( "sand_king_boss_move_back" ) + + --thisEntity.PHASE = PHASE_PHYSICAL + thisEntity.PHASE = PHASE_SANDSTORM + + Blink = thisEntity:FindItemInInventory( "item_blink" ) + Shivas = thisEntity:FindItemInInventory( "item_shivas_guard" ) + + thisEntity:SetContextThink( "SandKingThink", SandKingThink, 1 ) + thisEntity.flNextPhaseTime = nil + thisEntity.flPhaseTriggerEndTime = 0 + thisEntity.bBurrowStateQueued = false + thisEntity.nBurrowStrikesRemaining = MIN_BURROWSTRIKES + thisEntity.nCurrentBurrowStrikes = MIN_BURROWSTRIKES + thisEntity.flUnburrowTime = 0 + + thisEntity.BurrowSkill = BurrowStrike + + --thisEntity.fOrigSpawnPos = Vector( 11136, 12160, 384 ) -- Removed in AghsFort until we figure what this should mean + --print( string.format( "saved SK's spawn point: %.2f, %.2f, %.2f", thisEntity.fOrigSpawnPos.x, thisEntity.fOrigSpawnPos.y, thisEntity.fOrigSpawnPos.z ) ) + end +end + +function GetNumberBurrowStrikes() + local nHealthPct = thisEntity:GetHealthPercent() + if nHealthPct > 80 then + return MIN_BURROWSTRIKES + end + + if nHealthPct > 70 then + return MIN_BURROWSTRIKES + 1 + end + + if nHealthPct > 50 then + return MIN_BURROWSTRIKES + 2 + end + + return MAX_BURROWSTRIKES +end + +function TailIsReady() + if thisEntity:FindModifierByName( "modifier_sand_king_boss_burrow" ) == nil then + if TailSwipeLeft ~= nil and TailSwipeRight ~= nil and TailSwipeLeft:IsCooldownReady() and TailSwipeRight:IsCooldownReady() then + return true + end + else + if ForwardTailSwipe ~= nil and BackwardsTailSwipe ~= nil and ForwardTailSwipe:IsCooldownReady() and BackwardsTailSwipe:IsCooldownReady() then + return true + end + end + + return false +end + +function WalkIsReady() + if DirectionalMoveLeft ~= nil and DirectionalMoveRight ~= nil and DirectionalMoveBack ~= nil then + if DirectionalMoveLeft:IsCooldownReady() or DirectionalMoveRight:IsCooldownReady() or DirectionalMoveBack:IsCooldownReady() then + return true + end + end + + return false +end + +function ChangePhase() + if thisEntity.flNextPhaseTime > GameRules:GetGameTime() then + return false + end + + if thisEntity:FindModifierByName( "modifier_sand_king_boss_burrow" ) ~= nil then + return 0.1 + end + + if thisEntity.bBurrowStateQueued == true then + return false + end + + printf( "Changing Phase " .. GameRules:GetGameTime() ) + + if thisEntity.PHASE == PHASE_EPICENTER then + thisEntity.PHASE = PHASE_PHYSICAL + else + thisEntity.PHASE = thisEntity.PHASE + 1 + end + + return true +end + +function SandKingThink() + if GameRules:IsGamePaused() == true then + return 1 + end + + if thisEntity == nil then + return 1 + end + + if thisEntity:GetTeamNumber() == DOTA_TEAM_GOODGUYS then + return 1 + end + + if thisEntity:IsChanneling() == true then + return 0.1 + end + + --[[ Removed in Aghanim's Fortress + if thisEntity.bStarted ~= true then + return 0.1 + end + ]] + + --[[ Removed in Aghanim's Fortress until we figure out what fOriginalSpawnPos should mean + local fDistFromSpawn = ( thisEntity:GetOrigin() - thisEntity.fOrigSpawnPos ):Length2D() + if fDistFromSpawn > 7000 then + --print( "teleport SK back to his spawn point" ) + FindClearSpaceForUnit( thisEntity, thisEntity.fOrigSpawnPos, true ) + return 0.1 + end + ]] + + local hEndCamera = Entities:FindByName( nil, "boss_camera" ) + if hEndCamera ~= nil then + hEndCamera:SetAbsOrigin( thisEntity:GetAbsOrigin() ) + end + + if thisEntity.flNextPhaseTime == nil then + thisEntity.bBurrowStateQueued = true + thisEntity.flNextPhaseTime = GameRules:GetGameTime() + TRIGGER_PHASE_CD + -- print( "Setting inital phase time to " .. thisEntity.flNextPhaseTime ) + end + + if ChangePhase() then + -- print( "Changing Phase..") + thisEntity.flPhaseTriggerEndTime = GameRules:GetGameTime() + PHASE_DURATION + thisEntity.bBurrowStateQueued = true + if thisEntity.BurrowSkill == BurrowStrike then + thisEntity.BurrowSkill = BurrowDown + thisEntity.flUnburrowTime = GameRules:GetGameTime() + PHASE_DURATION + BURROW_DURATION + thisEntity.flNextPhaseTime = GameRules:GetGameTime() + TRIGGER_PHASE_CD + PHASE_DURATION + BURROW_DURATION + -- print( "Setting next phase time to " .. thisEntity.flNextPhaseTime ) + else + thisEntity.BurrowSkill = BurrowStrike + thisEntity.nBurrowStrikesRemaining = GetNumberBurrowStrikes() + thisEntity.nCurrentBurrowStrikes = GetNumberBurrowStrikes() + thisEntity.flNextPhaseTime = GameRules:GetGameTime() + TRIGGER_PHASE_CD + PHASE_DURATION --Burrowstrikes adds to this time later after tracking the duration of strikes + -- print( "Setting next phase time to " .. thisEntity.flNextPhaseTime ) + end + end + + if thisEntity.flPhaseTriggerEndTime > GameRules:GetGameTime() then + if thisEntity.PHASE == PHASE_SANDSTORM then + return SandstormThink() + end + if thisEntity.PHASE == PHASE_EPICENTER then + return EpicenterThink() + end + end + + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 3000, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #enemies == 0 then + return 1 + end + + if thisEntity.bBurrowStateQueued == true then + return BurrowThink( enemies ) + end + + return PhysicalThink( enemies ) +end + +function BurrowThink( enemies ) + if thisEntity.BurrowSkill == BurrowDown then + if GameRules:GetGameTime() > thisEntity.flUnburrowTime then + thisEntity.bBurrowStateQueued = false + return CastBurrowUp() + end + if thisEntity:FindModifierByName( "modifier_sand_king_boss_burrow" ) == nil then + return CastBurrowDown() + else + return PhysicalThink( enemies ) + end + end + + if thisEntity.BurrowSkill == BurrowStrike then + if thisEntity:FindModifierByName( "modifier_sand_king_boss_burrowstrike" ) ~= nil or thisEntity:FindModifierByName( "modifier_sand_king_boss_burrowstrike_end" ) ~= nil then + return 0.1 + end + + if thisEntity.nBurrowStrikesRemaining == thisEntity.nCurrentBurrowStrikes then + thisEntity.flBurrowStrikesStartTime = GameRules:GetGameTime() + end + + if thisEntity.nBurrowStrikesRemaining <= 0 then + thisEntity.bBurrowStateQueued = false + thisEntity.flNextPhaseTime = thisEntity.flNextPhaseTime + ( GameRules:GetGameTime() - thisEntity.flBurrowStrikesStartTime ) + return 0.1 + end + + thisEntity.nBurrowStrikesRemaining = thisEntity.nBurrowStrikesRemaining - 1 + + for _, enemy in pairs ( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false then + return CastBurrowstrike( enemy ) + end + end + end + + return 1 +end + +function CastBurrowstrike( enemy ) + --print( "SandKingBoss - Cast Burrowstrike" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = BurrowStrike:entindex(), + Position = enemy:GetOrigin(), + Queue = false, + }) + + return 2.5 +end + +function CastBurrowDown() + --print( "SandKingBoss - Cast BurrowDown" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = BurrowDown:entindex(), + Queue = false, + }) + + return 2.5 +end + +function CastBurrowUp() + --print( "SandKingBoss - Cast BurrowUp" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = BurrowUp:entindex(), + Queue = false, + }) + + return 2.5 +end + +function SandstormThink() + return CastSandstorm() +end + +function CastSandstorm() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = SandStorm:entindex() + }) + + return 1.0 +end + +function EpicenterThink() + return CastEpicenter() +end + +function CastEpicenter() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = Epicenter:entindex() + }) + + return 1.0 +end + +function PhysicalThink( enemies ) + if thisEntity:FindModifierByName( "modifier_sand_king_boss_directional_move" ) then + return 0.2 + end + + local vDirection = thisEntity:GetForwardVector() + local vRight = thisEntity:GetRightVector() + local vLeft = -vRight + local flQuadrantDistance = 200 + local bBurrowed = thisEntity:FindModifierByName( "modifier_sand_king_boss_burrow" ) ~= nil + + local vFrontRightQuadrant = thisEntity:GetOrigin() + (( vDirection + vRight ) * flQuadrantDistance ) + local vFrontLeftQuadrant = thisEntity:GetOrigin() + (( vDirection + vLeft ) * flQuadrantDistance ) + local vBackRightQuadrant = thisEntity:GetOrigin() + (( -vDirection + vRight ) * flQuadrantDistance ) + local vBackLeftQuadrant = thisEntity:GetOrigin() + (( -vDirection + vLeft ) * flQuadrantDistance ) + local frontRightEnemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, vFrontRightQuadrant, enemies[1], 450, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + local frontLeftEnemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, vFrontLeftQuadrant, enemies[1], 450, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + local backRightEnemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, vBackRightQuadrant, enemies[1], 300, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + local backLeftEnemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, vBackLeftQuadrant, enemies[1], 300, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + + local bEnemiesBehind = true + if #backRightEnemies == 0 and #backLeftEnemies == 0 then + bEnemiesBehind = false + end + + local bEnemiesInFront = true + if #frontRightEnemies == 0 and #frontLeftEnemies == 0 then + bEnemiesInFront = false + end + + if bBurrowed then + return CastForwardsTailSwipe( enemies[1] ) + end + + if bBurrowed then + return 1 + end + + if Blink ~= nil and Blink:IsFullyCastable() then + --print ( "Use Blink" ) + return CastBlink( enemies[#enemies]:GetOrigin() ) + else + if Blink == nil then + --print ( "blink is nil" ) + Blink = thisEntity:FindItemInInventory( "item_blink" ) + end + end + + if Shivas ~= nil and Shivas:IsFullyCastable() then + return CastShivas() + else + if Shivas == nil then + --print ( "shivas is nil" ) + Shivas = thisEntity:FindItemInInventory( "item_shivas_guard" ) + end + end + + if bEnemiesBehind == true and TailIsReady() then + if #backLeftEnemies > 0 and #backRightEnemies > 0 then + local nRoll = RandomInt( 0, 1 ) + if nRoll == 0 then + return CastTailSwipeLeft() + else + return CastTailSwipeRight() + end + else + if #backLeftEnemies > 0 then + return CastTailSwipeLeft() + end + if #backRightEnemies > 0 then + return CastTailSwipeRight() + end + end + end + + if TailIsReady() == false and WalkIsReady() == true and RandomInt( 0, 3 ) == 0 then + if enemies[1] ~= nil then + local flDist = ( enemies[1]:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + if flDist <= 200 and DirectionalMoveBack:IsCooldownReady() then + return MoveBack( enemies[1] ) + else + return MoveSideWays( enemies[1] ) + end + end + end + + return Attack( enemies[1] ) +end + +function CastBlink( vPos ) + --print ( "Use Blink" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vPos, + AbilityIndex = Blink:entindex() + }) + + return 0.5 +end + +function CastShivas() + --print ( "Use Shivas" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = Shivas:entindex() + }) + + return 0.25 +end + +function Attack( enemy ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = enemy:GetOrigin(), + }) + + return 2.0 +end + +function MoveBack( enemy ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = enemy:entindex(), + AbilityIndex = DirectionalMoveBack:entindex(), + }) + + return 1.0 +end + +function MoveSideWays( enemy ) + local Ability = DirectionalMoveRight + if RandomInt( 0, 1 ) == 1 then + Ability = DirectionalMoveLeft + end + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = enemy:entindex(), + AbilityIndex = Ability:entindex(), + }) + + return 1.0 +end + +function CastClawAttack( enemy ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = enemy:entindex(), + AbilityIndex = ClawAttack:entindex(), + }) + + return 1.1 +end + +function CastTailSwipeLeft() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = TailSwipeLeft:entindex() + }) + + return 2.5 +end + +function CastTailSwipeRight() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = TailSwipeRight:entindex() + }) + + return 2.5 +end + + +function CastBackwardsTailSwipe() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = BackwardsTailSwipe:entindex() + }) + + return 2.5 +end + +function CastForwardsTailSwipe( enemy ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = enemy:entindex(), + AbilityIndex = ForwardTailSwipe:entindex(), + }) + + return 2.5 +end diff --git a/aghanim_singleplayer/scripts/vscripts/ai/scarab_priest.lua b/aghanim_singleplayer/scripts/vscripts/ai/scarab_priest.lua new file mode 100755 index 0000000..229c321 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/scarab_priest.lua @@ -0,0 +1,147 @@ +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.SpikedCarapaceAbility = thisEntity:FindAbilityByName( "aghsfort_creature_spiked_carapace" ) + thisEntity.SummonZealotsAbility = thisEntity:FindAbilityByName( "scarab_priest_summon_zealots" ) + thisEntity.nLastHealth = thisEntity:GetHealth() + thisEntity.bAcqRangeModified = false + + thisEntity.hEntityKilledGameEvent = ListenToGameEvent( "entity_killed", Dynamic_Wrap( thisEntity:GetPrivateScriptScope(), 'OnEntityKilled' ), nil ) + + thisEntity:SetContextThink( "ScarabPriestThink", ScarabPriestThink, 1 ) +end + +function UpdateOnRemove() + StopListeningToGameEvent( thisEntity.hEntityKilledGameEvent ) +end + +function ScarabPriestThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + -- Increase acquisition range after the initial aggro + if ( not thisEntity.bAcqRangeModified ) and thisEntity:GetAggroTarget() then + thisEntity:SetAcquisitionRange( 850 ) + thisEntity.bAcqRangeModified = true + end + + local nHealth = thisEntity:GetHealth() + if thisEntity.nLastHealth > nHealth then + if thisEntity.SpikedCarapaceAbility ~= nil and thisEntity.SpikedCarapaceAbility:IsFullyCastable() then + return SpikedCarapace( ) + end + thisEntity.nLastHealth = nHealth + end + + if thisEntity.SummonZealotsAbility ~= nil and thisEntity.SummonZealotsAbility:IsFullyCastable() == true and + thisEntity.bAcqRangeModified == true then + + -- Only spawn zealots if we haven't got too many already + local nMyZealotCount = thisEntity.SummonZealotsAbility:GetSpecialValueFor( "max_summons" ) + local hZealots = thisEntity.Encounter:GetSpawnedUnitsOfType( "npc_dota_creature_zealot_scarab" ) + for i=1,#hZealots do + if hZealots[i]:GetOwnerEntity() == thisEntity then + nMyZealotCount = nMyZealotCount - 1 + if nMyZealotCount == 0 then + break + end + end + end + + if nMyZealotCount > 0 then + return SummonZealots() + end + end + + return 0.5 +end + +function OnEntityKilled( event ) + + local hVictim = nil + if event.entindex_killed ~= nil then + hVictim = EntIndexToHScript( event.entindex_killed ) + end + + if hVictim ~= thisEntity then + return + end + + -- Check all of the other priests, and see if any others are aggroed. + -- If not, then we'll force aggro on the closest one + local flNearDist = 60000 + local hNearPriest = nil + local hPriests = thisEntity.Encounter:GetSpawnedUnitsOfType( "npc_dota_creature_scarab_priest" ) + for i=1,#hPriests do + if hPriests[i] ~= thisEntity then + + if hPriests[i].bAcqRangeModified then + hNearPriest = nil + break + end + + local flDist = ( hPriests[i]:GetAbsOrigin() - hVictim:GetAbsOrigin() ):Length2D() + if flDist < flNearDist then + flNearDist = flDist + hNearPriest = hPriests[i] + end + + end + end + + if hNearPriest == nil then + return + end + + hNearPriest:SetDayTimeVisionRange( 5000 ) + hNearPriest:SetNightTimeVisionRange( 5000 ) + hNearPriest:SetAcquisitionRange( 5000 ) + hNearPriest.bAcqRangeModified = true + + -- Order nearby zealots idle unonwned to start attacking also + local hZealots = thisEntity.Encounter:GetSpawnedUnitsOfType( "npc_dota_creature_zealot_scarab" ) + for i=1,#hZealots do + local hZealot = hZealots[i] + if hZealot:GetOwnerEntity() == nil and hZealot:GetAggroTarget() == nil and ( hNearPriest:GetAbsOrigin() - hZealot:GetAbsOrigin() ):Length2D() < 800 then + hZealot:SetDayTimeVisionRange( 5000 ) + hZealot:SetNightTimeVisionRange( 5000 ) + hZealot:SetAcquisitionRange( 5000 ) + end + end +end + + +function SpikedCarapace() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.SpikedCarapaceAbility:entindex(), + Queue = false, + }) + + return 0.5 +end + + +function SummonZealots( ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.SummonZealotsAbility:entindex(), + Queue = false, + }) + + return 0.5 +end + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/scarab_zealot.lua b/aghanim_singleplayer/scripts/vscripts/ai/scarab_zealot.lua new file mode 100755 index 0000000..8d3d563 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/scarab_zealot.lua @@ -0,0 +1,92 @@ +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.ImpaleAbility = thisEntity:FindAbilityByName( "aghsfort_creature_impale" ) + + thisEntity:SetContextThink( "ScarabZealotThink", ScarabZealotThink, 1 ) +end + +function LastTargetImpaleTime( hTarget ) + + local flLastTime = thisEntity.Encounter.ImpaleTargets[ tostring( hTarget:entindex() ) ] + if flLastTime == nil then + flLastTime = 0 + end + + return flLastTime + +end + +function ScarabZealotThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if thisEntity.Encounter.ImpaleTargets == nil then + thisEntity.Encounter.ImpaleTargets = {} + end + + if thisEntity.ImpaleAbility ~= nil and thisEntity.ImpaleAbility:IsFullyCastable() then + + -- Select a unit in range to attack + -- And don't pick a target who was impaled at in the last second + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, + thisEntity.ImpaleAbility:GetCastRange(), DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, 0, false ) + + local hPossibleEnemies = {} + for _,hEnemy in pairs( enemies ) do + local flTimeSinceLastImpale = GameRules:GetGameTime() - LastTargetImpaleTime( hEnemy ) + if hEnemy ~= nil and hEnemy:IsAlive() and hEnemy:IsInvulnerable() == false and + hEnemy:IsMagicImmune() == false and ( flTimeSinceLastImpale > 0.5 ) then + + table.insert( hPossibleEnemies, hEnemy ) + end + end + + -- Pick a random one, but prefer one who is at least 500 away + local hNearEnemy = nil + while #hPossibleEnemies > 0 do + local nIndex = math.random( 1, #hPossibleEnemies ) + local hEnemy = hPossibleEnemies[ nIndex ] + if ( ( hEnemy:GetAbsOrigin() - thisEntity:GetAbsOrigin() ):Length2D() > 500 ) then + return Impale( hEnemy ) + end + hNearEnemy = hEnemy + table.remove( hPossibleEnemies, nIndex ) + end + + -- If not, then pick a close one + if hNearEnemy ~= nil then + return Impale( hNearEnemy ) + end + + end + + return 0.1 +end + +function Impale( hTarget ) + + local vTargetPos = hTarget:GetAbsOrigin() + RandomVector( RandomFloat( 50, 150 ) ) + thisEntity.Encounter.ImpaleTargets[ tostring( hTarget:entindex() ) ] = GameRules:GetGameTime() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = thisEntity.ImpaleAbility:entindex(), + Position = vTargetPos, + Queue = false, + }) + + return 0.5 +end diff --git a/aghanim_singleplayer/scripts/vscripts/ai/shared.lua b/aghanim_singleplayer/scripts/vscripts/ai/shared.lua new file mode 100755 index 0000000..5bf0072 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/shared.lua @@ -0,0 +1,584 @@ + +-------------------------------------------------------------------------------- + +function GetEnemyHeroesInRange( hUnit , flRange ) + if flRange == nil then + flRange = 1250 + end + local enemies = FindUnitsInRadius( hUnit:GetTeamNumber(), hUnit:GetAbsOrigin(), nil, flRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + return enemies +end + +-------------------------------------------------------------------------------- + +function GetVisibleEnemyHeroesInRange( hUnit , flRange ) + if flRange == nil then + flRange = 1250 + end + local enemies = FindUnitsInRadius( hUnit:GetTeamNumber(), hUnit:GetAbsOrigin(), nil, flRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + return enemies +end + +-------------------------------------------------------------------------------- + +function GetNoteworthyVisibleEnemiesNearby( hUnit, flRange ) + if flRange == nil then + flRange = 1250 + end + + local eTARGETED_UNITS = DOTA_UNIT_TARGET_CREEP + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_HERO + local enemies = FindUnitsInRadius( hUnit:GetTeamNumber(), hUnit:GetAbsOrigin(), nil, flRange, DOTA_UNIT_TARGET_TEAM_ENEMY, eTARGETED_UNITS, DOTA_UNIT_TARGET_FLAG_NO_INVIS + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + + for index, hEnemy in pairs( enemies ) do + if hEnemy:IsRealHero() == false and hEnemy:IsConsideredHero() == false and hEnemy:IsIllusion() == false then + -- Remove the most unimportant units + table.remove( enemies, index ) + end + end + + return enemies +end + +-------------------------------------------------------------------------------- + +function FilterEntitiesOutsideOfRange( vPosition, hEntitiesTable, flRange ) + if hEntitiesTable == nil or #hEntitiesTable == 0 then + return {} + end + + for n=#hEntitiesTable,1,-1 do + local hEntity = hEntitiesTable[ n ] + if hEntity ~= nil then + local fDist = ( hEntity:GetOrigin() - vPosition ):Length2D() + if fDist > flRange then + table.remove( hEntitiesTable, n ) + end + end + end + + return hEntitiesTable +end + +-------------------------------------------------------------------------------- +-- General Utility Fucntions -- +-------------------------------------------------------------------------------- + +function AdvancedRandomVector( MaxLength, MinLength, vAwayFromVec, vAwayFromDist ) + local vCandidate = nil + repeat + vCandidate = RandomVector(1):Normalized()*RandomFloat(MinLength,MaxLength) + until (vAwayFromVec == nil or vAwayFromDist == nil) or ( (vAwayFromVec - vCandidate):Length2D() > vAwayFromDist ) + return vCandidate +end + +function MoveOrder( hUnit, vPos ) + ExecuteOrderFromTable({ + UnitIndex = hUnit:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = vPos, + }) + + return 1.0 +end + +function StopOrder( hUnit ) + ExecuteOrderFromTable({ + UnitIndex = hUnit:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP, + }) +end + +-------------------------------------------------------------------------------- +function AttackMoveOrder( hAttacker, hEnemy ) + if (not hAttacker or not hEnemy or not hAttacker:HasAttackCapability() ) then + return 0.25 + end + + ExecuteOrderFromTable({ + UnitIndex = hAttacker:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = hEnemy:GetOrigin(), + }) + + return 1.0 +end + +-------------------------------------------------------------------------------- + +function AttackTargetOrder( hAttacker, hEnemy ) + if ( not hAttacker or not hEnemy or not hAttacker:HasAttackCapability() ) then + return 0.25 + end + + --printf( "AttackTargetOrder -- attacker: %s, target: %s", hAttacker:GetUnitName(), hEnemy:GetUnitName() ) + + ExecuteOrderFromTable({ + UnitIndex = hAttacker:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hEnemy:entindex(), + }) + + return 1.0 +end + +-------------------------------------------------------------------------------- + +function SprintIsReady( hCaster ) + local hAbility = hCaster.abilities.hSprint + if hAbility ~= nil and hAbility:IsFullyCastable() then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CastSprint( hCaster ) + local hAbility = hCaster.abilities.hSprint + ExecuteOrderFromTable({ + UnitIndex = hCaster:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hAbility:entindex(), + Queue = false, + }) + + return 5.0 +end + +-------------------------------------------------------------------------------- + +function TailIsReady( hCaster ) + local hAbility = hCaster.abilities.hTailSpinCCW + if hCaster.bEnemiesInFront and hAbility ~= nil and hAbility:IsFullyCastable() then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CastTailSpinCCW( hCaster ) + local hAbility = hCaster.abilities.hTailSpinCCW + ExecuteOrderFromTable({ + UnitIndex = hCaster:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hAbility:entindex() + }) + + return 5.0 +end + +-------------------------------------------------------------------------------- + +function MindControlIsReady( hCaster, hEnemies ) + local nEnemiesAlive = 0 + for _, hEnemy in pairs( hEnemies ) do + if hEnemy:IsAlive() then + nEnemiesAlive = nEnemiesAlive + 1 + end + end + if nEnemiesAlive <= 1 then + return false + end + + local hAbility = hCaster.abilities.hMindControl + if hAbility ~= nil and hAbility:IsFullyCastable() then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CastMindControl( hCaster, hEnemies ) + local hAbility = hCaster.abilities.hMindControl + local hTarget = hEnemies[ RandomInt( 1, #hEnemies ) ] + ExecuteOrderFromTable({ + UnitIndex = hCaster:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hTarget:entindex(), + AbilityIndex = hAbility:entindex(), + Queue = false, + }) + + return 4.0 +end + +-------------------------------------------------------------------------------- + +function TorrentsIsReady( hCaster ) + local hAbility = hCaster.abilities.hTorrents + if hAbility ~= nil and hAbility:IsFullyCastable() then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CastTorrents( hCaster ) + local hAbility = hCaster.abilities.hTorrents + ExecuteOrderFromTable({ + UnitIndex = hCaster:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hAbility:entindex(), + Queue = false, + }) + + return 10 +end + +-------------------------------------------------------------------------------- + +function LineWaveIsReady( hCaster ) + local hAbility = hCaster.abilities.hLineWave + if hAbility ~= nil and hAbility:IsFullyCastable() then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CastLineWave( hCaster, hEnemies ) + local hAbility = hCaster.abilities.hLineWave + local hTarget = hEnemies[ RandomInt( 1, #hEnemies ) ] + + local fDist = -1 + local fHighestDist = 0 + local hFarthestEnemy = nil + for _, hEnemy in pairs( hEnemies ) do + fDist = ( hEnemy:GetOrigin() - hCaster:GetOrigin() ):Length2D() + if fDist > fHighestDist then + fHighestDist = fDist + hFarthestEnemy = hEnemy + end + end + + if hFarthestEnemy == nil then + return 0.5 + end + + ExecuteOrderFromTable({ + UnitIndex = hCaster:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hFarthestEnemy:entindex(), + AbilityIndex = hAbility:entindex(), + Queue = false, + }) + + return 4 +end + +-------------------------------------------------------------------------------- + +function WavesIsReady( hCaster ) + local hAbility = hCaster.abilities.hWaves + if hAbility ~= nil and hAbility:IsFullyCastable() then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CastWaves( hCaster ) + local hAbility = hCaster.abilities.hWaves + ExecuteOrderFromTable({ + UnitIndex = hCaster:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hAbility:entindex(), + Queue = false, + }) + + return 14 +end + +-------------------------------------------------------------------------------- + +function SummonMinionsIsReady( hCaster ) + local hAbility = hCaster.abilities.hSummonMinions + if hAbility ~= nil and hAbility:IsFullyCastable() then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CastSummonMinions( hCaster ) + local hAbility = hCaster.abilities.hSummonMinions + ExecuteOrderFromTable({ + UnitIndex = hCaster:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hAbility:entindex(), + Queue = false, + }) + + return 7 +end + +-------------------------------------------------------------------------------- + +function SummonMinionsMediumIsReady( hCaster ) + local hAbility = hCaster.abilities.hSummonMinionsMedium + if hAbility ~= nil and hAbility:IsFullyCastable() then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CastSummonMinionsMedium( hCaster ) + local hAbility = hCaster.abilities.hSummonMinionsMedium + ExecuteOrderFromTable({ + UnitIndex = hCaster:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hAbility:entindex(), + Queue = false, + }) + + return 7 +end + +-------------------------------------------------------------------------------- + +function SummonCloneIsReady( hCaster ) + local hAbility = hCaster.abilities.hSummonClone + if hAbility ~= nil and hAbility:IsFullyCastable() and hCaster.nSummonCloneCasts < ( hCaster.Phase - 1 ) then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CastSummonClone( hCaster ) + local hAbility = hCaster.abilities.hSummonClone + ExecuteOrderFromTable({ + UnitIndex = hCaster:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hAbility:entindex(), + Queue = false, + }) + + return 2 +end + +-------------------------------------------------------------------------------- + +function MouthBeamIsReady( hCaster ) + local hAbility = hCaster.abilities.hMouthBeam + if hAbility ~= nil and hAbility:IsFullyCastable() then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CastMouthBeam( hCaster, hEnemies ) + local hAbility = hCaster.abilities.hMouthBeam + local hTarget = hEnemies[ RandomInt( 1, #hEnemies ) ] + if hTarget == nil then + return 1 + end + ExecuteOrderFromTable({ + UnitIndex = hCaster:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = hTarget:GetOrigin(), + AbilityIndex = hAbility:entindex(), + Queue = false, + }) + + return 10.0 +end + +-------------------------------------------------------------------------------- + +function FindItemAbility( hCaster, szItemName ) + for i = 0, 5 do + local item = hCaster:GetItemInSlot( i ) + if item then + if item:GetAbilityName() == szItemName then + return item + end + end + end +end + +-------------------------------------------------------------------------------- + +function CastTargetedItem( hUnit, hTarget, szItemName ) + local hItem = hUnit:FindItemInInventory( szItemName ) + return CastTargetedAbility( hUnit, hTarget, hItem ) +end + +-------------------------------------------------------------------------------- + +function CastUntargetedItem( hUnit, szItemName ) + local hItem = hUnit:FindItemInInventory( szItemName ) + return CastUntargetedAbility( hUnit, hItem ) +end + +-------------------------------------------------------------------------------- + +function CastPositionalItem( hUnit, vPosition, szItemName ) + local hItem = hUnit:FindItemInInventory( szItemName ) + return CastPositionalAbility( hUnit, vPosition, hItem ) +end + +-------------------------------------------------------------------------------- + +function CastTargetedAbility( hUnit, hTarget, hAbility ) + if type(hAbility) == "string" then + hAbility = hUnit:FindAbilityByName(hAbility) + printf("result of string ability is %s", hAbility:GetName()) + end + if hAbility and hAbility:IsFullyCastable() then + --printf( "%s casting %s on %s", hUnit:GetName(), hAbility:GetName(), hTarget:GetName() ) + ExecuteOrderFromTable({ + UnitIndex = hUnit:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hTarget:entindex(), + AbilityIndex = hAbility:entindex() + }) + return true + end + return false +end + +-------------------------------------------------------------------------------- + +function CastPositionalAbility( hUnit, vPosition, hAbility ) + if type(hAbility) == "string" then + hAbility = hUnit:FindAbilityByName(hAbility) + end + if hAbility and hAbility:IsFullyCastable() then + ExecuteOrderFromTable({ + UnitIndex = hUnit:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vPosition, + AbilityIndex = hAbility:entindex() + }) + return true + end + return false +end + +-------------------------------------------------------------------------------- + +function CastUntargetedAbility( hUnit, hAbility ) + if type(hAbility) == "string" then + hAbility = hUnit:FindAbilityByName(hAbility) + end + if hAbility and hAbility:IsFullyCastable() then + ExecuteOrderFromTable({ + UnitIndex = hUnit:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hAbility:entindex() + }) + return true + end + return false +end + +-------------------------------------------------------------------------------- + +function GetAlliesInRange( hCaster, flRange ) + return FindUnitsInRadius( hCaster:GetTeamNumber(), hCaster:GetOrigin(), nil, flRange, + DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_OTHER, + DOTA_UNIT_TARGET_FLAG_NO_INVIS + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) +end + +function LastAllyCastTime( hCaster, hAbility, flRange, hTarget ) + if flRange == nil then + flRange = 1000 + end + local flLastCastTime = -999999 + local hAllies = GetAlliesInRange( hCaster, flRange ) + for index,hAlly in pairs(hAllies) do + local flAllyTime = hAlly["last_cast_time_"..hAbility:GetName()] + local hAllyTarget = hAlly["last_cast_target_"..hAbility:GetName()] + if flAllyTime ~= nil and (hTarget == nil or hTarget == hAllyTarget) then + flLastCastTime = math.max(flAllyTime,flLastCastTime) + end + end + return flLastCastTime +end + +-------------------------------------------------------------------------------- + +function UpdateLastCastTime( hCaster, hAbility, hTarget ) + hCaster["last_cast_time_"..hAbility:GetName()] = GameRules:GetGameTime() + hCaster["last_cast_target_"..hAbility:GetName()] = hTarget +end + +-------------------------------------------------------------------------------- + +function TeleportIsReady( hCaster ) + if ( GameRules:GetGameTime() > ( hCaster.fLastTeleportChain + hCaster.nTeleportChainCD ) ) then + hCaster.nRecentTeleportsCast = 0 + hCaster.fLastTeleportChain = GameRules:GetGameTime() + end + + local hAbility = hCaster.abilities.hTeleport + if hAbility ~= nil and hAbility:IsFullyCastable() and ( hCaster.nRecentTeleportsCast < hCaster.nTeleportsToChain ) then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CastTeleport( hCaster, hEnemies ) + local hAbility = hCaster.abilities.hTeleport + + local hFilteredEnemies = {} + for _, hEnemy in pairs( hEnemies ) do + local fDist = ( hEnemy:GetOrigin() - hCaster:GetOrigin() ):Length2D() + if fDist > 500 then + table.insert( hFilteredEnemies, hEnemy ) + end + end + + local hTarget = nil + if #hFilteredEnemies > 0 then + hTarget = hFilteredEnemies[ RandomInt( 1, #hFilteredEnemies ) ] + else + hTarget = hEnemies[ RandomInt( 1, #hEnemies ) ] + end + + local vTargetPos = hTarget:GetOrigin() + + ExecuteOrderFromTable({ + UnitIndex = hCaster:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vTargetPos, + AbilityIndex = hAbility:entindex(), + Queue = false, + }) + + hCaster.nRecentTeleportsCast = hCaster.nRecentTeleportsCast + 1 + + if ( hCaster.nRecentTeleportsCast >= hCaster.nTeleportsToChain ) then + return 4.0 + end + + return 1.8 +end + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/sheep.lua b/aghanim_singleplayer/scripts/vscripts/ai/sheep.lua new file mode 100755 index 0000000..1e17ccb --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/sheep.lua @@ -0,0 +1,73 @@ +--[[ Sheep AI ]] + +local bHasBeenSaved = false +local hPortal = nil +local vPortalPos = nil +local nHoldTime = 0 + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + hPortal = Entities:FindByName( nil, "portal_path_track" ) + vPortalPos = hPortal:GetOrigin() + + thisEntity:SetContextThink( "SheepThink", SheepThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function SheepThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if not thisEntity.bInitialized then + thisEntity.vInitialSpawnPos = thisEntity:GetOrigin() + thisEntity.bInitialized = true + end + + if bHasBeenSaved == false then + if hPortal ~= nil then + thisEntity:MoveToPosition( vPortalPos ) + local vPos = thisEntity:GetOrigin() + local difference = vPos - vPortalPos + local distance = difference:Length() + if distance < 100 then + --print("Sheep has been saved!") + thisEntity:Hold() + local szPortalFX = "particles/econ/events/league_teleport_2014/teleport_start_league.vpcf" + local hPortalEffects = ParticleManager:CreateParticle( szPortalFX, PATTACH_CUSTOMORIGIN_FOLLOW, thisEntity ) + ParticleManager:SetParticleControlEnt( hPortalEffects, 0, thisEntity, PATTACH_POINT_FOLLOW, "attach_hitloc", thisEntity:GetAbsOrigin(), false ) + thisEntity:Attribute_SetIntValue( "effectsID", hPortalEffects ) + bHasBeenSaved = true + EmitSoundOn("Creature.Sheep.Portal_Start", thisEntity) + end + end + else + if nHoldTime < 3 then + nHoldTime = nHoldTime + 1 + --thisEntity:SetModelScale(nModelScale) + else + StopSoundOn("Creature.Sheep.Portal_Start", thisEntity) + EmitSoundOn("Creature.Sheep.Portal_End", thisEntity) + local hBase = Entities:FindByName( nil, "a1_1a_teamspawn_left" ) + local vTargetPoint = hBase:GetOrigin() + thisEntity:SetAbsOrigin( vTargetPoint ) + thisEntity:ForceKill(false) + end + end + + return 1 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/skeleton_king.lua b/aghanim_singleplayer/scripts/vscripts/ai/skeleton_king.lua new file mode 100755 index 0000000..ce84797 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/skeleton_king.lua @@ -0,0 +1,91 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hHellfireBlast = thisEntity:FindAbilityByName( "undead_woods_skeleton_king_hellfire_blast" ) + thisEntity.hMortalStrike = thisEntity:FindAbilityByName( "undead_woods_skeleton_king_mortal_strike" ) + thisEntity.bInitialSkeletons = false + + thisEntity:SetContextThink( "SkeletonKingThink", SkeletonKingThink, 1.0 ) +end + +-------------------------------------------------------------------------------- + +function SkeletonKingThink() + if not IsServer() then + return + end + + if thisEntity == nil or thisEntity:IsNull() or ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return 1 + end + + if thisEntity.hHellfireBlast and thisEntity.hHellfireBlast:IsFullyCastable() then + return CastHellFireBlast( hEnemies[#hEnemies] ) + end + + if thisEntity.hMortalStrike then + local hBuff = thisEntity:FindModifierByName( "modifier_skeleton_king_mortal_strike" ) + if hBuff ~= nil then + local nMaxSkeletons = thisEntity.hMortalStrike:GetSpecialValueFor( "max_skeleton_charges" ) + if thisEntity.bInitialSkeletons == false then + hBuff:SetStackCount( nMaxSkeletons ) + thisEntity.bInitialSkeletons = true + return CastMortalStrike() + end + + if hBuff:GetStackCount() < nMaxSkeletons then + hBuff:IncrementStackCount() + elseif thisEntity.hMortalStrike:IsFullyCastable() then + return CastMortalStrike() + end + end + end + + return 0.5 +end + + +-------------------------------------------------------------------------------- + +function CastHellFireBlast( hTarget ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hTarget:entindex(), + AbilityIndex = thisEntity.hHellfireBlast:entindex(), + Queue = false, + }) + + return 1 +end + +-------------------------------------------------------------------------------- + +function CastMortalStrike( ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hMortalStrike:entindex(), + Queue = false, + }) + + return 1 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/skywrath_mage.lua b/aghanim_singleplayer/scripts/vscripts/ai/skywrath_mage.lua new file mode 100755 index 0000000..3f8cac6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/skywrath_mage.lua @@ -0,0 +1,123 @@ +--[[ Skywrath Mage AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorMysticFlare } ) +end + +function AIThink() + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 1000 ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorMysticFlare = {} + +function BehaviorMysticFlare:Evaluate() + --print( "BehaviorMysticFlare:Evaluate()" ) + local desire = 0 + + self.mysticFlareAbility = thisEntity:FindAbilityByName( "skywrath_mage_mystic_flare" ) + if self.mysticFlareAbility and self.mysticFlareAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 600, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + for _,hUnit in pairs( enemies ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hAbilityModifier = hUnit:FindModifierByName( "modifier_skywrath_mage_mystic_flare" ) + local hDuelModifier = hUnit:FindModifierByName( "modifier_legion_commander_duel" ) + if hAbilityModifier ~= nil then + --print("Enemy is being Mystic Flared") + desire = 0 + elseif hDuelModifier ~= nil then + --print("Enemy is in a Duel") + desire = 8 + else + desire = #enemies + 8 + end + end + end + end + end + + return desire +end + +function BehaviorMysticFlare:Begin() + --print( "BehaviorMysticFlare:Begin()" ) + if self.mysticFlareAbility and self.mysticFlareAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 800, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + for _,hUnit in pairs( enemies ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hAbilityhModifier = hUnit:FindModifierByName( "modifier_legion_commander_duel" ) + if hAbilityhModifier ~= nil then + --print( "Casting Mystic Flare" ) + local target = hUnit + local targetPoint = target:GetAbsOrigin() + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = self.mysticFlareAbility:entindex(), + Position = targetPoint, + } + return order + else + return nil + end + end + end + end + end + + return nil +end + +BehaviorMysticFlare.Continue = BehaviorMysticFlare.Begin + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorMysticFlare } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/slark.lua b/aghanim_singleplayer/scripts/vscripts/ai/slark.lua new file mode 100755 index 0000000..cf1e76d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/slark.lua @@ -0,0 +1,298 @@ +--[[ Slark Peon AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity.vNagaPosition = nil + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorDarkPact, BehaviorPounce, BehaviorShadowDance, BehaviorRunAway } ) +end + +function AIThink() -- For some reason AddThinkToEnt doesn't accept member functions + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, thisEntity:GetDayTimeVisionRange() ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorDarkPact = {} + +function BehaviorDarkPact:Evaluate() + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.darkPactAbility = thisEntity:FindAbilityByName( "slark_dark_pact" ) + if not self.darkPactAbility or not self.darkPactAbility:IsFullyCastable() then + return desire + end + + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 400, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + for _,hUnit in pairs( enemies ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hDarkPactModifier = hUnit:FindModifierByName( "modifier_slark_dark_pact" ) + if hDarkPactModifier ~= nil then + --print("Enemy is already Dark Pacted") + desire = 0 + else + local nRandomInt = RandomInt(1,5) + if nRandomInt == 1 then + desire = #enemies + 1 + end + end + end + end + end + + return desire +end + +function BehaviorDarkPact:Begin() + --print( "BehaviorDarkPact:Begin()" ) + if self.darkPactAbility and self.darkPactAbility:IsFullyCastable() then + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.darkPactAbility:entindex(), + } + return order + end + return nil + +end + +BehaviorDarkPact.Continue = BehaviorDarkPact.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorPounce = {} + +function BehaviorPounce:Evaluate() + --print( "BehaviorPounce:Evaluate()" ) + local desire = 0 + + self.pounceAbility = thisEntity:FindAbilityByName( "slark_pounce" ) + if self.pounceAbility and self.pounceAbility:IsFullyCastable() then + local hGoal = Entities:FindByName( nil, "slark_room_center" ) + local vGoalPos = hGoal:GetOrigin() + local goalDifference = vGoalPos - thisEntity:GetOrigin() + local goalDistance = goalDifference:Length() + if goalDistance > 1500 then + --print("Too close to edge of room") + return desire + end + local nRange = 700 + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, nRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + for _,enemy in pairs(enemies) do + local enemyVec = enemy:GetOrigin() - thisEntity:GetOrigin() + local myForward = thisEntity:GetForwardVector() + local dotProduct = enemyVec:Dot( myForward ) + local enemyDesire = 0 + if dotProduct > 0 then + enemyDesire = 8 + end + local distance = enemyVec:Length2D() + if distance > 400 then + desire = enemyDesire + self.target = enemy + end + end + end + + return desire +end + +function BehaviorPounce:Begin() + --print( "BehaviorPounce:Begin()" ) + + if self.target and self.target:IsAlive() then + if self.pounceAbility and self.pounceAbility:IsFullyCastable() then + --print( "Casting Star Fall" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.pounceAbility:entindex(), + Queue = false, + } + return order + end + end + + return nil +end + +BehaviorPounce.Continue = BehaviorPounce.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorShadowDance = {} + +function BehaviorShadowDance:Evaluate() + --print( "BehaviorShadowDance:Evaluate()" ) + local desire = 0 + + local retreatPoints = thisEntity.Encounter:GetRetreatPoints() + if retreatPoints == nil then + print( "*** WARNING: This AI requires info_targets named retreat_point in the map " .. thisEntity.Encounter:GetRoom():GetName() ) + return 0 + end + + local happyPlaceIndex = RandomInt( 1, #retreatPoints ) + self.escapePoint = retreatPoints[ happyPlaceIndex ]:GetAbsOrigin() + + self.shadowDanceAbility = thisEntity:FindAbilityByName( "slark_shadow_dance" ) + local nRange = 300 + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, nRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if self.shadowDanceAbility and self.shadowDanceAbility:IsFullyCastable() then + if ( thisEntity:GetHealthPercent() < 25 ) and ( #enemies >= 0 ) then + desire = #enemies + 1 + end + end + + return desire +end + +function BehaviorShadowDance:Begin() + --print( "BehaviorShadowDance:Begin()" ) + self.startEscapeTime = GameRules:GetGameTime() + + if self.shadowDanceAbility and self.shadowDanceAbility:IsFullyCastable() then + --print( "Casting Shadow Dance" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.shadowDanceAbility:entindex(), + } + return order + end + + return nil +end + +function BehaviorShadowDance:IsDone( ) + return ( GameRules:GetGameTime() > ( self.startEscapeTime + 6 ) ) or + ( ( thisEntity:GetAbsOrigin() - self.escapePoint ):Length2D() < 200 ) +end + +function BehaviorShadowDance:Think( ) + -- keep moving towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.escapePoint + } + +end + +BehaviorShadowDance.Continue = BehaviorShadowDance.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorRunAway = {} + +function BehaviorRunAway:Evaluate() + local desire = 0 + local retreatPoints = thisEntity.Encounter:GetRetreatPoints() + if retreatPoints == nil then + print( "*** WARNING: This AI requires info_targets named retreat_point in the map " .. thisEntity.Encounter:GetRoom():GetName() ) + return 0 + end + + local creatures = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_NONE, FIND_ANY_ORDER, false ) + for _,hUnit in pairs( creatures ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hSongModifier = hUnit:FindModifierByName( "modifier_naga_siren_song_of_the_siren_aura" ) + if hSongModifier ~= nil then + --print("Naga Siren is singing!") + thisEntity.vNagaPosition = hUnit:GetAbsOrigin() + desire = 8 + end + end + end + + return desire +end + +function BehaviorRunAway:Begin() + --print( "BehaviorRunAway:Begin()" ) + self.startEscapeTime = GameRules:GetGameTime() + + -- Move towards Naga + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity.vNagaPosition + } + +end + +function BehaviorRunAway:IsDone( ) + return ( GameRules:GetGameTime() > ( self.startEscapeTime + 6 ) ) or + ( ( thisEntity:GetAbsOrigin() - thisEntity.vNagaPosition ):Length2D() < 200 ) +end + +function BehaviorRunAway:Think( ) + -- keep moving towards our escape point + return + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity.vNagaPosition + } + +end + +BehaviorRunAway.Continue = BehaviorRunAway.Begin + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorDarkPact, BehaviorPounce, BehaviorShadowDance, BehaviorRunAway } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/small_hellbear.lua b/aghanim_singleplayer/scripts/vscripts/ai/small_hellbear.lua new file mode 100755 index 0000000..2555301 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/small_hellbear.lua @@ -0,0 +1,77 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity:SetContextThink( "SmallHellbearThink", SmallHellbearThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function SmallHellbearThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 1 + end + + if not thisEntity.bInitialized then + thisEntity.vInitialSpawnPos = thisEntity:GetOrigin() + thisEntity.bInitialized = true + end + + -- Increase acquisition range after the initial aggro + if ( not thisEntity.bAcqRangeModified ) and thisEntity:GetAggroTarget() then + thisEntity:SetAcquisitionRange( 750 ) + thisEntity.bAcqRangeModified = true + end + + if thisEntity:GetAggroTarget() then + thisEntity.fTimeWeLostAggro = nil + end + + if thisEntity:GetAggroTarget() and ( thisEntity.fTimeAggroStarted == nil ) then + --print( "Do we have aggro and need to get a timestamp?" ) + thisEntity.fTimeAggroStarted = GameRules:GetGameTime() + end + + if ( not thisEntity:GetAggroTarget() ) and ( thisEntity.fTimeAggroStarted ~= nil ) then + --print( "We lost aggro." ) + thisEntity.fTimeWeLostAggro = GameRules:GetGameTime() + thisEntity.fTimeAggroStarted = nil + end + + if ( not thisEntity:GetAggroTarget() ) then + if thisEntity.fTimeWeLostAggro and ( GameRules:GetGameTime() > ( thisEntity.fTimeWeLostAggro + 1.0 ) ) then + return RetreatHome() + end + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function RetreatHome() + --print( "RetreatHome - " .. thisEntity:GetUnitName() .. " is returning to home position" ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity.vInitialSpawnPos -- + RandomVector( RandomFloat( -300, 300 ) ) + }) + + return 0.5 +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/spectral_tusk_mage.lua b/aghanim_singleplayer/scripts/vscripts/ai/spectral_tusk_mage.lua new file mode 100755 index 0000000..60a6634 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/spectral_tusk_mage.lua @@ -0,0 +1,111 @@ + +require( "ai/shared" ) + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hTombstoneAbility = thisEntity:FindAbilityByName( "undead_tusk_mage_tombstone" ) + + thisEntity.hTombstones = {} + + thisEntity.nMyMaxTombstones = 2 + thisEntity.nMaxTombstonesInArea = 4 + + thisEntity.fSearchRadius = thisEntity:GetAcquisitionRange() + 200 + + thisEntity:SetContextThink( "UndeadSpectralTuskMageThink", UndeadSpectralTuskMageThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function UndeadSpectralTuskMageThink() + if not IsServer() then + return + end + + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + if ( not thisEntity:GetAggroTarget() ) then + return 1.0 + end + + -- Are we currently holding aggro? + if ( not thisEntity.bHasAggro ) and thisEntity:GetAggroTarget() then + thisEntity.timeOfLastAggro = GameRules:GetGameTime() + thisEntity.bHasAggro = true + elseif thisEntity.bHasAggro and ( not thisEntity:GetAggroTarget() ) then + thisEntity.bHasAggro = false + end + + if ( not thisEntity.bHasAggro ) then + return 1 + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity.fSearchRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return 1 + end + + if thisEntity.hTombstoneAbility ~= nil and thisEntity.hTombstoneAbility:IsFullyCastable() then + for k, hTombstone in pairs( thisEntity.hTombstones ) do + if hTombstone == nil or hTombstone:IsNull() or hTombstone:IsAlive() == false then + table.remove( thisEntity.hTombstones, k ) + end + end + + local nTombstonesAround = 0 + local nFlags = DOTA_UNIT_TARGET_FLAG_NONE + local friendlies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 1000, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, nFlags, FIND_CLOSEST, false ) + for _, friendly in pairs ( friendlies ) do + if friendly ~= nil and friendly:GetUnitName() == "npc_dota_undead_tusk_tombstone" then + nTombstonesAround = nTombstonesAround + 1 + end + end + + if ( #friendlies < 80 ) and ( nTombstonesAround < thisEntity.nMaxTombstonesInArea ) and ( #thisEntity.hTombstones < thisEntity.nMyMaxTombstones ) then + local fNow = GameRules:GetGameTime() + local flLastAllyCastTime = LastAllyCastTime( thisEntity, thisEntity.hTombstoneAbility, 1000, nil ) + local fCastPoint = thisEntity.hTombstoneAbility:GetCastPoint() + if ( fNow - flLastAllyCastTime ) > ( fCastPoint + 0.1 ) then + local vCastLocation = thisEntity:GetAbsOrigin() + ( thisEntity:GetForwardVector() * 300 ) + if GridNav:CanFindPath( thisEntity:GetAbsOrigin(), vCastLocation ) then + UpdateLastCastTime( thisEntity, thisEntity.hTombstoneAbility, nil ) + return CastTombstone( vCastLocation ) + end + end + end + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function CastTombstone( vPos ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vPos, + AbilityIndex = thisEntity.hTombstoneAbility:entindex(), + Queue = false, + }) + + return 1.0 +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/ai/spectre.lua b/aghanim_singleplayer/scripts/vscripts/ai/spectre.lua new file mode 100755 index 0000000..65b6121 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/spectre.lua @@ -0,0 +1,56 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hDispersionAbility = thisEntity:FindAbilityByName( "aghsfort_spectre_active_dispersion" ) + + thisEntity:SetContextThink( "SpectreThink", SpectreThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function SpectreThink() + if not IsServer() then + return + end + + if thisEntity == nil or thisEntity:IsNull() or ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 600, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return 1 + end + + if thisEntity.hDispersionAbility and thisEntity.hDispersionAbility:IsFullyCastable() then + return CastDispersion() + end + + return 0.5 +end + +-------------------------------------------------------------------------------- + +function CastDispersion() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hDispersionAbility:entindex(), + Queue = false, + }) + + return 0.5 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/storegga.lua b/aghanim_singleplayer/scripts/vscripts/ai/storegga.lua new file mode 100755 index 0000000..d3c0c15 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/storegga.lua @@ -0,0 +1,271 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity:AddNewModifier( nil, nil, "modifier_invulnerable", { duration = -1 } ) + + SlamAbility = thisEntity:FindAbilityByName( "storegga_arm_slam" ) + GrabAbility = thisEntity:FindAbilityByName( "storegga_grab" ) + ThrowAbility = thisEntity:FindAbilityByName( "storegga_grab_throw" ) + GroundPoundAbility = thisEntity:FindAbilityByName( "storegga_ground_pound" ) + AvalancheAbility = thisEntity:FindAbilityByName( "storegga_avalanche" ) + + thisEntity.flThrowTimer = 0.0 -- externally updated + + thisEntity.fLongWaitTime = 5 + + thisEntity.fEnemySearchRange = 2500 + thisEntity.fRockSearchRange = 2500 + + thisEntity:SetContextThink( "StoreggaThink", StoreggaThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function StoreggaThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + if ( not thisEntity.bInitialInvulnRemoved ) then + thisEntity:RemoveModifierByName( "modifier_invulnerable" ) + thisEntity.bInitialInvulnRemoved = true + end + + if thisEntity:IsChanneling() then + return 0.1 + end + + if AvalancheAbility ~= nil and AvalancheAbility:IsFullyCastable() and thisEntity:GetHealthPercent() < 60 then + return CastAvalanche() + end + + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity.fEnemySearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false ) + local rocks = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity.fRockSearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_CREEP, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false ) + + local nEnemiesAliveInRange = 0 + for i = 1, #enemies do + local enemy = enemies[ i ] + if enemy ~= nil then + if enemy:IsRealHero() and enemy:IsAlive() then + nEnemiesAliveInRange = nEnemiesAliveInRange + 1 + if enemy:FindModifierByName( "modifier_storegga_grabbed_debuff" ) ~= nil then + --printf( "removed %s from enemies table", enemy:GetUnitName() ) + table.remove( enemies, i ) + end + end + end + end + + local hNearestEnemy = enemies[ 1 ] + local hFarthestEnemy = enemies[ #enemies ] + + local hGrabbedEnemyBuff = thisEntity:FindModifierByName( "modifier_storegga_grabbed_buff" ) + local hGrabbedTarget = nil + if hGrabbedEnemyBuff == nil then + if GrabAbility ~= nil and GrabAbility:IsFullyCastable() then + if hNearestEnemy ~= nil and nEnemiesAliveInRange > 1 and RandomInt( 0, 1 ) == 0 then + printf( " Grab the nearest enemy (%s)", hNearestEnemy:GetUnitName() ) + return CastGrab( hNearestEnemy ) + elseif #rocks > 0 then + local hRandomRock = rocks[ RandomInt( 1, #rocks ) ] + if hRandomRock ~= nil then + printf( " Grab a random rock" ) + return CastGrab( hRandomRock ) + end + end + end + else + -- Note: hThrowObject and flThrowTimer are both set by the modifier + local hGrabbedTarget = hGrabbedEnemyBuff.hThrowObject + if GameRules:GetGameTime() > thisEntity.flThrowTimer and hGrabbedTarget ~= nil then + if ThrowAbility ~= nil and ThrowAbility:IsFullyCastable() then + if hFarthestEnemy ~= nil then + printf( " Throw at the farthest enemy; pos: %s", hFarthestEnemy:GetOrigin() ) + return CastThrow( hFarthestEnemy:GetOrigin() ) + elseif #rocks > 0 then + local hFarthestRock = rocks[ #rocks ] + if hFarthestRock ~= nil then + printf( " Throw at the farthest.. rock?; pos: %s", hFarthestRock:GetOrigin() ) + return CastThrow( hFarthestRock:GetOrigin() ) + end + elseif GameRules:GetGameTime() > ( thisEntity.flThrowTimer + thisEntity.fLongWaitTime ) then + printf( " a lot of time has passed and we're still holding onto an object, so just throw it somewhere pathable" ) + + -- If I've been waiting too long, throw grabbed object at some random location + local nMaxDistance = 1400 + local vRandomThrowPos = nil + + local nMaxAttempts = 7 + local nAttempts = 0 + + repeat + if nAttempts > nMaxAttempts then + vRandomThrowPos = nil + printf( "WARNING - storegga - failed to find valid position for throw target pos" ) + break + end + + local vPos = thisEntity:GetAbsOrigin() + RandomVector( nMaxDistance ) + vRandomThrowPos = FindPathablePositionNearby( vPos, 0, 500 ) + nAttempts = nAttempts + 1 + until ( GridNav:CanFindPath( thisEntity:GetOrigin(), vRandomThrowPos ) ) + --until ( GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vRandomThrowPos ) ) + + if vRandomThrowPos == nil then + printf( " never found a good random pos to throw to, so just use my own origin" ) + vRandomThrowPos = thisEntity:GetAbsOrigin() + end + + return CastThrow( vRandomThrowPos ) + end + end + end + end + + if GroundPoundAbility and GroundPoundAbility:IsFullyCastable() then + local fGroundPoundSearchRadius = 1000 + local hGroundPoundEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, fGroundPoundSearchRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false ) + if #hGroundPoundEnemies > 0 then + return CastGroundPound() + end + end + + if SlamAbility ~= nil and SlamAbility:IsFullyCastable() then + if RandomInt( 0, 1 ) == 1 then + if hNearestEnemy ~= nil then + --printf( "Slam the nearest enemy (%s)", hNearestEnemy:GetUnitName() ) + return CastSlam( hNearestEnemy ) + end + else + if hFarthestEnemy ~= nil then + --printf( "Slam the farthest enemy (%s)", hFarthestEnemy:GetUnitName() ) + return CastSlam( hFarthestEnemy ) + end + end + end + + return 0.1 +end + +-------------------------------------------------------------------------------- + +function CastSlam( enemy ) + if enemy == nil or enemy:IsAlive() == false then + return 0.1 + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = enemy:entindex(), + AbilityIndex = SlamAbility:entindex(), + }) + + local fInterval = SlamAbility:GetCastPoint() + 0.1 + + -- Enemies may run away from us so we don't want to try to calculate exactly what our return interval should + -- be (e.g. based on the distance and our movespeed), so for larger distances we're just adding a little extra time + local fDistToEnemy = ( enemy:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + local fNearDistance = 800 + local fMediumDistance = 1300 + if fDistToEnemy > fMediumDistance then + printf( " enemy is beyond medium distance" ) + fInterval = fInterval + 1.0 + elseif fDistToEnemy > fNearDistance then + printf( " enemy is beyond near distance" ) + fInterval = fInterval + 0.5 + end + + return fInterval + --return 1.2 +end + +-------------------------------------------------------------------------------- + +function CastGrab( enemy ) + if enemy == nil or enemy:IsAlive() == false then + return 0.1 + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = enemy:entindex(), + AbilityIndex = GrabAbility:entindex(), + }) + + local fInterval = GrabAbility:GetCastPoint() + 0.1 + return fInterval + --return 1.5 +end + +-------------------------------------------------------------------------------- + +function CastThrow( vPos ) + local vDir = vPos - thisEntity:GetOrigin() + local flDist = vDir:Length2D() + vDir.z = 0.0 + vDir = vDir:Normalized() + + local vFinalPos = vPos + if flDist < 200 then + -- The target's too close and we don't want to throw the unit into our feet, so throw it forward instead + vFinalPos = thisEntity:GetOrigin() + vDir * flDist + end + + printf( "Casting throw at %s", vPos ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + Position = vFinalPos, + --Position = thisEntity:GetOrigin() + vDir * flDist, + AbilityIndex = ThrowAbility:entindex(), + Queue = false, + }) + + local fInterval = ThrowAbility:GetCastPoint() + 0.1 + return fInterval + --return 1.5 +end + +-------------------------------------------------------------------------------- + +function CastAvalanche() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = AvalancheAbility:entindex(), + Queue = false, + }) + + local fInterval = AvalancheAbility:GetCastPoint() + AvalancheAbility:GetChannelTime() + 0.1 + return fInterval + --return 11 +end + +-------------------------------------------------------------------------------- + +function CastGroundPound() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = GroundPoundAbility:entindex(), + Queue = false, + }) + + local fInterval = GroundPoundAbility:GetCastPoint() + GroundPoundAbility:GetChannelTime() + 0.1 + return fInterval + --return 4.0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/ai/temple_guardian.lua b/aghanim_singleplayer/scripts/vscripts/ai/temple_guardian.lua new file mode 100755 index 0000000..4d187cf --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/temple_guardian.lua @@ -0,0 +1,219 @@ + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.bIsEnraged = false + thisEntity.nRageHealthPct = 30 + thisEntity.bBrotherDied = false + + thisEntity.Encounter = nil + + HammerSmashAbility = thisEntity:FindAbilityByName( "temple_guardian_hammer_smash" ) + HammerThrowAbility = thisEntity:FindAbilityByName( "temple_guardian_hammer_throw" ) + PurificationAbility = thisEntity:FindAbilityByName( "temple_guardian_purification" ) + WrathAbility = thisEntity:FindAbilityByName( "temple_guardian_wrath" ) + + RageHammerSmashAbility = thisEntity:FindAbilityByName( "temple_guardian_rage_hammer_smash" ) + RageHammerSmashAbility:SetHidden( false ) + + thisEntity:SetContextThink( "TempleGuardianThink", TempleGuardianThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function TempleGuardianThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if thisEntity.Encounter == nil then + return 1 + end + + if GameRules:IsGamePaused() == true then + return 0.1 + end + + if thisEntity:IsChanneling() == true then + return 0.1 + end + + local hWintersCurseBuff = thisEntity:FindModifierByName( "modifier_aghsfort_winter_wyvern_winters_curse" ) + if hWintersCurseBuff and hWintersCurseBuff:GetAuraOwner() ~= nil then + if not thisEntity.bIsEnraged then + if HammerSmashAbility ~= nil and HammerSmashAbility:IsCooldownReady() then + return Smash( hWintersCurseBuff:GetAuraOwner() ) + end + else + if RageHammerSmashAbility ~= nil and RageHammerSmashAbility:IsFullyCastable() then + return RageSmash( hWintersCurseBuff:GetAuraOwner() ) + end + end + + return 0.1 + end + + if ( not thisEntity.bIsEnraged ) and ( thisEntity:GetHealthPercent() <= thisEntity.nRageHealthPct ) then + thisEntity.bIsEnraged = true + thisEntity:SwapAbilities( "temple_guardian_hammer_smash", "temple_guardian_rage_hammer_smash", false, true ) + --printf( "thisEntity.bIsEnraged: %s", tostring( thisEntity.bIsEnraged ) ) + end + + local hCreatures = Entities:FindAllByClassnameWithin( "npc_dota_creature", thisEntity:GetAbsOrigin(), 2000 ) + local hGuardians = {} + for _, hCreature in pairs( hCreatures ) do + if ( hCreature:GetUnitName() == "npc_dota_creature_temple_guardian" ) and hCreature:IsAlive() then + table.insert( hGuardians, hCreature ) + end + end + + if #hGuardians == 1 and ( not thisEntity.bBrotherDied ) then + thisEntity.bBrotherDied = true + thisEntity.fTimeBrotherDied = GameRules:GetGameTime() + thisEntity.bIsEnraged = true + end + + if WrathAbility ~= nil and WrathAbility:IsCooldownReady() and #hGuardians == 1 and thisEntity:GetHealthPercent() <= 100 then + local fTimeBeforeWrath = 3 + if thisEntity.fTimeBrotherDied and ( GameRules:GetGameTime() > ( thisEntity.fTimeBrotherDied + fTimeBeforeWrath ) ) then + return Wrath() + end + end + + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity:GetAcquisitionRange(), DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return 0.1 + end + + if HammerThrowAbility ~= nil and HammerThrowAbility:IsCooldownReady() and thisEntity:GetHealthPercent() < 90 then + local hFarthestEnemy = hEnemies[ #hEnemies ] + if hFarthestEnemy ~= nil then + local flDist = (hFarthestEnemy:GetOrigin() - thisEntity:GetOrigin()):Length2D() + if flDist > 300 then + return Throw( hFarthestEnemy ) + end + end + end + + for _, hGuardian in pairs( hGuardians ) do + if hGuardian ~= nil and hGuardian:IsAlive() and ( hGuardian ~= thisEntity or #hGuardians == 1 ) and ( hGuardian:GetHealthPercent() < 80 ) and PurificationAbility ~= nil and PurificationAbility:IsFullyCastable() and #hEnemies >= 1 then + return Purification( hGuardian ) + end + end + + if not thisEntity.bIsEnraged then + if HammerSmashAbility ~= nil and HammerSmashAbility:IsCooldownReady() then + local hNearestEnemy = hEnemies[ 1 ] + return Smash( hNearestEnemy ) + end + else + if RageHammerSmashAbility ~= nil and RageHammerSmashAbility:IsFullyCastable() then + local hNearestEnemy = hEnemies[ 1 ] + return RageSmash( hNearestEnemy ) + end + end + + return 0.1 +end + +-------------------------------------------------------------------------------- + +function Wrath() + --print( "temple_guardian - Wrath" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = WrathAbility:entindex(), + Queue = false, + }) + + local fReturnTime = WrathAbility:GetCastPoint() + WrathAbility:GetChannelTime() + 0.5 + --printf( "Wrath - return in %.2f", fReturnTime ) + return fReturnTime + + --return 8 +end + +-------------------------------------------------------------------------------- + +function Throw( enemy ) + --print( "temple_guardian - Throw" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = HammerThrowAbility:entindex(), + Position = enemy:GetOrigin(), + Queue = false, + }) + + local fReturnTime = HammerThrowAbility:GetCastPoint() + 1.8 + --printf( "Throw - return in %.2f", fReturnTime ) + return fReturnTime + + --return 3 +end + +-------------------------------------------------------------------------------- + +function Purification( friendly ) + --print( "temple_guardian - Purification" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + AbilityIndex = PurificationAbility:entindex(), + TargetIndex = friendly:entindex(), + Queue = false, + }) + + local fReturnTime = PurificationAbility:GetCastPoint() + 0.4 + --printf( "Purification - return in %.2f", fReturnTime ) + return fReturnTime + + --return 1.3 +end + +-------------------------------------------------------------------------------- + +function Smash( enemy ) + --printf( "temple_guardian - Smash" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = HammerSmashAbility:entindex(), + Position = enemy:GetOrigin(), + Queue = false, + }) + + local fReturnTime = HammerSmashAbility:GetCastPoint() + 0.4 + --printf( "Smash - return in %.2f", fReturnTime ) + return fReturnTime + + --return 1.4 +end + +-------------------------------------------------------------------------------- + +function RageSmash( enemy ) + --printf( "temple_guardian - RageSmash" ) + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = RageHammerSmashAbility:entindex(), + Position = enemy:GetOrigin(), + Queue = false, + }) + + local fReturnTime = RageHammerSmashAbility:GetCastPoint() + 0.4 + --printf( "RageSmash - return in %.2f", fReturnTime ) + return fReturnTime + + --return 1.1 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/tidehunter.lua b/aghanim_singleplayer/scripts/vscripts/ai/tidehunter.lua new file mode 100755 index 0000000..6ac6dc1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/tidehunter.lua @@ -0,0 +1,95 @@ +--[[ Tidehunter AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorAnchorSmash } ) +end + +function AIThink() -- For some reason AddThinkToEnt doesn't accept member functions + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 1500 ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorAnchorSmash = {} + +function BehaviorAnchorSmash:Evaluate() + --print( "BehaviorAnchorSmash:Evaluate()" ) + local desire = 0 + + self.anchorSmashAbility = thisEntity:FindAbilityByName( "tidehunter_anchor_smash" ) + if self.anchorSmashAbility and self.anchorSmashAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 350, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 1 ) then + desire = #enemies + 1 + end + end + + return desire +end + +function BehaviorAnchorSmash:Begin() + --print( "BehaviorAnchorSmash:Begin()" ) + + if self.anchorSmashAbility and self.anchorSmashAbility:IsFullyCastable() then + --print( "Casting Anchor Smash" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.anchorSmashAbility:entindex() + } + return order + end + + return nil +end + +BehaviorAnchorSmash.Continue = BehaviorAnchorSmash.Begin + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorAnchorSmash } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/tidehunter_miniboss.lua b/aghanim_singleplayer/scripts/vscripts/ai/tidehunter_miniboss.lua new file mode 100755 index 0000000..17d65e0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/tidehunter_miniboss.lua @@ -0,0 +1,193 @@ +--[[ Tidehunter Miniboss AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorGush, BehaviorAnchorSmash } ) +end + +function AIThink() -- For some reason AddThinkToEnt doesn't accept member functions + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 1500 ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorGush = {} + +function BehaviorGush:Evaluate() + --print( "BehaviorGush:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.gushAbility = thisEntity:FindAbilityByName( "creature_tidehunter_gush" ) + if self.gushAbility and self.gushAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 600, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + for _,hUnit in pairs( enemies ) do + if hUnit ~= nil and hUnit:IsAlive() then + local hGushModifier = hUnit:FindModifierByName( "modifier_tidehunter_gush" ) + if hGushModifier ~= nil then + --print("Enemy is already gushed") + desire = 0 + else + desire = #enemies + 1 + end + end + end + end + end + + return desire +end + +function BehaviorGush:Begin() + --print( "BehaviorGush:Begin()" ) + if self.gushAbility and self.gushAbility:IsFullyCastable() then + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #hEnemies == 0 then + return nil + end + local hTarget = hEnemies[#hEnemies] + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = hTarget:entindex(), + AbilityIndex = self.gushAbility:entindex(), + Queue = false, + } + return order + end + + return nil +end + +BehaviorGush.Continue = BehaviorGush.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorAnchorSmash = {} + +function BehaviorAnchorSmash:Evaluate() + --print( "BehaviorAnchorSmash:Evaluate()" ) + local desire = 0 + + self.anchorSmashAbility = thisEntity:FindAbilityByName( "tidehunter_anchor_smash" ) + if self.anchorSmashAbility and self.anchorSmashAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 350, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + end + + return desire +end + +function BehaviorAnchorSmash:Begin() + --print( "BehaviorAnchorSmash:Begin()" ) + + if self.anchorSmashAbility and self.anchorSmashAbility:IsFullyCastable() then + --print( "Casting Anchor Smash" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.anchorSmashAbility:entindex() + } + return order + end + + return nil +end + +BehaviorAnchorSmash.Continue = BehaviorAnchorSmash.Begin + +-------------------------------------------------------------------------------------------------------- +--[[ Ravage now placed in passive modifier +BehaviorRavage = {} + +function BehaviorRavage:Evaluate() + --print( "BehaviorRavage:Evaluate()" ) + local desire = 0 + + self.ravageAbility = thisEntity:FindAbilityByName( "tidehunter_ravage" ) + if self.ravageAbility and self.ravageAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 1000, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( thisEntity:GetHealthPercent() < 75 ) then + if ( #enemies > 1 ) then + desire = #enemies + 1 + end + end + end + + return desire +end + +function BehaviorRavage:Begin() + --print( "BehaviorRavage:Begin()" ) + + if self.ravageAbility and self.ravageAbility:IsFullyCastable() then + --print( "Casting Ravage" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.ravageAbility:entindex() + } + return order + end + + return nil +end + +BehaviorRavage.Continue = BehaviorRavage.Begin +]] +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorGush, BehaviorAnchorSmash } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/tornado_harpy_ai.lua b/aghanim_singleplayer/scripts/vscripts/ai/tornado_harpy_ai.lua new file mode 100755 index 0000000..0f6b70a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/tornado_harpy_ai.lua @@ -0,0 +1,276 @@ +require( "ai/ai_core" ) + + +function Precache( context ) + + PrecacheResource( "particle", "particles/neutral_fx/harpy_chain_lightning_head.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_dark_seer/dark_seer_surge.vpcf", context ) + PrecacheResource( "particle", "particles/neutral_fx/harpy_chain_lightning.vpcf", context ) + +end + + + + +function Spawn( entityKeyValues ) + + thisEntity.hSurgeAbility = thisEntity:FindAbilityByName( "tornado_harpy_intrinsic" ) + thisEntity.PreviousHealthPct = thisEntity:GetHealthPercent() + thisEntity.PreviousHealthPctGameTime = GameRules:GetGameTime() + + thisEntity:SetContextThink( "TornadoHarpyThink", TornadoHarpyThink, 0.5 ) +end + +-------------------------------------------------------------------------------- + +function TornadoHarpyThink() + + if not IsServer() then + return + end + + if ( not thisEntity:IsAlive() ) then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + --check our health pct every 4 seconds + if GameRules:GetGameTime() > thisEntity.PreviousHealthPctGameTime + 4 then + thisEntity.PreviousHealthPctGameTime = GameRules:GetGameTime() + thisEntity.PreviousHealthPct = thisEntity:GetHealthPercent() + end + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 5000, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + + if #hEnemies > 0 then + for i = 1, #hEnemies do + thisEntity.avoidTarget = hEnemies[i] + if thisEntity.avoidTarget ~= nil then + if thisEntity:GetHealthPercent() < thisEntity.PreviousHealthPct then + return Retreat(thisEntity.avoidTarget ) + else + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = thisEntity.avoidTarget:entindex(), + Queue = false + }) + end + break + end + end + end + + return 0.5 +end + + + +-------------------------------------------------------------------------------- + +function Retreat(unit) + + local vAwayFromEnemy = thisEntity:GetOrigin() - unit:GetOrigin() + vAwayFromEnemy = vAwayFromEnemy:Normalized() + local vMoveToPos = thisEntity:GetOrigin() + vAwayFromEnemy * thisEntity:GetIdealSpeed()*4 + + -- if away from enemy is an unpathable area, find a new direction to run to + local nAttempts = 0 + while ( ( not GridNav:CanFindPath( thisEntity:GetOrigin(), vMoveToPos ) ) and ( nAttempts < 5 ) ) do + vMoveToPos = thisEntity:GetOrigin() + RandomVector( thisEntity:GetIdealSpeed() * 4 ) + nAttempts = nAttempts + 1 + end + + thisEntity.fTimeOfLastRetreat = GameRules:GetGameTime() + + thisEntity:AddNewModifier(thisEntity, thisEntity.hSurgeAbility, "modifier_tornado_harpy_surge", {duration = 2.0}) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = vMoveToPos, + }) + + return 2.5 +end + +--[[ + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() +-- print( "BehaviorNone:Begin()" ) + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, thisEntity:GetDayTimeVisionRange() ) + + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + for i=1,6 do + local vLoc = FindPathablePositionNearby(hTarget:GetAbsOrigin(), 650, 650 ) +--and thisEntity:IsMoving() == false + if GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vLoc ) then + --orders = + --{ + -- UnitIndex = thisEntity:entindex(), + -- OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + -- Position = vLoc, + -- Queue = true, + --} + break + end + end + elseif thisEntity.lastTargetPosition ~= nil then + for i=1,6 do + local vLoc = FindPathablePositionNearby(thisEntity.lastTargetPosition, 650, 650 ) + + if GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vLoc ) then + --orders = + --{ + -- UnitIndex = thisEntity:entindex(), + -- OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + -- Position = vLoc + --} + break + end + end + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorAttack = {} + +function BehaviorAttack:Evaluate() + + local desire = 6 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.chainLightningAbility = thisEntity:FindAbilityByName( "harpy_storm_chain_lightning" ) + + if self.chainLightningAbility and self.chainLightningAbility:IsFullyCastable() then + + self.target = AICore:ClosestEnemyHeroInRange( thisEntity, thisEntity:GetDayTimeVisionRange() ) + if self.target ~= nil and self.target:IsAlive() then + desire = 6 + end + end + + return desire +end + +function BehaviorAttack:Begin() +-- print( "BehaviorAttack:Begin()" ) + + --if self.chainLightningAbility and self.chainLightningAbility:IsFullyCastable() then + if self.target and self.target:IsAlive() then + --print( "Casting Chain Lightning" ) + local targetPoint = self.target:GetAbsOrigin() + RandomVector( 100 ) + thisEntity.lastTargetPosition = self.target:GetAbsOrigin() + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + --AbilityIndex = self.chainLightningAbility:entindex(), + TargetIndex = self.target:entindex(), + Queue = false + }) + end + --end + + return nil +end + +BehaviorAttack.Continue = BehaviorAttack.Begin + + +-------------------------------------------------------------------------------------------------------- + +BehaviorAvoid = {} + +function BehaviorAvoid:Evaluate() + + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + --don't even think about running if you can damage! + if self.chainLightningAbility and self.chainLightningAbility:IsFullyCastable() then + return desire + end + + --check our health pct every 5 seconds + if GameRules:GetGameTime() > thisEntity.PreviousHealthPctGameTime + 5 then + printf("reseting healthpct") + thisEntity.PreviousHealthPctGameTime = GameRules:GetGameTime() + thisEntity.PreviousHealthPct = thisEntity:GetHealthPercent() + end + + self.avoidTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 650 ) + if self.avoidTarget ~= nil then + desire = 4 + end + + if thisEntity:GetHealthPercent() < thisEntity.PreviousHealthPct then + printf("I'm hurt") + desire = 8 + end + + return desire +end + +function BehaviorAvoid:Begin() + print( "BehaviorAvoid:Begin()" ) + + for i=1,6 do + self.vEscapeLoc = FindPathablePositionNearby(thisEntity:GetAbsOrigin(), 350, 350 ) + + if GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( self.vEscapeLoc ) and ( self.vEscapeLoc - self.avoidTarget:GetAbsOrigin() ):Length2D() > 650 then + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.vEscapeLoc + }) + printf("function BehaviorAvoid: Executing order()") + break + end + end + return nil +end + + +function BehaviorAvoid:Think(dt) + + -- keep moving towards our escape point + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.vEscapeLoc + }) + return nil +end + + +BehaviorAvoid.Continue = BehaviorAvoid.Begin ]]-- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/ai/troll_warlord_melee.lua b/aghanim_singleplayer/scripts/vscripts/ai/troll_warlord_melee.lua new file mode 100755 index 0000000..d2bf877 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/troll_warlord_melee.lua @@ -0,0 +1,182 @@ +--[[ Troll Warlord Melee AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_troll_warlord_berserkers_rage", {} ) + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorWhirlingAxes, BehaviorBattleTrance, BehaviorBKB } ) +end + +function AIThink() -- For some reason AddThinkToEnt doesn't accept member functions + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 1000 ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorWhirlingAxes = {} + +function BehaviorWhirlingAxes:Evaluate() + --print( "BehaviorWhirlingAxes:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.whirlingAxesAbility = thisEntity:FindAbilityByName( "troll_warlord_whirling_axes_melee" ) + if self.whirlingAxesAbility and self.whirlingAxesAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 450, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + end + + return desire +end + +function BehaviorWhirlingAxes:Begin() + --print( "BehaviorWhirlingAxes:Begin()" ) + if self.whirlingAxesAbility and self.whirlingAxesAbility:IsFullyCastable() then + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.whirlingAxesAbility:entindex(), + } + return order + end + + return nil +end + +BehaviorWhirlingAxes.Continue = BehaviorWhirlingAxes.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorBattleTrance = {} + +function BehaviorBattleTrance:Evaluate() + --print( "BehaviorBattleTrance:Evaluate()" ) + local desire = 0 + + self.battleTranceAbility = thisEntity:FindAbilityByName( "troll_warlord_battle_trance" ) + if self.battleTranceAbility and self.battleTranceAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 300, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( thisEntity:GetHealthPercent() < 30 ) then + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + end + end + + return desire +end + +function BehaviorBattleTrance:Begin() + --print( "BehaviorBattleTrance:Begin()" ) + if self.battleTranceAbility and self.battleTranceAbility:IsFullyCastable() then + --print( "Casting Battle Trance" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.battleTranceAbility:entindex(), + } + return order + end + + return nil +end + +BehaviorBattleTrance.Continue = BehaviorBattleTrance.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorBKB = {} + +function BehaviorBKB:Evaluate() + --print( "BehaviorBKB:Evaluate()" ) + local desire = 0 + for i = 0, DOTA_ITEM_MAX - 1 do + local item = thisEntity:GetItemInSlot( i ) + if item and item:GetAbilityName() == "item_creature_black_king_bar" then + self.blackKingBarAbility = item + end + end + if self.blackKingBarAbility and self.blackKingBarAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 300, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( thisEntity:GetHealthPercent() < 50 ) then + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + end + end + + + return desire +end + +function BehaviorBKB:Begin() + --print( "BehaviorBKB:Begin()" ) + if self.blackKingBarAbility and self.blackKingBarAbility:IsFullyCastable() then + --print( "Casting Primal Roar" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.blackKingBarAbility:entindex(), + } + return order + end + + return nil +end + +BehaviorBKB.Continue = BehaviorBKB.Begin + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorWhirlingAxes, BehaviorBattleTrance, BehaviorBKB } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/troll_warlord_ranged.lua b/aghanim_singleplayer/scripts/vscripts/ai/troll_warlord_ranged.lua new file mode 100755 index 0000000..55d0978 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/troll_warlord_ranged.lua @@ -0,0 +1,189 @@ +--[[ Troll Warlord Ranged AI ]] + +require( "ai/ai_core" ) + +function Spawn( entityKeyValues ) + thisEntity:SetContextThink( "AIThink", AIThink, 0.25 ) + behaviorSystem = AICore:CreateBehaviorSystem( thisEntity, { BehaviorNone, BehaviorWhirlingAxes, BehaviorBattleTrance, BehaviorBKB } ) +end + +function AIThink() -- For some reason AddThinkToEnt doesn't accept member functions + return behaviorSystem:Think( ) +end + +-------------------------------------------------------------------------------------------------------- + +BehaviorNone = {} + +function BehaviorNone:Evaluate() + return 1 -- must return a value > 0, so we have a default +end + +function BehaviorNone:Begin() + + local orders = nil + local hTarget = AICore:ClosestEnemyHeroInRange( thisEntity, 1000 ) + if hTarget ~= nil then + thisEntity.lastTargetPosition = hTarget:GetAbsOrigin() + hTarget:MakeVisibleDueToAttack( DOTA_TEAM_BADGUYS, 100 ) + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_TARGET, + TargetIndex = hTarget:entindex() + } + elseif thisEntity.lastTargetPosition ~= nil then + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = thisEntity.lastTargetPosition + } + else + orders = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_STOP + } + end + + return orders +end + +BehaviorNone.Continue = BehaviorNone.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorWhirlingAxes = {} + +function BehaviorWhirlingAxes:Evaluate() + --print( "BehaviorWhirlingAxes:Evaluate()" ) + local desire = 0 + + -- let's not choose this twice in a row + if behaviorSystem.currentBehavior == self then + return desire + end + + self.whirlingAxesAbility = thisEntity:FindAbilityByName( "troll_warlord_whirling_axes_ranged" ) + if self.whirlingAxesAbility and self.whirlingAxesAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + end + + return desire +end + +function BehaviorWhirlingAxes:Begin() + --print( "BehaviorWhirlingAxes:Begin()" ) + if self.whirlingAxesAbility and self.whirlingAxesAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 700, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + if #enemies == 0 then + return nil + end + local target = enemies[#enemies] + local targetPoint = target:GetOrigin() + RandomVector( 100 ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + TargetIndex = target:entindex(), + AbilityIndex = self.whirlingAxesAbility:entindex(), + Queue = false, + } + return order + end + + return nil +end + +BehaviorWhirlingAxes.Continue = BehaviorWhirlingAxes.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorBattleTrance = {} + +function BehaviorBattleTrance:Evaluate() + --print( "BehaviorBattleTrance:Evaluate()" ) + local desire = 0 + + self.battleTranceAbility = thisEntity:FindAbilityByName( "troll_warlord_battle_trance" ) + if self.battleTranceAbility and self.battleTranceAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 300, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( thisEntity:GetHealthPercent() < 30 ) then + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + end + end + + return desire +end + +function BehaviorBattleTrance:Begin() + --print( "BehaviorBattleTrance:Begin()" ) + if self.battleTranceAbility and self.battleTranceAbility:IsFullyCastable() then + --print( "Casting Battle Trance" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.battleTranceAbility:entindex(), + } + return order + end + + return nil +end + +BehaviorBattleTrance.Continue = BehaviorBattleTrance.Begin + +-------------------------------------------------------------------------------------------------------- + +BehaviorBKB = {} + +function BehaviorBKB:Evaluate() + --print( "BehaviorBKB:Evaluate()" ) + local desire = 0 + for i = 0, DOTA_ITEM_MAX - 1 do + local item = thisEntity:GetItemInSlot( i ) + if item and item:GetAbilityName() == "item_creature_black_king_bar" then + self.blackKingBarAbility = item + end + end + if self.blackKingBarAbility and self.blackKingBarAbility:IsFullyCastable() then + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, thisEntity:GetOrigin(), nil, 300, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NO_INVIS, 0, false ) + if ( thisEntity:GetHealthPercent() < 50 ) then + if ( #enemies >= 0 ) then + desire = #enemies + 1 + end + end + end + + + return desire +end + +function BehaviorBKB:Begin() + --print( "BehaviorBKB:Begin()" ) + if self.blackKingBarAbility and self.blackKingBarAbility:IsFullyCastable() then + --print( "Casting Primal Roar" ) + local order = + { + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self.blackKingBarAbility:entindex(), + } + return order + end + + return nil +end + +BehaviorBKB.Continue = BehaviorBKB.Begin + +-------------------------------------------------------------------------------------------------------- + +AICore.possibleBehaviors = { BehaviorNone, BehaviorWhirlingAxes, BehaviorBattleTrance, BehaviorBKB } diff --git a/aghanim_singleplayer/scripts/vscripts/ai/underlord.lua b/aghanim_singleplayer/scripts/vscripts/ai/underlord.lua new file mode 100755 index 0000000..3426b0b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/underlord.lua @@ -0,0 +1,118 @@ + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hDamageAbility = thisEntity:FindAbilityByName( "aghsfort_underlord_firestorm" ) + thisEntity.hChannelledAbility = thisEntity:FindAbilityByName( "underlord_channelled_buff" ) + + thisEntity.fEnemySearchRange = 700 + + thisEntity:SetContextThink( "UnderlordThink", UnderlordThink, 1 ) +end + +-------------------------------------------------------------------------------- + +function UnderlordThink() + if thisEntity == nil or thisEntity:IsNull() or thisEntity:IsAlive() == false then + return -1 + end + + if GameRules:IsGamePaused() then + return 1 + end + + if thisEntity.hChannelledAbility ~= nil and thisEntity.hChannelledAbility:IsChanneling() then + return 0.5 + end + + local enemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, thisEntity.fEnemySearchRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + + local bIgniteReady = ( #enemies > 0 and thisEntity.hDamageAbility ~= nil and thisEntity.hDamageAbility:IsFullyCastable() ) + + if thisEntity.hChannelledAbility ~= nil and thisEntity.hChannelledAbility:IsFullyCastable() then + local friendlies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 1500, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _,friendly in pairs ( friendlies ) do + if friendly ~= nil then + if ( friendly:GetUnitName() == "npc_dota_creature_dragon_knight" ) then + local fDist = ( friendly:GetOrigin() - thisEntity:GetOrigin() ):Length2D() + local fCastRange = thisEntity.hChannelledAbility:GetCastRange( thisEntity:GetOrigin(), nil ) + --print( string.format( "fDist == %d, fCastRange == %d", fDist, fCastRange ) ) + if ( fDist <= fCastRange ) and ( ( #enemies > 0 ) or ( friendly:GetAggroTarget() ) ) then + return CastChannelledBuff( friendly ) + elseif ( fDist > 400 ) and ( fDist < 900 ) then + if bIgniteReady == false then + return Approach( friendly ) + end + end + end + end + end + end + + if bIgniteReady then + return IgniteArea( enemies[ RandomInt( 1, #enemies ) ] ) + end + + local fFuzz = RandomFloat( -0.1, 0.1 ) -- Adds some timing separation + + return 0.5 + fFuzz +end + +-------------------------------------------------------------------------------- + +function Approach( hUnit ) + --printf( "\"%s\" is approaching unit named \"%s\"", thisEntity:GetUnitName(), hUnit:GetUnitName() ) + + local vToUnit = hUnit:GetOrigin() - thisEntity:GetOrigin() + vToUnit = vToUnit:Normalized() + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = thisEntity:GetOrigin() + vToUnit * thisEntity:GetIdealSpeed() + }) + + return 1 +end + +-------------------------------------------------------------------------------- + +function CastChannelledBuff( hUnit ) + --print( "Casting CastChannelledBuff on " .. hUnit:GetUnitName() ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + AbilityIndex = thisEntity.hChannelledAbility:entindex(), + TargetIndex = hUnit:entindex(), + Queue = false, + }) + + return 1 +end + +-------------------------------------------------------------------------------- + +function IgniteArea( hEnemy ) + --print( "Casting ignite on " .. hEnemy:GetUnitName() ) + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = thisEntity.hDamageAbility:entindex(), + Position = hEnemy:GetOrigin(), + Queue = false, + }) + + return 0.55 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/ai/walrus_pudge_ai.lua b/aghanim_singleplayer/scripts/vscripts/ai/walrus_pudge_ai.lua new file mode 100755 index 0000000..9ee3eb6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/walrus_pudge_ai.lua @@ -0,0 +1,95 @@ + + + +function Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_pudge/pudge_meathook.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_pudge/pudge_meathook_impact.vpcf", context ) +end + + + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + + HookAbility = thisEntity:FindAbilityByName( "aghsfort_walrus_pudge_harpoon" ) + flLastOrder = GameRules:GetGameTime() + thisEntity:SetContextThink( "WalrusPudgeThink", WalrusPudgeThink, 1 ) +end + + + + +function WalrusPudgeThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + if GameRules:IsGamePaused() == true then + return 1 + end + + if not thisEntity:GetAggroTarget() then + if (GameRules:GetGameTime() - flLastOrder) > (4 - RandomFloat(0 ,1 )) then + flLastOrder = GameRules:GetGameTime() + return DoMove() + end + end + + + if HookAbility and HookAbility:IsFullyCastable() then + local fHookSearchRadius = HookAbility:GetCastRange() + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), thisEntity, fHookSearchRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NONE, FIND_FARTHEST, false ) + if #hEnemies > 0 then + local hFarthestEnemy = hEnemies[ 1 ] + return ThrowHook( hFarthestEnemy ) + end + end + + return 0.5 +end + + +function ThrowHook( enemy ) + if ( not thisEntity:HasModifier( "modifier_provide_vision" ) ) then + --print( "If player can't see me, provide brief vision to his team as I start my hook" ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 1.5 } ) + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = HookAbility:entindex(), + Position = enemy:GetOrigin(), + Queue = false, + }) + + return 0.2 + +end + + +function DoMove() + if IsServer() then + + for i=1,4 do + local vLoc = FindPathablePositionNearby(thisEntity:GetAbsOrigin(), 200, 800 ) + + if GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vLoc ) then + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_ATTACK_MOVE, + Position = vLoc + }) + break + end + end + end + return 0.5 +end diff --git a/aghanim_singleplayer/scripts/vscripts/ai/wave_blaster_ai.lua b/aghanim_singleplayer/scripts/vscripts/ai/wave_blaster_ai.lua new file mode 100755 index 0000000..1a7d57d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ai/wave_blaster_ai.lua @@ -0,0 +1,111 @@ + + +function Precache( context ) + PrecacheUnitByNameSync( "npc_aghsfort_creature_wave_blaster_ghost", context, -1 ) + PrecacheResource( "particle", "particles/econ/items/ancient_apparition/ancient_apparation_ti8/ancient_ice_vortex_ti8.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ancient_apparition/ancient_apparition_ice_blast_explode.vpcf", context ) +end + + +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + + thisEntity.hWaveAbility = thisEntity:FindAbilityByName( "aghsfort_wave_blast" ) + thisEntity.hLeapAbility = thisEntity:FindAbilityByName( "aghsfort_waveblaster_leap" ) + thisEntity.hSummonGhostAbility = thisEntity:FindAbilityByName( "aghsfort_waveblaster_summon_ghost" ) + thisEntity:SetContextThink( "WaveBlasterThink", WaveBlasterThink, 1 ) + +end + +function WaveBlasterThink() + if ( not thisEntity:IsAlive() ) then + return -1 + end + --print ("thinking") + + if GameRules:IsGamePaused() == true then + return 1 + end + + + if thisEntity.hWaveAbility and thisEntity.hWaveAbility:IsFullyCastable() then + local fWaveSearchRadius = thisEntity.hWaveAbility:GetCastRange() + local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), thisEntity, fWaveSearchRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NONE, FIND_FARTHEST, false ) + if #hEnemies > 0 then + local hFarthestEnemy = hEnemies[ 1 ] + return WaveBlast( hFarthestEnemy ) + end + end + + if thisEntity.hLeapAbility and thisEntity.hLeapAbility:IsFullyCastable() then + local fSearchRadius = 750 + local hEnemiesToAvoid = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), thisEntity, fSearchRadius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NONE, FIND_CLOSEST, false ) + if #hEnemiesToAvoid > 0 then + return CastLeap() + end + end + + + return 0.5 +end + +function WaveBlast( enemy ) + if enemy == nil then + return + end + + if ( not thisEntity:HasModifier( "modifier_provide_vision" ) ) then + --print( "If player can't see me, provide brief vision to his team as I start my Smash" ) + thisEntity:AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = 1.5 } ) + end + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = thisEntity.hWaveAbility:entindex(), + Position = enemy:GetOrigin(), + Queue = false, + }) + + return 0.2 +end + +-------------------------------------------------------------------------------- + +function CastLeap() + if IsServer() then + local bLeapSuccess = false + for i=1,6 do + local vLoc = FindPathablePositionNearby(thisEntity:GetAbsOrigin(), 650, 1550 ) + + if GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vLoc ) then + + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_POSITION, + AbilityIndex = thisEntity.hLeapAbility:entindex(), + Position = vLoc, + Queue = false, + }) + bLeapSuccess = true + break + end + end + + if bLeapSuccess == true and thisEntity.hSummonGhostAbility and thisEntity.hSummonGhostAbility:IsFullyCastable() then + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hSummonGhostAbility:entindex(), + Queue = false, + }) + end + end + return 3 +end diff --git a/aghanim_singleplayer/scripts/vscripts/ascension_levels.lua b/aghanim_singleplayer/scripts/vscripts/ascension_levels.lua new file mode 100755 index 0000000..8ff9e52 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/ascension_levels.lua @@ -0,0 +1,233 @@ + +_G.EXTRA_ABILITIES_PER_ASCENSION_LEVEL = +{ + 0, 1, 2, 3, 4 +} + +_G.ELITE_ABILITIES_PER_ASCENSION_LEVEL = +{ + 2, 2, 2, 2, 2 +} + +-- Ascension ability type +_G.ASCENSION_ABILITY_CAPTAINS_ONLY = 0 +_G.ASCENSION_ABILITY_NON_CAPTAINS_ONLY = 1 +_G.ASCENSION_ABILITY_ALL_UNITS = 2 +_G.ASCENSION_ABILITY_GLOBAL = 3 + +-- Ascension cast behavior +_G.ASCENSION_CAST_WHEN_COOLDOWN_READY = 0 -- Default +_G.ASCENSION_CAST_ON_DEATH = 1 +_G.ASCENSION_CAST_ON_LOW_HEALTH = 2 +_G.ASCENSION_CAST_ON_TAKE_MAGIC_DAMAGE = 3 +_G.ASCENSION_CAST_ON_NEARBY_ENEMY = 4 + +-- Ascension tareting behavior [for targetted abilities] +_G.ASCENSION_TARGET_NO_TARGET = 0 +_G.ASCENSION_TARGET_RANDOM_PLAYER = 1 +_G.ASCENSION_TARGET_ATTACKER = 2 +_G.ASCENSION_TARGET_CLUMPED_PLAYER = 3 + +-- Uncomment + change ability names for debugging +--_G.ASCENSION_ABILITIES_FORCE_LIST = +--{ +-- "ascension_extra_fast", +--} + +_G.ASCENSION_ABILITIES = +{ +-- example_ability_name = +-- { +-- nType = , +-- nCastBehavior = , ASCENSION_CAST_WHEN_COOLDOWN_READY is used if unspecified +-- nTargetType = , -- For targeted abilities, ASCENSION_TARGET_NO_TARGET is used if unspecified +-- nMinAscensionLevel = 3, +-- nMaxAscensionLevel = 5, +-- nRestrictToAct = 1, -- Should this only appear in one act? Leave blank if not +-- szRequiredBoss = "", -- Only used if nRestrictToAct is set +-- flHealthPercent = 20, -- Only used for ASCENSION_CAST_ON_LOW_HEALTH, defaults to 25 if not set +-- bEliteOnly = true, -- Indicates if this is an elite only ability +-- vecBlacklistedEncounters = {}, -- List of encounter names to not use this ascension ability with +-- }, + + aghsfort_ascension_firefly = + { + nType = ASCENSION_ABILITY_CAPTAINS_ONLY, + bEliteOnly = true, + vecBlacklistedEncounters = + { + "encounter_enraged_wildwings", + } + }, + +--[[ + ascension_temple_guardian_wrath = + { + nType = ASCENSION_ABILITY_GLOBAL, + nRestrictToAct = 1, + szRequiredBoss = "npc_dota_creature_temple_guardian", + bEliteOnly = true, + }, + + ascension_timbersaw_chakram_dance = + { + nType = ASCENSION_ABILITY_GLOBAL, + nRestrictToAct = 1, + szRequiredBoss = "npc_dota_boss_timbersaw", + bEliteOnly = true, + }, +]]-- + ascension_plasma_field = + { + nType = ASCENSION_ABILITY_CAPTAINS_ONLY, + nCastBehavior = ASCENSION_CAST_ON_DEATH, + bEliteOnly = true, + vecBlacklistedEncounters = + { + "encounter_drow_ranger_miniboss", + "encounter_alchemist", + "encounter_fire_roshan", + "encounter_big_ogres", + } + }, + + ascension_bomb = + { + nType = ASCENSION_ABILITY_GLOBAL, + nTargetType = ASCENSION_TARGET_CLUMPED_PLAYER, + bEliteOnly = true, + nRange = 700, + vecBlacklistedEncounters = + { + "encounter_bombers", + "encounter_bomb_squad", + } + }, + + ascension_flicker = + { + nType = ASCENSION_ABILITY_CAPTAINS_ONLY, + nCastBehavior = ASCENSION_CAST_ON_NEARBY_ENEMY, + nRange = 500, + vecBlacklistedEncounters = + { + "encounter_dire_siege", + }, + }, + + + ascension_drunken = + { + nType = ASCENSION_ABILITY_CAPTAINS_ONLY, + nCastBehavior = ASCENSION_CAST_ON_NEARBY_ENEMY, + nRange = 500, + }, + + ascension_bulwark = + { + nType = ASCENSION_ABILITY_CAPTAINS_ONLY, + }, + + ascension_magic_resist = + { + nType = ASCENSION_ABILITY_ALL_UNITS, + }, + + --[[ + ascension_crit = + { + nType = ASCENSION_ABILITY_ALL_UNITS, + vecBlacklistedEncounters = + { + "encounter_zealot_scarabs", + } + }, + ]] + + ascension_extra_fast = + { + nType = ASCENSION_ABILITY_ALL_UNITS, + vecBlacklistedEncounters = + { + "encounter_mushroom_mines", + "encounter_brewmaster", + "encounter_drow_ranger_miniboss", + "encounter_gauntlet", + } + }, + + ascension_chilling_touch = + { + nType = ASCENSION_ABILITY_ALL_UNITS, + }, + + ascension_vampiric = + { + nType = ASCENSION_ABILITY_CAPTAINS_ONLY, + nCastBehavior = ASCENSION_CAST_ON_LOW_HEALTH, + flHealthPercent = 25, + }, + + ascension_armor = + { + nType = ASCENSION_ABILITY_ALL_UNITS, + }, + + ascension_damage = + { + nType = ASCENSION_ABILITY_ALL_UNITS, + vecBlacklistedEncounters = + { + "encounter_mushroom_mines", + } + }, + + ascension_attack_speed = + { + nType = ASCENSION_ABILITY_ALL_UNITS, + nCastBehavior = ASCENSION_CAST_ON_LOW_HEALTH, + flHealthPercent = 50, + vecBlacklistedEncounters = + { + "encounter_big_ogres", + "encounter_mushroom_mines", + } + }, + + ascension_magic_immunity = + { + nType = ASCENSION_ABILITY_CAPTAINS_ONLY, + nCastBehavior = ASCENSION_CAST_ON_TAKE_MAGIC_DAMAGE, + }, + + ascension_armor_sapping = + { + nType = ASCENSION_ABILITY_ALL_UNITS, + nCastBehavior = ASCENSION_CAST_ON_DEATH, + nTargetType = ASCENSION_TARGET_ATTACKER, + vecBlacklistedEncounters = + { + "encounter_alchemist", + "encounter_fire_roshan", + } + }, + + ascension_heal_suppression = + { + bEliteOnly = true, + nType = ASCENSION_ABILITY_CAPTAINS_ONLY, + }, + + aghsfort_ascension_silence = + { + bEliteOnly = true, + nType = ASCENSION_ABILITY_CAPTAINS_ONLY, + nCastBehavior = ASCENSION_CAST_ON_NEARBY_ENEMY, + nRange = 400, + }, + + aghsfort_ascension_magnetic_field = + { + nType = ASCENSION_ABILITY_CAPTAINS_ONLY, + }, +} \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/blessings.lua b/aghanim_singleplayer/scripts/vscripts/blessings.lua new file mode 100755 index 0000000..5e4e1f7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/blessings.lua @@ -0,0 +1,512 @@ +-- All blessing modifiers must be linked here +LinkLuaModifier( "modifier_blessing_bottle_upgrade", "modifiers/modifier_blessing_bottle_upgrade", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_armor", "modifiers/modifier_blessing_armor", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_attack_speed", "modifiers/modifier_blessing_attack_speed", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_evasion", "modifiers/modifier_blessing_evasion", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_mana_boost", "modifiers/modifier_blessing_mana_boost", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_health_boost", "modifiers/modifier_blessing_health_boost", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_magic_resist", "modifiers/modifier_blessing_magic_resist", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_magic_damage_bonus", "modifiers/modifier_blessing_magic_damage_bonus", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_damage_bonus", "modifiers/modifier_blessing_damage_bonus", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_movement_speed", "modifiers/modifier_blessing_movement_speed", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_damage_reflect", "modifiers/modifier_blessing_damage_reflect", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_spell_life_steal", "modifiers/modifier_blessing_spell_life_steal", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_life_steal", "modifiers/modifier_blessing_life_steal", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_potion_arcanist", "modifiers/modifier_blessing_potion_arcanist", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_potion_dragon", "modifiers/modifier_blessing_potion_dragon", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_potion_echo_slam", "modifiers/modifier_blessing_potion_echo_slam", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_potion_torrent", "modifiers/modifier_blessing_potion_torrent", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_potion_shadow_wave", "modifiers/modifier_blessing_potion_shadow_wave", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_potion_ravage", "modifiers/modifier_blessing_potion_ravage", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_potion_purification", "modifiers/modifier_blessing_potion_purification", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_respawn_time_reduction", "modifiers/modifier_blessing_respawn_time_reduction", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_respawn_invulnerability", "modifiers/modifier_blessing_respawn_invulnerability", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_death_detonation", "modifiers/modifier_blessing_death_detonation", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_strength", "modifiers/modifier_blessing_strength", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_agility", "modifiers/modifier_blessing_agility", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_intelligence", "modifiers/modifier_blessing_intelligence", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_potion_health", "modifiers/modifier_blessing_potion_health", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_potion_mana", "modifiers/modifier_blessing_potion_mana", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_restore_mana", "modifiers/modifier_blessing_restore_mana", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_book_strength", "modifiers/modifier_blessing_book_strength", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_book_agility", "modifiers/modifier_blessing_book_agility", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_book_intelligence", "modifiers/modifier_blessing_book_intelligence", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_blessing_refresher_shard", "modifiers/modifier_blessing_refresher_shard", LUA_MODIFIER_MOTION_NONE ) + +-- Uncomment + change blessing modifier names for debugging +_G.BLESSING_MODIFIERS_FORCE_LIST = +{ +-- modifier_blessing_bottle_upgrade = 1, -- 1 is the claim count +-- modifier_blessing_armor = 1, +-- modifier_blessing_attack_speed = 1, +-- modifier_blessing_evasion = 1, +-- modifier_blessing_mana_boost = 1, +-- modifier_blessing_health_boost = 1, +-- modifier_blessing_magic_resist = 1, +-- modifier_blessing_magic_damage_bonus = 1, +-- modifier_blessing_damage_bonus = 1, +-- modifier_blessing_movement_speed = 1, +-- modifier_blessing_spell_life_steal = 1, +-- modifier_blessing_life_steal = 1, +-- grant_blessing_bonus_life = 1, +-- grant_blessing_potion_starting_mango = 1, +-- modifier_blessing_potion_arcanist = 1, +-- modifier_blessing_potion_dragon = 1, +-- modifier_blessing_potion_echo_slam = 1, +-- modifier_blessing_potion_torrent = 1, +-- modifier_blessing_potion_shadow_wave = 1, +-- modifier_blessing_potion_ravage = 1, +-- modifier_blessing_potion_purification = 1, +-- modifier_blessing_respawn_time_reduction = 1, +-- modifier_blessing_potion_health = 1, +-- modifier_blessing_potion_mana = 1, +-- modifier_blessing_restore_mana = 1, +-- grant_blessing_gold_start_bonus = 1, +-- modifier_blessing_respawn_invulnerability = 1, +-- modifier_blessing_death_detonation = 1, +-- modifier_blessing_book_strength = 1, +-- modifier_blessing_book_agility = 1, +-- modifier_blessing_book_intelligence = 1, +-- modifier_blessing_intelligence = 1, +-- modifier_blessing_refresher_shard = 1, +} + +_G.BLESSING_MODIFIERS = +{ +-- example_blessing_modifier_name = +-- { +-- action_name = , +-- keys = +-- { +-- +-- } +-- }, +-- +-- This version allows you to specify different keys per action level +-- example_blessing_modifier_name = +-- { +-- action_name = , +-- keys = +-- { +-- { +-- +-- }, +-- { +-- +-- }, +-- } +-- }, + + grant_blessing_potion_starting_mango = + { + scoreboard_order = 1, + action_name = "blessing_potion_starting_mango", + blessing_type = BLESSING_TYPE_ITEM_GRANT, + keys = + { + items = + { + item_flask = 1, + item_enchanted_mango = 1, + } + } + }, + + modifier_blessing_bottle_upgrade = + { + scoreboard_order = 1, + action_name = "blessing_bottle_upgrade", + keys = + { + max_charges = 1, + }, + }, + + -- Str Tree + modifier_blessing_strength = + { + scoreboard_order = 102, + action_names = + { + "blessing_stat_str", + "blessing_stat_str_2", + "blessing_stat_str_3", + }, + keys = + { + { + str_bonus = 2 + }, + { + str_bonus = 5 + }, + { + str_bonus = 9 + }, + }, + }, + + modifier_blessing_book_strength = + { + scoreboard_order = 101, + action_name = "blessing_book_strength", + keys = + { + bonus_stat = 1 + }, + }, + + modifier_blessing_armor = + { + scoreboard_order = 206, + action_name = "blessing_armor_bonus", + keys = + { + bonus_armor = 2 + }, + }, + + modifier_blessing_potion_health = + { + scoreboard_order = 103, + action_name = "blessing_potion_health", + keys = + { + hp_restore_pct_bonus = 20 + }, + }, + + modifier_blessing_respawn_time_reduction = + { + scoreboard_order = 104, + action_name = "blessing_respawn_time_reduction", + keys = + { + respawn_time_reduction = 0.25 + }, + }, + + modifier_blessing_potion_echo_slam = + { + scoreboard_order = 205, + action_name = "blessing_potion_echo_slam", + keys = + { + echo_slam_echo_damage_percent = 40, + } + }, + + modifier_blessing_health_boost = + { + scoreboard_order = 100, + action_name = "blessing_health_boost", + keys = + { + bonus_health_per_level = 10 + }, + }, + + modifier_blessing_damage_reflect = + { + scoreboard_order = 112, + action_name = "blessing_damage_reflection", + keys = + { + damage_reflect = 0.04 + } + }, + + modifier_blessing_potion_torrent = + { + scoreboard_order = 110, + action_name = "blessing_potion_torrent", + keys = + { + torrent_damage_percent = 50, + } + }, + + modifier_blessing_refresher_shard = + { + scoreboard_order = 11, + action_name = "blessing_refresher_shard", + keys = + { + health_restore_percent = 50, + } + }, + + grant_blessing_bonus_life = + { + scoreboard_order = 312, + action_name = "blessing_bonus_life", + blessing_type = BLESSING_TYPE_LIFE_GRANT, + keys = + { + lives = 1, + } + }, + + -- Agi tree + modifier_blessing_agility = + { + scoreboard_order = 202, + action_names = + { + "blessing_stat_agi", + "blessing_stat_agi_2", + "blessing_stat_agi_3", + }, + keys = + { + { + agi_bonus = 2 + }, + { + agi_bonus = 5 + }, + { + agi_bonus = 9 + }, + }, + }, + + modifier_blessing_evasion = + { + scoreboard_order = 207, + action_name = "blessing_evasion", + keys = + { + bonus_evasion = 5 + }, + }, + + modifier_blessing_attack_speed = + { + scoreboard_order = 200, + action_name = "blessing_attack_speed", + keys = + { + bonus_attack_speed = 10 + }, + }, + + modifier_blessing_book_agility = + { + scoreboard_order = 201, + action_name = "blessing_book_agility", + keys = + { + bonus_stat = 1 + }, + }, + + grant_blessing_gold_start_bonus = + { + scoreboard_order = 203, + action_name = "blessing_gold_start_bonus", + blessing_type = BLESSING_TYPE_GOLD_GRANT, + keys = + { + gold_amount = 125, + } + }, + + modifier_blessing_potion_purification = + { + scoreboard_order = 107, + action_name = "blessing_potion_purification", + keys = + { + radius_percent = 100, + } + }, + + modifier_blessing_life_steal = + { + scoreboard_order = 109, + action_name = "blessing_life_steal", + keys = + { + life_steal_pct = 5 + }, + }, + + modifier_blessing_respawn_invulnerability = + { + scoreboard_order = 204, + action_name = "blessing_respawn_invulnerability", + keys = + { + respawn_invulnerability_time_bonus = 0.0, + min_move_speed = 550, + bonus_attack_speed = 50, + }, + }, + + modifier_blessing_potion_arcanist = + { + scoreboard_order = 304, + action_name = "blessing_potion_arcanist", + keys = + { + cooldown_reduction_percent = 50, + manacost_reduction_percent = 50, + }, + }, + + modifier_blessing_potion_dragon = + { + scoreboard_order = 211, + action_name = "blessing_potion_dragon", + keys = + { + bonus_attack_damage_percent = 25, + }, + }, + + modifier_blessing_movement_speed = + { + scoreboard_order = 210, + action_name = "blessing_movement_speed", + keys = + { + bonus_movement_speed = 8 + }, + }, + + modifier_blessing_damage_bonus = + { + scoreboard_order = 212, + action_name = "blessing_damage_bonus", + keys = + { + bonus_damage = 2 + }, + }, + + -- Int tree + modifier_blessing_intelligence = + { + scoreboard_order = 302, + action_names = + { + "blessing_stat_int", + "blessing_stat_int_2", + "blessing_stat_int_3", + }, + keys = + { + { + int_bonus = 2 + }, + { + int_bonus = 5 + }, + { + int_bonus = 9 + }, + }, + }, + + modifier_blessing_book_intelligence = + { + scoreboard_order = 303, + action_name = "blessing_book_intelligence", + keys = + { + bonus_stat = 1 + }, + }, + + modifier_blessing_mana_boost = + { + scoreboard_order = 300, + action_name = "blessing_mana_boost", + keys = + { + bonus_mana = 10 + }, + }, + + modifier_blessing_potion_mana = + { + scoreboard_order = 301, + action_name = "blessing_potion_mana", + keys = + { + mana_restore_pct_bonus = 20 + }, + }, + + modifier_blessing_spell_life_steal = + { + scoreboard_order = 311, + action_name = "blessing_spell_life_steal", + keys = + { + spell_life_steal = 5 + }, + }, + + modifier_blessing_potion_shadow_wave = + { + scoreboard_order = 106, + action_name = "blessing_potion_shadow_wave", + keys = + { + damage_percent = 50, + } + }, + + modifier_blessing_death_detonation = + { + scoreboard_order = 105, + action_name = "blessing_death_detonation", + keys = + { + detonation_damage_per_level = 100, + detonation_radius = 350, + }, + }, + + modifier_blessing_magic_resist = + { + scoreboard_order = 307, + action_name = "blessing_magic_resist", + keys = + { + bonus_magic_resist = 5 + }, + }, + + modifier_blessing_potion_ravage = + { + scoreboard_order = 308, + action_name = "blessing_potion_ravage", + keys = + { + duration_percent = 50, + } + }, + + modifier_blessing_restore_mana = + { + scoreboard_order = 305, + action_name = "blessing_restore_mana", + keys = + { + mana_on_kill = 6 + }, + }, + + modifier_blessing_magic_damage_bonus = + { + scoreboard_order = 309, + action_name = "blessing_magic_damage_bonus", + keys = + { + bonus_magic_damage = 6 + }, + }, +} \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/constants.lua b/aghanim_singleplayer/scripts/vscripts/constants.lua new file mode 100755 index 0000000..88582c2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/constants.lua @@ -0,0 +1,115 @@ + +-- General Game Mode Config +_G.AGHANIM_PLAYERS = 1 + +_G.AGHANIM_TIMED_RESPAWN_MODE = true +_G.AGHANIM_TIMED_RESPAWN_TIME = 5.0 + +_G.AGHANIM_STARTING_LIVES = 2 +_G.AGHANIM_MAX_LIVES = 4 + +_G.AGHANIM_STARTING_GOLD = 500 +_G.AGHANIM_STARTING_SALVES = 2 +_G.AGHANIM_STARTING_MANGOES = 2 +_G.AGHANIM_ENABLE_BOTTLE = true +_G.AGHANIM_ENCOUNTER_BOTTLE_CHARGES = 3 + +_G.LIFE_REVIVE_COST = 1 +_G.LIFE_BUYBACK_COST = 2 +_G.REVIVE_HEALTH_PCT = 100 +_G.REVIVE_MANA_PCT = 100 + +_G.GOLD_BAG_DROP_PCT = 33 +_G.HEALTH_POTION_DROP_PCT = 10 +_G.MANA_POTION_DROP_PCT = 10 +_G.HEAL_ON_ENCOUNTER_COMPLETE = true + +_G.NUM_VIABLE_ROOMS_FOR_DROPPED_ITEMS = 11 +_G.PCT_BASE_TWO_ITEM_DROP = 0 +_G.NUM_NEUTRAL_ITEMS_DROPPED = 40 +_G.PCT_BASE_NEUTRAL_ITEM_DROP = 16 +_G.NUM_CONSUMABLES_FROM_ROOM_REWARD = 2 + +_G.NUM_LIVES_FROM_BOSSES = 0 + +-- Audio +_G.VOICE_LAUGH_COOLDOWN = 20.0 +_G.VOICE_PERIODIC_TAUNT_COOLDOWN = 35.0 +_G.VOICE_LINE_COOLDOWN = 4.0 +_G.VOICE_VOLUME = 1.4 + +-- Atlas +_G.ROOM_TYPE_INVALID = 0 +_G.ROOM_TYPE_STARTING = 1 +_G.ROOM_TYPE_ENEMY = 2 +_G.ROOM_TYPE_TRAPS = 3 +_G.ROOM_TYPE_BOSS = 4 +_G.ROOM_TYPE_TRANSITIONAL = 5 +_G.ROOM_TYPE_BONUS = 6 + +_G.RoomTypeStrings = {} + +RoomTypeStrings[ ROOM_TYPE_ENEMY ]= "ROOM_TYPE_ENEMY" +RoomTypeStrings[ ROOM_TYPE_BOSS ] = "ROOM_TYPE_BOSS" +RoomTypeStrings[ ROOM_TYPE_STARTING ] = "ROOM_TYPE_STARTING" +RoomTypeStrings[ ROOM_TYPE_TRAPS ] = "ROOM_TYPE_TRAPS" +RoomTypeStrings[ ROOM_TYPE_TRANSITIONAL ] = "ROOM_TYPE_TRANSITIONAL" +RoomTypeStrings[ ROOM_TYPE_BONUS ] = "ROOM_TYPE_BONUS" + + +function GetStringForRoomType( nType ) + return _G.RoomTypeStrings[ nType ] +end + +-- Room Exit directions +_G.ROOM_EXIT_LEFT = 0 +_G.ROOM_EXIT_TOP = 1 +_G.ROOM_EXIT_RIGHT = 2 + +-- these are only used for UI purposes. +_G.ROOM_EXIT_BOTTOM = 3 +_G.ROOM_EXIT_INVALID = -1 + +function GetEntranceDirectionForExitType( nExitDirection ) + if nExitDirection == ROOM_EXIT_LEFT then + return ROOM_EXIT_RIGHT + end + if nExitDirection == ROOM_EXIT_TOP then + return ROOM_EXIT_BOTTOM + end + if nExitDirection == ROOM_EXIT_RIGHT then + return ROOM_EXIT_LEFT + end + + -- You can never exit from the bottom + return ROOM_EXIT_INVALID +end + +-- Amount of XP earned per hero per depth (if the encounter gives XP) + +-- setting this to a value greater than zero will level up every creature; increasing its max hp and attack damage +-- a value of 1.0 will increase HP by 30%, and damage by 10%; other values scale accordingly +_G.GAME_DIFFICULTY_FACTOR = 0 + +_G.DEFAULT_PORTAL_SPAWN_INTERVAL = 30 +_G.PORTAL_ESCALATION_ENABLED = true +_G.PORTAL_ESCALATION_RATE = 2.5 + +_G.DEFAULT_MIN_CRATES_ENEMY_ENC = 8 +_G.DEFAULT_MAX_CRATES_ENEMY_ENC = 10 + +_G.DEFAULT_MIN_CRATES_BOSS_ENC = 12 +_G.DEFAULT_MAX_CRATES_BOSS_ENC = 15 + +_G.DEFAULT_MIN_CHESTS = 1 +_G.DEFAULT_MAX_CHESTS = 2 + +_G.ENCOUNTER_SPAWN_BARRELS_CHANCE = 40 +_G.DEFAULT_MIN_BARRELS_ENEMY_ENC = 3 +_G.DEFAULT_MAX_BARRELS_ENEMY_ENC = 6 + +-- blessing constants +_G.BLESSING_TYPE_MODIFIER = 1 +_G.BLESSING_TYPE_ITEM_GRANT = 2 +_G.BLESSING_TYPE_LIFE_GRANT = 3 +_G.BLESSING_TYPE_GOLD_GRANT = 4 \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/containers/breakable_container_surprises.lua b/aghanim_singleplayer/scripts/vscripts/containers/breakable_container_surprises.lua new file mode 100755 index 0000000..fa6f40a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/containers/breakable_container_surprises.lua @@ -0,0 +1,177 @@ +require( "rewards" ) +require( "reward_tables" ) +require( "map_encounter" ) + + +function CAghanim:ChooseBreakableSurprise( hAttacker, hBreakableEnt ) + hBreakableEnt.nRewardSpawnDist = 32 + + if hBreakableEnt.RoomReward ~= nil then + self:SpawnRoomReward( hBreakableEnt ) + return + end + -- Note: hAttacker can be nil + + --[[ + if hAttacker then + print( string.format( "CAghanim:ChooseBreakableSurprise() - hAttacker: %s", hAttacker:GetUnitName() ) ) + end + ]] + + --[[ + --These are initialized when the crate unit is spawned in map_encounter + printf( "----------------------------------------" ) + printf( " hBreakableEnt.fRareItemChance: %.2f", hBreakableEnt.fRareItemChance ) + printf( " hBreakableEnt.fCommonItemChance: %.2f", hBreakableEnt.fCommonItemChance ) + printf( " hBreakableEnt.fMonsterChance: %.2f", hBreakableEnt.fMonsterChance ) + printf( " hBreakableEnt.fGoldChance: %.2f", hBreakableEnt.fGoldChance ) + ]] + + local fRareItemThreshold = 1 - hBreakableEnt.fRareItemChance + local fCommonItemThreshold = fRareItemThreshold - hBreakableEnt.fCommonItemChance + local fMonsterThreshold = fCommonItemThreshold - hBreakableEnt.fMonsterChance + local fGoldThreshold = fMonsterThreshold - hBreakableEnt.fGoldChance + + local fRandRoll = RandomFloat( 0, 1 ) + + --[[ + printf( "----------------------------------------" ) + printf( "fRandRoll: %.2f", fRandRoll ) + printf( "fRareItemThreshold: %.2f", fRareItemThreshold ) + printf( "fCommonItemThreshold: %.2f", fCommonItemThreshold ) + printf( "fMonsterThreshold: %.2f", fMonsterThreshold ) + printf( "fGoldThreshold: %.2f", fGoldThreshold ) + ]] + + if fRandRoll >= fRareItemThreshold then + self:CreateBreakableContainerRareItemDrop( hAttacker, hBreakableEnt ) + --print( string.format( "fRandRoll (%.2f) >= fRareItemThreshold (%.2f)", fRandRoll, fRareItemThreshold ) ) + return + elseif fRandRoll >= fCommonItemThreshold then + self:CreateBreakableContainerCommonItemDrop( hAttacker, hBreakableEnt ) + --print( string.format( "fRandRoll (%.2f) >= fCommonItemThreshold (%.2f)", fRandRoll, fCommonItemThreshold ) ) + return + elseif fRandRoll >= fMonsterThreshold then + self:CreateBreakableContainerMonsterSpawn( hAttacker, hBreakableEnt ) + --print( string.format( "fRandRoll (%.2f) >= fMonsterThreshold (%.2f)", fRandRoll, fMonsterThreshold ) ) + return + elseif fRandRoll >= fGoldThreshold then + --print( string.format( "fRandRoll (%.2f) >= fGoldThreshold (%.2f)", fRandRoll, fGoldThreshold ) ) + self:CreateBreakableContainerGoldDrop( hAttacker, hBreakableEnt ) + return + else + -- Drop nothing + --print( string.format( "else drop nothing, fRandRoll was %.2f", fRandRoll ) ) + end +end + +--------------------------------------------------------------------------- + +function CAghanim:CreateBreakableContainerRareItemDrop( hAttacker, hBreakableEnt ) + if hBreakableEnt ~= nil and hBreakableEnt.RareItems ~= nil then + local nRandomIndex = RandomInt( 1, #hBreakableEnt.RareItems ) + local newItem = CreateItem( hBreakableEnt.RareItems[ nRandomIndex ], nil, nil ) + local drop = CreateItemOnPositionForLaunch( hBreakableEnt:GetAbsOrigin(), newItem ) + + local vPos = self:GetBreakableRewardSpawnPos( hBreakableEnt ) + + newItem:LaunchLootInitialHeight( false, 0, 100, 0.5, vPos ) + + EmitSoundOn( "Dungeon.TreasureItemDrop", hBreakableEnt ) + end +end + +-------------------------------------------------------------------------------- + +function CAghanim:CreateBreakableContainerCommonItemDrop( hAttacker, hBreakableEnt ) + if hBreakableEnt ~= nil and hBreakableEnt.CommonItems ~= nil then + local nHealthPotChance = 55 -- hack for quick pseudo-randomness; we're not pulling in the items from the hBreakableEnt table + --printf( "nHealthPotChance: %d", nHealthPotChance ) + local szItem = nil + if RollPseudoRandomPercentage( nHealthPotChance, DOTA_PSEUDO_RANDOM_CUSTOM_GAME_1, hAttacker ) == true then + szItem = "item_health_potion" + --printf( "pseudo-random roll resulted in health pot" ) + else + szItem = "item_mana_potion" + --printf( "pseudo-random roll resulted in mana pot" ) + end + + local newItem = CreateItem( szItem, nil, nil ) + + --[[ + local nRandomIndex = RandomInt( 1, #hBreakableEnt.CommonItems ) + local newItem = CreateItem( hBreakableEnt.CommonItems[ nRandomIndex ], nil, nil ) + ]] + + local drop = CreateItemOnPositionForLaunch( hBreakableEnt:GetAbsOrigin(), newItem ) + + local vPos = self:GetBreakableRewardSpawnPos( hBreakableEnt ) + + if newItem:GetAbilityName() == "item_health_potion" or newItem:GetAbilityName() == "item_mana_potion" then + newItem:LaunchLootInitialHeight( true, 0, 100, 0.5, vPos ) + else + newItem:LaunchLootInitialHeight( false, 0, 100, 0.5, vPos ) + end + + EmitSoundOn( "Dungeon.TreasureItemDrop", hBreakableEnt ) + end +end + +-------------------------------------------------------------------------------- + +function CAghanim:CreateBreakableContainerMonsterSpawn( hAttacker, hBreakableEnt ) + if hBreakableEnt == nil then + return + end + + local monsterUnits = hBreakableEnt.MonsterUnits + if monsterUnits ~= nil and #monsterUnits > 0 then + local nRandomIndex = RandomInt( 1, #monsterUnits ) + local szMonsterUnit = monsterUnits[ nRandomIndex ] + + local vPos = self:GetBreakableRewardSpawnPos( hBreakableEnt ) + + -- Spawn the monster at vPos + + EmitSoundOn( "Dungeon.TreasureItemDrop", hBreakableEnt ) + end +end + +--------------------------------------------------------------------------- + +function CAghanim:CreateBreakableContainerGoldDrop( hAttacker, hBreakableEnt ) + local nGoldToDrop = RandomInt( hBreakableEnt.nMinGold, hBreakableEnt.nMaxGold ) + + --print( "Breakable nGoldToDrop == " .. nGoldToDrop ) + + --print( "CAghanim:CreateBreakableContainerGoldDrop() - Drop a bag with " .. nGoldToDrop .. " gold.") + if nGoldToDrop > 0 then + local newItem = CreateItem( "item_bag_of_gold", nil, nil ) + newItem:SetPurchaseTime( 0 ) + newItem:SetCurrentCharges( nGoldToDrop ) + local drop = CreateItemOnPositionSync( hBreakableEnt:GetAbsOrigin(), newItem ) + + local vPos = self:GetBreakableRewardSpawnPos( hBreakableEnt ) + + newItem:LaunchLoot( true, 100, 0.5, vPos ) + EmitSoundOn( "Dungeon.TreasureItemDrop", hBreakableEnt ) + end +end + +--------------------------------------------------------------------------- + +function CAghanim:GetBreakableRewardSpawnPos( hBreakableEnt ) + local vPos = hBreakableEnt:GetAbsOrigin() + RandomVector( hBreakableEnt.nRewardSpawnDist ) + + local nAttempts = 0 + while ( ( not GridNav:CanFindPath( hBreakableEnt:GetOrigin(), vPos ) ) and ( nAttempts < 5 ) ) do + vPos = hBreakableEnt:GetOrigin() + RandomVector( hBreakableEnt.nRewardSpawnDist ) + nAttempts = nAttempts + 1 + + if nAttempts >= 5 then + vPos = hBreakableEnt:GetOrigin() + end + end + + return vPos +end diff --git a/aghanim_singleplayer/scripts/vscripts/containers/breakable_containers_data.lua b/aghanim_singleplayer/scripts/vscripts/containers/breakable_containers_data.lua new file mode 100755 index 0000000..4564215 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/containers/breakable_containers_data.lua @@ -0,0 +1,37 @@ + +_G.BreakablesData = +{ + { + fSpawnChance = 0.5, + szSpawnerName = "breakable_crate", + szNPCName = "npc_dota_crate", + nMaxSpawnDistance = 0, + + nMinGold = 160, + nMaxGold = 240, + fGoldChance = 0.0, + + fCommonItemChance = 1.0, + CommonItems = + { + "item_health_potion", + "item_mana_potion", + }, + + fMonsterChance = 0.0, + MonsterUnits = + { + --"npc_dota_creature_rock_golem_a", + }, + + fRareItemChance = 0.0, + RareItems = + { + "item_greater_salve", + "item_greater_clarity", + "item_book_of_strength", + "item_book_of_agility", + "item_book_of_intelligence", + }, + }, +} diff --git a/aghanim_singleplayer/scripts/vscripts/containers/explosive_barrel_data.lua b/aghanim_singleplayer/scripts/vscripts/containers/explosive_barrel_data.lua new file mode 100755 index 0000000..676c016 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/containers/explosive_barrel_data.lua @@ -0,0 +1,10 @@ + +_G.ExplosiveBarrelData = +{ + { + fSpawnChance = 0.5, + szSpawnerName = "explosive_barrel", + szNPCName = "npc_dota_explosive_barrel", + nMaxSpawnDistance = 0, + }, +} diff --git a/aghanim_singleplayer/scripts/vscripts/containers/treasure_chest_data.lua b/aghanim_singleplayer/scripts/vscripts/containers/treasure_chest_data.lua new file mode 100755 index 0000000..a7e3945 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/containers/treasure_chest_data.lua @@ -0,0 +1,30 @@ + +_G.TreasureChestData = +{ + { + fSpawnChance = 1, --0.5, + szSpawnerName = "treasure_chest", + szNPCName = "npc_treasure_chest", + nMaxSpawnDistance = 0, + + fNeutralItemChance = 0.4, + nMinNeutralItems = 1, + nMaxNeutralItems = 2, + + fItemChance = 0.4, + nMinItems = 1, + nMaxItems = 2, + Items = + { + "item_life_rune", + }, + + fTrapChance = 0.0, + nTrapLevel = 1, + szTraps = + { + "creature_techies_land_mine", + "trap_sun_strike", + }, + }, +} diff --git a/aghanim_singleplayer/scripts/vscripts/containers/treasure_chest_surprises.lua b/aghanim_singleplayer/scripts/vscripts/containers/treasure_chest_surprises.lua new file mode 100755 index 0000000..9ab8cb5 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/containers/treasure_chest_surprises.lua @@ -0,0 +1,282 @@ + +require( "rewards" ) +require( "reward_tables" ) +require( "map_encounter" ) + +function CAghanim:ChooseTreasureSurprise( hPlayerHero, hTreasureEnt ) + hTreasureEnt.nRewardSpawnDist = 64 + + if hTreasureEnt.RoomReward ~= nil then + self:SpawnRoomReward( hTreasureEnt ) + return + end + + if hTreasureEnt.fNeutralItemChance == nil then + printf( "ERROR -- ChooseTreasureSurprise(): No fNeutralItemChance specified for this chest." ) + end + + if hTreasureEnt.fItemChance == nil then + printf( "ERROR -- ChooseTreasureSurprise(): No fItemChance specified for this chest." ) + end + + if hTreasureEnt.nTrapLevel == nil or hTreasureEnt.nTrapLevel <= 0 then + printf( "ERROR -- ChooseTreasureSurprise(): Field \"nTrapLevel\" is missing or is 0 or less." ) + end + + if hTreasureEnt.fTrapChance == nil then + printf( "ERROR -- ChooseTreasureSurprise(): No fTrapChance specified for this chest." ) + end + + if hTreasureEnt.szTraps == nil or #hTreasureEnt.szTraps == 0 then + printf( "ERROR -- ChooseTreasureSurprise(): Field \"szTraps\" is missing or empty for this chest." ) + end + + --[[ + --These are initialized when the crate unit is spawned in map_encounter + printf( "----------------------------------------" ) + printf( " hTreasureEnt.fItemChance: %.2f", hTreasureEnt.fItemChance ) + printf( " hTreasureEnt.fNeutralItemChance: %.2f", hTreasureEnt.fNeutralItemChance ) + printf( " hTreasureEnt.fTrapChance: %.2f", hTreasureEnt.fTrapChance ) + ]] + + local fNeutralItemThreshold = 1 - hTreasureEnt.fNeutralItemChance + local fItemThreshold = fNeutralItemThreshold - hTreasureEnt.fItemChance + local fTrapThreshold = fItemThreshold - hTreasureEnt.fTrapChance + + local fRandRoll = RandomFloat( 0, 1 ) + + --[[ + printf( "----------------------------------------" ) + printf( "fRandRoll: %.2f", fRandRoll ) + printf( "fItemThreshold: %.2f", fItemThreshold ) + printf( "fNeutralItemThreshold: %.2f", fNeutralItemThreshold ) + printf( "fTrapThreshold: %.2f", fTrapThreshold ) + ]] + + if fRandRoll >= fNeutralItemThreshold then + self:CreateTreasureNeutralItemDrop( hPlayerHero, hTreasureEnt ) + --printf( "fRandRoll (%.2f) >= fNeutralItemThreshold (%.2f)", fRandRoll, fNeutralItemThreshold ) + return + elseif fRandRoll >= fItemThreshold then + self:CreateTreasureItemDrop( hPlayerHero, hTreasureEnt ) + --printf( "fRandRoll (%.2f) >= fItemThreshold (%.2f)", fRandRoll, fItemThreshold ) + return + elseif fRandRoll >= fTrapThreshold then + self:ChooseTreasureTrap( hPlayerHero, hTreasureEnt ) + --printf( "fRandRoll (%.2f) >= fTrapThreshold (%.2f)", fRandRoll, fTrapThreshold ) + return + else + self:CreateTreasureGoldDrop( hPlayerHero, hTreasureEnt ) + --printf( "else drop gold, fRandRoll was %.2f", fRandRoll ) + return + end +end + +--------------------------------------------------------------------------- + +function CAghanim:CreateTreasureNeutralItemDrop( hPlayerHero, hTreasureEnt ) + printf( "CreateTreasureNeutralItemDrop" ) + + local nNeutralItemsToDrop = RandomInt( hTreasureEnt.nMinNeutralItems, hTreasureEnt.nMaxNeutralItems ) + + for i = 1, nNeutralItemsToDrop do + local hCurrentEncounter = self:GetCurrentRoom():GetEncounter() + hCurrentEncounter:DropNeutralItemFromUnit( hTreasureEnt, hPlayerHero, true ) + end +end + +--------------------------------------------------------------------------- + +function CAghanim:CreateTreasureItemDrop( hPlayerHero, hTreasureEnt ) + printf( "CreateTreasureItemDrop" ) + if hTreasureEnt ~= nil and hTreasureEnt.Items ~= nil then + local nItemsToDrop = RandomInt( hTreasureEnt.nMinItems, hTreasureEnt.nMaxItems ) + + for i = 1, nItemsToDrop do + local nRandomIndex = RandomInt( 1, #hTreasureEnt.Items ) + local newItem = CreateItem( hTreasureEnt.Items[ nRandomIndex ], nil, nil ) + local drop = CreateItemOnPositionForLaunch( hTreasureEnt:GetAbsOrigin(), newItem ) + + local vPos = self:GetChestRewardSpawnPos( hTreasureEnt ) + + newItem:LaunchLootInitialHeight( false, 0, 200, 0.75, vPos ) + + EmitSoundOn( "Dungeon.TreasureItemDrop", hTreasureEnt ) + + local gameEvent = {} + gameEvent["player_id"] = hPlayerHero:GetPlayerID() + gameEvent["team_number"] = DOTA_TEAM_GOODGUYS + gameEvent["locstring_value"] = "#DOTA_Tooltip_Ability_" .. newItem:GetAbilityName() + gameEvent["message"] = "#Dungeon_FoundChestItem" + FireGameEvent( "dota_combat_event_message", gameEvent ) + end + end +end + +--------------------------------------------------------------------------- + +function CAghanim:ChooseTreasureTrap( hPlayerHero, hTreasureEnt ) + printf( "ChooseTreasureTrap" ) + local szTrapToUse = hTreasureEnt.szTraps[ RandomInt( 1, #hTreasureEnt.szTraps ) ] + --printf( "szTrapToUse == \"%s\"", szTrapToUse ) + + if szTrapToUse == "creature_techies_land_mine" then + self:CreateTreasureMineTrap( hPlayerHero, hTreasureEnt ) + elseif szTrapToUse == "trap_sun_strike" then + self:CreateTreasureSunStrikeTrap( hPlayerHero, hTreasureEnt ) + end +end + +--------------------------------------------------------------------------- + +function CAghanim:CreateTreasureMineTrap( hPlayerHero, hTreasureEnt ) + printf( "CreateTreasureMineTrap()" ) + local szAbilityName = "creature_techies_land_mine" + local hLandMineAbility = hTreasureEnt:FindAbilityByName( szAbilityName ) + if hLandMineAbility == nil then + printf( "ERROR -- CreateTreasureMineTrap: \"%s\" is missing required ability \"%s\"", hTreasureEnt:GetUnitName(), szAbilityName ) + return + end + hLandMineAbility:SetLevel( hTreasureEnt.nTrapLevel ) + + local vMinePos = hTreasureEnt:GetAbsOrigin() + local hMine = CreateUnitByName( "npc_dota_creature_techies_land_mine", vMinePos, true, hTreasureEnt, hTreasureEnt, DOTA_TEAM_BADGUYS ) + if hMine ~= nil then + hMine:AddNewModifier( hTreasureEnt, hLandMineAbility, "modifier_creature_techies_land_mine", { fadetime = 0 } ) + hMine:SetTeam( DOTA_TEAM_BADGUYS ) + local vAngles = hMine:GetAnglesAsVector() + hMine:SetAngles( vAngles.x, 0, vAngles.z ) + EmitSoundOnLocationWithCaster( hMine:GetOrigin(), "TreasureChest.MineTrap.Plant", hMine ) + + local gameEvent = {} + gameEvent["player_id"] = hPlayerHero:GetPlayerID() + gameEvent["team_number"] = DOTA_TEAM_GOODGUYS + gameEvent["locstring_value"] = "npc_dota_creature_techies_land_mine" + gameEvent["message"] = "#Dungeon_FoundChestTrap" + FireGameEvent( "dota_combat_event_message", gameEvent ) + end +end + +--------------------------------------------------------------------------- + +function CAghanim:CreateTreasureSunStrikeTrap( hPlayerHero, hTreasureEnt ) + printf( "CreateTreasureSunStrikeTrap()" ) + local szAbilityName = "trap_sun_strike" + local hSunStrikeAbility = hTreasureEnt:FindAbilityByName( szAbilityName ) + if hSunStrikeAbility == nil then + printf( "ERROR -- CreateTreasureSunStrikeTrap: \"%s\" is missing required ability \"%s\"", hTreasureEnt:GetUnitName(), szAbilityName ) + return + end + hSunStrikeAbility:SetLevel( hTreasureEnt.nTrapLevel ) + + hTreasureEnt:SetTeam( DOTA_TEAM_BADGUYS ) + + local hEnemies = FindUnitsInRadius( hTreasureEnt:GetTeamNumber(), hTreasureEnt:GetOrigin(), hTreasureEnt, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, 0, false ) + for _, hEnemy in pairs( hEnemies ) do + if hEnemy ~= nil and hEnemy:IsRealHero() then + local kv = + { + duration = hSunStrikeAbility:GetSpecialValueFor( "delay" ), + area_of_effect = hSunStrikeAbility:GetSpecialValueFor( "area_of_effect" ), + vision_distance = hSunStrikeAbility:GetSpecialValueFor( "vision_distance" ), + vision_duration = hSunStrikeAbility:GetSpecialValueFor( "vision_duration" ), + damage = hSunStrikeAbility:GetSpecialValueFor( "damage" ), + } + + local vTarget = hEnemy:GetOrigin() -- + hEnemy:GetForwardVector() * 100 + + CreateModifierThinker( hTreasureEnt, hSunStrikeAbility, "modifier_invoker_sun_strike", kv, vTarget, hTreasureEnt:GetTeamNumber(), false ) + + EmitSoundOnLocationForAllies( vTarget, "Creature.Flamestrike.Charge", hEnemy ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_invoker/invoker_sun_strike_team.vpcf", PATTACH_WORLDORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, vTarget ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( 50, 1, 1 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + + local gameEvent = {} + gameEvent["player_id"] = hPlayerHero:GetPlayerID() + gameEvent["team_number"] = DOTA_TEAM_GOODGUYS + gameEvent["locstring_value"] = "trap_sun_strike" + gameEvent["message"] = "#Dungeon_FoundChestTrap" + FireGameEvent( "dota_combat_event_message", gameEvent ) +end + +--------------------------------------------------------------------------- + +function CAghanim:CreateTreasureGoldDrop( hPlayerHero, hTreasureEnt ) + printf( "CreateTreasureGoldDrop" ) + + local nDepth = self:GetCurrentRoom():GetDepth() + local nMinGold, nMaxGold = GetMinMaxGoldChoiceReward( nDepth, true ) + + local newItem = CreateItem( "item_bag_of_gold", nil, nil ) + newItem:SetPurchaseTime( 0 ) + local nGoldToDrop = math.random( nMinGold, nMaxGold ) + newItem:SetCurrentCharges( nGoldToDrop ) + + local drop = CreateItemOnPositionSync( hTreasureEnt:GetAbsOrigin(), newItem ) + + local vPos = self:GetChestRewardSpawnPos( hTreasureEnt ) + + newItem:LaunchLoot( true, 200, 0.75, vPos ) + EmitSoundOn( "Dungeon.TreasureItemDrop", hTreasureEnt ) + + local gameEvent = {} + gameEvent["player_id"] = hPlayerHero:GetPlayerID() + gameEvent["team_number"] = DOTA_TEAM_GOODGUYS + gameEvent["int_value"] = nGoldToDrop + gameEvent["message"] = "#Dungeon_FoundChestGold" + FireGameEvent( "dota_combat_event_message", gameEvent ) +end + +--------------------------------------------------------------------------- + +function CAghanim:GetChestRewardSpawnPos( hTreasureEnt ) + local vPos = hTreasureEnt:GetAbsOrigin() + RandomVector( hTreasureEnt.nRewardSpawnDist ) + + local nAttempts = 0 + while ( ( not GridNav:CanFindPath( hTreasureEnt:GetOrigin(), vPos ) ) and ( nAttempts < 5 ) ) do + vPos = hTreasureEnt:GetOrigin() + RandomVector( hTreasureEnt.nRewardSpawnDist ) + nAttempts = nAttempts + 1 + + if nAttempts >= 5 then + vPos = hTreasureEnt:GetOrigin() + end + end + + return vPos +end + +--------------------------------------------------------------------------- + + +function CAghanim:SpawnRoomReward( hTreasureEnt ) + if hTreasureEnt.Encounter == nil then + return + end + + hTreasureEnt.nRewardSpawnDist = 200 + + local nMinGold, nMaxGold = GetMinMaxGoldChoiceReward( hTreasureEnt.nDepth, hTreasureEnt.nEliteRank > 0 ) + for _, szReward in pairs( hTreasureEnt.RoomReward ) do + if szReward == "item_life_rune" then + hTreasureEnt.Encounter:DropLifeRuneFromUnit( hTreasureEnt, hTreasureEnt, false ) + elseif szReward == "item_bag_of_gold" then + local newItem = CreateItem( szReward, nil, nil ) + newItem:SetPurchaseTime( 0 ) + newItem:SetCurrentCharges( math.random( nMinGold, nMaxGold ) ) + local drop = CreateItemOnPositionSync( hTreasureEnt:GetAbsOrigin(), newItem ) + local vPos = self:GetBreakableRewardSpawnPos( hTreasureEnt ) + newItem:LaunchLoot( true, 300, 0.5, vPos ) + else + hTreasureEnt.Encounter:DropItemFromRoomRewardContainer( hTreasureEnt, szReward, false ) + end + + EmitSoundOn( "Dungeon.TreasureItemDrop", hTreasureEnt ) + end +end + +--------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_aghanim.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_aghanim.lua new file mode 100755 index 0000000..5add080 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_aghanim.lua @@ -0,0 +1,378 @@ +require( "encounters/encounter_boss_base" ) +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + + +-------------------------------------------------------------------------------- + +if CMapEncounter_Aghanim == nil then + CMapEncounter_Aghanim = class( {}, {}, CMapEncounter_BossBase ) +end + +-------------------------------------------------------------------------------- + + +function CMapEncounter_Aghanim:Precache( context ) + CMapEncounter_BossBase.Precache( self, context ) + PrecacheUnitByNameSync( "npc_dota_boss_aghanim", context, -1 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:constructor( hRoom, szEncounterName ) + + CMapEncounter_BossBase.constructor( self, hRoom, szEncounterName ) + + -- Agh Victory phase + self.AGH_VICTORY_NOT_STARTED = 0 + self.AGH_VICTORY_BESTED = 1 + self.AGH_VICTORY_VICTORY_SPEECH = 2 + self.AGH_VICTORY_BOWING = 3 + self.AGH_VICTORY_FINISHED = 4 + + self.nVictoryState = self.AGH_VICTORY_NOT_STARTED + self.szBossSpawner = "spawner_boss" + + self:AddSpawner( CDotaSpawner( self.szBossSpawner, self.szBossSpawner, + { + { + EntityName = "npc_dota_boss_aghanim", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:Start() + CMapEncounter_BossBase.Start( self ) + + self.nHeroOnTrigger1 = 0 + self.nHeroOnTrigger2 = 0 + self.nHeroOnTrigger3 = 0 + self.nHeroOnTrigger4 = 0 + self.nPlayersReady = 0 + ListenToGameEvent( "trigger_start_touch", Dynamic_Wrap( getclass( self ), "OnTriggerStartTouch" ), self ) + ListenToGameEvent( "trigger_end_touch", Dynamic_Wrap( getclass( self ), "OnTriggerEndTouch" ), self ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:OnTriggerStartTouch( event ) + if self.bAllButtonsReady == true then + return + end + + -- Get the trigger that activates the room + local szTriggerName = event.trigger_name + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + -- Assign an integer to the trigger + if szTriggerName == "trigger_player_1" then + self.nHeroOnTrigger1 = 1 + elseif szTriggerName == "trigger_player_2" then + self.nHeroOnTrigger2 = 1 + elseif szTriggerName == "trigger_player_3" then + self.nHeroOnTrigger3 = 1 + elseif szTriggerName == "trigger_player_4" then + self.nHeroOnTrigger4 = 1 + end + local hHeroes = HeroList:GetAllHeroes() + local nTotalHeroes = #hHeroes + self.nPlayersReady = self.nHeroOnTrigger1 + self.nHeroOnTrigger2 + self.nHeroOnTrigger3 + self.nHeroOnTrigger4 + if self.nPlayersReady == nTotalHeroes then + + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "aghanim_gate_open_relay", false ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + self.bAllButtonsReady = true + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:OnTriggerEndTouch( event ) + if self.bAllButtonsReady == true then + return + end + + -- Get the trigger that activates the room + local szTriggerName = event.trigger_name + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + if szTriggerName == "trigger_player_1" then + self.nHeroOnTrigger1 = 0 + elseif szTriggerName == "trigger_player_2" then + self.nHeroOnTrigger2 = 0 + elseif szTriggerName == "trigger_player_3" then + self.nHeroOnTrigger3 = 0 + elseif szTriggerName == "trigger_player_4" then + self.nHeroOnTrigger4 = 0 + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:OnBossSpawned( hBoss ) + CMapEncounter_BossBase.OnBossSpawned( self, hBoss ) + + hBoss.AI:SetEncounter( self ) + self.hAghanim = hBoss + self.hAghanim.bOutroComplete = false +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:OnThink() + CMapEncounter_BossBase.OnThink( self ) + + if self.nVictoryState > self.AGH_VICTORY_NOT_STARTED then + self:OnThinkVictorySequence() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:IntroduceBoss( hEncounteredBoss ) + CMapEncounter_BossBase.IntroduceBoss( self, hEncounteredBoss ) + + -- local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "aghanim_gate_close_relay", false ) + -- for _, hRelay in pairs( hRelays ) do + -- hRelay:Trigger( nil, nil ) + -- end + + local hTriggers = self:GetRoom():FindAllEntitiesInRoomByName( "aghanim_boss_room_bounds", false ) + local hTeleportPositions = self:GetRoom():FindAllEntitiesInRoomByName( "teleport_players", false ) + if #hTriggers > 0 and #hTeleportPositions > 0 then + local hTrigger = hTriggers[1] + local hTeleportPosition = hTeleportPositions[1] + if hTrigger ~= nil and hTeleportPosition ~= nil then + + local vMins = hTrigger:GetBoundingMins() + local vMaxs = hTrigger:GetBoundingMaxs() + vMins = hTrigger:TransformPointEntityToWorld( vMins ) + vMaxs = hTrigger:TransformPointEntityToWorld( vMaxs ) + + local flSize = vMaxs.x - vMins.x + local flSizeY = vMaxs.y - vMins.y + if flSizeY > flSize then + flSize = flSizeY + end + + local netTable = {} + netTable[ "room_name" ] = self:GetRoom():GetName() + netTable[ "map_name" ] = "aghanim_arena_boss_room" + netTable[ "x" ] = hTrigger:GetAbsOrigin().x + netTable[ "y" ] = hTrigger:GetAbsOrigin().y + netTable[ "size" ] = flSize + netTable[ "scale" ] = 8 + + for nPlayerID = 0, AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + if not hTrigger:IsTouching( hPlayerHero ) then + FindClearSpaceForUnit( hPlayerHero, hTeleportPosition:GetAbsOrigin() + RandomVector( 250 ), true ) + end + + local kv = + { + min_x = vMins.x, + min_y = vMins.y, + max_x = vMaxs.x, + max_y = vMaxs.y, + } + hPlayerHero:AddNewModifier( hPlayerHero, nil, "modifier_morty_leash", kv ) + + CustomNetTables:SetTableValue( "game_global", "minimap_info" .. nPlayerID, netTable ) + end + end + end + + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:OnComplete() + CMapEncounter.OnComplete( self ) + GameRules.Aghanim:MarkGameWon() +end + +--------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:BossSpeak( szSoundEvent, bLaugh ) + + -- Use response rules to talk + return + +end + +--------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:AghanimSpeak( flDelay, bForce, hCriteriaTable ) + + -- Don't speak after we started our victory sequence + + if self.nVictoryState > self.AGH_VICTORY_VICTORY_SPEECH then + return false + end + + -- We're juking the announcer to speak through our own unit + -- So we can share in the "is speaking" logic as well as the global criteria + -- And also other game code that triggers announcer lines + return GameRules.Aghanim:GetAnnouncer():Speak( flDelay, bForce, hCriteriaTable ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:CheckForCompletion() + return self.nVictoryState == self.AGH_VICTORY_FINISHED +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:BeginVictorySequence() + + -- A brutal hack. We need to know how long the victory speech is to know when to stop + -- but the only way to achieve that is to make this line server-authoritative + GameRules.Aghanim:GetAnnouncer():SetServerAuthoritative( true ) + + self:AghanimSpeak( 0.0, true, + { + announce_event = "bested", + }) + + self.nVictoryState = self.AGH_VICTORY_BESTED + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:OnThinkVictorySequence() + -- Wait until he finishes his line + if GameRules.Aghanim:GetAnnouncer():IsCurrentlySpeaking() == false then + if self.nVictoryState == self.AGH_VICTORY_BESTED then + self:AghanimSpeak( 0.0, true, + { + announce_event = "victory_speech", + }) + + GameRules.Aghanim:GetAnnouncer():OverrideSpeakingUnit( nil ) + self.nVictoryState = self.AGH_VICTORY_VICTORY_SPEECH + elseif self.nVictoryState == self.AGH_VICTORY_VICTORY_SPEECH then + self.nVictoryState = self.AGH_VICTORY_BOWING + elseif self.nVictoryState == self.AGH_VICTORY_BOWING and self.hAghanim.bOutroComplete == true then + self.nVictoryState = self.AGH_VICTORY_FINISHED + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:GetPreviewUnit() + return "npc_dota_boss_aghanim" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:GetBossIntroVoiceLine() + + -- Sort of a hack. Starting with the intro voice, we are going to + -- juke the announcer to play lines through us. BossSpeak() is commented + -- out so it does nothing + + -- While the boss is spawned, don't do any announcer lines + GameRules.Aghanim:GetAnnouncer():OverrideSpeakingUnit( self.hAghanim ) + + self:AghanimSpeak( 0.0, true, + { + announce_event = "boss_intro", + }) + + return nil +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:GetBossIntroGesture() + return ACT_DOTA_SPAWN +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:GetBossIntroDuration() + return 5.0 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:GetBossIntroCameraPitch() + return 40 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:GetBossIntroCameraDistance() + return 800 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:GetBossIntroCameraHeight() + return 225 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:GetLaughLine() + + -- No laughing after we started our end sequence + if self.nVictoryState > self.AGH_VICTORY_NOT_STARTED then + return "" + end + + local bDidSpeak = self:AghanimSpeak( 0.0, false, + { + announce_event = "laugh", + }) + + -- Just the laugh system into not trying to laugh again for a while + if bDidSpeak == true then + return "" + end + + return nil + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Aghanim:GetAbilityUseLine( szAbilityName ) + + local bForce = false + if ( szAbilityName == "aghanim_staff_beams" ) or ( szAbilityName == "aghanim_blink" ) or ( szAbilityName == "aghanim_shard_attack" ) + or ( szAbilityName == "aghanim_summon_portals" ) or ( szAbilityName == "aghanim_spell_swap" ) then + bForce = true + end + + self:AghanimSpeak( 0.0, bForce, + { + announce_event = "ability_use", + ability_name = szAbilityName, + }) + + return nil + +end + + +-------------------------------------------------------------------------------- + +return CMapEncounter_Aghanim diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_alchemist.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_alchemist.lua new file mode 100755 index 0000000..fee2e51 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_alchemist.lua @@ -0,0 +1,92 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Alchemist == nil then + CMapEncounter_Alchemist = class( {}, {}, CMapEncounter ) +end + +function CMapEncounter_Alchemist:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + -- Dynamic Spawns + self.vWaveSchedule = + { + { + Time = 5, + Count = 1, + }, + { + Time = 35, + Count = 1, + }, + } + + --DeepPrintTable( self.vWaveSchedule ) + + self.szDynamicPortal = "dynamic_portal" + local bInvulnerable = true + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szDynamicPortal, self.szDynamicPortal, 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_alchemist", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( self.szDynamicPortal, self.vWaveSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Alchemist:GetPreviewUnit() + return "npc_dota_creature_alchemist" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Alchemist:InitializeObjectives() + self:AddEncounterObjective( "defeat_the_alchemists", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Alchemist:Start() + CMapEncounter.Start( self ) + + self:StartSpawnerSchedule( self.szDynamicPortal, 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Alchemist:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + if hVictim and hVictim:GetUnitName() == "npc_dota_creature_alchemist" then + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_the_alchemists" ) + self:UpdateEncounterObjective( "defeat_the_alchemists", nCurrentValue + 1, nil ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Alchemist:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + self:SetInitialGoalEntityToNearestHero( hSpawnedUnit ) + end + +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Alchemist diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_baby_ogres.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_baby_ogres.lua new file mode 100755 index 0000000..defadb9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_baby_ogres.lua @@ -0,0 +1,182 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_BabyOgres == nil then + CMapEncounter_BabyOgres = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BabyOgres:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self.szPeonSpawner = "spawner_peon" + self.szCaptainSpawner = "spawner_captain" + + self:AddSpawner( CDotaSpawner( self.szPeonSpawner, self.szPeonSpawner, + { + { + EntityName = "npc_dota_creature_baby_ogre_magi", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 150.0, + }, + } + )) + + self:AddSpawner( CDotaSpawner( self.szCaptainSpawner, self.szCaptainSpawner, + { + { + EntityName = "npc_dota_creature_baby_ogre_tank", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + )) + + self.vWaveSchedule = + { + { + Time = 5, + Count = 2, + }, + { + Time = 30, + Count = 3, + }, + { + Time = 55, + Count = 3, + }, + { + Time = 80, + Count = 4, + }, + } + + local bInvulnerable = true + + self.szDynamicPortal = "dynamic_portal" + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szDynamicPortal, self.szDynamicPortal, 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_baby_ogre_magi", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 200.0, + }, + { + EntityName = "npc_dota_creature_baby_ogre_tank", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( self.szDynamicPortal, self.vWaveSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BabyOgres:GetPreviewUnit() + return "npc_dota_creature_baby_ogre_tank" +end + +-------------------------------------------------------------------------------- + +--[[ +function CMapEncounter_BabyOgres:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "survive_waves", 0, #self.vWaveSchedule ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) -- doesn't capture pre-placed spawns? +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BabyOgres:GetMaxSpawnedUnitCount() + local nCount = 0 + + local hPeonSpawners = self:GetSpawner( self.szPeonSpawner ) + if hPeonSpawners then + nCount = nCount + hPeonSpawners:GetSpawnPositionCount() + end + + local hCaptainSpawners = self:GetSpawner( self.szCaptainSpawner ) + if hCaptainSpawners then + nCount = nCount + hCaptainSpawners:GetSpawnPositionCount() + end + + return nCount +end +]] + +-------------------------------------------------------------------------------- + +function CMapEncounter_BabyOgres:Start() + CMapEncounter.Start( self ) + + for _, hSpawner in pairs( self:GetSpawners() ) do + hSpawner:SpawnUnits() + end + + self:StartSpawnerSchedule( self.szDynamicPortal, 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BabyOgres:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + --[[ + if hSpawner.szSpawnerName == self.szDynamicPortal then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end + ]] + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + print( "CMapEncounter_BabyOgres:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + else + print( "CMapEncounter_BabyOgres:OnSpawnerFinished: WARNING: Can't find a living hero" ) + end + end + end +end + +-------------------------------------------------------------------------------- + +--[[ +function CMapEncounter_BabyOgres:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end +]] + +-------------------------------------------------------------------------------- + +return CMapEncounter_BabyOgres diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bandits.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bandits.lua new file mode 100755 index 0000000..f771024 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bandits.lua @@ -0,0 +1,303 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Bandits == nil then + CMapEncounter_Bandits = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bandits:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_stifling_dagger_debuff.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_riki/riki_blink_strike.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bandits:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + -- Pre-placed creatures (done this way to use a specific subset of existing map spawners) + self.vPreplacedSchedule = + { + { + Time = 0, + Count = 2, + }, + } + + self.szPreplacedSpawner = "spawner_preplaced" + + self:AddSpawner( CDotaSpawner( self.szPreplacedSpawner, self.szPreplacedSpawner, + { + { + EntityName = "npc_dota_creature_bandit", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 200.0, + }, + { + EntityName = "npc_dota_creature_bandit_archer", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + ) ) + + -- Players have to kill the pre-placed creatures to trigger the dynamic portals + self:SetPortalTriggerSpawner( self.szPreplacedSpawner, 0.8 ) + self:SetSpawnerSchedule( self.szPreplacedSpawner, self.vPreplacedSchedule ) + + -- Additional creatures + self.szGroupSpawner = "spawner_group" + + self.vExtraCreaturesSchedule = + { + { + Time = 0, + Count = 1, + }, + } + + self:AddSpawner( CDotaSpawner( self.szGroupSpawner, self.szGroupSpawner, + { + { + EntityName = "npc_dota_creature_bandit_archer", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + ) ) + + self:SetSpawnerSchedule( self.szGroupSpawner, self.vExtraCreaturesSchedule ) + + -- Wave 1 + local nNumPortals = 3 + local flInitialPortalSpawnDelay = 0.0 + local flInitialSummonTime = 6.0 + local flPortalIntervalInput = 60.0 + local flScaleInput = 1.0 + + local nNameCounter = 1 + local szLocatorName = "dynamic_portal" + self.nTotalPortals = nNumPortals + + for i = 1, nNumPortals do + local name = string.format( "portal_%i", nNameCounter ) + nNameCounter = nNameCounter + 1 + self:AddPortalSpawner( CPortalSpawner( name, szLocatorName, 80 * hRoom:GetDepth(), flInitialPortalSpawnDelay, flInitialSummonTime, flPortalIntervalInput, flScaleInput, + { + { + EntityName = "npc_dota_creature_bandit", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 250.0, + }, + { + EntityName = "npc_dota_creature_bandit_archer", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 200.0, + }, + } + )) + end + + -- Wave 2A + nNumPortals = 3 + flInitialPortalSpawnDelay = 24.0 + flInitialSummonTime = 6.0 + flScaleInput = 1.0 + + self.nTotalPortals = self.nTotalPortals + nNumPortals + + for i = 1, nNumPortals do + local name = string.format( "portal_%i", nNameCounter ) + nNameCounter = nNameCounter + 1 + self:AddPortalSpawner( CPortalSpawner( name, szLocatorName, 80 * hRoom:GetDepth(), flInitialPortalSpawnDelay, flInitialSummonTime, flPortalIntervalInput, flScaleInput, + { + { + EntityName = "npc_dota_creature_bandit", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 250.0, + }, + { + EntityName = "npc_dota_creature_bandit_archer", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 200.0, + }, + } + )) + end + + -- Wave 2B + nNumPortals = 1 + flInitialPortalSpawnDelay = 24.0 + flInitialSummonTime = 6.0 + flScaleInput = 1.3 + + self.nTotalPortals = self.nTotalPortals + nNumPortals + + for i = 1, nNumPortals do + local name = string.format( "portal_%i", nNameCounter ) + nNameCounter = nNameCounter + 1 + self:AddPortalSpawner( CPortalSpawner( name, szLocatorName, 120 * hRoom:GetDepth(), flInitialPortalSpawnDelay, flInitialSummonTime, flPortalIntervalInput, flScaleInput, + { + { + EntityName = "npc_dota_creature_bandit_captain", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 200.0, + }, + } + )) + end + + -- Wave 3A + nNumPortals = 2 + flInitialPortalSpawnDelay = 48.0 + flInitialSummonTime = 6.0 + flScaleInput = 1.0 + + self.nTotalPortals = self.nTotalPortals + nNumPortals + + for i = 1, nNumPortals do + local name = string.format( "portal_%i", nNameCounter ) + nNameCounter = nNameCounter + 1 + self:AddPortalSpawner( CPortalSpawner( name, szLocatorName, 80 * hRoom:GetDepth(), flInitialPortalSpawnDelay, flInitialSummonTime, flPortalIntervalInput, flScaleInput, + { + { + EntityName = "npc_dota_creature_bandit", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 250.0, + }, + { + EntityName = "npc_dota_creature_bandit_archer", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 200.0, + }, + } + )) + end + + -- Wave 3B + nNumPortals = 2 + flInitialPortalSpawnDelay = 48.0 + flInitialSummonTime = 6.0 + flScaleInput = 1.3 + + self.nTotalPortals = self.nTotalPortals + nNumPortals + + for i = 1, nNumPortals do + local name = string.format( "portal_%i", nNameCounter ) + nNameCounter = nNameCounter + 1 + self:AddPortalSpawner( CPortalSpawner( name, szLocatorName, 120 * hRoom:GetDepth(), flInitialPortalSpawnDelay, flInitialSummonTime, flPortalIntervalInput, flScaleInput, + { + { + EntityName = "npc_dota_creature_bandit_archer", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 200.0, + }, + { + EntityName = "npc_dota_creature_bandit_captain", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 200.0, + }, + } + )) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bandits:GetPreviewUnit() + return "npc_dota_creature_bandit_captain" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bandits:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "destroy_spawning_portals", 0, self.nTotalPortals ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bandits:GetMaxSpawnedUnitCount() + local nCount = 0 + local hPeonSpawners = self:GetSpawner( self.szPreplacedSpawner ) + if hPeonSpawners then + nCount = nCount + hPeonSpawners:GetSpawnPositionCount() * 3 + end + + for _,hPortalSpawner in pairs ( self.PortalSpawners ) do + for _,rgUnitInfo in pairs ( hPortalSpawner.rgUnitsInfo ) do + nCount = nCount + rgUnitInfo.Count + end + end + + print( 'CMapEncounter_Bandits:GetMaxSpawnedUnitCount() calculated ' .. nCount .. ' units' ) + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bandits:Start() + CMapEncounter.Start( self ) + + self:StartSpawnerSchedule( self.szPreplacedSpawner, 0 ) + self:StartSpawnerSchedule( self.szGroupSpawner, 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bandits:OnThink() + CMapEncounter.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bandits:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + --print( "CMapEncounter_Bandits:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + else + print( "CMapEncounter_Bandits:OnSpawnerFinished: WARNING: Can't find a living hero" ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Bandits diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_big_ogres.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_big_ogres.lua new file mode 100755 index 0000000..cedc70f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_big_ogres.lua @@ -0,0 +1,119 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_BigOgres == nil then + CMapEncounter_BigOgres = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BigOgres:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self.szPeonSpawner = "spawner_peon" + self.szCaptainSpawner = "spawner_captain" + + self:AddSpawner( CDotaSpawner( self.szPeonSpawner, self.szPeonSpawner, + { + { + EntityName = "npc_dota_creature_ogre_seer", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 150.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( self.szCaptainSpawner, self.szCaptainSpawner, + { + { + EntityName = "npc_dota_creature_ogre_tank_boss", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + self.vMagiSchedule = + { + { + Time = 10, + Count = 1, + }, + { + Time = 25, + Count = 2, + }, + { + Time = 40, + Count = 3, + }, + } + + local bInvulnerable = true + + self.szDynamicPortal = "dynamic_portal" + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szDynamicPortal, self.szDynamicPortal, 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_ogre_seer", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( self.szDynamicPortal, self.vMagiSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BigOgres:GetPreviewUnit() + return "npc_dota_creature_ogre_tank" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BigOgres:Start() + CMapEncounter.Start( self ) + + for _, hSpawner in pairs( self:GetSpawners() ) do + hSpawner:SpawnUnits() + end + + self:StartSpawnerSchedule( self.szDynamicPortal, 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BigOgres:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + --print( "CMapEncounter_BigOgres:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_BigOgres diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bomb_squad.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bomb_squad.lua new file mode 100755 index 0000000..16837ed --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bomb_squad.lua @@ -0,0 +1,137 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Bomb_Squad == nil then + CMapEncounter_Bomb_Squad = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + + +function CMapEncounter_Bomb_Squad:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self.vPudgeSchedule = + { + { + Time = 0, + Count = 2, + }, + { + Time = 40, + Count = 3, + }, + { + Time = 80, + Count = 4, + }, + } + + self.vBombSquadSchedule = + { + { + Time = 0, + Count = 1, + }, + { + Time = 40, + Count = 2, + }, + { + Time = 80, + Count = 2, + }, + + } + + self.szPeonSpawner = "spawner_peon" + self.szCaptainSpawner = "spawner_captain" + local bInvulnerable = true + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szPeonSpawner, self.szPeonSpawner, 60 * hRoom:GetDepth(), 5, 1.0, + { + { + EntityName = "npc_aghsfort_creature_walrus_pudge", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szCaptainSpawner, self.szCaptainSpawner, 60 * hRoom:GetDepth(), 5, 1.0, + { + { + EntityName = "npc_aghsfort_creature_bomb_squad", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( self.szPeonSpawner, self.vPudgeSchedule ) + self:SetSpawnerSchedule( self.szCaptainSpawner, self.vBombSquadSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bomb_Squad:GetPreviewUnit() + return "npc_aghsfort_creature_bomb_squad" +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bomb_Squad:Start() + CMapEncounter.Start( self ) + + for _, hSpawner in pairs( self:GetSpawners() ) do + hSpawner:SpawnUnits() + end + + self:StartSpawnerSchedule( self.szPeonSpawner, 0 ) + self:StartSpawnerSchedule( self.szCaptainSpawner, 0 ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bomb_Squad:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "survive_waves", 0, #self.vPudgeSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bomb_Squad:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner.szSpawnerName == "spawner_peon" then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end +end +-------------------------------------------------------------------------------- + +function CMapEncounter_Bomb_Squad:MustKillForEncounterCompletion( hEnemyCreature ) + if hEnemyCreature:GetUnitName() == "npc_aghsfort_creature_bomb_squad_landmine" then + return false + end + if hEnemyCreature:GetUnitName() == "npc_aghsfort_creature_bomb_squad_stasis_trap" then + return false + end + return true +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Bomb_Squad diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bombers.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bombers.lua new file mode 100755 index 0000000..7562edd --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bombers.lua @@ -0,0 +1,228 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Bombers == nil then + CMapEncounter_Bombers = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bombers:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + local bInvulnerable = true + local nWaves = 8 + local flFirstWaveSpawnDelay = 0.0 + local flTimeBetweenWaves = 9.0 + + self.vWave1Schedule = + { + { + Time = 0, + Count = 1, + }, + { + Time = 30, + Count = 1, + }, + { + Time = 60, + Count = 1, + }, + } + + self.vWave2Schedule = + { + { + Time = 20, + Count = 1, + }, + { + Time = 40, + Count = 1, + }, + { + Time = 60, + Count = 1, + }, + } + + self.vWave3Schedule = + { + { + Time = 10, + Count = 2, + }, + { + Time = 50, + Count = 2, + }, + } + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "wave_1", "spawner_peon", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_bomber", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 300.0, + }, + { + EntityName = "npc_dota_creature_gyrocopter", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "wave_2", "spawner_peon", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_bomber", + Team = DOTA_TEAM_BADGUYS, + Count = 5, + PositionNoise = 300.0, + }, + { + EntityName = "npc_dota_creature_gyrocopter", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "wave_3", "spawner_peon", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_bomber", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 300.0, + }, + { + EntityName = "npc_dota_creature_gyrocopter", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable ) ) + + self:SetSpawnerSchedule( "wave_1", self.vWave1Schedule ) + self:SetSpawnerSchedule( "wave_2", self.vWave2Schedule ) + self:SetSpawnerSchedule( "wave_3", self.vWave3Schedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bombers:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_gyrocopter", context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_rattletrap", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_gyrocopter.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_rattletrap.vsndevts", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bombers:GetPreviewUnit() + return "npc_dota_creature_bomber" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bombers:OnEncounterLoaded() + CMapEncounter.OnEncounterLoaded( self ) + + self.szObjectiveEnts = "objective" + self.hObjectiveEnts = self:GetRoom():FindAllEntitiesInRoomByName( self.szObjectiveEnts, true ) + + if #self.hObjectiveEnts == 0 then + printf( "WARNING - self.hObjectiveEnt is nil (looked for classname \"%s\")", self.szObjectiveEnts ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bombers:Start() + CMapEncounter.Start( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bombers:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "survive_waves", 0, #self.vWave1Schedule + #self.vWave2Schedule + #self.vWave3Schedule ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bombers:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bombers:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner.szLocatorName == "spawner_peon" then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end + + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + --print( heroes ) + + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + elseif #self.hObjectiveEnts > 0 then + print( "Can't find a hero to attack - setting a goal position to Objective Entity" ) + hSpawnedUnit:SetInitialGoalPosition( self.hObjectiveEnts[1]:GetOrigin() ) + end + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Bombers:OnTriggerStartTouch( event ) + CMapEncounter.OnTriggerStartTouch( self, event ) + + -- Get the trigger that activates the room + local szTriggerName = event.trigger_name + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + + printf( "szTriggerName: %s, hUnit:GetUnitName(): %s, hTriggerEntity:GetName(): %s", szTriggerName, hUnit:GetUnitName(), hTriggerEntity:GetName() ) + + if self.bCreatureSpawnsActivated == nil and szTriggerName == "trigger_spawn_creatures" then + self.bCreatureSpawnsActivated = true + + self:StartAllSpawnerSchedules( 0 ) + + printf( "Unit \"%s\" triggered creature spawning!", hUnit:GetUnitName() ) + EmitGlobalSound( "RoundStart" ) + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Bombers diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bonus_base.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bonus_base.lua new file mode 100755 index 0000000..d2a9c1b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bonus_base.lua @@ -0,0 +1,133 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_BonusBase == nil then + CMapEncounter_BonusBase = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusBase:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self.bGameStarted = false + self.PlayerGoldCollected = {} + self.flEndTime = 9999999999999 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusBase:Precache( context ) + CMapEncounter.Precache( self, context ) +end +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusBase:OnEncounterLoaded() + CMapEncounter.OnEncounterLoaded( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusBase:GetMaxSpawnedUnitCount() + return 0 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusBase:Start() + CMapEncounter.Start( self ) + + self.nItemPickedUpListener = ListenToGameEvent( "dota_item_picked_up", Dynamic_Wrap( getclass( self ), "OnItemPickedUp" ), self ) + self.nGoldReward = 0 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusBase:StartBonusRound( flTimeLimit ) + EmitGlobalSound( "RoundStart" ) + + self.bGameStarted = true + self.flEndTime = GameRules:GetGameTime() + flTimeLimit + + for nPlayerID=0,AGHANIM_PLAYERS-1 do + self.PlayerGoldCollected[ nPlayerID ] = {} + self.PlayerGoldCollected[ nPlayerID ][ "bags" ] = 0 + self.PlayerGoldCollected[ nPlayerID ][ "gold" ] = 0 + end + + local BonusStartData = {} + BonusStartData[ "end_time" ] = self.flEndTime + CustomNetTables:SetTableValue( "encounter_state", "bonus", self.PlayerGoldCollected ) + CustomGameEventManager:Send_ServerToAllClients( "bonus_start", BonusStartData ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusBase:OnComplete() + CMapEncounter.OnComplete( self ) + + StopListeningToGameEvent( self.nItemPickedUpListener ) + + for nPlayerID=0,AGHANIM_PLAYERS-1 do + CenterCameraOnUnit( nPlayerID, PlayerResource:GetSelectedHeroEntity( nPlayerID ) ) + end + + CustomGameEventManager:Send_ServerToAllClients( "bonus_complete", self.PlayerGoldCollected ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusBase:OnThink() + CMapEncounter.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusBase:CheckForCompletion() + return GameRules:GetGameTime() > self.flEndTime +end + +--------------------------------------------------------- +-- dota_item_picked_up +-- * PlayerID +-- * HeroEntityIndex +-- * UnitEntityIndex (only if parent is not a hero) +-- * itemname +-- * ItemEntityIndex +--------------------------------------------------------- + +function CMapEncounter_BonusBase:OnItemPickedUp( event ) + local item = EntIndexToHScript( event.ItemEntityIndex ) + local hCollector = nil + + if event.HeroEntityIndex then + hCollector = EntIndexToHScript( event.HeroEntityIndex ) + elseif event.UnitEntityIndex then + hCollector = EntIndexToHScript( event.UnitEntityIndex ) + end + + if hCollector and item and item:GetAbilityName() == "item_bag_of_gold" then + --printf( "hCollector name: %s", hCollector:GetUnitName() ) + --printf( "hCollector player id: %d", hCollector:GetPlayerID() ) + --printf( "self.PlayerGoldCollected table: " ) + --PrintTable( self.PlayerGoldCollected, " -- " ) + + if not self.PlayerGoldCollected or #self.PlayerGoldCollected <= 0 then + printf( "WARNING - self.PlayerGoldCollected is nil or empty" ) + return + end + + --printf( "encounter name: %s", self:GetEncounter():GetName() ) + self.PlayerGoldCollected[ hCollector:GetPlayerID() ][ "bags" ] = self.PlayerGoldCollected[ hCollector:GetPlayerID() ][ "bags" ] + 1 + self.PlayerGoldCollected[ hCollector:GetPlayerID() ][ "gold" ] = self.PlayerGoldCollected[ hCollector:GetPlayerID() ][ "gold" ] + item:GetCurrentCharges() + + CustomNetTables:SetTableValue( "encounter_state", "bonus", self.PlayerGoldCollected ) + end +end + +----------------------------------------- + +return CMapEncounter_BonusBase diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bonus_chicken.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bonus_chicken.lua new file mode 100755 index 0000000..d3dbf40 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_bonus_chicken.lua @@ -0,0 +1,74 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "encounters/encounter_bonus_base" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_BonusChicken == nil then + CMapEncounter_BonusChicken = class( {}, {}, CMapEncounter_BonusBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusChicken:constructor( hRoom, szEncounterName ) + CMapEncounter_BonusBase.constructor( self, hRoom, szEncounterName ) + + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_bonus_chicken", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 200.0, + }, + } ) ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusChicken:GetPreviewUnit() + return "npc_dota_creature_bonus_chicken" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusChicken:OnEncounterLoaded() + CMapEncounter_BonusBase.OnEncounterLoaded( self ) + self:SetupBristlebackShop( false ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusChicken:OnTriggerStartTouch( event ) + CMapEncounter_BonusBase.OnTriggerStartTouch( self, event ) + + local szTriggerName = event.trigger_name + local hUnit = EntIndexToHScript( event.activator_entindex ) + + if self.bGameStarted == false and szTriggerName == "trigger_spawn_creatures" then + self:GetSpawner( "spawner_peon" ):SpawnUnits() + self:StartBonusRound( 45.0 ) + + EmitGlobalSound( "BonusRoom.ChaseMusicLoop" ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusChicken:CheckForCompletion() + return self.bGameStarted == true and not self:HasRemainingEnemies() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BonusChicken:OnComplete() + CMapEncounter_BonusBase.OnComplete( self ) + + StopGlobalSound( "BonusRoom.ChaseMusicLoop" ) +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_BonusChicken diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_boss_base.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_boss_base.lua new file mode 100755 index 0000000..dec0063 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_boss_base.lua @@ -0,0 +1,456 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +_G.BOSS_SPEECH_COOLDOWN = 7.0 +_G.BOSS_LAUGH_COOLDOWN = 20.0 + +-------------------------------------------------------------------------------- + +if CMapEncounter_BossBase == nil then + CMapEncounter_BossBase = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + self.bBossIntroduced = false + self.bBossFightStarted = false + self.bBossKilled = false + + self.flBossSpeechCooldown = -1 + self.flBossNextLaughTime = -1 + + self.flBossIntroEndTime = 9999999999999999999999 + self.Bosses = {} +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:OnThink() + CMapEncounter.OnThink( self ) + + if self.bBossIntroduced == false then + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + for _,hBoss in pairs( self.Bosses ) do + if hPlayerHero:CanEntityBeSeenByMyTeam( hBoss ) then + self:IntroduceBoss( hBoss ) + return + end + end + end + end + + return + end + + local flNow = GameRules:GetGameTime() + if self.bBossIntroduced and self.flBossIntroEndTime > flNow then + return + end + + if not self.bBossFightStarted and flNow > self.flBossIntroEndTime then + self:StartBossFight() + return + end + + if self.bBossFightStarted and flNow > self.flBossNextLaughTime then + local szLaughLine = self:GetLaughLine() + if szLaughLine ~= nil then + self:BossSpeak( szLaughLine ) + self.flBossNextLaughTime = flNow + BOSS_LAUGH_COOLDOWN + end + end + + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + local hVisionBuff = hPlayerHero:FindModifierByName( "modifier_provide_vision" ) + if hVisionBuff == nil then + for _,hBoss in pairs( self.Bosses ) do + if hBoss and hBoss:IsNull() == false and hBoss:IsAlive() then + hPlayerHero:AddNewModifier( hBoss, nil, "modifier_provide_vision", { duration = -1 } ) + break + end + end + end + end + end + + self:UpdateBossHP() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:UpdateBossHP() + local flHPResolution = 500.0; + + local netTable = {} + local nEntIndex = -1; + local szUnitName = self:GetBossUnitName(); + + local flMaxHP = 0 + local flCurHP = 0 + local flBossHP = 0 + local bAnyActive = false + + for _,hBoss in pairs ( self.Bosses ) do + if hBoss and not hBoss:IsNull() then + if hBoss:IsAlive() then + bAnyActive = true + flCurHP = flCurHP + hBoss:GetHealth() + end + flMaxHP = flMaxHP + hBoss:GetMaxHealth() + nEntIndex = hBoss:entindex() + end + end + + flBossHP = math.floor( flHPResolution * ( flCurHP / flMaxHP ) ) / flHPResolution; + + CustomNetTables:SetTableValue( "boss_net_table", "current_boss", { active=bAnyActive, hp = flBossHP, ent_index=nEntIndex, unit_name=szUnitName } ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetBossUnitName() + return self:GetPreviewUnit() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetBossUnits() + return self.Bosses +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:OnBossSpawned( hBoss ) + hBoss.bIsBoss = true + hBoss:SetAbsAngles( 0, 270, 0 ) + hBoss:AddNewModifier( hPlayerHero, nil, "modifier_boss_intro", {} ) + hBoss:RemoveAbility( "ability_ascension" ) + hBoss:RemoveModifierByName( "modifier_ascension" ) + + table.insert( self.Bosses, hBoss ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetBossIntroGesture() + return ACT_DOTA_VICTORY +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetBossIntroCameraPitch() + return 30 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetBossIntroCameraDistance() + return 800 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetBossIntroCameraHeight() + return 50 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetBossIntroCameraYawRotateSpeed() + return 0.1 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetBossIntroCameraInitialYaw() + return 120 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetBossIntroDuration() + return 4.0 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetBossIntroVoiceLine() + return nil +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:IntroduceBoss( hEncounteredBoss ) + self.bBossIntroduced = true + + for _,hBoss in pairs ( self.Bosses ) do + hBoss:SetAbsAngles( 0, 270, 0 ) + hBoss:AddNewModifier( hBoss, nil, "modifier_provide_vision", { duration = -1 } ) + hBoss:StartGesture( self:GetBossIntroGesture() ) + end + + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + hPlayerHero:AddNewModifier( hPlayerHero, nil, "modifier_boss_intro", { } ) + end + end + + self:AddEncounterObjective( tostring( "defeat_boss_" .. self:GetBossUnitName() ), 0, 0 ) + + local netTable = {} + netTable[ "boss_ent_index" ] = hEncounteredBoss:entindex() + netTable[ "camera_pitch" ] = self:GetBossIntroCameraPitch() + netTable[ "camera_distance" ] = self:GetBossIntroCameraDistance() + netTable[ "camera_height" ] = self:GetBossIntroCameraHeight() + netTable[ "camera_yaw_rotate_speed" ] = self:GetBossIntroCameraYawRotateSpeed() + netTable[ "camera_inital_yaw" ] = self:GetBossIntroCameraInitialYaw() + self.flBossIntroEndTime = GameRules:GetGameTime() + self:GetBossIntroDuration() + + CustomGameEventManager:Send_ServerToAllClients( "boss_intro_begin", netTable ) + + if self:GetBossIntroVoiceLine() ~= nil then + self:BossSpeak( self:GetBossIntroVoiceLine() ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:StartBossFight() + self.nAbilityListener = ListenToGameEvent( "dota_non_player_begin_cast", Dynamic_Wrap( getclass( self ), "OnNonPlayerBeginCast" ), self ) + self.bBossFightStarted = true + self:UpdateBossHP() + + for _,hBoss in pairs ( self.Bosses ) do + --hBoss:RemoveModifierByName( "modifier_boss_intro" + local hBuff = hBoss:FindModifierByName( "modifier_boss_intro" ) + if hBuff then + hBuff:SetDuration( 1.0, false ) + end + hBoss.Encounter = self + hBoss:RemoveGesture( self:GetBossIntroGesture() ) + end + + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + hPlayerHero:RemoveModifierByName( "modifier_boss_intro" ) + end + + local hPlayer = PlayerResource:GetPlayer( nPlayerID ) + if hPlayer then + hPlayer:SetMusicStatus( 2, 1.0 ) -- turn on battle music + end + end + + CustomGameEventManager:Send_ServerToAllClients( "boss_intro_end", netTable ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetMaxSpawnedUnitCount() + return #self.Bosses +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:Start() + CMapEncounter.Start( self ) + + self.nGoldReward = 0 + self.Bosses = {} + + self:GetSpawner( "spawner_boss" ):SpawnUnits() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerName() == "spawner_boss" then + for _,hUnit in pairs ( hSpawnedUnits ) do + if hUnit then + self:OnBossSpawned( hUnit ) + end + end + end +end + +--------------------------------------------------------------------------- + +function CMapEncounter_BossBase:OnEnemyCreatureSpawned( hEnemyCreature ) + CMapEncounter.OnEnemyCreatureSpawned( self, hEnemyCreature ) +end + + +--------------------------------------------------------------------------- + +function CMapEncounter_BossBase:OnEntityKilled( event ) + CMapEncounter.OnEntityKilled( self, event ) + + local hVictim = nil + local hAttacker = nil + local hInflictor = nil + if event.entindex_killed ~= nil then + hVictim = EntIndexToHScript( event.entindex_killed ) + end + if event.entindex_attacker ~= nil then + hAttacker = EntIndexToHScript( event.entindex_attacker ) + end + if event.entindex_inflictor ~= nil then + hInflictor = EntIndexToHScript( event.entindex_inflictor ) + end + + if hVictim ~= nil then + if hVictim.bIsBoss == true then + self:OnBossKilled( hVictim, hAttacker ) + end + + if hVictim:IsRealHero() and hAttacker.bIsBoss == true then + self:BossSpeak( self:GetKillTauntLine() ) + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:OnBossKilled( hBoss, hAttacker ) + for k,Boss in pairs ( self.Bosses ) do + if hBoss == Boss then + table.remove( self.Bosses, k ) + end + end + + if #self.Bosses == 0 then + self.bBossKilled = true + + CustomGameEventManager:Send_ServerToAllClients( "boss_fight_finished", netTable ) + + for i=1,NUM_LIVES_FROM_BOSSES do + self:DropLifeRuneFromUnit( hBoss, hAttacker, false ) + end + + self:DropNeutralItemFromUnit( hBoss, hAttacker, true ) + + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + hPlayerHero:RemoveModifierByName( "modifier_provide_vision" ) + end + + local hPlayer = PlayerResource:GetPlayer( nPlayerID ) + if hPlayer then + hPlayer:SetMusicStatus( 0, 1.0 ) -- go back to laning music + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:OnComplete() + CMapEncounter.OnComplete( self ) + if self.nAbilityListener ~= nil then + StopListeningToGameEvent( self.nAbilityListener ) + end + if self.bBossFightStarted == false then + -- Fix for test encounter + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + hPlayerHero:RemoveModifierByName( "modifier_boss_intro" ) + end + end + self:UpdateBossHP() + CustomGameEventManager:Send_ServerToAllClients( "boss_intro_end", netTable ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:CheckForCompletion() + if self.bBossKilled then + return true + end + return false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:DestroyRemainingSpawnedUnits() + + -- Necessary to make bosses drop loot in the case of win_encounter + for i = #self.Bosses,1,-1 do + self.Bosses[i]:ForceKill( false ) + end + + CMapEncounter.DestroyRemainingSpawnedUnits( self ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetLaughLine() + return nil +end + +--------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetKillTauntLine() + return nil +end + +--------------------------------------------------------------------------- + +function CMapEncounter_BossBase:GetAbilityUseLine( szAbilityName ) + return nil +end + +--------------------------------------------------------------------------- + +function CMapEncounter_BossBase:BossSpeak( szSoundEvent, bLaugh ) + if szSoundEvent == nil then + print( "CMapEncounter_BossBase:BossSpeak - szSoundEvent is nil! This might be ok if the boss doesn't have a response for this." ) + return + end + + local flNow = GameRules:GetGameTime() + if flNow > self.flBossSpeechCooldown then + self.flBossSpeechCooldown = GameRules:GetGameTime() + BOSS_SPEECH_COOLDOWN + EmitGlobalSound( szSoundEvent ) + end +end + +--------------------------------------------------------- +-- dota_non_player_begin_cast +-- * abilityname +-- * caster_entindex +--------------------------------------------------------- +function CMapEncounter_BossBase:OnNonPlayerBeginCast( event ) + local hCaster = nil + if event.caster_entindex ~= nil and event.abilityname ~= nil then + hCaster = EntIndexToHScript( event.caster_entindex ) + if hCaster ~= nil and hCaster.bIsBoss then + self:BossSpeak( self:GetAbilityUseLine( event.abilityname ) ) + end + end +end + + +-------------------------------------------------------------------------------- + +return CMapEncounter_BossBase diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_boss_timbersaw.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_boss_timbersaw.lua new file mode 100755 index 0000000..95fa9c5 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_boss_timbersaw.lua @@ -0,0 +1,223 @@ +require( "encounters/encounter_boss_base" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_BossTimbersaw == nil then + CMapEncounter_BossTimbersaw = class( {}, {}, CMapEncounter_BossBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossTimbersaw:constructor( hRoom, szEncounterName ) + CMapEncounter_BossBase.constructor( self, hRoom, szEncounterName ) + + GameRules:SetTreeRegrowTime( 30.0 ) + + self:AddSpawner( CDotaSpawner( "spawner_boss", "spawner_boss", + { + { + EntityName = self:GetPreviewUnit(), + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + + }, + } ) ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossTimbersaw:GetPreviewUnit() + return "npc_dota_boss_timbersaw" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossTimbersaw:Precache( context ) + CMapEncounter_BossBase.Precache( self, context ) + + PrecacheUnitByNameSync( "npc_dota_creature_timbersaw_treant", context, -1 ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_shredder", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_shredder.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/voscripts/game_sounds_vo_shredder.vsndevts", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_chakram_aghs.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_chakram_stay.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_shredder/shredder_chakram_return.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossTimbersaw:GetBossIntroVoiceLine() + local nLine = RandomInt( 0, 3 ) + if nLine == 0 then + return "shredder_timb_levelup_04" + end + + if nLine == 1 then + return "shredder_timb_levelup_05" + end + + if nLine == 2 then + return "shredder_timb_levelup_06" + end + + if nLine == 3 then + return "shredder_timb_levelup_07" + end + + return "shredder_timb_levelup_07" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossTimbersaw:OnEncounterLoaded() + CMapEncounter_BossBase.OnEncounterLoaded( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossTimbersaw:OnThink() + CMapEncounter_BossBase.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossTimbersaw:MustKillForEncounterCompletion( hEnemyCreature ) + if hEnemyCreature:GetUnitName() == "npc_dota_creature_timbersaw_treant" then + return false + end + return true +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossTimbersaw:OnBossSpawned( hBoss ) + CMapEncounter_BossBase.OnBossSpawned( self, hBoss ) + + hBoss.AI:SetEncounter( self ) +end + +--------------------------------------------------------------------------- + +function CMapEncounter_BossTimbersaw:OnBossKilled( hBoss, hAttacker ) + CMapEncounter_BossBase.OnBossKilled( self, hBoss, hAttacker ) + + local vecTreants = self:GetRoom():FindAllEntitiesInRoomByName( "npc_dota_furion_treant_4", false ) + if #vecTreants > 0 then + for _,hTreant in pairs ( vecTreants ) do + hTreant:ForceKill( false ) + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossTimbersaw:GetLaughLine() + + local szLines = + { + "shredder_timb_laugh_01", + "shredder_timb_laugh_02", + "shredder_timb_laugh_03", + "shredder_timb_laugh_04", + "shredder_timb_laugh_05", + "shredder_timb_laugh_06", + "shredder_timb_kill_15", + "shredder_timb_kill_16", + "shredder_timb_deny_14", + "shredder_timb_levelup_09", + } + + return szLines[ RandomInt( 1, #szLines ) ] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossTimbersaw:GetKillTauntLine() + local szLines = + { + "shredder_timb_kill_02", + "shredder_timb_kill_03", + "shredder_timb_kill_04", + "shredder_timb_kill_06", + "shredder_timb_kill_07", + "shredder_timb_kill_10", + "shredder_timb_kill_11", + "shredder_timb_kill_12", + } + + return szLines[ RandomInt( 1, #szLines ) ] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossTimbersaw:GetAbilityUseLine( szAbilityName ) + local szLineToUse = self:GetLaughLine() + if szAbilityName == "boss_timbersaw_whirling_death" then + local szLines = + { + "shredder_timb_whirlingdeath_01", + "shredder_timb_whirlingdeath_02", + "shredder_timb_whirlingdeath_03", + "shredder_timb_whirlingdeath_04", + "shredder_timb_whirlingdeath_05", + "shredder_timb_whirlingdeath_06", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + if szAbilityName == "boss_timbersaw_timber_chain" then + local szLines = + { + "shredder_timb_timberchain_01", + "shredder_timb_timberchain_02", + "shredder_timb_timberchain_05", + "shredder_timb_timberchain_04", + "shredder_timb_timberchain_07", + "shredder_timb_timberchain_08", + "shredder_timb_timberchain_09", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + if szAbilityName == "boss_timbersaw_chakram_dance" then + local szLines = + { + "shredder_timb_attack_08", + "shredder_timb_attack_07", + "shredder_timb_attack_05", + "shredder_timb_attack_03", + "shredder_timb_attack_02", + "shredder_timb_cast_01", + "shredder_timb_levelup_10", + "shredder_timb_levelup_11", + "shredder_timb_levelup_12", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + if szAbilityName == "shredder_chakram" then + local szLines = + { + "shredder_timb_chakram_01", + "shredder_timb_chakram_02", + "shredder_timb_chakram_03", + "shredder_timb_chakram_04", + "shredder_timb_chakram_05", + "shredder_timb_chakram_06", + "shredder_timb_chakram_07", + "shredder_timb_chakram_08", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + + return szLineToUse +end + + +-------------------------------------------------------------------------------- + +return CMapEncounter_BossTimbersaw diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_boss_visage.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_boss_visage.lua new file mode 100755 index 0000000..cf1b0aa --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_boss_visage.lua @@ -0,0 +1,160 @@ +require( "encounters/encounter_boss_base" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_BossVisage == nil then + CMapEncounter_BossVisage = class( {}, {}, CMapEncounter_BossBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVisage:constructor( hRoom, szEncounterName ) + CMapEncounter_BossBase.constructor( self, hRoom, szEncounterName ) + + self:AddSpawner( CDotaSpawner( "spawner_boss", "spawner_boss", + { + { + EntityName = self:GetPreviewUnit(), + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_familiar", "spawner_familiar", + { + { + EntityName = "npc_dota_boss_visage_familiar", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_familiar_statue_east", "spawner_familiar_statue_east", + { + { + EntityName = "npc_dota_boss_visage_familiar_statue", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_familiar_statue_west", "spawner_familiar_statue_west", + { + { + EntityName = "npc_dota_boss_visage_familiar_statue", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + + }, + } ) ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVisage:GetPreviewUnit() + return "npc_dota_boss_visage" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVisage:Precache( context ) + CMapEncounter_BossBase.Precache( self, context ) + + PrecacheUnitByNameSync( "npc_dota_boss_visage_familiar", context, -1 ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_visage", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_visage.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/voscripts/game_sounds_vo_visage.vsndevts", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVisage:OnEncounterLoaded() + CMapEncounter_BossBase.OnEncounterLoaded( self ) + + self.vecFamiliars = self:GetSpawner( "spawner_familiar" ):SpawnUnits() + self.vecFamiliarStatuesWest = self:GetSpawner( "spawner_familiar_statue_west" ):SpawnUnits() + self.vecFamiliarStatuesEast = self:GetSpawner( "spawner_familiar_statue_east" ):SpawnUnits() + for _,Familiar in pairs ( self.vecFamiliars ) do + Familiar:FaceTowards( self:GetSpawner( "spawner_boss" ):GetSpawners()[1]:GetAbsOrigin() ) + end + + for _,StatueWest in pairs ( self.vecFamiliarStatuesWest ) do + StatueWest:SetAbsAngles( 0, 0, 0 ) + end + + for _,StatueEast in pairs ( self.vecFamiliarStatuesEast ) do + StatueEast:SetAbsAngles( 0, 180, 0 ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVisage:OnThink() + CMapEncounter_BossBase.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVisage:MustKillForEncounterCompletion( hEnemyCreature ) + if hEnemyCreature:GetUnitName() == "npc_dota_boss_visage_familiar" then + return false + end + if hEnemyCreature:GetUnitName() == "npc_dota_boss_visage_familiar_statue" then + return false + end + return true +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVisage:OnBossSpawned( hBoss ) + CMapEncounter_BossBase.OnBossSpawned( self, hBoss ) + hBoss.AI:SetEncounter( self ) + hBoss.WestStatues = self.vecFamiliarStatuesWest + hBoss.EastStatues = self.vecFamiliarStatuesEast + + for _,Familiar in pairs ( self.vecFamiliars ) do + Familiar:FaceTowards( self:GetSpawner( "spawner_boss" ):GetSpawners()[1]:GetAbsOrigin() ) + Familiar:FindAbilityByName( "boss_visage_familiar_stone_form" ):OnSpellStart() + end + + for _,StatueWest in pairs ( self.vecFamiliarStatuesWest ) do + StatueWest:FindAbilityByName( "boss_visage_familiar_stone_form" ):OnSpellStart() + end + + for _,StatueEast in pairs ( self.vecFamiliarStatuesEast ) do + StatueEast:FindAbilityByName( "boss_visage_familiar_stone_form" ):OnSpellStart() + end +end + +--------------------------------------------------------------------------- + +function CMapEncounter_BossVisage:OnBossKilled( hBoss, hAttacker ) + CMapEncounter_BossBase.OnBossKilled( self, hBoss, hAttacker ) + + for _,Familiar in pairs ( self.vecFamiliars ) do + Familiar:ForceKill( false ) + end + + for _,StatueWest in pairs ( self.vecFamiliarStatuesWest ) do + StatueWest:ForceKill( false ) + end + + for _,StatueEast in pairs ( self.vecFamiliarStatuesEast ) do + StatueEast:ForceKill( false ) + end +end + + +-------------------------------------------------------------------------------- + +return CMapEncounter_BossVisage diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_boss_void_spirit.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_boss_void_spirit.lua new file mode 100755 index 0000000..dfd93dc --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_boss_void_spirit.lua @@ -0,0 +1,263 @@ + +require( "encounters/encounter_boss_base" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_BossVoidSpirit == nil then + CMapEncounter_BossVoidSpirit = class( {}, {}, CMapEncounter_BossBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:constructor( hRoom, szEncounterName ) + CMapEncounter_BossBase.constructor( self, hRoom, szEncounterName ) + + self:AddSpawner( CDotaSpawner( "spawner_boss", "spawner_boss", + { + { + EntityName = self:GetPreviewUnit(), + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + ) ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:GetPreviewUnit() + return "npc_dota_boss_void_spirit" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:Precache( context ) + CMapEncounter_BossBase.Precache( self, context ) + + PrecacheUnitByNameSync( "npc_dota_earth_spirit_statue", context, -1 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:OnEncounterLoaded() + CMapEncounter_BossBase.OnEncounterLoaded( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:Start() + CMapEncounter_BossBase.Start( self ) + + local vEarthSpiritSpawnPos = nil + local hEarthSpiritSpawners = self:GetRoom():FindAllEntitiesInRoomByName( "spawner_earth_spirit", true ) + local hBossSpawners = self:GetRoom():FindAllEntitiesInRoomByName( "spawner_boss", true ) + + self.hEarthSpirits = {} -- had some issue finding these units from Void's ability, so just track them as they get made + for _, hSpawner in pairs( hEarthSpiritSpawners ) do + local vSpawnPos = hSpawner:GetAbsOrigin() + local hEarthSpirit = CreateUnitByName( "npc_dota_earth_spirit_statue", vSpawnPos, true, nil, nil, DOTA_TEAM_BADGUYS ) + if hEarthSpirit ~= nil then + if #hBossSpawners > 0 and hBossSpawners[ 1 ] ~= nil then + -- Initially face statues towards the boss + local vBossPos = hBossSpawners[ 1 ]:GetOrigin() + local vDir = vBossPos - hEarthSpirit:GetOrigin() + vDir.z = 0.0 + vDir = vDir:Normalized() + hEarthSpirit:SetForwardVector( vDir ) + end + + --self:SuppressRewardsOnDeath( hEarthSpirit ) + table.insert( self.hEarthSpirits, hEarthSpirit ) + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:OnThink() + CMapEncounter_BossBase.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:MustKillForEncounterCompletion( hEnemyCreature ) + return true +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:OnBossSpawned( hBoss ) + CMapEncounter_BossBase.OnBossSpawned( self, hBoss ) + + hBoss.AI:SetEncounter( self ) +end + +--------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:OnBossKilled( hBoss, hAttacker ) + CMapEncounter_BossBase.OnBossKilled( self, hBoss, hAttacker ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:GetBossIntroVoiceLine() + local szLines = + { + "void_spirit_voidspir_battle_01_02", + "void_spirit_voidspir_battle_03_02", + "void_spirit_voidspir_battle_04", + "void_spirit_voidspir_battlebegins_01", + "void_spirit_voidspir_battlebegins_02", + "void_spirit_voidspir_battlebegins_03", + "void_spirit_voidspir_battlebegins_04", + "void_spirit_voidspir_inthebag_01", + "void_spirit_voidspir_inthebag_02", + } + + + return szLines[ RandomInt( 1, #szLines ) ] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:GetLaughLine() + + local szLines = + { + "void_spirit_voidspir_laugh_01", + "void_spirit_voidspir_laugh_01_02", + "void_spirit_voidspir_laugh_01_03", + "void_spirit_voidspir_laugh_02", + "void_spirit_voidspir_laugh_03", + "void_spirit_voidspir_laugh_04", + "void_spirit_voidspir_laugh_07", + "void_spirit_voidspir_laugh_08", + "void_spirit_voidspir_laugh_09", + } + + return szLines[ RandomInt( 1, #szLines ) ] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:GetKillTauntLine() + local szLines = + { + "void_spirit_voidspir_kill_06", + "void_spirit_voidspir_kill_08", + "void_spirit_voidspir_kill_09", + "void_spirit_voidspir_kill_10", + "void_spirit_voidspir_kill_13", + "void_spirit_voidspir_kill_14", + "void_spirit_voidspir_kill_15", + "void_spirit_voidspir_kill_16", + "void_spirit_voidspir_kill_18", + } + + return szLines[ RandomInt( 1, #szLines ) ] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:GetAbilityUseLine( szAbilityName ) + local szLineToUse = self:GetLaughLine() + if szAbilityName == "aghsfort_void_spirit_boss_aether_remnant" then + local szLines = + { + "void_spirit_voidspir_ability1_13", + "void_spirit_voidspir_ability1_12", + "void_spirit_voidspir_ability1_11", + "void_spirit_voidspir_ability1_10", + "void_spirit_voidspir_ability1_09", + "void_spirit_voidspir_ability1_08", + "void_spirit_voidspir_ability1_06", + "void_spirit_voidspir_ability1_05", + "void_spirit_voidspir_ability1_03", + "void_spirit_voidspir_ability1_01", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + if szAbilityName == "aghsfort_void_spirit_boss_dissimilate" then + local szLines = + { + "void_spirit_voidspir_ability2_20", + "void_spirit_voidspir_ability2_18", + "void_spirit_voidspir_ability2_17", + "void_spirit_voidspir_ability2_15", + "void_spirit_voidspir_ability2_14", + "void_spirit_voidspir_ability2_13", + "void_spirit_voidspir_ability2_09", + "void_spirit_voidspir_ability2_08", + "void_spirit_voidspir_ability2_07", + "void_spirit_voidspir_ability2_05", + "void_spirit_voidspir_ability2_02", + "void_spirit_voidspir_ability2_01", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + if szAbilityName == "aghsfort_void_spirit_boss_resonant_pulse" then + local szLines = + { + "void_spirit_voidspir_ability3_15", + "void_spirit_voidspir_ability3_14", + "void_spirit_voidspir_ability3_10", + "void_spirit_voidspir_ability3_09", + "void_spirit_voidspir_ability3_08", + "void_spirit_voidspir_ability3_06", + "void_spirit_voidspir_ability3_04", + "void_spirit_voidspir_ability3_03", + "void_spirit_voidspir_ability3_01", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + if szAbilityName == "void_spirit_boss_activate_earth_spirits" then + local szLines = + { + "void_spirit_voidspir_cast_03", + "void_spirit_voidspir_cast_02", + "void_spirit_voidspir_cast_01", + "void_spirit_voidspir_battlebegins_05", + "void_spirit_voidspir_levelup_11_02", + "void_spirit_voidspir_levelup_12", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + if szAbilityName == "aghsfort_void_spirit_boss_astral_step" then + local szLines = + { + "void_spirit_voidspir_ability4_18", + "void_spirit_voidspir_ability4_13", + "void_spirit_voidspir_ability4_12", + "void_spirit_voidspir_ability4_08", + "void_spirit_voidspir_ability4_06", + "void_spirit_voidspir_ability4_04", + "void_spirit_voidspir_ability4_02", + "void_spirit_voidspir_ability4_01", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + + return szLineToUse +end + + + +-------------------------------------------------------------------------------- + +function CMapEncounter_BossVoidSpirit:GetBossIntroGesture() + return ACT_DOTA_TELEPORT +end + + +-------------------------------------------------------------------------------- + +return CMapEncounter_BossVoidSpirit diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_brewmaster.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_brewmaster.lua new file mode 100755 index 0000000..dca7a89 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_brewmaster.lua @@ -0,0 +1,128 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Brewmaster == nil then + CMapEncounter_Brewmaster = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Brewmaster:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_brewmaster", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_brewmaster.vsndevts", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_stormspirit/stormspirit_static_remnant.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_stormspirit.vsndevts", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Brewmaster:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + local bInvulnerable = true + + self:AddSpawner( CDotaSpawner( "spawner_captain_trigger", "spawner_captain_trigger", + { + { + EntityName = "npc_dota_creature_brewmaster_boss", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + } + } ) ) + + self:SetSpawnerSchedule( "spawner_captain_trigger", nil ) + self:SetPortalTriggerSpawner( "spawner_captain_trigger", 0.5 ) + + -- Captain: + self.vCaptainSchedule = + { + { + Time = 0, + Count = 3, + }, + { + Time = 22, + Count = 3, + }, + { + Time = 44, + Count = 3, + }, + } + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "dynamic_portal", "dynamic_portal", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_brewmaster_boss", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( "dynamic_portal", self.vCaptainSchedule ) +end + +function CMapEncounter_Brewmaster:GetPreviewUnit() + return "npc_dota_creature_brewmaster_boss" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Brewmaster:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + self:AddEncounterObjective( "survive_waves", 0, #self.vCaptainSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Brewmaster:ShouldAutoStartGlobalAscensionAbilities() + return false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Brewmaster:Start() + CMapEncounter.Start( self ) + local spawnerFocusPath = self:GenerateSpawnFocusPath( "portal_v2_captain", 300, 1000 ) + self:AssignSpawnFocusPath( "portal_v2_peon", spawnerFocusPath ) + self:AssignSpawnFocusPath( "portal_v2_captain", spawnerFocusPath ) + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Brewmaster:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + if hSpawner.szSpawnerName == "dynamic_portal" then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end + + --print( "CMapEncounter_Brewmaster:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), 1000 ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Brewmaster diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_broodmothers.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_broodmothers.lua new file mode 100755 index 0000000..2601269 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_broodmothers.lua @@ -0,0 +1,224 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) + +require( "spawner" ) +require( "portalspawnerv2" ) +require( "utility_functions" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Broodmothers == nil then + CMapEncounter_Broodmothers = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Broodmothers:Precache( context ) + CMapEncounter.Precache( self, context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_batrider/batrider_flaming_lasso.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Broodmothers:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + -- Pre-placed eggs (done this way to use only a subset of the map spawners) + self.szEggSpawner = "spider_sac_position" + + local nAscLevel = GameRules.Aghanim:GetAscensionLevel() + local nPreplacedSacs = 9 + ( 2 * nAscLevel ) + + self.vEggSchedule = + { + { + Time = 0, + Count = nPreplacedSacs, + }, + } + + self:AddSpawner( CDotaSpawner( self.szEggSpawner, self.szEggSpawner, + { + { + EntityName = "npc_dota_spider_sac", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + ) ) + + self:SetSpawnerSchedule( self.szEggSpawner, self.vEggSchedule ) + + -- Pre-placed broodmothers + self.szBroodmotherSpawner = "preplaced_broodmother" + + self.vBroodmotherSchedule = + { + { + Time = 0, + Count = 5, + }, + } + + self:AddSpawner( CDotaSpawner( self.szBroodmotherSpawner, self.szBroodmotherSpawner, + { + { + EntityName = "npc_dota_creature_broodmother", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + ) ) + + self:SetSpawnerSchedule( self.szBroodmotherSpawner, self.vBroodmotherSchedule ) + + -- Portals + self.vHugeBroodSchedule = + { + { + Time = 34, + Count = 1, + }, + { + Time = 64, + Count = 1, + }, + } + + self.vKidnapperSchedule = + { + { + Time = 10, + Count = 1, + }, + { + Time = 45, + Count = 1, + }, + { + Time = 80, + Count = 1, + }, + { + Time = 115, + Count = 1, + }, + } + + self.szHugeBroodPortal = "portal_huge_brood" + self.szKidnapperPortal = "portal_kidnapper" + + local bInvulnerable = true + local nHealth = 1 + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szHugeBroodPortal, self.szHugeBroodPortal, nHealth, 5, 1.0, + { + { + EntityName = "npc_dota_creature_huge_broodmother", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szKidnapperPortal, self.szKidnapperPortal, nHealth, 5, 1.0, + { + { + EntityName = "npc_dota_creature_kidnap_spider", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( self.szHugeBroodPortal, self.vHugeBroodSchedule ) + self:SetSpawnerSchedule( self.szKidnapperPortal, self.vKidnapperSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Broodmothers:GetPreviewUnit() + return "npc_dota_creature_huge_broodmother" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Broodmothers:Start() + CMapEncounter.Start( self ) + + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Broodmothers:OnThink() + -- We'll pop the eggs when all the important spiders are dead + if self:AreScheduledSpawnsComplete() and not self:HasAnyPortals() then + --printf( "Scheduled spawns are complete and there are no portals" ) + -- Search for enemies remaining + local fSearchRange = 6000 + local vRoomOrigin = self:GetRoom():GetOrigin() + local hCreatures = FindUnitsInRadius( DOTA_TEAM_BADGUYS, vRoomOrigin, nil, fSearchRange, + DOTA_TEAM_BADGUYS, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false + ) + + local nCaptainsRemaining = 0 + for _, hCreature in pairs( hCreatures ) do + if hCreature and ( not hCreature:IsNull() ) and hCreature:IsAlive() then + if hCreature:GetUnitName() == "npc_dota_creature_kidnap_spider" or hCreature:GetUnitName() == "npc_dota_creature_broodmother" or hCreature:GetUnitName() == "npc_dota_creature_huge_broodmother" then + nCaptainsRemaining = nCaptainsRemaining + 1 + end + end + end + + if nCaptainsRemaining == 0 then + --printf( "All the captain spiders are dead" ) + for _, hCreature in pairs( hCreatures ) do + if hCreature:GetUnitName() == "npc_dota_spider_sac" then + --printf( "Popping an egg" ) + hCreature:Kill( nil, nil ) + end + end + end + end + + CMapEncounter.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Broodmothers:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + if hSpawner:GetSpawnerName() == self.szKidnapperPortal then -- kidnap spiders do their own thing, their ai was getting broken by SetInitialGoalEntity + return + end + + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Broodmothers diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_castle_traps.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_castle_traps.lua new file mode 100755 index 0000000..7505dd0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_castle_traps.lua @@ -0,0 +1,46 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "encounters/encounter_trap_base" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_CastleTraps == nil then + CMapEncounter_CastleTraps = class( {}, {}, CMapEncounter_TrapBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_CastleTraps:GetPreviewUnit() + return "npc_dota_spike_trap_ward" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_CastleTraps:CheckForCompletion() + if not IsServer() then + return + end + local bIsComplete = CMapEncounter_TrapBase.CheckForCompletion( self ) + if bIsComplete then + self:DisableTraps() + end + + return bIsComplete +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_CastleTraps:DisableTraps() + --print("Disabling Traps!") + -- Disable any traps in the map + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "disable_traps_relay", false ) + --local hRelays = Entities:FindAllByName( "disable_traps_relay" ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_CastleTraps diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_cliff_pass.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_cliff_pass.lua new file mode 100755 index 0000000..6c26a3c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_cliff_pass.lua @@ -0,0 +1,46 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "encounters/encounter_trap_base" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_CliffPass == nil then + CMapEncounter_CliffPass = class( {}, {}, CMapEncounter_TrapBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_CliffPass:GetPreviewUnit() + return "npc_dota_breathe_fire_trap" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_CliffPass:CheckForCompletion() + if not IsServer() then + return + end + local bIsComplete = CMapEncounter_TrapBase.CheckForCompletion( self ) + if bIsComplete then + self:DisableTraps() + end + + return bIsComplete +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_CliffPass:DisableTraps() + --print("Disabling Traps!") + -- Disable any traps in the map + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "disable_traps_relay", false ) + --local hRelays = Entities:FindAllByName( "disable_traps_relay" ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_CliffPass diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_crypt_traps.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_crypt_traps.lua new file mode 100755 index 0000000..6a44169 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_crypt_traps.lua @@ -0,0 +1,72 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "encounters/encounter_trap_base" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_CryptTraps == nil then + CMapEncounter_CryptTraps = class( {}, {}, CMapEncounter_TrapBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_CryptTraps:Precache( context ) + CMapEncounter.Precache( self, context ) + + PrecacheUnitByNameSync( "npc_dota_observer_ward_crypt", context, -1 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_CryptTraps:GetPreviewUnit() + return "npc_dota_spike_trap_ward" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_CryptTraps:Start() + CMapEncounter_TrapBase.Start( self ) + if not IsServer() then + return + end + local wardUnits = Entities:FindAllByName( "spawner_ward" ) + local wardUnit = "npc_dota_observer_ward_crypt" + for _, spawnerUnit in pairs(wardUnits) do + local hUnit = CreateUnitByName( wardUnit, spawnerUnit:GetAbsOrigin(), true, nil, nil, DOTA_TEAM_GOODGUYS ) + if hUnit ~= nil then + --print("Placing a ward") + hUnit:SetForwardVector( RandomVector( 1 ) ) + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_CryptTraps:CheckForCompletion() + if not IsServer() then + return + end + local bIsComplete = CMapEncounter_TrapBase.CheckForCompletion( self ) + if bIsComplete then + self:DisableTraps() + end + + return bIsComplete +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_CryptTraps:DisableTraps() + --print("Disabling Traps!") + -- Disable any traps in the map + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "disable_traps_relay", false ) + --local hRelays = Entities:FindAllByName( "disable_traps_relay" ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_CryptTraps diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_dark_seer.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_dark_seer.lua new file mode 100755 index 0000000..38c5710 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_dark_seer.lua @@ -0,0 +1,122 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_DarkSeer == nil then + CMapEncounter_DarkSeer = class( {}, {}, CMapEncounter ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_DarkSeer:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_dark_seer", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_dark_seer.vsndevts", context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_lich", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_lich.vsndevts", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DarkSeer:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self:AddSpawner( CDotaSpawner( "spawner_dark_seer", "spawner_dark_seer", + { + { + EntityName = "npc_dota_creature_dark_seer", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_lich", "spawner_lich", + { + { + EntityName = "npc_dota_creature_lich", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_frost_kobold", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 0.0, + }, + } ) ) + +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_DarkSeer:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DarkSeer:GetPreviewUnit() + return "npc_dota_creature_dark_seer" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DarkSeer:Start() + CMapEncounter.Start( self ) + + self:CreateEnemies() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DarkSeer:OnThink() + CMapEncounter.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DarkSeer:CreateEnemies() + for _,Spawner in pairs ( self:GetSpawners() ) do + Spawner:SpawnUnits() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DarkSeer:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + --print( "CMapEncounter_Wildwings:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_DarkSeer diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_dire_siege.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_dire_siege.lua new file mode 100755 index 0000000..82ac6ba --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_dire_siege.lua @@ -0,0 +1,228 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_DireSiege == nil then + CMapEncounter_DireSiege = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DireSiege:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self.hDireCaptain = nil + self.nDireCaptainHealthPercentTrigger = 20 + self.nNumCatapultsToKillForReinforcements = 3 + self.bTriggeredReinforcements = false + + self.szMeleeSpawner = "spawner_melee" + self.szRangedSpawner = "spawner_ranged" + self.szCatapultSpawner = "spawner_catapult" + self.szCaptainSpawner = "spawner_captain" + + self:AddSpawner( CDotaSpawner( self.szMeleeSpawner, self.szMeleeSpawner, + { + { + EntityName = "npc_dota_assault_bad_melee_creep", + Team = DOTA_TEAM_BADGUYS, + Count = 5, + PositionNoise = 250.0, + }, + } ) ) + self:AddSpawner( CDotaSpawner( self.szRangedSpawner, self.szRangedSpawner, + { + { + EntityName = "npc_dota_assault_bad_ranged_creep", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 250.0, + }, + } ) ) + self:AddSpawner( CDotaSpawner( self.szCatapultSpawner, self.szCatapultSpawner, + { + { + EntityName = "npc_dota_creature_catapult", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + self:AddSpawner( CDotaSpawner( self.szCaptainSpawner, self.szCaptainSpawner, + { + { + EntityName = "npc_aghsfort_creature_dire_assault_captain", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + -- reinforcement wave through portals + self:AddPortalSpawnerV2( CPortalSpawnerV2( "portal_ranged", "portal_ranged", 8, 5, 1.0, + { + { + EntityName = "npc_dota_assault_bad_ranged_creep", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 250.0, + }, + }, true + ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "portal_melee", "portal_melee", 8, 5, 1.0, + { + { + EntityName = "npc_dota_assault_bad_melee_creep", + Team = DOTA_TEAM_BADGUYS, + Count = 5, + PositionNoise = 250.0, + }, + }, true + ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "portal_captain", "portal_captain", 8, 5, 1.0, + { + { + EntityName = "npc_aghsfort_creature_dire_assault_captain", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, true + ) ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DireSiege:GetPreviewUnit() + return "npc_dota_creature_catapult" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DireSiege:GetMaxSpawnedUnitCount() + local nCount = 0 + + local hMeleeSpawners = self:GetSpawner( self.szMeleeSpawner ) + if hMeleeSpawners then + nCount = nCount + hMeleeSpawners:GetSpawnPositionCount() + end + + local hRangedSpawners = self:GetSpawner( self.szRangedSpawner ) + if hRangedSpawners then + nCount = nCount + hRangedSpawners:GetSpawnPositionCount() + end + + local hCatapultSpawners = self:GetSpawner( self.szCatapultSpawner ) + if hCatapultSpawners then + nCount = nCount + hCatapultSpawners:GetSpawnPositionCount() + end + + local hCaptainSpawners = self:GetSpawner( self.szCaptainSpawner ) + if hCaptainSpawners then + nCount = nCount + hCaptainSpawners:GetSpawnPositionCount() + end + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DireSiege:Start() + CMapEncounter.Start( self ) + + for _,Spawner in pairs ( self:GetSpawners() ) do + Spawner:SpawnUnits() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DireSiege:SpawnReinforcements() + if self.bTriggeredReinforcements == true then + return + end + + self.bTriggeredReinforcements = true + + self.hDireCaptain = nil + for _, hPortalSpawner in pairs( self.PortalSpawnersV2 ) do + hPortalSpawner:SpawnUnitsFromRandomSpawners( 1 ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DireSiege:OnThink() + CMapEncounter.OnThink( self ) + + if self.bTriggeredReinforcements == true then + return + end + + -- original dire captain is dead or goes below the health percent trigger + if self.hDireCaptain ~= nil and self.hDireCaptain:IsNull() == false then + --print( 'CMapEncounter_DireSiege:OnThink() Dire Assault Captain health percent is ' .. self.hDireCaptain:GetHealthPercent() ) + if self.hDireCaptain:IsAlive() == false or self.hDireCaptain:GetHealthPercent() < self.nDireCaptainHealthPercentTrigger then + self:SpawnReinforcements() + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DireSiege:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + if self.bTriggeredReinforcements == true then + return + end + + -- trigger the reinforcements after killing a set number of catapults + if hVictim and hVictim:GetUnitName() == "npc_dota_creature_catapult" then + self.nNumCatapultsToKillForReinforcements = self.nNumCatapultsToKillForReinforcements - 1 + + if self.nNumCatapultsToKillForReinforcements <= 0 then + self:SpawnReinforcements() + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DireSiege:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + --print( "CMapEncounter_Pinecones:OnSpawnerFinished" ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + if hSpawnedUnit:GetUnitName() == "npc_aghsfort_creature_dire_assault_captain" then + print( 'CMapEncounter_DireSiege:OnSpawnerFinished() - found original Dire Assault Captain') + self.hDireCaptain = hSpawnedUnit + end + end + + elseif hSpawner:GetSpawnerType() == "CPortalSpawnerV2" then + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_DireSiege diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_dragon_knight.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_dragon_knight.lua new file mode 100755 index 0000000..3c61f16 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_dragon_knight.lua @@ -0,0 +1,223 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_DragonKnight == nil then + CMapEncounter_DragonKnight = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DragonKnight:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + local bInvulnerable = true + + self.vWaveSchedule = + { + { + Time = 0, + Count = 1, + }, + { + Time = 20, + Count = 2, + }, + { + Time = 45, + Count = 2, + }, + { + Time = 70, + Count = 2, + }, + } + + --DeepPrintTable( self.vWaveSchedule ) + + self.szPortal = "spawner_peon" + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szPortal, self.szPortal, 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_underlord", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 200.0, + }, + { + EntityName = "npc_dota_creature_dragon_knight", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( "spawner_peon", self.vWaveSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DragonKnight:Precache( context ) + CMapEncounter.Precache( self, context ) + + --[[ + local towerTable = + { + MapUnitName = "npc_dota_holdout_tower_tier2", + teamnumber = DOTA_TEAM_GOODGUYS, + } + ]] + local ogreTable = + { + MapUnitName = "npc_dota_creature_friendly_ogre_tank", + teamnumber = DOTA_TEAM_GOODGUYS, + } + + PrecacheUnitFromTableSync( ogreTable, context ) + + PrecacheResource( "particle", "particles/units/heroes/heroes_underlord/underlord_firestorm_pre.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/heroes_underlord/abyssal_underlord_firestorm_wave.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/heroes_underlord/abyssal_underlord_firestorm_wave_burn.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DragonKnight:GetPreviewUnit() + return "npc_dota_creature_dragon_knight" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DragonKnight:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "survive_waves", 0, #self.vWaveSchedule ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DragonKnight:OnEncounterLoaded() + CMapEncounter.OnEncounterLoaded( self ) + + self.szObjectiveEnts = "objective" + self.hObjectiveEnts = self:GetRoom():FindAllEntitiesInRoomByName( self.szObjectiveEnts, true ) + + if #self.hObjectiveEnts == 0 then + printf( "WARNING - self.hObjectiveEnt is nil (looked for classname \"%s\")", self.szObjectiveEnts ) + return + end + + self.hOgre = CreateUnitByName( "npc_dota_creature_friendly_ogre_tank", self.hObjectiveEnts[1]:GetOrigin(), false, nil, nil, DOTA_TEAM_GOODGUYS ) + + if self.hOgre ~= nil then + self.hOgre:SetForwardVector( RandomVector( 1 ) ) + + local nAscLevel = GameRules.Aghanim:GetAscensionLevel() + self.hOgre:CreatureLevelUp( nAscLevel ) + + self.vGoalPos = self.hOgre:GetAbsOrigin() + else + printf( "WARNING - Failed to spawn the objective entity!" ) + return + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DragonKnight:ShouldAutoStartGlobalAscensionAbilities() + return false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DragonKnight:Start() + CMapEncounter.Start( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DragonKnight:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DragonKnight:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner.szSpawnerName == "spawner_peon" then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end + + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + if self.hOgre ~= nil and ( not self.hOgre:IsNull() ) and self.hOgre:IsAlive() then + hSpawnedUnit:SetInitialGoalEntity( self.hOgre ) + else + if self.hObjectiveEnts[ 1 ] ~= nil and self.hObjectiveEnts[ 1 ]:IsNull() == false then + hSpawnedUnit:SetInitialGoalPosition( self.hObjectiveEnts[ 1 ]:GetOrigin() ) + else + hSpawnedUnit:SetInitialGoalPosition( self.vGoalPos ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DragonKnight:OnTriggerStartTouch( event ) + CMapEncounter.OnTriggerStartTouch( self, event ) + + -- Get the trigger that activates the room + local szTriggerName = event.trigger_name + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + + --printf( "szTriggerName: %s, hUnit:GetUnitName(): %s, hTriggerEntity:GetName(): %s", szTriggerName, hUnit:GetUnitName(), hTriggerEntity:GetName() ) + + if self.bCreatureSpawnsActivated == nil and szTriggerName == "trigger_spawn_creatures" then + self.bCreatureSpawnsActivated = true + + self:StartGlobalAscensionAbilities() + self:StartAllSpawnerSchedules( 0 ) + + --printf( "Unit \"%s\" triggered creature spawning!", hUnit:GetUnitName() ) + EmitGlobalSound( "RoundStart" ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DragonKnight:OnComplete() + CMapEncounter.OnComplete( self ) + + -- If friendly ogre is still alive, grant some rewards and do other stuff + if self.hOgre ~= nil and ( not self.hOgre:IsNull() ) and self.hOgre:IsAlive() then + self.hOgre:Heal( self.hOgre:GetMaxHealth(), nil ) + local nFXIndex = ParticleManager:CreateParticle( "particles/items3_fx/fish_bones_active.vpcf", PATTACH_ABSORIGIN_FOLLOW, self.hOgre ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local nLives = 1 + for i = 1, nLives do + self:DropLifeRuneFromUnit( self.hOgre, nil, true ) + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_DragonKnight diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_drow_ranger_miniboss.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_drow_ranger_miniboss.lua new file mode 100755 index 0000000..8f4d9b5 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_drow_ranger_miniboss.lua @@ -0,0 +1,177 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_DrowRangerMiniboss == nil then + CMapEncounter_DrowRangerMiniboss = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DrowRangerMiniboss:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self.bBossSpawned = false + + self:SetCalculateRewardsFromUnitCount( true ) + + self:AddSpawner( CDotaSpawner( "spawner_boss", "spawner_boss", + { + { + EntityName = self:GetPreviewUnit(), + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) +--[[ + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_drow_ranger_skeleton_archer", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 150.0, + }, + } ) ) +--]] + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_peon", "spawner_peon", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_drow_ranger_skeleton_warrior", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 300.0, + }, + }, true + ) ) + + self.nSkeletonSpawnersToUse = 4 + self.nSkeletonSpawnerIncrement = 2 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DrowRangerMiniboss:GetPreviewUnit() + return "npc_dota_creature_drow_ranger_miniboss" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DrowRangerMiniboss:Precache( context ) + CMapEncounter.Precache( self, context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DrowRangerMiniboss:OnEncounterLoaded() + CMapEncounter.OnEncounterLoaded( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DrowRangerMiniboss:Start() + CMapEncounter.Start( self ) + + self.bBossSpawned = true + self:GetSpawner( "spawner_boss" ):SpawnUnits() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DrowRangerMiniboss:GetMaxSpawnedUnitCount() + + -- count the drow ranger + local nCount = 1 + local nSkeletonSpawnersToUse = self.nSkeletonSpawnersToUse + local nSkeletonSpawnerIncrement = self.nSkeletonSpawnerIncrement + + -- drow is set to go invis 3 times and spawn an increasing number of skeletons + for i = 1, 3 do + local nSkeletonsPerSpawn = self:GetPortalSpawnerV2( "spawner_peon" ):GetSpawnCountPerSpawnPosition() + nCount = nCount + ( nSkeletonSpawnersToUse * nSkeletonsPerSpawn ) + nSkeletonsPerSpawn = nSkeletonsPerSpawn + nSkeletonSpawnerIncrement + end + + print( 'CMapEncounter_DrowRangerMiniboss:GetMaxSpawnedUnitCount() - max unit count is ' .. nCount ) + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DrowRangerMiniboss:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerName() == "spawner_boss" then + for _,hUnit in pairs ( hSpawnedUnits ) do + if hUnit then + --hUnit:AddNewModifier( hUnit, nil, "modifier_provide_vision", { duration = -1 } ) + hUnit.AI:SetEncounter( self ) + end + end + else + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DrowRangerMiniboss:KillSkeletons() + local vecSkeletons = self:GetSpawnedSecondaryUnits() + print( 'Trying to kill ' .. #vecSkeletons .. " Skeletons") + if #vecSkeletons > 0 then + for _,hSkeleton in pairs ( vecSkeletons ) do + print( 'Attempting to kill skeleton' ) + hSkeleton:ForceKill( false ) + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_DrowRangerMiniboss:OnDrowShadowBladed() + print( 'CMapEncounter_DrowRangerMiniboss:OnDrowShadowBladed()' ) + + --self:KillSkeletons() + + self:GetPortalSpawnerV2( "spawner_peon" ):SpawnUnitsFromRandomSpawners( self.nSkeletonSpawnersToUse ) + self.nSkeletonSpawnersToUse = self.nSkeletonSpawnersToUse + self.nSkeletonSpawnerIncrement +end + +-------------------------------------------------------------------------------- +--[[ +function CMapEncounter_DrowRangerMiniboss:MustKillForEncounterCompletion( hEnemyCreature ) + if hEnemyCreature:GetUnitName() == "npc_dota_creature_drow_ranger_skeleton_archer" then + return false + end + + return true +end +--]] +--------------------------------------------------------------------------- + +function CMapEncounter_DrowRangerMiniboss:CheckForCompletion() + --print( 'CMapEncounter_DrowRangerMiniboss:CheckForCompletion() ) + if self.bBossSpawned and not self:HasRemainingEnemies() then + return true + end + return false +end + + +-------------------------------------------------------------------------------- + +return CMapEncounter_DrowRangerMiniboss diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_elemental_tiny.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_elemental_tiny.lua new file mode 100755 index 0000000..f5a201a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_elemental_tiny.lua @@ -0,0 +1,134 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Elemental_Tiny == nil then + CMapEncounter_Elemental_Tiny = class( {}, {}, CMapEncounter ) +end + +function CMapEncounter_Elemental_Tiny:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + local bInvulnerable = true + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_peon", "spawner_peon", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_elemental_tiny", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 100.0, + }, + }, bInvulnerable ) ) + + self:AddSpawner( CDotaSpawner( "spawner_captain_trigger", "spawner_captain_trigger", + { + { + EntityName = "npc_dota_creature_elemental_tiny", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 100.0, + } + }, bInvulnerable ) ) + + self.nCaptains = 5 + +self.vPeonSchedule = + { + { + Time = 1, + Count = 2, + }, + { + Time = 26, + Count = 2, + }, + } + + self:SetPortalTriggerSpawner( "spawner_captain_trigger", 0.8 ) + self:SetSpawnerSchedule( "spawner_captain_trigger", nil ) -- means spawn once when triggered + self:SetSpawnerSchedule( "spawner_peon", self.vPeonSchedule ) + self:SetCalculateRewardsFromUnitCount( true ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Elemental_Tiny:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + self:AddEncounterObjective( "kill_tinies", 0, self.nCaptains ) +end +-------------------------------------------------------------------------------- + +function CMapEncounter_Elemental_Tiny:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + if hVictim and hVictim:GetUnitName() == "npc_dota_creature_elemental_tiny" then + local nCurrentValue = self:GetEncounterObjectiveProgress( "kill_tinies" ) + self:UpdateEncounterObjective( "kill_tinies", nCurrentValue + 1, nil ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Elemental_Tiny:GetPreviewUnit() + return "npc_dota_creature_elemental_tiny" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Elemental_Tiny:Start() + CMapEncounter.Start( self ) + + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Elemental_Tiny:OnThink() + CMapEncounter.OnThink( self ) + + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes <= 0 then + return + end + + --print( "CMapEncounter_Elemental_Tiny:OnThink() - iterating through portal units" ) + for _,hEnemy in pairs( self.SpawnedEnemies ) do + if hEnemy == nil or hEnemy:IsNull() or hEnemy:IsAlive() == false then + goto continue + end + + + ::continue:: + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Elemental_Tiny:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + --print( "CMapEncounter_Elemental_Tiny:OnSpawnerFinished" ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + --local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + --if #heroes > 0 then + -- for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + -- local hero = heroes[RandomInt(1, #heroes)] + -- if hero ~= nil then + -- --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + -- hSpawnedUnit:SetInitialGoalEntity( hero ) + -- end + -- end + --end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Elemental_Tiny diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_empty_beach.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_empty_beach.lua new file mode 100755 index 0000000..31302fb --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_empty_beach.lua @@ -0,0 +1,76 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_EmptyBeach == nil then + CMapEncounter_EmptyBeach = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_EmptyBeach:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheUnitByNameSync( "npc_dota_shop_keeper", context, -1 ) + PrecacheModel("models/items/wards/crab_trap_ward_ward/crab_trap_ward_ward.vmdl", context) + PrecacheModel("models/heroes/bristleback/bristleback_back.vmdl", context) + PrecacheModel("models/heroes/bristleback/bristleback_bracer.vmdl", context) + PrecacheModel("models/heroes/bristleback/bristleback_head.vmdl", context) + PrecacheModel("models/heroes/bristleback/bristleback_necklace.vmdl", context) + PrecacheModel("models/heroes/bristleback/bristleback_weapon.vmdl", context) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_EmptyBeach:OnEncounterLoaded() + CMapEncounter.OnEncounterLoaded( self ) + self:SetupBristlebackShop( true ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_EmptyBeach:OnComplete() + CMapEncounter.OnComplete( self ) + self:SpawnWards() +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_EmptyBeach:GetPreviewUnit() + return "npc_dota_shop_keeper" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_EmptyBeach:CheckForCompletion() + + local connectedPlayers = GameRules.Aghanim:GetConnectedPlayers() + for i=1,#connectedPlayers do + local nPlayerID = connectedPlayers[i] + if GameRules.Aghanim:GetPlayerCurrentRoom( nPlayerID ) ~= self:GetRoom() then + return false + end + end + + return true +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_EmptyBeach:SpawnWards() + local wardUnits = Entities:FindAllByName( "spawner_ward" ) + local wardUnit = "npc_dota_observer_ward_beach" + for _, spawnerUnit in pairs(wardUnits) do + local hUnit = CreateUnitByName( wardUnit, spawnerUnit:GetAbsOrigin(), true, nil, nil, DOTA_TEAM_GOODGUYS ) + if hUnit ~= nil then + --print("Placing a ward") + hUnit:SetForwardVector( RandomVector( 1 ) ) + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_EmptyBeach diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_empty_cavern.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_empty_cavern.lua new file mode 100755 index 0000000..1cd3ba2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_empty_cavern.lua @@ -0,0 +1,54 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_EmptyCavern == nil then + CMapEncounter_EmptyCavern = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_EmptyCavern:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheUnitByNameSync( "npc_dota_shop_keeper", context, -1 ) + PrecacheModel("models/heroes/bristleback/bristleback_back.vmdl", context) + PrecacheModel("models/heroes/bristleback/bristleback_bracer.vmdl", context) + PrecacheModel("models/heroes/bristleback/bristleback_head.vmdl", context) + PrecacheModel("models/heroes/bristleback/bristleback_necklace.vmdl", context) + PrecacheModel("models/heroes/bristleback/bristleback_weapon.vmdl", context) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_EmptyCavern:OnEncounterLoaded() + CMapEncounter.OnEncounterLoaded( self ) + self:SetupBristlebackShop( true ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_EmptyCavern:GetPreviewUnit() + return "npc_dota_shop_keeper" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_EmptyCavern:CheckForCompletion() + + local connectedPlayers = GameRules.Aghanim:GetConnectedPlayers() + for i=1,#connectedPlayers do + local nPlayerID = connectedPlayers[i] + print( ) + if GameRules.Aghanim:GetPlayerCurrentRoom( nPlayerID ) ~= self:GetRoom() then + return false + end + end + + return true +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_EmptyCavern diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_enraged_hellbears.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_enraged_hellbears.lua new file mode 100755 index 0000000..ceafd1d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_enraged_hellbears.lua @@ -0,0 +1,125 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounterEnragedHellbears == nil then + CMapEncounterEnragedHellbears = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounterEnragedHellbears:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self.szPeonSpawner = "spawner_peon" + self.szCaptainSpawner = "spawner_captain" + + self:AddSpawner( CDotaSpawner( self.szPeonSpawner, self.szPeonSpawner, + { + { + EntityName = "npc_dota_creature_small_hellbear", + Team = DOTA_TEAM_BADGUYS, + Count = 7, + PositionNoise = 225.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( self.szCaptainSpawner, self.szCaptainSpawner, + { + { + EntityName = "npc_dota_creature_hellbear", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 75.0, + }, + } ) ) + + self.flEnrageTimer = 60 + +end + +-------------------------------------------------------------------------------- + +function CMapEncounterEnragedHellbears:GetPreviewUnit() + return "npc_dota_creature_hellbear" +end + +-------------------------------------------------------------------------------- + +function CMapEncounterEnragedHellbears:GetMaxSpawnedUnitCount() + local nCount = 0 + local hWarriorSpawners = self:GetSpawner( self.szPeonSpawner ) + if hWarriorSpawners then + nCount = nCount + hWarriorSpawners:GetSpawnPositionCount() * 6 + end + + local hChampionSpawners = self:GetSpawner( self.szCaptainSpawner ) + if hChampionSpawners then + nCount = nCount + hChampionSpawners:GetSpawnPositionCount() + end + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounterEnragedHellbears:Start() + CMapEncounter.Start( self ) + self:CreateEnemies() +end + +-------------------------------------------------------------------------------- + +function CMapEncounterEnragedHellbears:OnThink() + CMapEncounter.OnThink( self ) + local flNow = GameRules:GetGameTime() + + if ( flNow - self.flStartTime ) > self.flEnrageTimer then + + --printf("ENRAGING!!") + + for _,hMob in pairs ( self:GetSpawnedUnits() ) do + + if hMob:GetLevel() < 2 then + --printf("UPGRADING CREATURE %s to level 2", hMob:GetUnitName()) + hMob:CreatureLevelUp(1) + hMob:AddNewModifier( hMob, nil, "modifier_aghsfort_enrage" , {} ) + hMob:SetAcquisitionRange(9000) + end + + local hAbility = hMob:FindAbilityByName("hellbear_smash") + if hAbility then + --printf("UPGRADING ABILITY %s from %d to %d", hAbility:GetAbilityName(), hAbility:GetLevel(), 2 ) + hAbility:SetLevel(2) + end + + end + + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounterEnragedHellbears:CheckForCompletion() + if not self:HasRemainingEnemies() then + return true + end + return false +end + +-------------------------------------------------------------------------------- + +function CMapEncounterEnragedHellbears:CreateEnemies() + for _,Spawner in pairs ( self:GetSpawners() ) do + Spawner:SpawnUnits() + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounterEnragedHellbears diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_enraged_wildwings.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_enraged_wildwings.lua new file mode 100755 index 0000000..36fed99 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_enraged_wildwings.lua @@ -0,0 +1,153 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Enraged_Wildwings == nil then + CMapEncounter_Enraged_Wildwings = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Enraged_Wildwings:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self.szPeonSpawner = "spawner_peon" + self.szCaptainSpawner = "spawner_captain" + self.nCaptains = 6 + local bInvulnerable = true + + self.vWaveSchedule = + { + { + Time = 0, + Count = 2, + }, + { + Time = 36, + Count = 3, + }, + } + + self:AddSpawner( CDotaSpawner( "spawner_captain_trigger", "spawner_captain_trigger", + { + { + EntityName = "npc_aghsfort_creature_enraged_wildwing", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 50.0, + } + } ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szCaptainSpawner, self.szCaptainSpawner, 4, 5, 1.0, + { + { + EntityName = "npc_aghsfort_creature_enraged_wildwing", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 100.0, + }, + { + EntityName = "npc_aghsfort_creature_tornado_harpy", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 100.0, + }, + + + + }, bInvulnerable ) ) + + self:SetPortalTriggerSpawner( "spawner_captain_trigger", 0.8 ) + self:SetSpawnerSchedule( "spawner_captain_trigger", nil ) -- means spawn once when triggered + --self:SetSpawnerSchedule( self.szPeonSpawner, self.vPeonSchedule ) + self:SetSpawnerSchedule( self.szCaptainSpawner, self.vWaveSchedule ) + self:SetCalculateRewardsFromUnitCount( true ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Enraged_Wildwings:GetPreviewUnit() + return "npc_aghsfort_creature_enraged_wildwing" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Enraged_Wildwings:GetMaxSpawnedUnitCount() + local nCount = 0 + local hWarriorSpawners = self:GetSpawner( self.szPeonSpawner ) + if hWarriorSpawners then + nCount = nCount + hWarriorSpawners:GetSpawnPositionCount() * 2 + end + + local hChampionSpawners = self:GetSpawner( self.szCaptainSpawner ) + if hChampionSpawners then + nCount = nCount + hChampionSpawners:GetSpawnPositionCount() + end + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Enraged_Wildwings:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + self:AddEncounterObjective( "kill_wildwings", 0, self.nCaptains ) +end +-------------------------------------------------------------------------------- + +function CMapEncounter_Enraged_Wildwings:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + if hVictim and hVictim:GetUnitName() == "npc_aghsfort_creature_enraged_wildwing" then + local nCurrentValue = self:GetEncounterObjectiveProgress( "kill_wildwings" ) + self:UpdateEncounterObjective( "kill_wildwings", nCurrentValue + 1, nil ) + end +end +-------------------------------------------------------------------------------- + +function CMapEncounter_Enraged_Wildwings:Start() + CMapEncounter.Start( self ) + self:StartAllSpawnerSchedules( 0 ) + + --for _,Spawner in pairs ( self:GetSpawners() ) do + -- if Spawner:GetSpawnerName() == "spawner_peon" then + -- Spawner:SpawnUnitsFromRandomSpawners( Spawner:GetSpawnPositionCount() ) + -- else + -- Spawner:SpawnUnitsFromRandomSpawners( self.nCaptains ) + -- end + --end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Enraged_Wildwings:OnThink() + CMapEncounter.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- + +function CMapEncounter_Enraged_Wildwings:CreateEnemies() + for _,Spawner in pairs ( self:GetSpawners() ) do + Spawner:SpawnUnits() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Enraged_Wildwings:MustKillForEncounterCompletion( hEnemyCreature ) + if hEnemyCreature:GetUnitName() == "npc_aghsfort_creature_enraged_wildwing_tornado" then + return false + end + return true +end + + +-------------------------------------------------------------------------------- + +return CMapEncounter_Enraged_Wildwings diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_fire_roshan.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_fire_roshan.lua new file mode 100755 index 0000000..d5b406d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_fire_roshan.lua @@ -0,0 +1,152 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_FireRoshan == nil then + CMapEncounter_FireRoshan = class( {}, {}, CMapEncounter ) +end + + +function CMapEncounter_FireRoshan:Precache( context ) + CMapEncounter.Precache( self, context ) + + PrecacheUnitByNameSync( "npc_dota_creature_baby_roshan", context, -1 ) + + PrecacheResource( "particle", "particles/units/heroes/hero_jakiro/jakiro_icepath_debuff.vpcf", context ) + PrecacheResource( "particle", "particles/neutral_fx/mini_rosh_fire.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_lich/lich_frost_nova.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_lich/lich_slowed_cold.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_frost_lich.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_burn.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_FireRoshan:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self.nNumBabyRoshans = 3 + + self:AddSpawner( CDotaSpawner( "spawner_fire_roshan", "spawner_fire_roshan", + { + { + EntityName = "npc_dota_creature_fire_roshan", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_ice_roshan", "spawner_ice_roshan", + { + { + EntityName = "npc_dota_creature_ice_roshan", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + local bInvulnerable = true + self.vReinforcementSchedule = + { + { + Time = 5, + Count = 2, + }, + { + Time = 20, + Count = 2, + }, + { + Time = 35, + Count = 2, + }, + { + Time = 50, + Count = 2, + }, + } + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_reinforcements", "spawner_peon", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_baby_roshan", + Team = DOTA_TEAM_BADGUYS, + Count = 4, + PositionNoise = 225.0, + }, + }, bInvulnerable ) ) + + self:SetSpawnerSchedule( "spawner_reinforcements", self.vReinforcementSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_FireRoshan:InitializeObjectives() + self:AddEncounterObjective( "defeat_blazhan", 0, 0 ) + self:AddEncounterObjective( "defeat_frozhan", 0, 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_FireRoshan:GetPreviewUnit() + return "npc_dota_creature_fire_roshan" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_FireRoshan:Start() + CMapEncounter.Start( self ) + + self:CreateUnits() + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_FireRoshan:CreateUnits() + for _,Spawner in pairs ( self:GetSpawners() ) do + local vecUnits = Spawner:SpawnUnits() + for _,hUnit in pairs ( vecUnits ) do + if hUnit:GetUnitName() == "npc_dota_creature_ice_roshan" then + hUnit:SetMaterialGroup( "3" ) + end + if hUnit:GetUnitName() == "npc_dota_creature_fire_roshan" then + hUnit:SetMaterialGroup( "2" ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_FireRoshan:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + print( "CMapEncounter_FireRoshan:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + else + print( "CMapEncounter_FireRoshan:OnSpawnerFinished: WARNING: Can't find a living hero" ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_FireRoshan diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_gauntlet.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_gauntlet.lua new file mode 100755 index 0000000..b01de49 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_gauntlet.lua @@ -0,0 +1,144 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Gauntlet == nil then + CMapEncounter_Gauntlet = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Gauntlet:Precache( context ) + CMapEncounter.Precache( self, context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_grimstroke/grimstroke_ink_swell_buff.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_grimstroke/grimstroke_cast_ink_swell.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_grimstroke/grimstroke_ink_swell_aoe.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_grimstroke/grimstroke_ink_swell_tick_damage.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Gauntlet:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self:AddSpawner( CDotaSpawner( "spawner_lifestealer", "spawner_lifestealer", + { + { + EntityName = "npc_dota_creature_life_stealer", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + ) ) + + self:AddSpawner( CDotaSpawner( "spawner_grimstroke", "spawner_grimstroke", + { + { + EntityName = "npc_dota_creature_grimstroke", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + ) ) + + --[[ + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_gauntlet_skeleton", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 0.0, + }, + } + ) ) + ]] +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Gauntlet:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Gauntlet:GetPreviewUnit() + return "npc_dota_creature_life_stealer" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Gauntlet:Start() + CMapEncounter.Start( self ) + + self:CreateEnemies() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Gauntlet:OnThink() + CMapEncounter.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Gauntlet:CheckForCompletion() + if not self:HasRemainingEnemies() and not self:HasAnyPortals() then + + -- Disable any traps in the map + local hRelays = Entities:FindAllByName( "disable_traps_relay" ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end + + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Gauntlet:CreateEnemies() + for _,Spawner in pairs ( self:GetSpawners() ) do + Spawner:SpawnUnits() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Gauntlet:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + --print( "CMapEncounter_Wildwings:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Gauntlet diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_hellbears.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_hellbears.lua new file mode 100755 index 0000000..929ea05 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_hellbears.lua @@ -0,0 +1,107 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Hellbears == nil then + CMapEncounter_Hellbears = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + local flInitialPortalSpawnDelay = 0.0 + local flInitialSummonTime = 5.0 + local flPortalIntervalInput = DEFAULT_PORTAL_SPAWN_INTERVAL + local flScaleInput = 1.0 + local nNumPortals = 4 + + for i=1,nNumPortals do + local name = string.format( "portal_%i", i ) + + self:AddPortalSpawner( CPortalSpawner( name, "dynamic_portal", 60 * hRoom:GetDepth(), flInitialPortalSpawnDelay, flInitialSummonTime, flPortalIntervalInput, flScaleInput, + { + { + EntityName = "npc_dota_creature_small_hellbear", + Team = DOTA_TEAM_BADGUYS, + Count = 4, + PositionNoise = 0.0, + }, + { + EntityName = "npc_dota_creature_hellbear", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 0.0, + }, + + } ) ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:GetPreviewUnit() + return "npc_dota_creature_hellbear" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:GetMaxSpawnedUnitCount() + local nCount = 0 + local hWarriorSpawners = self:GetSpawner( self.szPeonSpawner ) + if hWarriorSpawners then + nCount = nCount + hWarriorSpawners:GetSpawnPositionCount() * 4 + end + + local hChampionSpawners = self:GetSpawner( self.szCaptainSpawner ) + if hChampionSpawners then + nCount = nCount + hChampionSpawners:GetSpawnPositionCount() * 2 + end + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:OnThink() + CMapEncounter.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:CreateEnemies() + for _,Spawner in pairs ( self:GetSpawners() ) do + Spawner:SpawnUnits() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + --print( "CMapEncounter_Hellbears:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + else + print( "CMapEncounter_Hellbears:OnSpawnerFinished: WARNING: Can't find a living hero" ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Hellbears diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_hellbears_portal_v2.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_hellbears_portal_v2.lua new file mode 100755 index 0000000..4ad46ec --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_hellbears_portal_v2.lua @@ -0,0 +1,217 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Hellbears == nil then + CMapEncounter_Hellbears = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self.vPeonSchedule = + { + { + Time = 5, + Count = 4, + }, + { + Time = 25, + Count = 4, + }, + { + Time = 45, + Count = 6, + }, + { + Time = 65, + Count = 6, + }, + { + Time = 85, + Count = 6, + }, + { + Time = 105, + Count = 8, + }, + { + Time = 125, + Count = 8, + }, + { + Time = 145, + Count = 8, + }, + } + self.vCaptainSchedule = + { + { + Time = 5, + Count = 2, + }, + { + Time = 25, + Count = 2, + }, + { + Time = 45, + Count = 3, + }, + { + Time = 65, + Count = 3, + }, + { + Time = 85, + Count = 3, + }, + { + Time = 105, + Count = 4, + }, + { + Time = 125, + Count = 4, + }, + { + Time = 145, + Count = 4, + }, + } + + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_small_hellbear", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 225.0, + } + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_captain_trigger", "spawner_captain_trigger", + { + { + EntityName = "npc_dota_creature_hellbear", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 225.0, + } + } ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "portal_v2_peon", "portal_v2_peon", 8, 7.5, 0.7, + { + { + EntityName = "npc_dota_creature_small_hellbear", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 0.0, + }, + } ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "portal_v2_captain", "portal_v2_captain", 35, 7.5, 1.3, + { + { + EntityName = "npc_dota_creature_hellbear", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + self:SetPortalTriggerSpawner( "spawner_captain_trigger", 0.5 ) + + self:SetSpawnerSchedule( "spawner_peon", nil ) -- means spawn once when triggered + self:SetSpawnerSchedule( "spawner_captain_trigger", nil ) -- means spawn once when triggered + self:SetSpawnerSchedule( "portal_v2_peon", self.vPeonSchedule ) + self:SetSpawnerSchedule( "portal_v2_captain", self.vCaptainSchedule ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:GetPreviewUnit() + return "npc_dota_creature_hellbear" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:Start() + CMapEncounter.Start( self ) + + local spawnerFocusPath = self:GenerateSpawnFocusPath( "portal_v2_captain", 300, 1000 ) + self:AssignSpawnFocusPath( "portal_v2_peon", spawnerFocusPath ) + self:AssignSpawnFocusPath( "portal_v2_captain", spawnerFocusPath ) + + self:StartAllSpawnerSchedules( 0 ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:InitializeObjectives() + --CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "destroy_spawning_portals", 0, 0 ) + self:AddEncounterObjective( "survive_waves", 0, #self.vCaptainSchedule ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:OnPortalV2Killed( hVictim, hAttacker, nUnitCountSuppressed ) + CMapEncounter.OnPortalV2Killed( self, hVictim, hAttacker, nUnitCountSuppressed ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + nUnitCountSuppressed, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + if hSpawner.szSpawnerName == "portal_v2_captain" then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end + + --print( "CMapEncounter_Hellbears:OnSpawnerFinished " ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Hellbears diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_hellbears_portal_v3.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_hellbears_portal_v3.lua new file mode 100755 index 0000000..0b53eb8 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_hellbears_portal_v3.lua @@ -0,0 +1,217 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Hellbears == nil then + CMapEncounter_Hellbears = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self.vPeonSchedule = + { + { + Time = 5, + Count = 3, + }, + { + Time = 15, + Count = 3, + }, + { + Time = 35, + Count = 3, + }, + { + Time = 50, + Count = 3, + }, + { + Time = 65, + Count = 3, + }, + { + Time = 80, + Count = 4, + }, + { + Time = 95, + Count = 4, + }, + { + Time = 110, + Count = 4, + }, + } + self.vCaptainSchedule = + { + { + Time = 5, + Count = 1, + }, + { + Time = 20, + Count = 2, + }, + { + Time = 35, + Count = 2, + }, + { + Time = 50, + Count = 2, + }, + { + Time = 65, + Count = 2, + }, + { + Time = 80, + Count = 3, + }, + { + Time = 95, + Count = 3, + }, + { + Time = 110, + Count = 3, + }, + } + + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_small_hellbear", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 225.0, + } + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_captain_trigger", "spawner_captain_trigger", + { + { + EntityName = "npc_dota_creature_hellbear", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 225.0, + } + } ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "portal_v2_peon", "portal_v2_peon", 16, 8, 0.8, + { + { + EntityName = "npc_dota_creature_small_hellbear", + Team = DOTA_TEAM_BADGUYS, + Count = 4, + PositionNoise = 0.0, + }, + } ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "portal_v2_captain", "portal_v2_captain", 70, 8, 1.5, + { + { + EntityName = "npc_dota_creature_hellbear", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + self:SetPortalTriggerSpawner( "spawner_captain_trigger", 0.5 ) + + self:SetSpawnerSchedule( "spawner_peon", nil ) -- means spawn once when triggered + self:SetSpawnerSchedule( "spawner_captain_trigger", nil ) -- means spawn once when triggered + self:SetSpawnerSchedule( "portal_v2_peon", self.vPeonSchedule ) + self:SetSpawnerSchedule( "portal_v2_captain", self.vCaptainSchedule ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:GetPreviewUnit() + return "npc_dota_creature_hellbear" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:Start() + CMapEncounter.Start( self ) + + local spawnerFocusPath = self:GenerateSpawnFocusPath( "portal_v2_captain", 300, 1000 ) + self:AssignSpawnFocusPath( "portal_v2_peon", spawnerFocusPath ) + self:AssignSpawnFocusPath( "portal_v2_captain", spawnerFocusPath ) + + self:StartAllSpawnerSchedules( 0 ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:InitializeObjectives() + --CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "destroy_spawning_portals", 0, 0 ) + self:AddEncounterObjective( "survive_waves", 0, #self.vCaptainSchedule ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:OnPortalV2Killed( hVictim, hAttacker, nUnitCountSuppressed ) + CMapEncounter.OnPortalV2Killed( self, hVictim, hAttacker, nUnitCountSuppressed ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + nUnitCountSuppressed, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Hellbears:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + if hSpawner.szSpawnerName == "portal_v2_captain" then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end + + --print( "CMapEncounter_Hellbears:OnSpawnerFinished " ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Hellbears diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_hellfire_canyon.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_hellfire_canyon.lua new file mode 100755 index 0000000..4b3a67f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_hellfire_canyon.lua @@ -0,0 +1,47 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "encounters/encounter_trap_base" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_HellfireCanyon == nil then + CMapEncounter_HellfireCanyon = class( {}, {}, CMapEncounter_TrapBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_HellfireCanyon:GetPreviewUnit() + return "npc_dota_breathe_fire_trap" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_HellfireCanyon:CheckForCompletion() + if not IsServer() then + return + end + local bIsComplete = CMapEncounter_TrapBase.CheckForCompletion( self ) + if bIsComplete then + self:DisableTraps() + end + + return bIsComplete +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_HellfireCanyon:DisableTraps() + --print("Disabling Traps!") + -- Disable any traps in the map + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "disable_traps_relay", false ) + --local hRelays = Entities:FindAllByName( "disable_traps_relay" ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_HellfireCanyon diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_jungle_fire_maze.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_jungle_fire_maze.lua new file mode 100755 index 0000000..ae8353a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_jungle_fire_maze.lua @@ -0,0 +1,46 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "encounters/encounter_trap_base" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_JungleFireMaze == nil then + CMapEncounter_JungleFireMaze = class( {}, {}, CMapEncounter_TrapBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_JungleFireMaze:GetPreviewUnit() + return "npc_dota_breathe_fire_trap" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_JungleFireMaze:CheckForCompletion() + if not IsServer() then + return + end + local bIsComplete = CMapEncounter_TrapBase.CheckForCompletion( self ) + if bIsComplete then + self:DisableTraps() + end + + return bIsComplete +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_JungleFireMaze:DisableTraps() + --print("Disabling Traps!") + -- Disable any traps in the map + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "disable_traps_relay", false ) + --local hRelays = Entities:FindAllByName( "disable_traps_relay" ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_JungleFireMaze diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_jungle_hijinx.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_jungle_hijinx.lua new file mode 100755 index 0000000..0e5870a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_jungle_hijinx.lua @@ -0,0 +1,109 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_JungleHijinx == nil then + CMapEncounter_JungleHijinx = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + + +function CMapEncounter_JungleHijinx:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_huskar", context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_dazzle", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_dazzle.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_huskar.vsndevts", context ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_JungleHijinx:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_wildwing_laborer", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 150.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_dazzle", "spawner_dazzle", + { + { + EntityName = "npc_dota_creature_dazzle", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_huskar", "spawner_huskar", + { + { + EntityName = "npc_dota_creature_huskar", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + self:SetSpawnerSchedule( "spawner_peon", nil ) -- means spawn once when triggered + self:SetSpawnerSchedule( "spawner_dazzle", nil ) -- means spawn once when triggered + self:SetSpawnerSchedule( "spawner_huskar", nil ) -- means spawn once when triggered + +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_JungleHijinx:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_JungleHijinx:GetPreviewUnit() + return "npc_dota_creature_huskar" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_JungleHijinx:Start() + CMapEncounter.Start( self ) + + self:StartAllSpawnerSchedules( 0 ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_JungleHijinx:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerName() == "spawner_huskar" then + for _,hUnit in pairs ( hSpawnedUnits ) do + if hUnit then + local hBurningSpears = hUnit:FindAbilityByName( "huskar_burning_spear" ) + if hBurningSpears then + hBurningSpears:ToggleAutoCast() + end + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_JungleHijinx diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_kunkka_tide.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_kunkka_tide.lua new file mode 100755 index 0000000..57d9faf --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_kunkka_tide.lua @@ -0,0 +1,183 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_KunkkaTide == nil then + CMapEncounter_KunkkaTide = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_KunkkaTide:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_tidehunter", context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_kunkka", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_tidehunter.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_kunkka.vsndevts", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_KunkkaTide:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + local bInvulnerable = true + + self.szPeonSpawner = "spawner_peon" + self.szCaptainSpawner = "spawner_captain" + self.szBossSpawner = "spawner_boss" + + -- Peon: + self.vPeonSchedule = + { + { + Time = 0, + Count = 2, + }, + { + Time = 20, + Count = 2, + }, + { + Time = 40, + Count = 2, + }, + } + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_peon", "spawner_peon", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_tidehunter_mini", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 0.0, + }, + { + EntityName = "npc_dota_creature_tidehunter_medium", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( "spawner_peon", self.vPeonSchedule ) + + -- Captain: + self.vCaptainSchedule = + { + { + Time = 20, + Count = 1, + }, + { + Time = 40, + Count = 1, + }, + } + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_captain", "spawner_captain", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_kunkka_medium", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( "spawner_captain", self.vCaptainSchedule ) + + -- Boss: + self.vBossSchedule = + { + { + Time = 0, + Count = 1, + }, + } + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_boss", "spawner_boss", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_tidehunter_large", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( "spawner_boss", self.vBossSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_KunkkaTide:GetPreviewUnit() + return "npc_dota_creature_tidehunter_medium" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_KunkkaTide:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + --self:AddEncounterObjective( "survive_waves", 0, #self.vPeonSchedule ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_KunkkaTide:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_KunkkaTide:Start() + CMapEncounter.Start( self ) + + --self:StartSpawnerSchedule( self.szPeonSpawner, 6 ) + --self:StartSpawnerSchedule( self.szCaptainSpawner, 6 ) + --self:StartSpawnerSchedule( self.szBossSpawner, 6 ) + + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_KunkkaTide:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + --print( "CMapEncounter_Hellbears:OnSpawnerFinished " ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + else + print( "WARNING: Can't find a living hero and the objective entitiy is missing!" ) + end + end + +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_KunkkaTide diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_legion_commander.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_legion_commander.lua new file mode 100755 index 0000000..57c7589 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_legion_commander.lua @@ -0,0 +1,289 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_LegionCommander == nil then + CMapEncounter_LegionCommander = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_LegionCommander:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self.bInitialSpawn = true + self.bTrapsEnabled = false + self.nTrapTimer = 0 + self:SetCalculateRewardsFromUnitCount( true ) + + local bInvulnerable = true + + -- bespoke version: + self.vPeonSchedule = + { + { + Time = 0, + Count = 2, + }, + { + Time = 20, + Count = 2, + }, + { + Time = 40, + Count = 3, + }, + { + Time = 60, + Count = 3, + }, + } + + --DeepPrintTable( self.vPeonSchedule ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_peon", "spawner_peon", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_gladiator_creep", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 100.0, + }, + { + EntityName = "npc_dota_creature_skywrath_mage", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 100.0, + }, + + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( "spawner_peon", self.vPeonSchedule ) + + -- Captain: + self.vCaptainSchedule = + { + { + Time = 0, + Count = 1, + }, + { + Time = 20, + Count = 1, + }, + { + Time = 40, + Count = 2, + }, + { + Time = 60, + Count = 2, + }, + } + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_captain", "spawner_captain", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_legion_commander", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( "spawner_captain", self.vCaptainSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_LegionCommander:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheUnitByNameSync( "npc_dota_creature_gladiator_creep", context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_skywrath_mage", context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_legion_commander", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_skywrath_mage.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_legion_commander.vsndevts", context ) + PrecacheResource( "particle", "particles/econ/events/ti10/emblem/ti10_emblem_effect_gem_ring.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_LegionCommander:GetPreviewUnit() + return "npc_dota_creature_legion_commander" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_LegionCommander:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "survive_waves", 0, #self.vPeonSchedule ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_LegionCommander:ShouldAutoStartGlobalAscensionAbilities() + return false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_LegionCommander:Start() + CMapEncounter.Start( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_LegionCommander:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_LegionCommander:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + if self.bInitialSpawn == true then + --self:SpawnTowers() + self.bInitialSpawn = false + end + + if hSpawner.szSpawnerName == "spawner_peon" then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end + + --print( "CMapEncounter_Brewmaster:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_LegionCommander:OnTriggerStartTouch( event ) + CMapEncounter.OnTriggerStartTouch( self, event ) + + -- Get the trigger that activates the room + local szTriggerName = event.trigger_name + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + + printf( "szTriggerName: %s, hUnit:GetUnitName(): %s, hTriggerEntity:GetName(): %s", szTriggerName, hUnit:GetUnitName(), hTriggerEntity:GetName() ) + + if self.bCreatureSpawnsActivated == nil and szTriggerName == "trigger_spawn_creatures" then + self.bCreatureSpawnsActivated = true + + self:StartGlobalAscensionAbilities() + self:StartAllSpawnerSchedules( 0 ) + self.bTrapsEnabled = true + + printf( "Unit \"%s\" triggered creature spawning!", hUnit:GetUnitName() ) + EmitGlobalSound( "RoundStart" ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_LegionCommander:OnThink() + CMapEncounter.OnThink( self ) + if self.bTrapsEnabled == true then + self.nTrapTimer = self.nTrapTimer + 1 + end + if self.nTrapTimer == 1 then + self:FireArrowTrap1() + elseif self.nTrapTimer == 2 then + self:FireArrowTrap2() + elseif self.nTrapTimer == 3 then + self:FireArrowTrap3() + elseif self.nTrapTimer == 4 then + self:FireArrowTrap4() + self.nTrapTimer = 0 + end + +end + +function CMapEncounter_LegionCommander:FireArrowTrap1() + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "arrow_trap_01_relay", false ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end +end + +function CMapEncounter_LegionCommander:FireArrowTrap2() + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "arrow_trap_02_relay", false ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end +end + +function CMapEncounter_LegionCommander:FireArrowTrap3() + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "arrow_trap_03_relay", false ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end +end + +function CMapEncounter_LegionCommander:FireArrowTrap4() + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "arrow_trap_04_relay", false ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_LegionCommander:CheckForCompletion() + if self.bInitialSpawn == false then + if not self:HasRemainingEnemies() and self:AreScheduledSpawnsComplete() and not self:HasAnyPortals() then + self.bTrapsEnabled = false + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "disable_traps_relay", false ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end + + return true + end + end + + return false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_LegionCommander:OnComplete() + CMapEncounter.OnComplete( self ) + + local hHeroes = HeroList:GetAllHeroes() + for _, hHero in pairs ( hHeroes ) do + if hHero ~= nil and not hHero:IsNull() and hHero:IsRealHero() then + hHero:RemoveModifierByName( "modifier_legion_commander_duel_damage_boost" ) + end + end +end + + + +-------------------------------------------------------------------------------- + +return CMapEncounter_LegionCommander + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_mirana.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_mirana.lua new file mode 100755 index 0000000..449b807 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_mirana.lua @@ -0,0 +1,157 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Mirana == nil then + CMapEncounter_Mirana = class( {}, {}, CMapEncounter ) +end + +function CMapEncounter_Mirana:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + -- Initial Spawns + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_luna_mini", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 225.0, + } + } ) ) + + -- Wave Spawns + local vPeonSchedule = + { + { + Time = 0, + Count = 4, + }, + { + Time = 16, + Count = 5, + }, + { + Time = 32, + Count = 5, + }, + { + Time = 48, + Count = 5, + }, + { + Time = 64, + Count = 6, + }, + { + Time = 80, + Count = 6, + }, + } + local vCaptainSchedule = + { + { + Time = 0, + Count = 2, + }, + { + Time = 16, + Count = 2, + }, + { + Time = 32, + Count = 2, + }, + { + Time = 48, + Count = 2, + }, + { + Time = 64, + Count = 2, + }, + { + Time = 80, + Count = 3, + }, + } + + local nPeonPortalHealth = 10 * hRoom:GetDepth() + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "portal_v2_peon", "portal_v2_peon", nPeonPortalHealth, 8, 0.7, + { + { + EntityName = "npc_dota_creature_luna_mini", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 0.0, + }, + } ), vPeonSchedule ) + + local nCaptainPortalHealth = 30 * hRoom:GetDepth() + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "portal_v2_captain", "portal_v2_captain", nCaptainPortalHealth, 8, 1.3, + { + { + EntityName = "npc_dota_creature_mirana", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ), vCaptainSchedule ) + + self:SetSpawnerSchedule( "spawner_peon", { { Time = 0, Count = 12 } } ) + self:SetSpawnerSchedule( "portal_v2_peon", vPeonSchedule ) + self:SetSpawnerSchedule( "portal_v2_captain", vCaptainSchedule ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Mirana:GetPreviewUnit() + return "npc_dota_creature_mirana" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Mirana:Start() + CMapEncounter.Start( self ) + + self:StartSpawnerSchedule( "spawner_peon", 0 ) + self:StartSpawnerSchedule( "portal_v2_peon", 4 ) + self:StartSpawnerSchedule( "portal_v2_captain", 4 ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Mirana:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + --print( "CMapEncounter_Hellbears:OnSpawnerFinished " ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + else + print( "WARNING: Can't find a living hero and the objective entitiy is missing!" ) + end + end + +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Mirana diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_morphlings_b.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_morphlings_b.lua new file mode 100755 index 0000000..ab9ae2e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_morphlings_b.lua @@ -0,0 +1,207 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Morphlings_B == nil then + CMapEncounter_Morphlings_B = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Morphlings_B:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self.szPeonSpawner = "spawner_peon" + + self:AddSpawner( CDotaSpawner( self.szPeonSpawner, self.szPeonSpawner, + { + { + EntityName = "npc_dota_creature_tiny_crab", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 225.0, + }, + } ) ) + + self.szPeonPortalV2 = "portal_v2_peon" + self.szCaptainPortalV2 = "portal_v2_captain" + + local vPeonSchedule = + { + { + Time = 5, + Count = 4, + }, + { + Time = 40, + Count = 5, + }, + { + Time = 75, + Count = 6, + }, + { + Time = 110, + Count = 7, + }, + } + + self.vCaptainSchedule = + { + { + Time = 5, + Count = 2, + }, + { + Time = 40, + Count = 3, + }, + { + Time = 75, + Count = 3, + }, + { + Time = 110, + Count = 4, + }, + } + + -- szSpawnerNameInput, nPortalHealthInput, flSummonTimeInput, flScaleInput, rgUnitsInfoInput + + local nSmallPortalHealth = 12 * hRoom:GetDepth() + local nBigPortalHealth = 40 * hRoom:GetDepth() + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szPeonPortalV2, self.szPeonPortalV2, nSmallPortalHealth, 6, 0.7, + { + { + EntityName = "npc_dota_creature_tiny_crab", + Team = DOTA_TEAM_BADGUYS, + Count = 4, + PositionNoise = 0.0, + }, + } ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szCaptainPortalV2, self.szCaptainPortalV2, nBigPortalHealth, 6, 1.3, + { + { + EntityName = "npc_dota_creature_morphling_big", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 0.0, + }, + } ) ) + + self:SetSpawnerSchedule( self.szPeonPortalV2, vPeonSchedule ) + self:SetSpawnerSchedule( self.szCaptainPortalV2, self.vCaptainSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Morphlings_B:InitializeObjectives() + --CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "destroy_spawning_portals", 0, 0 ) + self:AddEncounterObjective( "survive_waves", 0, #self.vCaptainSchedule ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Morphlings_B:GetMaxSpawnedUnitCount() + local nCount = 0 + -- Standing trash + local hPeonSpawners = self:GetSpawner( "spawner_peon") + if hPeonSpawners then + nCount = nCount + hPeonSpawners:GetSpawnPositionCount() * 2 + end + -- Peons = 88 + nCount = nCount + 88 + -- Captains = 24 + nCount = nCount + 24 + -- Total should be 124 + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Morphlings_B:OnPortalV2Killed( hVictim, hAttacker, nUnitCountSuppressed ) + CMapEncounter.OnPortalV2Killed( self, hVictim, hAttacker, nUnitCountSuppressed ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + nUnitCountSuppressed, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Morphlings_B:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +------------ + +-------------------------------------------------------------------------------- + +function CMapEncounter_Morphlings_B:GetPreviewUnit() + return "npc_dota_creature_morphling_big" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Morphlings_B:Start() + CMapEncounter.Start( self ) + + self:CreateUnits() + + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Morphlings_B:CreateUnits() + for _,Spawner in pairs ( self:GetSpawners() ) do + Spawner:SpawnUnits() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Morphlings_B:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + if hSpawner.szSpawnerName == "portal_v2_captain" then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end + + --print( "CMapEncounter_Morphlings_B:OnSpawnerFinished " ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + local hero = heroes[ RandomInt( 1, #heroes ) ] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Morphlings_B diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_morty_transition.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_morty_transition.lua new file mode 100755 index 0000000..b5e2c07 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_morty_transition.lua @@ -0,0 +1,271 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "encounters/encounter_bonus_base" ) + + +-------------------------------------------------------------------------------- + +if CMapEncounter_MortyTransition == nil then + CMapEncounter_MortyTransition = class( {}, {}, CMapEncounter_BonusBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MortyTransition:constructor( hRoom, szEncounterName ) + CMapEncounter_BonusBase.constructor( self, hRoom, szEncounterName ) + + LinkLuaModifier( "modifier_morty_start_passive", "modifiers/creatures/modifier_morty_start_passive", LUA_MODIFIER_MOTION_NONE ) + LinkLuaModifier( "modifier_ride_morty", "modifiers/modifier_ride_morty", LUA_MODIFIER_MOTION_BOTH ) + + self.nGoldPerBag = 25 + self.flMortyTimeLimit = 45.0 + + self:AddSpawner( CDotaSpawner( "morty_spawner", "morty_spawner", + { + { + EntityName = "npc_aghsfort_morty", + Team = DOTA_TEAM_GOODGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MortyTransition:Precache( context ) + CMapEncounter_BonusBase.Precache( self, context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_snapfire/hero_snapfire_cookie_receive.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_snapfire/hero_snapfire_cookie_landing.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_life_stealer/life_stealer_infested_unit.vpcf", context ) + PrecacheResource( "particle", "particles/dev/library/base_follow_absorigin_continuous.vpcf", context ) + PrecacheResource( "particle", "particles/gameplay/location_hint_goal.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_snapfire.vsndevts", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MortyTransition:GetPreviewUnit() + return "npc_aghsfort_morty" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MortyTransition:OnEncounterLoaded() + CMapEncounter_BonusBase.OnEncounterLoaded( self ) + self:SetupBristlebackShop( true ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MortyTransition:InitializeObjectives() + self:AddEncounterObjective( "objective_saddle_up_on_morty", 0, 4 ) + self:AddEncounterObjective( "objective_jump_to_collect_gold", 0, 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MortyTransition:Start() + CMapEncounter_BonusBase.Start( self ) + + self.nAbilityListener = ListenToGameEvent( "dota_non_player_used_ability", Dynamic_Wrap( getclass( self ), "OnNonPlayerUsedAbility" ), self ) + + self.flEndTime = 99999999999999999 + self.Morties = {} + + local hUnits = self:GetSpawner( "morty_spawner" ):SpawnUnits() + local nPlayerID = 0 + for _,hMorty in pairs ( hUnits ) do + + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + hPlayerHero:AddNewModifier( hPlayerHero, nil, "modifier_bonus_room_start", {} ) + end + + hMorty:SetControllableByPlayer( nPlayerID, true ) + hMorty:SetOwner( hPlayerHero ) + local hBuff = hMorty:AddNewModifier( hMorty, nil, "modifier_morty_start_passive", {} ) + if hBuff then + hBuff.Encounter = self + end + + local kv = + { + min_x = self:GetRoom():GetMins().x + 1000, + min_y = self:GetRoom():GetMins().y + 2500, + max_x = self:GetRoom():GetMaxs().x - 3500, + max_y = self:GetRoom():GetMaxs().y - 550, + } + hMorty:AddNewModifier( hMorty, nil, "modifier_morty_leash", kv ) + + table.insert( self.Morties, hMorty ) + + hMorty.nFXIndex = ParticleManager:CreateParticleForPlayer( "particles/gameplay/location_hint_goal.vpcf", PATTACH_WORLDORIGIN, nil, PlayerResource:GetPlayer( nPlayerID ) ) + ParticleManager:SetParticleControl( hMorty.nFXIndex, 0, hMorty:GetAbsOrigin() ) + ParticleManager:SetParticleControl( hMorty.nFXIndex, 1, Vector( 1.0, 0.8, 0.2 ) ) + + local vLocation = hMorty:GetAbsOrigin() + local WorldTextHint = {} + WorldTextHint["hint_text"] = "hint_ride_morty" + WorldTextHint["command"] = 18 -- DOTA_KEYBIND_HERO_MOVE + WorldTextHint["ent_index"] = -1 + WorldTextHint["location_x"] = vLocation.x + WorldTextHint["location_y"] = vLocation.y + WorldTextHint["location_z"] = vLocation.z + + CustomGameEventManager:Send_ServerToPlayer( PlayerResource:GetPlayer( nPlayerID ), "start_world_text_hint", WorldTextHint ) + + nPlayerID = nPlayerID + 1 + end + + self.nGoldForBags = self.nGoldReward * AGHANIM_PLAYERS + self.nGoldReward = 0 + + local hTrigger = self:GetRoom():FindAllEntitiesInRoomByName( "gold_bag_trigger", false ) + if hTrigger[ 1 ] then + local vMins = hTrigger[ 1 ]:GetBoundingMins() + local vMaxs = hTrigger[ 1 ]:GetBoundingMaxs() + vMins = hTrigger[ 1 ]:TransformPointEntityToWorld( vMins ) + vMaxs = hTrigger[ 1 ]:TransformPointEntityToWorld( vMaxs ) + + local flMinHeight = 0 + local flMaxHeight = 128 + + self.GoldBags = {} + for i=1,300 do + local flHeight = flMinHeight + local nHigh = math.random( 0, 1 ) + if nHigh == 1 then + flHeight = flMaxHeight + end + + local vGoldBagPos = Vector( RandomFloat( vMins.x, vMaxs.x ), RandomFloat( vMins.y, vMaxs.y ), vMins.z ) + self.nGoldForBags = self.nGoldForBags - self.nGoldPerBag + + local newItem = CreateItem( "item_bag_of_gold", nil, nil ) + newItem:SetPurchaseTime( 0 ) + newItem:SetCurrentCharges( self.nGoldPerBag ) + + -- Bump the height up by a constant amount over the ground minimally + -- NOTE: We don't have to take flGroundHeight into account here + -- because CreateItemOnPositionSync will automatically drop to ground + flHeight = flHeight + 128 + + -- NOTE: CreateItemOnPositionSync will drop the item to the ground, + -- so the z height is going to be ignored + -- However, LaunchLootRequiredHeight will fix it back up for us. + local drop = CreateItemOnPositionSync( vGoldBagPos, newItem ) + drop:SetModelScale( 1.5 ) + newItem:LaunchLootRequiredHeight( true, flHeight, flHeight, 0.75, vGoldBagPos ) + table.insert( self.GoldBags, newItem ) + end + else + print( "trigger not found" ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MortyTransition:OnThink() + CMapEncounter_BonusBase.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MortyTransition:OnPlayerRideMorty( nPlayerID, hMorty ) + ParticleManager:DestroyParticle( hMorty.nFXIndex, true ) + CustomGameEventManager:Send_ServerToPlayer( PlayerResource:GetPlayer( nPlayerID ), "stop_world_text_hint", {} ) + + PlayerResource:SetCameraTarget( nPlayerID, hMorty ) + PlayerResource:SetOverrideSelectionEntity( nPlayerID, hMorty ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "objective_saddle_up_on_morty" ) + local nSaddledPlayers = nCurrentValue + 1 + self:UpdateEncounterObjective( "objective_saddle_up_on_morty", nSaddledPlayers, nil ) + + local nPlayerCount = 0 + for nPlayerID = 0, AGHANIM_PLAYERS - 1 do + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS and PlayerResource:IsValidPlayerID( nPlayerID ) then + nPlayerCount = nPlayerCount + 1 + end + end + + if nSaddledPlayers >= nPlayerCount then + self:StartBonusRound( self.flMortyTimeLimit ) + for _,hMorty in pairs ( self.Morties ) do + hMorty:RemoveModifierByName( "modifier_morty_start_passive" ) + + local vLocation = hMorty:GetAbsOrigin() + local WorldTextHint = {} + WorldTextHint["hint_text"] = "hint_hop_with_morty" + WorldTextHint["command"] = 53 -- DOTA_KEYBIND_ABILITY_PRIMARY1 + WorldTextHint["ent_index"] = -1 + WorldTextHint["location_x"] = vLocation.x + WorldTextHint["location_y"] = vLocation.y + WorldTextHint["location_z"] = vLocation.z + CustomGameEventManager:Send_ServerToPlayer( PlayerResource:GetPlayer( hMorty:GetPlayerOwnerID() ), "start_world_text_hint", WorldTextHint ) + end + end +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_MortyTransition:OnComplete() + CMapEncounter_BonusBase.OnComplete( self ) + + StopListeningToGameEvent( self.nAbilityListener ) + StopListeningToGameEvent( self.nItemPickedUpListener ) + + for _,hMorty in pairs ( self.Morties ) do + hMorty:SetControllableByPlayer( -1, true ) + hMorty:SetOwner( nil ) + end + + for nPlayerID=0,AGHANIM_PLAYERS-1 do + local hHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hHero then + hHero:RemoveModifierByName( "modifier_bonus_room_start" ) + hHero:RemoveModifierByName( "modifier_ride_morty" ) + + PlayerResource:SetCameraTarget( nPlayerID, nil ) + PlayerResource:SetOverrideSelectionEntity( nPlayerID, nil ) + + local hEndPosition = self:GetRoom():FindAllEntitiesInRoomByName( "bonus_room_end_position", true ) + FindClearSpaceForUnit( hHero, hEndPosition[1]:GetAbsOrigin(), true ) + CenterCameraOnUnit( nPlayerID, hHero ) + end + end + + for _,GoldBag in pairs ( self.GoldBags ) do + if GoldBag and not GoldBag:IsNull() then + UTIL_Remove( GoldBag:GetContainer() ) + UTIL_Remove( GoldBag ) + end + end +end + +--------------------------------------------------------- +-- dota_non_player_used_ability +-- * abilityname +-- * caster_entindex +--------------------------------------------------------- + +function CMapEncounter_MortyTransition:OnNonPlayerUsedAbility( event ) + local szAbilityName = event.abilityname + local hCaster = EntIndexToHScript( event.caster_entindex ) + if hCaster and szAbilityName == "morty_hop" then + for _,hMorty in pairs ( self.Morties ) do + if hMorty == hCaster then + CustomGameEventManager:Send_ServerToPlayer( PlayerResource:GetPlayer( hMorty:GetPlayerOwnerID() ), "stop_world_text_hint", {} ) + break + end + end + end +end + +----------------------------------------- + +return CMapEncounter_MortyTransition diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_mushroom_mines.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_mushroom_mines.lua new file mode 100755 index 0000000..b890df3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_mushroom_mines.lua @@ -0,0 +1,203 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_MushroomMines == nil then + CMapEncounter_MushroomMines = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MushroomMines:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self.nNumShroomGiantSpawners = 3 + + self.fShamanSpawnTimer = -1.0 + self.fShamanRespawnTimeMin = 3.0 + self.fShamanRespawnTimeMax = 7.0 + + self:SetCalculateRewardsFromUnitCount( true ) + + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_shroomling", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 500.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_captain", "spawner_captain", + { + { + EntityName = "npc_dota_creature_shroom_giant", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + } + } ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "shaman_portal", "shaman_portal", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_shadow_shaman", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, true + ) ) + + -- DON'T SET SCHEDULES FOR THESE + --self:SetSpawnerSchedule( "spawner_captain", nil ) + --self:SetSpawnerSchedule( "spawner_peon", nil ) + --self:SetSpawnerSchedule( "shaman_portal", nil ) + + self.bShroomGiantsKilled = false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MushroomMines:InitializeObjectives() + self.nTotalGiants = self.nNumShroomGiantSpawners + self:AddEncounterObjective( "kill_shroom_giants", 0, self.nTotalGiants ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_MushroomMines:OnThink() + CMapEncounter.OnThink( self ) + + if self.fShamanSpawnTimer > 0 and self.fShamanSpawnTimer < GameRules:GetGameTime() then + print( 'Shaman ready to spawn!' ) + local hShamanPortal = self:GetPortalSpawnerV2( "shaman_portal" ) + hShamanPortal:SpawnUnitsFromRandomSpawners( 1 ) + self.fShamanSpawnTimer = -1.0 -- this will be reset when the shaman is killed + end +end + +-------------------------------------------------------------------------------- + +--[[ +function CMapEncounter_MushroomMines:MustKillForEncounterCompletion( hEnemyCreature ) + if hEnemyCreature:GetUnitName() == "npc_dota_creature_shadow_shaman" then + return false + end + + return true +end +--]] + +-------------------------------------------------------------------------------- + +function CMapEncounter_MushroomMines:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + if hVictim and hVictim:GetUnitName() == "npc_dota_creature_shroom_giant" then + local nCurrentValue = self:GetEncounterObjectiveProgress( "kill_shroom_giants" ) + nCurrentValue = nCurrentValue + 1 + self:UpdateEncounterObjective( "kill_shroom_giants", nCurrentValue, nil ) + --print( 'Updating kills objective to ' .. nCurrentValue ) + + if nCurrentValue >= self.nTotalGiants then + self.bShroomGiantsKilled = true + self:AddEncounterObjective( "defeat_all_enemies", 0, 0 ) + self:WakeUpShroomlings() + end + + elseif hVictim and hVictim:GetUnitName() == "npc_dota_creature_shadow_shaman" then + print( 'Shadow Shaman killed!' ) + self:SetShamanRespawnTimer() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MushroomMines:SetShamanRespawnTimer() + local fTimer = RandomFloat( self.fShamanRespawnTimeMin, self.fShamanRespawnTimeMax ) + self.fShamanSpawnTimer = GameRules:GetGameTime() + fTimer + print( 'Shadow Shaman spawn set for GetGameTime() + ' .. fTimer ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MushroomMines:WakeUpShroomlings() + local vecShroomlings = self:GetSpawnedUnitsOfType( "npc_dota_creature_shroomling" ) + print( 'Waking up ' .. #vecShroomlings .. " Shroomlings") + if #vecShroomlings > 0 then + for _,hUnit in pairs ( vecShroomlings ) do + local flWakeTime = RandomFloat( 2.0, 15.0 ) + print( 'Wake up time set to ' .. flWakeTime ) + + local hSleepBuff = hUnit:FindModifierByName( "modifier_shroomling_sleep" ) + if hSleepBuff ~= nil then + hSleepBuff:SetDuration( flWakeTime, true ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MushroomMines:GetPreviewUnit() + return "npc_dota_creature_shroom_giant" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MushroomMines:GetMaxSpawnedUnitCount() + + local nCount = 0 + + for _,Spawner in pairs ( self.Spawners ) do + nCount = nCount + self:ComputeUnitsSpawnedBySchedule( Spawner ) + end + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MushroomMines:Start() + CMapEncounter.Start( self ) + + -- spawn a set number of captains from the available spawners + local GiantSpawner = self:GetSpawner( "spawner_captain" ) + GiantSpawner:SpawnUnitsFromRandomSpawners( self.nNumShroomGiantSpawners ) + + -- spawn standing trash at half of the peon spawn locations + local ShroomSpawner = self:GetSpawner( "spawner_peon" ) + local nSpawnPositionCount = ShroomSpawner:GetSpawnPositionCount() + ShroomSpawner:SpawnUnitsFromRandomSpawners( nSpawnPositionCount / 2 ) + + self:SetShamanRespawnTimer() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_MushroomMines:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + --print( "CMapEncounter_Pinecones:OnSpawnerFinished" ) + + if hSpawner:GetSpawnerType() == "CPortalSpawnerV2" then -- only aggro the shamans that pop out of the spawners + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end + end +end + +return CMapEncounter_MushroomMines diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_naga_siren.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_naga_siren.lua new file mode 100755 index 0000000..ef5c70e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_naga_siren.lua @@ -0,0 +1,309 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_NagaSiren == nil then + CMapEncounter_NagaSiren = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + self.bMinesSpawned = false + self.nMinesToDestroy = 4 + self.nMinesDestroyed = 0 + self.bInitialSpawn = false + self.bSongUsed = false + + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_slark_peon", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 100.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_captain", "spawner_captain", + { + { + EntityName = "npc_dota_creature_naga_siren_illusion", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + -- Reinforcements: + local bInvulnerable = true + + local vBossSchedule = { { Time = 0, Count = 1 } } + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_boss", "spawner_boss", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_naga_siren_boss", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + { + EntityName = "npc_dota_creature_naga_siren_illusion", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 300.0, + }, + }, bInvulnerable + ) ) + + local vReinforcementsSchedule = { { Time = 0, Count = 4 } } + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "dynamic_portal", "dynamic_portal", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_slark_peon", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 100.0, + }, + { + EntityName = "npc_dota_creature_naga_siren_illusion", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( "spawner_peon", nil ) -- means spawn once when triggered + self:SetSpawnerSchedule( "spawner_captain", nil ) -- means spawn once when triggered + self:SetSpawnerSchedule( "spawner_boss", vBossSchedule ) + self:SetSpawnerSchedule( "dynamic_portal", vReinforcementsSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:GetPreviewUnit() + return "npc_dota_creature_naga_siren_boss" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_siren", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_siren.vsndevts", context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_slark", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_slark.vsndevts", context ) + PrecacheUnitByNameSync( "npc_dota_underwater_mine", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:GetMaxSpawnedUnitCount() + local nCount = 0 + -- 5 Peon Spawners + local hPeonSpawners = self:GetSpawner( "spawner_peon" ) + if hPeonSpawners then + nCount = nCount + hPeonSpawners:GetSpawnPositionCount() * 2 + end + -- 4 Captain Spawners + local hCaptainSpawners = self:GetSpawner( "spawner_captain" ) + if hCaptainSpawners then + nCount = nCount + hCaptainSpawners:GetSpawnPositionCount() + end + --[[ + -- 1 Boss Spawner + local hBossSpawners = self:GetSpawner( "spawner_boss" ) + if hBossSpawners then + nCount = nCount + hBossSpawners:GetSpawnPositionCount() * 4 + end + -- 4 Dynamic Portals + local hReinforcementsSpawners = self:GetSpawner( "dynamic_portal" ) + if hBossSpawners then + nCount = nCount + hReinforcementsSpawners:GetSpawnPositionCount() * 3 + end + ]] + print( "Number of enemies = " .. nCount ) + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:Start() + CMapEncounter.Start( self ) + + self:CreateUnits() + ListenToGameEvent( "dota_non_player_used_ability", Dynamic_Wrap( getclass( self ), "OnAbilityUsed" ), self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:OnThink() + CMapEncounter.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self.nEnemies = self:GetMaxSpawnedUnitCount() + self:AddEncounterObjective( "defeat_all_enemies", 0, self.nEnemies ) + self:AddEncounterObjective( "destroy_all_mines", self.nMinesDestroyed, self.nMinesToDestroy ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:CheckForCompletion() + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + + if not self.bInitialSpawn then + return false + end + + if nCurrentValue >= self.nEnemies and self.nMinesDestroyed == self.nMinesToDestroy then + return true + end + return false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:CreateUnits() + for _,Spawner in pairs ( self:GetSpawners() ) do + Spawner:SpawnUnits() + end + if not self.bMinesSpawned then + self:SpawnMines() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + self.bInitialSpawn = true + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + else + print( "WARNING: Can't find a living hero and the objective entity is missing!" ) + hSpawnedUnit:MoveToPosition( self.hRoom:GetOrigin() ) + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:SpawnMines() + --print("Spawning mines") + local goalUnits = Entities:FindAllByName( "spawner_mine" ) + + local mineUnit = "npc_dota_underwater_mine" + for _, goalUnit in pairs(goalUnits) do + local hUnit = CreateUnitByName( mineUnit, goalUnit:GetAbsOrigin(), true, nil, nil, DOTA_TEAM_BADGUYS ) + if hUnit ~= nil then + --print("Placing a mine") + hUnit:SetForwardVector( RandomVector( 1 ) ) + end + end + self.bMinesSpawned = true +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:OnEntityKilled( event ) + if not IsServer() then + return + end + + if self.bMinesSpawned == false then + return + end + + local killedUnit = EntIndexToHScript( event.entindex_killed ) + if killedUnit == nil then + return + end + + local killedUnit = EntIndexToHScript( event.entindex_killed ) + if killedUnit == nil or killedUnit:GetTeam() == DOTA_TEAM_GOODGUYS then + return + end + + if killedUnit:IsCreature() == true then + if killedUnit:GetUnitName() == "npc_dota_underwater_mine" then + local nCurrentValue = self:GetEncounterObjectiveProgress( "destroy_all_mines" ) + self:UpdateEncounterObjective( "destroy_all_mines", nCurrentValue + 1, nil ) + self.nMinesDestroyed = self.nMinesDestroyed + 1 + if self.nMinesDestroyed == self.nMinesToDestroy then + self:StartSpawnerSchedule( "spawner_boss", 0 ) + self.nEnemies = self.nEnemies + 4 + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue, self.nEnemies ) + end + elseif killedUnit:GetUnitName() == "npc_dota_creature_slark_peon" or + killedUnit:GetUnitName() == "npc_dota_creature_naga_siren_illusion" or + killedUnit:GetUnitName() == "npc_dota_creature_naga_siren_boss" then + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, self.nEnemies ) + if not self.bSongUsed then + if killedUnit:GetUnitName() == "npc_dota_creature_naga_siren_boss" then + -- Backup if Naga doesn't get to use Song + self.bSongUsed = true + self:StartSpawnerSchedule( "dynamic_portal", 0 ) + self.nEnemies = self.nEnemies + 8 + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue, self.nEnemies ) + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_NagaSiren:OnAbilityUsed( event ) + --print("Ability used") + -- Add to the enemy counter if Naga uses Mirror Image + if event.abilityname == "aghsfort_naga_siren_mirror_image" then + --print("Naga Illusion Spawned") + self.nEnemies = self.nEnemies + 1 + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue, self.nEnemies ) + end + -- Start the schedule for the Reinforcements if Naga uses Song + if not self.bSongUsed then + if event.abilityname == "naga_siren_song_of_the_siren" then + --print("Naga used Song!") + self.bSongUsed = true + self:StartSpawnerSchedule( "dynamic_portal", 0 ) + self.nEnemies = self.nEnemies + 12 + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue, self.nEnemies ) + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_NagaSiren diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_ogre_seals.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_ogre_seals.lua new file mode 100755 index 0000000..b881842 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_ogre_seals.lua @@ -0,0 +1,172 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_OgreSeals == nil then + CMapEncounter_OgreSeals = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_OgreSeals:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self.szPeonSpawner = "spawner_peon" + self.szCaptainSpawner = "spawner_captain" + + -- Pre-placed creatures (done this way to use a specific subset of existing map spawners) + self.vPeonSchedule = + { + { + Time = 0, + Count = 4, + }, + } + + self.vCaptainSchedule = + { + { + Time = 0, + Count = 2, + }, + } + + self:AddSpawner( CDotaSpawner( self.szPeonSpawner, self.szPeonSpawner, + { + { + EntityName = "npc_dota_creature_small_ogre_seal", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 225.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( self.szCaptainSpawner, self.szCaptainSpawner, + { + { + EntityName = "npc_dota_creature_large_ogre_seal", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + self:SetSpawnerSchedule( self.szPeonSpawner, self.vPeonSchedule ) + self:SetSpawnerSchedule( self.szCaptainSpawner, self.vCaptainSchedule ) + + -- Portal-spawned creatures + local bInvulnerable = true + self.vWaveSchedule = + { + { + Time = 15, + Count = 2, + }, + { + Time = 35, + Count = 2, + }, + { + Time = 55, + Count = 2, + }, + { + Time = 75, + Count = 3, + }, + } + + --DeepPrintTable( self.vWaveSchedule ) + + self.szPortal = "dynamic_portal" + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szPortal, self.szPortal, 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_small_ogre_seal", + Team = DOTA_TEAM_BADGUYS, + Count = 5, + PositionNoise = 225.0, + }, + { + EntityName = "npc_dota_creature_large_ogre_seal", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable ) ) + + self:SetSpawnerSchedule( self.szPortal, self.vWaveSchedule ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_OgreSeals:GetPreviewUnit() + return "npc_dota_creature_large_ogre_seal" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_OgreSeals:Start() + CMapEncounter.Start( self ) + + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_OgreSeals:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "survive_waves", 0, #self.vWaveSchedule ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) -- does this capture the pre-placed spawns? +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_OgreSeals:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_OgreSeals:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + if hSpawner.szSpawnerName == self.szPortal then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end + + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + --print( heroes ) + + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_OgreSeals diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pangolier.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pangolier.lua new file mode 100755 index 0000000..f72eac5 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pangolier.lua @@ -0,0 +1,239 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "encounters/encounter_bonus_base" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Pangolier == nil then + CMapEncounter_Pangolier = class( {}, {}, CMapEncounter_BonusBase ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pangolier:Precache( context ) + CMapEncounter_BonusBase.Precache( self, context ) + PrecacheModel( "models/heroes/pangolier/pangolier_gyroshell2.vmdl", context ) + PrecacheModel( "models/items/rattletrap/mechanised_pilgrim_cog/mechanised_pilgrim_cog.vmdl", context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_pangolier", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_centaur/centaur_warstomp.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/greevil/greevil_prison_bottom_ring.vpcf", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_pangolier.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_obsidian_destroyer.vsndevts", context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_obsidian_destroyer", context ) + LinkLuaModifier( "modifier_pango_bonus", "modifiers/modifier_pango_bonus", LUA_MODIFIER_MOTION_NONE ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pangolier:constructor( hRoom, szEncounterName ) + CMapEncounter_BonusBase.constructor( self, hRoom, szEncounterName ) + self.bAllButtonsReady = false + self.nPlayersReady = 0 + self.nHeroOnTrigger1 = 0 + self.nHeroOnTrigger2 = 0 + self.nHeroOnTrigger3 = 0 + self.nHeroOnTrigger4 = 0 + self.bCogsSpawned = false + + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_bonus_greevil", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 300.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_captain", "spawner_captain", + { + { + EntityName = "npc_dota_creature_evil_greevil", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pangolier:OnEncounterLoaded() + CMapEncounter_BonusBase.OnEncounterLoaded( self ) + self:SetupBristlebackShop( false ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pangolier:Transform() + local hHeroes = HeroList:GetAllHeroes() + + for _, hHero in pairs ( hHeroes ) do + if hHero ~= nil and not hHero:IsNull() and hHero:IsRealHero() then + --printf( "Start - Transforming into gyroshell" ) + local hAbility = hHero:AddAbility( "aghsfort_pangolier_gyroshell" ) + hAbility:UpgradeAbility( true ) + if hAbility ~= nil then + PlayerResource:SetCameraTarget( hHero:GetPlayerOwnerID(), hHero ) + PlayerResource:SetOverrideSelectionEntity( hHero:GetPlayerOwnerID(), hHero ) + hHero:AddNewModifier( hHero, hAbility, "modifier_pango_bonus", { duration = -1 } ) + hHero:CastAbilityNoTarget( hAbility, hHero:GetPlayerOwnerID() ) + --hHero:AddNewModifier( hHero, hAbility, "modifier_pangolier_gyroshell", { duration = -1 } ) + else + printf( "Start - Can't find ability" ) + end + end + end + if not self.bCogsSpawned then + self:SpawnCogs() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pangolier:SpawnCogs() + --print("Spawning cogs") + local cogUnits = Entities:FindAllByName( "spawner_cog" ) + + for _, goalUnit in pairs(cogUnits) do + local cogPos = goalUnit:GetAbsOrigin() + local cogTable = + { + origin = "0 0 0", + angles = "0 0 0", + targetname = "bumper_cog", + model = "models/items/rattletrap/mechanised_pilgrim_cog/mechanised_pilgrim_cog.vmdl", + scales = "2 2 2", + defaultanim = "ACT_DOTA_IDLE" + } + local hUnit = SpawnEntityFromTableSynchronous( "prop_dynamic", cogTable ) + hUnit:SetAbsOrigin( cogPos ) + end + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "arena_obstruction_enable_relay", false ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end + self.bCogsSpawned = true +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pangolier:RemoveCogs() + --print("Removing cogs") + local cogUnits = Entities:FindAllByName( "bumper_cog" ) + local vPos = nil + for _, cogUnit in pairs(cogUnits) do + vPos = cogUnit:GetAbsOrigin() + UTIL_Remove(cogUnit) + end + -- Remove Evil Greevils + local creatures = FindUnitsInRadius( DOTA_TEAM_BADGUYS, vPos, nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_NONE, 0, false ) + for _, hUnit in pairs(creatures) do + if hUnit:GetUnitName() == "npc_dota_creature_evil_greevil" then + --print("Removing an Evil Greevil") + UTIL_Remove(hUnit) + end + end + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "arena_obstruction_disable_relay", false ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pangolier:GetPreviewUnit() + return "npc_dota_creature_bonus_greevil" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pangolier:OnTriggerStartTouch( event ) + CMapEncounter_BonusBase.OnTriggerStartTouch( self, event ) + + local szTriggerName = event.trigger_name + local hUnit = EntIndexToHScript( event.activator_entindex ) + + if self.bAllButtonsReady == true then + return + end + + if self.bGameStarted == false then + if szTriggerName == "trigger_player_1" then + self.nHeroOnTrigger1 = 1 + elseif szTriggerName == "trigger_player_2" then + self.nHeroOnTrigger2 = 1 + elseif szTriggerName == "trigger_player_3" then + self.nHeroOnTrigger3 = 1 + elseif szTriggerName == "trigger_player_4" then + self.nHeroOnTrigger4 = 1 + end + self.nPlayersReady = self.nHeroOnTrigger1 + self.nHeroOnTrigger2 + self.nHeroOnTrigger3 + self.nHeroOnTrigger4 + local vecPlayers = GameRules.Aghanim:GetConnectedPlayers() + if #vecPlayers > 0 then + if self.nPlayersReady == #vecPlayers then + --print("All players ready!") + self.bAllButtonsReady = true + self:GetSpawner( "spawner_peon" ):SpawnUnits() + self:GetSpawner( "spawner_captain" ):SpawnUnits() + self:StartBonusRound( 41.2 ) -- account for gyroshell cast time + self:Transform() + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pangolier:OnTriggerEndTouch( event ) + CMapEncounter_BonusBase.OnTriggerEndTouch( self, event ) + if self.bAllButtonsReady == true then + return + end + + -- Get the trigger that activates the room + local szTriggerName = event.trigger_name + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + if szTriggerName == "trigger_player_1" then + self.nHeroOnTrigger1 = 0 + elseif szTriggerName == "trigger_player_2" then + self.nHeroOnTrigger2 = 0 + elseif szTriggerName == "trigger_player_3" then + self.nHeroOnTrigger3 = 0 + elseif szTriggerName == "trigger_player_4" then + self.nHeroOnTrigger4 = 0 + end +end + +-------------------------------------------------------------------------------- +--[[ +function CMapEncounter_Pangolier:CheckForCompletion() + return self.bGameStarted == true and not self:HasRemainingEnemies() +end +]] +-------------------------------------------------------------------------------- + +function CMapEncounter_Pangolier:OnComplete() + CMapEncounter_BonusBase.OnComplete( self ) + + local hHeroes = HeroList:GetAllHeroes() + for _, hHero in pairs ( hHeroes ) do + if hHero ~= nil and not hHero:IsNull() and hHero:IsRealHero() then + hHero:RemoveAbility( "pangolier_gyroshell" ) + hHero:RemoveModifierByName( "modifier_pangolier_gyroshell" ) + hHero:RemoveModifierByName( "modifier_pango_bonus" ) + PlayerResource:SetCameraTarget( hHero:GetPlayerOwnerID(), nil ) + PlayerResource:SetOverrideSelectionEntity( hHero:GetPlayerOwnerID(), nil ) + end + end + if self.bCogsSpawned then + self:RemoveCogs() + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Pangolier diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_penguins_transition.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_penguins_transition.lua new file mode 100755 index 0000000..1f1962e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_penguins_transition.lua @@ -0,0 +1,341 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "encounters/encounter_bonus_base" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_PenguinsTransition == nil then + CMapEncounter_PenguinsTransition = class( {}, {}, CMapEncounter_BonusBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PenguinsTransition:constructor( hRoom, szEncounterName ) + CMapEncounter_BonusBase.constructor( self, hRoom, szEncounterName ) + + self.flPenguinTimeLimit = 55.0 + self:AddSpawner( CDotaSpawner( "penguin_spawner", "penguin_spawner", + { + { + EntityName = "npc_dota_sled_penguin", + Team = DOTA_TEAM_GOODGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + ) ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PenguinsTransition:Precache( context ) + CMapEncounter_BonusBase.Precache( self, context ) + + PrecacheResource( "particle", "particles/gameplay/location_hint_goal.vpcf", context ) + + PrecacheUnitByNameSync( "npc_dota_creature_wandering_ogre_seal", context, -1 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PenguinsTransition:GetPreviewUnit() + return "npc_dota_sled_penguin" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PenguinsTransition:OnEncounterLoaded() + CMapEncounter_BonusBase.OnEncounterLoaded( self ) + self:SetupBristlebackShop( true ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PenguinsTransition:InitializeObjectives() + self:AddEncounterObjective( "objective_saddle_up_on_penguin", 0, 4 ) + self:AddEncounterObjective( "objective_sled_to_collect_gold", 0, 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PenguinsTransition:Start() + CMapEncounter_BonusBase.Start( self ) + + if not IsServer() then + return + end + + self.flEndTime = 99999999999999999 + + local hUnits = self:GetSpawner( "penguin_spawner" ):SpawnUnits() + + self.Penguins = {} + + local hFacingTargets = self:GetRoom():FindAllEntitiesInRoomByName( "penguin_facing_target", true ) + local hFacingTarget = hFacingTargets[ 1 ] + + local nPlayerID = 0 + for _, hPenguin in pairs ( hUnits ) do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + hPlayerHero:AddNewModifier( hPlayerHero, nil, "modifier_bonus_room_start", {} ) + end + + hPenguin.Encounter = self + hPenguin:SetOwner( hPlayerHero ) + + hPenguin:FaceTowards( hFacingTarget:GetAbsOrigin() ) + + hPenguin.nFXIndex = ParticleManager:CreateParticleForPlayer( "particles/gameplay/location_hint_goal.vpcf", PATTACH_WORLDORIGIN, nil, PlayerResource:GetPlayer( nPlayerID ) ) + local vArrowFXPos = hPenguin:GetAbsOrigin() + ParticleManager:SetParticleControl( hPenguin.nFXIndex, 0, vArrowFXPos ) + ParticleManager:SetParticleControl( hPenguin.nFXIndex, 1, Vector( 1.0, 0.8, 0.2 ) ) + + local vLocation = hPenguin:GetAbsOrigin() + local WorldTextHint = {} + WorldTextHint["hint_text"] = "hint_ride_penguin" + WorldTextHint["command"] = 18 -- DOTA_KEYBIND_HERO_MOVE + WorldTextHint["ent_index"] = -1 + WorldTextHint["location_x"] = vLocation.x + WorldTextHint["location_y"] = vLocation.y + WorldTextHint["location_z"] = vLocation.z + + CustomGameEventManager:Send_ServerToPlayer( PlayerResource:GetPlayer( nPlayerID ), "start_world_text_hint", WorldTextHint ) + + table.insert( self.Penguins, hPenguin ) + nPlayerID = nPlayerID + 1 + end + + self.fCoinPileCreationInterval = 0.5 + self.fNextCoinPileSpawn = GameRules:GetGameTime() + self.fCoinPileCreationInterval + + local nTotalGold = 5000 -- this is probably not needed since we have the self.nGoldForBags value + self.nTotalGoldBagsToSpawn = 475 + self.nGoldPerBag = nTotalGold / self.nTotalGoldBagsToSpawn + --printf( "Start - self.nGoldPerBag: %d", self.nGoldPerBag ) + self.nGoldForBags = self.nGoldReward * AGHANIM_PLAYERS + --printf( "Start - self.nGoldForBags: %d", self.nGoldForBags ) + self.nGoldReward = 0 + self.nMinCoinsPerTarget = 8 + self.nMaxCoinsPerTarget = 8 + + self.nPreplacedBagsToSpawn = self.nTotalGoldBagsToSpawn / 3 + + self.GoldBags = {} + + self.hPreplacedBagTargets = self:GetRoom():FindAllEntitiesInRoomByName( "gold_bag_target_preplaced", true ) + + self.hDynamicBagTargets = self:GetRoom():FindAllEntitiesInRoomByName( "gold_bag_target", true ) + --printf( "#self.hDynamicBagTargets: %d", #self.hDynamicBagTargets ) + + for _, hBagTarget in pairs( self.hPreplacedBagTargets ) do + local nCoinSpawnsPerTarget = RandomInt( self.nMinCoinsPerTarget, self.nMaxCoinsPerTarget ) + for i = 1, nCoinSpawnsPerTarget do + if TableLength( self.GoldBags ) >= self.nPreplacedBagsToSpawn then + break + end + + local vGoldBagPos = self:GetValidCoinSpawnPos( hBagTarget ) + self.nGoldForBags = self.nGoldForBags - self.nGoldPerBag + + local newItem = CreateItem( "item_bag_of_gold", nil, nil ) + newItem:SetPurchaseTime( 0 ) + newItem:SetCurrentCharges( self.nGoldPerBag ) + + -- NOTE: CreateItemOnPositionSync will drop the item to the ground, so the z height is going to be ignored + -- However, LaunchLootRequiredHeight will fix it back up for us. + local drop = CreateItemOnPositionSync( vGoldBagPos, newItem ) + --drop:SetModelScale( 1.5 ) + local fHeight = 0 + newItem:LaunchLootRequiredHeight( true, fHeight, fHeight, 0.75, vGoldBagPos ) + table.insert( self.GoldBags, newItem ) + end + end + + --printf( "[preplaced] total gold bags: %d", #self.GoldBags ) + + -- Create wandering ogre seals + self.hOgreSeals = {} + self.hOgreSealSpawners = self:GetRoom():FindAllEntitiesInRoomByName( "ogre_seal", true ) + --printf( "#self.hOgreSealSpawners: %d", #self.hOgreSealSpawners ) + + local nAscLevel = GameRules.Aghanim:GetAscensionLevel() + local nTotalOgreSealsToSpawn = 7 + ( 2 * nAscLevel ) + --printf( "nTotalOgreSealsToSpawn: %d", nTotalOgreSealsToSpawn ) + + for i = 1, nTotalOgreSealsToSpawn do + if #self.hOgreSealSpawners > 0 then + local nRandomIndex = RandomInt( 1, #self.hOgreSealSpawners ) + local hRandomOgreSealSpawner = self.hOgreSealSpawners[ nRandomIndex ] + + local vSpawnPos = hRandomOgreSealSpawner:GetAbsOrigin() + local hOgreSeal = CreateUnitByName( "npc_dota_creature_wandering_ogre_seal", vSpawnPos, true, nil, nil, DOTA_TEAM_BADGUYS ) + if hOgreSeal ~= nil then + table.insert( self.hOgreSeals, hOgreSeal ) + table.remove( self.hOgreSealSpawners, nRandomIndex ) + end + else + printf( "WARNING - self.hOgreSealSpawners is empty, can't spawn more seals" ) + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PenguinsTransition:OnThink() + CMapEncounter_BonusBase.OnThink( self ) + + if not IsServer() or GameRules:IsGamePaused() then + return + end + + if not self.bGameStarted then + return + end + + if self.bGameStarted and not self.bStartedMusic then + EmitGlobalSound( "BonusRoom.ParadeMusicLoop" ) + self.bStartedMusic = true + end + + if self:HasStarted() and not self:IsComplete() then + if TableLength( self.GoldBags ) >= self.nTotalGoldBagsToSpawn then + return + end + + if GameRules:GetGameTime() >= self.fNextCoinPileSpawn then + local hRandomBagTarget = self.hDynamicBagTargets[ RandomInt( 1, #self.hDynamicBagTargets ) ] + local nCoinSpawnsPerTarget = RandomInt( self.nMinCoinsPerTarget, self.nMaxCoinsPerTarget ) + for i = 1, nCoinSpawnsPerTarget do + if TableLength( self.GoldBags ) >= self.nTotalGoldBagsToSpawn then + break + end + + local vGoldBagPos = self:GetValidCoinSpawnPos( hRandomBagTarget ) + self.nGoldForBags = self.nGoldForBags - self.nGoldPerBag + + local newItem = CreateItem( "item_bag_of_gold", nil, nil ) + newItem:SetPurchaseTime( 0 ) + newItem:SetCurrentCharges( self.nGoldPerBag ) + + -- NOTE: CreateItemOnPositionSync will drop the item to the ground, so the z height is going to be ignored + -- However, LaunchLootRequiredHeight will fix it back up for us. + local drop = CreateItemOnPositionSync( vGoldBagPos, newItem ) + --drop:SetModelScale( 1.5 ) + local fHeight = 0 + newItem:LaunchLootRequiredHeight( true, fHeight, fHeight, 0.75, vGoldBagPos ) + table.insert( self.GoldBags, newItem ) + end + --printf( "[dynamic] total gold bags: %d", #self.GoldBags ) + + self.fNextCoinPileSpawn = GameRules:GetGameTime() + self.fCoinPileCreationInterval + end + + --printf( "Total gold bags spawned: %d", TableLength( self.GoldBags ) ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PenguinsTransition:OnComplete() + CMapEncounter_BonusBase.OnComplete( self ) + + StopListeningToGameEvent( self.nItemPickedUpListener ) -- redundant? already done in BonusBase + + for _, hPenguin in pairs ( self.Penguins ) do + hPenguin:SetOwner( nil ) + hPenguin:RemoveModifierByName( "modifier_sled_penguin_passive" ) + end + + for nPlayerID = 0, AGHANIM_PLAYERS - 1 do + local hHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hHero then + hHero:RemoveModifierByName( "modifier_bonus_room_start" ) + PlayerResource:SetCameraTarget( nPlayerID, nil ) + PlayerResource:SetOverrideSelectionEntity( nPlayerID, nil ) + + local hEndPosition = self:GetRoom():FindAllEntitiesInRoomByName( "bonus_room_end_position", true ) + FindClearSpaceForUnit( hHero, hEndPosition[1]:GetAbsOrigin(), true ) + CenterCameraOnUnit( nPlayerID, hHero ) + end + end + + for _,GoldBag in pairs ( self.GoldBags ) do + if GoldBag and not GoldBag:IsNull() then + UTIL_Remove( GoldBag:GetContainer() ) + UTIL_Remove( GoldBag ) + end + end + + for _, hOgreSeal in pairs ( self.hOgreSeals ) do + if hOgreSeal and not hOgreSeal:IsNull() then + UTIL_Remove( hOgreSeal ) + end + end + + StopGlobalSound( "BonusRoom.ParadeMusicLoop" ) +end + +--------------------------------------------------------------------------- + +function CMapEncounter_PenguinsTransition:GetValidCoinSpawnPos( hBagTarget ) + local fMinOffset = 25 + local fMaxOffset = 600 + + local vPos = hBagTarget:GetAbsOrigin() + RandomVector( RandomFloat( fMinOffset, fMaxOffset ) ) + + local nAttempts = 0 + while ( ( not GridNav:CanFindPath( hBagTarget:GetOrigin(), vPos ) ) and ( nAttempts < 5 ) ) do + vPos = hBagTarget:GetOrigin() + RandomVector( fMaxOffset ) + nAttempts = nAttempts + 1 + + if nAttempts >= 5 then + vPos = hBagTarget:GetOrigin() + end + end + + return vPos +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PenguinsTransition:OnPlayerRidePenguin( nPlayerID, hPenguin ) + ParticleManager:DestroyParticle( hPenguin.nFXIndex, true ) + CustomGameEventManager:Send_ServerToPlayer( PlayerResource:GetPlayer( nPlayerID ), "stop_world_text_hint", {} ) + + --PlayerResource:SetCameraTarget( nPlayerID, hPenguin ) + --PlayerResource:SetOverrideSelectionEntity( nPlayerID, hPenguin ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "objective_saddle_up_on_penguin" ) + local nSaddledPlayers = nCurrentValue + 1 + self:UpdateEncounterObjective( "objective_saddle_up_on_penguin", nSaddledPlayers, nil ) + + local nPlayerCount = 0 + for nPlayerID = 0, AGHANIM_PLAYERS - 1 do + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS and PlayerResource:IsValidPlayerID( nPlayerID ) then + nPlayerCount = nPlayerCount + 1 + end + end + + if nSaddledPlayers >= nPlayerCount then + self:DisableBlocker() + self:StartBonusRound( self.flPenguinTimeLimit ) + end +end + +--------------------------------------------------------------------------- + +function CMapEncounter_PenguinsTransition:DisableBlocker() + --print("Disabling Starting Blockers!") + -- Disable any nav blockers in the start + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "starting_relay", false ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end +end + +--------------------------------------------------------------------------- + +return CMapEncounter_PenguinsTransition diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_phoenix.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_phoenix.lua new file mode 100755 index 0000000..7ee3853 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_phoenix.lua @@ -0,0 +1,154 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Phoenix == nil then + CMapEncounter_Phoenix = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Phoenix:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + -- Portal-spawned creatures + self.vEmberSchedule = + { + { + Time = 3, + Count = 2, + }, + { + Time = 18, + Count = 2, + }, + { + Time = 33, + Count = 2, + }, + { + Time = 48, + Count = 2, + }, + } + + self.vPhoenixSchedule = + { + { + Time = 3, + Count = 1, + }, + { + Time = 20, + Count = 1, + }, + { + Time = 35, + Count = 1, + }, + { + Time = 50, + Count = 2, + }, + } + + local bInvulnerable = true + + self.szEmberPortal = "portal_v2_ember" + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szEmberPortal, self.szEmberPortal, 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_ember_spirit", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 150.0, + }, + }, bInvulnerable ) ) + + self.szPhoenixPortal = "portal_v2_phoenix" + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szPhoenixPortal, self.szPhoenixPortal, 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_phoenix", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable ) ) + + self:SetSpawnerSchedule( self.szEmberPortal, self.vEmberSchedule ) + self:SetSpawnerSchedule( self.szPhoenixPortal, self.vPhoenixSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Phoenix:GetPreviewUnit() + return "npc_dota_creature_phoenix" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Phoenix:Start() + CMapEncounter.Start( self ) + + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Phoenix:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + local nWaves = #self.vEmberSchedule + #self.vPhoenixSchedule + self:AddEncounterObjective( "survive_waves", 0, nWaves ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Phoenix:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Phoenix:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + if hSpawner.szSpawnerName == self.szEmberPortal or hSpawner.szSpawnerName == self.szPhoenixPortal then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end + + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + --print( heroes ) + + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Phoenix diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pinecones.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pinecones.lua new file mode 100755 index 0000000..68bf03f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pinecones.lua @@ -0,0 +1,263 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Pinecones == nil then + CMapEncounter_Pinecones = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pinecones:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + ------------------------ + -- Pre-placed units + ------------------------ + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_pinecone_warrior", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 200.0, + } + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_captain_trigger", "spawner_captain_trigger", + { + { + EntityName = "npc_dota_pinecone_champion", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 200.0, + } + } ) ) + + self:SetPortalTriggerSpawner( "spawner_captain_trigger", 0.8 ) + self:SetSpawnerSchedule( "spawner_peon", { { Time = 0, Count = 16 } } ) -- spawn N units when triggered + self:SetSpawnerSchedule( "spawner_captain_trigger", nil ) -- means spawn once when triggered + + ------------------------ + -- WAVE: A + ------------------------ + local nNumPortals = 1 + self.nTotalPortals = nNumPortals + + self.vWaveSchedule_A = + { + { + Time = 0, + Count = nNumPortals, + }, + } + + local PortalUnits_A = + { + { + EntityName = "npc_dota_pinecone_warrior", + Team = DOTA_TEAM_BADGUYS, + Count = 4, + PositionNoise = 200.0, + }, + { + EntityName = "npc_dota_pinecone_champion", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 200.0, + }, + } + + local bInvulnerable = true + + local nHealth = 1 + local fSummonTime = 5 + local fModelScale = 1.0 + + local szLocatorNameA = "dynamic_portal_a" + local szNameA = szLocatorNameA + + self:AddPortalSpawnerV2( CPortalSpawnerV2( szNameA, szLocatorNameA, nHealth, fSummonTime, fModelScale, + PortalUnits_A, bInvulnerable + ) ) + + self:SetSpawnerSchedule( szLocatorNameA, self.vWaveSchedule_A ) + + ------------------------ + -- WAVE: B + ------------------------ + nNumPortals = 2 + self.nTotalPortals = self.nTotalPortals + nNumPortals + + self.vWaveSchedule_B = + { + { + Time = 15, + Count = nNumPortals, + }, + } + + local PortalUnits_B = + { + { + EntityName = "npc_dota_pinecone_warrior", + Team = DOTA_TEAM_BADGUYS, + Count = 5, + PositionNoise = 200.0, + }, + { + EntityName = "npc_dota_pinecone_champion", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 200.0, + }, + } + + local szLocatorNameB = "dynamic_portal_b" + local szNameB = szLocatorNameB + + self:AddPortalSpawnerV2( CPortalSpawnerV2( szNameB, szLocatorNameB, nHealth, fSummonTime, fModelScale, + PortalUnits_B, bInvulnerable + ) ) + + self:SetSpawnerSchedule( szLocatorNameB, self.vWaveSchedule_B ) + + ------------------------ + -- WAVE: C + ------------------------ + nNumPortals = 3 + self.nTotalPortals = self.nTotalPortals + nNumPortals + + self.vWaveSchedule_C = + { + { + Time = 30, + Count = nNumPortals, + }, + } + + local PortalUnits_C = + { + { + EntityName = "npc_dota_pinecone_warrior", + Team = DOTA_TEAM_BADGUYS, + Count = 7, + PositionNoise = 200.0, + }, + { + EntityName = "npc_dota_pinecone_champion", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 200.0, + }, + } + + local szLocatorNameC = "dynamic_portal_c" + local szNameC = szLocatorNameC + + self:AddPortalSpawnerV2( CPortalSpawnerV2( szNameC, szLocatorNameC, nHealth, fSummonTime, fModelScale, + PortalUnits_C, bInvulnerable + ) ) + + self:SetSpawnerSchedule( szLocatorNameC, self.vWaveSchedule_C ) +end + +-------------------------------------------------------------------------------- + + +function CMapEncounter_Pinecones:GetPreviewUnit() + return "npc_dota_pinecone_champion" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pinecones:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pinecones:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pinecones:Start() + CMapEncounter.Start( self ) + + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pinecones:OnThink() + CMapEncounter.OnThink( self ) + + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes <= 0 then + return + end + + --print( "CMapEncounter_Pinecones:OnThink() - iterating through portal units" ) + for _,hEnemy in pairs( self.SpawnedEnemies ) do + if hEnemy == nil or hEnemy:IsNull() or hEnemy:IsAlive() == false then + goto continue + end + + if hEnemy.bPortalUnit ~= nil and hEnemy.bPortalUnit == true then + --print( "CMapEncounter_Pinecones:OnThink() -found a portal unit" ) + local hAggroTarget = hEnemy:GetAggroTarget() + local hInitialGoalEnt = hEnemy:GetInitialGoalEntity() + + if hAggroTarget == nil and hInitialGoalEnt == nil then + --print( "CMapEncounter_Pinecones:OnThink() - Found a portal unit that doesn't have an aggro target or a goal ent! Searching for a goal ent for this unit" ) + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "CMapEncounter_Pinecones:OnThink() - Set initial goal entity for unit \"%s\" to \"%s\"", hEnemy:GetUnitName(), hero:GetUnitName() ) + hEnemy:SetInitialGoalEntity( hero ) + end + end + end + + ::continue:: + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pinecones:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + --print( "CMapEncounter_Pinecones:OnSpawnerFinished" ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Pinecones diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pucks.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pucks.lua new file mode 100755 index 0000000..db4509b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pucks.lua @@ -0,0 +1,181 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Pucks == nil then + CMapEncounter_Pucks = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pucks:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheResource( "particle", "particles/units/heroes/hero_elder_titan/elder_titan_earth_splitter.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_elder_titan/elder_titan_earth_splitter_move.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_elder_titan/elder_titan_echo_stomp_cast_combined.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_elder_titan/elder_titan_echo_stomp_cast_combined_detail.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_elder_titan/elder_titan_echo_stomp_physical.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_elder_titan/elder_titan_echo_stomp_magical.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/puck/flying_bomb_destination.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pucks:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + -- Initial Spawns + self.szCaptainSpawner = "spawner_captain" + + self:AddSpawner( CDotaSpawner( self.szCaptainSpawner, self.szCaptainSpawner, + { + { + EntityName = "npc_dota_creature_puck", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 0.0, + }, + } ) ) + + -- Dynamic Spawns + self.vPuckSchedule = + { + { + Time = 5, + Count = 2, + }, + { + Time = 30, + Count = 2, + }, + { + Time = 55, + Count = 2, + }, + { + Time = 80, + Count = 2, + }, + } + + self.vTitanSchedule = + { + { + Time = 15, + Count = 1, + }, + { + Time = 45, + Count = 1, + }, + { + Time = 75, + Count = 1, + }, + } + + --DeepPrintTable( self.vWaveSchedule ) + + local bInvulnerable = true + + self.szPuckPortal = "dynamic_portal_puck" + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szPuckPortal, self.szPuckPortal, 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_puck", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 150.0, + }, + }, bInvulnerable + ) ) + + self.szTitanPortal = "dynamic_portal_titan" + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szTitanPortal, self.szTitanPortal, 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_large_elder_titan", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( self.szPuckPortal, self.vPuckSchedule ) + self:SetSpawnerSchedule( self.szTitanPortal, self.vTitanSchedule ) +end + +-------------------------------------------------------------------------------- + +--[[ +function CMapEncounter_Pucks:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "survive_waves", 0, #self.vWaveSchedule ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end +]] + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pucks:GetPreviewUnit() + return "npc_dota_creature_puck" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pucks:Start() + CMapEncounter.Start( self ) + + for _, hSpawner in pairs( self:GetSpawners() ) do + hSpawner:SpawnUnits() + end + + self:StartSpawnerSchedule( self.szPuckPortal, 0 ) + self:StartSpawnerSchedule( self.szTitanPortal, 0 ) +end + +-------------------------------------------------------------------------------- + +--[[ +function CMapEncounter_Pucks:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end +]] + +-------------------------------------------------------------------------------- + +function CMapEncounter_Pucks:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + --print( "CMapEncounter_Pucks:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Pucks diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pudge_miniboss.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pudge_miniboss.lua new file mode 100755 index 0000000..296690d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pudge_miniboss.lua @@ -0,0 +1,226 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_PudgeMiniboss == nil then + CMapEncounter_PudgeMiniboss = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PudgeMiniboss:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self.flNextWaveSpawnTime = -1 + self.flSpawnInterval = 5 + self.flWaveDelay = 0 + self.nWaves = 16 + self.hHeroes = {} + self:SetCalculateRewardsFromUnitCount( false ) + self.szPeonSpawner = "spawner_peon" + self.szBossSpawner = "spawner_pudge" + + self.hPudge = nil + + self.bBossSpawned = false + + self.nMaxZombies = 100 + + self.hPeonSpawner = self:AddSpawner( CDotaSpawner( self.szPeonSpawner, self.szPeonSpawner, + { + { + EntityName = "npc_dota_creature_pudge_miniboss_minion", + Team = DOTA_TEAM_BADGUYS, + Count = 5, + PositionNoise = 200.0, + }, + } ) ) + + self.hBossSpawner = self:AddSpawner( CDotaSpawner( self.szBossSpawner, self.szBossSpawner, + { + { + EntityName = "npc_dota_creature_pudge_miniboss", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + +end + +------------------------------------------------------------------------------- + +function CMapEncounter_PudgeMiniboss:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_pudge", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_pudge.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/voscripts/game_sounds_vo_pudge.vsndevts", context ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_PudgeMiniboss:GetPreviewUnit() + return "npc_dota_creature_pudge_miniboss" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PudgeMiniboss:OnThink() + CMapEncounter.OnThink( self ) + self:CreateMinions() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PudgeMiniboss:CreateMinions() + if self.bCreatureSpawnsActivated ~= true then + return + end + + if self.nWaves > 0 and GameRules:GetGameTime() > self.flNextWaveSpawnTime then + + for _,Spawner in pairs ( self:GetSpawners() ) do + if Spawner ~= self.hBossSpawner and self.hPudge ~= nil and self.hPudge:IsNull() == false and self.hPudge:IsAlive() then + + local nSpawnedEnemies = #self.SpawnedEnemies + 1 + if self.nMaxZombies > nSpawnedEnemies then + Spawner:SpawnUnits() + else + print( "Skipping zombie minion spawn; too many zombies!" ) + end + end + end + + self.nWaves = self.nWaves - 1 + self.flNextWaveSpawnTime = GameRules:GetGameTime() + self.flSpawnInterval + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PudgeMiniboss:AggroPudgeMinions( Mobs ) + if Mobs == nil or #Mobs == 0 then + return + end + + for _,Mob in pairs ( Mobs ) do + local hEnemies = self.hRoom:GetPlayerUnitsInRoom() + if #hEnemies > 0 then + AttackTargetOrder( Mob, hEnemies[ RandomInt( 1, #hEnemies)] ) + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PudgeMiniboss:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner == self.hBossSpawner then + return + end + + -- randomize zombie speed + for _,Mob in pairs ( hSpawnedUnits ) do + Mob:SetBaseMoveSpeed( Mob:GetBaseMoveSpeed() + RandomFloat( -100, 100 ) ) + end + + self:AggroPudgeMinions( hSpawnedUnits ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PudgeMiniboss:GetMaxSpawnedUnitCount() + local nCount = 0 + local hPeonSpawners = self:GetSpawner( self.szPeonSpawner ) + if hPeonSpawners then + nCount = nCount + hPeonSpawners:GetSpawnPositionCount() * 3 * self.nWaves + end + + nCount = nCount + 1 + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PudgeMiniboss:CheckForCompletion() + if self.bBossSpawned and not self:HasRemainingEnemies() then + return true + end + return false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PudgeMiniboss:OnComplete() + CMapEncounter.OnComplete( self ) + + if self.nAbilityListener ~= nil then + StopListeningToGameEvent( self.nAbilityListener ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_PudgeMiniboss:OnTriggerStartTouch( event ) + CMapEncounter.OnTriggerStartTouch( self, event ) + + -- Get the trigger that activates the room + local szTriggerName = event.trigger_name + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + + if self.bCreatureSpawnsActivated == nil and szTriggerName == "trigger_spawn_creatures" then + self.bCreatureSpawnsActivated = true + + if not self.bBossSpawned then + local hUnits = self.hBossSpawner:SpawnUnits() + for _,hBoss in pairs ( hUnits) do + EmitSoundOn( "pudge_pud_spawn_03", hBoss ) + self.hPudge = hBoss + self.nAbilityListener = ListenToGameEvent( "dota_non_player_used_ability", Dynamic_Wrap( getclass( self ), 'OnNonPlayerUsedAbility' ), self ) + end + self.bBossSpawned = true + end + + self.flNextWaveSpawnTime = GameRules:GetGameTime() + self.flWaveDelay + EmitGlobalSound( "RoundStart" ) + end +end + +--------------------------------------------------------- +-- dota_non_player_used_ability +-- * abilityname +-- * caster_entindex +--------------------------------------------------------- +function CMapEncounter_PudgeMiniboss:OnNonPlayerUsedAbility( event ) + + local hCaster = nil + if event.caster_entindex ~= nil and event.abilityname ~= nil then + hCaster = EntIndexToHScript( event.caster_entindex ) + if hCaster ~= nil and hCaster == self.hPudge and event.abilityname == "creature_pudge_dismember" then + local nRandomInt = RandomInt( 1, 3 ) + if nRandomInt == 1 then + EmitSoundOn( "pudge_pud_ability_devour_02", self.hPudge ) + end + if nRandomInt == 2 then + EmitSoundOn( "pudge_pud_ability_devour_03", self.hPudge ) + end + if nRandomInt == 3 then + EmitSoundOn( "pudge_pud_ability_devour_04", self.hPudge ) + end + end + end +end + + + +-------------------------------------------------------------------------------- + +return CMapEncounter_PudgeMiniboss diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_quill_beasts.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_quill_beasts.lua new file mode 100755 index 0000000..d382900 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_quill_beasts.lua @@ -0,0 +1,157 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_QuillBeasts == nil then + CMapEncounter_QuillBeasts = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_QuillBeasts:constructor( hRoom, szEncounterName ) + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_dire_hound", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 225.0, + } + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_captain_trigger", "spawner_captain_trigger", + { + { + EntityName = "npc_dota_creature_dire_hound_boss", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 225.0, + } + } ) ) + + self:SetPortalTriggerSpawner( "spawner_captain_trigger", 0.8 ) + + self:SetSpawnerSchedule( "spawner_peon", { { Time = 0, Count = 8 } } ) -- spawn 8 units when triggered + self:SetSpawnerSchedule( "spawner_captain_trigger", nil ) -- means spawn once when triggered + + ------------------------ + -- Dynamic Portals + ------------------------ + local nNumPortals_1 = 2 + local nNumPortals_2 = 3 + local nNumPortals_3 = 3 + local nNumPortals_4 = 3 + self.nTotalPortals = nNumPortals_1 + nNumPortals_2 + nNumPortals_3 + nNumPortals_4 + + self.vWaveSchedule = + { + { + Time = 0, + Count = nNumPortals_1, + }, + { + Time = 20, + Count = nNumPortals_2, + }, + { + Time = 40, + Count = nNumPortals_3, + }, + { + Time = 60, + Count = nNumPortals_4, + }, + } + + local PortalUnits = + { + { + EntityName = "npc_dota_creature_dire_hound", + Team = DOTA_TEAM_BADGUYS, + Count = 6, + PositionNoise = 0.0, + }, + { + EntityName = "npc_dota_creature_dire_hound_boss", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + + local bInvulnerable = true + + local nHealth = 1 + local fSummonTime = 5 + local fModelScale = 1.0 + + local szLocatorName = "dynamic_portal" + local szName = szLocatorName + + self:AddPortalSpawnerV2( CPortalSpawnerV2( szName, szLocatorName, nHealth, fSummonTime, fModelScale, + PortalUnits, bInvulnerable + ) ) + + self:SetSpawnerSchedule( szLocatorName, self.vWaveSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_QuillBeasts:GetPreviewUnit() + return "npc_dota_creature_dire_hound_boss" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_QuillBeasts:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_QuillBeasts:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_QuillBeasts:Start() + CMapEncounter.Start( self ) + + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_QuillBeasts:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + --print( "CMapEncounter_QuillBeasts:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_QuillBeasts diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_rhyzik.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_rhyzik.lua new file mode 100755 index 0000000..4ee9f92 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_rhyzik.lua @@ -0,0 +1,67 @@ +require( "map_encounter" ) +require( "encounters/encounter_boss_base" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Rhyzik == nil then + CMapEncounter_Rhyzik = class( {}, {}, CMapEncounter_BossBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Rhyzik:constructor( hRoom, szEncounterName ) + + CMapEncounter_BossBase.constructor( self, hRoom, szEncounterName ) + self.szBossSpawner = "spawner_boss" + + self:AddSpawner( CDotaSpawner( self.szBossSpawner, self.szBossSpawner, + { + { + EntityName = "npc_dota_creature_sand_king", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Rhyzik:Precache( context ) + CMapEncounter_BossBase.Precache( self, context ) + + PrecacheUnitByNameSync( "npc_dota_creature_timbersaw_treant", context, -1 ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_sandking", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_sandking.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_nyx_assassin.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/voscripts/game_sounds_vo_sandking.vsndevts", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Rhyzik:GetBossUnitName() + return "npc_dota_creature_sand_king" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Rhyzik:Start() + CMapEncounter_BossBase.Start( self ) +end + +-------------------------------------------------------------------------------- + + +function CMapEncounter_Rhyzik:OnThink() + CMapEncounter_BossBase.OnThink( self ) +end + +-------------------------------------------------------------------------------- +function CMapEncounter_Rhyzik:OnComplete() + CMapEncounter.OnComplete( self ) + GameRules.Aghanim:MarkGameWon() +end + +return CMapEncounter_Rhyzik diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_rock_golems.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_rock_golems.lua new file mode 100755 index 0000000..6e5f641 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_rock_golems.lua @@ -0,0 +1,135 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_RockGolems == nil then + CMapEncounter_RockGolems = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_RockGolems:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self.vWaveSchedule = + { + { + Time = 3, + Count = 1, + }, + { + Time = 33, + Count = 2, + }, + { + Time = 63, + Count = 2, + }, + } + + local bInvulnerable = true + self.szPortal = "dynamic_portal" + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szPortal, self.szPortal, 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_rock_golem_a", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( self.szPortal, self.vWaveSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_RockGolems:Precache( context ) + CMapEncounter.Precache( self, context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_brewmaster/brewmaster_thunder_clap_debuff.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_RockGolems:GetPreviewUnit() + return "npc_dota_creature_rock_golem_a" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_RockGolems:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "survive_waves", 0, #self.vWaveSchedule ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_RockGolems:Start() + CMapEncounter.Start( self ) + + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_RockGolems:GetMaxSpawnedUnitCount() + local nBigGolems = #self.PortalSpawnersV2 + local nMediumGolems = nBigGolems * 3 + local nSmallGolems = nMediumGolems * 4 + + local nTotal = nBigGolems + nMediumGolems + nSmallGolems -- isn't working, it's 0 + printf( "GetMaxSpawnedUnitCount - nTotal: %d", nTotal ) + return nTotal +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_RockGolems:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_RockGolems:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner.szSpawnerName == self.szPortal then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end + + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + self:SetInitialGoalEntityToNearestHero( hSpawnedUnit ) + end +end + +-------------------------------------------------------------------------------- + +--[[ necessary due to split-generated golems? +function CMapEncounter_RockGolems:CheckForCompletion() + if self.nWaves == 0 and not self:HasRemainingEnemies() then + return true + end + + return false +end +]] + +-------------------------------------------------------------------------------- + +return CMapEncounter_RockGolems diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_shadow_demons.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_shadow_demons.lua new file mode 100755 index 0000000..d18c40f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_shadow_demons.lua @@ -0,0 +1,233 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_ShadowDemons == nil then + CMapEncounter_ShadowDemons = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_ShadowDemons:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + -- urns are standing trash + self.szUrnSpawner = "spawner_captain" + self:AddSpawner( CDotaSpawner( self.szUrnSpawner, self.szUrnSpawner, + { + { + EntityName = "npc_dota_creature_upheaval_urn", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + -- waves alternate between groups of necro melee warriors and a single shadow demon + -- one big Doom spawns in the middle of this nonsense + local bInvulnerable = true + + self.vNecroWarriorSchedule = + { + { + Time = 3, + Count = 3, + }, + { + Time = 24, + Count = 3, + }, + { + Time = 55, + Count = 3, + }, + { + Time = 76, + Count = 3, + }, + } + + self.vShadowDemonSchedule = + { + { + Time = 11, + Count = 1, + }, + { + Time = 30, + Count = 1, + }, + { + Time = 49, + Count = 1, + }, + { + Time = 68, + Count = 1, + }, + } + + self.vDoomSchedule = + { + { + Time = 20.0, + Count = 1 + }, + } + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_shadow_demon", "spawner_peon", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_shadow_demon", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_necro_warrior", "spawner_peon", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_necro_warrior", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 250.0, + }, + }, bInvulnerable ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_doom", "spawner_doom", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_doom", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable ) ) + + self:SetSpawnerSchedule( self.szUrnSpawner, nil ) -- means spawn once when triggered + self:SetSpawnerSchedule( "spawner_shadow_demon", self.vShadowDemonSchedule ) + self:SetSpawnerSchedule( "spawner_necro_warrior", self.vNecroWarriorSchedule ) + self:SetSpawnerSchedule( "spawner_doom", self.vDoomSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_ShadowDemons:GetPreviewUnit() + return "npc_dota_creature_doom" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_ShadowDemons:OnEncounterLoaded() + CMapEncounter.OnEncounterLoaded( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_ShadowDemons:Start() + CMapEncounter.Start( self ) + + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_ShadowDemons:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "survive_waves", 0, #self.vShadowDemonSchedule + #self.vDoomSchedule + #self.vNecroWarriorSchedule ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +-- don't count urns as units that must be destroyed +function CMapEncounter_ShadowDemons:MustKillForEncounterCompletion( hEnemyCreature ) + if hEnemyCreature:GetUnitName() == "npc_dota_creature_upheaval_urn" then + return false + end + + return true +end + +-------------------------------------------------------------------------------- + +-- only count the v2 portals for our max unit count - we don't want to count the urns since they're indestructible +function CMapEncounter_ShadowDemons:GetMaxSpawnedUnitCount() + + local nCount = 0 + + for _,PortalSpawner in pairs ( self.PortalSpawnersV2 ) do + nCount = nCount + self:ComputeUnitsSpawnedBySchedule( PortalSpawner ) + end + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_ShadowDemons:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +--[[function CMapEncounter_ShadowDemons:RemoveUrns() + print( 'CMapEncounter_ShadowDemons:RemoveUrns called') + local hUrns = FindUnitsInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_BOTH, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_ANY_ORDER, false ) + for i=1, #hUrns do + print( 'Found unit named ' .. hUrns[i]:GetUnitName() ) + if hUrns[i]:GetUnitName() == "npc_dota_creature_upheaval_urn" then + print( 'Removing urn #' .. i ) + hUrns[i]:ForceKill( false ) + UTIL_Remove( hUrns[i] ) + end + end +end +--]] +-------------------------------------------------------------------------------- + +function CMapEncounter_ShadowDemons:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + --print( "CMapEncounter_Pinecones:OnSpawnerFinished" ) + + if hSpawner:GetSpawnerType() == "CPortalSpawnerV2" then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end + + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + if hSpawnedUnit:GetUnitName() == "npc_dota_creature_doom" then + EmitSoundOn( "encounter_shadow_demons.doom.intro", hSpawnedUnit ) + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_ShadowDemons diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_spectres.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_spectres.lua new file mode 100755 index 0000000..add31b2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_spectres.lua @@ -0,0 +1,146 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Spectres == nil then + CMapEncounter_Spectres = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Spectres:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + -- Initial Spawns + self.szPeonSpawner = "spawner_peon" + self.szCaptainSpawner = "spawner_captain" + + self:AddSpawner( CDotaSpawner( self.szPeonSpawner, self.szPeonSpawner, + { + { + EntityName = "npc_dota_creature_wolf", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 75.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( self.szCaptainSpawner, self.szCaptainSpawner, + { + { + EntityName = "npc_dota_creature_spectre", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + -- Dynamic Spawns + self.vWaveSchedule = + { + { + Time = 15, + Count = 1, + }, + { + Time = 40, + Count = 2, + }, + { + Time = 65, + Count = 2, + }, + { + Time = 90, + Count = 2, + }, + } + + --DeepPrintTable( self.vWaveSchedule ) + + self.szDynamicPortal = "dynamic_portal" + local bInvulnerable = true + + self:AddPortalSpawnerV2( CPortalSpawnerV2( self.szDynamicPortal, self.szDynamicPortal, 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_wolf", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 200.0, + }, + { + EntityName = "npc_dota_creature_spectre", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( self.szDynamicPortal, self.vWaveSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Spectres:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "survive_waves", 0, #self.vWaveSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Spectres:GetPreviewUnit() + return "npc_dota_creature_spectre" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Spectres:Start() + CMapEncounter.Start( self ) + + self:CreateUnits() + self:StartSpawnerSchedule( self.szDynamicPortal, 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Spectres:CreateUnits() + for _,Spawner in pairs ( self:GetSpawners() ) do + Spawner:SpawnUnits() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Spectres:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + --print( "CMapEncounter_Spectres:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Spectres diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_starting_room.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_starting_room.lua new file mode 100755 index 0000000..58477ce --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_starting_room.lua @@ -0,0 +1,230 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_StartingRoom == nil then + CMapEncounter_StartingRoom = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_StartingRoom:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + self:GetRoom().hSpawnGroupHandle = GetActiveSpawnGroupHandle() + self.bRewardsSelected = false + self.bSpokenGameStartLine = false + self.bAllButtonsReady = false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_StartingRoom:Start() + + self.flStartTime = GameRules:GetGameTime() + + if GameRules.Aghanim:HasSetAscensionLevel() == false then + + -- Default the ascension level now in case we do any developer shit, and juke the system to think we haven't set it yet + GameRules.Aghanim:SetAscensionLevel( 0 ) + GameRules.Aghanim.bHasSetAscensionLevel = false + + local nMaxOption = GameRules.Aghanim:GetMaxAllowedAscensionLevel() + local nOption = 0 + while nOption <= nMaxOption do + local hAscensionLocator = Entities:FindByName( nil, "ascension_picker_locator_" .. ( nOption + 1 ) ) + if hAscensionLocator == nil then + break + end + + local vOrigin = hAscensionLocator:GetAbsOrigin() + local vAngles = hAscensionLocator:GetAnglesAsVector() + local pickerTable = + { + MapUnitName = "npc_dota_aghsfort_watch_tower_option_1", + origin = tostring( vOrigin.x ) .. " " .. tostring( vOrigin.y ) .. " " .. tostring( vOrigin.z ), + angles = tostring( vAngles.x ) .. " " .. tostring( vAngles.y ) .. " " .. tostring( vAngles.z ), + OptionNumber = tostring( nOption + 1 ), + teamnumber = DOTA_TEAM_NEUTRALS, + AscensionLevelPicker = 1, + } + + CreateUnitFromTable( pickerTable, vOrigin ) + nOption = nOption + 1 + end + + if nOption == 0 then + print( "Unable to find ascension_picker_locator_ entities!\n" ) + self:OnAscensionLevelSelected( { level = 1 } ) + return + end + end + + -- Use encounter name to display "select ascension level" + self:Introduce() + + -- Players Ready + self.nPlayersReady = 0 + local nTriggerStartTouchEvent = ListenToGameEvent( "trigger_start_touch", Dynamic_Wrap( getclass( self ), "OnTriggerStartTouch" ), self ) + table.insert( self.EventListeners, nTriggerStartTouchEvent ) + local nTriggerEndTouchEvent = ListenToGameEvent( "trigger_end_touch", Dynamic_Wrap( getclass( self ), "OnTriggerEndTouch" ), self ) + table.insert( self.EventListeners, nTriggerEndTouchEvent ) + local nAscensionSelectedEvent = ListenToGameEvent( "aghsfort_ascension_level_selected", Dynamic_Wrap( getclass( self ), "OnAscensionLevelSelected" ), self ) + table.insert( self.EventListeners, nAscensionSelectedEvent ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_StartingRoom:OnAscensionLevelSelected( event ) + print( "Ascension Level " .. event.level .. " selected" ) + GameRules.Aghanim:SetAscensionLevel( event.level - 1 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_StartingRoom:OnThink() + CMapEncounter.OnThink( self ) + + -- Don't speak until all players are connected + if self.bSpokenGameStartLine == false then + + local nConnectedPlayerCount = 0 + local nPlayerCount = 0 + for nPlayerID = 0, AGHANIM_PLAYERS - 1 do + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS and PlayerResource:IsValidPlayerID( nPlayerID ) then + nPlayerCount = nPlayerCount + 1 + if PlayerResource:GetConnectionState( nPlayerID ) == DOTA_CONNECTION_STATE_CONNECTED then + nConnectedPlayerCount = nConnectedPlayerCount + 1 + end + end + end + + if nConnectedPlayerCount == nPlayerCount then + GameRules.Aghanim:GetAnnouncer():OnGameStarted( ) + self.bSpokenGameStartLine = true + end + + end + + -- Update UI indicating who has picked their reward + local vecRewardState = GameRules.Aghanim:DetermineRewardSelectionState() + if vecRewardState ~= nil then + local nNumSelected = 0 + local vecPlayers = GameRules.Aghanim:GetConnectedPlayers() + for i=1,#vecPlayers do + if vecRewardState[ tostring( vecPlayers[i] ) ] == true then + nNumSelected = nNumSelected + 1 + end + end + self:UpdateEncounterObjective( "objective_select_aghanims_fragmants", nNumSelected, nil ) + + if #vecPlayers > 0 and nNumSelected == #vecPlayers then + self:GetRoom().bSpawnGroupReady = true + self.bRewardsSelected = true + end + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_StartingRoom:InitializeObjectives() + --CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "objective_stand_on_buttons", 0, 4 ) + self:AddEncounterObjective( "objective_select_aghanims_fragmants", 0, 4 ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_StartingRoom:OnTriggerStartTouch( event ) + + if self.bAllButtonsReady == true then + return + end + + -- Get the trigger that activates the room + local szTriggerName = event.trigger_name + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + if szTriggerName == "trigger_player_1" + or szTriggerName == "trigger_player_2" + or szTriggerName == "trigger_player_3" + or szTriggerName == "trigger_player_4" then + --printf( "szTriggerName: %s, hUnit:GetUnitName(): %s, hTriggerEntity:GetName(): %s", szTriggerName, hUnit:GetUnitName(), hTriggerEntity:GetName() ) + + self.nPlayersReady = self.nPlayersReady + 1 + self:UpdateEncounterObjective( "objective_stand_on_buttons", self.nPlayersReady, nil ) + + local vecPlayers = GameRules.Aghanim:GetConnectedPlayers() + if #vecPlayers > 0 then + if self.nPlayersReady == #vecPlayers then + + self.bAllButtonsReady = true + self:GenerateRewards() + + -- We want to announce rewards during the starting room + GameRules.Aghanim:GetAnnouncer():OnSelectRewards() + + -- Open the main gate + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "main_gate_open_relay", false ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_StartingRoom:OnTriggerEndTouch( event ) + + if self.bAllButtonsReady == true then + return + end + + -- Get the trigger that activates the room + local szTriggerName = event.trigger_name + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + if szTriggerName == "trigger_player_1" + or szTriggerName == "trigger_player_2" + or szTriggerName == "trigger_player_3" + or szTriggerName == "trigger_player_4" then + --printf( "szTriggerName: %s, hUnit:GetUnitName(): %s, hTriggerEntity:GetName(): %s", szTriggerName, hUnit:GetUnitName(), hTriggerEntity:GetName() ) + + self.nPlayersReady = self.nPlayersReady - 1 + self:UpdateEncounterObjective( "objective_stand_on_buttons", self.nPlayersReady, nil ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_StartingRoom:CheckForCompletion() + return GameRules.Aghanim:HasSetAscensionLevel() == true and self.bRewardsSelected == true +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_StartingRoom:OnComplete() + CMapEncounter.OnComplete( self ) + + for nPlayerID=0,AGHANIM_PLAYERS-1 do + local hHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hHero then + hHero:SetAbilityPoints( 2 ) + EmitSoundOnClient( "General.LevelUp", hHero:GetPlayerOwner() ) + ParticleManager:ReleaseParticleIndex( ParticleManager:CreateParticle( "particles/generic_hero_status/hero_levelup.vpcf", PATTACH_ABSORIGIN_FOLLOW, nil ) ) + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_StartingRoom diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_storegga.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_storegga.lua new file mode 100755 index 0000000..dc73fa8 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_storegga.lua @@ -0,0 +1,269 @@ + +require( "encounters/encounter_boss_base" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Storegga == nil then + CMapEncounter_Storegga = class( {}, {}, CMapEncounter_BossBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:constructor( hRoom, szEncounterName ) + + CMapEncounter_BossBase.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self.szRockSpawner_1 = "spawner_rock1" + self.szRockSpawner_2 = "spawner_rock2" + self.szRockSpawner_3 = "spawner_rock3" + self.szBossSpawner = "spawner_boss" + + self.Rocks = {} + + self:AddSpawner( CDotaSpawner( self.szRockSpawner_1, self.szRockSpawner_1, + { + { + EntityName = "npc_dota_storegga_rock", + Team = DOTA_TEAM_GOODGUYS, + Count = 1, + PositionNoise = 200.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( self.szRockSpawner_2, self.szRockSpawner_2, + { + { + EntityName = "npc_dota_storegga_rock2", + Team = DOTA_TEAM_GOODGUYS, + Count = 1, + PositionNoise = 200.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( self.szRockSpawner_3, self.szRockSpawner_3, + { + { + EntityName = "npc_dota_storegga_rock3", + Team = DOTA_TEAM_GOODGUYS, + Count = 1, + PositionNoise = 200.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( self.szBossSpawner, self.szBossSpawner, + { + { + EntityName = "npc_dota_creature_storegga", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:Precache( context ) + CMapEncounter_BossBase.Precache( self, context ) + + PrecacheUnitByNameSync( "npc_dota_creature_small_storegga", context, -1 ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_tiny", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_storegga.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/voscripts/game_sounds_vo_tiny.vsndevts", context ) + PrecacheResource( "model", "models/heroes/tiny_01/tiny_01.vmdl", context ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:GetPreviewUnit() + return "npc_dota_creature_storegga" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:Start() + CMapEncounter_BossBase.Start( self ) + self:CreateOtherUnits() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:OnThink() + CMapEncounter_BossBase.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:MustKillForEncounterCompletion( hEnemyCreature ) + if hEnemyCreature:GetUnitName() == "npc_dota_creature_small_storegga" then + return false + end + if hEnemyCreature:GetUnitName() == "npc_dota_storegga_rock" then + return false + end + if hEnemyCreature:GetUnitName() == "npc_dota_storegga_rock2" then + return false + end + if hEnemyCreature:GetUnitName() == "npc_dota_storegga_rock3" then + return false + end + return true +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:CreateOtherUnits() + for _,Spawner in pairs ( self:GetSpawners() ) do + if Spawner.szSpawnerName ~= "spawner_boss" then + local hRocks = Spawner:SpawnUnits() + for _,hRock in pairs ( hRocks ) do + table.insert( self.Rocks, hRock ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:OnComplete() + CMapEncounter_BossBase.OnComplete( self ) + + for _,hRock in pairs ( self.Rocks ) do + UTIL_Remove( hRock ) + end +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:GetBossIntroVoiceLine() + return "tiny_tiny_pres_t3_spawn_03" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:GetBossIntroGesture() + return ACT_TINY_GROWL +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:GetBossIntroCameraPitch() + return 40 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:GetBossIntroCameraDistance() + return 800 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:GetBossIntroCameraHeight() + return 350 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:GetLaughLine() + + local szLines = + { + "tiny_tiny_pres_t3_laugh_01", + "tiny_tiny_pres_t3_laugh_02", + "tiny_tiny_pres_t3_laugh_03", + "tiny_tiny_pres_t3_laugh_04", + "tiny_tiny_pres_t3_laugh_05", + "tiny_tiny_pres_t3_laugh_06", + "tiny_tiny_pres_t3_laugh_07", + "tiny_tiny_pres_t3_laugh_08", + } + + return szLines[ RandomInt( 1, #szLines ) ] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:GetKillTauntLine() + local szLines = + { + "tiny_tiny_pres_t3_kill_01", + "tiny_tiny_pres_t3_kill_03", + "tiny_tiny_pres_t3_kill_04", + "tiny_tiny_pres_t3_kill_05", + "tiny_tiny_pres_t3_kill_06", + "tiny_tiny_pres_t3_kill_09", + "tiny_tiny_pres_t3_ability_toss_11", + "tiny_tiny_pres_t3_ability_toss_08", + "tiny_tiny_pres_t3_ability_toss_07", + "tiny_tiny_pres_t3_ability_toss_06", + "tiny_tiny_pres_t3_attack_08", + "tiny_tiny_pres_t3_attack_06", + } + + return szLines[ RandomInt( 1, #szLines ) ] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Storegga:GetAbilityUseLine( szAbilityName ) + local szLineToUse = self:GetLaughLine() + if szAbilityName == "storegga_grab_throw" then + local szLines = + { + "tiny_tiny_pres_t3_ability_toss_13", + "tiny_tiny_pres_t3_ability_toss_12", + "tiny_tiny_pres_t3_ability_toss_05", + "tiny_tiny_pres_t3_ability_toss_04", + "tiny_tiny_pres_t3_ability_toss_03", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + if szAbilityName == "storegga_arm_slam" then + local szLines = + { + "tiny_tiny_pres_t3_attack_12", + "tiny_tiny_pres_t3_attack_11", + "tiny_tiny_pres_t3_attack_07", + "tiny_tiny_pres_t3_ability_toss_01", + "tiny_tiny_pres_t3_ability_toss_02", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + if szAbilityName == "storegga_ground_pound" then + local szLines = + { + "tiny_tiny_pres_t3_attack_04", + "tiny_tiny_pres_t3_attack_05", + "tiny_tiny_pres_t3_attack_03", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + if szAbilityName == "storegga_avalanche" then + local szLines = + { + "tiny_tiny_pres_t3_ability_toss_15", + "tiny_tiny_pres_t3_ability_toss_14", + "tiny_tiny_pres_t3_ability_grow_02", + } + szLineToUse = szLines[ RandomInt( 1, #szLines ) ] + end + + + return szLineToUse +end + + +-------------------------------------------------------------------------------- + +return CMapEncounter_Storegga diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_temple_garden.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_temple_garden.lua new file mode 100755 index 0000000..3ee4233 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_temple_garden.lua @@ -0,0 +1,65 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "encounters/encounter_trap_base" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_TempleGarden == nil then + CMapEncounter_TempleGarden = class( {}, {}, CMapEncounter_TrapBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGarden:GetPreviewUnit() + return "npc_dota_breathe_fire_trap" +end + +-------------------------------------------------------------------------------- +--[[ +function CMapEncounter_TempleGarden:Start() + CMapEncounter_TrapBase.Start( self ) + if not IsServer() then + return + end + local wardUnits = Entities:FindAllByName( "spawner_ward" ) + local wardUnit = "npc_dota_observer_ward_journey" + for _, spawnerUnit in pairs(wardUnits) do + local hUnit = CreateUnitByName( wardUnit, spawnerUnit:GetAbsOrigin(), true, nil, nil, DOTA_TEAM_GOODGUYS ) + if hUnit ~= nil then + --print("Placing a ward") + hUnit:SetForwardVector( RandomVector( 1 ) ) + end + end +end +]] +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGarden:CheckForCompletion() + if not IsServer() then + return + end + local bIsComplete = CMapEncounter_TrapBase.CheckForCompletion( self ) + if bIsComplete then + self:DisableTraps() + end + + return bIsComplete +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGarden:DisableTraps() + --print("Disabling Traps!") + -- Disable any traps in the map + local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "disable_traps_relay", false ) + --local hRelays = Entities:FindAllByName( "disable_traps_relay" ) + for _, hRelay in pairs( hRelays ) do + hRelay:Trigger( nil, nil ) + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_TempleGarden diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_temple_guardians.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_temple_guardians.lua new file mode 100755 index 0000000..fc366c6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_temple_guardians.lua @@ -0,0 +1,91 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "encounters/encounter_boss_base" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_TempleGuardians == nil then + CMapEncounter_TempleGuardians = class( {}, {}, CMapEncounter_BossBase ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGuardians:constructor( hRoom, szEncounterName ) + + CMapEncounter_BossBase.constructor( self, hRoom, szEncounterName ) + + + self.szBossSpawner = "spawner_boss" + + self:AddSpawner( CDotaSpawner( self.szBossSpawner, self.szBossSpawner, + { + { + EntityName = "npc_dota_creature_temple_guardian", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGuardians:GetPreviewUnit() + return "npc_dota_creature_temple_guardian" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGuardians:GetBossIntroGesture() + return ACT_DOTA_CAPTURE +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGuardians:GetBossIntroCameraPitch() + return 30 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGuardians:GetBossIntroCameraDistance() + return 800 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGuardians:GetBossIntroCameraHeight() + return 85 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGuardians:GetBossIntroCameraYawRotateSpeed() + return 0.1 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGuardians:GetBossIntroCameraInitialYaw() + return 120 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGuardians:GetBossIntroDuration() + return 5.0 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TempleGuardians:IntroduceBoss( hEncounteredBoss ) + CMapEncounter_BossBase.IntroduceBoss( self, hEncounteredBoss ) + + EmitGlobalSound( "Boss.Intro" ) +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_TempleGuardians diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_test_immediate_victory.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_test_immediate_victory.lua new file mode 100755 index 0000000..7072e27 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_test_immediate_victory.lua @@ -0,0 +1,25 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_TestImmediateVictory == nil then + CMapEncounter_TestImmediateVictory = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TestImmediateVictory:GetPreviewUnit() + return "npc_dota_shop_keeper" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TestImmediateVictory:CheckForCompletion() + return true +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_TestImmediateVictory diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_test_reward_room.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_test_reward_room.lua new file mode 100755 index 0000000..dcb4176 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_test_reward_room.lua @@ -0,0 +1,19 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_TestRewardRoom == nil then + CMapEncounter_TestRewardRoom = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TestRewardRoom:CheckForCompletion() + return true +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_TestRewardRoom diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_transition.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_transition.lua new file mode 100755 index 0000000..c8845af --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_transition.lua @@ -0,0 +1,25 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Transition == nil then + CMapEncounter_Transition = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Transition:GetPreviewUnit() + return "npc_dota_creature_temple_guardian" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Transition:CheckForCompletion() + return true +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Transition diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_trap_base.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_trap_base.lua new file mode 100755 index 0000000..e686148 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_trap_base.lua @@ -0,0 +1,153 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_TrapBase == nil then + CMapEncounter_TrapBase = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrapBase:Precache( context ) + CMapEncounter.Precache( self, context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_monkey_king/monkey_king_disguise.vpcf", context ) + PrecacheUnitByNameSync( "npc_dota_pendulum_trap", context, -1 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrapBase:OnEncounterLoaded() + CMapEncounter.OnEncounterLoaded( self ) + + self.HeroesOnGoal = {} + self.nHeroOnTrigger1 = 0 + self.nHeroOnTrigger2 = 0 + self.nHeroOnTrigger3 = 0 + self.nHeroOnTrigger4 = 0 + self.nHeroesOnGoal = 0 + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrapBase:InitializeObjectives() + self:AddEncounterObjective( "navigate_the_traps", 0, 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrapBase:GetMaxSpawnedUnitCount() + return 0 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrapBase:Start() + CMapEncounter.Start( self ) + + local hHeroes = HeroList:GetAllHeroes() + + for _, hHero in pairs ( hHeroes ) do + if hHero ~= nil and not hHero:IsNull() and hHero:IsRealHero() then + hHero:AddNewModifier( hHero, nil, "modifier_aghsfort_player_transform", { duration = -1 } ) + end + end + + local PendulumSpawners = self:GetRoom():FindAllEntitiesInRoomByName( "pendulum_trap", false ) + for _,Spawner in pairs ( PendulumSpawners ) do + local hPendulum = CreateUnitByName( "npc_dota_pendulum_trap", Spawner:GetAbsOrigin(), false, nil, nil, DOTA_TEAM_BADGUYS ) + if hPendulum then + print( "Found pendulum") + hPendulum:SetForwardVector( Spawner:GetForwardVector() ) + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrapBase:OnThink() + CMapEncounter.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrapBase:CheckForCompletion() + local nHeroesAlive = 0 + local hHeroes = HeroList:GetAllHeroes() + for _, hHero in pairs ( hHeroes ) do + if hHero ~= nil and hHero:IsRealHero() and hHero:GetTeamNumber() == DOTA_TEAM_GOODGUYS then + if hHero:IsAlive() or hHero:GetRespawnsDisabled() == false then + nHeroesAlive = nHeroesAlive + 1 + end + end + end + self.nHeroesOnGoal = self.nHeroOnTrigger1 + self.nHeroOnTrigger2 + self.nHeroOnTrigger3 + self.nHeroOnTrigger4 + return nHeroesAlive > 0 and self.nHeroesOnGoal == nHeroesAlive +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrapBase:OnTriggerStartTouch( event ) + + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + local szTriggerName = event.trigger_name + if hUnit ~= nil and hUnit:IsRealHero() and hUnit:IsControllableByAnyPlayer() then + if szTriggerName == "trigger_player_1" then + self.nHeroOnTrigger1 = 1 + elseif szTriggerName == "trigger_player_2" then + self.nHeroOnTrigger2 = 1 + elseif szTriggerName == "trigger_player_3" then + self.nHeroOnTrigger3 = 1 + elseif szTriggerName == "trigger_player_4" then + self.nHeroOnTrigger4 = 1 + end + --table.insert( self.HeroesOnGoal, hUnit ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrapBase:OnTriggerEndTouch( event ) + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + local szTriggerName = event.trigger_name + if hUnit ~= nil and hUnit:IsRealHero() and hUnit:IsControllableByAnyPlayer() then + if szTriggerName == "trigger_player_1" then + self.nHeroOnTrigger1 = 0 + elseif szTriggerName == "trigger_player_2" then + self.nHeroOnTrigger2 = 0 + elseif szTriggerName == "trigger_player_3" then + self.nHeroOnTrigger3 = 0 + elseif szTriggerName == "trigger_player_4" then + self.nHeroOnTrigger4 = 0 + end + --[[ + for k,hHero in pairs( self.HeroesOnGoal ) do + if hHero == hUnit then + table.remove( self.HeroesOnGoal, k ) + end + end + ]] + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrapBase:OnComplete() + CMapEncounter.OnComplete( self ) + local hHeroes = HeroList:GetAllHeroes() + + for _, hHero in pairs ( hHeroes ) do + if hHero ~= nil and not hHero:IsNull() and hHero:IsRealHero() then + hHero:RemoveModifierByName( "modifier_aghsfort_player_transform" ) + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_TrapBase diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_troll_warlord.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_troll_warlord.lua new file mode 100755 index 0000000..f79fdf4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_troll_warlord.lua @@ -0,0 +1,316 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_TrollWarlord == nil then + CMapEncounter_TrollWarlord = class( {}, {}, CMapEncounter ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_troll_warlord", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_troll_warlord.vsndevts", context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_beastmaster", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_beastmaster.vsndevts", context ) + PrecacheUnitByNameSync( "npc_dota_creature_sheep_hostage", context ) + PrecacheModel( "npc_dota_creature_sheep_hostage", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_lone_druid/lone_druid_bear_entangle.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_lone_druid/lone_druid_bear_entangle_body.vpcf", context ) + PrecacheResource( "particle", "particles/econ/events/league_teleport_2014/teleport_start_league.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self.bInitialSpawn = true + self.bCagesSpawned = false + self.nSheepToRescue = 4 + self.nSheepRescued = 0 + --Hack to get objectives to work + self.nEnemies = 0 + + self:SetCalculateRewardsFromUnitCount( true ) + + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_beastmaster_boar", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 0.0, + }, + { + EntityName = "npc_dota_creature_beastmaster_boss", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + --Spawner schedule for Troll Warlord + local bInvulnerable = true + local vCaptainSchedule = { { Time = 0, Count = 1 } } + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_captain_1", "spawner_captain_1", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_troll_warlord_ranged", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable ) ) + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_captain_2", "spawner_captain_2", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_troll_warlord_melee", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable ) ) + + self:SetSpawnerSchedule( "spawner_peon", nil ) -- means spawn once when triggered + self:SetSpawnerSchedule( "spawner_captain_1", vCaptainSchedule ) + self:SetSpawnerSchedule( "spawner_captain_2", vCaptainSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:SpawnCages() + print("Spawning cages") + local captureUnits = Entities:FindAllByName( "spawner_cage" ) + --Shuffling the table + local shuffledUnits = self:ShuffleCages(captureUnits) + + local cageUnit = "npc_dota_cage" + local nCageID = 0 + for _, captureUnit in pairs(shuffledUnits) do + + local vSpawnLoc = captureUnit:GetAbsOrigin() + local vAngles = VectorAngles( RandomVector( 1 ) ) + local cageTable = + { + MapUnitName = cageUnit, + origin = tostring( vSpawnLoc.x ) .. " " .. tostring( vSpawnLoc.y ) .. " " .. tostring( vSpawnLoc.z ), + angles = tostring( vAngles.x ) .. " " .. tostring( vAngles.y ) .. " " .. tostring( vAngles.z ), + teamnumber = DOTA_TEAM_BADGUYS, + NeverMoveToClearSpace = false, + } + + local hUnit = CreateUnitFromTable( cageTable, vSpawnLoc ) + if hUnit ~= nil then + --print("Placing a cage") + nCageID = nCageID + 1 + hUnit:Attribute_SetIntValue( "cageID", nCageID ) + --Don't double count the cages + self.nEnemies = self.nEnemies + 1 + end + end + self.bCagesSpawned = true + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue, self.nEnemies) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:StartExitPortal() + local szPortalFX = "particles/portals/portal_ground_spawn_endpoint.vpcf" + local PortalPoints = self:GetRoom():FindAllEntitiesInRoomByName( "dynamic_portal" ) + if PortalPoints == nil then + --print("No Portal Points Found!") + return + end + for _, hPortal in pairs ( PortalPoints ) do + --print("Spawning Portal FX") + local effects = ParticleManager:CreateParticle( szPortalFX, PATTACH_WORLDORIGIN, hPortal ) + ParticleManager:SetParticleControl( effects, 0, hPortal:GetAbsOrigin() ) + EmitGlobalSound("Aghsfort_DarkPortal.Created") + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + --Hack to get objectives to work + self.nEnemies = self:GetMaxSpawnedUnitCount() + self:AddEncounterObjective( "defeat_all_enemies", 0, self.nEnemies ) + self:AddEncounterObjective( "rescue_sheep", self.nSheepRescued, self.nSheepToRescue ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:GetMaxSpawnedUnitCount() + local nCount = 0 + -- Map has 7 peon spawners + local hPeonSpawners = self:GetSpawner( "spawner_peon") + if hPeonSpawners then + nCount = nCount + hPeonSpawners:GetSpawnPositionCount() * 4 + end + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:CheckForCompletion() + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + if nCurrentValue >= self.nEnemies and self.nSheepRescued == 4 then + return true + end + return false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:GetPreviewUnit() + return "npc_dota_creature_troll_warlord_ranged" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:Start() + CMapEncounter.Start( self ) + self:CreateEnemies() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:CreateEnemies() + for _,Spawner in pairs ( self:GetSpawners() ) do + Spawner:SpawnUnits() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + if self.bInitialSpawn == true then + self:SpawnCages() + self.bInitialSpawn = false + end + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:OnEntityKilled( event ) + if not IsServer() then + return + end + + if self.bCagesSpawned == false then + return + end + + local killedUnit = EntIndexToHScript( event.entindex_killed ) + if killedUnit == nil then + return + end + + if killedUnit:GetUnitName() =="npc_dota_creature_beastmaster_boss" or + killedUnit:GetUnitName() == "npc_dota_creature_beastmaster_boar" or + killedUnit:GetUnitName() == "npc_dota_creature_troll_warlord_melee" or + killedUnit:GetUnitName() == "npc_dota_creature_troll_warlord_ranged" or + killedUnit:GetUnitName() == "npc_dota_cage" then + --print(killedUnit:GetUnitName()) + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, self.nEnemies ) + end + + --Check to see if it's a cage + if killedUnit:GetUnitName() == "npc_dota_cage" then + local cageAttribute = killedUnit:Attribute_GetIntValue( "cageID", -1 ) + if cageAttribute ~= -1 then + local szHostageUnit = "npc_dota_creature_beastmaster_boar" + local vCagePos = killedUnit:GetOrigin() + --print("Cage has been destroyed") + if cageAttribute < 5 then + --print("Cage has been released") + --self:StartExitPortal() + self.nSheepRescued = self.nSheepRescued + 1 + --Update the objectives + local nCurrentValue = self:GetEncounterObjectiveProgress( "rescue_sheep" ) + self:UpdateEncounterObjective( "rescue_sheep", nCurrentValue + 1, nil ) + --Spawn sheep + szHostageUnit = "npc_dota_creature_sheep_hostage" + local hHostage = CreateUnitByName( szHostageUnit, vCagePos, true, nil, nil, DOTA_TEAM_GOODGUYS ) + if hHostage ~= nil then + --print("Spawning a sheep") + local hPortal = Entities:FindByName( nil, "portal_path_track" ) + hHostage:SetInitialGoalEntity( hPortal ) + EmitSoundOn("Creature.Sheep.Spawn", hHostage) + end + if self.nSheepRescued == 4 then + self:SpawnWarlord() + end + else + --Don't always spawn boars + local nRoll = RandomInt(1,2) + if nRoll == 1 then + local hBoar = CreateUnitByName( szHostageUnit, vCagePos, true, nil, nil, DOTA_TEAM_BADGUYS ) + hBoar:SetForwardVector( RandomVector( 1 ) ) + --Hack to get objectives to work + self.nEnemies = self.nEnemies + 1 + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue, self.nEnemies ) + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:SpawnWarlord() + print("Spawning Warlord") + self:StartSpawnerSchedule( "spawner_captain_1", 0 ) + self:StartSpawnerSchedule( "spawner_captain_2", 0 ) + self.nEnemies = self.nEnemies + 2 + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue, self.nEnemies ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TrollWarlord:ShuffleCages(orig_list) + local list = shallowcopy( orig_list ) + local result = {} + local count = #list + for i = 1, count do + local pick = RandomInt( 1, #list ) + result[ #result + 1 ] = list[ pick ] + table.remove( list, pick ) + end + return result +end + +return CMapEncounter_TrollWarlord diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_tusk_skeletons.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_tusk_skeletons.lua new file mode 100755 index 0000000..fa8abe0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_tusk_skeletons.lua @@ -0,0 +1,208 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawnerv2" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_TuskSkeletons == nil then + CMapEncounter_TuskSkeletons = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TuskSkeletons:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self.vPeonSchedule = + { + { + Time = 0, + Count = 2, + }, + { + Time = 25, + Count = 3, + }, + { + Time = 50, + Count = 3, + }, + { + Time = 75, + Count = 4, + }, + } + + --DeepPrintTable( self.vPeonSchedule ) + + local bInvulnerable = true + + self:AddPortalSpawnerV2( CPortalSpawnerV2( "spawner_peon", "spawner_peon", 8, 5, 1.0, + { + { + EntityName = "npc_dota_creature_tusk_skeleton", + Team = DOTA_TEAM_BADGUYS, + Count = 6, + PositionNoise = 200.0, + }, + { + EntityName = "npc_dota_creature_spectral_tusk_mage", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + }, bInvulnerable + ) ) + + self:SetSpawnerSchedule( "spawner_peon", self.vPeonSchedule ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TuskSkeletons:Precache( context ) + CMapEncounter.Precache( self, context ) + + local friendTable = + { + MapUnitName = "npc_dota_creature_friendly_ogre_seal", + teamnumber = DOTA_TEAM_GOODGUYS, + } + + PrecacheUnitFromTableSync( friendTable, context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TuskSkeletons:GetPreviewUnit() + return "npc_dota_creature_spectral_tusk_mage" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TuskSkeletons:InitializeObjectives() + self:AddEncounterObjective( "survive_waves", 0, #self.vPeonSchedule ) + self:AddEncounterObjective( "save_gary", 0, 0 ) + + CMapEncounter.InitializeObjectives( self ) + -- self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TuskSkeletons:OnEncounterLoaded() + CMapEncounter.OnEncounterLoaded( self ) + + self.szObjectiveEnts = "objective" + self.hObjectiveEnts = self:GetRoom():FindAllEntitiesInRoomByName( self.szObjectiveEnts, true ) + + if #self.hObjectiveEnts == 0 then + printf( "WARNING - self.hObjectiveEnt is nil (looked for classname \"%s\")", self.szObjectiveEnts ) + return + end + + self.hFriend = CreateUnitByName( "npc_dota_creature_friendly_ogre_seal", self.hObjectiveEnts[1]:GetOrigin(), false, nil, nil, DOTA_TEAM_GOODGUYS ) + + if self.hFriend ~= nil then + self.hFriend:SetForwardVector( RandomVector( 1 ) ) + + local nAscLevel = GameRules.Aghanim:GetAscensionLevel() + self.hFriend:CreatureLevelUp( nAscLevel ) + + self.vGoalPos = self.hFriend:GetAbsOrigin() + else + printf( "WARNING - Failed to spawn the objective entity!" ) + return + end + + --[[ + local objectiveAngles = self.hObjectiveEnts[ 1 ]:GetAngles() + self.hFriend:SetAbsAngles( objectiveAngles.x, objectiveAngles.y, objectiveAngles.z ) + ]] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TuskSkeletons:ShouldAutoStartGlobalAscensionAbilities() + return false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TuskSkeletons:Start() + CMapEncounter.Start( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TuskSkeletons:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner.szSpawnerName == "spawner_peon" then + if hSpawner.schedule then + local nCurrentValue = self:GetEncounterObjectiveProgress( "survive_waves" ) + self:UpdateEncounterObjective( "survive_waves", nCurrentValue + 1, nil ) + end + end + + for _, hSpawnedUnit in pairs ( hSpawnedUnits ) do + if self.hFriend ~= nil and ( not self.hFriend:IsNull() ) and self.hFriend:IsAlive() then + hSpawnedUnit:SetInitialGoalEntity( self.hFriend ) + else + if self.hObjectiveEnts[ 1 ] ~= nil and self.hObjectiveEnts[ 1 ]:IsNull() == false then + hSpawnedUnit:SetInitialGoalPosition( self.hObjectiveEnts[ 1 ]:GetOrigin() ) + else + hSpawnedUnit:SetInitialGoalPosition( self.vGoalPos ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TuskSkeletons:OnTriggerStartTouch( event ) + CMapEncounter.OnTriggerStartTouch( self, event ) + + -- Get the trigger that activates the room + local szTriggerName = event.trigger_name + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + + --printf( "szTriggerName: %s, hUnit:GetUnitName(): %s, hTriggerEntity:GetName(): %s", szTriggerName, hUnit:GetUnitName(), hTriggerEntity:GetName() ) + + if self.bCreatureSpawnsActivated == nil and szTriggerName == "trigger_spawn_creatures" then + self.bCreatureSpawnsActivated = true + + self:StartGlobalAscensionAbilities() + self:StartAllSpawnerSchedules( 0 ) + + --printf( "Unit \"%s\" triggered creature spawning!", hUnit:GetUnitName() ) + EmitGlobalSound( "RoundStart" ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_TuskSkeletons:OnComplete() + CMapEncounter.OnComplete( self ) + + -- If friendly unit is still alive, grant some rewards and do other stuff + if self.hFriend ~= nil and ( not self.hFriend:IsNull() ) and self.hFriend:IsAlive() then + self.hFriend:Heal( self.hFriend:GetMaxHealth(), nil ) + local nFXIndex = ParticleManager:CreateParticle( "particles/items3_fx/fish_bones_active.vpcf", PATTACH_ABSORIGIN_FOLLOW, self.hFriend ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local nLives = 1 + for i = 1, nLives do + self:DropLifeRuneFromUnit( self.hFriend, nil, true ) + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_TuskSkeletons diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_undead_woods.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_undead_woods.lua new file mode 100755 index 0000000..75219ad --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_undead_woods.lua @@ -0,0 +1,135 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_UndeadWoods == nil then + CMapEncounter_UndeadWoods = class( {}, {}, CMapEncounter ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_UndeadWoods:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheResource( "particle_folder", "particles/units/heroes/hero_skeleton_king", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_skeletonking.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/voscripts/game_sounds_vo_skeleton_king.vsndevts", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_UndeadWoods:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self:AddSpawner( CDotaSpawner( "spawner_sk", "spawner_sk", + { + { + EntityName = "npc_dota_undead_woods_skeleton_king", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + + local flInitialPortalSpawnDelay = 0.0 + local flInitialSummonTime = 30.0 + local flPortalIntervalInput = DEFAULT_PORTAL_SPAWN_INTERVAL + local flScaleInput = 1.0 + self.nNumPortals = 4 + + for i=1,self.nNumPortals do + local name = string.format( "portal_%i", i ) + + self:AddPortalSpawner( CPortalSpawner( name, "dynamic_portal", 60 * hRoom:GetDepth(), flInitialPortalSpawnDelay, flInitialSummonTime, flPortalIntervalInput, flScaleInput, + { + { + EntityName = "npc_dota_wraith_king_skeleton_warrior", + Team = DOTA_TEAM_BADGUYS, + Count = 10, + PositionNoise = 0.0, + }, + } ) ) + end +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_UndeadWoods:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "destroy_spawning_portals", 0, self.nNumPortals ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_UndeadWoods:GetPreviewUnit() + return "npc_dota_undead_woods_skeleton_king" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_UndeadWoods:Start() + CMapEncounter.Start( self ) + + self:CreateEnemies() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_UndeadWoods:OnThink() + CMapEncounter.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_UndeadWoods:CreateEnemies() + for _,Spawner in pairs ( self:GetSpawners() ) do + Spawner:SpawnUnits() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_UndeadWoods:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + -- if hSpawner:GetSpawnerName() ~= "spawner_sk" then + -- local SkeletonKings = self:GetRoom():FindAllEntitiesInRoomByName( "npc_dota_undead_woods_skeleton_king" ) + -- if #SkeletonKings > 0 then + -- local hAbility = SkeletonKings[1]:FindAbilityByName( "undead_woods_skeleton_king_mortal_strike" ) + -- if hAbility then + -- for _,hUnit in pairs( hSpawnedUnits ) do + -- hUnit:AddNewModifier( SkeletonKings[1], hAbility, "modifier_skeleton_king_mortal_strike_summon", {} ) + -- end + -- end + -- end + -- end + + --print( "CMapEncounter_Wildwings:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_UndeadWoods diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_warlocks.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_warlocks.lua new file mode 100755 index 0000000..d4454c9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_warlocks.lua @@ -0,0 +1,216 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Warlocks == nil then + CMapEncounter_Warlocks = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Warlocks:Precache( context ) + CMapEncounter.Precache( self, context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_invoker/invoker_sun_strike_team.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_invoker/invoker_sun_strike.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_warlock/warlock_shadow_word_buff.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Warlocks:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + -- Pre-placed creatures (done this way to use a specific subset of existing map spawners) + self.vGatekeepersSchedule = + { + { + Time = 0, + Count = 2, + }, + } + + self:AddSpawner( CDotaSpawner( "spawner_gatekeepers", "spawner_gatekeepers", + { + { + EntityName = "npc_dota_creature_demon_golem", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 225.0, + }, + { + EntityName = "npc_dota_creature_warlock", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + ) ) + + -- Players have to kill these creatures to trigger the dynamic portals + self:SetPortalTriggerSpawner( "spawner_gatekeepers", 0.8 ) + self:SetSpawnerSchedule( "spawner_gatekeepers", self.vGatekeepersSchedule ) + + -- Additional creatures + self.vGroupCreaturesSchedule = + { + { + Time = 0, + Count = 1, + }, + } + + self:AddSpawner( CDotaSpawner( "spawner_group", "spawner_group", + { + { + EntityName = "npc_dota_creature_demon_golem", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 225.0, + }, + { + EntityName = "npc_dota_creature_warlock", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + ) ) + + self:SetSpawnerSchedule( "spawner_group", self.vGroupCreaturesSchedule ) + + -- Dynamic Portals + local nPortalHealth = 60 * hRoom:GetDepth() + local flInitialPortalSpawnDelay = 0.0 + local flInitialSummonTime = 6.0 + local flPortalIntervalInput = 45.0 + local flScaleInput = 1.0 + local nNumPortals = 3 + + local nNameCounter = 1 + local szLocatorName = "dynamic_portal" + self.nTotalPortals = nNumPortals + + local PortalUnits = + { + { + EntityName = "npc_dota_creature_demon_golem", + Team = DOTA_TEAM_BADGUYS, + Count = 2, + PositionNoise = 200.0, + }, + { + EntityName = "npc_dota_creature_warlock", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } + + for i = 1, nNumPortals do + local name = string.format( "portal_%i", nNameCounter ) + nNameCounter = nNameCounter + 1 + self:AddPortalSpawner( CPortalSpawner( name, szLocatorName, nPortalHealth, flInitialPortalSpawnDelay, + flInitialSummonTime, flPortalIntervalInput, flScaleInput, PortalUnits + ) ) + end + + flInitialPortalSpawnDelay = 24.0 + flInitialSummonTime = 5.0 + nNumPortals = 3 + self.nTotalPortals = self.nTotalPortals + nNumPortals + for i = 1, nNumPortals do + local name = string.format( "portal_%i", nNameCounter ) + nNameCounter = nNameCounter + 1 + self:AddPortalSpawner( CPortalSpawner( name, szLocatorName, nPortalHealth, flInitialPortalSpawnDelay, + flInitialSummonTime, flPortalIntervalInput, flScaleInput, PortalUnits + ) ) + end + + flInitialPortalSpawnDelay = 48.0 + flInitialSummonTime = 5.0 + nNumPortals = 3 + self.nTotalPortals = self.nTotalPortals + nNumPortals + for i = 1, nNumPortals do + local name = string.format( "portal_%i", nNameCounter ) + nNameCounter = nNameCounter + 1 + self:AddPortalSpawner( CPortalSpawner( name, szLocatorName, nPortalHealth, flInitialPortalSpawnDelay, + flInitialSummonTime, flPortalIntervalInput, flScaleInput, PortalUnits + ) ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Warlocks:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "destroy_spawning_portals", 0, self.nTotalPortals ) + self:AddEncounterObjective( "defeat_all_enemies", 0, self:GetMaxSpawnedUnitCount() ) -- doesn't capture pre-placed spawns? +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Warlocks:OnPortalV2Killed( hVictim, hAttacker, nUnitCountSuppressed ) + CMapEncounter.OnPortalV2Killed( self, hVictim, hAttacker, nUnitCountSuppressed ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + nUnitCountSuppressed, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Warlocks:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + local nCurrentValue = self:GetEncounterObjectiveProgress( "defeat_all_enemies" ) + self:UpdateEncounterObjective( "defeat_all_enemies", nCurrentValue + 1, nil ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Warlocks:GetPreviewUnit() + return "npc_dota_creature_warlock" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Warlocks:Start() + CMapEncounter.Start( self ) + + self:StartSpawnerSchedule( "spawner_gatekeepers", 0 ) + self:StartSpawnerSchedule( "spawner_group", 0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Warlocks:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + --print( "CMapEncounter_Warlocks:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _, hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt( 1, #heroes ) ] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Warlocks diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_wave_blasters.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_wave_blasters.lua new file mode 100755 index 0000000..7b9195b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_wave_blasters.lua @@ -0,0 +1,120 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +LinkLuaModifier( "modifier_room_monster_sleep", "modifiers/modifier_room_monster_sleep", LUA_MODIFIER_MOTION_NONE ) +-------------------------------------------------------------------------------- + +if CMapEncounter_WaveBlasters == nil then + CMapEncounter_WaveBlasters = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_WaveBlasters:Precache( context ) + CMapEncounter.Precache( self, context ) + PrecacheResource( "particle", "particles/generic_gameplay/generic_sleep.vpcf", context ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_WaveBlasters:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + self.nCaptains = 4 + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_aghsfort_creature_wave_blaster_ghost", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 400.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_captain", "spawner_captain", + { + { + EntityName = "npc_dota_creature_wave_blaster", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 200.0, + }, + } ) ) +end +-------------------------------------------------------------------------------- + +function CMapEncounter_WaveBlasters:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + self:AddEncounterObjective( "kill_waveblasters", 0, self.nCaptains ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_WaveBlasters:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + if hVictim and hVictim:GetUnitName() == "npc_dota_creature_wave_blaster" then + local nCurrentValue = self:GetEncounterObjectiveProgress( "kill_waveblasters" ) + self:UpdateEncounterObjective( "kill_waveblasters", nCurrentValue + 1, nil ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_WaveBlasters:GetPreviewUnit() + return "npc_dota_creature_wave_blaster" +end +-------------------------------------------------------------------------------- + +function CMapEncounter_WaveBlasters:GetMaxSpawnedUnitCount() + + local nCount = 0 + + for _,Spawner in pairs ( self.Spawners ) do + nCount = nCount + self:ComputeUnitsSpawnedBySchedule( Spawner ) + end + + -- Assume we get 4 ghosts per boss + local hCaptainSpawners = self:GetSpawner( "spawner_captain" ) + if hCaptainSpawners then + nCount = nCount + hCaptainSpawners:GetSpawnCountPerSpawnPosition() * 3 + end + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_WaveBlasters:Start() + CMapEncounter.Start( self ) + + + for _,Spawner in pairs ( self:GetSpawners() ) do + if Spawner:GetSpawnerName() == "spawner_peon" then + Spawner:SpawnUnitsFromRandomSpawners( Spawner:GetSpawnPositionCount() ) + else + Spawner:SpawnUnitsFromRandomSpawners( self.nCaptains ) + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_WaveBlasters:OnSpawnerFinished( hSpawner, hSpawnedUnits) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + for _,enemy in pairs( hSpawnedUnits ) do + if enemy ~= nil then + enemy:AddNewModifier( enemy, nil, "modifier_room_monster_sleep", { duration = 15 } ) + end + end + +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_WaveBlasters diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_wildwings.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_wildwings.lua new file mode 100755 index 0000000..73b4ddd --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_wildwings.lua @@ -0,0 +1,149 @@ +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) +require( "portalspawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Wildwings == nil then + CMapEncounter_Wildwings = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wildwings:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self.szPeonSpawner = "spawner_peon" + self.szCaptainSpawner = "spawner_captain" + + self:AddSpawner( CDotaSpawner( self.szPeonSpawner, self.szPeonSpawner, + { + { + EntityName = "npc_dota_creature_wildwing_laborer", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 225.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( self.szCaptainSpawner, self.szCaptainSpawner, + { + { + EntityName = "npc_dota_creature_dazzle", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + } ) ) + + local flInitialPortalSpawnDelay = 0.0 + local flInitialSummonTime = 30.0 + local flPortalIntervalInput = DEFAULT_PORTAL_SPAWN_INTERVAL + local flScaleInput = 1.0 + self.nNumPortals = 4 + + for i=1,self.nNumPortals do + local name = string.format( "portal_%i", i ) + + self:AddPortalSpawner( CPortalSpawner( name, "dynamic_portal", 60 * hRoom:GetDepth(), flInitialPortalSpawnDelay, flInitialSummonTime, flPortalIntervalInput, flScaleInput, + { + { + EntityName = "npc_dota_creature_wildwing_laborer", + Team = DOTA_TEAM_BADGUYS, + Count = 3, + PositionNoise = 0.0, + }, + { + EntityName = "npc_dota_creature_dazzle", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 0.0, + }, + + } ) ) + end +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wildwings:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + + self:AddEncounterObjective( "destroy_spawning_portals", 0, self.nNumPortals ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wildwings:GetPreviewUnit() + return "npc_dota_creature_dazzle" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wildwings:GetMaxSpawnedUnitCount() + local nCount = 0 + local hWarriorSpawners = self:GetSpawner( self.szPeonSpawner ) + if hWarriorSpawners then + nCount = nCount + hWarriorSpawners:GetSpawnPositionCount() * 4 --* self.nWaves + end + + local hChampionSpawners = self:GetSpawner( self.szCaptainSpawner ) + if hChampionSpawners then + nCount = nCount + hChampionSpawners:GetSpawnPositionCount() --* self.nWaves + end + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wildwings:Start() + CMapEncounter.Start( self ) + + self:CreateEnemies() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wildwings:OnThink() + CMapEncounter.OnThink( self ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wildwings:CreateEnemies() + for _,Spawner in pairs ( self:GetSpawners() ) do + Spawner:SpawnUnits() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wildwings:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) + + if hSpawner:GetSpawnerType() == "CDotaSpawner" then -- standing enemies in the map should not aggro to players + return + end + + --print( "CMapEncounter_Wildwings:OnSpawnerFinished" ) + local heroes = FindRealLivingEnemyHeroesInRadius( DOTA_TEAM_BADGUYS, self.hRoom:GetOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + for _,hSpawnedUnit in pairs( hSpawnedUnits ) do + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + --printf( "Set initial goal entity for unit \"%s\" to \"%s\"", hSpawnedUnit:GetUnitName(), hero:GetUnitName() ) + hSpawnedUnit:SetInitialGoalEntity( hero ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Wildwings diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_wrath.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_wrath.lua new file mode 100755 index 0000000..1baa361 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_wrath.lua @@ -0,0 +1,138 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_Wrath == nil then + CMapEncounter_Wrath = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wrath:GetPreviewUnit() + return "npc_dota_hero_zuus" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wrath:OnEncounterLoaded() + CMapEncounter.OnEncounterLoaded( self ) + + self.bGreenLight = true + + self.HeroesOnGoal = {} +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wrath:GetMaxSpawnedUnitCount() + return 0 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wrath:Start() + CMapEncounter.Start( self ) + + local hGreenLights = self:GetRoom():FindAllEntitiesInRoomByName( "green_light", true ) + if #hGreenLights > 0 then + self.hGreenLight = hGreenLights[ 1 ] + end + if self.hGreenLight == nil then + print( "Unable to find \"green_light\"" ) + end + + local hRedLights = self:GetRoom():FindAllEntitiesInRoomByName( "red_light", true ) + if #hRedLights > 0 then + self.hRedLight = hRedLights[ 1 ] + end + if self.hRedLight == nil then + print( "Unable to find \"red_light\"" ) + end + + self.fEncounterStartTime = GameRules:GetGameTime() + self.fNextLightChangeTime = self.fEncounterStartTime + self:GetNextLightChangeTime() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wrath:OnThink() + CMapEncounter.OnThink( self ) + + if GameRules:GetGameTime() >= self.fNextLightChangeTime then + printf( "self:ToggleLights()" ) + self:ToggleLights() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wrath:GetNextLightChangeTime() + return RandomFloat( 1.0, 7.0 ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wrath:ToggleLights() + if self.bGreenLight then + self.hGreenLight:Disable() + self.hRedLight:Enable() + self.bGreenLight = false + else + self.hGreenLight:Enable() + self.hRedLight:Disable() + self.bGreenLight = true + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wrath:CheckForCompletion() + local nHeroesAlive = 0 + local hHeroes = HeroList:GetAllHeroes() + for _, hHero in pairs ( hHeroes ) do + if hHero ~= nil and hHero:IsRealHero() and hHero:GetTeamNumber() == DOTA_TEAM_GOODGUYS and ( hHero:IsAlive() or hHero:IsReincarnating() ) then + nHeroesAlive = nHeroesAlive + 1 + end + end + + return nHeroesAlive > 0 and #self.HeroesOnGoal == nHeroesAlive +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wrath:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wrath:OnTriggerStartTouch( event ) + + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + if hUnit ~= nil and hUnit:IsRealHero() and hUnit:IsControllableByAnyPlayer() and event.trigger_name == "goal_trigger" then + table.insert( self.HeroesOnGoal, hUnit ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_Wrath:OnTriggerEndTouch( event ) + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + if hUnit ~= nil and hUnit:IsRealHero() and hUnit:IsControllableByAnyPlayer() and event.trigger_name == "goal_trigger" then + for k,hHero in pairs( self.HeroesOnGoal ) do + if hHero == hUnit then + table.remove( self.HeroesOnGoal, k ) + end + end + end +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_Wrath diff --git a/aghanim_singleplayer/scripts/vscripts/encounters/encounter_zealot_scarabs.lua b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_zealot_scarabs.lua new file mode 100755 index 0000000..1994001 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/encounters/encounter_zealot_scarabs.lua @@ -0,0 +1,108 @@ + +require( "map_encounter" ) +require( "aghanim_utility_functions" ) +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapEncounter_ZealotScarabs == nil then + CMapEncounter_ZealotScarabs = class( {}, {}, CMapEncounter ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_ZealotScarabs:constructor( hRoom, szEncounterName ) + + CMapEncounter.constructor( self, hRoom, szEncounterName ) + + self:SetCalculateRewardsFromUnitCount( true ) + + self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon", + { + { + EntityName = "npc_dota_creature_zealot_scarab", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 250.0, + }, + } ) ) + + self:AddSpawner( CDotaSpawner( "spawner_captain", "spawner_captain", + { + { + EntityName = "npc_dota_creature_scarab_priest", + Team = DOTA_TEAM_BADGUYS, + Count = 1, + PositionNoise = 250.0, + }, + } ) ) + + self:SetSpawnerSchedule( "spawner_peon", nil ) + self:SetSpawnerSchedule( "spawner_captain", nil ) + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_ZealotScarabs:Precache( context ) + CMapEncounter.Precache( self, context ) + + PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_nyx_assassin.vsndevts", context ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_ZealotScarabs:InitializeObjectives() + CMapEncounter.InitializeObjectives( self ) + self:AddEncounterObjective( "kill_scarab_priests", 0, self:GetSpawner( "spawner_captain" ):GetSpawnPositionCount() ) +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_ZealotScarabs:OnRequiredEnemyKilled( hAttacker, hVictim ) + CMapEncounter.OnRequiredEnemyKilled( self, hAttacker, hVictim ) + + if hVictim and hVictim:GetUnitName() == "npc_dota_creature_scarab_priest" then + local nCurrentValue = self:GetEncounterObjectiveProgress( "kill_scarab_priests" ) + self:UpdateEncounterObjective( "kill_scarab_priests", nCurrentValue + 1, nil ) + end +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter_ZealotScarabs:GetPreviewUnit() + return "npc_dota_creature_zealot_scarab" +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_ZealotScarabs:GetMaxSpawnedUnitCount() + + local nCount = 0 + + for _,Spawner in pairs ( self.Spawners ) do + nCount = nCount + self:ComputeUnitsSpawnedBySchedule( Spawner ) + end + + -- Assume we get 2 nyxes per boss + local hCaptainSpawners = self:GetSpawner( "spawner_captain" ) + if hCaptainSpawners then + nCount = nCount + hCaptainSpawners:GetSpawnCountPerSpawnPosition() * 2 + end + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter_ZealotScarabs:Start() + CMapEncounter.Start( self ) + + self:StartAllSpawnerSchedules( 0 ) +end + +-------------------------------------------------------------------------------- + +return CMapEncounter_ZealotScarabs diff --git a/aghanim_singleplayer/scripts/vscripts/events.lua b/aghanim_singleplayer/scripts/vscripts/events.lua new file mode 100755 index 0000000..f647eb7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/events.lua @@ -0,0 +1,906 @@ +LinkLuaModifier( "modifier_battle_royale", "modifiers/modifier_battle_royale", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_respawn_haste", "modifiers/modifier_respawn_haste", LUA_MODIFIER_MOTION_NONE ) + +require( "blessings") + +--------------------------------------------------------- +-- game_rules_state_change +--------------------------------------------------------- + +function CAghanim:OnGameRulesStateChange() + local nNewState = GameRules:State_Get() + if nNewState == DOTA_GAMERULES_STATE_HERO_SELECTION then + self:OnHeroSelectionStarted() + elseif nNewState == DOTA_GAMERULES_STATE_STRATEGY_TIME then + self:ForceAssignHeroes() + elseif nNewState == DOTA_GAMERULES_STATE_PRE_GAME then + -- empty + elseif nNewState == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then + self:OnGameStarted() + end +end + +--------------------------------------------------------- +local expertmode = false +function CAghanim:PlayerChat( keys ) + print("PlayerSay") + DeepPrintTable(keys) + local diffcult = keys.text + + if diffcult == "expert" + then + expertmode = true + print(expertmode) + return true + end +end + +--------------------------------------------------------- + +function CAghanim:OnHeroSelected( event ) + self:GetAnnouncer():OnHeroSelected( event.hero_unit ) +end + +--------------------------------------------------------- + +function CAghanim:OnGameStarted() + --SendToServerConsole( "say SEED: " .. self.nSeed .. " ASC LEVEL: " .. self:GetAscensionLevel() ) +end + +--------------------------------------------------------- + +function CAghanim:OnGameFinished() + self:AddResultToSignOut() + + print( "[ Aghanim Signing Out ]:" ) + PrintTable( self.SignOutTable, " " ) + + GameRules:SetEventSignoutCustomTable( self.SignOutTable ) + GameRules:SetEventMetadataCustomTable( self.SignOutTable ) -- Same data used for both +end + +--------------------------------------------------------- + +function CAghanim:AddResultToSignOut() + + self.SignOutTable["depth"] = self:GetCurrentRoom():GetDepth() + self.SignOutTable["ascension_level"] = self:GetAscensionLevel() + self.SignOutTable["won_game"] = self.bWonGame + self.SignOutTable["seed"] = self.nSeed + self.SignOutTable["event_window_start_time"] = GameRules:GetGameModeEntity():GetEventWindowStartTime() + self.SignOutTable["tournament_mode"] = ( self.SignOutTable["event_window_start_time"] > 0 ) and ( GameRules:GetGameModeEntity():GetEventGameSeed() > 0 ) + + + if self.SignOutTable["event_window_start_time"] > 0 then + printf("EVENT WINDOW START TIME: %d", self.SignOutTable["event_window_start_time"] ) + end + + -- we may want to subtract hero pick time or do something more complicated here + local flGameTime = GameRules:GetGameTime() + self.SignOutTable["game_time"] = flGameTime + printf("GAME TIME: %f", flGameTime ) + + local unScore = self:GetLeaderboardScore( self.SignOutTable ) + self.SignOutTable["score"] = unScore + printf("GAME SCORE (lower is better): %d", unScore ) + local aglevel = self:GetAscensionLevel() + + local scorecfi = 0 + if aglevel == 0 then scorecfi = 1.0 end + if aglevel == 1 then scorecfi = 1.2 end + if aglevel == 2 then scorecfi = 1.4 end + if aglevel == 3 then scorecfi = 1.6 end + local finalscore = unScore * scorecfi + local winner = tostring(PlayerResource:GetPlayerName( 0 )) + local heroname = tostring(PlayerResource:GetSelectedHeroName(0)) + + local hero = string.sub(heroname,15,-1) + --游戏获胜 + if self.bWonGame then + GameRules:SendCustomMessage(string.format("your score is : %d",finalscore), DOTA_TEAM_GOODGUYS, 0) + GameRules:SendCustomMessage(string.format("01 : %s---time : %s---diffcult : %s---hero : %s---score : %s",winner,flGameTime, aglevel, hero,finalscore),DOTA_TEAM_GOODGUYS, 0) + end + + -- only add leaderboard score message to signout if we're in an event window and have a custom seed + if self.SignOutTable["event_window_start_time"] > 0 and GameRules:GetGameModeEntity():GetEventGameSeed() > 0 then + local nData1 = 0 + local nData2 = 0 + local nData3 = 0 + local nData4 = 0 + local nData5 = 0 + local pszLeaderboardName = tostring( self.SignOutTable["event_window_start_time"] ) + GameRules:AddEventMetadataLeaderboardEntryRawScore( pszLeaderboardName, flGameTime, unScore, nData1, nData2, nData3, nData4, nData5 ) + end + + for nPlayerID = 0, AGHANIM_PLAYERS - 1 do + if PlayerResource:IsValidPlayerID( nPlayerID ) then + self.SignOutTable[ "player_list" ][ nPlayerID ][ "steam_id" ] = PlayerResource:GetSteamID( nPlayerID ) + self.SignOutTable[ "player_list" ][ nPlayerID ][ "hero_id" ] = PlayerResource:GetSelectedHeroID( nPlayerID ) + self.SignOutTable[ "player_list" ][ nPlayerID ][ "current_ascension_level" ] = PlayerResource:GetEventGameCustomActionClaimCountByName( nPlayerID, "ti10_event_game_current_ascension_level" ) + self.SignOutTable[ "player_list" ][ nPlayerID ][ "bp_remaining" ] = self:GetPointsCapRemaining( nPlayerID, true, false ) + self.SignOutTable[ "player_list" ][ nPlayerID ][ "bp_total_cap" ] = self:GetPointsCapRemaining( nPlayerID, true, true ) + self.SignOutTable[ "player_list" ][ nPlayerID ][ "fragments_remaining" ] = self:GetPointsCapRemaining( nPlayerID, false, false ) + self.SignOutTable[ "player_list" ][ nPlayerID ][ "fragments_total_cap" ] = self:GetPointsCapRemaining( nPlayerID, false, true ) + end + end +end + +function CAghanim:GetLeaderboardScore( SignOutTable ) + + -- if you won, treat it as one extra depth + local nEffectiveDepth = SignOutTable["depth"] + if self.bWonGame then + nEffectiveDepth = nEffectiveDepth + 1 + end + + -- set a theoretical max depth of 30, just so we have some wiggle room if we change things + -- it just means that a perfect score is still above zero + local nMaxScoreDepth = 15 + local nMaxScoreTime = 3600 + local agscore = 1600 + local deathtimes = tostring(PlayerResource:GetDeaths(0)) + local killnum = tostring(PlayerResource:GetKills(0)) + + local flCompletionTime = SignOutTable["game_time"] + + -- lower scores are better + + local nScore = math.ceil((nEffectiveDepth * 100 - deathtimes * 50 + killnum) / (math.floor(flCompletionTime) / nMaxScoreTime)) + return nScore +end + + +--------------------------------------------------------- +-- player_connect_full +-- * player_id +--------------------------------------------------------- + +function CAghanim:CenterSpectatorOnPlayers( nSpectatorPlayerID ) + + for nPlayerID = 0, AGHANIM_PLAYERS - 1 do + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + if PlayerResource:IsValidPlayerID( nPlayerID ) then + local hHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hHero ~= nil then + --print( "CenterCameraOnUnit " .. nSpectatorPlayerID, hHero:GetUnitName() ) + CenterCameraOnUnit( nSpectatorPlayerID, hHero ) + return + end + end + end + end + +end + +--------------------------------------------------------- +-- player_connect_full +-- * player_id +--------------------------------------------------------- + +function CAghanim:OnPlayerConnected( event ) +end + +--------------------------------------------------------- + +function CAghanim:OnPlayerTeamChanged( event ) + + -- If we're a spectator, center the camera on one of the heores + --print( "OnPlayerTeamChanged " .. event.player_id .. " " .. PlayerResource:GetTeam( event.player_id ) .. " " .. PlayerResource:GetLiveSpectatorTeam( event.player_id ) ) + if PlayerResource:GetTeam( event.player_id ) == TEAM_SPECTATOR or PlayerResource:GetLiveSpectatorTeam( event.player_id ) == DOTA_TEAM_GOODGUYS then + self:CenterSpectatorOnPlayers( event.player_id ) + end + +end + + +--------------------------------------------------------- +-- dota_player_reconnected +-- * player_id +--------------------------------------------------------- + +function CAghanim:OnPlayerReconnected( event ) + + --print( "OnPlayerReconnected " .. event.player_id .. " " .. PlayerResource:GetTeam( event.player_id ) .. " " .. PlayerResource:GetLiveSpectatorTeam( event.player_id ) ) + if PlayerResource:GetTeam( event.player_id ) == TEAM_SPECTATOR or PlayerResource:GetLiveSpectatorTeam( event.player_id ) == DOTA_TEAM_GOODGUYS then + self:CenterSpectatorOnPlayers( event.player_id ) + return + end + + local hPlayer = PlayerResource:GetPlayer( event.player_id ) + if hPlayer == nil then + return + end + + --If the player's hero is not in the current room, then teleport them to it + local hHero = PlayerResource:GetSelectedHeroEntity( event.player_id ) + if hHero == nil then + return + end + + CenterCameraOnUnit( event.player_id, hHero ) + +end + +--------------------------------------------------------- +-- npc_spawned +-- * entindex +--------------------------------------------------------- + +function CAghanim:OnNPCSpawned( event ) + + local spawnedUnit = EntIndexToHScript( event.entindex ) + if spawnedUnit == nil then + return + end + + if spawnedUnit:IsRealHero() then + self:OnNPCSpawned_PlayerHero( event ) + return + end + + --print( " CAghanim:OnNPCSpawned " .. spawnedUnit:entindex() .. " " .. tostring( spawnedUnit:IsCreature() ) ) + if spawnedUnit:IsCreature() and spawnedUnit:GetTeamNumber() == DOTA_TEAM_BADGUYS then + self:OnNPCSpawned_EnemyCreature( event ) + return + end + + if spawnedUnit:IsSummoned() and spawnedUnit:GetTeamNumber() == DOTA_TEAM_GOODGUYS then + self:OnNPCSpawned_AlliedSummon( event ) + return + end +end + +-------------------------------------------------------------------------------- + +-- Evaluate the state of the game +function CAghanim:InitBlessings( hHero ) + + if hHero == nil then + return + end + + print ( "Init Blessings -- " .. hHero:GetUnitName() ) + + local nPlayerID = hHero:GetPlayerOwnerID() + for blessing_name,blessing_keys in pairs(BLESSING_MODIFIERS) do + + local nClaimCount = 0 + local nBlessingType = nil + local szActionName = nil + + if blessing_keys.action_names ~= nil then + for i = #blessing_keys.action_names,1,-1 do + if PlayerResource:GetEventGameCustomActionClaimCountByName( nPlayerID, blessing_keys.action_names[i] ) > 0 then + szActionName = blessing_keys.action_names[i] + nClaimCount = i + break + end + end + else + szActionName = blessing_keys.action_name + nClaimCount = PlayerResource:GetEventGameCustomActionClaimCountByName( nPlayerID, szActionName ) + nBlessingType = blessing_keys.blessing_type + + -- Used to test blessings, even if they haven't claimed it + local nTestClaimCount = BLESSING_MODIFIERS_FORCE_LIST[blessing_name] + if nTestClaimCount ~= nil then + print( 'Forcing blessing ' .. blessing_name ) + nClaimCount = nTestClaimCount + end + end + + if nClaimCount > 0 then + local kv = + { + blessing_level = nClaimCount + } + + print( 'Player ' .. nPlayerID .. ' adding blessing ' .. blessing_name ) + + if nBlessingType == nil or nBlessingType == BLESSING_TYPE_MODIFIER then + --print( "Modifier Blessing added - " .. hHero:GetUnitName() .. " - " .. blessing_name ) + local hModifier = hHero:AddNewModifier( hHero, nil, blessing_name, kv ) + if hModifier.IsBlessing == nil then + print( "Blessing " .. blessing_name .. " doesn't inherit from modifier_blessing_base!!" ) + end + + elseif nBlessingType == BLESSING_TYPE_ITEM_GRANT then + --print( "Item Grant Blessing added - " .. hHero:GetUnitName() .. " - " .. blessing_name ) + + for k,v in pairs( blessing_keys.keys.items ) do + --print( 'Item Grant blessing - ' .. k ) + GrantItemDropToHero( hHero, k ) + end + + elseif nBlessingType == BLESSING_TYPE_GOLD_GRANT then + --print( "Gold Grant Blessing added - " .. hHero:GetUnitName() .. " - " .. blessing_name ) + --print( "Adding gold " .. blessing_keys.keys.gold_amount ) + + local nPlayerID = hHero:GetPlayerID() + PlayerResource:ModifyGold( nPlayerID, blessing_keys.keys.gold_amount, true, DOTA_ModifyGold_Unspecified ) + + elseif nBlessingType == BLESSING_TYPE_LIFE_GRANT then + --print( "Life Grant Blessing added - " .. hHero:GetUnitName() .. " - " .. blessing_name ) + --print( "Adding lives " .. blessing_keys.keys.lives ) + + hHero.nRespawnsRemaining = hHero.nRespawnsRemaining + blessing_keys.keys.lives + + else + print( "ERROR - bad BLESSING_TYPE detected for action " .. blessing_keys.action_name ) + return + end + + self:RegisterBlessingStat( nPlayerID, blessing_name, nClaimCount, szActionName, blessing_keys.scoreboard_order ) + end + end + +end + +--------------------------------------------------------- + +function CAghanim:CenterAllSpectatorsOnHero( hPlayerHero ) + + print( "CenterAllSpectatorsOnHero" ) + -- Center spectator cameras on the starting room + for nPlayerID = 0, DOTA_MAX_PLAYERS - 1 do + if PlayerResource:IsValidPlayerID( nPlayerID ) == true then + if PlayerResource:GetTeam( nPlayerID ) == TEAM_SPECTATOR or PlayerResource:GetLiveSpectatorTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + --print( "CenterAllSpectatorsOnHero " .. nPlayerID .. " " .. hPlayerHero:GetUnitName() ) + CenterCameraOnUnit( nPlayerID, hPlayerHero ) + end + end + end + +end + +--------------------------------------------------------- + +function CAghanim:OnNPCSpawned_PlayerHero( event ) + + local hPlayerHero = EntIndexToHScript( event.entindex ) + if hPlayerHero == nil or hPlayerHero:IsRealHero() == false then + return + end + + --[[ + if hPlayerHero.bFirstSpawnComplete and hPlayerHero:IsRealHero() and hPlayerHero:IsTempestDouble() == false then + FindClearSpaceForUnit( hPlayerHero, hPlayerHero.vDeathPos, true ) + end + ]] + + if hPlayerHero.bFirstSpawnComplete == nil then + + if self.bHasInitializedSpectatorCameras == false then + self:CenterAllSpectatorsOnHero( hPlayerHero ) + self.bHasInitializedSpectatorCameras = true + end + + hPlayerHero:SetStashEnabled( false ) + hPlayerHero:SetAbilityPoints( 0 ) + hPlayerHero.nRespawnsRemaining = AGHANIM_STARTING_LIVES + hPlayerHero:SetRespawnsDisabled( false ) + + local nPlayerID = hPlayerHero:GetPlayerOwnerID() + if nPlayerID ~= -1 then + PlayerResource:SetCustomBuybackCooldown( nPlayerID, 0 ) + PlayerResource:SetCustomBuybackCost( nPlayerID, 0 ) + end + + local hTP = hPlayerHero:GetItemInSlot( DOTA_ITEM_TP_SCROLL ) + if hTP then + UTIL_Remove( hTP ) + end + + -- Add blessing modifiers + self:InitBlessings( hPlayerHero ) + + if AGHANIM_ENABLE_BOTTLE == true then + local hBottle = GrantItemDropToHero( hPlayerHero, "item_bottle" ) + if hBottle ~= nil then + local nMaxCharges = hBottle:GetSpecialValueFor( "max_charges" ) + hBottle:SetCurrentCharges( nMaxCharges ) + end + else + local hFlask = GrantItemDropToHero( hPlayerHero, "item_flask" ) + if hFlask ~= nil then + hFlask:SetCurrentCharges( AGHANIM_STARTING_SALVES ) + end + local hMango = GrantItemDropToHero( hPlayerHero, "item_enchanted_mango" ) + if hMango ~= nil then + hMango:SetCurrentCharges( AGHANIM_STARTING_MANGOES ) + end + end + + -- blessings may give additional lives so make sure these net tables get set afterwards + --printf("setting remaining respawns on %d to %d", hPlayerHero:entindex(), hPlayerHero.nRespawnsRemaining ) + CustomNetTables:SetTableValue( "revive_state", string.format( "%d", hPlayerHero:entindex() ), { tombstone = false } ) + CustomNetTables:SetTableValue( "respawns_remaining", string.format( "%d", hPlayerHero:entindex() ), { respawns = hPlayerHero.nRespawnsRemaining } ) + + -- Add the battle royale modifier to all heroes + hPlayerHero:AddNewModifier( hPlayerHero, nil, "modifier_battle_royale", { } ) + + hPlayerHero.MinorAbilityUpgrades = {} + hPlayerHero:AddNewModifier( hPlayerHero, nil, "modifier_minor_ability_upgrades", {} ) + + -- Add and level up the base stats upgrade ability + local hAbility = hPlayerHero:FindAbilityByName( "aghsfort_minor_stats_upgrade" ) + if hAbility == nil then + hAbility = hPlayerHero:AddAbility("aghsfort_minor_stats_upgrade") + hAbility:UpgradeAbility( true ) + end + + else + local fInvulnDuration = 3.0 + + local hBlessing = hPlayerHero:FindModifierByName( "modifier_blessing_respawn_invulnerability" ) + if hBlessing ~= nil then + --print( 'Player revived w/ respawn invulnerability blessing - adding ' .. hBlessing.respawn_invulnerability_time_bonus .. ' seconds to invuln time' ) + fInvulnDuration = fInvulnDuration + hBlessing.respawn_invulnerability_time_bonus + + --print( 'OnNPCSpawned_PlayerHero - blessing values, min_move_speed = ' .. hBlessing.min_move_speed .. '. bonus_attack_speed = ' .. hBlessing.bonus_attack_speed ) + + hPlayerHero:AddNewModifier( hPlayerHero, nil, "modifier_respawn_haste", { duration = fInvulnDuration, min_move_speed = hBlessing.min_move_speed, bonus_attack_speed = hBlessing.bonus_attack_speed } ) + end + + hPlayerHero:AddNewModifier( hPlayerHero, nil, "modifier_invulnerable", { duration = fInvulnDuration } ) + hPlayerHero:AddNewModifier( hPlayerHero, nil, "modifier_omninight_guardian_angel", { duration = fInvulnDuration } ) + hPlayerHero:AddNewModifier( hPlayerHero, nil, "modifier_phased", { duration = fInvulnDuration } ) + hPlayerHero.Tombstone = nil + end + + hPlayerHero.bFirstSpawnComplete = true + + if self.bDataSent == nil then + -- Send the special ability data for each hero + --print ("sending special ability upgrade data") + CustomNetTables:SetTableValue( "special_ability_upgrades", tostring( 0 ), SPECIAL_ABILITY_UPGRADES ) + self.bDataSent = true + end + + self.bPlayerHasSpawned = true + +end + +--------------------------------------------------------- + +function CAghanim:OnNPCSpawned_EnemyCreature( event ) + local hEnemyCreature = EntIndexToHScript( event.entindex ) + if hEnemyCreature == nil then + return + end + + if hEnemyCreature:FindModifierByName( "modifier_breakable_container" ) then + return + end + + -- inform the encounter + if self:GetCurrentRoom() == nil then + return + end + + local hEncounter = self:GetCurrentRoom():GetEncounter() + if not hEncounter:IsComplete() then + hEncounter:OnEnemyCreatureSpawned( hEnemyCreature ) + end +end + +--------------------------------------------------------- + +function CAghanim:OnNPCSpawned_AlliedSummon( event ) + local hSummonedUnit = EntIndexToHScript( event.entindex ) + if hSummonedUnit == nil then + return + end + + local nPlayerID = hSummonedUnit:GetPlayerOwnerID() + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero ~= nil then + hSummonedUnit:AddNewModifier( hPlayerHero, nil, "modifier_battle_royale", { } ) + end +end + +--------------------------------------------------------- +-- dota_on_hero_finish_spawn +-- * heroindex +-- * hero (string) +--------------------------------------------------------- + +--[[ +function CAghanim:OnHeroFinishSpawn( event ) + local hPlayerHero = EntIndexToHScript( event.heroindex ) + if hPlayerHero ~= nil and hPlayerHero:IsRealHero() then + if hPlayerHero.bFirstSpawnComplete == nil then + hPlayerHero.bEliminated = false + hPlayerHero.bFirstSpawnComplete = true + + local nPlayerID = hPlayerHero:GetPlayerOwnerID() + local PlayerBattlePointsData = {} + PlayerBattlePointsData["player_id"] = nPlayerID + PlayerBattlePointsData["steam_id"] = PlayerResource:GetSteamID( nPlayerID ) + PlayerBattlePointsData["points_earned"] = 0 + self.PlayerPointsData[nPlayerID] = PlayerBattlePointsData + + self.EventMetaData[nPlayerID] = {} + self.EventMetaData[nPlayerID]["kills"] = 0 + self.EventMetaData[nPlayerID]["revives"] = 0 + self.EventMetaData[nPlayerID]["eliminations"] = 0 + self.EventMetaData[nPlayerID]["battle_points"] = 0 + self.EventMetaData[nPlayerID]["level"] = 1 + self.EventMetaData[nPlayerID]["net_worth"] = 0 + + table.insert( self.HeroesByTeam[hPlayerHero:GetTeamNumber()], hPlayerHero ) + end + end +end +]] + +--------------------------------------------------------- +-- entity_killed +-- * entindex_killed +-- * entindex_attacker +-- * entindex_inflictor +-- * damagebits +--------------------------------------------------------- + +function CAghanim:OnEntityKilled( event ) + local killedUnit = EntIndexToHScript( event.entindex_killed ) + if killedUnit ~= nil then + if killedUnit:IsRealHero() and killedUnit:IsTempestDouble() == false then + self:OnEntityKilled_PlayerHero( event ) + return + end + + if killedUnit:IsCreature() then + --self:OnEntityKilled_EnemyCreature( event ) + return + end + end +end + +--------------------------------------------------------- + +function CAghanim:OnEntityKilled_PlayerHero( event ) + local killedHero = EntIndexToHScript( event.entindex_killed ) + local killerUnit = EntIndexToHScript( event.entindex_attacker ) + if killedHero == nil or killedHero:IsRealHero() == false then + return + end + + local szKillerUnit = nil + + if killerUnit then + if killerUnit:IsCreature() then + szKillerUnit = killerUnit:GetUnitName() + + local gameEvent = {} + gameEvent["player_id"] = killedHero:GetPlayerID() + gameEvent["locstring_value"] = killerUnit:GetUnitName() + gameEvent["teamnumber"] = -1 + gameEvent["message"] = "#Aghanim_KilledByCreature" + FireGameEvent( "dota_combat_event_message", gameEvent ) + + --self:FireDeathTaunt( killerUnit ) + end + end + + self:GetAnnouncer():OnHeroKilled( killedHero:GetUnitName(), szKillerUnit, killedHero.nRespawnsRemaining ) + + local bDropTombstone = false--killedHero.nRespawnsRemaining > 0 + + if bDropTombstone then + local newItem = CreateItem( "item_tombstone", killedHero , killedHero ) + newItem:SetPurchaseTime( 0 ) + newItem:SetPurchaser( killedHero ) + local tombstone = SpawnEntityFromTableSynchronous( "dota_item_tombstone_drop", {} ) + tombstone:SetContainedItem( newItem ) + tombstone:SetAngles( 0, RandomFloat( 0, 360 ), 0 ) + FindClearSpaceForUnit( tombstone, killedHero:GetAbsOrigin(), true ) + killedHero.Tombstone = tombstone + killedHero.vDeathPos = killedHero:GetAbsOrigin() + end + + killedHero:SetRespawnsDisabled( killedHero.nRespawnsRemaining == 0 ) + killedHero:SetRespawnPosition( killedHero:GetAbsOrigin() ) + if killedHero:GetRespawnsDisabled() == false then + killedHero.nRespawnFX = ParticleManager:CreateParticle( "particles/items_fx/aegis_timer.vpcf", PATTACH_ABSORIGIN_FOLLOW, killedHero ) + ParticleManager:SetParticleControl( killedHero.nRespawnFX, 1, Vector( AGHANIM_TIMED_RESPAWN_TIME, 0, 0 ) ) + + AddFOWViewer( killedHero:GetTeamNumber(), killedHero:GetAbsOrigin(), 800.0, AGHANIM_TIMED_RESPAWN_TIME, false ) + end + + killedHero.nRespawnsRemaining = math.max( 0, killedHero.nRespawnsRemaining - LIFE_REVIVE_COST ) + + CustomGameEventManager:Send_ServerToPlayer( killedHero:GetPlayerOwner(), "life_lost", {} ) + CustomNetTables:SetTableValue( "revive_state", string.format( "%d", killedHero:entindex() ), { tombstone = bDropTombstone } ) + CustomNetTables:SetTableValue( "respawns_remaining", string.format( "%d", killedHero:entindex() ), { respawns = killedHero.nRespawnsRemaining } ) + + local hPlayer = killedHero:GetPlayerOwner() + if hPlayer ~= nil then + if killedHero.nRespawnsRemaining < LIFE_BUYBACK_COST then + PlayerResource:SetCustomBuybackCooldown( hPlayer:GetPlayerID(), 0 ) + PlayerResource:SetCustomBuybackCost( hPlayer:GetPlayerID(), 999999 ) + else + PlayerResource:SetCustomBuybackCooldown( hPlayer:GetPlayerID(), 0 ) + PlayerResource:SetCustomBuybackCost( hPlayer:GetPlayerID(), 0 ) + end + + self:RegisterPlayerDeathStat( hPlayer:GetPlayerID(), self:GetCurrentRoom():GetDepth() ) + end + +end + +--------------------------------------------------------- + +--------------------------------------------------------- +-- dota_holdout_revive_complete +-- * caster (reviver hero entity index) +-- * target (revivee hero entity index) +--------------------------------------------------------- + +function CAghanim:OnPlayerRevived( event ) + + local hRevivedHero = EntIndexToHScript( event.target ) + local hReviverHero = EntIndexToHScript( event.caster ) + if hRevivedHero ~= nil and hRevivedHero:IsRealHero() then + hRevivedHero:SetHealth( hRevivedHero:GetMaxHealth() * 0.01 * REVIVE_HEALTH_PCT ) + hRevivedHero:SetMana( hRevivedHero:GetMaxMana() * 0.01 * REVIVE_MANA_PCT ) + EmitSoundOn( "Dungeon.HeroRevived", hRevivedHero ) + + if hReviverHero ~= nil and hReviverHero:IsRealHero() then + --self.EventMetaData[hReviverHero:GetPlayerOwnerID()]["revives"] = self.EventMetaData[hReviverHero:GetPlayerOwnerID()]["revives"] + 1 + end + + --self:RemoveTombstoneVisionDummy( hRevivedHero ) + + hRevivedHero.Tombstone = nil + local fInvulnDuration = 3 + + local hBlessing = hRevivedHero:FindModifierByName( "modifier_blessing_respawn_invulnerability" ) + if hBlessing ~= nil then + --print( 'Player revived w/ respawn invulnerability blessing - adding ' .. hBlessing.respawn_invulnerability_time_bonus .. ' seconds to invuln time' ) + fInvulnDuration = fInvulnDuration + hBlessing.respawn_invulnerability_time_bonus + + --print( 'OnPlayerRevived - blessing values, min_move_speed = ' .. hBlessing.min_move_speed .. '. bonus_attack_speed = ' .. hBlessing.bonus_attack_speed ) + + hPlayerHero:AddNewModifier( hPlayerHero, nil, "modifier_respawn_haste", { duration = fInvulnDuration, min_move_speed = hBlessing.min_move_speed, bonus_attack_speed = hBlessing.bonus_attack_speed } ) + end + + hRevivedHero:AddNewModifier( hRevivedHero, nil, "modifier_invulnerable", { duration = fInvulnDuration } ) + hRevivedHero:AddNewModifier( hRevivedHero, nil, "modifier_omninight_guardian_angel", { duration = fInvulnDuration } ) + hRevivedHero:AddNewModifier( hRevivedHero, nil, "modifier_phased", { duration = fInvulnDuration } ) + if hRevivedHero.nRespawnFX ~= nil then + ParticleManager:DestroyParticle( hRevivedHero.nRespawnFX, false ) + hRevivedHero.nRespawnFX = nil + end + hRevivedHero:RemoveModifierByName( "modifier_hide_on_minimap" ) + end +end + +--------------------------------------------------------- +-- dota_buyback +-- * entindex +-- * player_id +--------------------------------------------------------- + +function CAghanim:OnPlayerBuyback( event ) + + local hPlayer = PlayerResource:GetPlayer( event.player_id ) + if hPlayer == nil then + return + end + + local hHero = hPlayer:GetAssignedHero() + if hHero == nil then + return + end + + hHero.nRespawnsRemaining = math.max( hHero.nRespawnsRemaining - LIFE_BUYBACK_COST, 0 ) + hHero:SetRespawnsDisabled( hHero.nRespawnsRemaining == 0 ) + CustomNetTables:SetTableValue( "revive_state", string.format( "%d", hHero:entindex() ), { tombstone = false } ) + CustomNetTables:SetTableValue( "respawns_remaining", string.format( "%d", hHero:entindex() ), { respawns = hHero.nRespawnsRemaining } ) + + if hHero.vDeathPos ~= nil then + FindClearSpaceForUnit( hHero, hHero.vDeathPos, true ) + end + + hHero.Tombstone = nil + hHero:AddNewModifier( hHero, nil, "modifier_invulnerable", { duration = 2.5 } ) + hHero:AddNewModifier( hHero, nil, "modifier_omninight_guardian_angel", { duration = 2.5 } ) + +end + +--------------------------------------------------------- +-- dota_player_gained_level +-- * player (player entity index) +-- * level (new level) +--------------------------------------------------------- + +function CAghanim:OnPlayerGainedLevel( event ) + -- empty +end + +--------------------------------------------------------- +-- dota_item-spawned +-- * player_id +-- * item_ent_index +--------------------------------------------------------- + +function CAghanim:OnItemSpawned( event ) + local item = EntIndexToHScript( event.item_ent_index ) +end + +--------------------------------------------------------- +-- dota_item_picked_up +-- * PlayerID +-- * HeroEntityIndex +-- * UnitEntityIndex (only if parent is not a hero) +-- * itemname +-- * ItemEntityIndex +--------------------------------------------------------- + +function CAghanim:OnItemPickedUp( event ) + local item = EntIndexToHScript( event.ItemEntityIndex ) + if event.PlayerID ~= nil and item ~= nil and item:GetAbilityName() == "item_bag_of_gold" then + self:RegisterGoldBagCollectedStat( event.PlayerID ) + end +end + +--------------------------------------------------------- +-- dota_item_purchased +-- * PlayerID +-- * itemname +-- * itemcost +--------------------------------------------------------- + +function CAghanim:OnItemPurchased( event ) + local szHeroName = null + if PlayerResource:IsValidPlayerID( event.PlayerID ) then + local nHeroID = PlayerResource:GetSelectedHeroID( event.PlayerID ) + szHeroName = DOTAGameManager:GetHeroUnitNameByID( nHeroID ) + end + + self:GetAnnouncer():OnItemPurchased( szHeroName, event.itemname ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:OnTreasureOpen( hPlayerHero, hTreasureEnt ) + --printf( "OnTreasureOpen()" ) + + self:ChooseTreasureSurprise( hPlayerHero, hTreasureEnt ) +end + +-------------------------------------------------------------------------------- +-- dota_hero_entered_shop +-- > shop_type - short +-- > shop_entindex - int +-- > hero_entindex- int + +-------------------------------------------------------------------------------- + +function CAghanim:OnHeroEnteredShop( event ) + local hHero = EntIndexToHScript( event.hero_entindex ) + local hShop = EntIndexToHScript( event.shop_entindex ) + if hHero and hShop then + local szLine = nil + local MeepoLines = + { + "meepo_meepo_levelup_01", + "meepo_meepo_move_19", + "meepo_meepo_spawn_04", + "meepo_meepo_begin_01", + "meepo_meepo_divided_25", + "meepo_meepo_respawn_05", + "meepo_meepo_respawn_08", + "meepo_meepo_rare_03", + "meepo_meepo_rare_04", + "meepo_meepo_win_04", + } + + local BBLines = + { + "bristleback_bristle_cast_02", + "bristleback_bristle_nasal_goo_02", + "bristleback_bristle_kill_09", + "bristleback_bristle_lasthit_02", + "bristleback_bristle_lasthit_05", + "bristleback_bristle_lasthit_13", + "bristleback_bristle_levelup_01", + "bristleback_bristle_purch_02", + "bristleback_bristle_win_04", + "bristleback_bristle_ally_08", + } + + if hShop:GetShopType() ~= DOTA_SHOP_CUSTOM then + szLine = MeepoLines[ RandomInt( 1, #MeepoLines ) ] + else + szLine = BBLines[ RandomInt( 1, #BBLines ) ] + + if hHero:GetUnitName() == "npc_dota_hero_tusk" and RandomInt( 0, 2 ) == 0 then + szLine = "bristleback_bristle_ally_09" + end + end + + EmitSoundOnLocationForPlayer( szLine, hShop:GetAbsOrigin(), hHero:GetPlayerOwnerID() ) + end +end + +-------------------------------------------------------------------------------- +-- trigger_start_touch +-- > trigger_name - string +-- > activator_entindex - short +-- > caller_entindex- short + +-------------------------------------------------------------------------------- + +function CAghanim:OnTriggerStartTouch( event ) + + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + local hTriggerSpawnGroup = hTriggerEntity:GetSpawnGroupHandle() + if hUnit ~= nil then + local i, j = string.find( event.trigger_name, "room_activate" ) + if i ~= nil then + -- Figure out if we've triggered a room trigger for the first time + if hTriggerEntity.bHasBeenTriggered == nil then + hTriggerEntity.bHasBeenTriggered = true + local room = self:FindRoomBySpawnGroupHandle( hTriggerSpawnGroup ) + if room ~= nil then + self:OnRoomTriggerInitialTouch( hUnit, hTriggerEntity, room:GetName() ) + else + print( "Unable to find room associated with spawn group " .. hTriggerSpawnGroup ) + end + end + end + end + +end + +-------------------------------------------------------------------------------- +-- trigger_end_touch +-- > trigger_name - string +-- > activator_entindex - short +-- > caller_entindex- short + +-------------------------------------------------------------------------------- + +function CAghanim:OnTriggerEndTouch( event ) + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + if hUnit ~= nil then + -- empty + end +end + +-------------------------------------------------------------------------------- + +function CAghanim:OnRoomTriggerInitialTouch( hUnit, hTriggerEntity, szRoomName ) + --print( string.format( "OnRoomTriggerInitialTouch - szRoomName: %s", szRoomName ) ) + + self:ActivateRoom( szRoomName ) +end + +-------------------------------------------------------------------------------- + +function CAghanim:ActivateRoom( szRoomName ) + local room = self:GetRoom( szRoomName ) + self:SetCurrentRoom( room ) + room:Activate() +end + +-------------------------------------------------------------------------------- + +--------------------------------------------------------- +-- dota_non_player_used_ability +-- * abilityname +-- * caster_entindex +--------------------------------------------------------- + +--[[ +function CAghanim:OnNonPlayerUsedAbility( event ) + local szAbilityName = event.abilityname + local hCaster = EntIndexToHScript( event.caster_entindex ) +end +]] + +--------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/filters.lua b/aghanim_singleplayer/scripts/vscripts/filters.lua new file mode 100755 index 0000000..cfb4003 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/filters.lua @@ -0,0 +1,100 @@ +--------------------------------------------------------------------------- +-- HealingFilter +-- *entindex_target_const +-- *entindex_healer_const +-- *entindex_inflictor_const +-- *heal +--------------------------------------------------------------------------- + +function CAghanim:HealingFilter( filterTable ) + return true +end + +--------------------------------------------------------------------------- +-- DamageFilter +-- *entindex_victim_const +-- *entindex_attacker_const +-- *entindex_inflictor_const +-- *damagetype_const +-- *damage +--------------------------------------------------------------------------- + +function CAghanim:DamageFilter( filterTable ) + return true +end + + +--------------------------------------------------------------------------- +-- ItemAddedToInventoryFilter +-- *item_entindex_const +-- *item_parent_entindex_const +-- *inventory_parent_entindex_const +-- *suggested_slot +--------------------------------------------------------------------------- + +function CAghanim:ItemAddedToInventoryFilter( filterTable ) + return true +end + + +--------------------------------------------------------------------------- +-- ModifierGainedFilter +-- *entindex_parent_const +-- *entindex_ability_const +-- *entindex_caster_const +-- *name_const +-- *duration +--------------------------------------------------------------------------- + +function CAghanim:ModifierGainedFilter( filterTable ) + if filterTable["entindex_parent_const"] == nil then + return true + end + + if filterTable[ "name_const" ] == nil then + return true + end + + local BlackListModiifers = + { + "modifier_sheepstick_debuff", + "modifier_stunned", + "modifier_bashed", + "modifier_aghsfort_tusk_walrus_punch_air_time", + "modifier_aghsfort_mars_spear_stun", + } + + local hParent = EntIndexToHScript( filterTable[ "entindex_parent_const" ] ) + if hParent ~= nil and hParent.bAbsoluteNoCC ~= nil and hParent.bAbsoluteNoCC == true then + if hParent.bNoNullifier ~= nil and hParent.bNoNullifier == true then + table.insert( BlackListModiifers, "modifier_item_nullifier_mute" ) + table.insert( BlackListModiifers, "modifier_item_nullifier_slow" ) + end + + local bModifierInBlacklist = false + for _,szModifierName in pairs ( BlackListModiifers ) do + if szModifierName == filterTable[ "name_const" ] then + bModifierInBlacklist = true + break + end + end + + if bModifierInBlacklist then + local vMaxs = hParent:GetBoundingMaxs() + local vMins = hParent:GetBoundingMins() + local flFXScale = ( vMaxs.z - vMins.z / 1.5 ) + + local nFxIndex = ParticleManager:CreateParticle( "particles/generic_gameplay/disable_resist.vpcf", PATTACH_CUSTOMORIGIN, hParent ) + ParticleManager:SetParticleControlEnt( nFxIndex, 0, hParent, PATTACH_POINT_FOLLOW, "attach_hitloc", hParent:GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nFxIndex, 1, Vector( flFXScale, flFXScale, flFXScale ) ) + ParticleManager:ReleaseParticleIndex( nFxIndex ) + + EmitSoundOn( "DisableResistance.EarlyDebuffEnd", hParent ) + return false + end + + return true + end + + return true +end diff --git a/aghanim_singleplayer/scripts/vscripts/gameplay_shared.lua b/aghanim_singleplayer/scripts/vscripts/gameplay_shared.lua new file mode 100755 index 0000000..420c724 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/gameplay_shared.lua @@ -0,0 +1,47 @@ +require( "utility_functions" ) + +function GrantItemDropToHero( hPlayerHero, szItemName ) + + local hItem = hPlayerHero:AddItemByName( szItemName ) + + if hItem == nil then + local newItem = CreateItem( szItemName, hPlayerHero, hPlayerHero ) + newItem:SetPurchaseTime( 0 ) + local drop = CreateItemOnPositionSync( hPlayerHero:GetAbsOrigin(), newItem ) + local dropTarget = hPlayerHero:GetAbsOrigin() + RandomVector( RandomFloat( 50, 150 ) ) + newItem:LaunchLoot( false, 150, 0.75, dropTarget ) + + printf("launching loot for %s", hPlayerHero) + return newItem + end + return hItem +end + +function GetPlayerAbilitiesAndItems( nPlayerID ) + + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + + local vecAbilityNames = {} + + if hPlayerHero == nil then + --printf("GetPlayerAbilitiesAndItems: no entity for Player ID %d, returning empty list.", nPlayerID) + return vecAbilityNames + end + + for ii=0,15 do + local hItem = hPlayerHero:GetItemInSlot(ii) + if hItem and hItem:GetAbilityName() then + table.insert( vecAbilityNames, hItem:GetAbilityName() ) + end + end + + for ii=0,(hPlayerHero:GetAbilityCount()-1) do + local hAbility = hPlayerHero:GetAbilityByIndex(ii) + if hAbility and hAbility:GetAbilityName() then + table.insert( vecAbilityNames, hAbility:GetAbilityName() ) + end + end + + return vecAbilityNames; + +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_ambient_sorcery.lua b/aghanim_singleplayer/scripts/vscripts/items/item_ambient_sorcery.lua new file mode 100755 index 0000000..de4648b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_ambient_sorcery.lua @@ -0,0 +1,44 @@ + +item_ambient_sorcery = class({}) +LinkLuaModifier( "modifier_item_ambient_sorcery", "modifiers/modifier_item_ambient_sorcery", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_item_ambient_sorcery_effect", "modifiers/modifier_item_ambient_sorcery_effect", LUA_MODIFIER_MOTION_NONE ) + + +-------------------------------------------------------------------------------- + +function item_ambient_sorcery:GetIntrinsicModifierName() + return "modifier_item_ambient_sorcery" +end + +-------------------------------------------------------------------------------- + +function item_ambient_sorcery:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_ambient_sorcery:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_ambient_sorcery:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + + if not self:GetCaster():IsHero() then + return true + end + + return self.BaseClass.IsMuted( self ) +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_amorphotic_shell.lua b/aghanim_singleplayer/scripts/vscripts/items/item_amorphotic_shell.lua new file mode 100755 index 0000000..361a333 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_amorphotic_shell.lua @@ -0,0 +1,42 @@ +item_amorphotic_shell = class({}) +LinkLuaModifier( "modifier_item_amorphotic_shell", "modifiers/modifier_item_amorphotic_shell", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_item_amorphotic_shell_effect", "modifiers/modifier_item_amorphotic_shell_effect", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_amorphotic_shell:GetIntrinsicModifierName() + return "modifier_item_amorphotic_shell" +end + +-------------------------------------------------------------------------------- + +function item_amorphotic_shell:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_amorphotic_shell:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_amorphotic_shell:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + + if not self:GetCaster():IsHero() then + return true + end + + return self.BaseClass.IsMuted( self ) +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_arcane_fragments.lua b/aghanim_singleplayer/scripts/vscripts/items/item_arcane_fragments.lua new file mode 100755 index 0000000..fab5bff --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_arcane_fragments.lua @@ -0,0 +1,36 @@ + +item_arcane_fragments = class({}) + +-------------------------------------------------------------------------------- + +function item_arcane_fragments:Precache( context ) + PrecacheResource( "particle", "particles/msg_fx/msg_bp.vpcf", context ) + PrecacheResource( "particle", "particles/generic_gameplay/arcane_fragments_splash.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_arcane_fragments:GetBehavior() + return DOTA_ABILITY_BEHAVIOR_IMMEDIATE +end + +-------------------------------------------------------------------------------- + +function item_arcane_fragments:OnSpellStart() + if IsServer() then + + self:GetCaster():EmitSoundParams( "Item.ArcaneFragmentsClaimed", 0, 0.5, 0) + local gameEvent = {} + gameEvent["player_id"] = self:GetCaster():GetPlayerID() + gameEvent["teamnumber"] = -1 + gameEvent["int_value"] = self:GetCurrentCharges() + gameEvent["message"] = "#Aghanim_ArcaneFragmentsFound" + FireGameEvent( "dota_combat_event_message", gameEvent ) + + GameRules.Aghanim:GrantAllPlayersPoints( self:GetCurrentCharges(), false, "item_arcane_fragments" ) + + UTIL_Remove( self ) + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_battle_points.lua b/aghanim_singleplayer/scripts/vscripts/items/item_battle_points.lua new file mode 100755 index 0000000..b2cc954 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_battle_points.lua @@ -0,0 +1,30 @@ + +item_battle_points = class({}) + +-------------------------------------------------------------------------------- + +function item_battle_points:GetBehavior() + return DOTA_ABILITY_BEHAVIOR_IMMEDIATE +end + +-------------------------------------------------------------------------------- + +function item_battle_points:OnSpellStart() + if IsServer() then + + self:GetCaster():EmitSoundParams( "Item.BattlePointsClaimed", 0, 0.5, 0) + + local gameEvent = {} + gameEvent["player_id"] = self:GetCaster():GetPlayerID() + gameEvent["teamnumber"] = -1 + gameEvent["int_value"] = self:GetCurrentCharges() + gameEvent["message"] = "#Aghanim_BattlePointsFound" + FireGameEvent( "dota_combat_event_message", gameEvent ) + + GameRules.Aghanim:GrantAllPlayersPoints( self:GetCurrentCharges(), true, "item_battle_points" ) + + UTIL_Remove( self ) + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_bear_cloak.lua b/aghanim_singleplayer/scripts/vscripts/items/item_bear_cloak.lua new file mode 100755 index 0000000..7c4f1ea --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_bear_cloak.lua @@ -0,0 +1,44 @@ + +item_bear_cloak = class({}) +LinkLuaModifier( "modifier_item_bear_cloak", "modifiers/modifier_item_bear_cloak", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_item_bear_cloak_effect", "modifiers/modifier_item_bear_cloak_effect", LUA_MODIFIER_MOTION_NONE ) + + +-------------------------------------------------------------------------------- + +function item_bear_cloak:GetIntrinsicModifierName() + return "modifier_item_bear_cloak" +end + +-------------------------------------------------------------------------------- + +function item_bear_cloak:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_bear_cloak:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_bear_cloak:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + + if not self:GetCaster():IsHero() then + return true + end + + return self.BaseClass.IsMuted( self ) +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_bogduggs_baldric.lua b/aghanim_singleplayer/scripts/vscripts/items/item_bogduggs_baldric.lua new file mode 100755 index 0000000..3107456 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_bogduggs_baldric.lua @@ -0,0 +1,37 @@ +item_bogduggs_baldric = class({}) +LinkLuaModifier( "modifier_item_bogduggs_baldric", "modifiers/modifier_item_bogduggs_baldric", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_bogduggs_baldric:GetIntrinsicModifierName() + return "modifier_item_bogduggs_baldric" +end + +-------------------------------------------------------------------------------- + +function item_bogduggs_baldric:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_bogduggs_baldric:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_bogduggs_baldric:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_bogduggs_cudgel.lua b/aghanim_singleplayer/scripts/vscripts/items/item_bogduggs_cudgel.lua new file mode 100755 index 0000000..9e90aed --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_bogduggs_cudgel.lua @@ -0,0 +1,46 @@ +item_bogduggs_cudgel = class({}) +LinkLuaModifier( "modifier_item_bogduggs_cudgel", "modifiers/modifier_item_bogduggs_cudgel", LUA_MODIFIER_MOTION_NONE ) + +---------------------------------------------------------------------------------------- + +function item_bogduggs_cudgel:Precache( context ) + + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) + +end + +-------------------------------------------------------------------------------- + +function item_bogduggs_cudgel:GetIntrinsicModifierName() + return "modifier_item_bogduggs_cudgel" +end + +-------------------------------------------------------------------------------- + +function item_bogduggs_cudgel:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_bogduggs_cudgel:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_bogduggs_cudgel:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_bogduggs_lucky_femur.lua b/aghanim_singleplayer/scripts/vscripts/items/item_bogduggs_lucky_femur.lua new file mode 100755 index 0000000..e957c50 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_bogduggs_lucky_femur.lua @@ -0,0 +1,44 @@ +item_bogduggs_lucky_femur = class({}) +LinkLuaModifier( "modifier_item_bogduggs_lucky_femur", "modifiers/modifier_item_bogduggs_lucky_femur", LUA_MODIFIER_MOTION_NONE ) + + +---------------------------------------------------------------------------------------- + +function item_bogduggs_lucky_femur:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_ogre_magi/ogre_magi_multicast.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_bogduggs_lucky_femur:GetIntrinsicModifierName() + return "modifier_item_bogduggs_lucky_femur" +end + +-------------------------------------------------------------------------------- + +function item_bogduggs_lucky_femur:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_bogduggs_lucky_femur:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_bogduggs_lucky_femur:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_carapace_of_qaldin.lua b/aghanim_singleplayer/scripts/vscripts/items/item_carapace_of_qaldin.lua new file mode 100755 index 0000000..b777bf4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_carapace_of_qaldin.lua @@ -0,0 +1,37 @@ +item_carapace_of_qaldin = class({}) +LinkLuaModifier( "modifier_item_carapace_of_qaldin", "modifiers/modifier_item_carapace_of_qaldin", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_carapace_of_qaldin:GetIntrinsicModifierName() + return "modifier_item_carapace_of_qaldin" +end + +-------------------------------------------------------------------------------- + +function item_carapace_of_qaldin:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_carapace_of_qaldin:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_carapace_of_qaldin:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_corrupting_blade.lua b/aghanim_singleplayer/scripts/vscripts/items/item_corrupting_blade.lua new file mode 100755 index 0000000..1f04cf7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_corrupting_blade.lua @@ -0,0 +1,42 @@ + +item_corrupting_blade = class({}) +LinkLuaModifier( "modifier_item_corrupting_blade", "modifiers/modifier_item_corrupting_blade", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_item_corrupting_blade_buff", "modifiers/modifier_item_corrupting_blade_buff", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_corrupting_blade:GetIntrinsicModifierName() + return "modifier_item_corrupting_blade" +end + +-------------------------------------------------------------------------------- + +function item_corrupting_blade:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_corrupting_blade:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_corrupting_blade:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_creed_of_omniscience.lua b/aghanim_singleplayer/scripts/vscripts/items/item_creed_of_omniscience.lua new file mode 100755 index 0000000..2a42eea --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_creed_of_omniscience.lua @@ -0,0 +1,38 @@ +item_creed_of_omniscience = class({}) +LinkLuaModifier( "modifier_item_creed_of_omniscience", "modifiers/modifier_item_creed_of_omniscience", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_creed_of_omniscience:GetIntrinsicModifierName() + return "modifier_item_creed_of_omniscience" +end + +-------------------------------------------------------------------------------- + +function item_creed_of_omniscience:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_creed_of_omniscience:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_creed_of_omniscience:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_double_damage_potion.lua b/aghanim_singleplayer/scripts/vscripts/items/item_double_damage_potion.lua new file mode 100755 index 0000000..86ae37a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_double_damage_potion.lua @@ -0,0 +1,22 @@ + +item_double_damage_potion = class({}) +LinkLuaModifier( "modifier_item_double_damage_potion", "modifiers/modifier_item_double_damage_potion", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_double_damage_potion:OnSpellStart() + if IsServer() then + local kv = + { + duration = self:GetSpecialValueFor( "buff_duration" ), + } + + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_item_double_damage_potion", kv ) + + EmitSoundOn( "DoubleDamagePotion.Activate", self:GetCaster() ) + + self:SpendCharge() + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_dredged_trident.lua b/aghanim_singleplayer/scripts/vscripts/items/item_dredged_trident.lua new file mode 100755 index 0000000..bc1dcc6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_dredged_trident.lua @@ -0,0 +1,41 @@ + +item_dredged_trident = class({}) +LinkLuaModifier( "modifier_item_dredged_trident", "modifiers/modifier_item_dredged_trident", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_dredged_trident:GetIntrinsicModifierName() + return "modifier_item_dredged_trident" +end + +-------------------------------------------------------------------------------- + +function item_dredged_trident:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_dredged_trident:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_dredged_trident:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_evasion_potion.lua b/aghanim_singleplayer/scripts/vscripts/items/item_evasion_potion.lua new file mode 100755 index 0000000..b73f2cc --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_evasion_potion.lua @@ -0,0 +1,28 @@ + +item_evasion_potion = class({}) +LinkLuaModifier( "modifier_item_evasion_potion", "modifiers/modifier_item_evasion_potion", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_evasion_potion:Precache( context ) + PrecacheResource( "particle", "particles/generic_gameplay/evasion_potion_owner.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_evasion_potion:OnSpellStart() + if IsServer() then + local kv = + { + duration = self:GetSpecialValueFor( "buff_duration" ), + } + + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_item_evasion_potion", kv ) + + EmitSoundOn( "EvasionPotion.Activate", self:GetCaster() ) + + self:SpendCharge() + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_glimmerdark_shield.lua b/aghanim_singleplayer/scripts/vscripts/items/item_glimmerdark_shield.lua new file mode 100755 index 0000000..93257f7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_glimmerdark_shield.lua @@ -0,0 +1,56 @@ + +item_glimmerdark_shield = class({}) +LinkLuaModifier( "modifier_item_glimmerdark_shield", "modifiers/modifier_item_glimmerdark_shield", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_item_glimmerdark_shield_prism", "modifiers/modifier_item_glimmerdark_shield_prism", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_glimmerdark_shield:OnSpellStart() + self.prism_duration = self:GetSpecialValueFor( "prism_duration" ) + + if IsServer() then + local hCaster = self:GetCaster() + hCaster:AddNewModifier( hCaster, self, "modifier_item_glimmerdark_shield_prism", { duration = self.prism_duration } ) + + EmitSoundOn( "DOTA_Item.GhostScepter.Activate", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function item_glimmerdark_shield:GetIntrinsicModifierName() + return "modifier_item_glimmerdark_shield" +end + +-------------------------------------------------------------------------------- + +function item_glimmerdark_shield:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_glimmerdark_shield:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_glimmerdark_shield:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + + return self.BaseClass.IsMuted( self ) +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_gravel_foot.lua b/aghanim_singleplayer/scripts/vscripts/items/item_gravel_foot.lua new file mode 100755 index 0000000..cd077d0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_gravel_foot.lua @@ -0,0 +1,37 @@ +item_gravel_foot = class({}) +LinkLuaModifier( "modifier_item_gravel_foot", "modifiers/modifier_item_gravel_foot", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_gravel_foot:GetIntrinsicModifierName() + return "modifier_item_gravel_foot" +end + +-------------------------------------------------------------------------------- + +function item_gravel_foot:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_gravel_foot:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_gravel_foot:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_guardian_shell.lua b/aghanim_singleplayer/scripts/vscripts/items/item_guardian_shell.lua new file mode 100755 index 0000000..0806f3e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_guardian_shell.lua @@ -0,0 +1,37 @@ +item_guardian_shell = class({}) +LinkLuaModifier( "modifier_item_guardian_shell", "modifiers/modifier_item_guardian_shell", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_guardian_shell:GetIntrinsicModifierName() + return "modifier_item_guardian_shell" +end + +-------------------------------------------------------------------------------- + +function item_guardian_shell:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_guardian_shell:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_guardian_shell:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_health_potion.lua b/aghanim_singleplayer/scripts/vscripts/items/item_health_potion.lua new file mode 100755 index 0000000..8b08184 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_health_potion.lua @@ -0,0 +1,40 @@ + +item_health_potion = class({}) + +-------------------------------------------------------------------------------- + +function item_health_potion:GetBehavior() + return DOTA_ABILITY_BEHAVIOR_IMMEDIATE +end + +-------------------------------------------------------------------------------- + +function item_health_potion:OnSpellStart() + if IsServer() then + local hp_restore_pct = self:GetSpecialValueFor( "hp_restore_pct" ) + self:GetCaster():EmitSoundParams( "DOTA_Item.FaerieSpark.Activate", 0, 0.5, 0) + + local nTeamNumber = self:GetCaster():GetTeamNumber() + + local Heroes = HeroList:GetAllHeroes() + + for _,Hero in pairs ( Heroes ) do + if Hero ~= nil and Hero:IsRealHero() and Hero:IsAlive() and Hero:GetTeamNumber() == nTeamNumber then + local hBlessing = Hero:FindModifierByName( "modifier_blessing_potion_health" ) + if hBlessing ~= nil then + local nBonusHealPct = hBlessing:GetHealthRestorePercentBonus() + hp_restore_pct = hp_restore_pct * ( ( 100 + nBonusHealPct ) / 100 ) + --print( 'item_health_potion:OnSpellStart - adding ' .. nBonusHealPct .. '% to heal. Final heal % is ' .. hp_restore_pct ) + end + + local flHealAmount = Hero:GetMaxHealth() * hp_restore_pct / 100 + Hero:Heal( flHealAmount, self ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/items3_fx/fish_bones_active.vpcf", PATTACH_ABSORIGIN_FOLLOW, Hero ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + + self:SpendCharge() + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_ice_dragon_maw.lua b/aghanim_singleplayer/scripts/vscripts/items/item_ice_dragon_maw.lua new file mode 100755 index 0000000..f6ef1b3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_ice_dragon_maw.lua @@ -0,0 +1,46 @@ +item_ice_dragon_maw = class({}) +LinkLuaModifier( "modifier_item_ice_dragon_maw", "modifiers/modifier_item_ice_dragon_maw", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_large_frostbitten_icicle", "modifiers/modifier_large_frostbitten_icicle", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_ice_dragon_maw:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_crystalmaiden/maiden_frostbite.vpcf", context ) + PrecacheResource( "particle", "particles/status_fx/status_effect_wyvern_cold_embrace.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_crystalmaiden/maiden_frostbite_buff.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_ice_dragon_maw:GetIntrinsicModifierName() + return "modifier_item_ice_dragon_maw" +end + +-------------------------------------------------------------------------------- + +function item_ice_dragon_maw:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_ice_dragon_maw:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_ice_dragon_maw:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_life_rune.lua b/aghanim_singleplayer/scripts/vscripts/items/item_life_rune.lua new file mode 100755 index 0000000..d83d7eb --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_life_rune.lua @@ -0,0 +1,46 @@ +item_life_rune = class({}) + +-------------------------------------------------------------------------------- + +function item_life_rune:GetBehavior() + return DOTA_ABILITY_BEHAVIOR_IMMEDIATE +end + +-------------------------------------------------------------------------------- + +function item_life_rune:OnSpellStart() + if IsServer() then + if self:GetCaster() ~= nil and self:GetCaster():IsRealHero() then + if self:GetCaster().nRespawnsRemaining >= AGHANIM_MAX_LIVES then + local newItem = CreateItem( "item_life_rune", nil, nil ) + newItem:SetPurchaseTime( 0 ) + local drop = CreateItemOnPositionSync( self:GetCaster():GetAbsOrigin(), newItem ) + local dropTarget = self:GetCaster():GetAbsOrigin() + RandomVector( RandomFloat( 50, 150 ) ) + newItem:LaunchLoot( false, 150, 0.75, dropTarget ) + self:SpendCharge() + return + end + + self:GetCaster().nRespawnsRemaining = math.min( self:GetCaster().nRespawnsRemaining + 1, AGHANIM_MAX_LIVES ) + local hPlayer = self:GetCaster():GetPlayerOwner() + if hPlayer then + PlayerResource:SetCustomBuybackCooldown( hPlayer:GetPlayerID(), 0 ) + PlayerResource:SetCustomBuybackCost( hPlayer:GetPlayerID(), 0 ) + end + + local netTable = {} + CustomGameEventManager:Send_ServerToPlayer( self:GetCaster():GetPlayerOwner(), "gained_life", netTable ) + CustomNetTables:SetTableValue( "respawns_remaining", string.format( "%d", self:GetCaster():entindex() ), { respawns = self:GetCaster().nRespawnsRemaining } ) + + local gameEvent = {} + gameEvent["player_id"] = self:GetCaster():GetPlayerOwner():GetPlayerID() + gameEvent["team_number"] = DOTA_TEAM_GOODGUYS + gameEvent["locstring_value"] = "#DOTA_Tooltip_Ability_item_life_rune" + gameEvent["message"] = "#Dungeon_FoundLifeRune" + FireGameEvent( "dota_combat_event_message", gameEvent ) + end + self:SpendCharge() + end +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_lifestone.lua b/aghanim_singleplayer/scripts/vscripts/items/item_lifestone.lua new file mode 100755 index 0000000..1211f83 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_lifestone.lua @@ -0,0 +1,56 @@ + +item_lifestone = class({}) +LinkLuaModifier( "modifier_item_lifestone", "modifiers/modifier_item_lifestone", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_item_lifestone_pact", "modifiers/modifier_item_lifestone_pact", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_lifestone:GetIntrinsicModifierName() + return "modifier_item_lifestone" +end + +-------------------------------------------------------------------------------- + +function item_lifestone:OnSpellStart() + if IsServer() then + local hCaster = self:GetCaster() + if hCaster:HasModifier( "modifier_item_lifestone_pact" ) then + hCaster:RemoveModifierByName( "modifier_item_lifestone_pact" ) + else + hCaster:AddNewModifier( hCaster, self, "modifier_item_lifestone_pact", { duration = -1 } ) + end + end +end + +-------------------------------------------------------------------------------- + +function item_lifestone:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_lifestone:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_lifestone:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + + return self.BaseClass.IsMuted( self ) +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_longclaws_amulet.lua b/aghanim_singleplayer/scripts/vscripts/items/item_longclaws_amulet.lua new file mode 100755 index 0000000..7dd62cf --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_longclaws_amulet.lua @@ -0,0 +1,38 @@ +item_longclaws_amulet = class({}) +LinkLuaModifier( "modifier_item_longclaws_amulet", "modifiers/modifier_item_longclaws_amulet", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_longclaws_amulet:GetIntrinsicModifierName() + return "modifier_item_longclaws_amulet" +end + +-------------------------------------------------------------------------------- + +function item_longclaws_amulet:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_longclaws_amulet:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_longclaws_amulet:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_mana_potion.lua b/aghanim_singleplayer/scripts/vscripts/items/item_mana_potion.lua new file mode 100755 index 0000000..9185202 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_mana_potion.lua @@ -0,0 +1,42 @@ + +item_mana_potion = class({}) + +-------------------------------------------------------------------------------- + +function item_mana_potion:GetBehavior() + return DOTA_ABILITY_BEHAVIOR_IMMEDIATE +end + +-------------------------------------------------------------------------------- + +function item_mana_potion:OnSpellStart() + if IsServer() then + local mana_restore_pct = self:GetSpecialValueFor( "mana_restore_pct" ) + self:GetCaster():EmitSoundParams( "DOTA_Item.Mango.Activate", 0, 0.5, 0 ) + + local nTeamNumber = self:GetCaster():GetTeamNumber() + + local Heroes = HeroList:GetAllHeroes() + + for _,Hero in pairs ( Heroes ) do + if Hero ~= nil and Hero:IsRealHero() and Hero:IsAlive() and Hero:GetTeamNumber() == nTeamNumber then + local hBlessing = Hero:FindModifierByName( "modifier_blessing_potion_mana" ) + if hBlessing ~= nil then + local nBonusManaPct = hBlessing:GetManaRestorePercentBonus() + mana_restore_pct = mana_restore_pct * ( ( 100 + nBonusManaPct ) / 100 ) + --print( 'item_mana_potion:OnSpellStart - adding ' .. nBonusManaPct .. '% to mana. Final mana % is ' .. mana_restore_pct ) + end + + local flManaAmount = Hero:GetMaxMana() * mana_restore_pct / 100 + Hero:GiveMana( flManaAmount ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/items3_fx/mango_active.vpcf", PATTACH_ABSORIGIN_FOLLOW, Hero ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + + self:SpendCharge() + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_oblivions_locket.lua b/aghanim_singleplayer/scripts/vscripts/items/item_oblivions_locket.lua new file mode 100755 index 0000000..17f1588 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_oblivions_locket.lua @@ -0,0 +1,61 @@ +item_oblivions_locket = class({}) +LinkLuaModifier( "modifier_item_oblivions_locket", "modifiers/modifier_item_oblivions_locket", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_oblivions_locket:OnSpellStart() + if IsServer() then + EmitSoundOn( "DOTA_Item.GhostScepter.Activate", self:GetCaster() ) + + local kv = + { + duration = -1, + extra_spell_damage_percent = self:GetSpecialValueFor( "extra_spell_damage_percent" ), + } + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_ghost_state", kv ) + end +end + +-------------------------------------------------------------------------------- + +function item_oblivions_locket:OnChannelFinish( bInterrupted ) + if IsServer() then + self:GetCaster():RemoveModifierByName( "modifier_ghost_state" ) + end +end + +-------------------------------------------------------------------------------- + +function item_oblivions_locket:GetIntrinsicModifierName() + return "modifier_item_oblivions_locket" +end + +-------------------------------------------------------------------------------- + +function item_oblivions_locket:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_oblivions_locket:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_oblivions_locket:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_ogre_seal_totem.lua b/aghanim_singleplayer/scripts/vscripts/items/item_ogre_seal_totem.lua new file mode 100755 index 0000000..ed99851 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_ogre_seal_totem.lua @@ -0,0 +1,152 @@ + +item_ogre_seal_totem = class({}) +LinkLuaModifier( "modifier_item_ogre_seal_totem", "modifiers/modifier_item_ogre_seal_totem", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_ogreseal_flop", "modifiers/creatures/modifier_ogreseal_flop", LUA_MODIFIER_MOTION_BOTH ) + +-------------------------------------------------------------------------------- + +function item_ogre_seal_totem:Precache( context ) + PrecacheResource( "particle", "particles/creatures/ogre_seal/ogre_seal_warcry.vpcf", context ) + PrecacheResource( "particle", "particles/creatures/ogre/ogre_melee_smash.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_ogre_seal_totem:GetAOERadius() + return self:GetSpecialValueFor( "radius" ) +end + +-------------------------------------------------------------------------------- + +function item_ogre_seal_totem:GetIntrinsicModifierName() + return "modifier_item_ogre_seal_totem" +end + +-------------------------------------------------------------------------------- + +function item_ogre_seal_totem:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_ogre_seal_totem:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_ogre_seal_totem:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + + return self.BaseClass.IsMuted( self ) +end + +-------------------------------------------------------------------------------- + + +function item_ogre_seal_totem:OnAbilityPhaseStart() + if IsServer() then + --self:GetCaster():StartGesture( ACT_DOTA_VICTORY ) + end + + return true +end + +-------------------------------------------------------------------------------- + +function item_ogre_seal_totem:OnAbilityPhaseInterrupted() + if IsServer() then + ParticleManager:DestroyParticle( self.nPreviewFXIndex, true ) + + --self:GetCaster():RemoveGesture( ACT_DOTA_VICTORY ) + self:GetCaster():RemoveModifierByName( "modifier_techies_suicide_leap_animation" ) + end +end + +-------------------------------------------------------------------------------- + +function item_ogre_seal_totem:OnSpellStart() + if IsServer() then + if self.nPreviewFXIndex then + ParticleManager:DestroyParticle( self.nPreviewFXIndex, true ) + end + + --self:GetCaster():RemoveGesture( ACT_DOTA_VICTORY ) + + self.stun_duration = self:GetSpecialValueFor("stun_duration") + + local vToTarget = self:GetCursorPosition() - self:GetCaster():GetOrigin() + vToTarget = vToTarget:Normalized() + local vLocation = self:GetCaster():GetOrigin() + vToTarget * 25 + local kv = + { + vLocX = vLocation.x, + vLocY = vLocation.y, + vLocZ = vLocation.z + } + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_ogreseal_flop", kv ) + + EmitSoundOn( "OgreTank.Grunt", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function item_ogre_seal_totem:TryToDamage() + if IsServer() then + local radius = self:GetSpecialValueFor( "radius" ) + local damage = self:GetSpecialValueFor( "damage" ) + local silence_duration = self:GetSpecialValueFor( "silence_duration" ) + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetOrigin(), self:GetCaster(), radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS, 0, false ) + if #enemies > 0 then + for _,enemy in pairs(enemies) do + if enemy ~= nil and ( not enemy:IsMagicImmune() ) and ( not enemy:IsInvulnerable() ) then + local DamageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + ability = self, + damage = damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + } + ApplyDamage( DamageInfo ) + if enemy:IsAlive() == false and enemy:GetUnitName() ~= "npc_dota_crate" and enemy:GetUnitName() ~= "npc_dota_vase" then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, enemy:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, -self:GetCaster():GetForwardVector() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 10, enemy, PATTACH_ABSORIGIN_FOLLOW, nil, enemy:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Dungeon.BloodSplatterImpact", enemy ) + else + enemy:AddNewModifier( self:GetCaster(), self, "modifier_stunned", { duration = self.stun_duration } ) + end + end + end + end + + EmitSoundOnLocationWithCaster( self:GetCaster():GetOrigin(), "OgreTank.GroundSmash", self:GetCaster() ) + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/ogre/ogre_melee_smash.vpcf", PATTACH_WORLDORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetCaster():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.radius, self.radius, self.radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + GridNav:DestroyTreesAroundPoint( self:GetCaster():GetOrigin(), radius, false ) + end +end + + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_paw_of_lucius.lua b/aghanim_singleplayer/scripts/vscripts/items/item_paw_of_lucius.lua new file mode 100755 index 0000000..5d0246a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_paw_of_lucius.lua @@ -0,0 +1,44 @@ +item_paw_of_lucius = class({}) +LinkLuaModifier( "modifier_item_paw_of_lucius", "modifiers/modifier_item_paw_of_lucius", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_paw_of_lucius:GetIntrinsicModifierName() + return "modifier_item_paw_of_lucius" +end + +-------------------------------------------------------------------------------- + +function item_paw_of_lucius:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_bloodseeker/bloodseeker_rupture.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_paw_of_lucius:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_paw_of_lucius:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_paw_of_lucius:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_pelt_of_the_old_wolf.lua b/aghanim_singleplayer/scripts/vscripts/items/item_pelt_of_the_old_wolf.lua new file mode 100755 index 0000000..d9a7079 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_pelt_of_the_old_wolf.lua @@ -0,0 +1,38 @@ +item_pelt_of_the_old_wolf = class({}) +LinkLuaModifier( "modifier_item_pelt_of_the_old_wolf", "modifiers/modifier_item_pelt_of_the_old_wolf", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_pelt_of_the_old_wolf:GetIntrinsicModifierName() + return "modifier_item_pelt_of_the_old_wolf" +end + +-------------------------------------------------------------------------------- + +function item_pelt_of_the_old_wolf:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_pelt_of_the_old_wolf:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_pelt_of_the_old_wolf:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_pocket_campfire.lua b/aghanim_singleplayer/scripts/vscripts/items/item_pocket_campfire.lua new file mode 100755 index 0000000..76a9ec5 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_pocket_campfire.lua @@ -0,0 +1,18 @@ + +item_pocket_campfire = class({}) + +-------------------------------------------------------------------------------- + +function item_pocket_campfire:OnSpellStart() + if IsServer() then + local vPos = self:GetCursorPosition() + local hPocketCampfire = CreateUnitByName( "npc_dota_pocket_campfire", vPos, true, nil, nil, DOTA_TEAM_GOODGUYS ) + if hPocketCampfire ~= nil then + EmitSoundOn( "PocketCampfire.Create", hCampfire ) + end + self:SpendCharge() + end +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_precious_egg.lua b/aghanim_singleplayer/scripts/vscripts/items/item_precious_egg.lua new file mode 100755 index 0000000..3d92367 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_precious_egg.lua @@ -0,0 +1,37 @@ +item_precious_egg = class({}) +LinkLuaModifier( "modifier_item_precious_egg", "modifiers/modifier_item_precious_egg", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_precious_egg:GetIntrinsicModifierName() + return "modifier_item_precious_egg" +end + +-------------------------------------------------------------------------------- + +function item_precious_egg:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_precious_egg:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_precious_egg:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_preserved_skull.lua b/aghanim_singleplayer/scripts/vscripts/items/item_preserved_skull.lua new file mode 100755 index 0000000..03ed197 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_preserved_skull.lua @@ -0,0 +1,39 @@ +item_preserved_skull = class({}) +LinkLuaModifier( "modifier_item_preserved_skull", "modifiers/modifier_item_preserved_skull", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_item_preserved_skull_effect", "modifiers/modifier_item_preserved_skull_effect", LUA_MODIFIER_MOTION_NONE ) + + +-------------------------------------------------------------------------------- + +function item_preserved_skull:GetIntrinsicModifierName() + return "modifier_item_preserved_skull" +end + +-------------------------------------------------------------------------------- + +function item_preserved_skull:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_preserved_skull:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_preserved_skull:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_purification_potion.lua b/aghanim_singleplayer/scripts/vscripts/items/item_purification_potion.lua new file mode 100755 index 0000000..e07a011 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_purification_potion.lua @@ -0,0 +1,76 @@ + +item_purification_potion = class({}) +LinkLuaModifier( "modifier_item_purification_potion", "modifiers/modifier_item_purification_potion", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_purification_potion:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_purification.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_purification_hit.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_purification_potion:OnSpellStart() + if IsServer() then + self.heal = self:GetSpecialValueFor( "heal" ) + self.radius = self:GetSpecialValueFor( "radius" ) + + --print( 'item_purification_potion:OnSpellStart() - radius is ' .. self.radius ) + + local kv = + { + duration = 0.1, + } + + self:HealAlly( self:GetCursorTarget() ) + + self:SpendCharge() + end +end + +-------------------------------------------------------------------------------- + +function item_purification_potion:HealAlly( hAlliedHero ) + if IsServer() then + hAlliedHero:Heal( self.heal, self ) + + SendOverheadEventMessage( self:GetCaster():GetPlayerOwner(), OVERHEAD_ALERT_HEAL, hAlliedHero, self.heal, nil ) + + -- blessing adds a dispel on the target + local hBuff = self:GetCaster():FindModifierByName( "modifier_blessing_potion_purification" ) + if hBuff ~= nil then + --print( "item_purification_potion:HealAlly - purging the target because we've got modifier_blessing_potion_purification!" ) + -- PositiveBuffs, NegativeBuffs, FrameOnly, RemoveStuns, RemoveExceptions + hAlliedHero:Purge( false, true, false, true, false ) + end + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_omniknight/omniknight_purification.vpcf", PATTACH_CUSTOMORIGIN, hAlliedHero ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, hAlliedHero, PATTACH_ABSORIGIN_FOLLOW, nil, hAlliedHero:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.radius, self.radius, self.radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "PurificationPotion.Activate", hAlliedHero ) + + local enemies = FindUnitsInRadius( hAlliedHero:GetTeamNumber(), hAlliedHero:GetOrigin(), nil, self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _, enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and enemy:IsMagicImmune() == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.heal, + damage_type = self:GetAbilityDamageType(), + ability = self, + } + ApplyDamage( damageInfo ) + + local nFXIndex3 = ParticleManager:CreateParticle( "particles/units/heroes/hero_omniknight/omniknight_purification_hit.vpcf", PATTACH_ABSORIGIN_FOLLOW, enemy ) + ParticleManager:SetParticleControlEnt( nFXIndex3, 1, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex3 ) + end + end + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_rhyziks_eye.lua b/aghanim_singleplayer/scripts/vscripts/items/item_rhyziks_eye.lua new file mode 100755 index 0000000..2fda966 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_rhyziks_eye.lua @@ -0,0 +1,37 @@ +item_rhyziks_eye = class({}) +LinkLuaModifier( "modifier_item_rhyziks_eye", "modifiers/modifier_item_rhyziks_eye", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_rhyziks_eye:GetIntrinsicModifierName() + return "modifier_item_rhyziks_eye" +end + +-------------------------------------------------------------------------------- + +function item_rhyziks_eye:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_rhyziks_eye:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_rhyziks_eye:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_sign_of_the_arachnid.lua b/aghanim_singleplayer/scripts/vscripts/items/item_sign_of_the_arachnid.lua new file mode 100755 index 0000000..9468ecf --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_sign_of_the_arachnid.lua @@ -0,0 +1,39 @@ +item_sign_of_the_arachnid = class({}) +LinkLuaModifier( "modifier_item_sign_of_the_arachnid", "modifiers/modifier_item_sign_of_the_arachnid", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_item_sign_of_the_arachnid_effect", "modifiers/modifier_item_sign_of_the_arachnid_effect", LUA_MODIFIER_MOTION_NONE ) + + +-------------------------------------------------------------------------------- + +function item_sign_of_the_arachnid:GetIntrinsicModifierName() + return "modifier_item_sign_of_the_arachnid" +end + +-------------------------------------------------------------------------------- + +function item_sign_of_the_arachnid:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_sign_of_the_arachnid:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_sign_of_the_arachnid:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_slippers_of_the_abyss.lua b/aghanim_singleplayer/scripts/vscripts/items/item_slippers_of_the_abyss.lua new file mode 100755 index 0000000..85527dd --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_slippers_of_the_abyss.lua @@ -0,0 +1,57 @@ + +item_slippers_of_the_abyss = class({}) +LinkLuaModifier( "modifier_item_slippers_of_the_abyss", "modifiers/modifier_item_slippers_of_the_abyss", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_item_slippers_of_the_abyss_sprint", "modifiers/modifier_item_slippers_of_the_abyss_sprint", LUA_MODIFIER_MOTION_NONE ) + +----------------------------------------------------------------------------------------- + +function item_slippers_of_the_abyss:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_slardar/slardar_sprint.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_slippers_of_the_abyss:GetIntrinsicModifierName() + return "modifier_item_slippers_of_the_abyss" +end + +-------------------------------------------------------------------------------- + +function item_slippers_of_the_abyss:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_slippers_of_the_abyss:OnSpellStart() + if IsServer() then + self.sprint_duration = self:GetSpecialValueFor( "sprint_duration" ) + + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_item_slippers_of_the_abyss_sprint", { duration = self.sprint_duration } ) + + EmitSoundOn( "Siltbreaker.Sprint", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function item_slippers_of_the_abyss:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_slippers_of_the_abyss:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_spell_amp_potion.lua b/aghanim_singleplayer/scripts/vscripts/items/item_spell_amp_potion.lua new file mode 100755 index 0000000..86a323b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_spell_amp_potion.lua @@ -0,0 +1,28 @@ + +item_spell_amp_potion = class({}) +LinkLuaModifier( "modifier_item_spell_amp_potion", "modifiers/modifier_item_spell_amp_potion", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_spell_amp_potion:Precache( context ) + PrecacheResource( "particle", "particles/generic_gameplay/spell_amp_potion_owner.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_spell_amp_potion:OnSpellStart() + if IsServer() then + local kv = + { + duration = self:GetSpecialValueFor( "buff_duration" ), + } + + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_item_spell_amp_potion", kv ) + + EmitSoundOn( "SpellAmpPotion.Activate", self:GetCaster() ) + + self:SpendCharge() + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_stonework_pendant.lua b/aghanim_singleplayer/scripts/vscripts/items/item_stonework_pendant.lua new file mode 100755 index 0000000..4cd4839 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_stonework_pendant.lua @@ -0,0 +1,37 @@ +item_stonework_pendant = class({}) +LinkLuaModifier( "modifier_item_stonework_pendant", "modifiers/modifier_item_stonework_pendant", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_stonework_pendant:GetIntrinsicModifierName() + return "modifier_item_stonework_pendant" +end + +-------------------------------------------------------------------------------- + +function item_stonework_pendant:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_stonework_pendant:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_stonework_pendant:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_stony_coat.lua b/aghanim_singleplayer/scripts/vscripts/items/item_stony_coat.lua new file mode 100755 index 0000000..37988fc --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_stony_coat.lua @@ -0,0 +1,67 @@ +item_stony_coat = class({}) +LinkLuaModifier( "modifier_item_stony_coat", "modifiers/modifier_item_stony_coat", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_stony_coat:Precache( context ) + PrecacheResource( "particle", "particles/neutral_fx/mud_golem_hurl_boulder.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_stony_coat:GetIntrinsicModifierName() + return "modifier_item_stony_coat" +end + +-------------------------------------------------------------------------------- + +function item_stony_coat:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) + self.boulder_damage = self:GetSpecialValueFor( "boulder_damage" ) + self.boulder_stun_duration = self:GetSpecialValueFor( "boulder_stun_duration" ) +end + +-------------------------------------------------------------------------------- + +function item_stony_coat:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_stony_coat:OnProjectileHit( hTarget, vLocation ) + if IsServer() then + if hTarget ~= nil and hTarget:IsMagicImmune() == false and hTarget:IsInvulnerable() == false then + local damageinfo = + { + victim = hTarget, + attacker = self:GetCaster(), + damage = self.boulder_damage, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self, + } + ApplyDamage( damageinfo ) + EmitSoundOn( "n_mud_golem.Boulder.Target", hTarget ) + hTarget:AddNewModifier( self:GetCaster(), self, "modifier_stunned", { duration = self.boulder_stun_duration } ) + end + end + + return true +end + +-------------------------------------------------------------------------------- + +function item_stony_coat:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_the_caustic_finale.lua b/aghanim_singleplayer/scripts/vscripts/items/item_the_caustic_finale.lua new file mode 100755 index 0000000..400cdbc --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_the_caustic_finale.lua @@ -0,0 +1,37 @@ +item_the_caustic_finale = class({}) +LinkLuaModifier( "modifier_item_the_caustic_finale", "modifiers/modifier_item_the_caustic_finale", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_the_caustic_finale:GetIntrinsicModifierName() + return "modifier_item_the_caustic_finale" +end + +-------------------------------------------------------------------------------- + +function item_the_caustic_finale:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_the_caustic_finale:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_the_caustic_finale:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_tome_of_greater_knowledge.lua b/aghanim_singleplayer/scripts/vscripts/items/item_tome_of_greater_knowledge.lua new file mode 100755 index 0000000..7951165 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_tome_of_greater_knowledge.lua @@ -0,0 +1,33 @@ +item_tome_of_greater_knowledge = class({}) + +-------------------------------------------------------------------------------- + +function item_tome_of_greater_knowledge:Precache( context ) + PrecacheResource( "model", "models/gameplay/attrib_tome_str.vmdl", context ) + PrecacheResource( "particle", "particles/generic_hero_status/hero_levelup.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_tome_of_greater_knowledge:OnSpellStart() + if IsServer() then + if self:GetCaster() ~= nil and self:GetCaster():IsRealHero() then + + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + local nFXIndex = ParticleManager:CreateParticle( "particles/generic_hero_status/hero_levelup.vpcf", PATTACH_ABSORIGIN_FOLLOW, hPlayerHero ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local nXP = ( GetXPNeededToReachNextLevel( hPlayerHero:GetLevel() ) - GetXPNeededToReachNextLevel( hPlayerHero:GetLevel() - 1 ) ) / 2 + hPlayerHero:AddExperience( nXP, DOTA_ModifyXP_Unspecified, false, false ) + + EmitSoundOn( "Item.TomeOfKnowledge", hPlayerHero ) + end + end + end + self:SpendCharge() + end +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_torrent_effect_potion.lua b/aghanim_singleplayer/scripts/vscripts/items/item_torrent_effect_potion.lua new file mode 100755 index 0000000..96561ee --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_torrent_effect_potion.lua @@ -0,0 +1,37 @@ + +item_torrent_effect_potion = class({}) +LinkLuaModifier( "modifier_item_torrent_effect_potion", "modifiers/modifier_item_torrent_effect_potion", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_torrent_effect_potion:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_kunkka/kunkka_spell_torrent_bubbles.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_kunkka/kunkka_spell_torrent_splash.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_torrent_effect_potion:OnSpellStart() + if IsServer() then + self.proc_chance = self:GetSpecialValueFor( "proc_chance" ) + self.radius = self:GetSpecialValueFor( "radius" ) + self.movespeed_bonus = self:GetSpecialValueFor( "movespeed_bonus" ) + self.slow_duration = self:GetSpecialValueFor( "slow_duration" ) + self.stun_duration = self:GetSpecialValueFor( "stun_duration" ) + self.delay = self:GetSpecialValueFor( "delay" ) + self.torrent_damage = self:GetSpecialValueFor( "torrent_damage" ) + + local kv = + { + duration = -1, + } + + self:GetCaster():AddNewModifier( self:GetCaster(), self, "modifier_item_torrent_effect_potion", kv ) + + EmitSoundOn( "TorrentEffectPotion.Activate", self:GetCaster() ) + + self:SpendCharge() + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_treads_of_ermacor.lua b/aghanim_singleplayer/scripts/vscripts/items/item_treads_of_ermacor.lua new file mode 100755 index 0000000..cd3e0f2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_treads_of_ermacor.lua @@ -0,0 +1,37 @@ +item_treads_of_ermacor = class({}) +LinkLuaModifier( "modifier_item_treads_of_ermacor", "modifiers/modifier_item_treads_of_ermacor", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_treads_of_ermacor:GetIntrinsicModifierName() + return "modifier_item_treads_of_ermacor" +end + +-------------------------------------------------------------------------------- + +function item_treads_of_ermacor:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_treads_of_ermacor:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_treads_of_ermacor:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_treasure_box.lua b/aghanim_singleplayer/scripts/vscripts/items/item_treasure_box.lua new file mode 100755 index 0000000..7004f5b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_treasure_box.lua @@ -0,0 +1,41 @@ +item_treasure_box = class({}) + +function item_treasure_box:GetBehavior() + return DOTA_ABILITY_BEHAVIOR_IMMEDIATE +end + +-------------------------------------------------------------------------------- + +function item_treasure_box:OnSpellStart() + if IsServer() then + local CurrentZone = nil + for _,Zone in pairs( GameRules.Dungeon.Zones ) do + if Zone ~= nil and Zone:ContainsUnit( self:GetCaster() ) then + CurrentZone = Zone + end + end + + if CurrentZone == nil then + self:SpendCharge() + return + end + + local ChestTable = CurrentZone.Chests[#CurrentZone.Chests] + local hTreasure = CreateUnitByName( ChestTable.szNPCName, self:GetCaster():GetOrigin() + RandomVector( RandomFloat( 50, 100 ) ), true, nil, nil, DOTA_TEAM_GOODGUYS ) + if hTreasure ~= nil then + hTreasure.zone = CurrentZone + hTreasure.Items = ChestTable.Items + hTreasure.fItemChance = ChestTable.fItemChance + hTreasure.Relics = ChestTable.Relics + hTreasure.fRelicChance = ChestTable.fRelicChance + hTreasure.nMinGold = ChestTable.nMinGold + hTreasure.nMaxGold = ChestTable.nMaxGold + hTreasure.szTraps = ChestTable.szTraps + hTreasure.nTrapLevel = ChestTable.nTrapLevel + EmitSoundOn( "Dungeon.TreasureItemDrop", hTreasure ) + end + self:SpendCharge() + end +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_unhallowed_icon.lua b/aghanim_singleplayer/scripts/vscripts/items/item_unhallowed_icon.lua new file mode 100755 index 0000000..1255023 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_unhallowed_icon.lua @@ -0,0 +1,39 @@ +item_unhallowed_icon = class({}) +LinkLuaModifier( "modifier_item_unhallowed_icon", "modifiers/modifier_item_unhallowed_icon", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_item_unhallowed_icon_effect", "modifiers/modifier_item_unhallowed_icon_effect", LUA_MODIFIER_MOTION_NONE ) + + +-------------------------------------------------------------------------------- + +function item_unhallowed_icon:GetIntrinsicModifierName() + return "modifier_item_unhallowed_icon" +end + +-------------------------------------------------------------------------------- + +function item_unhallowed_icon:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_unhallowed_icon:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_unhallowed_icon:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_wand_of_the_brine.lua b/aghanim_singleplayer/scripts/vscripts/items/item_wand_of_the_brine.lua new file mode 100755 index 0000000..9280cef --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_wand_of_the_brine.lua @@ -0,0 +1,60 @@ + +item_wand_of_the_brine = class({}) +LinkLuaModifier( "modifier_item_wand_of_the_brine", "modifiers/modifier_item_wand_of_the_brine", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_item_wand_of_the_brine_bubble", "modifiers/modifier_item_wand_of_the_brine_bubble", LUA_MODIFIER_MOTION_NONE ) + + +-------------------------------------------------------------------------------- + +function item_wand_of_the_brine:Precache( context ) + PrecacheResource( "particle", "particles/act_2/wand_of_the_brine_bubble.vpcf", context ) +end + +-------------------------------------------------------------------------------- + +function item_wand_of_the_brine:OnSpellStart() + if IsServer() then + self.bubble_duration = self:GetSpecialValueFor( "bubble_duration" ) + + local hTarget = self:GetCursorTarget() + hTarget:AddNewModifier( self:GetCaster(), self, "modifier_item_wand_of_the_brine_bubble", { duration = self.bubble_duration } ) + + EmitSoundOn( "DOTA_Item.GhostScepter.Activate", self:GetCaster() ) + end +end + +-------------------------------------------------------------------------------- + +function item_wand_of_the_brine:GetIntrinsicModifierName() + return "modifier_item_wand_of_the_brine" +end + +-------------------------------------------------------------------------------- + +function item_wand_of_the_brine:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_wand_of_the_brine:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_wand_of_the_brine:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_watchers_gaze.lua b/aghanim_singleplayer/scripts/vscripts/items/item_watchers_gaze.lua new file mode 100755 index 0000000..9b581ab --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_watchers_gaze.lua @@ -0,0 +1,72 @@ +item_watchers_gaze = class({}) +LinkLuaModifier( "modifier_item_watchers_gaze", "modifiers/modifier_item_watchers_gaze", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_watchers_gaze:Precache( context ) + PrecacheResource( "particle", "particles/units/heroes/hero_medusa/medusa_stone_gaze_cast.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_medusa/medusa_stone_gaze_active.vpcf", context ) +end + + +-------------------------------------------------------------------------------- + +function item_watchers_gaze:OnSpellStart() + if IsServer() then + local vision_cone = self:GetSpecialValueFor( "vision_cone" ) + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_medusa/medusa_stone_gaze_cast.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetCaster():GetOrigin(), nil, 800, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil then + local vToTarget = enemy:GetOrigin() - self:GetCaster():GetOrigin() + vToTarget = vToTarget:Normalized() + local flDirectionDot = DotProduct( vToTarget, self:GetCaster():GetForwardVector() ) + local flAngle = 180 * math.acos( flDirectionDot ) / math.pi + if flAngle < 60 then + enemy:AddNewModifier( self:GetCaster(), self, "modifier_medusa_stone_gaze_stone", {duration = self:GetSpecialValueFor( "stone_duration" ) } ) + EmitSoundOn( "WatchersGaze.Target" ,enemy ) + end + end + + end + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_medusa/medusa_stone_gaze_active.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetOrigin(), true ) + end +end + +-------------------------------------------------------------------------------- + +function item_watchers_gaze:GetIntrinsicModifierName() + return "modifier_item_watchers_gaze" +end + +-------------------------------------------------------------------------------- + +function item_watchers_gaze:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_watchers_gaze:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_watchers_gaze:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/items/item_winter_embrace.lua b/aghanim_singleplayer/scripts/vscripts/items/item_winter_embrace.lua new file mode 100755 index 0000000..c903fc9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/items/item_winter_embrace.lua @@ -0,0 +1,37 @@ +item_winter_embrace = class({}) +LinkLuaModifier( "modifier_item_winter_embrace", "modifiers/modifier_item_winter_embrace", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +function item_winter_embrace:GetIntrinsicModifierName() + return "modifier_item_winter_embrace" +end + +-------------------------------------------------------------------------------- + +function item_winter_embrace:Spawn() + self.required_level = self:GetSpecialValueFor( "required_level" ) +end + +-------------------------------------------------------------------------------- + +function item_winter_embrace:OnHeroLevelUp() + if IsServer() then + if self:GetCaster():GetLevel() == self.required_level and self:IsInBackpack() == false then + self:OnUnequip() + self:OnEquip() + end + end +end + +-------------------------------------------------------------------------------- + +function item_winter_embrace:IsMuted() + if self.required_level > self:GetCaster():GetLevel() then + return true + end + if not self:GetCaster():IsHero() then + return true + end + return self.BaseClass.IsMuted( self ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/map_encounter.lua b/aghanim_singleplayer/scripts/vscripts/map_encounter.lua new file mode 100755 index 0000000..753d14a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/map_encounter.lua @@ -0,0 +1,2689 @@ +require( "constants" ) +require( "ascension_levels" ) +require( "map_room" ) +require( "utility_functions" ) +require( "spawner" ) +require( "portalspawner" ) +require( "portalspawnerv2" ) + + +LinkLuaModifier( "modifier_monster_leash", "modifiers/modifier_monster_leash", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_passive_autocast", "modifiers/modifier_passive_autocast", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_ability_cast_warning", "modifiers/modifier_ability_cast_warning", LUA_MODIFIER_MOTION_NONE ) +LinkLuaModifier( "modifier_ascension_plasma_field_display", "modifiers/modifier_ascension_plasma_field_display", LUA_MODIFIER_MOTION_NONE ) + +-------------------------------------------------------------------------------- + +if CMapEncounter == nil then + CMapEncounter = class({}) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:constructor( hRoom, szEncounterName ) + self.szEncounterName = szEncounterName + self.hRoom = hRoom + + if self.hRoom == nil then + print( "ERROR - Nil room for " .. szEncounterName ) + return + end + + self.Spawners = {} + self.PortalSpawners = {} + self.RetreatPoints = {} + self.PortalSpawnersV2 = {} + + self.flStartTime = -1 + self.EventListeners = {} + self.bCompleted = false + self.flCompletionTime = nil + self.bDevForceCompleted = false + self.bHasGeneratedRewards = false + self.bHasSpawnedEndLevelEntities = false + self.vRoomRewardCratePos = self.hRoom:GetOrigin() + self.szPortalTriggerSpawner = nil + self.flPortalTriggerDelay = 0 + + self.nMaxSpawnedUnitCount = 0 + self.nUnitsRemainingForRewardDrops = 0 + + self.SpawnedEnemies = {} + self.SpawnedSecondaryEnemies = {} + self.SpawnedPortalTriggerUnits = {} + self.nKilledEnemies = 0 + self.nKilledSecondaryEnemies = 0 + + self.SpawnedBreakables = {} + self.SpawnedExplosiveBarrels = {} + + self.bCalculateRewardsFromUnitCount = false + + local nTotalGoldReward = self:GetTotalGoldRewardPerPlayer() + self.nGoldReward = nTotalGoldReward + self.nTotalGoldFromEnemies = nTotalGoldReward - self.nGoldReward + self.nRemainingGoldFromEnemies = self.nTotalGoldFromEnemies + + local nTotalXPReward = self:GetTotalXPRewardPerPlayer() + self.nXPReward = nTotalXPReward / 2 + self.nTotalXPFromEnemies = nTotalXPReward - self.nXPReward + self.nRemainingXPFromEnemies = self.nTotalXPFromEnemies + + self.nNumItemsToDrop = 0 + self.nNumBPToDrop = 0 + self.nNumFragmentsToDrop = 0 + + self.nChestsToSpawn = 0 + if self.hRoom:GetType() == ROOM_TYPE_TRAPS then + self.nChestsToSpawn = self:RoomRandomInt( DEFAULT_MIN_CHESTS, DEFAULT_MAX_CHESTS ) + --elseif self.hRoom:GetType() == ROOM_TYPE_STARTING then + --self.nChestsToSpawn = 8 -- dev test + end + + self.nCratesToSpawn = 0 + if self.hRoom:GetType() == ROOM_TYPE_ENEMY then + self.nCratesToSpawn = self:RoomRandomInt( DEFAULT_MIN_CRATES_ENEMY_ENC, DEFAULT_MAX_CRATES_ENEMY_ENC ) + elseif self.hRoom:GetType() == ROOM_TYPE_BOSS then + self.nCratesToSpawn = self:RoomRandomInt( DEFAULT_MIN_CRATES_BOSS_ENC, DEFAULT_MAX_CRATES_BOSS_ENC ) + end + + self.nExplosiveBarrelsToSpawn = 0 + local bSpawnExplosiveBarrels = self:RoomRollPercentage( ENCOUNTER_SPAWN_BARRELS_CHANCE ) + if bSpawnExplosiveBarrels then + if self.hRoom:GetType() == ROOM_TYPE_ENEMY then + self.nExplosiveBarrelsToSpawn = self:RoomRandomInt( DEFAULT_MIN_BARRELS_ENEMY_ENC, DEFAULT_MAX_BARRELS_ENEMY_ENC ) + end + end + + self.nObjectiveNumber = 1 + + self.ClientData = {} + self.ClientData[ "encounter_name" ] = szEncounterName + self.ClientData[ "encounter_depth" ] = self.hRoom:GetDepth() + self.ClientData[ "room_type" ] = GetStringForRoomType( self.hRoom:GetType() ) + self.ClientData[ "objectives" ] = {} +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:RoomRandomInt( nMinInt, nMaxInt ) + return self:GetRoom():RoomRandomInt( nMinInt, nMaxInt ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:RoomRandomFloat( flMin, flMin ) + return self:GetRoom():RoomRandomFloat( flMin, flMin ) +end + +--------------------------------------------------------------------------- + +function CMapEncounter:RoomRollPercentage( nChance ) + local bOutcome = self:RoomRandomInt( 1, 100 ) <= nChance + return bOutcome +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:OnEliteRankChanged( nEliteDepthBonus ) + + if nEliteDepthBonus > 0 then + self.ClientData[ "hard_room" ] = 1 + else + self.ClientData[ "hard_room" ] = 0 + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:SelectAscensionAbilities( ) + self.AscensionAbilities = {} + self.hDummyAscensionCaster = nil + self.ClientData[ "ascension_abilities" ] = {} + self.ClientData[ "total_difficulty" ] = 0 + + if self:GetRoom():GetType() ~= ROOM_TYPE_ENEMY then + return + end + + local nEliteLevel = self:GetRoom():GetEliteRank() + local nAscensionLevel = nEliteLevel + GameRules.Aghanim:GetAscensionLevel() + self.ClientData[ "total_difficulty" ] = nAscensionLevel + + local nDesiredAbilityCount = EXTRA_ABILITIES_PER_ASCENSION_LEVEL[ nAscensionLevel + 1 ] + if nDesiredAbilityCount == 0 then + return + end + + local vecAbilityOptions = {} + local vecEliteAbilityOptions = {} + for abilityName,hPossibleAbility in pairs( ASCENSION_ABILITIES ) do + if hPossibleAbility.vecBlacklistedEncounters ~= nil then + for i=1,#hPossibleAbility.vecBlacklistedEncounters do + local szBlacklisted = hPossibleAbility.vecBlacklistedEncounters[i] + if szBlacklisted == self.szEncounterName then + --print( "Encounter " .. self.szEncounterName .. " blacklisted " .. abilityName ) + goto continue + end + end + end + + if hPossibleAbility.nRestrictToAct ~= nil then + if hPossibleAbility.nRestrictToAct ~= self:GetRoom():GetAct() then + goto continue + end + + if hPossibleAbility.szRequiredBoss ~= nil and hPossibleAbility.szRequiredBoss ~= GameRules.Aghanim:GetBossUnitForAct( hPossibleAbility.nRestrictToAct ) then + goto continue + end + end + + if hPossibleAbility.nMinAscensionLevel ~= nil and hPossibleAbility.nMinAscensionLevel > nAscensionLevel then + goto continue + end + + if hPossibleAbility.nMaxAscensionLevel ~= nil and hPossibleAbility.nMaxAscensionLevel < nAscensionLevel then + goto continue + end + + if hPossibleAbility.bEliteOnly == true then + table.insert( vecEliteAbilityOptions, abilityName ) + else + table.insert( vecAbilityOptions, abilityName ) + end + ::continue:: + end + + -- Force specific abilities + local nStart = 1 + if ASCENSION_ABILITIES_FORCE_LIST ~= nil then + for i=1,#ASCENSION_ABILITIES_FORCE_LIST do + --print( "Encounter " .. self.szEncounterName .. " added ascension ability " .. ASCENSION_ABILITIES_FORCE_LIST[i] ) + table.insert( self.AscensionAbilities, ASCENSION_ABILITIES_FORCE_LIST[i] ) + self.ClientData[ "ascension_abilities" ][ tostring(i) ] = ASCENSION_ABILITIES_FORCE_LIST[i] + for j=1,#vecAbilityOptions do + if vecAbilityOptions[j] == ASCENSION_ABILITIES_FORCE_LIST[i] then + table.remove( vecAbilityOptions, j ) + break + end + end + for j=1,#vecEliteAbilityOptions do + if vecEliteAbilityOptions[j] == ASCENSION_ABILITIES_FORCE_LIST[i] then + table.remove( vecEliteAbilityOptions, j ) + break + end + end + end + nStart = #ASCENSION_ABILITIES_FORCE_LIST + 1 + end + + -- Pick elite-only abilities + if nEliteLevel > 0 then + + local nDesiredEliteAbilityCount = ELITE_ABILITIES_PER_ASCENSION_LEVEL[ nAscensionLevel + 1 ] + for i=nStart,nDesiredEliteAbilityCount do + if #vecEliteAbilityOptions == 0 then + break + end + + local nPick = self:RoomRandomInt( 1, #vecEliteAbilityOptions ) + print( "Encounter " .. self.szEncounterName .. " added ELITE ascension ability " .. vecEliteAbilityOptions[nPick] ) + table.insert( self.AscensionAbilities, vecEliteAbilityOptions[nPick] ) + self.ClientData[ "ascension_abilities" ][ tostring(i) ] = vecEliteAbilityOptions[nPick] + table.remove( vecEliteAbilityOptions, nPick ) + + nStart = nStart + 1 + end + + end + + -- Pick ascension abilities + for i=nStart,nDesiredAbilityCount do + if #vecAbilityOptions == 0 then + break + end + + local nPick = self:RoomRandomInt( 1, #vecAbilityOptions ) + print( "Encounter " .. self.szEncounterName .. " added ascension ability " .. vecAbilityOptions[nPick] ) + table.insert( self.AscensionAbilities, vecAbilityOptions[nPick] ) + self.ClientData[ "ascension_abilities" ][ tostring(i) ] = vecAbilityOptions[nPick] + table.remove( vecAbilityOptions, nPick ) + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:Precache( context ) + + -- By default, precache all units referenced by spawners + for _, hSpawner in pairs( self:GetSpawners() ) do + hSpawner:Precache( context ) + end + + for _, hPortalSpawner in pairs( self:GetPortalSpawners() ) do + hPortalSpawner:Precache( context ) + end + + for _, hPortalSpawner in pairs( self.PortalSpawnersV2 ) do + hPortalSpawner:Precache( context ) + end + + -- Precache preview units for exit directions + for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do + local szExitRoomName = self:GetRoom():GetExit( nExitDirection ) + if szExitRoomName ~= nil then + local hExitRoom = GameRules.Aghanim:GetRoom( szExitRoomName ) + if hExitRoom ~= nil and hExitRoom:GetEncounter():GetPreviewUnit() ~= nil then + PrecacheUnitByNameSync( hExitRoom:GetEncounter():GetPreviewUnit(), context, -1 ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:OnEncounterLoaded() + --print( "CMapEncounter:OnEncounterLoaded " .. self.szEncounterName ) + + -- Some NPCs require retreat points + self.RetreatPoints = self:GetRoom():FindAllEntitiesInRoomByName( "retreat_point" ) + + -- All spawners can now look for their spawn info targets + for _, hSpawner in pairs( self:GetSpawners() ) do + hSpawner:OnEncounterLoaded( self ) + end + + -- find all potential portal locations and then assign them out to the portal spawners + local PortalLocations = {} + for _, hPortalSpawner in pairs ( self:GetPortalSpawners() ) do + local name = hPortalSpawner:GetLocatorName() + if PortalLocations[name] == nil then + PortalLocations[name] = {} + PortalLocations[name] = self:GetRoom():FindAllEntitiesInRoomByName( name ) + ShuffleListInPlace( PortalLocations[name] ) + --print( "Collected " .. #PortalLocations[name] .. " portal locations for name " .. name ) + end + end + + -- assign each portal spawner a unique spawn location + for _, hPortalSpawner in pairs ( self:GetPortalSpawners() ) do + local name = hPortalSpawner:GetLocatorName() + if #PortalLocations[name] <= 0 then + print( "ERROR: Can't find a unique portal location for portal spawner named " .. name ) + break + end + + local portalLocation = PortalLocations[name][1] + --print( "Grabbing portal named " .. name .. ". Location is " .. portalLocation:GetOrigin().x .. ", " .. portalLocation:GetOrigin().y .. ", " .. portalLocation:GetOrigin().z ) + table.remove( PortalLocations[name], 1 ) + + hPortalSpawner:SetLocation( portalLocation:GetOrigin() ) + hPortalSpawner:OnEncounterLoaded( self ) + end + + for _, hPortalSpawner in pairs ( self.PortalSpawnersV2 ) do + hPortalSpawner:OnEncounterLoaded( self ) + end + + -- We can also look for a boss preview entity + self:SpawnBossPreviewEntity() + + self:InitializeObjectives() +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter:InitializeObjectives() + if self.hRoom:GetType() == ROOM_TYPE_ENEMY then + self:AddEncounterObjective( "defeat_all_enemies", 0, 0 ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:Introduce() + GameRules.Aghanim:GetAnnouncer():OnEncounterSelected( self ) + CustomGameEventManager:Send_ServerToAllClients( "introduce_encounter", self.ClientData ) + self:UpdateClient() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:AddEncounterObjective( szKey, nValue, nGoal ) + local Objective = {} + Objective[ "name" ] = szKey + Objective[ "value" ] = nValue + Objective[ "goal" ] = nGoal + Objective[ "order" ] = self.nObjectiveNumber + self.nObjectiveNumber = self.nObjectiveNumber + 1 + + self.ClientData[ "objectives" ][ szKey ] = Objective + self:UpdateClient() +end + +-------------------------------------------------------------------------------- +-- nGoal can be purposely nil to skip changing the goal +-------------------------------------------------------------------------------- +function CMapEncounter:UpdateEncounterObjective( szKey, nValue, nGoal ) + if self.ClientData[ "objectives" ][ szKey ] == nil then + return + end + + self.ClientData[ "objectives" ][ szKey ][ "value" ] = nValue + if nGoal ~= nil then + self.ClientData[ "objectives" ][ szKey ][ "goal" ] = nGoal + end + self:UpdateClient() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetEncounterObjectiveProgress( szKey ) + if self.ClientData[ "objectives" ][ szKey ] == nil then + return -1 + end + + return self.ClientData[ "objectives" ][ szKey ][ "value" ] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetEncounterObjectiveGoal( szKey ) + if self.ClientData[ "objectives" ][ szKey ] == nil then + return -1 + end + + return self.ClientData[ "objectives" ][ szKey ][ "goal" ] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:UpdateClient() + CustomNetTables:SetTableValue( "encounter_state", "depth", { tostring( self.hRoom:GetDepth() ) } ) + CustomNetTables:SetTableValue( "encounter_state", tostring( self.hRoom:GetDepth() ), self.ClientData ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:SpawnBossPreviewEntity() + + local hBossPreviewEntity = self:GetRoom():FindAllEntitiesInRoomByName( "encounter_boss_preview_locator", false ) + if #hBossPreviewEntity == 0 then + return + end + + local nAct = self:GetRoom():GetAct() + --print( "CMapEncounter:SpawnBossPreviewEntity() " .. nAct ) + + -- Find the boss room for the act this encounter is in + local hBossRoom = nil + for _,room in pairs( GameRules.Aghanim:GetRoomList() ) do + + if room:GetType() == ROOM_TYPE_BOSS and room:GetAct() == nAct then + hBossRoom = room + break; + end + end + + if hBossRoom == nil then + return + end + + local strPreviewUnit = hBossRoom:GetEncounter():GetPreviewUnit() + local bossPreviewTable = + { + BossUnit = strPreviewUnit, + BossModelScale = ENCOUNTER_PREVIEW_SCALES[ strPreviewUnit ], + ExtraModelScale = 2, + EncounterType = ROOM_TYPE_BOSS, + } + + if bossPreviewTable.BossModelScale == nil then + bossPreviewTable.BossModelScale = 1.0 + end + + for i=1,#hBossPreviewEntity do + local vOrigin = hBossPreviewEntity[i]:GetAbsOrigin() + local vAngles = hBossPreviewEntity[i]:GetAnglesAsVector() + bossPreviewTable.origin = tostring( vOrigin.x ) .. " " .. tostring( vOrigin.y ) .. " " .. tostring( vOrigin.z ) + bossPreviewTable.angles = tostring( vAngles.x ) .. " " .. tostring( vAngles.y ) .. " " .. tostring( vAngles.z ) + + SpawnEntityFromTableAsynchronous( "dota_aghsfort_boss_preview", bossPreviewTable, nil, nil ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:IsComplete() + if self.flStartTime == -1 then + return false + end + + return self.bCompleted +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:CheckForCompletion() + if not self:HasRemainingEnemies() and self:AreScheduledSpawnsComplete() and not self:HasAnyPortals() then + return true + end + return false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:ShouldAutoStartGlobalAscensionAbilities() + return true +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetAscensionAbilities() + return self.AscensionAbilities +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:StartGlobalAscensionAbilities() + + -- Protect against double calls + if self.hDummyAscensionCaster ~= nil then + return + end + + if #self.AscensionAbilities > 0 then + + local vOrigin = self:GetRoom():GetOrigin() + local dummyTable = + { + targetname = "ascension_global_caster", + MapUnitName = "npc_dota_dummy_caster", + teamnumber = DOTA_TEAM_BADGUYS, + } + self.hDummyAscensionCaster = CreateUnitFromTable( dummyTable, vOrigin ) + if self.hDummyAscensionCaster ~= nil then + self:AddAscensionAbilities( self.hDummyAscensionCaster ) + end + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:Start() + print( string.format( "Encounter %s starting..\n", self.szEncounterName ) ) + for nPlayerID=0,AGHANIM_PLAYERS-1 do + PlayerResource:SetCustomIntParam( nPlayerID, self.hRoom:GetDepth() - 1 ) + end + + for i=0,GameRules:NumDroppedItems()-1 do + local hDroppedItem = GameRules:GetDroppedItem( i ) + if hDroppedItem then + local hContainedItem = hDroppedItem:GetContainedItem() + if hContainedItem and hContainedItem:IsNeutralDrop() then + PlayerResource:AddNeutralItemToStash( 0, DOTA_TEAM_GOODGUYS, hContainedItem ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/items2_fx/neutralitem_teleport.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, hDroppedItem:GetAbsOrigin() ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "NeutralItem.TeleportToStash", hDroppedItem ) + + UTIL_Remove( hDroppedItem ) + end + end + end + + local nEntityKilledGameEvent = ListenToGameEvent( "entity_killed", Dynamic_Wrap( getclass( self ), "OnEntityKilled" ), self ) + table.insert( self.EventListeners, nEntityKilledGameEvent ) + + local nTriggerStartTouchEvent = ListenToGameEvent( "trigger_start_touch", Dynamic_Wrap( getclass( self ), "OnTriggerStartTouch" ), self ) + table.insert( self.EventListeners, nTriggerStartTouchEvent ) + + local nTriggerEndTouchEvent = ListenToGameEvent( "trigger_end_touch", Dynamic_Wrap( getclass( self ), "OnTriggerEndTouch" ), self ) + table.insert( self.EventListeners, nTriggerEndTouchEvent ) + + GameRules.Aghanim:GetAnnouncer():OnEncounterStarted( self ) + + self.nMaxSpawnedUnitCount = 0 + self.nUnitsRemainingForRewardDrops = 0 + if self.bCalculateRewardsFromUnitCount then + self.nMaxSpawnedUnitCount = self:GetMaxSpawnedUnitCount() + self.nUnitsRemainingForRewardDrops = self.nMaxSpawnedUnitCount + if self.nMaxSpawnedUnitCount == 0 then + print( "*** WARNING : Encounter " .. self.szEncounterName .. " indicates 0 units to be spawned.. Check your GetMaxSpawnedUnitCount()" ) + end + end + + self.flStartTime = GameRules:GetGameTime() + + if self:IsWaitingToSpawnPortals() == false then + for _,PortalSpawner in pairs ( self.PortalSpawners ) do + PortalSpawner:Start( self.flStartTime ) + end + end + + if self.flEnrageTimer then + CustomNetTables:SetTableValue( "room_data", "enrage_timer", { active=true, startTime=self.flStartTime, enrageTimer=self.flEnrageTimer } ) + else + CustomNetTables:SetTableValue( "room_data", "enrage_timer", { active=false } ) + end + + self:SpawnChests() + self:SpawnBreakableContainers() + self:SpawnExplosiveBarrels() + + CustomNetTables:SetTableValue( "room_data", "status", { complete=false } ) + + if self:ShouldAutoStartGlobalAscensionAbilities() == true then + self:StartGlobalAscensionAbilities() + end + + if self.hRoom:GetType() == ROOM_TYPE_ENEMY then + self.nNumItemsToDrop = GameRules.Aghanim:RollRandomNeutralItemDrops( self ) + self.nNumBPToDrop = self:RoomRandomInt( 0, 2 ) + end + + if self.hRoom:GetType() == ROOM_TYPE_ENEMY or self.hRoom:GetType() == ROOM_TYPE_TRAPS then + self.nNumFragmentsToDrop = GameRules.Aghanim:RollRandomFragmentDrops() + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:SpawnChests() + printf( "-----------------------------------" ) + --printf( "CMapEncounter:SpawnChests()" ) + + --PrintTable( TreasureChestData, " " ) + + for i, chestData in ipairs( TreasureChestData ) do + --print( "" ) + --print( "Looking at chestData #" .. i ) + if ( chestData.szSpawnerName == nil ) then + printf( "ERROR -- CMapEncounter:SpawnChests(): No szSpawnerName specified for this chest." ) + end + + local fSpawnChance = chestData.fSpawnChance + if fSpawnChance == nil or fSpawnChance <= 0 then + printf( "ERROR -- CMapEncounter:SpawnChests: Treasure chest spawn chance is not valid." ) + end + + if chestData.nMaxSpawnDistance == nil or chestData.nMaxSpawnDistance < 0 then + printf( "WARNING -- CMapEncounter:SpawnChests: nMaxSpawnDistance is not valid. Defaulting to 0." ) + chestData.nMaxSpawnDistance = 0 + end + + local nChestsSpawned = 0 + + -- printf( "CMapEncounter:SpawnChests - chestData.szSpawnerName == %s", chestData.szSpawnerName ) + local hSpawners = self:GetRoom():FindAllEntitiesInRoomByName( chestData.szSpawnerName, false ) + for _, hSpawner in pairs( hSpawners ) do + printf( "Iterating over hSpawners" ) + if nChestsSpawned < self.nChestsToSpawn then + local vSpawnLoc = hSpawner:GetOrigin() + RandomVector( RandomFloat( 0, chestData.nMaxSpawnDistance ) ) + + local fThreshold = 1 - fSpawnChance + local bSpawnChest = self:RoomRandomFloat( 0, 1 ) >= fThreshold + + -- Force chest spawns if we'd run out of spawners otherwise + local nSpawnersRemaining = #hSpawners - i + local nChestsNeeded = self.nChestsToSpawn - nChestsSpawned + if nSpawnersRemaining <= nChestsNeeded then + --printf( " %d spawners remaining and still need to spawn %d chests, so force the rest of the spawners to spawn chests", nSpawnersRemaining, nChestsNeeded ) + bSpawnChest = true + end + + if bSpawnChest then + local hUnit = CreateUnitByName( chestData.szNPCName, vSpawnLoc, true, nil, nil, DOTA_TEAM_GOODGUYS ) + if hUnit ~= nil then + local vSpawnerForward = hSpawner:GetForwardVector() + hUnit:SetForwardVector( vSpawnerForward ) + + -- print( "CMapEncounter:SpawnChests - Created chest unit named " .. hUnit:GetUnitName() ) + hUnit.fNeutralItemChance = chestData.fNeutralItemChance + hUnit.nMinNeutralItems = chestData.nMinNeutralItems + hUnit.nMaxNeutralItems = chestData.nMaxNeutralItems + hUnit.fItemChance = chestData.fItemChance + hUnit.nMinItems = chestData.nMinItems + hUnit.nMaxItems = chestData.nMaxItems + hUnit.Items = chestData.Items + hUnit.fTrapChance = chestData.fTrapChance + hUnit.nTrapLevel = chestData.nTrapLevel + hUnit.szTraps = chestData.szTraps + else + printf( "ERROR -- CMapEncounter:SpawnChests: Failed to spawn chest named \"%s\"", chestData.szNPCName ) + end + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:SpawnBreakableContainers() + --print( "-----------------------------------" ) + --print( "CMapEncounter:SpawnBreakableContainers()" ) + --PrintTable( BreakablesData, " " ) + + for i, breakableData in ipairs( BreakablesData ) do + --print( "" ) + --print( "Looking at breakableData #" .. i ) + if ( breakableData.szSpawnerName == nil ) then + printf( "CMapEncounter:SpawnBreakableContainers() - ERROR: No szSpawnerName specified for this breakable container." ) + return + end + + local fSpawnChance = breakableData.fSpawnChance + if fSpawnChance == nil or fSpawnChance <= 0 then + printf( "CMapEncounter:SpawnBreakableContainers - ERROR: Breakable container spawn chance is not valid" ) + return + end + + if breakableData.nMaxSpawnDistance == nil or breakableData.nMaxSpawnDistance < 0 then + printf( "CMapEncounter:SpawnBreakableContainers - ERROR: nMaxSpawnDistance is not valid." ) + return + end + + local nCratesSpawned = 0 + + --printf( "This room wants to spawn %d crates", self.nCratesToSpawn ) + + if ( breakableData.szSpawnerName ~= nil ) then + --print( "breakableData.szSpawnerName == " .. breakableData.szSpawnerName ) + local hSpawners = self:GetRoom():FindAllEntitiesInRoomByName( breakableData.szSpawnerName, false ) + for i, hSpawner in pairs( hSpawners ) do + if nCratesSpawned < self.nCratesToSpawn then + local vSpawnLoc = hSpawner:GetOrigin() + RandomVector( RandomFloat( 0, breakableData.nMaxSpawnDistance ) ) + + local fThreshold = 1 - fSpawnChance + local bSpawnBreakable = self:RoomRandomFloat( 0, 1 ) >= fThreshold + + -- Force crate spawns if we'd run out of spawners otherwise + local nSpawnersRemaining = #hSpawners - i + local nCratesNeeded = self.nCratesToSpawn - nCratesSpawned + if nSpawnersRemaining <= nCratesNeeded then + --printf( " %d spawners remaining and still need to spawn %d crates, so force the rest of the spawners to spawn crates", nSpawnersRemaining, nCratesNeeded ) + bSpawnBreakable = true + end + + if bSpawnBreakable then + + local vAngles = VectorAngles( RandomVector( 1 ) ) + local breakableTable = + { + MapUnitName = breakableData.szNPCName, + origin = tostring( vSpawnLoc.x ) .. " " .. tostring( vSpawnLoc.y ) .. " " .. tostring( vSpawnLoc.z ), + angles = tostring( vAngles.x ) .. " " .. tostring( vAngles.y ) .. " " .. tostring( vAngles.z ), + teamnumber = DOTA_TEAM_BADGUYS, + NeverMoveToClearSpace = false, + } + local hUnit = CreateUnitFromTable( breakableTable, vSpawnLoc ) + if hUnit ~= nil then + --print( "Created breakable container unit named " .. hUnit:GetUnitName() ) + hUnit.CommonItems = breakableData.CommonItems + hUnit.fCommonItemChance = breakableData.fCommonItemChance + hUnit.MonsterUnits = breakableData.MonsterUnits + hUnit.fMonsterChance = breakableData.fMonsterChance + hUnit.RareItems = breakableData.RareItems + hUnit.fRareItemChance = breakableData.fRareItemChance + hUnit.nMinGold = breakableData.nMinGold + hUnit.nMaxGold = breakableData.nMaxGold + hUnit.fGoldChance = breakableData.fGoldChance + hUnit:AddNewModifier( hUnit, nil, "modifier_breakable_container", {} ) + + table.insert( self.SpawnedBreakables, hUnit ) + + nCratesSpawned = nCratesSpawned + 1 + --printf( " Spawned %d crates", nCratesSpawned ) + end + end + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:SpawnExplosiveBarrels() + --printf( "-----------------------------------" ) + --printf( "CMapEncounter:SpawnExplosive()" ) + --PrintTable( ExplosiveBarrelData, " " ) + + for i, barrelData in ipairs( ExplosiveBarrelData ) do + --printf( "Looking at barrelData #", i ) + if ( barrelData.szSpawnerName == nil ) then + printf( "CMapEncounter:SpawnExplosiveBarrels() - ERROR: No szSpawnerName specified for this explosive barrel." ) + return + end + + local fSpawnChance = barrelData.fSpawnChance + if fSpawnChance == nil or fSpawnChance <= 0 then + printf( "CMapEncounter:SpawnExplosiveBarrels() - ERROR: Explosive barrel spawn chance is not valid" ) + return + end + + if barrelData.nMaxSpawnDistance == nil or barrelData.nMaxSpawnDistance < 0 then + printf( "CMapEncounter:SpawnExplosiveBarrels() - ERROR: nMaxSpawnDistance is not valid." ) + return + end + + local nExplosiveBarrelsSpawned = 0 + + --printf( "This room wants to spawn %d explosive barrels", self.nExplosiveBarrelsToSpawn ) + + if ( barrelData.szSpawnerName ~= nil ) then + --print( "barrelData.szSpawnerName == " .. barrelData.szSpawnerName ) + local hSpawners = self:GetRoom():FindAllEntitiesInRoomByName( barrelData.szSpawnerName, false ) + for i, hSpawner in pairs( hSpawners ) do + if nExplosiveBarrelsSpawned < self.nExplosiveBarrelsToSpawn then + local vSpawnLoc = hSpawner:GetOrigin() + RandomVector( RandomFloat( 0, barrelData.nMaxSpawnDistance ) ) + + local fThreshold = 1 - fSpawnChance + local bSpawnBarrel = self:RoomRandomFloat( 0, 1 ) >= fThreshold + + -- Force crate spawns if we'd run out of spawners otherwise + local nSpawnersRemaining = #hSpawners - i + local nBarrelsNeeded = self.nExplosiveBarrelsToSpawn - nExplosiveBarrelsSpawned + if nSpawnersRemaining <= nBarrelsNeeded then + --printf( " %d spawners remaining and still need to spawn %d barrels, so force the rest of the spawners to spawn barrels", nSpawnersRemaining, nBarrelsNeeded ) + bSpawnBarrel = true + end + + if bSpawnBarrel then + + local vAngles = VectorAngles( RandomVector( 1 ) ) + local barrelTable = + { + MapUnitName = barrelData.szNPCName, + origin = tostring( vSpawnLoc.x ) .. " " .. tostring( vSpawnLoc.y ) .. " " .. tostring( vSpawnLoc.z ), + angles = tostring( vAngles.x ) .. " " .. tostring( vAngles.y ) .. " " .. tostring( vAngles.z ), + teamnumber = DOTA_TEAM_BADGUYS, + NeverMoveToClearSpace = false, + } + local hUnit = CreateUnitFromTable( barrelTable, vSpawnLoc ) + if hUnit ~= nil then + -- Set the barrel's level based on the depth we're in. It'll use its level to set its + -- explosion ability level + local hAbility = hUnit:FindAbilityByName( "aghsfort_explosive_barrel" ) + local nDepth = self.hRoom:GetDepth() + --printf( "nDepth == %d", nDepth ) + + for i = 1, nDepth do + hAbility:UpgradeAbility( true ) + end + + --printf( "nDepth: %d; explosive barrel ability level: %d", nDepth, hAbility:GetLevel() ) + + --local vSpawnerForward = hSpawner:GetForwardVector() + --hUnit:SetForwardVector( vSpawnerForward ) + + --printf( "Created explosive barrel unit named \"%s\"", hUnit:GetUnitName() ) + --hUnit:AddNewModifier( hUnit, nil, "modifier_explosive_barrel", {} ) + + table.insert( self.SpawnedExplosiveBarrels, hUnit ) + + nExplosiveBarrelsSpawned = nExplosiveBarrelsSpawned + 1 + --printf( " Spawned %d crates", nExplosiveBarrelsSpawned ) + end + end + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:OnThink() + + --print( 'CMapEncounter:OnThink()' ) + if self.flStartTime ~= -1 and not self.bCompleted then + self:TrySpawningUnits() + self:TrySpawningPortalUnits() + self:TrySpawningPortalUnitsV2() + self:TryCompletingMapEncounter() + end + + if self.flCompletionTime ~= nil and ( GameRules:GetGameTime() - self.flCompletionTime ) > 0.6 then + self:GenerateRewards() + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:NeedsToThink() + return self.bHasGeneratedRewards == false or self.bHasSpawnedEndLevelEntities == false +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:TrySpawningPortalUnits() + --print( "CMapEncounter:TrySpawningPortalUnits" ) + for _,PortalSpawner in pairs ( self.PortalSpawners ) do + PortalSpawner:TrySpawningUnits() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:RunSpawnSchedule( hSpawner ) + + if hSpawner.schedule == nil or hSpawner.schedule.flStartTime < 0 then + return + end + + -- Debug visualization of focus path +-- if hSpawner.schedule.spawnFocusPath ~= nil then +-- local flRelativeTime = GameRules:GetGameTime() - hSpawner.schedule.flStartTime +-- local vSpawnFocus = self:ComputeSpawnFocusPosition( hSpawner.schedule.spawnFocusPath, flRelativeTime ) +-- DebugDrawCircle( vSpawnFocus, Vector( 0, 255, 0 ), 0, hSpawner.schedule.spawnFocusPath.flRadius, false, 1.0 ) +-- end + + -- Try to spawn this wave + for nWave = hSpawner.schedule.nCurrentWaveIndex, #hSpawner.schedule.waveSchedule do + local flRelativeTime = GameRules:GetGameTime() - hSpawner.schedule.flStartTime + if hSpawner.schedule.waveSchedule[nWave].Time > flRelativeTime then + break + end + local nCount = hSpawner.schedule.waveSchedule[nWave].Count + if nCount == nil or nCount <= 0 then + nCount = hSpawner:GetSpawnPositionCount() + end + + -- Used by spawners to force movement around the map + if hSpawner.schedule.spawnFocusPath ~= nil then + local vSpawnFocus = self:ComputeSpawnFocusPosition( hSpawner.schedule.spawnFocusPath, flRelativeTime ) + hSpawner:SetSpawnFocus( vSpawnFocus, hSpawner.schedule.spawnFocusPath.flRadius ) + end + + hSpawner:SpawnUnitsFromRandomSpawners( nCount ) + hSpawner.schedule.nCurrentWaveIndex = hSpawner.schedule.nCurrentWaveIndex + 1 + end + +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter:TrySpawningUnits() + for _,Spawner in pairs ( self.Spawners ) do + self:RunSpawnSchedule( Spawner ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:TrySpawningPortalUnitsV2() + for _,PortalSpawner in pairs ( self.PortalSpawnersV2 ) do + + self:RunSpawnSchedule( PortalSpawner ) + + -- This ticks the logic to see if any previously spawned portals need to spawn their units + PortalSpawner:TrySpawningPortalUnits() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:IsScheduledSpawnComplete( hSpawner ) + if hSpawner.schedule == nil then + return true + end + + if hSpawner.schedule.nCurrentWaveIndex <= #hSpawner.schedule.waveSchedule then + return false + end + + return true +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:AreScheduledSpawnsComplete() + for _,Spawner in pairs ( self.Spawners ) do + if self:IsScheduledSpawnComplete( Spawner ) == false then + return false + end + end + for _,PortalSpawner in pairs ( self.PortalSpawnersV2 ) do + if self:IsScheduledSpawnComplete( PortalSpawner ) == false then + return false + end + end + return true +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:TryCompletingMapEncounter() + --print( 'CMapEncounter:TryCompletingMapEncounter()' ) + local bCompleted = ( self.bDevForceCompleted == true or self:CheckForCompletion() == true ) + if bCompleted and self:GetRoom():AreAllExitRoomsReady() then + self.bCompleted = bCompleted + self.flCompletionTime = GameRules:GetGameTime() + + for i=1,#self.EventListeners do + StopListeningToGameEvent( self.EventListeners[i] ) + self.EventListeners[i] = nil + end + + self:DestroyRemainingSpawnedUnits() + self:ResetHeroState() + self:SpawnEndLevelEntities() + self:OnComplete() + + self.hRoom:OnEncounterCompleted() + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:RegisterSummonForAghanim() + if self.hRoom:GetType() == ROOM_TYPE_ENEMY then + GameRules.Aghanim:RegisterSummonForAghanim( self.hRoom:GetDepth(), self:GetAghanimSummon() ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:OnComplete() + GameRules.Aghanim:GetAnnouncer():OnEncounterComplete( self ) + + self:RegisterSummonForAghanim() + + --CustomNetTables:SetTableValue( "room_data", "status", { complete=true } ) + CustomGameEventManager:Send_ServerToAllClients( "complete_encounter", self.ClientData ) +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:AddSpawner( hSpawner ) + if hSpawner == nil then + print( "ERROR: AddSpawner called with a nil spawner." ) + return + end + + if self.Spawners[hSpawner:GetSpawnerName()] ~= nil then + print ( "WARNING: Multiple identical named spawners ( " .. hSpawner:GetSpawnerName() .. ") added to encounter! ") + return + end + + self.Spawners[hSpawner:GetSpawnerName()] = hSpawner + return hSpawner +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:AddPortalSpawner( hSpawner ) + if hSpawner == nil then + print( "ERROR: AddPortalSpawner called with a nil spawner." ) + return + end + + --print( 'Adding Portal Spawner named ' .. hSpawner:GetSpawnerName() .. '. Looking for locator named ' .. hSpawner:GetLocatorName() ) + + if self.PortalSpawners[hSpawner:GetSpawnerName()] ~= nil then + print ( "ERROR: Multiple identical named spawners ( " .. hSpawner:GetSpawnerName() .. ") added to encounter! ") + return + end + + self.PortalSpawners[hSpawner:GetSpawnerName()] = hSpawner + return hSpawner +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:AddPortalSpawnerV2( hSpawner ) + if hSpawner == nil then + print( "ERROR: AddPortalSpawnerV2 called with a nil spawner." ) + return + end + + if self.PortalSpawnersV2[hSpawner:GetSpawnerName()] ~= nil then + print( "ERROR: Multiple identical named spawners ( " .. hSpawner:GetSpawnerName() .. ") added to encounter! ") + return + end + + self.PortalSpawnersV2[ hSpawner:GetSpawnerName() ] = hSpawner + return hSpawner +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:SetPortalTriggerSpawner( szSpawnerName, flDelay ) + + if szSpawnerName == nil then + print( "WARNING: CMapEncounter:SetPortalTriggerSpawner .. illegal to specify nil" ) + return + end + + if self.Spawners[szSpawnerName] == nil then + print( "WARNING: CMapEncounter:SetPortalTriggerSpawner specified unknown spawner ( " .. szSpawnerName .. ") in encounter " .. self.szEncounterName .. "! ") + return + end + + self.szPortalTriggerSpawner = szSpawnerName + self.flPortalTriggerDelay = flDelay + + for _, hPortalSpawner in pairs( self.PortalSpawnersV2 ) do + if hPortalSpawner.schedule ~= nil then + hPortalSpawner.schedule.bWaitingForTrigger = true + end + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:IsWaitingToSpawnPortals() + return self.szPortalTriggerSpawner ~= nil +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:StartSpawningPortals() + + if self.szPortalTriggerSpawner == nil then + return + end + + self.szPortalTriggerSpawner = nil + + for _, hPortalSpawner in pairs( self.PortalSpawnersV2 ) do + if hPortalSpawner.schedule ~= nil then + if hPortalSpawner.schedule.bWaitingForTrigger == true then + hPortalSpawner.schedule.bWaitingForTrigger = false + hPortalSpawner.schedule.flStartTime = GameRules:GetGameTime() + hPortalSpawner.schedule.flDelay + self.flPortalTriggerDelay + end + end + end + + for _,PortalSpawner in pairs ( self.PortalSpawners ) do + PortalSpawner:Start( GameRules:GetGameTime() + self.flPortalTriggerDelay ) + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:SetSpawnerSchedule( szSpawnerName, waveScheduleInput ) + + if waveScheduleInput == nil then + waveScheduleInput = { { Time = 0 } } -- Not specifying count means spawn at all points + end + + -- Validate the schedule is valid + local nLastTime = 0 + for i=1,#waveScheduleInput do + if nLastTime > waveScheduleInput[i].Time then + print( "ERROR: BeginSpawnerSchedule: Wave schedule ( " .. szSpawnerName .. ") not specified in increasing order of time in encounter " .. self.szEncounterName ) + return + end + nLastTime = waveScheduleInput[i].Time + end + + -- Try to find a spawner in all of the lists to spawn + local bIsPortal = false + local hSpawner = self:GetSpawner( szSpawnerName ) + if hSpawner == nil then + hSpawner = self:GetPortalSpawnerV2( szSpawnerName ) + bIsPortal = true + end + + if hSpawner == nil then + print( "ERROR: BeginSpawnerSchedule: Spawner ( " .. szSpawnerName .. ") isn't found in this encounter " .. self.szEncounterName ) + return + end + + hSpawner.schedule = + { + nCurrentWaveIndex = 1, + waveSchedule = waveScheduleInput, + flStartTime = -1, + bWaitingForTrigger = ( bIsPortal == true ) and self:IsWaitingToSpawnPortals() + } + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:StartAllSpawnerSchedules( flDelay ) + + -- Start everything up + for _, hSpawner in pairs( self:GetSpawners() ) do + if hSpawner.schedule ~= nil then + hSpawner.schedule.flStartTime = GameRules:GetGameTime() + flDelay + end + end + + for _, hPortalSpawner in pairs( self.PortalSpawnersV2 ) do + if hPortalSpawner.schedule ~= nil then + if hPortalSpawner.schedule.bWaitingForTrigger == true then + hPortalSpawner.schedule.flDelay = flDelay + else + hPortalSpawner.schedule.flStartTime = GameRules:GetGameTime() + flDelay + end + end + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:StartSpawnerSchedule( szSpawnerName, flDelay ) + + -- Try to find a spawner in all of the lists to spawn + local bIsPortal = false + local hSpawner = self:GetSpawner( szSpawnerName ) + if hSpawner == nil then + bIsPortal = true + hSpawner = self:GetPortalSpawnerV2( szSpawnerName ) + end + + if hSpawner == nil then + print( "ERROR: StartSpawnerSchedule: Spawner ( " .. szSpawnerName .. ") isn't found in this encounter!" ) + return + end + + if hSpawner.schedule == nil then + print( "ERROR: StartSpawnerSchedule: Spawner ( " .. szSpawnerName .. ") doesn't have a specified schedule!" ) + return + end + + if hSpawner.schedule.bWaitingForTrigger == true then + hSpawner.schedule.flDelay = flDelay + return + end + + hSpawner.schedule.flStartTime = GameRules:GetGameTime() + flDelay + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GenerateSpawnFocusPath( szSpawnerName, flSpeed, flDesiredRadiusInput, flMaxTime ) + + -- For portal spawner V2s, we want to force the player to move through the space. + -- We do this by moving the region where portals are more likely to appear + local hSpawner = self:GetPortalSpawnerV2( szSpawnerName ) + if hSpawner == nil then + print( "ERROR: GenerateSpawnFocusPath: Spawner ( " .. szSpawnerName .. ") isn't found in encounter " .. self.szEncounterName ) + return nil + end + + -- If they didn't specify a max time, but we have a schedule, figure it out automatically + if flMaxTime == nil or flMaxTime <= 0 then + if hSpawner.schedule == nil then + print( "ERROR: GenerateSpawnFocusPath: Didn't specify duration for " .. szSpawnerName .. " in encounter " .. self.szEncounterName ) + return nil + end + flMaxTime = hSpawner.schedule.waveSchedule[ #hSpawner.schedule.waveSchedule ].Time + end + + local spawnFocusPath = + { + flRadius = flDesiredRadiusInput, + vecPathNodes = {} + } + + local flMaxDist = flMaxTime * flSpeed + local flCurrDist = 0 + local flTime = 0 + local vLastPos = nil + while flCurrDist < flMaxDist do + + local vecSpawnPositions = deepcopy( hSpawner:GetSpawnPositions() ) + local nIndex = math.random( 1, #vecSpawnPositions ) + while #vecSpawnPositions > 1 and vLastPos ~= nil and + ( ( vecSpawnPositions[nIndex]:GetAbsOrigin() - vLastPos ):Length2D() < flDesiredRadiusInput ) do + table.remove( vecSpawnPositions, nIndex ) + nIndex = math.random( 1, #vecSpawnPositions ) + end + + local bIdenticalPoint = false + local vNewPos = vecSpawnPositions[nIndex]:GetAbsOrigin() + if vLastPos ~= nil then + local flDist = ( vNewPos - vLastPos ):Length2D() + flCurrDist = flCurrDist + flDist + flTime = flCurrDist / flSpeed + if flDist == 0 then + bIdenticalPoint = true + end + end + vLastPos = vNewPos + if bIdenticalPoint == false then + table.insert( spawnFocusPath.vecPathNodes, { Time = flTime, Position = vNewPos } ) + end + + end + + return spawnFocusPath +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:AssignSpawnFocusPath( szSpawnerName, spawnerFocusPathInput ) + + -- Try to find a spawner in all of the lists to spawn + local hSpawner = self:GetPortalSpawnerV2( szSpawnerName ) + + if hSpawner == nil then + print( "ERROR: AssignSpawnFocusPath: Spawner ( " .. szSpawnerName .. ") isn't found in this encounter!" ) + return + end + + if hSpawner.schedule == nil then + print( "ERROR: StartSpawnerSchedule: Spawner ( " .. szSpawnerName .. ") doesn't have a specified schedule!" ) + return + end + + hSpawner.schedule.spawnFocusPath = spawnerFocusPathInput + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:ComputeSpawnFocusPosition( spawnFocusPath, flTime ) + + for i=1,#spawnFocusPath.vecPathNodes do + if flTime < spawnFocusPath.vecPathNodes[i].Time then + if i == 1 then + return spawnFocusPath.vecPathNodes[i].Position + end + + -- Lerp + local prev = spawnFocusPath.vecPathNodes[i-1] + local next = spawnFocusPath.vecPathNodes[i] + local t = ( flTime - prev.Time ) / ( next.Time - prev.Time ) + local vDelta = next.Position - prev.Position + local v = Vector( prev.Position.x + vDelta.x * t, prev.Position.y + vDelta.y * t, prev.Position.z + vDelta.z * t ) + return v + end + end + + return spawnFocusPath.vecPathNodes[#spawnFocusPath.vecPathNodes].Position +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:ComputeUnitsSpawnedBySchedule( hSpawner ) + + if hSpawner.schedule == nil then + return 0 + end + + local nCount = 0 + + local nUnitsPerPortal = hSpawner:GetSpawnCountPerSpawnPosition() + local nSpawnPositionCount = hSpawner:GetSpawnPositionCount() + + for j=1,#hSpawner.schedule.waveSchedule do + local wave = hSpawner.schedule.waveSchedule[j] + local nWaveCount = wave.Count + if nWaveCount == nil or nWaveCount <= 0 then + nWaveCount = nSpawnPositionCount + end + nCount = nCount + nWaveCount * nUnitsPerPortal + end + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetMaxSpawnedUnitCount() + + local nCount = 0 + + for _,Spawner in pairs ( self.Spawners ) do + nCount = nCount + self:ComputeUnitsSpawnedBySchedule( Spawner ) + end + + for _,PortalSpawner in pairs ( self.PortalSpawnersV2 ) do + nCount = nCount + self:ComputeUnitsSpawnedBySchedule( PortalSpawner ) + end + + for _,PortalSpawner in pairs ( self.PortalSpawners ) do + for _,rgUnitInfo in pairs ( PortalSpawner.rgUnitsInfo ) do + nCount = nCount + ( rgUnitInfo.Count * PortalSpawner:GetNumSpawnsRemaining() ) + end + end + + return nCount +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:MustKillForEncounterCompletion( hEnemyCreature ) + return true +end + +--------------------------------------------------------- + +function CMapEncounter:SuppressRewardsOnDeath( hEnemyCreature ) + hEnemyCreature.bSuppressRewardsOnDeath = true +end + +--------------------------------------------------------- + +function CMapEncounter:AddAscensionAbilities( hEnemyCreature ) + + if hEnemyCreature:IsBuilding() == true then + return + end + + if hEnemyCreature:GetUnitName() == "npc_dota_explosive_barrel" then + return + end + + local nAbilityLevel = self:GetRoom():GetEliteRank() + GameRules.Aghanim:GetAscensionLevel() + + local bIsGlobal = IsGlobalAscensionCaster( hEnemyCreature ) + + -- Ascension abilities make creatures harder. + -- ability_ascension is always granted and just deals with generic attributes like damage + -- The other abilities are more flavorful and specific and may be randomly selected + -- We must level it up once since all other abilities already were levelled on spawn + -- For the stats + if bIsGlobal == false then + local hAbility = hEnemyCreature:AddAbility( "ability_ascension" ) + hAbility:UpgradeAbility( true ) + + -- Bosses do not use ascension modifiers, but do want general ascension scaling for their minions. + if self.hRoom:GetType() == ROOM_TYPE_BOSS then + if nAbilityLevel > 0 then + hEnemyCreature:CreatureLevelUp( nAbilityLevel ) + end + return + end + end + + for i=1,#self.AscensionAbilities do + + local abilityInfo = ASCENSION_ABILITIES[ self.AscensionAbilities[i] ] + local nAbilityType = abilityInfo.nType + if nAbilityType == nil then + nAbilityType = ASCENSION_ABILITY_CAPTAINS_ONLY + end + + local bRequiresGlobal = ( nAbilityType == ASCENSION_ABILITY_GLOBAL ) + if bIsGlobal ~= bRequiresGlobal then + goto continue + end + + local bIsCaptain = hEnemyCreature:IsConsideredHero() or hEnemyCreature:IsBoss() + + if nAbilityType == ASCENSION_ABILITY_CAPTAINS_ONLY and bIsCaptain == false then + goto continue + elseif nAbilityType == ASCENSION_ABILITY_NON_CAPTAINS_ONLY and bIsCaptain == true then + goto continue + end + + --print( "Ascension adding ability " .. self.AscensionAbilities[i] .. " to unit " .. hEnemyCreature:GetUnitName() ) + hAbility = hEnemyCreature:AddAbility( self.AscensionAbilities[i] ) + hAbility:UpgradeAbility( true ) + + -- This is the glue that causes these abilities to autocast, but passive abilities don't need to do this + if IsServer() and bitand( hAbility:GetBehavior(), DOTA_ABILITY_BEHAVIOR_PASSIVE ) == 0 then + + -- This makes the global abilities not just autostart + if bIsGlobal then + hAbility:StartCooldown( -1 ) + end + + local kv = + { + cast_behavior = abilityInfo.nCastBehavior, + target_type = abilityInfo.nTargetType, + health_percent = abilityInfo.flHealthPercent, + range = abilityInfo.nRange, + } + + if kv.cast_behavior == nil then + kv.cast_behavior = ASCENSION_CAST_WHEN_COOLDOWN_READY + end + if kv.target_type == nil then + kv.target_type = ASCENSION_TARGET_NO_TARGET + end + if kv.health_percent == nil then + kv.health_percent = 25 + end + + hEnemyCreature:AddNewModifier( hEnemyCreature, hAbility, "modifier_passive_autocast", kv ) + end + + ::continue:: + end + + if nAbilityLevel > 0 then + hEnemyCreature:CreatureLevelUp( nAbilityLevel ) + end +end + +--------------------------------------------------------- + +function CMapEncounter:OnEnemyCreatureSpawned( hEnemyCreature ) + + if hEnemyCreature.Encounter ~= nil then + return + end + + -- Remove normal last hit gold / xp + hEnemyCreature:SetMinimumGoldBounty( 0 ) + hEnemyCreature:SetMaximumGoldBounty( 0 ) + hEnemyCreature:SetDeathXP( 0 ) + + -- Filter out creatures that aren't really creatures + if hEnemyCreature:GetUnitName() == "npc_dota_explosive_barrel" then + self:SuppressRewardsOnDeath( hEnemyCreature ) + return + end + + hEnemyCreature.Encounter = self + + local bIsDummy = hEnemyCreature:GetUnitName() == "npc_dota_dummy_caster" + if not bIsDummy then + if hEnemyCreature:GetUnitName() ~= "npc_dota_creature_bonus_chicken" and hEnemyCreature:GetUnitName() ~= "npc_dota_creature_bonus_greevil" then + hEnemyCreature:AddNewModifier( hEnemyCreature, nil, "modifier_monster_leash", {} ) + end + self:AddAscensionAbilities( hEnemyCreature ) + end + + local bIsGlobal = IsGlobalAscensionCaster( hEnemyCreature ) + if not bIsGlobal and self:MustKillForEncounterCompletion( hEnemyCreature ) == true then + table.insert( self.SpawnedEnemies, hEnemyCreature ) + else + table.insert( self.SpawnedSecondaryEnemies, hEnemyCreature ) + self:SuppressRewardsOnDeath( hEnemyCreature ) + end + + if hEnemyCreature:IsConsideredHero() then + hEnemyCreature:AddNewModifier( hEnemyCreature, nil, "modifier_ability_cast_warning", kv ) + end +end + +--------------------------------------------------------- +-- spawner_finished +-- * spawner_name +--------------------------------------------------------- +function CMapEncounter:OnSpawnerFinished( hSpawner, hSpawnedUnits ) + + -- NOTE: This is called *after* OnEnemyCreatureSpawned, and will be called + -- On the same units. The difference is that OnEnemyCreatureSpawned is called + -- for secondary summoned units not spawned by the spawner also *and* + -- OnEnemyCreatureSpawned is called prior to OnSpawnerFinished + local bIsPortalTriggerUnit = ( self.szPortalTriggerSpawner ~= nil ) and ( self.szPortalTriggerSpawner == hSpawner:GetSpawnerName() ) + + for _,hSpawnedUnit in pairs ( hSpawnedUnits ) do + if hSpawnedUnit ~= nil then + hSpawnedUnit:SetRequiresReachingEndPath( true ) -- this ensures that our spawned dudes won't shut down while getting to their goal ent + + if bIsPortalTriggerUnit == true then + table.insert( self.SpawnedPortalTriggerUnits, hSpawnedUnit ) + end + end + end +end + +--------------------------------------------------------- + +function CMapEncounter:SetInitialGoalEntityToNearestHero( hSpawnedUnit ) + + local hNearestHero = nil + local flNearestDistance = 1000000 + for nPlayerID = 0, ( DOTA_MAX_TEAM_PLAYERS - 1 ) do + + if PlayerResource:GetTeam( nPlayerID ) == DOTA_TEAM_GOODGUYS then + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero ~= nil and hPlayerHero:IsAlive() then + local flDist = ( hPlayerHero:GetAbsOrigin() - hSpawnedUnit:GetAbsOrigin() ):Length2D() + if flDist < flNearestDistance then + flDist = flNearestDistance + hNearestHero = hPlayerHero + end + end + end + + end + + if hNearestHero ~= nil then + hSpawnedUnit:SetInitialGoalEntity( hNearestHero ) + end + +end + +--------------------------------------------------------- +-- Grants rewards for killing N units +--------------------------------------------------------- +function CMapEncounter:GrantRewardsForKill( hVictim, hAttacker, nUnitCount ) + + -- Distribute using fixed rewards + if hVictim.bSuppressRewardsOnDeath == nil or hVictim.bSuppressRewardsOnDeath == false then + + if self.bCalculateRewardsFromUnitCount and self.nMaxSpawnedUnitCount > 0 then + + if self.nRemainingXPFromEnemies > 0 then + + local nDeathXP = math.floor( nUnitCount * self.nTotalXPFromEnemies / self.nMaxSpawnedUnitCount ) + local nXPPerHero = math.min( self.nRemainingXPFromEnemies, nDeathXP ) + + local Heroes = HeroList:GetAllHeroes() + for _,Hero in pairs ( Heroes ) do + if Hero ~= nil and Hero:IsRealHero() and Hero:GetTeamNumber() == DOTA_TEAM_GOODGUYS then + Hero:AddExperience( nXPPerHero, DOTA_ModifyXP_CreepKill, false, true ) + end + end + self.nRemainingXPFromEnemies = math.max( 0, self.nRemainingXPFromEnemies - nXPPerHero ) + end + + if self.nRemainingGoldFromEnemies > 0 then + + local nMinGoldBounty = math.floor( 0.8 * self.nTotalGoldFromEnemies / self.nMaxSpawnedUnitCount ) + local nMaxGoldBounty = math.ceil( 1.2 * self.nTotalGoldFromEnemies / self.nMaxSpawnedUnitCount ) + local nGoldToDrop = 0 + for i = 1,nUnitCount do + nGoldToDrop = nGoldToDrop + math.random( nMinGoldBounty, nMaxGoldBounty ) + end + nGoldToDrop = math.min( self.nRemainingGoldFromEnemies, nGoldToDrop ) + nGoldToDrop = math.floor( nGoldToDrop * 100 / GOLD_BAG_DROP_PCT ) -- Make it so with the randomness, we get roughly what we expect + if math.random( 1, 100 ) <= GOLD_BAG_DROP_PCT and nGoldToDrop > 0 then + local newItem = CreateItem( "item_bag_of_gold", nil, nil ) + newItem:SetPurchaseTime( 0 ) + newItem:SetCurrentCharges( nGoldToDrop * AGHANIM_PLAYERS ) + local drop = CreateItemOnPositionSync( hVictim:GetAbsOrigin(), newItem ) + local dropTarget = hVictim:GetAbsOrigin() + RandomVector( RandomFloat( 50, 150 ) ) + newItem:LaunchLoot( true, 150, 0.75, dropTarget ) + self.nRemainingGoldFromEnemies = self.nRemainingGoldFromEnemies - nGoldToDrop + end + end + + end + + -- Logic for nUnitsRemainingForRewardDrops makes it more likely + -- that we drop the lives and items the more units we kill + if self.nUnitsRemainingForRewardDrops >= 0 then + self.nUnitsRemainingForRewardDrops = self.nUnitsRemainingForRewardDrops - nUnitCount + self.nUnitsRemainingForRewardDrops = math.max( 0, self.nUnitsRemainingForRewardDrops ) + end + + local nEstimatedUnitCount = self.nUnitsRemainingForRewardDrops + if nEstimatedUnitCount <= 0 then + nEstimatedUnitCount = max( #self.SpawnedEnemies, 1 ) + end + + if self.nNumItemsToDrop > 0 then + local nPct = math.max( 100 / nEstimatedUnitCount, 1 ) + if RollPercentage( nPct ) then + self:DropNeutralItemFromUnit( hVictim, hAttacker, true ) + self.nNumItemsToDrop = self.nNumItemsToDrop - 1 + end + end + + if self.nNumBPToDrop > 0 then + local nPct = math.max( 100 / nEstimatedUnitCount, 1 ) + if RollPercentage( nPct ) then + self:DropCurrencyFromUnit( hVictim, hAttacker, RandomInt( BATTLE_POINT_MIN_DROP_VALUE, BATTLE_POINT_MAX_DROP_VALUE ), true, false ) + self.nNumBPToDrop = self.nNumBPToDrop - 1 + end + end + + if self.nNumFragmentsToDrop > 0 then + local nPct = math.max( 100 / nEstimatedUnitCount, 1 ) + if RollPercentage( nPct ) then + self:DropCurrencyFromUnit( hVictim, hAttacker, self:GetArcaneFragmentDropValue(), false, false ) + self.nNumFragmentsToDrop = self.nNumFragmentsToDrop - 1 + end + end + end + + -- Always drop potions, even if other rewards are suppressed + local nHealthPct = HEALTH_POTION_DROP_PCT + local nManaPct = MANA_POTION_DROP_PCT + if hVictim.bBossMinion ~= nil and hVictim.bBossMinion == true then + nHealthPct = nHealthPct * 2 + nManaPct = nManaPct * 2 + end + if RollPercentage( nHealthPct ) then + local newItem = CreateItem( "item_health_potion", nil, nil ) + newItem:SetPurchaseTime( 0 ) + if newItem:IsPermanent() and newItem:GetShareability() == ITEM_FULLY_SHAREABLE then + item:SetStacksWithOtherOwners( true ) + end + local drop = CreateItemOnPositionSync( hVictim:GetAbsOrigin(), newItem ) + local dropTarget = hVictim:GetAbsOrigin() + RandomVector( RandomFloat( 50, 350 ) ) + newItem:LaunchLoot( true, 300, 0.75, dropTarget ) + end + + if RollPercentage( nManaPct ) then + local newItem = CreateItem( "item_mana_potion", nil, nil ) + newItem:SetPurchaseTime( 0 ) + if newItem:IsPermanent() and newItem:GetShareability() == ITEM_FULLY_SHAREABLE then + item:SetStacksWithOtherOwners( true ) + end + local drop = CreateItemOnPositionSync( hVictim:GetAbsOrigin(), newItem ) + local dropTarget = hVictim:GetAbsOrigin() + RandomVector( RandomFloat( 50, 350 ) ) + newItem:LaunchLoot( true, 300, 0.75, dropTarget ) + end + +end + + +--------------------------------------------------------- +-- entity_killed +-- * entindex_killed +-- * entindex_attacker +-- * entindex_inflictor +-- * damagebits +--------------------------------------------------------- + +function CMapEncounter:OnEntityKilled( event ) + local hVictim = nil + local hAttacker = nil + if event.entindex_killed ~= nil then + hVictim = EntIndexToHScript( event.entindex_killed ) + end + if event.entindex_attacker ~= nil then + hAttacker = EntIndexToHScript( event.entindex_attacker ) + end + + if hVictim == nil then + return + end + + if hVictim:IsReincarnating() then + return + end + + if hVictim:IsCreature() then + + if hAttacker and hAttacker:IsOwnedByAnyPlayer() then + EmitSoundOnClient( "DarkMoonLastHit", hAttacker:GetPlayerOwner() ) + ParticleManager:ReleaseParticleIndex( ParticleManager:CreateParticleForPlayer( "particles/dark_moon/darkmoon_last_hit_effect.vpcf", PATTACH_ABSORIGIN_FOLLOW, hVictim, hAttacker:GetPlayerOwner() ) ) + + GameRules.Aghanim:RegisterPlayerKillStat( hAttacker:GetPlayerOwnerID(), self.hRoom:GetDepth() ) + end + + if hVictim:IsConsideredHero() or hVictim:IsBoss() then + GameRules.Aghanim:GetAnnouncer():OnCreatureKilled( self, hVictim ) + end + + -- Distribute using fixed rewards + self:GrantRewardsForKill( hVictim, hAttacker, 1 ) + + end + + if self.szPortalTriggerSpawner ~= nil then + for k,hSpawnedEnemy in pairs ( self.SpawnedPortalTriggerUnits ) do + if hSpawnedEnemy == hVictim then + table.remove( self.SpawnedPortalTriggerUnits, k ) + end + end + if #self.SpawnedPortalTriggerUnits == 0 then + self:StartSpawningPortals() + end + end + + if hVictim.bSuppressRewardsOnDeath == nil or hVictim.bSuppressRewardsOnDeath == false then + for k,hSpawnedEnemy in pairs ( self.SpawnedEnemies ) do + if hSpawnedEnemy == hVictim then + self.nKilledEnemies = self.nKilledEnemies + 1 + table.remove( self.SpawnedEnemies, k ) + self:OnRequiredEnemyKilled( hAttacker, hVictim ) + --print( "Remaining enemies: " .. #self.SpawnedEnemies ) + end + end + else + for k,hSpawnedSecondaryEnemy in pairs ( self.SpawnedSecondaryEnemies ) do + if hSpawnedSecondaryEnemy == hVictim then + self.nKilledSecondaryEnemies = self.nKilledSecondaryEnemies + 1 + self:OnSecondaryEnemyKilled( hAttacker, hVictim ) + table.remove( self.SpawnedSecondaryEnemies, k ) + --print( "Remaining enemies: " .. #self.SpawnedEnemies ) + end + end + end + + -- TODO +--[[ if hVictim:IsBuilding() then + if hVictim:GetUnitName() == "npc_aghsfort_dark_portal" then + local nPortalsCountBefore = self:GetRemainingPortalCount() + 1 + for k,PortalSpawner in pairs ( self.PortalSpawners ) do + if PortalSpawner.Portal.hPortalEnt == hVictim then + if PortalSpawner.Portal.nWarningFX ~= nil then + ParticleManager:DestroyParticle( PortalSpawner.Portal.nWarningFX, false ) + PortalSpawner.Portal.nWarningFX = nil + end + if PortalSpawner.Portal.nAmbientFX ~= nil then + ParticleManager:DestroyParticle( PortalSpawner.Portal.nAmbientFX, false ) + PortalSpawner.Portal.nAmbientFX = nil + end + + StopSoundOn( "Hero_AbyssalUnderlord.DarkRift.Target", PortalSpawner.Portal.hPortalEnt ) + self.PortalSpawners[ PortalSpawner:GetSpawnerName() ] = nil + --table.remove( self.PortalSpawners, k ) + print( "Dark Portal killed!" ) + + else + if PORTAL_ESCALATION_ENABLED == true then + --local flPreviousInterval = PortalSpawner.Portal.flPortalInterval + --print( "flPreviousInterval: " .. flPreviousInterval ) + + --local flPct = 1 - ( 1 / nPortalsCountBefore ) + --print( "flPct: " .. flPct ) + + PortalSpawner.Portal.flPortalInterval = PortalSpawner.Portal.flPortalInterval - PORTAL_ESCALATION_RATE + print( "Setting new portal interval: " .. PortalSpawner.Portal.flPortalInterval ) + + --local flIntervalDiff = flPreviousInterval - PortalSpawner.Portal.flPortalInterval + PortalSpawner.Portal.flNextSpawnTime = PortalSpawner.Portal.flNextSpawnTime - PORTAL_ESCALATION_RATE + --print( "Speeding up next spawn time by " .. flIntervalDiff ) + end + end + end + end + end +--]] +end + +--------------------------------------------------------- + +function CMapEncounter:OnRequiredEnemyKilled( hAttacker, hVictim ) +end + +--------------------------------------------------------- + +function CMapEncounter:OnSecondaryEnemyKilled( hAttacker, hVictim ) +end + +--------------------------------------------------------- + +function CMapEncounter:OnPortalKilled( hVictim, hAttacker, nUnitCountSuppressed ) + local nCurrentValue = self:GetEncounterObjectiveProgress( "destroy_spawning_portals" ) + if nCurrentValue ~= -1 then + self:UpdateEncounterObjective( "destroy_spawning_portals", nCurrentValue + 1, nil ) + end +end + +--------------------------------------------------------- +-- When portals are killed, determine the XP to drop +--------------------------------------------------------- + +function CMapEncounter:OnPortalV2Killed( hVictim, hAttacker, nUnitCountSuppressed ) + + if hVictim == nil then + return + end + + if nUnitCountSuppressed > 0 then + self:GrantRewardsForKill( hVictim, hAttacker, nUnitCountSuppressed ) + end + +end + +-------------------------------------------------------------------------------- + +-- trigger_start_touch +-- > trigger_name - string +-- > activator_entindex - short +-- > caller_entindex- short + +function CMapEncounter:OnTriggerStartTouch( event ) + + local hUnit = EntIndexToHScript( event.activator_entindex ) + local hTriggerEntity = EntIndexToHScript( event.caller_entindex ) + + -- currently empty + +end + +-------------------------------------------------------------------------------- + +-- trigger_end_touch +-- > trigger_name - string +-- > activator_entindex - short +-- > caller_entindex- short + +function CMapEncounter:OnTriggerEndTouch( event ) + -- currently empty +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:DropNeutralItemFromUnit( hVictim, hAttacker, bAnnounce ) + local hHero = hAttacker + if hHero == nil or hHero:IsNull() or hHero:IsRealHero() == false then + hHero = PlayerResource:GetSelectedHeroEntity( 0 ) + end + + if hHero == nil or hVictim == nil then + print( "ERROR, trying to drop neutral item without a valid hero and victim" ) + return + end + + local szItemDrop = GameRules.Aghanim:PrepareNeutralItemDrop( self.hRoom, false ) + if szItemDrop == nil then + return + end + + DropNeutralItemAtPositionForHero( szItemDrop, hVictim:GetAbsOrigin(), hHero, -1, true ) + -- local newItem = CreateItem( szItemDrop, nil, nil ) + -- newItem:SetPurchaseTime( 0 ) + + -- local drop = CreateItemOnPositionSync( hVictim:GetAbsOrigin(), newItem ) + -- local dropTarget = hVictim:GetAbsOrigin() + RandomVector( RandomFloat( 50, 150 ) ) + -- newItem:LaunchLoot( false, 150, 0.75, dropTarget ) + + + -- if bAnnounce then + -- AddFOWViewer( DOTA_TEAM_GOODGUYS, dropTarget, 300.0, 10.0, false ) + -- MinimapEvent( DOTA_TEAM_GOODGUYS, hVictim, dropTarget.x, dropTarget.y, DOTA_MINIMAP_EVENT_HINT_LOCATION, 10.0 ) + -- EmitSoundOn( "NeutralLootDrop.TierComplete", hVictim ) + -- if hAttacker and hAttacker:IsOwnedByAnyPlayer() then + -- local gameEvent = {} + -- gameEvent["player_id"] = hAttacker:GetPlayerID() + -- gameEvent["teamnumber"] = DOTA_TEAM_GOODGUYS + -- gameEvent["locstring_value"] = "#DOTA_Tooltip_Ability_" .. szItemDrop + -- gameEvent["message"] = "#Aghanim_FoundItem" + -- FireGameEvent( "dota_combat_event_message", gameEvent ) + -- else + -- local gameEvent = {} + -- gameEvent["player_id"] = 0 --fixme + -- gameEvent["teamnumber"] = DOTA_TEAM_GOODGUYS + -- gameEvent["locstring_value"] = "#DOTA_Tooltip_Ability_" .. szItemDrop + -- gameEvent["message"] = "#Aghanim_FoundItem" + -- FireGameEvent( "dota_combat_event_message", gameEvent ) + -- end + -- end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:DropLifeRuneFromUnit( hVictim, hAttacker, bAnnounce ) + local newItem = CreateItem( "item_life_rune", nil, nil ) + newItem:SetPurchaseTime( 0 ) + newItem:SetCurrentCharges( 1 ) + local drop = CreateItemOnPositionSync( hVictim:GetAbsOrigin(), newItem ) + local dropTarget = hVictim:GetAbsOrigin() + RandomVector( RandomFloat( 125, 175 ) ) + newItem:LaunchLoot( false, 150, 0.75, dropTarget ) + + if bAnnounce then + AddFOWViewer( DOTA_TEAM_GOODGUYS, dropTarget, 300.0, 10.0, false ) + MinimapEvent( DOTA_TEAM_GOODGUYS, hVictim, dropTarget.x, dropTarget.y, DOTA_MINIMAP_EVENT_HINT_LOCATION, 10.0 ) + EmitSoundOn( "Rune.Bounty", hVictim ) + if hAttacker and hAttacker:IsOwnedByAnyPlayer() then + + local gameEvent = {} + gameEvent["player_id"] = hAttacker:GetPlayerID() + gameEvent["teamnumber"] = DOTA_TEAM_GOODGUYS + gameEvent["locstring_value"] = "#DOTA_Tooltip_Ability_item_life_rune" + gameEvent["message"] = "#Aghanim_FoundLifeRune" + FireGameEvent( "dota_combat_event_message", gameEvent ) + + else + + local gameEvent = {} + gameEvent["player_id"] = 0 + gameEvent["teamnumber"] = DOTA_TEAM_GOODGUYS + gameEvent["locstring_value"] = "#DOTA_Tooltip_Ability_item_life_rune" + gameEvent["message"] = "#Aghanim_FoundLifeRune" + FireGameEvent( "dota_combat_event_message", gameEvent ) + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:DropCurrencyFromUnit( hVictim, hAttacker, nPoints, bBattlePoints, bAnnounce ) + + -- Suppress drop if everyone has maxed out + if GameRules.Aghanim:CanPlayersAcceptCurrency( bBattlePoints ) == false then + return + end + + local newItem = nil + if bBattlePoints == true then + newItem = CreateItem( "item_battle_points", nil, nil ) + else + newItem = CreateItem( "item_arcane_fragments", nil, nil ) + end + + newItem:SetPurchaseTime( 0 ) + newItem:SetCurrentCharges( nPoints ) + local drop = CreateItemOnPositionSync( hVictim:GetAbsOrigin(), newItem ) + if bBattlePoints == true then + drop:SetMaterialGroup( "ti10" ) + else + drop:SetMaterialGroup( "arcane_fragment" ) + end + local dropTarget = hVictim:GetAbsOrigin() + RandomVector( RandomFloat( 50, 150 ) ) + newItem:LaunchLoot( true, 150, 0.75, dropTarget ) + + -- if bAnnounce then + -- AddFOWViewer( DOTA_TEAM_GOODGUYS, dropTarget, 300.0, 10.0, false ) + -- MinimapEvent( DOTA_TEAM_GOODGUYS, hVictim, dropTarget.x, dropTarget.y, DOTA_MINIMAP_EVENT_HINT_LOCATION, 10.0 ) + -- EmitSoundOn( "Rune.Bounty", hVictim ) + -- if hAttacker and hAttacker:IsOwnedByAnyPlayer() then + + -- local gameEvent = {} + -- gameEvent["player_id"] = hAttacker:GetPlayerID() + -- gameEvent["teamnumber"] = DOTA_TEAM_GOODGUYS + -- gameEvent["locstring_value"] = "#DOTA_Tooltip_Ability_item_life_rune" + -- gameEvent["message"] = "#Aghanim_FoundLifeRune" + -- FireGameEvent( "dota_combat_event_message", gameEvent ) + + -- else + + -- local gameEvent = {} + -- gameEvent["player_id"] = 0 + -- gameEvent["teamnumber"] = DOTA_TEAM_GOODGUYS + -- gameEvent["locstring_value"] = "#DOTA_Tooltip_Ability_item_life_rune" + -- gameEvent["message"] = "#Aghanim_FoundLifeRune" + -- FireGameEvent( "dota_combat_event_message", gameEvent ) + -- end + -- end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:DropItemFromRoomRewardContainer( hContainer, szItemName, bAnnounce ) + for szNeutralItem,v in pairs ( PRICED_ITEM_REWARD_LIST ) do + if szNeutralItem == szItemName then + DropNeutralItemAtPositionForHero( szItemName, hContainer:GetAbsOrigin() + RandomVector( RandomFloat( 50, 150 ) ), PlayerResource:GetSelectedHeroEntity( 0 ), -1, true ) + return + end + end + + local newItem = CreateItem( szItemName, nil, nil ) + newItem:SetPurchaseTime( 0 ) + + local drop = CreateItemOnPositionSync( hContainer:GetAbsOrigin(), newItem ) + local dropTarget = hContainer:GetAbsOrigin() + RandomVector( RandomFloat( 50, 150 ) ) + newItem:LaunchLoot( false, 150, 0.75, dropTarget ) + + if bAnnounce then + AddFOWViewer( DOTA_TEAM_GOODGUYS, dropTarget, 300.0, 10.0, false ) + MinimapEvent( DOTA_TEAM_GOODGUYS, hContainer, dropTarget.x, dropTarget.y, DOTA_MINIMAP_EVENT_HINT_LOCATION, 10.0 ) + EmitSoundOn( "NeutralLootDrop.TierComplete", hContainer ) + + local gameEvent = {} + gameEvent["player_id"] = 0 --fixme + gameEvent["teamnumber"] = DOTA_TEAM_GOODGUYS + gameEvent["locstring_value"] = "#DOTA_Tooltip_Ability_" .. szItemDrop + gameEvent["message"] = "#Aghanim_FoundConsumableItem" + FireGameEvent( "dota_combat_event_message", gameEvent ) + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:DestroyRemainingSpawnedUnits() + + for k, hSpawner in pairs( self.Spawners ) do + self.Spawners[k] = nil + end + + for k, hPortalSpawner in pairs ( self.PortalSpawners ) do + hPortalSpawner:DestroyPortal( true ) + self.PortalSpawners[k] = nil + end + + for k,hSpawnedEnemy in pairs ( self.SpawnedEnemies ) do + UTIL_Remove( hSpawnedEnemy ) + self.SpawnedEnemies[k] = nil + end + + for k,hSpawnedEnemy in pairs ( self.SpawnedSecondaryEnemies ) do + UTIL_Remove( hSpawnedEnemy ) + self.SpawnedSecondaryEnemies[k] = nil + end + + for k, hBreakable in pairs ( self.SpawnedBreakables ) do + UTIL_Remove( hBreakable ) + self.SpawnedBreakables[ k ] = nil + end + + for k, hExplosiveBarrel in pairs ( self.SpawnedExplosiveBarrels ) do + UTIL_Remove( hExplosiveBarrel ) + self.SpawnedExplosiveBarrels[ k ] = nil + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:FindEncounterEndLocator() + + local hExitLocatorList = self:GetRoom():FindAllEntitiesInRoomByName( "encounter_end_locator", false ) + if #hExitLocatorList == 0 then + return nil + end + + return hExitLocatorList[1] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:SpawnEndLevelEntities() + + self.bHasSpawnedEndLevelEntities = true + + local vExitTemplate = Entities:FindByName( nil, "encounter_end_template" ) + if vExitTemplate == nil then + print( "Unable to find encounter_end_template\n" ) + return + end + + local hExitLocator = self:FindEncounterEndLocator() + if hExitLocator == nil then + return + end + + local vExitLocation = hExitLocator:GetAbsOrigin() + local vSpawnLocation = Vector( vExitLocation.x, vExitLocation.y, GetGroundHeight( vExitLocation, nil ) ) + vExitTemplate:SetAbsOrigin( vSpawnLocation ) + vExitTemplate:ForceSpawn() + + --meh + local nDepth = self.hRoom:GetDepth() + + for _,hTemplateEnt in pairs ( vExitTemplate:GetSpawnedEntities() ) do + if hTemplateEnt:GetName() == "room_reward_spawn" then + self.vRoomRewardCratePos = hTemplateEnt:GetAbsOrigin() + end + if nDepth == 6 or nDepth == 11 or nDepth == 13 or nDepth == 17 then + if hTemplateEnt:GetName() == "shop" or hTemplateEnt:GetName() == "shop_trigger" or hTemplateEnt:GetName() == "shop_obstruction" or hTemplateEnt:GetName() == "shop_particles" or hTemplateEnt:GetName() == "neutral_stash" then + UTIL_Remove( hTemplateEnt ) + end + end + end + + if self.hRoom:HasCrystal() then + local hCrystal = CreateUnitByName( "npc_dota_story_crystal", self.vRoomRewardCratePos + Vector( 0, 350, 0 ), true, nil, nil, DOTA_TEAM_GOODGUYS ) + if hCrystal ~= nil then + print( "spawned story crystal" ) + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:ResetHeroState() + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + if HEAL_ON_ENCOUNTER_COMPLETE then + if not hPlayerHero:IsAlive() then + local vLocation = hPlayerHero:GetOrigin() + if self.hRoom:GetType() == ROOM_TYPE_TRAPS then + local hExitLocator = self:FindEncounterEndLocator() + if hExitLocator == nil then + return + else + vLocation = hExitLocator:GetAbsOrigin() + end + end + + hPlayerHero:RespawnHero( false, false ) + FindClearSpaceForUnit( hPlayerHero, vLocation, true ) + CenterCameraOnUnit( nPlayerID, hPlayerHero ) + end + + -- PositiveBuffs, NegativeBuffs, FrameOnly, RemoveStuns, RemoveExceptions + hPlayerHero:Purge( false, true, false, true, false ) + --结束奖励 + -- make the players invulnerable for a few seconds after winning - just generally protecting them from stuff that might be lingering in the room + hPlayerHero:AddNewModifier( hPlayerHero, nil, "modifier_invulnerable", { duration = 5 } ) + + hPlayerHero:SetHealth( hPlayerHero:GetMaxHealth() ) + hPlayerHero:SetMana( hPlayerHero:GetMaxMana() ) + end + + for i = 0,DOTA_MAX_ABILITIES-1 do + local hAbility = hPlayerHero:GetAbilityByIndex( i ) + if hAbility and hAbility:IsRefreshable() then + hAbility:SetFrozenCooldown( false ) + hAbility:EndCooldown() + hAbility:RefreshCharges() + end + end + + --for j = 0,DOTA_ITEM_INVENTORY_SIZE-1 do + local j = DOTA_ITEM_TP_SCROLL + local hItem = hPlayerHero:GetItemInSlot( j ) + if hItem then + if hItem:GetAbilityName() == "item_bottle" then + local nMaxCharges = hItem:GetSpecialValueFor( "max_charges" ) + --print( "filling bottle: current charges = " .. hItem:GetCurrentCharges() .. ". Max Charges = " .. nMaxCharges .. ". Restoring up to " .. AGHANIM_ENCOUNTER_BOTTLE_CHARGES ) + hItem:SetCurrentCharges( math.min( hItem:GetCurrentCharges() + AGHANIM_ENCOUNTER_BOTTLE_CHARGES, nMaxCharges ) ) + elseif hItem:IsRefreshable() then + hItem:SetFrozenCooldown( false ) + hItem:EndCooldown() + end + end + --end + + local hNeutralItem = hPlayerHero:GetItemInSlot( DOTA_ITEM_NEUTRAL_SLOT ) + if hNeutralItem and hNeutralItem:IsRefreshable() then + hNeutralItem:SetFrozenCooldown( false ) + hNeutralItem:EndCooldown() + end + + local nFXIndex = ParticleManager:CreateParticle( "particles/items2_fx/refresher.vpcf", PATTACH_CUSTOMORIGIN, hPlayerHero ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, hPlayerHero, PATTACH_POINT_FOLLOW, "attach_hitloc", hPlayerHero:GetAbsOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + end + end +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:AddRewardItemsToCrate( hRewardCrate, bDebug ) + + local bHardRoom = ( self.hRoom:GetEliteRank() > 0 ) + if self.hRoom:GetRoomChoiceReward() == "REWARD_TYPE_EXTRA_LIVES" then + if bDebug == true then + return + end + + local nNumLives = 2 + if bHardRoom then + nNumLives = 4 + end + for i=1,nNumLives do + table.insert( hRewardCrate.RoomReward, "item_life_rune" ) + end + end + + if self.hRoom:GetRoomChoiceReward() == "REWARD_TYPE_GOLD" then + if bDebug == true then + -- Can't do this here since it'll drop at the final depth value + return + end + for i=1,AGHANIM_PLAYERS do + table.insert( hRewardCrate.RoomReward, "item_bag_of_gold" ) + end + end + + if self.hRoom:GetRoomChoiceReward() == "REWARD_TYPE_TREASURE" then + local nTier = 1 + if bHardRoom then + nTier = 2 + end + + table.insert( hRewardCrate.RoomReward, "item_tome_of_greater_knowledge" ) + + for nItem=1,nTier do + local szItemName = GameRules.Aghanim:PrepareNeutralItemDrop( self.hRoom, bHardRoom ) + if szItemName ~= nil then + table.insert( hRewardCrate.RoomReward, szItemName ) + end + end + + local vecItems = TREASURE_REWARDS[ nTier ] + for i = 1, NUM_CONSUMABLES_FROM_ROOM_REWARD do + table.insert( hRewardCrate.RoomReward, vecItems[ self:RoomRandomInt( 1, #vecItems ) ] ) + end + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:CreateRewardCrate() + + if self.hRoom:GetRoomChoiceReward() == nil or self.nGoldReward == 0 then + return + end + + local hDebugRoom = GameRules.Aghanim:GetTestEncounterDebugRoom() + if hDebugRoom ~= nil then + self:AddRewardItemsToCrate( GameRules.Aghanim.debugItemsToStuffInCrate, true ) + end + + local hRewardCrate = CreateUnitByName( "npc_treasure_chest", self.vRoomRewardCratePos, true, nil, nil, DOTA_TEAM_GOODGUYS ) + if hRewardCrate == nil then + return + end + + hRewardCrate:SetAbsAngles( 0, 270, 0 ) + hRewardCrate.CommonItems = {} + hRewardCrate.fCommonItemChance = 0.0 + hRewardCrate.RareItems = {} + hRewardCrate.fRareItemChance = {} + hRewardCrate.nMinGold = 0 + hRewardCrate.nMaxGold = 0 + hRewardCrate.fGoldChance = 0 + if bHardRoom then + hRewardCrate:SetModelScale( 4.0 ) + else + hRewardCrate:SetModelScale( 2.0 ) + end + hRewardCrate.Encounter = self + hRewardCrate.RoomReward = {} + hRewardCrate.nDepth = self.hRoom:GetDepth() + hRewardCrate.nEliteRank = self.hRoom:GetEliteRank() + self:AddRewardItemsToCrate( hRewardCrate, false ) + + if self.hRoom:GetType() == ROOM_TYPE_ENEMY then + local nNumItemsToDrop = self.nNumItemsToDrop + if ( nNumItemsToDrop == 0 ) and GameRules.Aghanim:GetTestEncounterDebugRoom() ~= nil then + nNumItemsToDrop = GameRules.Aghanim:RollRandomNeutralItemDrops() + end + + if nNumItemsToDrop > 0 then + for i=1,nNumItemsToDrop do + local szItemName = GameRules.Aghanim:PrepareNeutralItemDrop( self.hRoom, false ) + if szItemName ~= nil then + print( "adding " .. szItemName .. " to reward crate" ) + table.insert( hRewardCrate.RoomReward, szItemName ) + end + end + end + + -- Spawn any un-dropped BPs + if self.nNumBPToDrop > 0 then + for i=1,self.nNumBPToDrop do + self:DropCurrencyFromUnit( hRewardCrate, hRewardCrate, RandomInt( BATTLE_POINT_MIN_DROP_VALUE, BATTLE_POINT_MAX_DROP_VALUE ), true, false ) + end + end + end + + if self.hRoom:GetType() == ROOM_TYPE_ENEMY or self.hRoom:GetType() == ROOM_TYPE_TRAPS then + -- Spawn any un-dropped Arcance Fragments + if self.nNumFragmentsToDrop > 0 then + print( "WARNING! Number of random Arcane Fragment Drops is not 0 at the end of the round! Dropping at exit locator. This is ok for TRAP ROOMS!" ) + for i=1,self.nNumFragmentsToDrop do + self:DropCurrencyFromUnit( hRewardCrate, hRewardCrate, self:GetArcaneFragmentDropValue(), false, false ) + end + end + end + + -- Stuff items we would have dropped during winning encounters into this crate + if GameRules.Aghanim:GetTestEncounterDebugRoom() == nil and GameRules.Aghanim.debugItemsToStuffInCrate ~= nil then + for i = 1,#GameRules.Aghanim.debugItemsToStuffInCrate.RoomReward do + print( GameRules.Aghanim.debugItemsToStuffInCrate.RoomReward[i] ) + table.insert( hRewardCrate.RoomReward, GameRules.Aghanim.debugItemsToStuffInCrate.RoomReward[i] ) + end + GameRules.Aghanim.debugItemsToStuffInCrate = nil + end + +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetArcaneFragmentDropValue() + local fPoints = ENCOUNTER_DEPTH_ARCANE_FRAGMENTS[ self.hRoom:GetDepth() ] + --print( 'CMapEncounter:GetArcaneFragmentDropValue() - base value: ' .. fPoints ) + + local fDropEV = GameRules.Aghanim:GetFragmentDropEV() + fPoints = fPoints / fDropEV + --print( 'CMapEncounter:GetArcaneFragmentDropValue() - modified by drop EV to ' .. fPoints ) + + local fMultiplier = ARCANE_FRAGMENT_DIFFICULTY_MODIFIERS[ GameRules.Aghanim:GetAscensionLevel() + 1 ] + fPoints = fPoints * fMultiplier + --print( 'CMapEncounter:GetArcaneFragmentDropValue() - modified by Ascension multiplier: ' .. fMultiplier .. '. result is: ' .. fPoints ) + + --print( 'CMapEncounter:GetArcaneFragmentDropValue() - adding variance +/-: ' .. ARCANE_FRAGMENT_DROP_VALUE_VARIANCE ) + + local fLow = fPoints - (fPoints * ARCANE_FRAGMENT_DROP_VALUE_VARIANCE) + local fHigh = fPoints + (fPoints * ARCANE_FRAGMENT_DROP_VALUE_VARIANCE) + --print( 'CMapEncounter:GetArcaneFragmentDropValue() - adding variance between: ' .. fLow .. ' and: ' .. fHigh ) + + fPoints = RandomFloat( fLow, fHigh ) + --print( 'CMapEncounter:GetArcaneFragmentDropValue() - rolled ' .. fPoints ) + + fPoints = math.ceil( fPoints * ARCANE_FRAGMENT_DROP_VALUE ) + --print( 'CMapEncounter:GetArcaneFragmentDropValue() - trimmed down by drop EV: ' .. ARCANE_FRAGMENT_DROP_VALUE .. ' and rounded to: ' .. fPoints ) + + return fPoints +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GenerateRewards() + + if self.bHasGeneratedRewards == true then + return + end + + local bHardRoom = ( self.hRoom:GetEliteRank() > 0 ) or ( self.hRoom:GetType() == ROOM_TYPE_TRAPS ) + + local nBPReward = ENCOUNTER_DEPTH_BATTLE_POINTS[ self.hRoom:GetDepth() ] + nBPReward = nBPReward * BATTLE_POINT_DIFFICULTY_MODIFIERS[ GameRules.Aghanim:GetAscensionLevel() + 1 ] + + local nArcaneFragmentsReward = ENCOUNTER_DEPTH_ARCANE_FRAGMENTS[ self.hRoom:GetDepth() ] + + --print( 'CMapEncounter:GenerateRewards() - base Arcane Fragment reward: ' .. nArcaneFragmentsReward ) + + -- only reward a percentage of the points since the rest is given as drops + if self.hRoom:GetType() == ROOM_TYPE_ENEMY or self.hRoom:GetType() == ROOM_TYPE_TRAPS then + nArcaneFragmentsReward = nArcaneFragmentsReward * ARCANE_FRAGMENT_ROOM_CLEAR_VALUE + --print( 'CMapEncounter:GenerateRewards() - reducing room clear reward to: ' .. nArcaneFragmentsReward ) + end + + -- scale the reward by the difficulty of the run. + local fMultiplier = ARCANE_FRAGMENT_DIFFICULTY_MODIFIERS[ GameRules.Aghanim:GetAscensionLevel() + 1 ] + nArcaneFragmentsReward = nArcaneFragmentsReward * fMultiplier + --print( 'CMapEncounter:GenerateRewards() - Arcane Fragment reward increased by ' .. fMultiplier .. ' for Ascension. new reward: ' .. nArcaneFragmentsReward ) + nArcaneFragmentsReward = math.ceil( nArcaneFragmentsReward ) + --print( 'CMapEncounter:GenerateRewards() - Arcane Fragment reward rounded up to ' .. nArcaneFragmentsReward ) + + local vecBPRewards = {} + if nBPReward > 0 then + vecBPRewards = GameRules.Aghanim:GrantAllPlayersPoints( nBPReward, true, "completing " .. self.szEncounterName .. " at depth " .. tostring( self.hRoom:GetDepth() ) ) + end + + local vecArcaneFragmentRewards = {} + if nArcaneFragmentsReward > 0 then + vecArcaneFragmentRewards = GameRules.Aghanim:GrantAllPlayersPoints( nArcaneFragmentsReward, false, "completing " .. self.szEncounterName .. " at depth " .. tostring( self.hRoom:GetDepth() ) ) + end + + self:CreateRewardCrate() + + local RewardOptions = {} + CustomNetTables:SetTableValue( "reward_options", "current_depth", { tostring(self.hRoom:GetDepth()) } ) + + -- certain abilities (like auras) we want to prevent being rolled more than once by the party as a whole + local vecAbilityNamesToExclude = {} + + local nXPReward = self.nXPReward + self.nRemainingXPFromEnemies + local nGoldReward = self.nGoldReward + self.nRemainingGoldFromEnemies + + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + hPlayerHero:AddExperience( nXPReward, DOTA_ModifyXP_Unspecified, false, true ) + PlayerResource:ModifyGold( nPlayerID, nGoldReward, true, DOTA_ModifyGold_Unspecified ) + end + + for _,szAbilityName in pairs( GetPlayerAbilitiesAndItems( nPlayerID ) ) do + if string.match( szAbilityName, "aghsfort_aura" ) or string.match( szAbilityName, "aghsfort_tempbuff" ) then + table.insert( vecAbilityNamesToExclude, szAbilityName ) + end + end + end + + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local vecPlayerRewards = GetRoomRewards( self.hRoom:GetDepth(), self.hRoom:GetType(), bHardRoom, nPlayerID, vecAbilityNamesToExclude ) + RewardOptions[ tostring(nPlayerID) ] = vecPlayerRewards; + --print( "CMapEncounter:GenerateRewards - Sending rewards to player id " .. nPlayerID .. " for encounter " .. self.szEncounterName ) + --DeepPrintTable( vecPlayerRewards ) + end + + + -- figure out the overall rarity of the rewards for the main block of the reward panel + local szRarity = "common" + if bHardRoom then + szRarity = "elite" + end + if self.hRoom:GetType() == ROOM_TYPE_BOSS or self.hRoom:GetDepth() == 1 then + szRarity = "epic" + end + + if TableLength(RewardOptions) > 0 then + RewardOptions[ "battle_points" ] = vecBPRewards + RewardOptions[ "arcane_fragments" ] = vecArcaneFragmentRewards + RewardOptions[ "xp" ] = nXPReward + RewardOptions[ "gold" ] = nGoldReward + RewardOptions[ "rarity" ] = szRarity + + --printf("sending reward options") + --DeepPrintTable( RewardOptions ) + CustomNetTables:SetTableValue( "reward_options", tostring(self.hRoom:GetDepth()), RewardOptions ) + end + + self.bHasGeneratedRewards = true +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:HasStarted() + return self.flStartTime ~= -1 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetStartTime() + return self.flStartTime +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetRoom() + return self.hRoom +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetSpawners() + return self.Spawners +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetPortalSpawners() + return self.PortalSpawners +end + + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetRemainingPortalCount() + + local nPortals = 0 + + if self.PortalSpawners ~= nil then + for _,hPortalSpawner in pairs ( self.PortalSpawners ) do + if hPortalSpawner and hPortalSpawner:IsDestroyed() == false then + nPortals = nPortals + 1 + end + end + end + + if self.PortalSpawnersV2 ~= nil then + for _,hPortalSpawner in pairs ( self.PortalSpawnersV2 ) do + if hPortalSpawner ~= nil then + nPortals = nPortals + hPortalSpawner:GetPortalUnitCount() + end + end + end + + return nPortals +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:HasAnyPortals() + return self:GetRemainingPortalCount() > 0 +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetSpawner( szSpawnerName ) + return self.Spawners[szSpawnerName] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetPortalSpawner( szSpawnerName ) + return self.PortalSpawners[szSpawnerName] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetPortalSpawnerV2( szSpawnerName ) + return self.PortalSpawnersV2[szSpawnerName] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetDepth() + return self.hRoom:GetDepth() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetTotalGoldRewardPerPlayer() + return ENCOUNTER_DEPTH_GOLD_REWARD[self:GetDepth()] +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetTotalXPRewardPerPlayer() + return ENCOUNTER_DEPTH_XP_REWARD[self:GetDepth()] +end + +-------------------------------------------------------------------------------- +-- If this is true, the gold and XP rewards from killing an enemy will be +-- distrubuted evenly amongst the total enemy count. If false, use the +-- values from the unit data. +-------------------------------------------------------------------------------- + +function CMapEncounter:SetCalculateRewardsFromUnitCount( bCalculate ) + self.bCalculateRewardsFromUnitCount = bCalculate +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetPreviewUnit() + return nil +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetName() + return self.szEncounterName +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetRetreatPoints() + return self.RetreatPoints +end + +---------------------------------------------------------------------- + +function CMapEncounter:HasRemainingEnemies() + return #self.SpawnedEnemies > 0 +end + +---------------------------------------------------------------------- + +function CMapEncounter:GetSpawnedUnits() + return self.SpawnedEnemies +end + +--------------------------------------------------------- + +function CMapEncounter:GetSpawnedSecondaryUnits() + return self.SpawnedSecondaryEnemies +end + +--------------------------------------------------------- + +function CMapEncounter:GetSpawnedUnitsOfType( szUnitName ) + + local hUnits = {} + + for i=1,#self.SpawnedEnemies do + + if self.SpawnedEnemies[i] ~= nil and self.SpawnedEnemies[i]:GetUnitName() == szUnitName then + table.insert( hUnits, self.SpawnedEnemies[i] ) + end + + end + + return hUnits +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:Dev_ForceCompleteEncounter() + self.bDevForceCompleted = true +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:GetAghanimSummon() + return self:GetPreviewUnit() +end + +-------------------------------------------------------------------------------- + +function CMapEncounter:SetupBristlebackShop( bRepopulateNeutralItems ) + if bRepopulateNeutralItems then + local vecPricedItems1 = GetPricedNeutralItems( self.hRoom:GetDepth() - 1, false ) + local vecPricedItems2 = GetPricedNeutralItems( self.hRoom:GetDepth() - 2, false ) + + for _,szLessItem in pairs ( vecPricedItems1 ) do + local bFound = false + for _,szThisDepthItem in pairs ( vecPricedItems2 ) do + if szThisDepthItem == szLessItem then + bFound = true + break + end + end + + if not bFound then + table.insert( vecPricedItems2, szLessItem ) + end + end + + local vecFilteredItems = GameRules.Aghanim:FilterPreviouslyDroppedItems( vecPricedItems1 ) + + for nItem = #GameRules.Aghanim.BristlebackItems,1,-1 do + local szPreviousItemName = GameRules.Aghanim.BristlebackItems[ nItem ] + GameRules:GetGameModeEntity():RemoveItemFromCustomShop( szPreviousItemName, "boss_shop" ) + end + + for i=1,8 do + local index = self:RoomRandomInt( 1, #vecFilteredItems ) + local szItemName = vecFilteredItems[ index ] + GameRules:GetGameModeEntity():AddItemToCustomShop( szItemName, "boss_shop", "2" ) + table.remove( vecFilteredItems, index ) + + table.insert( GameRules.Aghanim.BristlebackItems, szItemName ) + GameRules.Aghanim:MarkNeutralItemAsDropped( szItemName ) + end + end + + GameRules:IncreaseItemStock( DOTA_TEAM_GOODGUYS, "item_life_rune", AGHANIM_PLAYERS, -1 ) + GameRules:IncreaseItemStock( DOTA_TEAM_GOODGUYS, "item_book_of_strength", AGHANIM_PLAYERS, -1 ) + GameRules:IncreaseItemStock( DOTA_TEAM_GOODGUYS, "item_book_of_agility", AGHANIM_PLAYERS, -1 ) + GameRules:IncreaseItemStock( DOTA_TEAM_GOODGUYS, "item_book_of_intelligence", AGHANIM_PLAYERS, -1 ) + + local hBristleEnts = self:GetRoom():FindAllEntitiesInRoomByName( "boss_shop" ) + for _,hEnt in pairs ( hBristleEnts ) do + if hEnt:GetClassname() == "ent_dota_shop" then + local szWearables = + { + "models/heroes/bristleback/bristleback_back.vmdl", + "models/heroes/bristleback/bristleback_bracer.vmdl", + "models/heroes/bristleback/bristleback_head.vmdl", + "models/heroes/bristleback/bristleback_necklace.vmdl", + } + + for _,szWearable in pairs ( szWearables ) do + local hWearable = Entities:CreateByClassname( "wearable_item" ) + if hWearable ~= nil then + hWearable:SetModel( szWearable ) + hWearable:SetTeam( DOTA_TEAM_GOODGUYS ) + hWearable:SetOwner( hEnt ) + hWearable:FollowEntity( hEnt, true ) + end + end + end + end +end + +return CMapEncounter diff --git a/aghanim_singleplayer/scripts/vscripts/map_room.lua b/aghanim_singleplayer/scripts/vscripts/map_room.lua new file mode 100755 index 0000000..4926f13 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/map_room.lua @@ -0,0 +1,847 @@ +require( "spawner" ) + +-------------------------------------------------------------------------------- + +if CMapRoom == nil then + CMapRoom = class({}) + _G.CMapRoom = CMapRoom +end + +-------------------------------------------------------------------------------- + +function CMapRoom:constructor( szRoomName, nRoomType, nDepth, vMins, vMaxs, vOrigin ) + self.szRoomName = szRoomName + self.nRoomType = nRoomType + self.nDepth = nDepth + self.nEliteDepthBonus = 0 + self.vMins = vMins + self.vMaxs = vMaxs + self.vOrigin = vOrigin + self.nAct = tonumber( string.sub( szRoomName, 2, 2 ) ) + self.bHidden = false; + self.PlayerUnitsInRoom = {} + self.szEncounterName = nil + self.Encounter = nil + self.exits = {} + self.exitRewards = {} + self.bActivated = false + self.bSpawnGroupReady = false + self.szExitRoomSelected = nil + self.szMapName = "main" + self.szRoomChoiceReward = nil + self.bHasCrystal = false + self.nPlayerChosenExitDirection = ROOM_EXIT_INVALID + self.nPlayerEntranceDirection = ROOM_EXIT_INVALID + + self.hRandomStream = CreateUniformRandomStream( GameRules.Aghanim:GetRandomSeed() + MakeStringToken( szRoomName ) ) + self.bDisplayHiddenAsElite = ( self:RoomRandomInt( 1, 4 ) == 1 ) +end + +-------------------------------------------------------------------------------- + +function CMapRoom:ShouldDisplayHiddenAsElite( ) + return self.bDisplayHiddenAsElite +end + +-------------------------------------------------------------------------------- + +function CMapRoom:AddExit( exitDirection, szRoomName ) + self.exits[ exitDirection ] = szRoomName +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetExit( exitDirection ) + return self.exits[ exitDirection ] +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetExits( ) + return self.exits +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetExitDirectionForRoom( szRoomName ) + for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do + local szExitRoomName = self:GetExit( nExitDirection ) + if szRoomName == szExitRoomName then + return nExitDirection + end + end + return nil +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetExitLocation( exitDirection ) + + local bIsSpecialTransition = ( self.nDepth == 7 ) + if self.nRoomType ~= ROOM_TYPE_BOSS and bIsSpecialTransition == false then + + if exitDirection == ROOM_EXIT_LEFT then + return Vector( self.vMins.x, self.vOrigin.y, self.vOrigin.z ) + elseif exitDirection == ROOM_EXIT_TOP then + return Vector( self.vOrigin.x, self.vMaxs.y, self.vOrigin.z ) + elseif exitDirection == ROOM_EXIT_RIGHT then + return Vector( self.vMaxs.x, self.vOrigin.y, self.vOrigin.z ) + end + + elseif self.nRoomType == ROOM_TYPE_BOSS then + + local nDivisor = 8 + if self.nDepth == 13 then + nDivisor = 16 + end + + if exitDirection == ROOM_EXIT_LEFT then + return Vector( self.vMins.x, self.vMins.y + ( self.vMaxs.y - self.vMins.y ) / nDivisor, self.vOrigin.z ) + elseif exitDirection == ROOM_EXIT_RIGHT then + return Vector( self.vMaxs.x, self.vMins.y + ( self.vMaxs.y - self.vMins.y ) / nDivisor, self.vOrigin.z ) + end + + elseif bIsSpecialTransition == true then + + if exitDirection == ROOM_EXIT_TOP then + if not GameRules.Aghanim:IsMapFlipped() then + return Vector( self.vMins.x + ( self.vMaxs.x - self.vMins.x ) * 7 / 8, self.vMaxs.y, self.vOrigin.z ) + else + return Vector( self.vMins.x + ( self.vMaxs.x - self.vMins.x ) * 1 / 8, self.vMaxs.y, self.vOrigin.z ) + end + end + + end + + return nil +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetNeighboringRoomHeightDifference( nExitDirection ) + + local szExitRoomName = self:GetExit( nExitDirection ) + if szExitRoomName == nil then + return 0 + end + + local exitRoom = GameRules.Aghanim:GetRoom( szExitRoomName ) + if exitRoom == nil then + return 0 + end + + local zeroHeights = + { + up = 0, + left = 0, + right = 0, + down = 0 + } + + local myHeights = MAP_EXIT_HEIGHTS[ self:GetMapName() ] + local theirHeights = MAP_EXIT_HEIGHTS[ exitRoom:GetMapName() ] + if myHeights == nil then + myHeights = zeroHeights + end + if theirHeights == nil then + theirHeights = zeroHeights + end + + if nExitDirection == ROOM_EXIT_LEFT then + return myHeights.left - theirHeights.right + end + if nExitDirection == ROOM_EXIT_TOP then + return myHeights.up - theirHeights.down + end + if nExitDirection == ROOM_EXIT_RIGHT then + return myHeights.right - theirHeights.left + end + return 0 +end + +-------------------------------------------------------------------------------- + +function CMapRoom:SetEliteDepthBonus( nEliteDepthBonus ) + self.nEliteDepthBonus = nEliteDepthBonus + self:GetEncounter():OnEliteRankChanged( nEliteDepthBonus ) + self:SendRoomToClient() +end + +-------------------------------------------------------------------------------- + +function CMapRoom:SetHidden( ) + self.bHidden = true +end + +-------------------------------------------------------------------------------- + +function CMapRoom:IsHidden( ) + return self.bHidden +end + +-------------------------------------------------------------------------------- + +function CMapRoom:AssignEncounter( szEncounterName ) + + -- NOTE: For debugging, it's possible to re-assign a new encounter to an existing room. + -- In that case, clean up any temporary state + self.szMapName = nil + if self.hSpawnGroupHandle ~= nil then + UnloadSpawnGroupByHandle( self.hSpawnGroupHandle ) + self.hSpawnGroupHandle = nil + end + self.bSpawnGroupReady = false + + -- At this point, we're ready to assign the encounter + self.szEncounterName = szEncounterName + + --print( "AssignEncounter: " .. self:GetName() .." -> " .. szEncounterName ) + + local hEncounterClass = require( "encounters/" .. self.szEncounterName ) + if hEncounterClass == nil then + print( "ERROR: Encounter class " .. szEncounterName .. " not found.\n" ) + return + end + + self.Encounter = hEncounterClass( self, self.szEncounterName ) + if self.Encounter == nil then + print( "ERROR: Failed to create Encounter " .. szEncounterName .. "\n" ) + return + end +end + +-------------------------------------------------------------------------------- + +function CMapRoom:FindAllEntitiesInRoomByName( szEntityName, bWarnIfNotFound ) + + local hEntityList = Entities:FindAllByName( szEntityName ) + + for i=#hEntityList, 1, -1 do + if hEntityList[i]:GetSpawnGroupHandle() ~= self:GetSpawnGroupHandle() then + table.remove( hEntityList, i ) + end + end + + if #hEntityList == 0 and bWarnIfNotFound then + print( "Unable to find entity " .. szEntityName .. " for encounter " .. self.szEncounterName .. " map " .. self:GetMapName() ) + end + + return hEntityList + +end + +-------------------------------------------------------------------------------- + +function CMapRoom:OnEncounterLoaded() + -- This is the level stream load finished callback. + + -- We're only calling Find to print an error if none can be found + self:FindAllEntitiesInRoomByName( "room_activate", true ) + + self.Encounter:OnEncounterLoaded() +end + +-------------------------------------------------------------------------------- + +function CMapRoom:IsInRoomBounds( vOrigin ) + if vOrigin.x > self.vMins.x and vOrigin.x < self.vMaxs.x and vOrigin.y > self.vMins.y and vOrigin.y < self.vMaxs.y then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CMapRoom:IsValidSpawnPoint( vOrigin ) + + local flBorder = 384 + if vOrigin.x > ( self.vMins.x + flBorder ) and vOrigin.x < ( self.vMaxs.x - flBorder ) and + vOrigin.y > ( self.vMins.y + flBorder ) and vOrigin.y < ( self.vMaxs.y - flBorder ) then + return true + end + + return false +end + +-------------------------------------------------------------------------------- + +function CMapRoom:ClampPointToRoomBounds( vOrigin, flBorder ) + + if flBorder == nil then + flBorder = 4 + end + + local vClamped = Vector( vOrigin.x, vOrigin.y, vOrigin.z ) + + if vClamped.x < ( self.vMins.x + flBorder ) then + vClamped.x = self.vMins.x + flBorder; + elseif vClamped.x > ( self.vMaxs.x - flBorder ) then + vClamped.x = self.vMaxs.x - flBorder; + end + + if vClamped.y < ( self.vMins.y + flBorder ) then + vClamped.y = ( self.vMins.y + flBorder ) + elseif vClamped.y > ( self.vMaxs.y - flBorder ) then + vClamped.y = ( self.vMaxs.y - flBorder ) + end + + return vClamped +end + +-------------------------------------------------------------------------------- + +function CMapRoom:LoadExitRooms() + for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do + local szExitRoomName = self:GetExit( nExitDirection ) + if szExitRoomName ~= nil then + local ExitRoom = GameRules.Aghanim:GetRoom( szExitRoomName ) + -- NOTE: the hSpawnGroupHandle test is if we respawn an exit room because of development-time testing + if ExitRoom ~= nil and ExitRoom.hSpawnGroupHandle == nil then + local EncounterData = ENCOUNTER_DEFINITIONS[ ExitRoom.szEncounterName ] + if EncounterData ~= nil then + + -- Must set the map name prior to getting the neighboring room height difference + local mapList = EncounterData.szMapNames + if GameRules.Aghanim:IsMapFlipped() and EncounterData.szFlippedMapNames ~= nil then + mapList = EncounterData.szFlippedMapNames + end + local szMapName = mapList[ self:RoomRandomInt( 1, #mapList ) ] + ExitRoom.szMapName = szMapName + + ExitRoom.vOrigin.z = self.vOrigin.z + self:GetNeighboringRoomHeightDifference( nExitDirection ) + print( "Spawning room " .. szExitRoomName .. " with encounter " .. ExitRoom.szEncounterName .. " on map " .. szMapName .. " at ( " .. ExitRoom.vOrigin.x .. ", " .. ExitRoom.vOrigin.y .. ", " .. ExitRoom.vOrigin.z .. " )" ) + ExitRoom.hSpawnGroupHandle = DOTA_SpawnMapAtPosition( szMapName, ExitRoom.vOrigin, + true, Dynamic_Wrap( CMapRoom, "OnRoomReadyToSpawn" ), Dynamic_Wrap( CMapRoom, "OnSpawnRoomComplete" ), ExitRoom ) + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapRoom:OnRoomReadyToSpawn( hSpawnGroupHandle ) + if ( hSpawnGroupHandle == self.hSpawnGroupHandle ) then + --print( "OnRoomReadyToSpawn " .. self:GetName() .. "\n" ) + self.bSpawnGroupReady = true + else + print( "Unexpected OnRoomReadyToSpawn " .. self:GetName() .. " " .. hSpawnGroupHandle .. "->" .. self.hSpawnGroupHandle .. "\n" ) + end +end + +-------------------------------------------------------------------------------- + +function CMapRoom:OpenExit( szExitDir, vSmallExitLocation ) + + -- Open a gap in the force unseen blockers + -- Only W or E exits have the possibility of being small exits + if szExitDir == "W" then + + if vSmallExitLocation == nil then + GameRules.Aghanim:ClearFowBlockers( + Vector( self.vMins.x + 1, self.vMins.y + 1, self.vMins.z ), + Vector( self.vMins.x + 1, self.vMaxs.y - 1, self.vMins.z ) ) + else + GameRules.Aghanim:ClearFowBlockers( + Vector( vSmallExitLocation.x + 1, vSmallExitLocation.y - 256, self.vMins.z ), + Vector( vSmallExitLocation.x + 1, vSmallExitLocation.y + 256, self.vMins.z ) ) + end + + elseif szExitDir == "E" then + + if vSmallExitLocation == nil then + GameRules.Aghanim:ClearFowBlockers( + Vector( self.vMaxs.x - 1, self.vMins.y + 1, self.vMins.z ), + Vector( self.vMaxs.x - 1, self.vMaxs.y - 1, self.vMins.z ) ) + else + GameRules.Aghanim:ClearFowBlockers( + Vector( vSmallExitLocation.x - 1, vSmallExitLocation.y - 256, self.vMins.z ), + Vector( vSmallExitLocation.x - 1, vSmallExitLocation.y + 256, self.vMins.z ) ) + end + + elseif szExitDir == "N" then + GameRules.Aghanim:ClearFowBlockers( + Vector( self.vMins.x + 1, self.vMaxs.y - 1, self.vMins.z ), + Vector( self.vMaxs.x - 1, self.vMaxs.y - 1, self.vMins.z ) ) + elseif szExitDir == "S" then + GameRules.Aghanim:ClearFowBlockers( + Vector( self.vMins.x + 1, self.vMins.y + 1, self.vMins.z ), + Vector( self.vMaxs.x - 1, self.vMins.y + 1, self.vMins.z ) ) + end + + -- NOTE: Do not break in the loop; necessary for double N exits in the main map + local roomUnlockList = self:FindAllEntitiesInRoomByName( "room_unlock_" .. szExitDir, true ) + for i=1, #roomUnlockList do + --print( "Triggering " .. self:GetName() .. " room_unlock_" .. szExitDir .. " on ent " .. roomUnlockList[i]:entindex() .. " h " .. roomUnlockList[i]:GetSpawnGroupHandle() ) + roomUnlockList[i]:Trigger( nil, nil ) + end + +end + +-------------------------------------------------------------------------------- + +function CMapRoom:CreateVisBlockers( ) + + GameRules.Aghanim:AddFowOutlineBlocker( + Vector( self.vMins.x + 1, self.vMins.y + 1, self.vMins.z ), + Vector( self.vMaxs.x - 1, self.vMaxs.y - 1, self.vMaxs.z ) ) + +end + +-------------------------------------------------------------------------------- + +function CMapRoom:SpawnBridges( ) + + for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do + local szExitRoomName = self:GetExit( nExitDirection ) + if szExitRoomName ~= nil then + + local szExitDir = "N" + if nExitDirection == ROOM_EXIT_LEFT then + szExitDir = "W" + elseif nExitDirection == ROOM_EXIT_RIGHT then + szExitDir = "E" + end + + -- NOTE: Do not break in the loop; necessary for double N exits in the main map + local hBridges = self:FindAllEntitiesInRoomByName( "spawn_bridge_" .. szExitDir, true ) + for i=1, #hBridges do + hBridges[i]:ForceSpawn( ) + end + + end + end + +end + +-------------------------------------------------------------------------------- + +function CMapRoom:OnSpawnRoomComplete( hSpawnGroupHandle ) + + if ( hSpawnGroupHandle == self.hSpawnGroupHandle ) then + + --print( "OnSpawnRoomComplete " .. self:GetName() .. "\n" ) + self:OnEncounterLoaded() + + -- Set up vis blockers on the new room + self:CreateVisBlockers() + + -- Clear out the path between the two rooms + for k,room in pairs(GameRules.Aghanim:GetRoomList()) do + + for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do + local szExitRoomName = room:GetExit( nExitDirection ) + if szExitRoomName ~= nil and room ~= self and szExitRoomName == self:GetName() and room:IsActivated() then + local vSmallExitLocation = nil + if room.nRoomType == ROOM_TYPE_BOSS then + vSmallExitLocation = room:GetExitLocation( nExitDirection ) + end + if nExitDirection == ROOM_EXIT_LEFT then + room:OpenExit( "W", vSmallExitLocation ) + self:OpenExit( "E", vSmallExitLocation ) + elseif nExitDirection == ROOM_EXIT_TOP then + room:OpenExit( "N", vSmallExitLocation ) + self:OpenExit( "S", vSmallExitLocation ) + elseif nExitDirection == ROOM_EXIT_RIGHT then + room:OpenExit( "E", vSmallExitLocation ) + self:OpenExit( "W", vSmallExitLocation ) + end + break + end + end + + end + + self:SpawnBridges() + + else + print( "Unexpected OnSpawnRoomComplete " .. self:GetName() .. " " .. hSpawnGroupHandle .. "->" .. self.hSpawnGroupHandle .. "\n" ) + end +end + +-------------------------------------------------------------------------------- + +function CMapRoom:AreAllExitRoomsReady() + for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do + local szExitRoomName = self:GetExit( nExitDirection ) + if szExitRoomName ~= nil then + local ExitRoom = GameRules.Aghanim:GetRoom( szExitRoomName ) + if ExitRoom ~= nil then + local EncounterData = ENCOUNTER_DEFINITIONS[ ExitRoom.szEncounterName ] + if EncounterData ~= nil then + if not ExitRoom:IsMapReady() then + return false + end + end + end + end + end + return true +end + +-------------------------------------------------------------------------------- + +function CMapRoom:ComputeRoomStats( ) + + if self.Encounter == nil then + return nil + end + + local roomStats = + { + szEncounterName = self.Encounter:GetName(), + bIsElite = self:IsElite(), + bIsHidden = self:IsHidden(), + nRoomType = self:GetType(), + szReward = self:GetRoomChoiceReward(), + ascensionAbilities = self.Encounter:GetAscensionAbilities(), + } + + return roomStats + +end + + +-------------------------------------------------------------------------------- + +function CMapRoom:OnNextRoomSelected( szSelectedRoomName ) + + if self.szExitRoomSelected ~= nil then + return + end + + self.szExitRoomSelected = szSelectedRoomName + printf( "OnNextRoomSelected %s\n", szSelectedRoomName ) + + -- Register the room selection + local roomSelectionStats = + { + depth = self:GetDepth() + 1 + } + + for nExitDirection=ROOM_EXIT_LEFT,ROOM_EXIT_RIGHT do + local szExitRoomName = self:GetExit( nExitDirection ) + if szExitRoomName ~= nil then + local ExitRoom = GameRules.Aghanim:GetRoom( szExitRoomName ) + if ExitRoom ~= nil then + if szExitRoomName == szSelectedRoomName then + ManuallyTriggerSpawnGroupCompletion( ExitRoom:GetSpawnGroupHandle() ) + + self.nPlayerChosenExitDirection = nExitDirection + ExitRoom.nPlayerEntranceDirection = GetEntranceDirectionForExitType( nExitDirection ) + + self:SendRoomToClient() + ExitRoom:SendRoomToClient() + + roomSelectionStats.selectedRoom = ExitRoom:ComputeRoomStats() + if ExitRoom.Encounter ~= nil then + ExitRoom.Encounter:Introduce() + end + else + roomSelectionStats.unselectedRoom = ExitRoom:ComputeRoomStats() + UnloadSpawnGroupByHandle( ExitRoom:GetSpawnGroupHandle() ) + end + end + end + end + + GameRules.Aghanim:RegisterEncounterStats( roomSelectionStats ) +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetExitRoomSelected( ) + return self.szExitRoomSelected +end + +-------------------------------------------------------------------------------- + +function CMapRoom:Activate() + if self.bActivated == false then + self.bActivated = true + + self.nTriggerStartTouchListener = ListenToGameEvent( "trigger_start_touch", Dynamic_Wrap( getclass( self ), "OnTriggerStartTouch" ), self ) + self.nTriggerEndTouchListener = ListenToGameEvent( "trigger_end_touch", Dynamic_Wrap( getclass( self ), "OnTriggerEndTouch" ), self ) + + self:LoadExitRooms() + + self.Encounter:Start() + end +end + +-------------------------------------------------------------------------------- + +function CMapRoom:OnEncounterCompleted() + StopListeningToGameEvent( self.nTriggerStartTouchListener ) + StopListeningToGameEvent( self.nTriggerEndTouchListener ) +end + +-------------------------------------------------------------------------------- +-- trigger_start_touch +-- > trigger_name - string +-- > activator_entindex - short +-- > caller_entindex- short + +-------------------------------------------------------------------------------- +function CMapRoom:OnTriggerStartTouch( event ) + --printf( "map_room - OnTriggerStartTouch" ) + + local sTriggerName = nil + if event.trigger_name ~= nil then + sTriggerName = event.trigger_name + end + + local hActivator = nil + if event.activator_entindex ~= nil then + hActivator = EntIndexToHScript( event.activator_entindex ) + end + + local hCaller = nil + if event.caller_entindex ~= nil then + hCaller = EntIndexToHScript( event.caller_entindex ) + end + + if sTriggerName == "room_activate" and hCaller:GetSpawnGroupHandle() == self:GetSpawnGroupHandle() and hActivator ~= nil and hActivator:GetTeamNumber() == DOTA_TEAM_GOODGUYS and hActivator:IsOwnedByAnyPlayer() and not hActivator:IsTempestDouble() then + table.insert( self.PlayerUnitsInRoom, hActivator ) + if hActivator:IsRealHero() then + local hCurrentRoomOfPlayer = GameRules.Aghanim:GetPlayerCurrentRoom( hActivator:GetPlayerOwnerID() ) + if hCurrentRoomOfPlayer ~= self then + GameRules.Aghanim:SetPlayerCurrentRoom( hActivator:GetPlayerOwnerID(), self ) + end + + end + --print( "Player unit " .. hActivator:GetUnitName() .. " just entered room " .. self:GetMapName() .. " (" .. #self.PlayerUnitsInRoom .. " new count)" ) + end +end + +-------------------------------------------------------------------------------- +-- trigger_end_touch +-- > trigger_name - string +-- > activator_entindex - short +-- > caller_entindex- short + +-------------------------------------------------------------------------------- + +function CMapRoom:OnTriggerEndTouch( event ) + local sTriggerName = nil + if event.trigger_name ~= nil then + sTriggerName = event.trigger_name + end + + local hActivator = nil + if event.activator_entindex ~= nil then + hActivator = EntIndexToHScript( event.activator_entindex ) + end + + local hCaller = nil + if event.caller_entindex ~= nil then + hCaller = EntIndexToHScript( event.caller_entindex ) + end + + if sTriggerName == "room_activate" and hCaller:GetSpawnGroupHandle() == self:GetSpawnGroupHandle() and hActivator ~= nil and hActivator:GetTeamNumber() == DOTA_TEAM_GOODGUYS and hActivator:IsOwnedByAnyPlayer() then + for k,hUnit in pairs ( self.PlayerUnitsInRoom ) do + if hUnit and hUnit == hActivator then + table.remove( self.PlayerUnitsInRoom, k ) + --print( "Player unit " .. hActivator:GetUnitName() .. " just left room " .. self:GetMapName() .. " (" .. #self.PlayerUnitsInRoom .. " new count)" ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function CMapRoom:SetRoomChoiceReward( szReward ) + self.szRoomChoiceReward = szReward +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetRoomChoiceReward() + return self.szRoomChoiceReward +end + +-------------------------------------------------------------------------------- + +function CMapRoom:SendRoomToClient() + local netTable = {} + if GameRules.Aghanim:GetCurrentRoom() and self:GetAct() <= GameRules.Aghanim:GetCurrentRoom():GetAct() then + netTable[ "reward" ] = self:GetRoomChoiceReward() + netTable[ "map_name" ] = self:GetMapName() + netTable[ "room_type" ] = self:GetType() + netTable[ "depth" ] = self:GetDepth() + netTable[ "entrance_direction" ] = self:GetPlayerEntranceDirection() + netTable[ "exit_direction" ] = self:GetPlayerChosenExitDirection() + + netTable[ "completed" ] = 0 + if self:GetEncounter():IsComplete() then + netTable[ "completed" ] = 1 + end + + netTable[ "current_room" ] = 0 + if self == GameRules.Aghanim:GetCurrentRoom() then + netTable[ "current_room" ] = 1 + end + + netTable[ "elite" ] = self:GetEliteRank() + else + netTable[ "reward" ] = "REWARD_TYPE_HIDDEN" + netTable[ "map_name" ] = "none" + netTable[ "room_type" ] = ROOM_TYPE_INVALID + netTable[ "entrance_direction" ] = ROOM_EXIT_INVALID + netTable[ "exit_direction" ] = ROOM_EXIT_INVALID + netTable[ "depth" ] = self:GetDepth() + + if self:GetType() == ROOM_TYPE_BOSS or self:GetType() == ROOM_TYPE_BONUS then + netTable[ "room_type" ] = self:GetType() + end + + netTable[ "completed" ] = 0 + netTable[ "current_room" ] = 0 + netTable[ "elite" ] = 0 + end + + CustomNetTables:SetTableValue( "room_data", self:GetName(), netTable ) +end + +-------------------------------------------------------------------------------- + +function CMapRoom:IsInRoom( hUnit ) + for _,hUnitInRoom in pairs ( self.PlayerUnitsInRoom ) do + if hUnitInRoom == hUnit then + return true + end + end + + return false +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetPlayerUnitsInRoom() + return self.PlayerUnitsInRoom +end + +-------------------------------------------------------------------------------- + +function CMapRoom:IsActivated() + if self.PlayerUnitsInRoom == nil or #self.PlayerUnitsInRoom == 0 then + return false + end + return self.bActivated +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetName() + return self.szRoomName +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetType() + return self.nRoomType +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetAct() + return self.nAct +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetDepth() + return self.nDepth +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetEliteRank() + return self.nEliteDepthBonus +end + +-------------------------------------------------------------------------------- + +function CMapRoom:IsElite() + return self.nEliteDepthBonus > 0 +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetOrigin() + return self.vOrigin +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetMins() + return self.vMins +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetMaxs() + return self.vMaxs +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetEncounter() + return self.Encounter +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetEncounterName() + return self.szEncounterName +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetSpawnGroupHandle() + return self.hSpawnGroupHandle +end + +-------------------------------------------------------------------------------- + +function CMapRoom:IsMapReady() + return self.bSpawnGroupReady +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetMapName() + return self.szMapName +end + + +-------------------------------------------------------------------------------- + +function CMapRoom:GetPlayerEntranceDirection() + return self.nPlayerEntranceDirection +end + +-------------------------------------------------------------------------------- + +function CMapRoom:GetPlayerChosenExitDirection() + return self.nPlayerChosenExitDirection +end + +-------------------------------------------------------------------------------- + +function CMapRoom:HasCrystal() + return self.bHasCrystal +end + +-------------------------------------------------------------------------------- + +function CMapRoom:RoomRandomInt( nMinInt, nMaxInt ) + return self.hRandomStream:RandomInt( nMinInt, nMaxInt ) +end + +-------------------------------------------------------------------------------- + +function CMapRoom:RoomRandomFloat( flMin, flMin ) + return self.hRandomStream:RandomFloat( flMin, flMin ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/base_minor_stats_upgrades.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/base_minor_stats_upgrades.lua new file mode 100755 index 0000000..b4aebfa --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/base_minor_stats_upgrades.lua @@ -0,0 +1,114 @@ +local Stats = +{ + { + description = "aghsfort_minor_stat_upgrade_bonus_all_stats", + ability_name = "aghsfort_minor_stats_upgrade", + special_value_name = "bonus_all_stats", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 12, + }, + { + description = "aghsfort_minor_stat_upgrade_bonus_primary_stat", + ability_name = "aghsfort_minor_stats_upgrade", + special_value_name = "bonus_primary_stat", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 18, + }, + -- { + -- description = "aghsfort_minor_stat_upgrade_bonus_movespeed", + -- ability_name = "aghsfort_minor_stats_upgrade", + -- special_value_name = "bonus_movespeed", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 48, + -- }, + -- { + -- description = "aghsfort_minor_stat_upgrade_bonus_hp_regen", + -- ability_name = "aghsfort_minor_stats_upgrade", + -- special_value_name = "bonus_hp_regen", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 6, + -- }, + { + description = "aghsfort_minor_stat_upgrade_bonus_armor", + ability_name = "aghsfort_minor_stats_upgrade", + special_value_name = "bonus_armor", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 12, + }, + { + description = "aghsfort_minor_stat_upgrade_bonus_attack_damage", + ability_name = "aghsfort_minor_stats_upgrade", + special_value_name = "bonus_attack_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 45, + }, + --{ + -- description = "aghsfort_minor_stat_upgrade_bonus_cast_range", + -- ability_name = "aghsfort_minor_stats_upgrade", + -- special_value_name = "bonus_cast_range", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 100, + --}, + { + description = "aghsfort_minor_stat_upgrade_bonus_spell_amp", + ability_name = "aghsfort_minor_stats_upgrade", + special_value_name = "bonus_spell_amp", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 20, + }, + -- { + -- description = "aghsfort_minor_stat_upgrade_bonus_health", + -- ability_name = "aghsfort_minor_stats_upgrade", + -- special_value_name = "bonus_health", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 450, + -- }, + --[[ + { + description = "aghsfort_minor_stat_upgrade_bonus_mana", + ability_name = "aghsfort_minor_stats_upgrade", + special_value_name = "bonus_mana", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 150, + }, + ]] + { + description = "aghsfort_minor_stat_upgrade_bonus_attack_speed", + ability_name = "aghsfort_minor_stats_upgrade", + special_value_name = "bonus_attack_speed", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 45, + }, + -- { + -- description = "aghsfort_minor_stat_upgrade_bonus_mana_regen", + -- ability_name = "aghsfort_minor_stats_upgrade", + -- special_value_name = "bonus_mana_regen", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 6, + -- }, + -- { + -- description = "aghsfort_minor_stat_upgrade_bonus_evasion", + -- ability_name = "aghsfort_minor_stats_upgrade", + -- special_value_name = "bonus_evasion", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 15, + -- }, + -- { + -- description = "aghsfort_minor_stat_upgrade_bonus_magic_resist", + -- ability_name = "aghsfort_minor_stats_upgrade", + -- special_value_name = "bonus_magic_resist", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 20, + -- }, + -- { + -- description = "aghsfort_minor_stat_upgrade_bonus_lifesteal", + -- ability_name = "aghsfort_minor_stats_upgrade", + -- special_value_name = "bonus_lifesteal", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 4, + -- }, + + + +} +return Stats \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_disruptor.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_disruptor.lua new file mode 100755 index 0000000..06f245a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_disruptor.lua @@ -0,0 +1,131 @@ +local Disruptor = +{ + -- { + -- description = "aghsfort_disruptor_thunder_strike_pct_mana_cost", + -- ability_name = "aghsfort_disruptor_thunder_strike", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_disruptor_thunder_strike_pct_cooldown", + ability_name = "aghsfort_disruptor_thunder_strike", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + -- { + -- description = "aghsfort_disruptor_thunder_strike_flat_radius", + -- ability_name = "aghsfort_disruptor_thunder_strike", + -- special_value_name = "radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 120, + -- }, + + { + description = "aghsfort_disruptor_thunder_strike_flat_strikes", + ability_name = "aghsfort_disruptor_thunder_strike", + special_value_name = "strikes", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 4, + }, + + { + description = "aghsfort_disruptor_thunder_strike_flat_strike_damage", + ability_name = "aghsfort_disruptor_thunder_strike", + special_value_name = "strike_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 100, + }, + + -- { + -- description = "aghsfort_disruptor_glimpse_flat_cast_radius", + -- ability_name = "aghsfort_disruptor_glimpse", + -- special_value_name = "cast_radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 150, + -- }, + + -- { + -- description = "aghsfort_disruptor_glimpse_flat_bonus_damage", + -- ability_name = "aghsfort_disruptor_glimpse", + -- special_value_name = "bonus_damage", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 100, + -- }, + + { + description = "aghsfort_disruptor_glimpse_pct_cooldown", + ability_name = "aghsfort_disruptor_glimpse", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_disruptor_kinetic_field_pct_cooldown", + ability_name = "aghsfort_disruptor_kinetic_field", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_disruptor_kinetic_field_flat_duration", + ability_name = "aghsfort_disruptor_kinetic_field", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2.0, + }, + + -- { + -- description = "aghsfort_disruptor_kinetic_field_formation_time", + -- ability_name = "aghsfort_disruptor_kinetic_field", + -- special_value_name = "formation_time", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = -40, + -- }, + { + description = "aghsfort_disruptor_static_storm_flat_duration", + ability_name = "aghsfort_disruptor_static_storm", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2.50, + }, + + -- { + -- description = "aghsfort_disruptor_static_storm_pct_mana_cost", + -- ability_name = "aghsfort_disruptor_static_storm", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 30, + -- }, + + -- { + -- description = "aghsfort_disruptor_static_storm_pct_cooldown", + -- ability_name = "aghsfort_disruptor_static_storm", + -- special_value_name = "cooldown", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 18, + -- }, + + -- { + -- description = "aghsfort_disruptor_static_storm_flat_radius", + -- ability_name = "aghsfort_disruptor_static_storm", + -- special_value_name = "radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 250, + -- }, + + { + description = "aghsfort_disruptor_static_storm_flat_damage_max", + ability_name = "aghsfort_disruptor_static_storm", + special_value_name = "damage_max", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, +} + +return Disruptor \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_magnataur.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_magnataur.lua new file mode 100755 index 0000000..eb18366 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_magnataur.lua @@ -0,0 +1,130 @@ +local Magnus = +{ + { + description = "aghsfort_magnataur_shockwave_flat_damage", + ability_name = "aghsfort_magnataur_shockwave", + special_value_name = "shock_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + -- { + -- description = "aghsfort_magnataur_shockwave_flat_shock_width", + -- ability_name = "aghsfort_magnataur_shockwave", + -- special_value_name = "shock_width", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 100, + -- }, + + -- { + -- description = "aghsfort_magnataur_shockwave_flat_slow_duration", + -- ability_name = "aghsfort_magnataur_shockwave", + -- special_value_name = "basic_slow_duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 2.5, + -- }, + + -- { + -- description = "aghsfort_magnataur_shockwave_pct_mana_cost", + -- ability_name = "aghsfort_magnataur_shockwave", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + { + description = "aghsfort_magnataur_shockwave_pct_cooldown", + ability_name = "aghsfort_magnataur_shockwave", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_magnataur_empower_flat_damage", + ability_name = "aghsfort_magnataur_empower", + special_value_name = "bonus_damage_pct", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 15, + }, + + { + description = "aghsfort_magnataur_empower_flat_cleave", + ability_name = "aghsfort_magnataur_empower", + special_value_name = "cleave_damage_pct", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 25, + }, + + -- { + -- description = "aghsfort_magnataur_skewer_flat_range", + -- ability_name = "aghsfort_magnataur_skewer", + -- special_value_name = "range", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 400, + -- }, + + { + description = "aghsfort_magnataur_skewer_flat_damage", + ability_name = "aghsfort_magnataur_skewer", + special_value_name = "skewer_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + + -- { + -- description = "aghsfort_magnataur_skewer_flat_slow_pct", + -- ability_name = "aghsfort_magnataur_skewer", + -- special_value_name = "slow_pct", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 50, + -- }, + + { + description = "aghsfort_magnataur_skewer_pct_cooldown", + ability_name = "aghsfort_magnataur_skewer", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_magnataur_reverse_polarity_pct_cooldown", + ability_name = "aghsfort_magnataur_reverse_polarity", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + -- { + -- description = "aghsfort_magnataur_reverse_polarity_pct_mana_cost", + -- ability_name = "aghsfort_magnataur_reverse_polarity", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_magnataur_reverse_polarity_flat_damage", + ability_name = "aghsfort_magnataur_reverse_polarity", + special_value_name = "polarity_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 300, + }, + + { + description = "aghsfort_magnataur_reverse_polarity_flat_stun_duration", + ability_name = "aghsfort_magnataur_reverse_polarity", + special_value_name = "hero_stun_duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 3.0, + }, + + -- { + -- description = "aghsfort_magnataur_reverse_polarity_flat_radius", + -- ability_name = "aghsfort_magnataur_reverse_polarity", + -- special_value_name = "pull_radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 240, + -- }, +} + +return Magnus \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_mars.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_mars.lua new file mode 100755 index 0000000..143b64c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_mars.lua @@ -0,0 +1,148 @@ +local Mars = +{ + -- { + -- description = "aghsfort_mars_spear_percent_manacost", + -- ability_name = "aghsfort_mars_spear", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_mars_spear_percent_cooldown", + ability_name = "aghsfort_mars_spear", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_mars_spear_flat_damage", + ability_name = "aghsfort_mars_spear", + special_value_name = "damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + + -- { + -- description = "aghsfort_mars_spear_flat_stun_duration", + -- ability_name = "aghsfort_mars_spear", + -- special_value_name = "stun_duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 1.0, + -- }, + + + -- { + -- description = "aghsfort_mars_gods_rebuke_percent_manacost", + -- ability_name = "aghsfort_mars_gods_rebuke", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_mars_gods_rebuke_percent_cooldown", + ability_name = "aghsfort_mars_gods_rebuke", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + + { + description = "aghsfort_mars_gods_rebuke_flat_crit_mult", + ability_name = "aghsfort_mars_gods_rebuke", + special_value_name = "crit_mult", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 150, + }, + + -- { + -- description = "aghsfort_mars_gods_rebuke_flat_knockback_slow_duration", + -- ability_name = "aghsfort_mars_gods_rebuke", + -- special_value_name = "knockback_slow_duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 3.0, + -- }, + + { + description = "aghsfort_mars_bulwark_damage_reduction_front", + ability_name = "aghsfort_mars_bulwark", + special_value_name = "physical_damage_reduction", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 10, + }, + + -- { + -- description = "aghsfort_mars_bulwark_damage_reduction_sides", + -- ability_name = "aghsfort_mars_bulwark", + -- special_value_name = "physical_damage_reduction_side", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 20, + -- }, + { + description = "aghsfort_mars_bulwark_percent_cooldown", + ability_name = "aghsfort_mars_bulwark", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + -- { + -- description = "aghsfort_mars_bulwark_active_bulwark_block_bonus", + -- ability_name = "aghsfort_mars_bulwark", + -- special_value_name = "active_bulwark_block_bonus", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 20, + -- }, + + -- { + -- description = "aghsfort_mars_bulwark_active_duration", + -- ability_name = "aghsfort_mars_bulwark", + -- special_value_name = "active_duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 2.0, + -- }, + + -- { + -- description = "aghsfort_mars_arena_of_blood_manacost", + -- ability_name = "aghsfort_mars_arena_of_blood", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_mars_arena_of_blood_cooldown", + ability_name = "aghsfort_mars_arena_of_blood", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + { + description = "aghsfort_mars_arena_of_blood_duration", + ability_name = "aghsfort_mars_arena_of_blood", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2, + }, + + { + description = "aghsfort_mars_arena_of_blood_spear_damage", + ability_name = "aghsfort_mars_arena_of_blood", + special_value_name = "spear_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + + --{ + -- description = "aghsfort_mars_arena_of_blood_spear_attack_interval", + -- ability_name = "aghsfort_mars_arena_of_blood", + -- special_value_name = "spear_attack_interval", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = -30, + --}, + +} + +return Mars \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_omniknight.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_omniknight.lua new file mode 100755 index 0000000..1746d3d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_omniknight.lua @@ -0,0 +1,155 @@ +local Omniknight = +{ + -- { + -- description = "aghsfort_omniknight_purification_manacost", + -- ability_name = "aghsfort_omniknight_purification", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + -- { + -- description = "aghsfort_omniknight_repel_manacost", + -- ability_name = "aghsfort_omniknight_repel", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + -- { + -- description = "aghsfort_omniknight_guardian_angel_manacost", + -- ability_name = "aghsfort_omniknight_guardian_angel", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_omniknight_purification_cooldown", + ability_name = "aghsfort_omniknight_purification", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_omniknight_guardian_angel_cooldown", + ability_name = "aghsfort_omniknight_guardian_angel", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_omniknight_repel_cooldown", + ability_name = "aghsfort_omniknight_repel", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_omniknight_purification_flat_heal", + ability_name = "aghsfort_omniknight_purification", + special_value_name = "heal", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + -- { + -- description = "aghsfort_omniknight_purification_flat_cast_range", + -- ability_name = "aghsfort_omniknight_purification", + -- special_value_name = "cast_range", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 200, + -- }, + + -- { + -- description = "aghsfort_omniknight_purification_flat_radius", + -- ability_name = "aghsfort_omniknight_purification", + -- special_value_name = "radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 160, + -- }, + + { + description = "aghsfort_omniknight_repel_flat_duration", + ability_name = "aghsfort_omniknight_repel", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 4, + }, + + { + description = "aghsfort_omniknight_repel_flat_damage_reduction", + ability_name = "aghsfort_omniknight_repel", + special_value_name = "damage_reduction", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = -5, + }, + + { + description = "aghsfort_omniknight_repel_flat_bonus_str", + ability_name = "aghsfort_omniknight_repel", + special_value_name = "bonus_str", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 15, + }, + + { + description = "aghsfort_omniknight_repel_flat_hp_regen", + ability_name = "aghsfort_omniknight_repel", + special_value_name = "hp_regen", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 20, + }, + + -- { + -- description = "aghsfort_omniknight_degen_aura_flat_radius", + -- ability_name = "aghsfort_omniknight_degen_aura", + -- special_value_name = "radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 150, + -- }, + + -- { + -- description = "aghsfort_omniknight_degen_aura_flat_move_speed_bonus", + -- ability_name = "aghsfort_omniknight_degen_aura", + -- special_value_name = "move_speed_bonus", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 16, + -- }, + -- { + -- description = "aghsfort_omniknight_degen_aura_flat_attack_speed_bonus", + -- ability_name = "aghsfort_omniknight_degen_aura", + -- special_value_name = "attack_speed_bonus", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 16, + -- }, + + { + description = "aghsfort_omniknight_guardian_angel_flat_duration", + ability_name = "aghsfort_omniknight_guardian_angel", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 3.0, + }, + + -- { + -- description = "aghsfort_omniknight_guardian_angel_flat_radius", + -- ability_name = "aghsfort_omniknight_guardian_angel", + -- special_value_name = "radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 400, + -- }, + + { + description = "aghsfort_omniknight_guardian_angel_flat_hp_regen", + ability_name = "aghsfort_omniknight_guardian_angel", + special_value_name = "hp_regen", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 50, + }, + +} + +return Omniknight \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_phantom_assassin.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_phantom_assassin.lua new file mode 100755 index 0000000..ed0332a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_phantom_assassin.lua @@ -0,0 +1,140 @@ +local PhantomAssassin = +{ + { + description = "aghsfort_phantom_assassin_stifling_dagger_flat_base_damage", + ability_name = "aghsfort_phantom_assassin_stifling_dagger", + special_value_name = "base_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + + -- { + -- description = "aghsfort_phantom_assassin_stifling_dagger_flat_attack_factor", + -- ability_name = "aghsfort_phantom_assassin_stifling_dagger", + -- special_value_name = "attack_factor", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = -30, + -- }, + + -- { + -- description = "aghsfort_phantom_assassin_stifling_dagger_flat_mana_cost", + -- ability_name = "aghsfort_phantom_assassin_stifling_dagger", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 10, + -- }, + + -- { + -- description = "aghsfort_phantom_assassin_stifling_dagger_flat_move_slow", + -- ability_name = "aghsfort_phantom_assassin_stifling_dagger", + -- special_value_name = "move_slow", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 50, + -- }, + + { + description = "aghsfort_phantom_assassin_phantom_strike_flat_bonus_attack_speed", + ability_name = "aghsfort_phantom_assassin_phantom_strike", + special_value_name = "bonus_attack_speed", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 100, + }, + + -- { + -- description = "aghsfort_phantom_assassin_phantom_strike_pct_bonus_attack_speed", + -- ability_name = "aghsfort_phantom_assassin_phantom_strike", + -- special_value_name = "bonus_attack_speed", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 40, + -- }, + + { + description = "aghsfort_phantom_assassin_phantom_strike_flat_duration", + ability_name = "aghsfort_phantom_assassin_phantom_strike", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2.0, + }, + + { + description = "aghsfort_phantom_assassin_phantom_strike_flat_cooldown", + ability_name = "aghsfort_phantom_assassin_phantom_strike", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2, + }, + + { + description = "aghsfort_phantom_assassin_phantom_strike_flat_bonus_evasion", + ability_name = "aghsfort_phantom_assassin_phantom_strike", + special_value_name = "bonus_evasion", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 20, + }, + + { + description = "aghsfort_phantom_assassin_blur_flat_cooldown", + ability_name = "aghsfort_phantom_assassin_blur", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2, + }, + + -- { + -- description = "aghsfort_phantom_assassin_blur_flat_bonus_evasion", + -- ability_name = "aghsfort_phantom_assassin_blur", + -- special_value_name = "bonus_evasion", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 20, + -- }, + + -- { + -- description = "aghsfort_phantom_assassin_blur_pct_bonus_evasion", + -- ability_name = "aghsfort_phantom_assassin_blur", + -- special_value_name = "bonus_evasion", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 0.4, + -- }, + + { + description = "aghsfort_phantom_assassin_blur_flat_duration", + ability_name = "aghsfort_phantom_assassin_blur", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2.0, + }, + + -- { + -- description = "aghsfort_phantom_assassin_blur_flat_mana_cost", + -- ability_name = "aghsfort_phantom_assassin_blur", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 25, + -- }, + + { + description = "aghsfort_phantom_assassin_coup_de_grace_flat_crit_chance", + ability_name = "aghsfort_phantom_assassin_coup_de_grace", + special_value_name = "crit_chance", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 10, + }, + + { + description = "aghsfort_phantom_assassin_coup_de_grace_flat_crit_bonus", + ability_name = "aghsfort_phantom_assassin_coup_de_grace", + special_value_name = "crit_bonus", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 100, + }, + + -- { + -- description = "aghsfort_phantom_assassin_coup_de_grace_pct_crit_bonus", + -- ability_name = "aghsfort_phantom_assassin_coup_de_grace", + -- special_value_name = "crit_bonus", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 100, + -- }, +} + +return PhantomAssassin \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_snapfire.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_snapfire.lua new file mode 100755 index 0000000..165b84a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_snapfire.lua @@ -0,0 +1,164 @@ +local Snapfire = +{ + -- { + -- description = "aghsfort_snapfire_scatterblast_pct_mana_cost", + -- ability_name = "aghsfort_snapfire_scatterblast", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_snapfire_scatterblast_pct_cooldown", + ability_name = "aghsfort_snapfire_scatterblast", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_snapfire_scatterblast_flat_damage", + ability_name = "aghsfort_snapfire_scatterblast", + special_value_name = "damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + + -- { + -- description = "aghsfort_snapfire_scatterblast_flat_debuff_duration", + -- ability_name = "aghsfort_snapfire_scatterblast", + -- special_value_name = "debuff_duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 3.0, + -- }, + + { + description = "aghsfort_snapfire_scatterblast_flat_point_blank_dmg_bonus_pct", + ability_name = "aghsfort_snapfire_scatterblast", + special_value_name = "point_blank_dmg_bonus_pct", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 75.0, + }, + + { + description = "aghsfort_snapfire_firesnap_cookie_pct_cooldown", + ability_name = "aghsfort_snapfire_firesnap_cookie", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + -- { + -- description = "aghsfort_snapfire_firesnap_cookie_flat_jump_horizontal_distance", + -- ability_name = "aghsfort_snapfire_firesnap_cookie", + -- special_value_name = "jump_horizontal_distance", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 300, + -- }, + + { + description = "aghsfort_snapfire_firesnap_cookie_flat_impact_damage", + ability_name = "aghsfort_snapfire_firesnap_cookie", + special_value_name = "impact_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + + { + description = "aghsfort_snapfire_firesnap_cookie_flat_stun_duration", + ability_name = "aghsfort_snapfire_firesnap_cookie", + special_value_name = "impact_stun_duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2.0, + }, + + -- { + -- description = "aghsfort_snapfire_firesnap_cookie_flat_impact_radius", + -- ability_name = "aghsfort_snapfire_firesnap_cookie", + -- special_value_name = "impact_radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 170, + -- }, + + { + description = "aghsfort_snapfire_lil_shredder_pct_cooldown", + ability_name = "aghsfort_snapfire_lil_shredder", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_snapfire_lil_shredder_flat_damage", + ability_name = "aghsfort_snapfire_lil_shredder", + special_value_name = "damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 100, + }, + + { + description = "aghsfort_snapfire_lil_shredder_flat_attacks", + ability_name = "aghsfort_snapfire_lil_shredder", + special_value_name = "buffed_attacks", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 4, + }, + + -- { + -- description = "aghsfort_snapfire_lil_shredder_flat_attack_range_bonus", + -- ability_name = "aghsfort_snapfire_lil_shredder", + -- special_value_name = "attack_range_bonus", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 200, + -- }, + + -- { + -- description = "aghsfort_snapfire_lil_shredder_flat_attack_speed_bonus", + -- ability_name = "aghsfort_snapfire_lil_shredder", + -- special_value_name = "attack_speed_bonus", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 300, + -- }, + + { + description = "aghsfort_snapfire_mortimer_kisses_pct_cooldown", + ability_name = "aghsfort_snapfire_mortimer_kisses", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_snapfire_mortimer_kisses_flat_projectile_count", + ability_name = "aghsfort_snapfire_mortimer_kisses", + special_value_name = "projectile_count", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 4, + }, + + { + description = "aghsfort_snapfire_mortimer_kisses_flat_burn_damage", + ability_name = "aghsfort_snapfire_mortimer_kisses", + special_value_name = "burn_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 100, + }, + + -- { + -- description = "aghsfort_snapfire_mortimer_kisses_flat_move_slow_pct", + -- ability_name = "aghsfort_snapfire_mortimer_kisses", + -- special_value_name = "move_slow_pct", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 30, + -- }, + + { + description = "aghsfort_snapfire_mortimer_kisses_flat_damage_per_impact", + ability_name = "aghsfort_snapfire_mortimer_kisses", + special_value_name = "damage_per_impact", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, +} + +return Snapfire \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_sniper.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_sniper.lua new file mode 100755 index 0000000..0c310b7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_sniper.lua @@ -0,0 +1,131 @@ +local Sniper = +{ + { + description = "aghsfort_sniper_shrapnel_percent_cooldown", + ability_name = "aghsfort_sniper_shrapnel", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_sniper_shrapnel_flat_damage", + ability_name = "aghsfort_sniper_shrapnel", + special_value_name = "shrapnel_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 150, + }, + + -- { + -- description = "aghsfort_sniper_shrapnel_flat_radius", + -- ability_name = "aghsfort_sniper_shrapnel", + -- special_value_name = "radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 150, + -- }, + + -- { + -- description = "aghsfort_sniper_shrapnel_flat_slow_movement_speed", + -- ability_name = "aghsfort_sniper_shrapnel", + -- special_value_name = "slow_movement_speed", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = -30, + -- }, + + -- { + -- description = "aghsfort_sniper_shrapnel_percent_mana_cost", + -- ability_name = "aghsfort_sniper_shrapnel", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + { + description = "aghsfort_sniper_shrapnel_duration", + ability_name = "aghsfort_sniper_shrapnel", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 4, + }, + { + description = "aghsfort_sniper_headshot_flat_damage", + ability_name = "aghsfort_sniper_headshot", + special_value_name = "damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 150, + }, + + -- { + -- description = "aghsfort_sniper_headshot_knockback_distance", + -- ability_name = "aghsfort_sniper_headshot", + -- special_value_name = "knockback_distance", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 20, + -- }, + + { + description = "aghsfort_sniper_headshot_proc_chance", + ability_name = "aghsfort_sniper_headshot", + special_value_name = "proc_chance", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 10, + }, + + -- { + -- description = "aghsfort_sniper_headshot_debuff_duration", + -- ability_name = "aghsfort_sniper_headshot", + -- special_value_name = "slow_duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 2.0, + -- }, + + -- { + -- description = "aghsfort_sniper_take_aim_percent_cooldown", + -- ability_name = "aghsfort_sniper_take_aim", + -- special_value_name = "cooldown", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 12, + -- }, + + { + description = "aghsfort_sniper_take_aim_flat_bonus_attack_range", + ability_name = "aghsfort_sniper_take_aim", + special_value_name = "bonus_attack_range", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 100, + }, + + { + description = "aghsfort_sniper_assassinate_flat_damage", + ability_name = "aghsfort_sniper_assassinate", + special_value_name = "damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 500, + }, + + -- { + -- description = "aghsfort_sniper_assassinate_percent_mana_cost", + -- ability_name = "aghsfort_sniper_assassinate", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_sniper_assassinate_percent_cooldown", + ability_name = "aghsfort_sniper_assassinate", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + -- { + -- description = "aghsfort_sniper_assassinate_projectile_speed", + -- ability_name = "aghsfort_sniper_assassinate", + -- special_value_name = "projectile_speed", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 2500, + -- }, + +} + +return Sniper diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_tusk.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_tusk.lua new file mode 100755 index 0000000..54b4236 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_tusk.lua @@ -0,0 +1,141 @@ +local Tusk = +{ + { + description = "aghsfort_tusk_ice_shards_flat_damage", + ability_name = "aghsfort_tusk_ice_shards", + special_value_name = "shard_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + + -- { + -- description = "aghsfort_tusk_ice_shards_pct_mana_cost", + -- ability_name = "aghsfort_tusk_ice_shards", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_tusk_ice_shards_pct_cooldown", + ability_name = "aghsfort_tusk_ice_shards", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + -- { + -- description = "aghsfort_tusk_ice_shards_flat_shard_duration", + -- ability_name = "aghsfort_tusk_ice_shards", + -- special_value_name = "shard_duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 1.0, + -- }, + + { + description = "aghsfort_tusk_snowball_pct_cooldown", + ability_name = "aghsfort_tusk_snowball", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_tusk_snowball_flat_snowball_damage", + ability_name = "aghsfort_tusk_snowball", + special_value_name = "snowball_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 180, + }, + + -- { + -- description = "aghsfort_tusk_snowball_flat_snowball_speed", + -- ability_name = "aghsfort_tusk_snowball", + -- special_value_name = "snowball_speed", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 200, + -- }, + + -- { + -- description = "aghsfort_tusk_snowball_flat_stun_duration", + -- ability_name = "aghsfort_tusk_snowball", + -- special_value_name = "stun_duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 1.0, + -- }, + + { + description = "aghsfort_tusk_tag_team_pct_cooldown", + ability_name = "aghsfort_tusk_tag_team", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_tusk_tag_team_flat_damage", + ability_name = "aghsfort_tusk_tag_team", + special_value_name = "bonus_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 50, + }, + + -- { + -- description = "aghsfort_tusk_tag_team_flat_radius", + -- ability_name = "aghsfort_tusk_tag_team", + -- special_value_name = "radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 300, + -- }, + + -- { + -- description = "aghsfort_tusk_tag_team_flat_debuff_duration", + -- ability_name = "aghsfort_tusk_tag_team", + -- special_value_name = "debuff_duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 2.0, + -- }, + + + { + description = "aghsfort_tusk_walrus_punch_pct_cooldown", + ability_name = "aghsfort_tusk_walrus_punch", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_tusk_walrus_punch_flat_crit_multiplier", + ability_name = "aghsfort_tusk_walrus_punch", + special_value_name = "crit_multiplier", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 125, + }, + + -- { + -- description = "aghsfort_tusk_walrus_punch_flat_slow_duration", + -- ability_name = "aghsfort_tusk_walrus_punch", + -- special_value_name = "slow_duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 4.0, + -- }, + + -- { + -- description = "aghsfort_tusk_walrus_punch_flat_move_slow", + -- ability_name = "aghsfort_tusk_walrus_punch", + -- special_value_name = "move_slow", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 60, + -- }, + + --{ + -- description = "aghsfort_tusk_walrus_punch_flat_air_time", + -- ability_name = "aghsfort_tusk_walrus_punch", + -- special_value_name = "air_time", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 1.5, + --}, +} + +return Tusk diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_ursa.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_ursa.lua new file mode 100755 index 0000000..ab79b50 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_ursa.lua @@ -0,0 +1,122 @@ +local Ursa = +{ + { + description = "aghsfort_ursa_earthshock_flat_damage", + ability_name = "aghsfort_ursa_earthshock", + special_value_name = "impact_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + + -- { + -- description = "aghsfort_ursa_earthshock_percent_mana_cost", + -- ability_name = "aghsfort_ursa_earthshock", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + -- { + -- description = "aghsfort_ursa_earthshock_flat_radius", + -- ability_name = "aghsfort_ursa_earthshock", + -- special_value_name = "shock_radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 150, + -- }, + + { + description = "aghsfort_ursa_earthshock_percent_cooldown", + ability_name = "aghsfort_ursa_earthshock", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + -- { + -- description = "aghsfort_ursa_earthshock_flat_hop_distance", + -- ability_name = "aghsfort_ursa_earthshock", + -- special_value_name = "hop_distance", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 200, + -- }, + -- { + -- description = "aghsfort_ursa_earthshock_flat_movement_slow", + -- ability_name = "aghsfort_ursa_earthshock", + -- special_value_name = "movement_slow", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 40, + -- }, + + { + description = "aghsfort_ursa_overpower_flat_max_attacks", + ability_name = "aghsfort_ursa_overpower", + special_value_name = "max_attacks", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2, + }, + + -- { + -- description = "aghsfort_ursa_overpower_flat_attack_speed_bonus_pct", + -- ability_name = "aghsfort_ursa_overpower", + -- special_value_name = "attack_speed_bonus_pct", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 150, + -- }, + + { + description = "aghsfort_ursa_overpower_percent_cooldown", + ability_name = "aghsfort_ursa_overpower", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_ursa_fury_swipes_flat_damage_per_stack", + ability_name = "aghsfort_ursa_fury_swipes", + special_value_name = "damage_per_stack", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 12, + }, + + -- { + -- description = "aghsfort_ursa_fury_swipes_flat_max_swipe_stack", + -- ability_name = "aghsfort_ursa_fury_swipes", + -- special_value_name = "max_swipe_stack", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 2, + -- }, + + { + description = "aghsfort_ursa_enrage_flat_damage_reduction", + ability_name = "aghsfort_ursa_enrage", + special_value_name = "damage_reduction", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 10, + }, + + { + description = "aghsfort_ursa_enrage_flat_duration", + ability_name = "aghsfort_ursa_enrage", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2.0, + }, + + -- { + -- description = "aghsfort_ursa_enrage_flat_status_resistance", + -- ability_name = "aghsfort_ursa_enrage", + -- special_value_name = "status_resistance", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 20 + -- }, + + { + description = "aghsfort_ursa_enrage_percent_cooldown", + ability_name = "aghsfort_ursa_enrage", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, +} + +return Ursa diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_viper.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_viper.lua new file mode 100755 index 0000000..aa26718 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_viper.lua @@ -0,0 +1,158 @@ +local Viper = +{ + -- { + -- description = "aghsfort_viper_poison_attack_pct_mana_cost", + -- ability_name = "aghsfort_viper_poison_attack", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_viper_poison_attack_damage", + ability_name = "aghsfort_viper_poison_attack", + special_value_name = "damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 25, + }, + + -- { + -- description = "aghsfort_viper_poison_attack_magic_resistance", + -- ability_name = "aghsfort_viper_poison_attack", + -- special_value_name = "magic_resistance", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 2, + -- }, + + { + description = "aghsfort_viper_poison_attack_movement_speed", + ability_name = "aghsfort_viper_poison_attack", + special_value_name = "movement_speed", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 18, + }, + + -- { + -- description = "aghsfort_viper_poison_attack_duration", + -- ability_name = "aghsfort_viper_poison_attack", + -- special_value_name = "duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 2, + -- }, + + -- { + -- description = "aghsfort_viper_poison_attack_max_stacks", + -- ability_name = "aghsfort_viper_poison_attack", + -- special_value_name = "max_stacks", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 2, + -- }, + + -- { + -- description = "aghsfort_viper_nethertoxin_pct_mana_cost", + -- ability_name = "aghsfort_viper_nethertoxin", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + + { + description = "aghsfort_viper_nethertoxin_pct_cooldown", + ability_name = "aghsfort_viper_nethertoxin", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_viper_nethertoxin_max_damage", + ability_name = "aghsfort_viper_nethertoxin", + special_value_name = "max_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 150, + }, + + { + description = "aghsfort_viper_nethertoxin_radius", + ability_name = "aghsfort_viper_nethertoxin", + special_value_name = "radius", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + + { + description = "aghsfort_viper_nethertoxin_duration", + ability_name = "aghsfort_viper_nethertoxin", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 4, + }, + + -- { + -- description = "aghsfort_viper_corrosive_skin_bonus_attack_speed", + -- ability_name = "aghsfort_viper_corrosive_skin", + -- special_value_name = "bonus_attack_speed", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 18, + -- }, + + { + description = "aghsfort_viper_corrosive_skin_bonus_magic_resistance", + ability_name = "aghsfort_viper_corrosive_skin", + special_value_name = "bonus_magic_resistance", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 10, + }, + + -- { + -- description = "aghsfort_viper_corrosive_skin_damage", + -- ability_name = "aghsfort_viper_corrosive_skin", + -- special_value_name = "damage", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 32, + -- }, + + -- { + -- description = "aghsfort_viper_corrosive_skin_duration", + -- ability_name = "aghsfort_viper_corrosive_skin", + -- special_value_name = "duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 8, + -- }, + + { + description = "aghsfort_viper_viper_strike_pct_cooldown", + ability_name = "aghsfort_viper_viper_strike", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + -- { + -- description = "aghsfort_viper_viper_strike_pct_mana_cost", + -- ability_name = "aghsfort_viper_viper_strike", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_viper_viper_strike_duration", + ability_name = "aghsfort_viper_viper_strike", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 3.0, + }, + + { + description = "aghsfort_viper_viper_strike_damage", + ability_name = "aghsfort_viper_viper_strike", + special_value_name = "damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + +} + +return Viper \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_weaver.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_weaver.lua new file mode 100755 index 0000000..e42865c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_weaver.lua @@ -0,0 +1,135 @@ +local Weaver = +{ + + { + description = "aghsfort_weaver_the_swarm_percent_cooldown", + ability_name = "aghsfort_weaver_the_swarm", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + -- { + -- description = "aghsfort_weaver_the_swarm_flat_damage", + -- ability_name = "aghsfort_weaver_the_swarm", + -- special_value_name = "damage", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 24, + -- }, + + { + description = "aghsfort_weaver_the_swarm_flat_attack_rate", + ability_name = "aghsfort_weaver_the_swarm", + special_value_name = "attack_rate", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = -0.15, + }, + + { + description = "aghsfort_weaver_the_swarm_flat_count", + ability_name = "aghsfort_weaver_the_swarm", + special_value_name = "count", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 4, + }, + { + description = "aghsfort_weaver_the_swarm_flat_armor_reduction", + ability_name = "aghsfort_weaver_the_swarm", + special_value_name = "armor_reduction", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 1.0, + }, + { + description = "aghsfort_weaver_the_swarm_flat_duration", + ability_name = "aghsfort_weaver_the_swarm", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 4, + }, + { + description = "aghsfort_weaver_the_swarm_flat_destroy_attacks", + ability_name = "aghsfort_weaver_the_swarm", + special_value_name = "destroy_attacks", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2, + }, + -- { + -- description = "aghsfort_weaver_shukuchi_percent_manacost", + -- ability_name = "aghsfort_weaver_shukuchi", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_weaver_shukuchi_percent_cooldown", + ability_name = "aghsfort_weaver_shukuchi", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_weaver_shukuchi_flat_damage", + ability_name = "aghsfort_weaver_shukuchi", + special_value_name = "damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + + -- { + -- description = "aghsfort_weaver_shukuchi_flat_speed", + -- ability_name = "aghsfort_weaver_shukuchi", + -- special_value_name = "speed", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 60, + -- }, + + { + description = "aghsfort_weaver_shukuchi_duration", + ability_name = "aghsfort_weaver_shukuchi", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2, + }, + -- { + -- description = "aghsfort_weaver_shukuchi_radius", + -- ability_name = "aghsfort_weaver_shukuchi", + -- special_value_name = "radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 70, + -- }, + { + description = "aghsfort_weaver_geminate_attack_cooldown", + ability_name = "aghsfort_weaver_geminate_attack", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + { + description = "aghsfort_weaver_geminate_attack_flat_bonus_damage", + ability_name = "aghsfort_weaver_geminate_attack", + special_value_name = "bonus_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + + -- { + -- description = "aghsfort_weaver_time_lapse_percent_manacost", + -- ability_name = "aghsfort_weaver_time_lapse", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + { + description = "aghsfort_weaver_time_lapse_cooldown", + ability_name = "aghsfort_weaver_time_lapse", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + +} + +return Weaver \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_winter_wyvern.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_winter_wyvern.lua new file mode 100755 index 0000000..bfd7029 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_winter_wyvern.lua @@ -0,0 +1,157 @@ +local WinterWyvern = +{ + { + description = "aghsfort_winter_wyvern_arctic_burn_flat_damage", + ability_name = "aghsfort_winter_wyvern_arctic_burn", + special_value_name = "damage_per_second", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 100, + }, + + { + description = "aghsfort_winter_wyvern_arctic_burn_flat_duration", + ability_name = "aghsfort_winter_wyvern_arctic_burn", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2.0, + }, + + -- { + -- description = "aghsfort_winter_wyvern_arctic_burn_flat_range", + -- ability_name = "aghsfort_winter_wyvern_arctic_burn", + -- special_value_name = "attack_range_bonus", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 100, + -- }, + + -- { + -- description = "aghsfort_winter_wyvern_arctic_burn_flat_move_slow", + -- ability_name = "aghsfort_winter_wyvern_arctic_burn", + -- special_value_name = "move_slow", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 50, + -- }, + + -- { + -- description = "aghsfort_winter_wyvern_splinter_blast_flat_slow", + -- ability_name = "aghsfort_winter_wyvern_splinter_blast", + -- special_value_name = "bonus_movespeed", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 50, + -- }, + + -- { + -- description = "aghsfort_winter_wyvern_splinter_blast_flat_radius", + -- ability_name = "aghsfort_winter_wyvern_splinter_blast", + -- special_value_name = "split_radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 250, + -- }, + + -- { + -- description = "aghsfort_winter_wyvern_splinter_blast_flat_slow_duration", + -- ability_name = "aghsfort_winter_wyvern_splinter_blast", + -- special_value_name = "duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 4.0, + -- }, + + { + description = "aghsfort_winter_wyvern_splinter_blast_flat_damage", + ability_name = "aghsfort_winter_wyvern_splinter_blast", + special_value_name = "splinter_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + + -- { + -- description = "aghsfort_winter_wyvern_splinter_blast_pct_mana_cost", + -- ability_name = "aghsfort_winter_wyvern_splinter_blast", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_winter_wyvern_splinter_blast_pct_cooldown", + ability_name = "aghsfort_winter_wyvern_splinter_blast", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_winter_wyvern_cold_embrace_pct_cooldown", + ability_name = "aghsfort_winter_wyvern_cold_embrace", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_winter_wyvern_cold_embrace_flat_heal_additive", + ability_name = "aghsfort_winter_wyvern_cold_embrace", + special_value_name = "heal_additive", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 48, + }, + + { + description = "aghsfort_winter_wyvern_cold_embrace_flat_heal_percentage", + ability_name = "aghsfort_winter_wyvern_cold_embrace", + special_value_name = "heal_percentage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2.0, + }, + + { + description = "aghsfort_winter_wyvern_cold_embrace_flat_duration", + ability_name = "aghsfort_winter_wyvern_cold_embrace", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2.0, + }, + + + { + description = "aghsfort_winter_wyvern_winters_curse_pct_cooldown", + ability_name = "aghsfort_winter_wyvern_winters_curse", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + -- { + -- description = "aghsfort_winter_wyvern_winters_curse_pct_manacost", + -- ability_name = "aghsfort_winter_wyvern_winters_curse", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + { + description = "aghsfort_winter_wyvern_winters_curse_flat_bonus_attack_speed", + ability_name = "aghsfort_winter_wyvern_winters_curse", + special_value_name = "bonus_attack_speed", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 50, + }, + + { + description = "aghsfort_winter_wyvern_winters_curse_flat_duration", + ability_name = "aghsfort_winter_wyvern_winters_curse", + special_value_name = "duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 3.0, + }, + + { + description = "aghsfort_winter_wyvern_winters_curse_flat_radius", + ability_name = "aghsfort_winter_wyvern_winters_curse", + special_value_name = "radius", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 250, + }, +} + +return WinterWyvern \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_witch_doctor.lua b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_witch_doctor.lua new file mode 100755 index 0000000..c4f14ee --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/minor_ability_upgrades/minor_ability_upgrades_witch_doctor.lua @@ -0,0 +1,166 @@ +local Witch_Doctor = +{ + -- { + -- description = "aghsfort_witch_doctor_paralyzing_cask_manacost", + -- ability_name = "aghsfort_witch_doctor_paralyzing_cask", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + -- { + -- description = "aghsfort_witch_doctor_voodoo_restoration_manacost", + -- ability_name = "aghsfort_witch_doctor_voodoo_restoration", + -- special_value_name = "mana_per_second", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + + -- { + -- description = "aghsfort_witch_doctor_maledict_manacost", + -- ability_name = "aghsfort_witch_doctor_maledict", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + -- { + -- description = "aghsfort_witch_doctor_death_ward_manacost", + -- ability_name = "aghsfort_witch_doctor_death_ward", + -- special_value_name = "mana_cost", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = 30, + -- }, + { + description = "aghsfort_witch_doctor_paralyzing_cask_cooldown", + ability_name = "aghsfort_witch_doctor_paralyzing_cask", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_witch_doctor_maledict_cooldown", + ability_name = "aghsfort_witch_doctor_maledict", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_witch_doctor_death_ward_cooldown", + ability_name = "aghsfort_witch_doctor_death_ward", + special_value_name = "cooldown", + operator = MINOR_ABILITY_UPGRADE_OP_MUL, + value = 12, + }, + + { + description = "aghsfort_witch_doctor_paralyzing_cask_flat_damage", + ability_name = "aghsfort_witch_doctor_paralyzing_cask", + special_value_name = "damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + -- { + -- description = "aghsfort_witch_doctor_paralyzing_cask_flat_bounce_range", + -- ability_name = "aghsfort_witch_doctor_paralyzing_cask", + -- special_value_name = "bounce_range", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 400, + -- }, + -- { + -- description = "aghsfort_witch_doctor_paralyzing_cask_flat_bounces", + -- ability_name = "aghsfort_witch_doctor_paralyzing_cask", + -- special_value_name = "bounces", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 3, + -- }, + -- { + -- description = "aghsfort_witch_doctor_paralyzing_cask_flat_stun_duration", + -- ability_name = "aghsfort_witch_doctor_paralyzing_cask", + -- special_value_name = "stun_duration", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 2.00, + -- }, + -- { + -- description = "aghsfort_witch_doctor_voodoo_restoration_flat_radius", + -- ability_name = "aghsfort_witch_doctor_voodoo_restoration", + -- special_value_name = "radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 200, + -- }, + { + description = "aghsfort_witch_doctor_voodoo_restoration_flat_heal", + ability_name = "aghsfort_witch_doctor_voodoo_restoration", + special_value_name = "heal", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 100, + }, + --{ + -- description = "aghsfort_witch_doctor_voodoo_restoration_mul_heal_interval", + -- ability_name = "aghsfort_witch_doctor_voodoo_restoration", + -- special_value_name = "heal_interval", + -- operator = MINOR_ABILITY_UPGRADE_OP_MUL, + -- value = -15, + --}, + + { + description = "aghsfort_witch_doctor_maledict_flat_radius", + ability_name = "aghsfort_witch_doctor_maledict", + special_value_name = "radius", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 100, + }, + { + description = "aghsfort_witch_doctor_maledict_flat_bonus_damage", + ability_name = "aghsfort_witch_doctor_maledict", + special_value_name = "bonus_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 32, + }, + { + description = "aghsfort_witch_doctor_maledict_flat_max_bonus_damage", + ability_name = "aghsfort_witch_doctor_maledict", + special_value_name = "max_bonus_damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 200, + }, + { + description = "aghsfort_witch_doctor_maledict_flat_ticks", + ability_name = "aghsfort_witch_doctor_maledict", + special_value_name = "ticks", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2, + }, + { + description = "aghsfort_witch_doctor_death_ward_flat_damage", + ability_name = "aghsfort_witch_doctor_death_ward", + special_value_name = "damage", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 150, + }, + -- { + -- description = "aghsfort_witch_doctor_death_ward_flat_bounce_radius", + -- ability_name = "aghsfort_witch_doctor_death_ward", + -- special_value_name = "bounce_radius", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 300, + -- }, + -- { + -- description = "aghsfort_witch_doctor_death_ward_flat_bounces", + -- ability_name = "aghsfort_witch_doctor_death_ward", + -- special_value_name = "bounces", + -- operator = MINOR_ABILITY_UPGRADE_OP_ADD, + -- value = 2, + -- }, + { + description = "aghsfort_witch_doctor_death_ward_flat_channel_duration", + ability_name = "aghsfort_witch_doctor_death_ward", + special_value_name = "channel_duration", + operator = MINOR_ABILITY_UPGRADE_OP_ADD, + value = 2, + }, + +} + +return Witch_Doctor \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_announcer_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_announcer_passive.lua new file mode 100755 index 0000000..aa0d7c6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_announcer_passive.lua @@ -0,0 +1,39 @@ + +modifier_aghanim_announcer_passive = class({}) + +---------------------------------------- + +function modifier_aghanim_announcer_passive:OnCreated( kv ) + print( "modifier_aghanim_announcer_passive" ) +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_announcer_passive:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_announcer_passive:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_announcer_passive:CheckState() + local state = {} + if IsServer() then + state[ MODIFIER_STATE_INVULNERABLE ] = true + state[ MODIFIER_STATE_MAGIC_IMMUNE ] = true + state[ MODIFIER_STATE_UNSELECTABLE ] = true + state[ MODIFIER_STATE_NOT_ON_MINIMAP ] = true + state[ MODIFIER_STATE_NO_UNIT_COLLISION ] = true + state[ MODIFIER_STATE_NO_HEALTH_BAR ] = true + state[ MODIFIER_STATE_DISARMED ] = true + state[ MODIFIER_STATE_ROOTED ] = true + state[ MODIFIER_STATE_ATTACK_IMMUNE ] = true + end + + return state +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_crystal_attack_active.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_crystal_attack_active.lua new file mode 100755 index 0000000..348ce9c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_crystal_attack_active.lua @@ -0,0 +1,63 @@ +modifier_aghanim_crystal_attack_active = class({}) + +--------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_active:GetEffectName() + return "particles/creatures/aghanim/aghanim_pulse_ambient.vpcf"; +end + +--------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_active:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_active:OnCreated( kv ) + self.pulse_radius = self:GetAbility():GetSpecialValueFor( "pulse_radius" ) + self.pulse_damage = self:GetAbility():GetSpecialValueFor( "pulse_damage" ) + self.debuff_duration = self:GetAbility():GetSpecialValueFor( "debuff_duration" ) + self.pulse_damage_pct = self:GetAbility():GetSpecialValueFor( "pulse_damage_pct" ) +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_active:Pulse() + if IsServer() then + + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_self_dmg.vpcf", PATTACH_CUSTOMORIGIN, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( self.pulse_radius, self.pulse_radius, self.pulse_radius ) ) + + EmitSoundOn( "Hero_Lich.IceAge.Tick", self:GetParent() ) + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetParent():GetAbsOrigin(), nil, self.pulse_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and enemy:IsAttackImmune() == false then + + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_aghanim_crystal_attack_debuff", { duration = self.debuff_duration } ) + + local flDamage = enemy:GetMaxHealth() * self.pulse_damage_pct / 100 + + local damage = + { + victim = enemy, + attacker = self:GetCaster(), + damage = flDamage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self:GetAbility(), + } + + ApplyDamage( damage ) + + + local nFXIndex2 = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_pulse_nova.vpcf", PATTACH_ABSORIGIN_FOLLOW, enemy ) + ParticleManager:ReleaseParticleIndex( nFXIndex2 ) + + EmitSoundOn( "Hero_Leshrac.Pulse_Nova_Strike", enemy ) + end + end + end +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_crystal_attack_debuff.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_crystal_attack_debuff.lua new file mode 100755 index 0000000..ba39562 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_crystal_attack_debuff.lua @@ -0,0 +1,81 @@ +modifier_aghanim_crystal_attack_debuff = class({}) + + +function modifier_aghanim_crystal_attack_debuff:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + + +--------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_debuff:IsPurgable() + return false +end + + +--------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_debuff:GetEffectName() + return "particles/units/heroes/hero_ancient_apparition/ancient_apparition_ice_blast_debuff.vpcf"; +end + +--------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_debuff:GetStatusEffectName() + return "particles/status_fx/status_effect_iceblast.vpcf"; +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_debuff:OnCreated( kv ) + self.heal_suppression_pct = self:GetAbility():GetSpecialValueFor( "heal_suppression_pct" ) + self.nArmorReductionPerStack = math.max( math.floor( self:GetAbility():GetSpecialValueFor( "armor_reduction_pct" ) * self:GetParent():GetPhysicalArmorValue( false ) / 100 ), 1 ) +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_debuff:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_LIFESTEAL_AMPLIFY_PERCENTAGE, + MODIFIER_PROPERTY_SPELL_LIFESTEAL_AMPLIFY_PERCENTAGE, + MODIFIER_PROPERTY_HP_REGEN_AMPLIFY_PERCENTAGE, + MODIFIER_PROPERTY_HEAL_AMPLIFY_PERCENTAGE_TARGET, + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + + } + return funcs +end +----------------------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_debuff:GetModifierPhysicalArmorBonus() + if self.nArmorReductionPerStack == nil then + return 0 + end + + return self.nArmorReductionPerStack * -1 +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_debuff:GetModifierHealAmplify_PercentageTarget( params ) + return -self.heal_suppression_pct +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_debuff:GetModifierHPRegenAmplify_Percentage( params ) + return -self.heal_suppression_pct +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_debuff:GetModifierLifestealRegenAmplify_Percentage( params ) + return -self.heal_suppression_pct +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_crystal_attack_debuff:GetModifierSpellLifestealRegenAmplify_Percentage( params ) + return -self.heal_suppression_pct +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_passive.lua new file mode 100755 index 0000000..509b1f7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_passive.lua @@ -0,0 +1,230 @@ + +modifier_aghanim_passive = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_aghanim_passive:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_aghanim_passive:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_passive:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10000 +end + +----------------------------------------------------------------------------------------- + +function modifier_aghanim_passive:CheckState() + local state = + { + [MODIFIER_STATE_HEXED] = false, + [MODIFIER_STATE_ROOTED] = false, + [MODIFIER_STATE_SILENCED] = false, + [MODIFIER_STATE_STUNNED] = false, + [MODIFIER_STATE_FROZEN] = false, + [MODIFIER_STATE_FEARED] = false, + [MODIFIER_STATE_CANNOT_BE_MOTION_CONTROLLED] = true, + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + } + + if IsServer() then + if self:GetParent() and self:GetParent().AI and self:GetParent().AI.bDefeated == true then + state[MODIFIER_STATE_INVULNERABLE] = true + end + end + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_passive:OnCreated( kv ) + self.status_resist = self:GetAbility():GetSpecialValueFor( "status_resist" ) + if IsServer() then + self:GetParent().bAbsoluteNoCC = true + self:GetParent().bNoNullifier = true + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_passive:OnRefresh( kv ) + self.status_resist = self:GetAbility():GetSpecialValueFor( "status_resist" ) +end + +----------------------------------------------------------------------------------------- + +function modifier_aghanim_passive:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MIN_HEALTH, + MODIFIER_EVENT_ON_DEATH_PREVENTED, + MODIFIER_PROPERTY_STATUS_RESISTANCE_STACKING, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_passive:GetModifierStatusResistanceStacking( params ) + return self.status_resist +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_passive:GetMinHealth( params ) + if IsServer() then + if GameRules.Aghanim:GetAscensionLevel() < 3 then + return math.floor( self:GetParent():GetMaxHealth() * 0.1 ) + end + end + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_passive:OnDeathPrevented( params ) + if IsServer() then + if self:GetParent() == params.unit and self:GetParent().AI and self:GetParent().AI.Encounter and self:GetParent().AI.bDefeated == false then + print( "Game Over - Players win! Play Aghanim Victory Sequence" ) + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + hPlayerHero:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_invulnerable", { duration = -1 } ) + end + end + + local Angles = self:GetParent():GetAnglesAsVector() + CustomGameEventManager:Send_ServerToAllClients( "begin_aghanim_victory", { ent_index = self:GetParent():entindex(), yaw = Angles.y } ) + + self:GetParent().AI.bDefeated = true + self:GetParent():Interrupt() + self:GetParent():InterruptChannel() + self:GetParent():Purge( false, true, false, true, true ) + --self:GetParent():SetAbsAngles( 0, 270, 0 ) + self:GetParent().AI.Encounter:BeginVictorySequence() + + EmitSoundOn( "Aghanim.ShardAttack.Channel", self:GetCaster() ) + if GameRules.Aghanim:GetAscensionLevel() < 3 then + self:GetParent():StartGestureFadeWithSequenceSettings( ACT_DOTA_CAST_ABILITY_3 ) + else + self:GetParent():StartGestureFadeWithSequenceSettings( ACT_DOTA_SPAWN ) + end + self.nOutroPhase = 1 + self:StartIntervalThink( 2.0 ) + end + end + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_passive:OnIntervalThink() + if IsServer() then + + if self.nOutroPhase == 1 then + if GameRules.Aghanim:GetAscensionLevel() < 3 then + EmitSoundOn( "Aghanim.ShardAttack.Wave", self:GetCaster() ) + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_self_dmg.vpcf", PATTACH_CUSTOMORIGIN, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 2500, 2500, 2500 ) ) + + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + hPlayerHero:RemoveModifierByName( "modifier_invulnerable" ) + hPlayerHero:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_aghanim_crystal_attack_debuff", { duration = -1 } ) + hPlayerHero:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_stunned", { duration = -1 } ) + hPlayerHero:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_invulnerable", { duration = -1 } ) + + local nFXIndex2 = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_pulse_nova.vpcf", PATTACH_ABSORIGIN_FOLLOW, hPlayerHero ) + ParticleManager:ReleaseParticleIndex( nFXIndex2 ) + EmitSoundOn( "Hero_Leshrac.Pulse_Nova_Strike", hPlayerHero ) + end + end + self:GetParent():FadeGesture( ACT_DOTA_CAST_ABILITY_3 ) + else + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + hPlayerHero:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_boss_intro", { duration = -1 } ) + end + end + + self:GetParent():FadeGesture( ACT_DOTA_SPAWN ) + end + + local AlliedUnits = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetAbsOrigin(), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + DOTA_UNIT_TARGET_BUILDING, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _,Ally in pairs( AlliedUnits ) do + if Ally:GetUnitName() == "npc_dota_boss_aghanim_crystal" or Ally:GetUnitName() == "npc_dota_boss_aghanim_minion" or Ally:GetUnitName() == "npc_dota_thinker" or Ally:GetUnitName() == "npc_dota_boss_aghanim_spear" then + Ally:ForceKill( false ) + end + end + + self.nOutroPhase = self.nOutroPhase + 1 + self:StartIntervalThink( 2.0 ) + self:GetParent():FadeGesture( ACT_DOTA_CAST_ABILITY_3 ) + self:GetParent():StartGestureFadeWithSequenceSettings( ACT_DOTA_VICTORY ) + return + end + + if self.nOutroPhase == 2 then + self.nPortalFX = ParticleManager:CreateParticle( "particles/creatures/aghanim/portal_summon.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( self.nPortalFX, 0, self:GetParent():GetAbsOrigin() ) + ParticleManager:SetParticleControlForward( self.nPortalFX, 0, self:GetParent():GetForwardVector() ) + + self.nOutroPhase = self.nOutroPhase + 1 + self:StartIntervalThink( 0.1 ) + return + end + + if self.nOutroPhase == 3 then + if self:GetParent().Encounter and self:GetParent().Encounter.nVictoryState ~= self:GetParent().Encounter.AGH_VICTORY_BOWING then + return + end + + EmitSoundOn( "SeasonalConsumable.TI10.Portal.Open", self:GetParent() ) + EmitSoundOn( "SeasonalConsumable.TI10.Portal.Loop", self:GetParent() ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_outro_linger.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetAbsOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 0, self:GetParent():GetForwardVector() ) + + self:GetParent():FadeGesture( ACT_DOTA_VICTORY ) + self:GetParent():StartGestureFadeWithSequenceSettings( ACT_DOTA_DIE ) + self.nOutroPhase = self.nOutroPhase + 1 + self:StartIntervalThink( 5.67 ) + return + end + + if self.nOutroPhase == 4 then + self:GetParent().bOutroComplete = true + ParticleManager:DestroyParticle( self.nPortalFX, false ) + + StopSoundOn( "SeasonalConsumable.TI10.Portal.Open", self:GetParent() ) + StopSoundOn( "SeasonalConsumable.TI10.Portal.Loop", self:GetParent() ) + + self:StartIntervalThink( -1 ) + self:GetParent():AddEffects( EF_NODRAW ) + + for nPlayerID = 0,AGHANIM_PLAYERS-1 do + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero then + hPlayerHero:RemoveModifierByName( "modifier_stunned" ) + hPlayerHero:RemoveModifierByName( "modifier_aghanim_crystal_attack_debuff" ) + hPlayerHero:StartGestureFadeWithSequenceSettings( ACT_DOTA_VICTORY ) + end + end + return + end + + end +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_portal_spawn_effect.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_portal_spawn_effect.lua new file mode 100755 index 0000000..c27fce0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_portal_spawn_effect.lua @@ -0,0 +1,79 @@ +modifier_aghanim_portal_spawn_effect = class({}) + +--------------------------------------------------------------------------- + +function modifier_aghanim_portal_spawn_effect:IsHidden() + return true +end + +--------------------------------------------------------------------------- + +function modifier_aghanim_portal_spawn_effect:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_portal_spawn_effect:OnCreated( kv ) + if IsServer() then + self:StartIntervalThink( 1.0 ) + end +end + + +-------------------------------------------------------------------------------- + +function modifier_aghanim_portal_spawn_effect:OnIntervalThink() + if IsServer() then + self:GetParent():RemoveEffects( EF_NODRAW ) + self:StartIntervalThink( -1 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_portal_spawn_effect:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 20000 +end + +--------------------------------------------------------------------------- + +function modifier_aghanim_portal_spawn_effect:GetEffectName() + return "particles/units/heroes/hero_pugna/pugna_decrepify.vpcf" +end + +--------------------------------------------------------------------------- + +function modifier_aghanim_portal_spawn_effect:GetStatusEffectName() + return "particles/status_fx/status_effect_ghost.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_portal_spawn_effect:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MODEL_SCALE, + } + return funcs +end + +--------------------------------------------------------------------------- + +function modifier_aghanim_portal_spawn_effect:GetModifierModelScale( params ) + return ( self:GetElapsedTime() / self:GetDuration() - 1.0 ) * 100 +end + +--------------------------------------------------------------------------- + +function modifier_aghanim_portal_spawn_effect:CheckState() + local state = + { + [MODIFIER_STATE_INVULNERABLE] = true, + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + [MODIFIER_STATE_UNSELECTABLE] = true, + [MODIFIER_STATE_STUNNED] = true, + [MODIFIER_STATE_NO_UNIT_COLLISION] = true, + } + return state +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_spell_swap.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_spell_swap.lua new file mode 100755 index 0000000..cac088d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_spell_swap.lua @@ -0,0 +1,166 @@ +modifier_aghanim_spell_swap = class({}) + +--------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap:IsHidden() + return false +end + +--------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap:OnCreated( kv ) + if IsServer() then + self:DisableSpell() + end +end + +---------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_DEATH, + } + + return funcs +end + +-------------------------------------------------------------------------------- + + +function modifier_aghanim_spell_swap:OnDeath( params ) + if IsServer() then + if params.unit == self.hCrystal then + self:Destroy() + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap:DisableSpell() + if IsServer() then + local NormalAbilities = {} + for i=0,DOTA_MAX_ABILITIES-1 do + local hAbility = self:GetParent():GetAbilityByIndex( i ) + if hAbility and not hAbility:IsCosmetic( nil ) and not hAbility:IsAttributeBonus() and hAbility:GetAssociatedPrimaryAbilities() == nil and not hAbility:IsHidden() and not hAbility.bAghDisabled == true and not hAbility.bAghDummy == true and hAbility:IsActivated() then + print( "considering ability for disable: " .. hAbility:GetAbilityName() ) + table.insert( NormalAbilities, hAbility ) + end + end + + local nNextAghDummy = nil + for j=1,4 do + local szName = tostring( "aghanim_empty_spell" .. j ) + local hDummyAbility = self:GetParent():FindAbilityByName( szName ) + nNextAghDummy = j + if not hDummyAbility then + break + end + end + + + local nIndexToDisable = math.random( 1, #NormalAbilities ) + local hAbilityToDisable = NormalAbilities[ nIndexToDisable ] + + if nNextAghDummy == nil or hAbilityToDisable == nil then + self:Destroy() + print( "Cannot disable spell:" ) + print( "Next agh dummy: " .. nNextAghDummy ) + if hAbilityToDisable ~= nil then + print( "hAbilityToDisable " .. hAbilityToDisable:GetAbilityName() ) + end + return + end + + local hNewDummyAbility = self:GetParent():AddAbility( tostring( "aghanim_empty_spell" .. nNextAghDummy ) ) + if hNewDummyAbility then + print( "adding dummy ability for disable: " .. hNewDummyAbility:GetAbilityName() ) + hNewDummyAbility:UpgradeAbility( true ) + hNewDummyAbility:SetActivated( true ) + hNewDummyAbility.bAghDummy = true + hNewDummyAbility.nOriginalIndex = hNewDummyAbility:GetAbilityIndex() + end + + + hAbilityToDisable.bAghDisabled = true + print( "disabling " .. hAbilityToDisable:GetAbilityName() ) + if hAbilityToDisable:GetToggleState() then + --print( "toggling ability off" ) + hAbilityToDisable:OnToggle() + end + + hAbilityToDisable:SetActivated( false ) + hAbilityToDisable.nOriginalIndex = hAbilityToDisable:GetAbilityIndex() + + self.hDisabledAbility = hAbilityToDisable + self.hDummyAbility = hNewDummyAbility + + self:GetParent():SwapAbilities( self.hDisabledAbility:GetAbilityName(), self.hDummyAbility:GetAbilityName(), false, true ) + self.hDummyAbility:SetActivated( false ) + + --self.hDisabledAbility:SetAbilityIndex( self.hDummyAbility.nOriginalIndex ) + --self.hDisabledAbility:SetHidden( true ) + --self.hDummyAbility:SetAbilityIndex( self.hDisabledAbility.nOriginalIndex ) + --self.hDummyAbility:SetHidden( false ) + + self.hCrystal = CreateUnitByName( "npc_dota_boss_aghanim_crystal", self:GetCaster():GetAbsOrigin(), true, self:GetCaster(), self:GetCaster():GetOwner(), self:GetCaster():GetTeamNumber() ) + if self.hCrystal then + self.hCrystal:SetControllableByPlayer( self:GetCaster():GetPlayerOwnerID(), false ) + self.hCrystal:SetOwner( self:GetCaster() ) + self.hCrystal:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_aghanim_spell_swap_crystal", {} ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap:RestoreSpell() + if IsServer() then + if self.hDisabledAbility and self.hDummyAbility then + self.hDisabledAbility:SetActivated( true ) + self.hDisabledAbility.bAghDisabled = false + self.hDisabledAbility:SetHidden( false ) + self:GetParent():RemoveAbilityFromIndexByName( self.hDisabledAbility:GetAbilityName() ) + self:GetParent():SetAbilityByIndex( self.hDisabledAbility, self.hDisabledAbility.nOriginalIndex ) -- this destroys the dummy spell + + if self.hCrystal then + self.hCrystal:AddEffects( EF_NODRAW ) + if self.hCrystal:IsAlive() then + self.hCrystal:ForceKill( false ) + end + + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_crystal_destroy.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self.hCrystal:GetAbsOrigin() ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Hero_Wisp.Spirits.Destroy", self.hCrystal ) + + local nFXIndex2 = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_crystal_spellswap_replenish.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex2, 0, self.hCrystal, PATTACH_POINT_FOLLOW, "attach_attack1", self.hCrystal:GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex2, 1, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex2 ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap:OnDestroy() + if IsServer() then + self:RestoreSpell() + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_spell_swap_crystal.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_spell_swap_crystal.lua new file mode 100755 index 0000000..7e79d74 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_spell_swap_crystal.lua @@ -0,0 +1,181 @@ +modifier_aghanim_spell_swap_crystal = class({}) + +--------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:IsHidden() + return true +end + +--------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:IsPurgable() + return false +end + +--------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:GetEffectName() + return "particles/creatures/aghanim/aghanim_crystal_spellswap_ambient.vpcf" +end + +---------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_ABSOLUTE_NO_DAMAGE_PHYSICAL, + MODIFIER_PROPERTY_ABSOLUTE_NO_DAMAGE_MAGICAL, + MODIFIER_PROPERTY_ABSOLUTE_NO_DAMAGE_PURE, + MODIFIER_EVENT_ON_ATTACKED, + } + + return funcs +end + +---------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:CheckState() + local state = + { + [MODIFIER_STATE_MAGIC_IMMUNE] = true, + [MODIFIER_STATE_FLYING] = true, + } + return state +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:OnCreated( kv ) + if IsServer() then + self.num_crystal_hits = self:GetAbility():GetSpecialValueFor( "num_crystal_hits" ) + + self:GetParent():SetBaseMaxHealth( self.num_crystal_hits * 2 ) + self:GetParent():SetMaxHealth( self.num_crystal_hits * 2 ) + self:GetParent():SetHealth( self.num_crystal_hits * 2 ) + + self.flRotationTime = 12.0 + self.flRotationDist = 300.0 + self.flHeight = RandomFloat( 120.0, 180.0 ) + self.flRotation = RandomFloat( 0, 360 ) + self.flRecoverTime = -1 + + self:StartIntervalThink( 0.25 ) + + if self:ApplyHorizontalMotionController() == false or self:ApplyVerticalMotionController() == false then + self:Destroy() + return + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:OnIntervalThink() + if IsServer() then + if GameRules:GetGameTime() > self.flRecoverTime then + self.flRotationTime = 12.0 + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:OnDestroy() + if IsServer() then + self:GetParent():RemoveHorizontalMotionController( self ) + self:GetParent():RemoveVerticalMotionController( self ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:UpdateHorizontalMotion( me, dt ) + if IsServer() then + self.flRotation = self.flRotation + ( 2.0 * dt * math.pi / self.flRotationTime ) + local flX = self.flRotationDist * math.sin( self.flRotation ) + local flY = self.flRotationDist * math.cos( self.flRotation ) + if self:GetCaster() and self:GetParent() then + local vNewLocation = self:GetCaster():GetAbsOrigin() + Vector( flX, flY, self:GetParent():GetAbsOrigin().z ) + me:SetOrigin( vNewLocation ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:OnHorizontalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:UpdateVerticalMotion( me, dt ) + if IsServer() then + local flHeight = GetGroundHeight( self:GetParent():GetAbsOrigin(), self:GetParent() ) + self.flHeight + local vNewLocation = self:GetParent():GetAbsOrigin() + vNewLocation.z = flHeight + me:SetOrigin( vNewLocation ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:OnVerticalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:GetAbsoluteNoDamagePhysical( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:GetAbsoluteNoDamageMagical( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:GetAbsoluteNoDamagePure( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_spell_swap_crystal:OnAttacked( params ) + if IsServer() then + if self:GetParent() == params.target then + local nDamage = 0 + if params.attacker then + local bDeathWard = params.attacker:FindModifierByName( "modifier_aghsfort_witch_doctor_death_ward" ) ~= nil + local bValidAttacker = params.attacker:IsRealHero() or bDeathWard + if not bValidAttacker then + return 0 + end + + nDamage = 2 + if params.attacker:FindModifierByName( "modifier_aghsfort_snapfire_lil_shredder_buff" ) or bDeathWard then + nDamage = 1 + end + + self.flRotationTime = 36.0 + self.flRecoverTime = GameRules:GetGameTime() + 1.0 + self:GetParent():ModifyHealth( self:GetParent():GetHealth() - nDamage, nil, true, 0 ) + + EmitSoundOn( "Hero_Wisp.Spirits.Target", self:GetParent() ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_crystal_impact.vpcf", PATTACH_CUSTOMORIGIN, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetAbsOrigin(), false ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + end + + return 0 +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_staff_beams_debuff.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_staff_beams_debuff.lua new file mode 100755 index 0000000..c51e43f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_staff_beams_debuff.lua @@ -0,0 +1,55 @@ + +modifier_aghanim_staff_beams_debuff = class({}) + +-------------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_debuff:IsHidden() + return true +end + + +----------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_debuff:OnCreated( kv ) + if IsServer() then + self.beam_dps = self:GetAbility():GetSpecialValueFor( "beam_dps" ) + self.beam_dps_pct = self:GetAbility():GetSpecialValueFor( "beam_dps_pct" ) + self.damage_interval = self:GetAbility():GetSpecialValueFor( "damage_interval" ) + self:OnIntervalThink() + self:StartIntervalThink( self.damage_interval ) + + EmitSoundOn( "Hero_Huskar.Burning_Spear", self:GetParent() ) + end +end + +----------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_debuff:OnDestroy() + if IsServer() then + StopSoundOn( "Hero_Huskar.Burning_Spear", self:GetParent() ) + end +end + +----------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_debuff:OnIntervalThink() + if IsServer() then + local flHealthPctDamage = self.beam_dps_pct * self:GetParent():GetMaxHealth() / 100 + local flDamage = self.beam_dps + flHealthPctDamage + local damageInfo = + { + victim = self:GetParent(), + attacker = self:GetCaster(), + damage = flDamage * self.damage_interval, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self:GetAbility(), + } + ApplyDamage( damageInfo ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_beam_burn.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end +end + +----------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_staff_beams_linger_thinker.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_staff_beams_linger_thinker.lua new file mode 100755 index 0000000..89f5479 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_staff_beams_linger_thinker.lua @@ -0,0 +1,68 @@ + +modifier_aghanim_staff_beams_linger_thinker = class({}) + +-------------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_linger_thinker:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_linger_thinker:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_linger_thinker:GetModifierAura() + return "modifier_aghanim_staff_beams_debuff" +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_linger_thinker:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_ENEMY +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_linger_thinker:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_linger_thinker:GetAuraRadius() + return self.beam_radius +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_linger_thinker:OnCreated( kv ) + self.beam_radius = self:GetAbility():GetSpecialValueFor( "beam_radius" ) + if IsServer() then + EmitSoundOn( "n_black_dragon.Fireball.Target", self:GetParent() ) + self.nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/staff_beam_linger.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( self.nFXIndex, 0, self:GetParent():GetAbsOrigin() ) + ParticleManager:SetParticleControl( self.nFXIndex, 1, Vector( self.beam_radius, 1, 1 ) ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_linger_thinker:OnDestroy() + if IsServer() then + StopSoundOn( "n_black_dragon.Fireball.Target", self:GetParent() ) + ParticleManager:DestroyParticle( self.nFXIndex, false ) + UTIL_Remove( self:GetParent() ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_linger_thinker:OnRefresh( kv ) + self.beam_radius = self:GetAbility():GetSpecialValueFor( "beam_radius" ) +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_staff_beams_thinker.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_staff_beams_thinker.lua new file mode 100755 index 0000000..b8b14de --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_staff_beams_thinker.lua @@ -0,0 +1,22 @@ + +modifier_aghanim_staff_beams_thinker = class({}) + +----------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_thinker:OnCreated( kv ) + if IsServer() then + self.linger_time = self:GetAbility():GetSpecialValueFor( "linger_time" ) + self.linger_create_interval = self:GetAbility():GetSpecialValueFor( "linger_create_interval" ) + self:StartIntervalThink( self.linger_create_interval ) + end +end + +----------------------------------------------------------------------------- + +function modifier_aghanim_staff_beams_thinker:OnIntervalThink() + if IsServer() then + CreateModifierThinker( self:GetCaster(), self:GetAbility(), "modifier_aghanim_staff_beams_linger_thinker", { duration = self.linger_time }, self:GetParent():GetAbsOrigin(), self:GetCaster():GetTeamNumber(), false ) + end +end + +----------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_summon_portals_thinker.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_summon_portals_thinker.lua new file mode 100755 index 0000000..686f613 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghanim_summon_portals_thinker.lua @@ -0,0 +1,220 @@ + +modifier_aghanim_summon_portals_thinker = class({}) + +----------------------------------------------------------------------------- + +function modifier_aghanim_summon_portals_thinker:OnCreated( kv ) + if IsServer() then + self.nMode = kv.mode + self.hTarget = EntIndexToHScript( kv.target_entindex ) + self.nDepth = kv.depth + + local vFwd = nil + if self.hTarget == nil then + vFwd = self:GetCaster():GetAbsOrigin() - self:GetParent():GetAbsOrigin() + vFwd = vFwd:Normalized() + else + vFwd = self.hTarget:GetAbsOrigin() - self:GetParent():GetAbsOrigin() + vFwd = vFwd:Normalized() + end + + local szEffect = nil + if self.nMode == self:GetAbility().PORTAL_MODE_ALL_SPEARS and self.hTarget then + self:CreateSpear() + szEffect = "particles/creatures/aghanim/portal_summon.vpcf" + self:StartIntervalThink( 0.1 ) + else + self:CreateEnemies() + szEffect = "particles/creatures/aghanim/portal_summon.vpcf" + end + + EmitSoundOn( "SeasonalConsumable.TI10.Portal.Open", self:GetParent() ) + EmitSoundOn( "SeasonalConsumable.TI10.Portal.Loop", self:GetParent() ) + + self.nPortalFX = ParticleManager:CreateParticle( szEffect, PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( self.nPortalFX, 0, self:GetParent():GetAbsOrigin() ) + ParticleManager:SetParticleControlForward( self.nPortalFX, 0, vFwd ) + + AddFOWViewer( DOTA_TEAM_GOODGUYS, self:GetParent():GetAbsOrigin(), 300.0, self:GetDuration(), false ) + GridNav:DestroyTreesAroundPoint( self:GetParent():GetAbsOrigin(), 300, false ) + end +end + +----------------------------------------------------------------------------- + +function modifier_aghanim_summon_portals_thinker:CreateSpear() + if IsServer() then + self.hSpear = CreateUnitByName( "npc_dota_boss_aghanim_spear", self:GetParent():GetAbsOrigin(), true, self:GetCaster(), self:GetCaster():GetOwner(), self:GetCaster():GetTeamNumber() ) + if self.hSpear then + self.hSpear:SetControllableByPlayer( self:GetCaster():GetPlayerOwnerID(), false ) + self.hSpear:SetOwner( self:GetCaster() ) + self.hSpear:AddEffects( EF_NODRAW ) + self.hSpear:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_rooted", {} ) + self.hSpear:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_hero_statue_pedestal", {} ) + + --self.hSpear:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_aghanim_portal_spawn_effect", {} ) + self.hSpear:FaceTowards( self.hTarget:GetAbsOrigin() ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_summon_portals_thinker:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_IGNORE_CAST_ANGLE, + } + return funcs +end + +----------------------------------------------------------------------------- + +function modifier_aghanim_summon_portals_thinker:GetModifierIgnoreCastAngle( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_aghanim_summon_portals_thinker:OnIntervalThink() + if IsServer() then + if self.hSpear then + self.hSpear:RemoveEffects( EF_NODRAW ) + self.hSpear:FaceTowards( self.hTarget:GetAbsOrigin() ) + end + end +end + +----------------------------------------------------------------------------- + +function modifier_aghanim_summon_portals_thinker:CreateEnemies() + if IsServer() then + self.Summons = {} + if 1 then + nCount = 2 + for n=1,nCount do + local vSpawnPos = self:GetParent():GetAbsOrigin() + RandomVector( 25 * nCount ) + local hSummon = CreateUnitByName( "npc_dota_creature_aghanim_minion", vSpawnPos, true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + if hSummon ~= nil then + table.insert( self.Summons, hSummon ) + hSummon.nDisableResistance = hSummon:GetDisableResistance( ) + hSummon.nUltimateDisableResistance = hSummon:GetUltimateDisableResistance( ) + hSummon:SetDisableResistance( 0 ) + hSummon:SetUltimateDisableResistance( 0 ) + hSummon:SetOwner( self:GetCaster() ) + hSummon:SetDeathXP( 0 ) + hSummon:SetMinimumGoldBounty( 0 ) + hSummon:SetMaximumGoldBounty( 0 ) + hSummon:AddEffects( EF_NODRAW ) + hSummon:SetAbsAngles( 0, RandomFloat( 0, 360 ), 0 ) + hSummon:SetMaterialGroup( "1" ) + hSummon:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_aghanim_portal_spawn_effect", { duration = self:GetRemainingTime() } ) + + end + end + else + local PossibleSummons = GameRules.Aghanim:GetSummonsForAghanim() + local Summon = nil + + while Summon == nil and self.nDepth > 1 do + for _,CurSummon in pairs( PossibleSummons ) do + if CurSummon[ "depth" ] == self.nDepth then + Summon = CurSummon + break + end + end + + if Summon == nil then + self.nDepth = self.nDepth - 1 + end + end + + if Summon then + local nCount = math.max( 1, 5 - math.floor( self.nDepth / 2 ) ) + for n=1,nCount do + local vSpawnPos = self:GetParent():GetAbsOrigin() + RandomVector( 25 * nCount ) + local hSummon = CreateUnitByName( Summon[ "unit_name" ], vSpawnPos, true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + if hSummon ~= nil then + table.insert( self.Summons, hSummon ) + hSummon.nDisableResistance = hSummon:GetDisableResistance( ) + hSummon.nUltimateDisableResistance = hSummon:GetUltimateDisableResistance( ) + hSummon:SetDisableResistance( 0 ) + hSummon:SetUltimateDisableResistance( 0 ) + hSummon:SetOwner( self:GetCaster() ) + hSummon:SetDeathXP( 0 ) + hSummon:SetMinimumGoldBounty( 0 ) + hSummon:SetMaximumGoldBounty( 0 ) + hSummon:AddEffects( EF_NODRAW ) + hSummon:SetAbsAngles( 0, RandomFloat( 0, 360 ), 0 ) + hSummon:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_aghanim_portal_spawn_effect", { duration = self:GetRemainingTime() } ) + + end + end + end + end + end +end + +----------------------------------------------------------------------------- + +function modifier_aghanim_summon_portals_thinker:OnDestroy() + if IsServer() then + if self.nMode == self:GetAbility().PORTAL_MODE_ALL_SPEARS then + self:LaunchSpear() + else + self:ReleaseEnemies() + end + StopSoundOn( "SeasonalConsumable.TI10.Portal.Open", self:GetParent() ) + StopSoundOn( "SeasonalConsumable.TI10.Portal.Loop", self:GetParent() ) + + ParticleManager:DestroyParticle( self.nPortalFX, false ) + UTIL_Remove( self:GetParent() ) + end +end + +----------------------------------------------------------------------------- + +function modifier_aghanim_summon_portals_thinker:LaunchSpear() + if IsServer() then + if self.hSpear ~= nil then + self.hSpear:AddEffects( EF_NODRAW ) + self.hSpear:ForceKill( false ) + end + + local hSpear = self:GetCaster():FindAbilityByName( "aghanim_spear" ) + if hSpear and self.hTarget then + hSpear:EndCooldown() + + EmitSoundOn( "SeasonalConsumable.TI10.Portal.Emit", self:GetParent() ) + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_portal_emit.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetAbsOrigin() ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + hSpear:LaunchSpear( self.hTarget:GetAbsOrigin(), self:GetParent():GetAbsOrigin() ) + else + print( "No spear, or no target?" ) + end + end +end + +----------------------------------------------------------------------------- + +function modifier_aghanim_summon_portals_thinker:ReleaseEnemies() + if IsServer() then + for _, Summon in pairs ( self.Summons ) do + EmitSoundOn( "SeasonalConsumable.TI10.Portal.Emit", Summon ) + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/aghanim/aghanim_portal_emit.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, Summon:GetAbsOrigin() ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + Summon:RemoveModifierByName( "modifier_aghanim_portal_spawn_effect" ) + Summon:SetAcquisitionRange( 5000 ) + Summon:SetDayTimeVisionRange( 5000 ) + Summon:SetNightTimeVisionRange( 5000 ) + Summon:SetDisableResistance( Summon.nDisableResistance ) + Summon:SetUltimateDisableResistance( Summon.nUltimateDisableResistance ) + Summon.bBossMinion = true + FindClearSpaceForUnit( Summon, Summon:GetAbsOrigin(), false ) + end + end +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghsfort_waveblaster_summon_ghost_thinker.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghsfort_waveblaster_summon_ghost_thinker.lua new file mode 100755 index 0000000..fc2a1fe --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghsfort_waveblaster_summon_ghost_thinker.lua @@ -0,0 +1,40 @@ +modifier_aghsfort_waveblaster_summon_ghost_thinker = class({}) + + +function modifier_aghsfort_waveblaster_summon_ghost_thinker:OnCreated( kv ) + if IsServer() then + self.nFXIndex = ParticleManager:CreateParticle( "particles/econ/items/ancient_apparition/ancient_apparation_ti8/ancient_ice_vortex_ti8.vpcf", PATTACH_ABSORIGIN, self:GetParent() ) + end +end + + + +------------------------------------------------------------------ + +function modifier_aghsfort_waveblaster_summon_ghost_thinker:OnDestroy() + if IsServer() then + local hCreep = CreateUnitByName( "npc_aghsfort_creature_wave_blaster_ghost", self:GetParent():GetOrigin(), true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + if hCreep ~= nil then + hCreep:SetOwner( self:GetCaster() ) + hCreep:SetControllableByPlayer( self:GetCaster():GetPlayerOwnerID(), false ) + hCreep:SetInitialGoalEntity( self:GetCaster():GetInitialGoalEntity() ) + hCreep:SetDeathXP( 0 ) + hCreep:SetMinimumGoldBounty( 0 ) + hCreep:SetMaximumGoldBounty( 0 ) + end + + local nExplosionFX = ParticleManager:CreateParticle( "particles/units/heroes/hero_ancient_apparition/ancient_apparition_ice_blast_explode.vpcf", PATTACH_CUSTOMORIGIN, NULL ) + ParticleManager:SetParticleControl( nExplosionFX, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nExplosionFX, 3, self:GetParent():GetOrigin() ) + ParticleManager:ReleaseParticleIndex( nExplosionFX ) + EmitSoundOn( "Aghsfort_Abilty_Specials.Tusk.Snowball_Damage_End", hCreep ) + + + ParticleManager:DestroyParticle( self.nFXIndex, true ) + UTIL_Remove( self:GetParent() ) + end +end + +------------------------------------------------------------------ + + \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghsfort_wisp_autoattack.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghsfort_wisp_autoattack.lua new file mode 100755 index 0000000..e9a9c8b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_aghsfort_wisp_autoattack.lua @@ -0,0 +1,46 @@ + +modifier_aghsfort_wisp_autoattack = class({}) + +-------------------------------------------------------------------------------- + +function modifier_aghsfort_wisp_autoattack:OnCreated( kv ) + self.attack_range = self:GetParent():Script_GetAttackRange() + self.attack_interval = self:GetAbility():GetSpecialValueFor( "attack_interval" ) + + self:StartIntervalThink( self.attack_interval ) +end + +-------------------------------------------------------------------------------- + +function modifier_aghsfort_wisp_autoattack:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_aghsfort_wisp_autoattack:OnRefresh( kv ) + self.radius =self:GetParent():Script_GetAttackRange() + self.attack_interval = self:GetAbility():GetSpecialValueFor( "attack_interval" ) +end + + +function modifier_aghsfort_wisp_autoattack:OnIntervalThink() + if IsServer() then + + if not self:GetParent():IsAlive() then + return -1 + end + + if not self:GetParent():FindModifierByName("modifier_aghsfort_wisp_tether") then + local hEnemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), nil, self.attack_range, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #hEnemies > 0 then + for _, hEnemy in pairs( hEnemies ) do + if hEnemy ~= nil and hEnemy:IsAlive() == true then + self:GetParent():PerformAttack( hEnemy, true, true, true, true, true, false, true ) + break + end + end + end + end + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_baby_broodmother_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_baby_broodmother_passive.lua new file mode 100755 index 0000000..c4a3a38 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_baby_broodmother_passive.lua @@ -0,0 +1,81 @@ + +modifier_baby_broodmother_passive = class({}) + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_passive:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_passive:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_passive:OnCreated( kv ) + if IsServer() then + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.landing_damage = self:GetAbility():GetSpecialValueFor( "landing_damage" ) + self.launch_duration = self:GetAbility():GetSpecialValueFor( "launch_duration" ) + self.knockback_duration = self:GetAbility():GetSpecialValueFor( "knockback_duration" ) + self.knockback_distance = self:GetAbility():GetSpecialValueFor( "knockback_distance" ) + self.knockback_height = self:GetAbility():GetSpecialValueFor( "knockback_height" ) + + self:StartIntervalThink( self.launch_duration ) -- this is hacky: launch duration (0.75) matches the enchant totem leap duration; ideally we'd create the thinker using OnModifierAdded or similar + end +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_passive:OnIntervalThink() + if IsServer() then + self:DamageEnemiesOnLanding() + + self:StartIntervalThink( -1 ) + + self:Destroy() + end +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_passive:DamageEnemiesOnLanding() + if IsServer() then + local hEnemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_NONE, 0, false ) + if #hEnemies > 0 then + for _, hEnemy in pairs( hEnemies ) do + if hEnemy ~= nil and ( not hEnemy:IsMagicImmune() ) and ( not hEnemy:IsInvulnerable() ) then + local DamageInfo = + { + victim = hEnemy, + attacker = self:GetCaster(), + ability = self:GetAbility(), + damage = self.landing_damage, + damage_type = self:GetAbility():GetAbilityDamageType(), + } + ApplyDamage( DamageInfo ) + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_passive:CheckState() + local state = + { + [ MODIFIER_STATE_UNSELECTABLE ] = true, + [ MODIFIER_STATE_OUT_OF_GAME ] = true, + [ MODIFIER_STATE_INVULNERABLE ] = true, + [ MODIFIER_STATE_MAGIC_IMMUNE ] = true, + [ MODIFIER_STATE_DISARMED ] = true, + } + + return state +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_baby_broodmother_venom_pool.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_baby_broodmother_venom_pool.lua new file mode 100755 index 0000000..d2efc1c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_baby_broodmother_venom_pool.lua @@ -0,0 +1,104 @@ + +modifier_baby_broodmother_venom_pool = class({}) + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_venom_pool:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_venom_pool:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_venom_pool:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_venom_pool:GetModifierAura() + return "modifier_viper_nethertoxin" +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_venom_pool:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_ENEMY +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_venom_pool:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_venom_pool:GetAuraRadius() + return self.radius +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_venom_pool:OnCreated( kv ) + if IsServer() then + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + + self.nFXIndex = ParticleManager:CreateParticle( "particles/baby_brood_venom_pool.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( self.nFXIndex, 0, self:GetCaster():GetAbsOrigin() ) + ParticleManager:SetParticleControl( self.nFXIndex, 1, Vector( self.radius, 1, 1 ) ) + + EmitSoundOn( "Hero_Viper.Nethertoxin", self:GetCaster() ) + + self:StartIntervalThink( 1 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_venom_pool:OnIntervalThink() + if IsServer() then + if not self:GetCaster() then + self:Destroy() + return + end + + local hEnemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + if #hEnemies > 0 then + for _, hEnemy in pairs( hEnemies ) do + if hEnemy and hEnemy:IsInvulnerable() == false and hEnemy:IsMagicImmune() == false then + local damage = { + victim = hEnemy, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = self:GetAbility():GetAbilityDamageType(), + ability = self:GetAbility() + } + + ApplyDamage( damage ) + + EmitSoundOn( "Hero_Viper.NetherToxin.Damage", hEnemy ) + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_baby_broodmother_venom_pool:OnDestroy() + if IsServer() then + ParticleManager:DestroyParticle( self.nFXIndex, false ) + self:GetParent():StopSound( "Hero_Viper.Nethertoxin" ) + UTIL_Remove( self:GetParent() ) + end +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bandit_archer_arrow_debuff.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bandit_archer_arrow_debuff.lua new file mode 100755 index 0000000..6a088a4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bandit_archer_arrow_debuff.lua @@ -0,0 +1,33 @@ + +modifier_bandit_archer_arrow_debuff = class({}) + +-------------------------------------------------------------------------------- + +function modifier_bandit_archer_arrow_debuff:OnCreated( kv ) + if IsServer() then + self.nBreakFX = ParticleManager:CreateParticle( "particles/generic_gameplay/generic_break.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetParent() ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_bandit_archer_arrow_debuff:OnDestroy() + if IsServer() then + if self.nBreakFX ~= nil then + ParticleManager:DestroyParticle( self.nBreakFX, false ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_bandit_archer_arrow_debuff:CheckState() + local state = + { + [ MODIFIER_STATE_PASSIVES_DISABLED ] = true, + } + + return state +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_landmine_detonate.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_landmine_detonate.lua new file mode 100755 index 0000000..bd387e9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_landmine_detonate.lua @@ -0,0 +1,99 @@ +modifier_bomb_squad_landmine_detonate = class({}) + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_landmine_detonate:OnCreated( kv ) + if IsServer() then + self.radius = self:GetAbility():GetSpecialValueFor( "detonate_radius" ) + self.damage = self:GetAbility():GetSpecialValueFor( "detonate_damage" ) + self.duration = self:GetRemainingTime() + self.flExplodeTime = GameRules:GetGameTime() + self.duration - 0.2 + + self:StartIntervalThink( 0 ) + end +end + + +-------------------------------------------------------------- + +function modifier_bomb_squad_landmine_detonate:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_DEATH, + } + + return funcs +end +-------- + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_landmine_detonate:OnIntervalThink() + if IsServer() then + + local nFXIndex = ParticleManager:CreateParticle( "particles/econ/events/darkmoon_2017/darkmoon_calldown_marker_ring.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.radius, self.radius, self.radius ) ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( self:GetRemainingTime() / 6, self:GetRemainingTime() / 6, self:GetRemainingTime() / 6 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Creature_Bomb_Squad.LandMine.Priming", self:GetParent() ) + + if GameRules:GetGameTime() > self.flExplodeTime then + self:Detonate() + end + + self:StartIntervalThink( self:GetRemainingTime() / 3 ) + + end +end + + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_landmine_detonate:OnDestroy() + if IsServer() then + self:GetParent():ForceKill( false ) + end +end + +function modifier_bomb_squad_landmine_detonate:Detonate() + if IsServer() then + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetCaster(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS, 0, false ) + if #enemies > 0 then + for _,enemy in pairs(enemies) do + if enemy ~= nil and ( not enemy:IsMagicImmune() ) and ( not enemy:IsInvulnerable() ) then + local DamageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + ability = self, + damage = self.damage, + damage_type = DAMAGE_TYPE_MAGICAL, + } + ApplyDamage( DamageInfo ) + end + end + end + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_techies/techies_land_mine_explode.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( 1.0, 1.0, self.radius ) ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 1.0, 1.0, self.radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Creature_Bomb_Squad.LandMine.Detonate", self:GetParent() ) + self:GetParent():ForceKill( false ) + end + +end + + +function modifier_bomb_squad_landmine_detonate:OnDeath( params ) + if IsServer() then + if params.unit == self:GetParent() then + params.unit:AddEffects( EF_NODRAW ) + end + end +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_landmine_intrinsic.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_landmine_intrinsic.lua new file mode 100755 index 0000000..74fcbec --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_landmine_intrinsic.lua @@ -0,0 +1,112 @@ +modifier_bomb_squad_landmine_intrinsic = class({}) + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_landmine_intrinsic:CheckState() + local state = + { + [MODIFIER_STATE_NO_UNIT_COLLISION] = true, + [MODIFIER_STATE_ROOTED] = true, + [MODIFIER_STATE_MAGIC_IMMUNE] = true, + } + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_landmine_intrinsic:DeclareFunctions() + local funcs = { + MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE, + MODIFIER_EVENT_ON_ATTACKED, + MODIFIER_EVENT_ON_DEATH, + } + + return funcs + +end + +---------------------------------------------------------------------------------- + +function modifier_bomb_squad_landmine_intrinsic:IsHidden() + return true +end + +---------------------------------------------------------------------------------- + +function modifier_bomb_squad_landmine_intrinsic:IsPurgable() + return false +end + +---------------------------------------------------------------------------------- + +function modifier_bomb_squad_landmine_intrinsic:CanParentBeAutoAttacked() + return true +end + +------------------------------------------------------------ + +function modifier_bomb_squad_landmine_intrinsic:GetAbsoluteNoDamageMagical( params ) + return 1 +end + +------------------------------------------------------------ + +function modifier_bomb_squad_landmine_intrinsic:GetAbsoluteNoDamagePure( params ) + return 1 +end + +------------------------------------------------------------ + +function modifier_bomb_squad_landmine_intrinsic:GetAbsoluteNoDamagePhysical( params ) + return 1 +end + +------------------------------------------------------------ + +function modifier_bomb_squad_landmine_intrinsic:GetModifierIncomingDamage_Percentage( params ) + return -100 +end + + +------------------------------------------------------------ + +function modifier_bomb_squad_landmine_intrinsic:OnAttacked( params ) + if IsServer() then + + if params.target == self:GetParent() then + + self:GetParent():ForceKill( false ) + end + end + + return 1 +end + +------------------------------------------------------------ + +function modifier_bomb_squad_landmine_intrinsic:OnDeath( params ) + if IsServer() then + if params.unit == self:GetParent() then + local iChainReactionRadius = self:GetAbility():GetSpecialValueFor( "chain_radius" ) + local hFriendlyMines = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), nil, iChainReactionRadius, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #hFriendlyMines > 0 then + for _,entity in pairs (hFriendlyMines) do + if entity ~= nil and entity:IsNull() == false and entity ~= self:GetParent() and entity:IsAlive() and entity:GetUnitName() == self:GetParent():GetUnitName() and not entity:FindModifierByName("modifier_bomb_squad_landmine_detonate") then + local hAbility = entity:FindAbilityByName("bomb_squad_landmine_detonate") + if hAbility ~= nil then + entity:AddNewModifier( entity, hAbility, "modifier_bomb_squad_landmine_detonate", { duration = hAbility:GetSpecialValueFor( "chain_duration" ) } ) + end + end + end + end + + self:GetParent():AddEffects( EF_NODRAW ) + end + + end + + return 0 +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_mine_charge.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_mine_charge.lua new file mode 100755 index 0000000..dc2de33 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_mine_charge.lua @@ -0,0 +1,152 @@ + +modifier_bomb_squad_mine_charge = class({}) + +------------------------------------------------------- + +function modifier_bomb_squad_mine_charge:IsPurgable() + return false +end +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_mine_charge:OnCreated( kv ) + if IsServer() then + self.vTarget = Vector( kv["vLocX"], kv["vLocY"], kv["vLocZ"] ) + self.vDir = self.vTarget - self:GetParent():GetOrigin() + self.vDir = self.vDir:Normalized() + self.szMineUnit = "npc_aghsfort_creature_bomb_squad_landmine" + self.speed = self:GetAbility():GetSpecialValueFor( "speed" ) + + self.mine_spawn_interval = self:GetAbility():GetSpecialValueFor( "mine_spawn_interval" ) + self.max_launch_distance = self:GetAbility():GetSpecialValueFor( "max_launch_distance" ) + self.flLastMineTime = GameRules:GetGameTime() + self:GetParent():StartGesture( ACT_DOTA_RUN ) + + + self:OnIntervalThink() + self:StartIntervalThink( 0.33 ) + if self:ApplyHorizontalMotionController() == false then + self:Destroy() + return + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_mine_charge:OnIntervalThink() + if IsServer() then + if GameRules:GetGameTime() - self.flLastMineTime > self.mine_spawn_interval then + self:SpawnMine() + end + if self:GetParent():IsStunned() == true then + self:Destroy() + end + + end +end + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_mine_charge:UpdateHorizontalMotion( me, dt ) + if IsServer() then + local vNewLocation = self:GetParent():GetOrigin() + self.vDir * self.speed * dt + me:SetOrigin( vNewLocation ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_mine_charge:SpawnMine() + if IsServer() then + local hUnit = self:GetParent() + if hUnit == nil then + return + end + if not hUnit:IsAlive() then + return + end + + local hMine = CreateUnitByName( self.szMineUnit, self:GetParent():GetAbsOrigin(), true, self:GetParent(), self:GetParent(), self:GetParent():GetTeamNumber() ) + local nMaxDistance = self.max_launch_distance + -- spawn the mine a little bit bit behind us + local vLoc = self:GetParent():GetOrigin() - self.vDir * nMaxDistance + + hMine:SetDeathXP( 0 ) + hMine:SetMinimumGoldBounty( 0 ) + hMine:SetMaximumGoldBounty( 0 ) + + local kv = + { + vLocX = vLoc.x, + vLocY = vLoc.y, + vLocZ = vLoc.z, + } + hMine:SetAbsAngles( 0 , vLoc.y, 0 ) + + hMine:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_frostivus2018_broodbaby_launch", kv ) + self.flLastMineTime = GameRules:GetGameTime() + EmitSoundOn( "Creature_Bomb_Squad.LandMine.Plant", hMine ) + end + + return +end + + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_mine_charge:OnHorizontalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_mine_charge:OnDestroy() + if IsServer() then + self:GetParent():RemoveGesture( ACT_DOTA_RUN ) + self:GetParent():RemoveHorizontalMotionController( self ) + end +end + +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_mine_charge:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_DISABLE_TURNING, + } + + return funcs +end + + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_mine_charge:GetModifierDisableTurning(params) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_mine_charge:GetPriority() + return MODIFIER_PRIORITY_SUPER_ULTRA + 100 +end + +----------------------------------------------------------------------------------------- + +function modifier_bomb_squad_mine_charge:CheckState() + local state = + { + [MODIFIER_STATE_HEXED] = false, + [MODIFIER_STATE_ROOTED] = false, + [MODIFIER_STATE_SILENCED] = false, + [MODIFIER_STATE_STUNNED] = false, + [MODIFIER_STATE_FROZEN] = false, + [MODIFIER_STATE_FEARED] = false, + } + return state +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_self_cast.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_self_cast.lua new file mode 100755 index 0000000..b698591 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_self_cast.lua @@ -0,0 +1,154 @@ +modifier_bomb_squad_self_cast = class({}) + +require( "utility_functions" ) -- require utility_functions early (other required files may use its functions) +require( "aghanim_utility_functions" ) -- require utility_functions early (other required files may use its functions) +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_self_cast:IsPurgable() + return false; +end + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_self_cast:IsHidden() + return true; +end + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_self_cast:OnCreated( kv ) + if IsServer() then + self.hMines = { } + self.max_active_mines = self:GetAbility():GetSpecialValueFor( "max_active_mines" ) + self.mine_spawn_interval = self:GetAbility():GetSpecialValueFor( "mine_spawn_interval" ) + self.max_launch_distance = self:GetAbility():GetSpecialValueFor( "max_launch_distance" ) + self.flLastMineTime = GameRules:GetGameTime() + self.flLastOrderTime = GameRules:GetGameTime() - 5 + self.bActivated = false; + self.szMineUnit = "npc_aghsfort_creature_bomb_squad_landmine" + + self:OnIntervalThink() + end +end + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_self_cast:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_DEATH, + MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE, + } + + return funcs +end + +function modifier_bomb_squad_self_cast:OnIntervalThink() + if IsServer() then + + if GameRules:GetGameTime() - self.flLastOrderTime > 5 then + self:DoMove() + + end + + if GameRules:GetGameTime() - self.flLastMineTime > self.mine_spawn_interval then + self:SpawnMine() + end + + if self.bActivated == false then + self.bActivated = true + self:StartIntervalThink( 1 ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_self_cast:SpawnMine() + if IsServer() then + local hUnit = self:GetParent() + if hUnit == nil then + return + end + if not hUnit:IsAlive() then + return + end + + if #self.hMines > self.max_active_mines then + return + end + + local hMine = CreateUnitByName( self.szMineUnit, self:GetParent():GetAbsOrigin(), true, self:GetParent(), self:GetParent(), self:GetParent():GetTeamNumber() ) + local nMaxDistance = self.max_launch_distance + local vLoc = FindPathablePositionNearby(self:GetParent():GetAbsOrigin(), 150, nMaxDistance ) + table.insert( self.hMines, hMine ) + + local heroes = FindRealLivingEnemyHeroesInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetAbsOrigin(), FIND_UNITS_EVERYWHERE ) + local hero = heroes[RandomInt(1, #heroes)] + if hero ~= nil then + hMine:SetInitialGoalEntity( hero ) + else + hMine:SetInitialGoalEntity( self:GetParent().hInitialGoalEntity ) + end + + hMine:SetDeathXP( 0 ) + hMine:SetMinimumGoldBounty( 0 ) + hMine:SetMaximumGoldBounty( 0 ) + + local kv = + { + vLocX = vLoc.x, + vLocY = vLoc.y, + vLocZ = vLoc.z, + } + hMine:SetAbsAngles( 0 , vLoc.y, 0 ) + + hMine:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_frostivus2018_broodbaby_launch", kv ) + self.flLastMineTime = GameRules:GetGameTime() + EmitSoundOn( "Creature_Bomb_Squad.LandMine.Plant", hMine ) + end + + return +end + + + +-------------------------------------------------------------------------------- + + +function modifier_bomb_squad_self_cast:DoMove() + if IsServer() then + + for i=1,4 do + local vLoc = FindPathablePositionNearby(self:GetParent():GetAbsOrigin(), 800, 2000 ) + + if GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vLoc ) then + + ExecuteOrderFromTable({ + UnitIndex = self:GetParent():entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = vLoc, + Queue = false, + }) + self.flLastOrderTime = GameRules:GetGameTime() + + break + end + end + end + return +end + +-------------------------------------------------------------------------------- + + +function modifier_bomb_squad_self_cast:OnDeath( params ) + if IsServer() then + if TableContainsValue (self.hMines, params.unit) then + local k = TableFindKey(self.hMines, params.unit) + params.unit:AddEffects( EF_NODRAW ) + table.remove(self.hMines, k) + end + end +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_stasis_trap.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_stasis_trap.lua new file mode 100755 index 0000000..6c558b1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomb_squad_stasis_trap.lua @@ -0,0 +1,91 @@ +modifier_bomb_squad_stasis_trap = class({}) +-------------------------------------------------------------------------------- +function modifier_bomb_squad_stasis_trap:IsHidden() + return true +end +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_stasis_trap:OnCreated() + self.radius = self:GetAbility():GetSpecialValueFor( "detonate_radius" ) + self.activation_delay = self:GetAbility():GetSpecialValueFor( "activation_delay" ) + self.stun_duration = self:GetAbility():GetSpecialValueFor( "stun_duration" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + self.bActivated = false + self.bTriggered = false + self:StartIntervalThink( self.activation_delay ) +end + +-------------------------------------------------------------------------------- + +function modifier_bomb_squad_stasis_trap:OnIntervalThink() + if IsServer() then + if self.bActivated == false then + self.bActivated = true + + EmitSoundOn("Hero_Techies.StasisTrap.Plant", self:GetParent()) + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_techies/techies_stasis_trap_plant.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControlOrientation( nFXIndex, 1, self:GetParent():GetForwardVector(), self:GetParent():GetRightVector(), self:GetParent():GetUpVector() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + self:StartIntervalThink( 0.1 ) + end + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS, 0, false ) + if #enemies > 0 then + self:Detonate() + end + end +end + +function modifier_bomb_squad_stasis_trap:Detonate() + if IsServer() then + local nFXIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_techies/techies_stasis_trap_explode.vpcf", PATTACH_WORLDORIGIN, self:GetParent()) + ParticleManager:SetParticleControl(nFXIndex, 0, self:GetParent():GetAbsOrigin()) + ParticleManager:SetParticleControl(nFXIndex, 1, Vector(self.radius , 1, 1)) + ParticleManager:SetParticleControl(nFXIndex, 3, self:GetParent():GetAbsOrigin()) + ParticleManager:ReleaseParticleIndex(nFXIndex) + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS, 0, false ) + if #enemies > 0 then + EmitSoundOn("Hero_Techies.StasisTrap.Stun", self:GetParent()) + for _,enemy in pairs(enemies) do + --apply stun modifier + if enemy ~= nil and ( not enemy:IsMagicImmune() ) and ( not enemy:IsInvulnerable() ) then + local DamageInfo = + { + victim = enemy, + attacker = self:GetParent(), + ability = self:GetAbility(), + damage = self.damage, + damage_type = DAMAGE_TYPE_MAGICAL, + } + ApplyDamage( DamageInfo ) + enemy:AddNewModifier(self:GetParent(), self:GetAbility(), "modifier_techies_stasis_trap_stunned", {duration = self.stun_duration}) + end + end + end + self:Destroy() + end +end + +function modifier_bomb_squad_stasis_trap:OnDeath( params ) + if IsServer() then + if params.unit == self:GetParent() then + params.unit:AddEffects( EF_NODRAW ) + end + end +end + +-------------------------------------------------------------------------------- +function modifier_bomb_squad_stasis_trap:OnDestroy() + if IsServer() then + if self:GetParent() ~= nil and self:GetParent():IsAlive() then + self:GetParent():ForceKill(false) + end + end +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomber_death_explosion.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomber_death_explosion.lua new file mode 100755 index 0000000..0510d63 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomber_death_explosion.lua @@ -0,0 +1,158 @@ + +modifier_bomber_death_explosion = class({}) + +-------------------------------------------------------------- + +function modifier_bomber_death_explosion:IsHidden() + return true +end + +-------------------------------------------------------------- + +function modifier_bomber_death_explosion:IsPurgable() + return false +end + +-------------------------------------------------------------- + +function modifier_bomber_death_explosion:OnCreated() + local min_delay = self:GetAbility():GetSpecialValueFor( "min_delay_time" ) + local max_delay = self:GetAbility():GetSpecialValueFor( "max_delay_time" ) + --printf( 'min = %f, max = %f\n', min_delay, max_delay ) + + EmitSoundOn( "Ability.Bomber.Priming", self:GetParent() ) + + self.is_ascension_ability = self:GetAbility():GetSpecialValueFor( "is_ascension_ability" ) + + local delay = RandomFloat( min_delay, max_delay ) + self:StartIntervalThink( delay ) + + if IsServer() then + + if self.is_ascension_ability == 0 then + self:GetParent():StartGesture( ACT_DOTA_VICTORY ) + else + local nOverheadFX = ParticleManager:CreateParticle( "particles/units/heroes/hero_gyrocopter/gyro_guided_missile_target.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetParent() ) + self:AddParticle( nOverheadFX, false, false, -1, false, false ) + end + + local radius = self:GetAbility():GetSpecialValueFor( "radius" ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_calldown_marker_ring.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( radius, radius, radius ) ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( delay, delay, delay ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end +end + +--------------------------------------------------------- + +function modifier_bomber_death_explosion:CheckState() + if self.is_ascension_ability == 1 then + return {} + end + + local state = + { + [MODIFIER_STATE_INVULNERABLE] = true, + [MODIFIER_STATE_ROOTED] = true, + [MODIFIER_STATE_DISARMED] = true, + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + [MODIFIER_STATE_UNSELECTABLE] = true, + } + + return state +end + +-------------------------------------------------------------- + +function modifier_bomber_death_explosion:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MIN_HEALTH, + MODIFIER_PROPERTY_MODEL_SCALE + } + + return funcs +end +------------------------------------------------------------------- + +function modifier_bomber_death_explosion:OnIntervalThink() + if not IsServer() then + return + end + + if self:GetAbility() == nil then + return + end + + local damage = self:GetAbility():GetSpecialValueFor( "damage" ) + local radius = self:GetAbility():GetSpecialValueFor( "radius" ) + + EmitSoundOn( "Ability.Bomber.Detonate", self:GetParent() ) + + local nFXIndex2 = ParticleManager:CreateParticle( "particles/units/heroes/hero_techies/techies_remote_mines_detonate.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex2, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex2, 1, Vector( radius, radius, radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex2 ) + + local nTeam = DOTA_UNIT_TARGET_TEAM_ENEMY + if self.is_ascension_ability == 1 then + nTeam = DOTA_UNIT_TARGET_TEAM_FRIENDLY + end + + local entities = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), nil, radius, nTeam, + DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + + if #entities > 0 then + for _,entity in pairs(entities) do + if entity ~= nil and entity:IsNull() == false and entity ~= self:GetParent() and ( not entity:IsMagicImmune() ) and ( not entity:IsInvulnerable() ) then + local DamageInfo = + { + victim = entity, + attacker = self:GetCaster(), + ability = self, + damage = damage, + damage_type = DAMAGE_TYPE_MAGICAL, + } + if self.is_ascension_ability == 1 then + DamageInfo.damage = DamageInfo.damage * entity:GetMaxHealth() / 100.0 + DamageInfo.damage_type = DAMAGE_TYPE_PURE + end + ApplyDamage( DamageInfo ) + end + end + end + + if self.is_ascension_ability == 0 then + self:GetParent():AddEffects( EF_NODRAW ) + self:GetParent():ForceKill( false ) + else + self:Destroy() + end + +end + +-------------------------------------------------------------------------------- + +function modifier_bomber_death_explosion:GetMinHealth( params ) + if IsServer() and self.is_ascension_ability == 0 then + return 1 + end + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_bomber_death_explosion:GetModifierModelScale( params ) + if self:GetCaster() == nil then + return 0 + end + + if self:GetCaster():PassivesDisabled() or self.is_ascension_ability == 1 then + return 0 + end + + return 70 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomber_death_explosion_trigger.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomber_death_explosion_trigger.lua new file mode 100755 index 0000000..888890f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomber_death_explosion_trigger.lua @@ -0,0 +1,45 @@ + +modifier_bomber_death_explosion_trigger = class({}) + +-------------------------------------------------------------- + +function modifier_bomber_death_explosion_trigger:IsHidden() + return true +end + +-------------------------------------------------------------- + +function modifier_bomber_death_explosion_trigger:IsPurgable() + return false +end + +-------------------------------------------------------------- + +function modifier_bomber_death_explosion_trigger:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE_KILLCREDIT, + } + + return funcs +end +------------------------------------------------------------------- + +function modifier_bomber_death_explosion_trigger:OnTakeDamageKillCredit( params ) + if IsServer() then + local flDamage = params.damage + + --printf( 'Take Damage Kill Credit, damage = %f', flDamage ) + + if params.target == self:GetParent() then + local health = self:GetParent():GetHealth() + --printf( 'health = %d, damage = %f\n', health, flDamage ) + if flDamage >= health then + self:GetParent():AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_bomber_death_explosion", { delay = 2 } ) + end + end + + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomber_suicide_on_attack.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomber_suicide_on_attack.lua new file mode 100755 index 0000000..18ca7b4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_bomber_suicide_on_attack.lua @@ -0,0 +1,59 @@ + +modifier_bomber_suicide_on_attack = class({}) + +-------------------------------------------------------------- + +function modifier_bomber_suicide_on_attack:IsHidden() + return true +end + +-------------------------------------------------------------- + +function modifier_bomber_suicide_on_attack:IsPurgable() + return false +end + +-------------------------------------------------------------- + +function modifier_bomber_suicide_on_attack:OnCreated( kv ) + self.suicide_chance = 0 + local hAbility = self:GetAbility() + if hAbility ~= nil then + self.suicide_chance = hAbility:GetSpecialValueFor( "suicide_chance" ) + else + print( 'modifier_bomber_suicide_on_attack:OnCreated() - hAbility is nil????' ) + end +end + +-------------------------------------------------------------- + +function modifier_bomber_suicide_on_attack:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_ATTACK_LANDED + } + + return funcs +end + +-------------------------------------------------------------- + +function modifier_bomber_suicide_on_attack:OnAttackLanded( params ) + if IsServer() then + if params.attacker == self:GetParent() and RollPercentage( self.suicide_chance ) then + local damage = self:GetParent():GetHealth() + 1 + local DamageInfo = + { + victim = self:GetParent(), + attacker = self:GetParent(), + ability = self:GetAbility(), + damage = damage, + damage_type = DAMAGE_TYPE_PURE, + } + ApplyDamage( DamageInfo ) + end + end + + return 0 +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_timbersaw_chakram_dance.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_timbersaw_chakram_dance.lua new file mode 100755 index 0000000..8dce354 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_timbersaw_chakram_dance.lua @@ -0,0 +1,272 @@ +modifier_boss_timbersaw_chakram_dance = class({}) + +----------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:IsHidden() + return true +end + +----------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:GetPriority() + return MODIFIER_PRIORITY_SUPER_ULTRA +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:CheckState() + local state = + { + [MODIFIER_STATE_HEXED] = false, + [MODIFIER_STATE_ROOTED] = false, + [MODIFIER_STATE_SILENCED] = false, + [MODIFIER_STATE_STUNNED] = false, + } + return state +end + +----------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:OnCreated( kv ) + if IsServer() then + + self.is_ascension_ability = kv[ "is_ascension_ability" ] + self.num_chakrams = self:GetAbility():GetSpecialValueFor( "num_chakrams" ) + self.interval = self:GetAbility():GetSpecialValueFor( "interval" ) + self.short_range = self:GetAbility():GetSpecialValueFor( "short_range" ) + self.long_range = self:GetAbility():GetSpecialValueFor( "long_range" ) + + local flInterval = self.interval + if self.is_ascension_ability == 1 then + flInterval = self:GetAbility():GetSpecialValueFor( "spawn_interval" ) + self.spawn_count = self:GetAbility():GetSpecialValueFor( "spawn_count" ) + end + + self.radius = kv[ "radius" ] + self.nAngleStepPerChakram = 360 / self.num_chakrams + self.nAngleStepPerInterval = self.nAngleStepPerChakram / 2 + self.bLongRange = true + self.Angle = QAngle( 0, 0, 0 ) + self.Chakrams = {} + + self:StartIntervalThink( flInterval ) + self:OnIntervalThink() + end +end + +----------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:OnDestroy() + if IsServer() then + for _,Chakram in pairs ( self.Chakrams ) do + if Chakram.bReturning == false then + local vLocation = ProjectileManager:GetLinearProjectileLocation( Chakram.nProjectileHandle ) + self:ReturnChakram( Chakram, vLocation ) + end + end + end +end + +----------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:OnIntervalThink() + if IsServer() then + + local Angle = QAngle( self.Angle.x, self.Angle.y, self.Angle.z ) + + for i=1,self.num_chakrams do + local flDist = self.short_range + if self.bLongRange == true then + flDist = self.long_range + end + + local flSpeed = ( flDist / self.interval ) * 2 -- need enough time to go out and back + local vVelocity = ( RotatePosition( Vector( 0, 0, 0 ), Angle, Vector( 1, 0, 0 ) ) ) * flSpeed + + self:LaunchOutgoingChakram( vVelocity, flDist ) + + self.bLongRange = not self.bLongRange + Angle.y = Angle.y + self.nAngleStepPerChakram + end + EmitSoundOn( "Boss_Timbersaw.Chakram.Cast", self:GetParent() ) + self.Angle.y = self.Angle.y + self.nAngleStepPerInterval + + if self.is_ascension_ability == 1 then + self.spawn_count = self.spawn_count - 1 + if self.spawn_count <= 0 then + self:StartIntervalThink( -1 ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:ChooseRandomPointsOnEdges() + + local hRoom = self:GetCaster().Encounter:GetRoom() + local vMins = hRoom:GetMins() + local vMaxs = hRoom:GetMaxs() + local vDelta = ( vMaxs - vMins ) * 0.15 + local vClampedMins = Vector( vMins.x + vDelta.x, vMins.y + vDelta.y, vMins.z ) + local vClampedMaxs = Vector( vMaxs.x - vDelta.x, vMaxs.y - vDelta.y, vMaxs.z ) + local retVal = + { + vSpawnOrigin = Vector( vClampedMins.x, vClampedMins.y, vMins.z ), + vDestination = Vector( vClampedMaxs.x, vClampedMaxs.y, vMaxs.z ), + } + + local nSide = math.random( 1,4 ) + if nSide <= 2 then + if nSide == 1 then + retVal.vSpawnOrigin.x = vMins.x + retVal.vDestination.x = vMaxs.x + else + retVal.vSpawnOrigin.x = vMaxs.x + retVal.vDestination.x = vMins.x + end + retVal.vSpawnOrigin.y = RandomFloat( vClampedMins.y, vClampedMaxs.y ) + retVal.vDestination.y = RandomFloat( vClampedMins.y, vClampedMaxs.y ) + else + if nSide == 3 then + retVal.vSpawnOrigin.y = vMins.y + retVal.vDestination.y = vMaxs.y + else + retVal.vSpawnOrigin.y = vMaxs.y + retVal.vDestination.y = vMins.y + end + retVal.vSpawnOrigin.x = RandomFloat( vClampedMins.x, vClampedMaxs.x ) + retVal.vDestination.x = RandomFloat( vClampedMins.x, vClampedMaxs.x ) + end + + retVal.vDestination.z = retVal.vSpawnOrigin.z + + return retVal + +end + +----------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:LaunchOutgoingChakram( vVel, flDist ) + if IsServer() then + + local projectileInfo = + { + Ability = self:GetAbility(), + vSpawnOrigin = self:GetCaster():GetAbsOrigin(), + fStartRadius = self.radius, + fEndRadius = self.radius, + vVelocity = vVel, + fDistance = flDist, + Source = self:GetParent(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + } + + local Chakram = {} + + local flSpeed = vVel:Length2D() + if self.is_ascension_ability == 1 then + local pts = self:ChooseRandomPointsOnEdges() + projectileInfo.vSpawnOrigin = pts.vSpawnOrigin + projectileInfo.vVelocity = ( pts.vDestination - pts.vSpawnOrigin ):Normalized() * flSpeed + Chakram.vReturnLocation = projectileInfo.vSpawnOrigin + end + + if flDist == self.long_range then + projectileInfo[ "EffectName" ] = "particles/units/heroes/hero_shredder/shredder_chakram.vpcf" + Chakram.bBlue = false + else + projectileInfo[ "EffectName" ] = "particles/units/heroes/hero_shredder/shredder_chakram_aghs.vpcf" + Chakram.bBlue = true + end + Chakram.flDist = flDist + Chakram.flSpeed = flSpeed + Chakram.bReturning = false + Chakram.nProjectileHandle = ProjectileManager:CreateLinearProjectile( projectileInfo ) + table.insert( self.Chakrams, Chakram.nProjectileHandle, Chakram ) + end +end + +----------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:LaunchIncomingChakram( vSpawnOrigin, vReturnLocation, flSpeed, flDist ) + if IsServer() then + + if vReturnLocation == nil then + vReturnLocation = self:GetParent():GetAbsOrigin() + flSpeed = flDist -- Seems like a bug in the original boss encounter, but preserving the behavior + end + + local vDir = vReturnLocation - vSpawnOrigin + vDir.z = 0.0 + vDir = vDir:Normalized() + + local projectileInfo = + { + Ability = self:GetAbility(), + vSpawnOrigin = vSpawnOrigin, + fStartRadius = self.radius, + fEndRadius = self.radius, + vVelocity = vDir * flSpeed, + fDistance = flDist, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + } + + local Chakram = {} + if flDist == self.long_range then + projectileInfo[ "EffectName" ] = "particles/units/heroes/hero_shredder/shredder_chakram.vpcf" + Chakram.bBlue = false + else + projectileInfo[ "EffectName" ] = "particles/units/heroes/hero_shredder/shredder_chakram_aghs.vpcf" + Chakram.bBlue = true + end + + Chakram.bReturning = true + Chakram.nProjectileHandle = ProjectileManager:CreateLinearProjectile( projectileInfo ) + table.insert( self.Chakrams, Chakram.nProjectileHandle, Chakram ) + ProjectileManager:CreateLinearProjectile( projectileInfo ) + end +end + +----------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:ReturnChakram( Chakram, vLocation ) + if IsServer() then + for k,v in pairs ( self.Chakrams ) do + if v == Chakram and v.bReturning == false then + Chakram.bReturning = true + EmitSoundOnLocationWithCaster( vLocation, "Boss_Timbersaw.Chakram.Return", self:GetParent() ) + self:LaunchIncomingChakram( vLocation, Chakram.vReturnLocation, Chakram.flSpeed, Chakram.flDist ) + end + end + end +end + +----------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:DestroyChakram( Chakram ) + if IsServer() then + for k,v in pairs ( self.Chakrams ) do + if v == Chakram then + table.remove( self.Chakrams, k ) + end + end + end +end + +----------------------------------------------------------------------------- + +function modifier_boss_timbersaw_chakram_dance:GetChakram( nProjectileHandle ) + return self.Chakrams[ nProjectileHandle ] +end + +----------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_timbersaw_reactive_armor.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_timbersaw_reactive_armor.lua new file mode 100755 index 0000000..e5d3288 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_timbersaw_reactive_armor.lua @@ -0,0 +1,265 @@ +modifier_boss_timbersaw_reactive_armor = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:constructor() + self.max_stacks = 0 + self.armor_per_stack = 0 + self.magic_resist_per_stack = 0 + self.regen_per_stack = 0 + self.bEnraged = false +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:IsHidden() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:GetPriority() + return MODIFIER_PRIORITY_ULTRA +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:OnCreated( kv ) + self.max_stacks = self:GetAbility():GetSpecialValueFor( "max_stacks" ) + self.armor_per_stack = self:GetAbility():GetSpecialValueFor( "armor_per_stack" ) + self.magic_resist_per_stack = self:GetAbility():GetSpecialValueFor( "magic_resist_per_stack" ) + self.regen_per_stack = self:GetAbility():GetSpecialValueFor( "regen_per_stack" ) + self.status_resist =self:GetAbility():GetSpecialValueFor( "status_resist" ) + self.nPhysicalMode = 0 + self.bEnraged = false + self.nModeFX = -1 + self.ParticleIndices = {} + + if IsServer() then + CustomNetTables:SetTableValue( "boss_net_table", "boss_timbersaw", { physical = self.nPhysicalMode } ) + + + + self:SwitchMode() + else + + + for i=1,4 do + local szParticlename = string.format( "particles/creatures/boss_timbersaw/shredder_armor_lyr%d.vpcf", i ) + local nFXIndex = ParticleManager:CreateParticle( szParticlename, PATTACH_CUSTOMORIGIN, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_armor", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 0, 0, 0 ) ) + ParticleManager:SetParticleControl( nFXIndex, 3, Vector( 0, 0, 0 ) ) + ParticleManager:SetParticleControlEnt( nFXIndex, 4, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_chimmney", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 5, Vector( 2.0, 0, 0 ) ) + self:AddParticle( nFXIndex, false, false, -1, false, false ) + + table.insert( self.ParticleIndices, nFXIndex ) + end + end +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:OnRefresh( kv ) + if IsServer() then + local netTable = {} + netTable[ "physical" ] = self.nPhysicalMode + if self:GetParent().AI and self:GetParent().AI.bEnraged then + netTable[ "enraged" ] = 1 + else + netTable[ "enraged" ] = 0 + end + CustomNetTables:SetTableValue( "boss_net_table", "boss_timbersaw", netTable ) + else + local netTable = CustomNetTables:GetTableValue( "boss_net_table", "boss_timbersaw" ) + self.nPhysicalMode = netTable[ "physical" ] + self.bEnraged = true + end +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:CheckState() + local state = + { + --[MODIFIER_STATE_HEXED] = false, + --[MODIFIER_STATE_ROOTED] = false, + --[MODIFIER_STATE_SILENCED] = false, + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + } + return state +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT, + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS, + MODIFIER_PROPERTY_STATUS_RESISTANCE_STACKING, + MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, + } + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:OnTakeDamage( params ) + if IsServer() then + local hAttacker = params.attacker + local hVictim = params.unit + if hAttacker ~= nil and hVictim ~= nil and hVictim == self:GetParent() then + if hVictim:FindModifierByName( "modifier_provide_vision" ) == nil then + --printf( "Provide Vision" ) + hVictim:AddNewModifier( hAttacker, self:GetAbility(), "modifier_provide_vision", { duration = -1 } ) + end + + if params.original_damage > 50 then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_shredder/shredder_reactive_hit.vpcf", PATTACH_CUSTOMORIGIN, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_chimmney", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 2, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + self:IncrementStackCount() + EmitSoundOn( "Hero_Shredder.ReactiveArmor", self:GetParent() ) + if self:GetStackCount() >= self.max_stacks then + self:SwitchMode() + end + end + end + end + return 0 +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:OnStackCountChanged( nOldCount ) + + + local nNewCount = self:GetStackCount() + + local nStacksPerLayer = self.max_stacks / 4 + local nNumLayers = math.floor( nNewCount / nStacksPerLayer ) + 1 + + if IsServer() then + if self.bEnraged == true then + return + end + + + if self:GetParent().AI and self:GetParent().AI.bEnraged == true and self.bEnraged == false then + self.bEnraged = true + nNumLayers = 4 + end + else + + for _,nFXIndex in pairs ( self.ParticleIndices ) do + if nNumLayers > 0 then + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 1, 0, 0 ) ) + nNumLayers = nNumLayers - 1 + else + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 0, 0, 0 ) ) + end + end + end +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:SwitchMode() + if IsServer() then + if self.nPhysicalMode == 1 then + self.nPhysicalMode = 0 + else + self.nPhysicalMode = 1 + end + + CustomNetTables:SetTableValue( "boss_net_table", "boss_timbersaw", { physical = self.nPhysicalMode } ) + self:SetStackCount( 0 ) + self:SendBuffRefreshToClients() + --todo, toggle the visibility on the shield + + local nFXIndex = nil + ParticleManager:DestroyParticle( self.nModeFX, false ) + self.nModeFX = -1 + if self.nPhysicalMode == 1 then + EmitSoundOn( "Item.CrimsonGuard.Cast", self:GetParent() ) + nFXIndex = ParticleManager:CreateParticle( "particles/items2_fx/vanguard_active_launch.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 500, 0, 0 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + self.nModeFX = ParticleManager:CreateParticle( "particles/items2_fx/vanguard_active.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 500, 0, 0 ) ) + else + EmitSoundOn( "DOTA_Item.Pipe.Activate", self:GetParent() ) + nFXIndex = ParticleManager:CreateParticle( "particles/items2_fx/pipe_of_insight_launch.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 500, 0, 0 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + self.nModeFX = ParticleManager:CreateParticle( "particles/items2_fx/pipe_of_insight.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 500, 0, 0 ) ) + end + end +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:GetModifierConstantHealthRegen( params ) + return self:GetStackCount() * self.regen_per_stack +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:GetModifierPhysicalArmorBonus( params ) + if self.nPhysicalMode == 1 then + return self:GetStackCount() * self.armor_per_stack + end + return 0 +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:GetModifierMagicalResistanceBonus( params ) + if self.nPhysicalMode == 0 then + return self:GetStackCount() * self.magic_resist_per_stack + end + + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:GetModifierStatusResistanceStacking( params ) + if IsServer() then + if self.bEnraged then + return self.status_resist * 2 + end + end + return self.status_resist +end + +---------------------------------------- + +function modifier_boss_timbersaw_reactive_armor:GetModifierMoveSpeedBonus_Percentage( params ) + if self.bEnraged then + return 50 + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_familiar_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_familiar_passive.lua new file mode 100755 index 0000000..641156d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_familiar_passive.lua @@ -0,0 +1,71 @@ +modifier_boss_visage_familiar_passive = class({}) + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_passive:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_passive:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_passive:OnCreated( kv ) + +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_passive:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MIN_HEALTH, + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_passive:GetMinHealth( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_passive:OnTakeDamage( params ) + if IsServer() then + if params.unit == self:GetParent() and self:GetParent():GetHealthPercent() < 2 then + self:GetAbility():OnSpellStart() + + local vLocation = self:GetParent():GetAbsOrigin() + if RollPercentage( HEALTH_POTION_DROP_PCT * 3 ) then + local newItem = CreateItem( "item_health_potion", nil, nil ) + newItem:SetPurchaseTime( 0 ) + if newItem:IsPermanent() and newItem:GetShareability() == ITEM_FULLY_SHAREABLE then + item:SetStacksWithOtherOwners( true ) + end + + local drop = CreateItemOnPositionSync( vLocation, newItem ) + newItem:LaunchLoot( true, 300, 0.75, vLocation ) + end + + if RollPercentage( MANA_POTION_DROP_PCT * 3 ) then + local newItem = CreateItem( "item_mana_potion", nil, nil ) + newItem:SetPurchaseTime( 0 ) + if newItem:IsPermanent() and newItem:GetShareability() == ITEM_FULLY_SHAREABLE then + item:SetStacksWithOtherOwners( true ) + end + + local drop = CreateItemOnPositionSync( vLocation, newItem ) + newItem:LaunchLoot( true, 300, 0.75, vLocation ) + end + + end + end + return 0 +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_familiar_statue_stone_form.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_familiar_statue_stone_form.lua new file mode 100755 index 0000000..71a10ba --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_familiar_statue_stone_form.lua @@ -0,0 +1,89 @@ +modifier_boss_visage_familiar_statue_stone_form = class({}) + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_statue_stone_form:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_statue_stone_form:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_statue_stone_form:GetPriority( ) + return MODIFIER_PRIORITY_HIGH + 6 +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_statue_stone_form:GetStatusEffectName() + return "particles/status_fx/status_effect_earth_spirit_petrify.vpcf"; +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_statue_stone_form:AddCustomTransmitterData() +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_statue_stone_form:HandleCustomTransmitterData( entry ) +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_statue_stone_form:OnCreated( kv ) + if IsServer() then + self:SetStackCount( 0 ) + self:StartIntervalThink( 0.77 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_statue_stone_form:OnIntervalThink() + if IsServer() then + self:IncrementStackCount() + if self:GetStackCount() > 5 then + self:StartIntervalThink( -1 ) + end + end +end + +-- -------------------------------------------------------------------------------- + +-- function modifier_boss_visage_familiar_stone_form_buff:DeclareFunctions() +-- local funcs = +-- { +-- MODIFIER_PROPERTY_OVERRIDE_ANIMATION, +-- MODIFIER_PROPERTY_OVERRIDE_ANIMATION_WEIGHT, +-- } +-- return funcs +-- end + +-- -------------------------------------------------------------------------------- + +-- function modifier_boss_visage_familiar_stone_form_buff + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_statue_stone_form:CheckState() + local bOnGround = self:GetStackCount() > 1 + local state = {} + state[MODIFIER_STATE_FROZEN] = self:GetStackCount() > 5 + state[MODIFIER_STATE_STUNNED] = false + state[MODIFIER_STATE_INVULNERABLE] = true + state[MODIFIER_STATE_FLYING] = false + state[MODIFIER_STATE_NO_UNIT_COLLISION] = true + state[MODIFIER_STATE_UNSELECTABLE] = true + state[MODIFIER_STATE_NO_HEALTH_BAR] = true + state[MODIFIER_STATE_ROOTED] = true + state[MODIFIER_STATE_DISARMED] = true + state[MODIFIER_STATE_NOT_ON_MINIMAP] = true + state[MODIFIER_STATE_PROVIDES_VISION] = true + return state +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_familiar_stone_form_buff.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_familiar_stone_form_buff.lua new file mode 100755 index 0000000..9a06460 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_familiar_stone_form_buff.lua @@ -0,0 +1,119 @@ +modifier_boss_visage_familiar_stone_form_buff = class({}) + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_stone_form_buff:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_stone_form_buff:GetPriority( ) + return MODIFIER_PRIORITY_HIGH + 6 +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_stone_form_buff:GetStatusEffectName() + return "particles/status_fx/status_effect_earth_spirit_petrify.vpcf"; +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_stone_form_buff:AddCustomTransmitterData() +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_stone_form_buff:HandleCustomTransmitterData( entry ) +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_stone_form_buff:OnCreated( kv ) + self.stun_delay = self:GetAbility():GetSpecialValueFor( "stun_delay" ) + self.damage_radius = self:GetAbility():GetSpecialValueFor( "damage_radius" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + self.stun_duration = self:GetAbility():GetSpecialValueFor( "stun_duration" ) + if IsServer() then + self.bStunned = false + self:SetStackCount( 0 ) + self:StartIntervalThink( self.stun_delay ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_stone_form_buff:OnIntervalThink() + if IsServer() then + if not self.bStunned then + self.bStunned = true + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_visage/visage_stone_form.vpcf", PATTACH_WORLDORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetAbsOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.damage_radius, 1, 1 ) ) + ParticleManager:SetParticleFoWProperties( nFXIndex, 0, -1, self.damage_radius ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Visage_Familar.StoneForm.Cast", self:GetParent() ) + + + self:GetParent():Heal( 99999, self:GetAbility() ) + self:SendBuffRefreshToClients() + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetAbsOrigin(), self:GetParent(), self.damage_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + + EmitSoundOn( "Visage_Familar.StoneForm.Stun", enemy ) + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_stunned", { duration = self.stun_duration } ) + end + end + + + end + + self:IncrementStackCount() + end +end + +-- -------------------------------------------------------------------------------- + +-- function modifier_boss_visage_familiar_stone_form_buff:DeclareFunctions() +-- local funcs = +-- { +-- MODIFIER_PROPERTY_OVERRIDE_ANIMATION, +-- MODIFIER_PROPERTY_OVERRIDE_ANIMATION_WEIGHT, +-- } +-- return funcs +-- end + +-- -------------------------------------------------------------------------------- + +-- function modifier_boss_visage_familiar_stone_form_buff + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_familiar_stone_form_buff:CheckState() + local bOnGround = self:GetStackCount() > 1 + local state = {} + state[MODIFIER_STATE_FROZEN] = self:GetStackCount() > 5 + state[MODIFIER_STATE_STUNNED] = true + state[MODIFIER_STATE_INVULNERABLE] = true + state[MODIFIER_STATE_FLYING] = ( not bOnGround ) + state[MODIFIER_STATE_NO_UNIT_COLLISION] = true + state[MODIFIER_STATE_NO_HEALTH_BAR] = true + state[MODIFIER_STATE_NOT_ON_MINIMAP] = true + state[MODIFIER_STATE_UNSELECTABLE] = true + state[MODIFIER_STATE_PROVIDES_VISION] = true + return state +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_passive.lua new file mode 100755 index 0000000..aeb1fd1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_passive.lua @@ -0,0 +1,226 @@ +modifier_boss_visage_passive = class({}) + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10000 +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:CheckState() + local state = {} + + if IsServer() then + state[MODIFIER_STATE_HEXED] = false + state[MODIFIER_STATE_ROOTED] = true + state[MODIFIER_STATE_SILENCED] = false + state[MODIFIER_STATE_STUNNED] = self:GetParent().bStone + state[MODIFIER_STATE_FROZEN] = self:GetParent().bStone + state[MODIFIER_STATE_FEARED] = false + state[MODIFIER_STATE_CANNOT_BE_MOTION_CONTROLLED] = true + state[MODIFIER_STATE_INVULNERABLE] = self:GetParent().bStone + state[MODIFIER_STATE_NOT_ON_MINIMAP_FOR_ENEMIES] = self:GetParent().bStone + state[MODIFIER_STATE_NO_HEALTH_BAR] = true + state[MODIFIER_STATE_FLYING_FOR_PATHING_PURPOSES_ONLY] = true + state[MODIFIER_STATE_UNSELECTABLE] = self:GetParent().bStone + end + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_IGNORE_CAST_ANGLE, + MODIFIER_PROPERTY_DISABLE_TURNING, + MODIFIER_EVENT_ON_TAKEDAMAGE + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:OnCreated( kv ) + self.stone_threshold = self:GetAbility():GetSpecialValueFor( "stone_threshold" ) + self.soul_assumption_count = self:GetAbility():GetSpecialValueFor( "soul_assumption_count" ) + self.soul_assumption_damage = self:GetAbility():GetSpecialValueFor( "soul_assumption_damage" ) + self.soul_assumption_speed = self:GetAbility():GetSpecialValueFor( "soul_assumption_speed" ) + self.stone_duration = self:GetAbility():GetSpecialValueFor( "stone_duration" ) + self.familiar_wake_interval = self:GetAbility():GetSpecialValueFor( "familiar_wake_interval" ) + self.flStoneEndTime = -1 + self.flNextFamiliarTime = -1 + self.flAssumptionTime = -1 + self.nBonusSouls = 0 + self.Familiars = {} + self.nStoneFX = -1 + self.nChannelFX = -1 + + self:GetParent().bStone = false + + if IsServer() then + self:StartIntervalThink( 0.25 ) + self.flDamageRemaining = self.stone_threshold + self:GetAbility().Familiars = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetAbsOrigin(), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false ) + for k,v in pairs ( self:GetAbility().Familiars ) do + if v:GetUnitName() ~= "npc_dota_boss_visage_familiar" then + table.remove( self:GetAbility().Familiars, k ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:OnIntervalThink() + if IsServer() then + if self:GetParent().bStone == true and ( GameRules:GetGameTime() > self.flStoneEndTime ) then + self:EndStoneForm() + end + + if self.flNextFamiliarTime ~= -1 and ( GameRules:GetGameTime() > self.flNextFamiliarTime ) then + local StoneFamiliars = {} + for k,v in pairs ( self:GetAbility().Familiars ) do + if v:FindModifierByName( "modifier_boss_visage_familiar_stone_form_buff" ) then + table.insert( StoneFamiliars, v ) + end + end + + if #StoneFamiliars > 0 then + self:GetAbility():WakeFamiliar( StoneFamiliars[ RandomInt( 1, #StoneFamiliars ) ] ) + self.flNextFamiliarTime = GameRules:GetGameTime() + self.familiar_wake_interval + end + end + + if self.flAssumptionTime ~= -1 and ( GameRules:GetGameTime() > self.flAssumptionTime ) then + ParticleManager:DestroyParticle( self.nChannelFX, false ) + self:DoSoulAssumption() + self.flAssumptionTime = -1 + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:GetModifierIgnoreCastAngle( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:GetModifierDisableTurning( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:OnTakeDamage( params ) + if IsServer() then + if params.unit == self:GetParent() and self:GetParent().bStone == false then + self.flDamageRemaining = self.flDamageRemaining - params.damage + if self.flDamageRemaining <= 0 then + self:BeginStoneForm() + end + + if self.flNextFamiliarTime == -1 then + self.flNextFamiliarTime = GameRules:GetGameTime() + self.familiar_wake_interval + end + end + end + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:DoSoulAssumption() + if IsServer() then + local hAliveHeroes = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetAbsOrigin(), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, FIND_CLOSEST, false ) + local nNumberAlivePlayers = #hAliveHeroes + local nSouls = self.soul_assumption_count - ( AGHANIM_PLAYERS - nNumberAlivePlayers ) + nSouls = nSouls + self.nBonusSouls + self.nBonusSouls = self.nBonusSouls + 1 + + for _,hHero in pairs ( hAliveHeroes ) do + nSouls = nSouls - 1 + self:LaunchSoulAssumption( hHero ) + end + + local PossibleFamiliars = deepcopy( self:GetAbility().Familiars ) + for i=1,nSouls do + local nIdx = math.random( 1, #PossibleFamiliars ) + local hTargetFamiliar = PossibleFamiliars[ nIdx ] + self:LaunchSoulAssumption( hTargetFamiliar ) + table.remove( PossibleFamiliars, nIdx ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:BeginStoneForm() + if IsServer() then + self:GetParent().bStone = true + self.flStoneEndTime = GameRules:GetGameTime() + self.stone_duration + self.flAssumptionTime = GameRules:GetGameTime() + 2.0 + + self:GetParent():AddNewModifier( self:GetParent(), self, "modifier_boss_visage_familiar_statue_stone_form", { duration = self.stone_duration } ) + + self.nChannelFX = ParticleManager:CreateParticle( "particles/act_2/storegga_channel.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:EndStoneForm() + if IsServer() then + print( "Ending Stone Form!" ) + self:GetParent().bStone = false + self.flStoneEndTime = 9999999999999999999999999999 + self.flDamageRemaining = self.stone_threshold + + if self.nStoneFX ~= -1 then + ParticleManager:DestroyParticle( self.nStoneFX, false ) + self.nStoneFX = -1 + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_boss_visage_passive:LaunchSoulAssumption( hTarget ) + if hTarget == nil or IsServer() == false then + return + end + + local projectile = + { + Target = hTarget, + Source = self:GetCaster(), + Ability = self:GetAbility(), + EffectName = "particles/units/heroes/hero_visage/visage_soul_assumption_bolt6.vpcf", + iMoveSpeed = self:GetAbility():GetSpecialValueFor( "soul_assumption_speed" ), + vSourceLoc = self:GetCaster():GetOrigin(), + bDodgeable = false, + bProvidesVision = false, + bIgnoreObstructions = true, + iSourceAttachment = 1, + } + + ProjectileManager:CreateTrackingProjectile( projectile ) + EmitSoundOn( "Hero_Visage.SoulAssumption.Cast", self:GetParent() ) +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_thinker_dummy.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_thinker_dummy.lua new file mode 100755 index 0000000..ce50531 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_boss_visage_thinker_dummy.lua @@ -0,0 +1,2 @@ + +modifier_boss_visage_thinker_dummy = class({}) diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_brewmaster_split.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_brewmaster_split.lua new file mode 100755 index 0000000..b5344c7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_brewmaster_split.lua @@ -0,0 +1,95 @@ +modifier_brewmaster_split = class({}) + +-------------------------------------------------------------------------------- + +function modifier_brewmaster_split:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_brewmaster_split:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_brewmaster_split:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10001 +end + +-------------------------------------------------------------------------------- + +function modifier_brewmaster_split:CheckState() + local state = + { + [MODIFIER_STATE_INVULNERABLE] = true, + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + [MODIFIER_STATE_STUNNED] = true, + } + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_brewmaster_split:GetEffectName() + return "particles/units/heroes/hero_brewmaster/brewmaster_primal_split.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_brewmaster_split:GetEffectAttachType() + return PATTACH_ABSORIGIN +end + + +-------------------------------------------------------------------------------- + +function modifier_brewmaster_split:OnCreated( kv ) + if IsServer() then + + end +end + +-------------------------------------------------------------------------------- + +function modifier_brewmaster_split:OnDestroy() + if IsServer() then + EmitSoundOn( "Hero_Brewmaster.PrimalSplit.Spawn", self:GetParent() ) + + local vPos = self:GetParent():GetAbsOrigin() + + local enemies = FindUnitsInRadius( DOTA_TEAM_BADGUYS, vPos, nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + local target = enemies[RandomInt(1,#enemies)] + + local earthspirit_name = "npc_dota_brewmaster_earth_unit" + local earthspirit_origin = vPos + local earthspirit = CreateUnitByName(earthspirit_name, earthspirit_origin, true, self:GetParent(), nil, DOTA_TEAM_BADGUYS) + local earthspiritfx_name = "particles/units/heroes/hero_brewmaster/brewmaster_earth_ambient.vpcf" + local earthspiritfx = ParticleManager:CreateParticle( earthspiritfx_name, PATTACH_ABSORIGIN_FOLLOW, earthspirit ) + ParticleManager:SetParticleControlEnt( earthspiritfx, 0, earthspirit, PATTACH_ABSORIGIN_FOLLOW, nil, earthspirit:GetOrigin(), true ) + earthspirit:SetInitialGoalEntity( target ) + + local stormspirit_name = "npc_dota_brewmaster_storm_unit" + local stormspirit_origin = vPos + local stormspirit = CreateUnitByName(stormspirit_name, stormspirit_origin, true, self:GetParent(), nil, DOTA_TEAM_BADGUYS) + local stormspiritfx_name = "particles/units/heroes/hero_brewmaster/brewmaster_storm_ambient.vpcf" + local stormspiritfx = ParticleManager:CreateParticle( stormspiritfx_name, PATTACH_ABSORIGIN_FOLLOW, stormspirit ) + ParticleManager:SetParticleControlEnt( stormspiritfx, 0, stormspirit, PATTACH_ABSORIGIN_FOLLOW, nil, stormspirit:GetOrigin(), true ) + stormspirit:SetInitialGoalEntity( target ) + + local firespirit_name = "npc_dota_brewmaster_fire_unit" + local firespirit_origin = vPos + local firespirit = CreateUnitByName(firespirit_name, firespirit_origin, true, self:GetParent(), nil, DOTA_TEAM_BADGUYS) + local firespiritfx_name = "particles/units/heroes/hero_brewmaster/brewmaster_fire_ambient.vpcf" + local firespiritfx = ParticleManager:CreateParticle( firespiritfx_name, PATTACH_ABSORIGIN_FOLLOW, firespirit ) + ParticleManager:SetParticleControlEnt( firespiritfx, 0, firespirit, PATTACH_ABSORIGIN_FOLLOW, nil, firespirit:GetOrigin(), true ) + firespirit:SetInitialGoalEntity( target ) + + self:GetParent():AddEffects( EF_NODRAW ) + self:GetParent():ForceKill( false ) + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_brewmaster_unit_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_brewmaster_unit_passive.lua new file mode 100755 index 0000000..8b4b0ae --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_brewmaster_unit_passive.lua @@ -0,0 +1,49 @@ +modifier_brewmaster_unit_passive = class({}) + +-------------------------------------------------------------- + +function modifier_brewmaster_unit_passive:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_DEATH, + } + + return funcs +end + +-------------------------------------------------------------- + +function modifier_brewmaster_unit_passive:OnDeath( params ) + if not IsServer() or params.unit ~= self:GetParent() then + return 0 + end + + print("Brewling died!") + local killedUnit = self:GetParent() + local unitName = killedUnit:GetUnitName() + print(unitName) + if killedUnit:GetUnitName() == "npc_dota_brewmaster_earth_unit" then + local vPos = killedUnit:GetAbsOrigin() + local fx_name = "particles/units/heroes/hero_brewmaster/brewmaster_earth_death_collapse.vpcf" + local fx = ParticleManager:CreateParticle( fx_name, PATTACH_ABSORIGIN, killedUnit ) + ParticleManager:SetParticleControlEnt( fx, 0, killedUnit, PATTACH_ABSORIGIN, nil, killedUnit:GetOrigin(), true ) + killedUnit:SetModelScale(0.1) + --ParticleManager:DestroyParticle( fx, false ) + elseif killedUnit:GetUnitName() == "npc_dota_brewmaster_storm_unit" then + local vPos = killedUnit:GetAbsOrigin() + local fx_name = "particles/units/heroes/hero_brewmaster/brewmaster_storm_death.vpcf" + local fx = ParticleManager:CreateParticle( fx_name, PATTACH_ABSORIGIN, killedUnit ) + ParticleManager:SetParticleControlEnt( fx, 0, killedUnit, PATTACH_ABSORIGIN, nil, killedUnit:GetOrigin(), true ) + killedUnit:SetModelScale(0.1) + --ParticleManager:DestroyParticle( fx, false ) + elseif killedUnit:GetUnitName() == "npc_dota_brewmaster_fire_unit" then + local vPos = killedUnit:GetAbsOrigin() + local fx_name = "particles/units/heroes/hero_brewmaster/brewmaster_fire_death.vpcf" + local fx = ParticleManager:CreateParticle( fx_name, PATTACH_ABSORIGIN, killedUnit ) + ParticleManager:SetParticleControlEnt( fx, 0, killedUnit, PATTACH_ABSORIGIN, nil, killedUnit:GetOrigin(), true ) + killedUnit:SetModelScale(0.1) + --ParticleManager:DestroyParticle( fx, false ) + end + +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_broodmother_accrue_children.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_broodmother_accrue_children.lua new file mode 100755 index 0000000..2c11131 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_broodmother_accrue_children.lua @@ -0,0 +1,50 @@ + +modifier_broodmother_accrue_children = class({}) + +-------------------------------------------------------------------------------- + +function modifier_broodmother_accrue_children:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_broodmother_accrue_children:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_broodmother_accrue_children:OnCreated( kv ) + if IsServer() then + self.babies_to_spawn = self:GetAbility():GetSpecialValueFor( "babies_to_spawn" ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_broodmother_accrue_children:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_DEATH, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_broodmother_accrue_children:OnDeath( params ) + if IsServer() then + local hUnit = params.unit + if hUnit == self:GetParent() then + local hDummy = CreateUnitByName( "npc_dota_dummy_caster", self:GetParent():GetAbsOrigin(), true, self:GetParent(), self:GetParent(), self:GetParent():GetTeamNumber() ) + if hDummy ~= nil then + hDummy.nAmountToSpawn = self.babies_to_spawn + hDummy.hInitialGoalEntity = self:GetParent():GetInitialGoalEntity() + hDummy:AddAbility( "broodmother_generate_children" ) -- the dummy is a creature and creatures auto-level their abilities + end + end + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_broodmother_generate_children.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_broodmother_generate_children.lua new file mode 100755 index 0000000..1a28e9e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_broodmother_generate_children.lua @@ -0,0 +1,131 @@ + +-- Note: this modifier's ability gets added by hand to the dummy unit that Broodmother creates. + +modifier_broodmother_generate_children = class({}) + +-------------------------------------------------------------------------------- + +function modifier_broodmother_generate_children:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_broodmother_generate_children:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_broodmother_generate_children:OnCreated( kv ) + if IsServer() then + self.hBabies = { } + + self.spawn_interval = self:GetAbility():GetSpecialValueFor( "spawn_interval" ) + + -- Note: nAmountToSpawn gets attached to the parent (a dummy) by broodmother, prior to modifier being added + self.nAmountToSpawn = self:GetParent().nAmountToSpawn + self.bWantsToBeRemoved = false + self.nMaxSpawnRadius = 75 + ( self.nAmountToSpawn * 15 ) + + self.szBabyUnit = "npc_dota_creature_broodmother_baby_c" + + self.nFXIndex = ParticleManager:CreateParticle( "particles/baby_brood_venom_pool.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( self.nFXIndex, 0, self:GetCaster():GetAbsOrigin() ) + ParticleManager:SetParticleControl( self.nFXIndex, 1, Vector( self.nMaxSpawnRadius, 1, 1 ) ) + + self:StartIntervalThink( self.spawn_interval ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_broodmother_generate_children:OnIntervalThink() + if IsServer() then + if #self.hBabies < self.nAmountToSpawn then + self:CreateBaby() + end + + if self.bWantsToBeRemoved == false and #self.hBabies >= self.nAmountToSpawn then + self.bWantsToBeRemoved = true + end + + if self.bWantsToBeRemoved then + self:TryToRemoveMyself() + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_broodmother_generate_children:CreateBaby() + local hBaby = CreateUnitByName( self.szBabyUnit, self:GetParent():GetAbsOrigin(), true, self:GetParent(), self:GetParent(), self:GetParent():GetTeamNumber() ) + + local nMaxDistance = 75 + ( #self.hBabies * 15 ) + local vSpawnLoc = nil + + local nMaxAttempts = 7 + local nAttempts = 0 + + repeat + if nAttempts > nMaxAttempts then + vSpawnLoc = nil + printf( "WARNING - modifier_broodmother_generate_children:CreateBaby() - failed to find valid spawn loc for baby spider" ) + break + end + + local vPos = self:GetParent():GetAbsOrigin() + RandomVector( nMaxDistance ) + vSpawnLoc = FindPathablePositionNearby( vPos, 0, 100 ) + nAttempts = nAttempts + 1 + until ( GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vSpawnLoc ) ) + + if hBaby and vSpawnLoc ~= nil then + table.insert( self.hBabies, hBaby ) + + hBaby:SetInitialGoalEntity( self:GetParent().hInitialGoalEntity ) + hBaby:SetDeathXP( 0 ) + hBaby:SetMinimumGoldBounty( 0 ) + hBaby:SetMaximumGoldBounty( 0 ) + + local kv = + { + vLocX = vSpawnLoc.x, + vLocY = vSpawnLoc.y, + vLocZ = vSpawnLoc.z, + } + hBaby:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_frostivus2018_broodbaby_launch", kv ) + + EmitSoundOn( "Creature_Broodmother.CreateBabySpider", hBaby ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_broodmother_generate_children:TryToRemoveMyself() + if IsServer() then + -- Are all my babies done with their movement modifier? + self.bSafeToRemove = true + for _, hBaby in pairs( self.hBabies ) do + if hBaby ~= nil and hBaby:IsNull() == false and hBaby:IsAlive() and hBaby:HasModifier( "modifier_frostivus2018_broodbaby_launch" ) then + self.bSafeToRemove = false + end + end + + if self.bSafeToRemove then + self:Destroy() + return + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_broodmother_generate_children:OnDestroy() + if IsServer() then + ParticleManager:DestroyParticle( self.nFXIndex, false ) + self:GetParent():ForceKill( false ) + UTIL_Remove( self:GetParent() ) + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_broodmother_web.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_broodmother_web.lua new file mode 100755 index 0000000..6394fbb --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_broodmother_web.lua @@ -0,0 +1,38 @@ + +modifier_broodmother_web = class({}) + +----------------------------------------------------------------------------- + +function modifier_broodmother_web:GetEffectName() + return "particles/items2_fx/rod_of_atos.vpcf" +end + +----------------------------------------------------------------------------- + +function modifier_broodmother_web:OnCreated( kv ) + if IsServer() then + EmitSoundOn( "Creature_Spectre.Dagger.VictimLoop", self:GetParent() ) + end +end + +----------------------------------------------------------------------------- + +function modifier_broodmother_web:OnDestroy() + if IsServer() then + StopSoundOn( "Creature_Spectre.Dagger.VictimLoop", self:GetParent() ) + EmitSoundOn( "Creature_Spectre.Dagger.VictimEnd", self:GetParent() ) + end +end + +----------------------------------------------------------------------------- + +function modifier_broodmother_web:CheckState() + local state = + { + [ MODIFIER_STATE_ROOTED ] = true, + } + + return state +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_creature_generic_high_status_resist_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_creature_generic_high_status_resist_passive.lua new file mode 100755 index 0000000..e9ecded --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_creature_generic_high_status_resist_passive.lua @@ -0,0 +1,34 @@ +modifier_creature_generic_high_status_resist_passive = class({}) + +-------------------------------------------------------------------------------- + +function modifier_creature_generic_high_status_resist_passive:IsPurgable() + return false; +end + +-------------------------------------------------------------------------------- + +function modifier_creature_generic_high_status_resist_passive:IsHidden() + return true; +end + +-------------------------------------------------------------------------------- +function modifier_creature_generic_high_status_resist_passive:DeclareFunctions() + local funcs = { + MODIFIER_PROPERTY_STATUS_RESISTANCE_STACKING, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_creature_generic_high_status_resist_passive:GetModifierStatusResistanceStacking( params ) + return 75 +end + +-------------------------------------------------------------------------------- + +function modifier_creature_generic_high_status_resist_passive:OnCreated( kv ) + if IsServer() then + end +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_creature_landmine_detonate.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_creature_landmine_detonate.lua new file mode 100755 index 0000000..6add0c5 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_creature_landmine_detonate.lua @@ -0,0 +1,64 @@ +modifier_creature_landmine_detonate = class({}) + +-------------------------------------------------------------------------------- + +function modifier_creature_landmine_detonate:OnCreated( kv ) + if IsServer() then + self.radius = self:GetAbility():GetSpecialValueFor( "detonate_radius" ) + self.damage = self:GetAbility():GetSpecialValueFor( "detonate_damage" ) + + self:StartIntervalThink( 0 ) + end +end + + +-------------------------------------------------------------------------------- + +function modifier_creature_landmine_detonate:OnIntervalThink() + if IsServer() then + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_techies/techies_land_mine_explode.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( 1.0, 1.0, self.radius ) ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 1.0, 1.0, self.radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Hero_Techies.LandMine.Detonate", self:GetParent() ) + + self:StartIntervalThink( self:GetRemainingTime() / 3 ) + + end +end + + +-------------------------------------------------------------------------------- + +function modifier_creature_landmine_detonate:OnDestroy() + if IsServer() then + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetCaster(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS, 0, false ) + if #enemies > 0 then + for _,enemy in pairs(enemies) do + if enemy ~= nil and ( not enemy:IsMagicImmune() ) and ( not enemy:IsInvulnerable() ) then + local DamageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + ability = self, + damage = self.damage, + damage_type = DAMAGE_TYPE_MAGICAL, + } + ApplyDamage( DamageInfo ) + end + end + end + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_techies/techies_land_mine_explode.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( 1.0, 1.0, self.radius ) ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 1.0, 1.0, self.radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Hero_Techies.LandMine.Detonate", self:GetParent() ) + self:GetParent():ForceKill( false ) + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_creature_pudge_miniboss_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_creature_pudge_miniboss_passive.lua new file mode 100755 index 0000000..b4f411c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_creature_pudge_miniboss_passive.lua @@ -0,0 +1,71 @@ +modifier_creature_pudge_miniboss_passive = class({}) + +-------------------------------------------------------------------------------- + +function modifier_creature_pudge_miniboss_passive:IsPurgable() + return false; +end + +-------------------------------------------------------------------------------- + +function modifier_creature_pudge_miniboss_passive:IsHidden() + return true; +end + +-------------------------------------------------------------------------------- +function modifier_creature_pudge_miniboss_passive:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATUS_RESISTANCE_STACKING, + MODIFIER_PROPERTY_ATTACKSPEED_REDUCTION_PERCENTAGE, + MODIFIER_PROPERTY_MOVESPEED_REDUCTION_PERCENTAGE, + MODIFIER_EVENT_ON_ATTACK_LANDED + } + return funcs +end + + + +function modifier_creature_pudge_miniboss_passive:OnAttackLanded( params ) + if IsServer() then + if params.target ~= self:GetParent() then + return + end + self:GetParent().hAttacker = params.attacker + end +end + + +-------------------------------------------------------------------------------- + +function modifier_creature_pudge_miniboss_passive:GetModifierStatusResistanceStacking( params ) + return 75 +end + +function modifier_creature_pudge_miniboss_passive:CheckState() + local state = {} + if IsServer() then + state[MODIFIER_STATE_CANNOT_MISS] = true + state[MODIFIER_STATE_INVISIBLE] = false + end + return state +end + +-------------------------------------------------------------------------------- + +function modifier_creature_pudge_miniboss_passive:OnCreated( kv ) + if IsServer() then + end +end + +-------------------------------------------------------------------------------- + +function modifier_creature_pudge_miniboss_passive:GetModifierAttackSpeedReductionPercentage( params ) + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_creature_pudge_miniboss_passive:GetModifierMoveSpeedReductionPercentage( params ) + return 20 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_creature_techies_land_mine.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_creature_techies_land_mine.lua new file mode 100755 index 0000000..5dc5b76 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_creature_techies_land_mine.lua @@ -0,0 +1,63 @@ +modifier_creature_techies_land_mine = class({}) + +-------------------------------------------------------------------------------- + +function modifier_creature_techies_land_mine:OnCreated( kv ) + if IsServer() then + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.activation_delay = self:GetAbility():GetSpecialValueFor( "activation_delay" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + --self.proximity_threshold = self:GetAbility():GetSpecialValueFor( "proximity_threshold" ) + + self:StartIntervalThink( self.activation_delay ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_creature_techies_land_mine:CheckState() + local state = {} + if IsServer() then + state[MODIFIER_STATE_ROOTED] = true + state[MODIFIER_STATE_MAGIC_IMMUNE] = true + state[MODIFIER_STATE_INVULNERABLE] = true + state[MODIFIER_STATE_ATTACK_IMMUNE] = true + state[MODIFIER_STATE_NO_HEALTH_BAR] = true + state[MODIFIER_STATE_UNSELECTABLE] = true + state[MODIFIER_STATE_NO_UNIT_COLLISION] = true + end + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_creature_techies_land_mine:OnIntervalThink() + if IsServer() then + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetCaster(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS, 0, false ) + if #enemies > 0 then + for _, enemy in pairs( enemies ) do + if enemy ~= nil and ( not enemy:IsMagicImmune() ) and ( not enemy:IsInvulnerable() ) then + local DamageInfo = + { + victim = enemy, + attacker = self:GetParent(), + ability = self:GetAbility(), + damage = self.damage, + damage_type = DAMAGE_TYPE_MAGICAL, + } + ApplyDamage( DamageInfo ) + end + end + end + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_techies/techies_land_mine_explode.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( 1.0, 1.0, radius ) ) + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( 1.0, 1.0, radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "TreasureChest.MineTrap.Detonate", self:GetParent() ) + self:GetParent():ForceKill( false ) + end +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_drow_ranger_skeleton_archer.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_drow_ranger_skeleton_archer.lua new file mode 100755 index 0000000..da73019 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_drow_ranger_skeleton_archer.lua @@ -0,0 +1,25 @@ + +modifier_drow_ranger_skeleton_archer = class({}) + +-------------------------------------------------------------------------------- + +function modifier_drow_ranger_skeleton_archer:OnCreated( kv ) + if IsServer() then + ParticleManager:ReleaseParticleIndex( ParticleManager:CreateParticle( "particles/units/heroes/hero_clinkz/clinkz_burning_army_start.vpcf", PATTACH_ABSORIGIN, self:GetParent() ) ) + + self.nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_clinkz/clinkz_burning_army.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_drow_ranger_skeleton_archer:OnDestroy() + if IsServer() then + if self.nFXIndex ~= nil then + --print( 'modifier_drow_ranger_skeleton_archer:OnDestroy() removing particle' ) + ParticleManager:DestroyParticle( self.nFXIndex, false ) + end + + self:GetParent():ForceKill( false ) + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_dummy_caster_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_dummy_caster_passive.lua new file mode 100755 index 0000000..bad3d20 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_dummy_caster_passive.lua @@ -0,0 +1,49 @@ + +modifier_dummy_caster_passive = class({}) + +-------------------------------------------------------------------------------- + +function modifier_dummy_caster_passive:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_dummy_caster_passive:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_dummy_caster_passive:CheckState() + local state = {} + if IsServer() then + state[ MODIFIER_STATE_INVULNERABLE ] = true + state[ MODIFIER_STATE_MAGIC_IMMUNE ] = true + state[ MODIFIER_STATE_UNSELECTABLE ] = true + state[ MODIFIER_STATE_NOT_ON_MINIMAP ] = true + state[ MODIFIER_STATE_NO_UNIT_COLLISION ] = true + state[ MODIFIER_STATE_NO_HEALTH_BAR ] = true + state[ MODIFIER_STATE_DISARMED ] = true + state[ MODIFIER_STATE_ROOTED ] = true + state[ MODIFIER_STATE_ATTACK_IMMUNE ] = true + end + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_dummy_caster_passive:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MANACOST_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_dummy_caster_passive:GetModifierPercentageManacost() + return 100 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_dummy_target_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_dummy_target_passive.lua new file mode 100755 index 0000000..ba41cef --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_dummy_target_passive.lua @@ -0,0 +1,35 @@ + +modifier_dummy_target_passive = class({}) + +-------------------------------------------------------------------------------- + +function modifier_dummy_target_passive:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_dummy_target_passive:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_dummy_target_passive:CheckState() + local state = {} + + if IsServer() then + state[ MODIFIER_STATE_INVULNERABLE ] = true + state[ MODIFIER_STATE_MAGIC_IMMUNE ] = true + state[ MODIFIER_STATE_ATTACK_IMMUNE ] = true + state[ MODIFIER_STATE_NOT_ON_MINIMAP ] = true + state[ MODIFIER_STATE_NO_UNIT_COLLISION ] = true + state[ MODIFIER_STATE_NO_HEALTH_BAR ] = true + state[ MODIFIER_STATE_DISARMED ] = true + state[ MODIFIER_STATE_ROOTED ] = true + end + + return state +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_earth_spirit_statue_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_earth_spirit_statue_passive.lua new file mode 100755 index 0000000..42073e0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_earth_spirit_statue_passive.lua @@ -0,0 +1,65 @@ + +modifier_earth_spirit_statue_passive = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_passive:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_passive:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_passive:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10000 +end + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_passive:OnCreated( kv ) + if IsServer() then + local kv = { duration = -1 } + self:GetParent():AddNewModifier( self:GetParent(), self, "modifier_earth_spirit_statue_stoneform", kv ) + end +end + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_passive:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PROVIDES_FOW_POSITION, + } + + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_passive:GetModifierProvidesFOWVision( params ) + return 1 +end + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_passive:CheckState() + local state = + { + [ MODIFIER_STATE_ATTACK_IMMUNE ] = true, + [ MODIFIER_STATE_OUT_OF_GAME ] = true, + [ MODIFIER_STATE_INVULNERABLE ] = true, + [ MODIFIER_STATE_MAGIC_IMMUNE ] = true, + [ MODIFIER_STATE_DISARMED ] = true, + [ MODIFIER_STATE_NO_HEALTH_BAR ] = true, + [ MODIFIER_STATE_NOT_ON_MINIMAP ] = true, + } + + return state +end + +------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_earth_spirit_statue_stoneform.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_earth_spirit_statue_stoneform.lua new file mode 100755 index 0000000..79b2efa --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_earth_spirit_statue_stoneform.lua @@ -0,0 +1,252 @@ + +modifier_earth_spirit_statue_stoneform = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_stoneform:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_stoneform:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_stoneform:GetPriority() + return MODIFIER_PRIORITY_ULTRA +end + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_stoneform:GetStatusEffectName() + return "particles/status_fx/status_effect_earth_spirit_petrify.vpcf" +end + +------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_stoneform:StatusEffectPriority() + return 60 +end + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_stoneform:OnCreated( kv ) + if IsServer() then + --printf( "modifier_earth_spirit_statue_stoneform - OnCreated" ) + + self.nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_earth_spirit/earthspirit_petrify_debuff_stoned.vpcf", PATTACH_CUSTOMORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nFXIndex, 0, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( self.nFXIndex, 1, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + self:AddParticle( self.nFXIndex, false, false, -1, false, false ) + + --[[ + self.nFXIndexB = ParticleManager:CreateParticle( "particles/units/heroes/hero_earth_spirit/espirit_stoneremnant_base.vpcf", PATTACH_CUSTOMORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nFXIndexB, 0, self:GetCaster(), PATTACH_ABSORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nFXIndexB, 1, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + --ParticleManager:SetParticleControlEnt( self.nFXIndexB, 2, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetOrigin(), true ) + ]] + + --[[ C++ + ParticleIndex_t nFXIndex = CreateBuffParticleEffect( "particles/units/heroes/hero_earth_spirit/earthspirit_petrify_debuff_stoned.vpcf", PATTACH_CUSTOMORIGIN_FOLLOW, GetParent() ); + GetParticleManager()->SetParticleControlEnt( nFXIndex, 0, GetParent(), PATTACH_ABSORIGIN_FOLLOW, NULL ); + GetParticleManager()->SetParticleControlEnt( nFXIndex, 1, GetParent(), PATTACH_ABSORIGIN_FOLLOW, NULL ); + AddParticle( nFXIndex, false ); + + m_nFXIndex = CreateBuffParticleEffect( "particles/units/heroes/hero_earth_spirit/espirit_stoneremnant_base.vpcf", PATTACH_ABSORIGIN_FOLLOW, GetParent() ); + GetParticleManager()->SetParticleControlEnt( m_nFXIndex, 0, GetParent(), PATTACH_ABSORIGIN, NULL ); + GetParticleManager()->SetParticleControlEnt( m_nFXIndex, 1, GetParent(), PATTACH_ABSORIGIN_FOLLOW, NULL ); + GetParticleManager()->SetParticleControl( m_nFXIndex, 2, Vector( GetCaster()->GetSequence().GetRaw(), GetCaster()->GetModelScale(), 0 ) ); + ]] + end +end + +----------------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_stoneform:OnDestroy() + if IsServer() then + --printf( "modifier_earth_spirit_statue_stoneform - OnDestroy" ) + + --local kv = { duration = -1 } + --self:GetParent():AddNewModifier( self:GetParent(), self, "modifier_earth_spirit_statue_active", kv ) + + EmitSoundOn( "Hero_EarthSpirit.StoneRemnant.Destroy", self:GetCaster() ) + end +end + +------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_stoneform:DeclareFunctions() + local funcs = { + MODIFIER_PROPERTY_OVERRIDE_ANIMATION, + MODIFIER_PROPERTY_OVERRIDE_ANIMATION_RATE, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_stoneform:GetOverrideAnimation( params ) + return ACT_DOTA_IDLE + --return ACT_DOTA_IDLE_STATUE +end + +------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_stoneform:GetOverrideAnimationRate( params ) + return 0.0 +end + +------------------------------------------------------------------------------- + +function modifier_earth_spirit_statue_stoneform:CheckState() + local state = + { + [ MODIFIER_STATE_STUNNED ] = true, + --[ MODIFIER_STATE_FROZEN ] = true, + --[ MODIFIER_STATE_PROVIDES_VISION ] = true, + + [ MODIFIER_STATE_INVISIBLE ] = false, + } + + return state +end + +------------------------------------------------------------------------------- + + +--[[ + +//----------------------------------------------------------------------------- +// Modifier: Petrify +//----------------------------------------------------------------------------- +class CDOTA_Modifier_AghsFort_EarthSpiritBoss_Petrify : public CDOTA_Buff +{ +public: + DECLARE_CLASS( CDOTA_Modifier_AghsFort_EarthSpiritBoss_Petrify, CDOTA_Buff ); + + virtual bool IsDebuff( void ) { return true; } + virtual bool IsStunDebuff( void ) { return true; } + virtual bool IsPurgable( void ) { return false; } + + virtual void OnCreated( KeyValues *pKV ); + void OnDestroy( void ); + void DeclareFunctions( void ); + + virtual void CheckState( CDOTABuffState &buffState ) OVERRIDE; + + bool HasBeenMagnetized( void ) { return m_bHasBeenMagnetized; } + void SetMagnetized( bool bState ) { m_bHasBeenMagnetized = bState; } + + virtual const char *GetStatusEffectName( void ) { return "particles/status_fx/status_effect_earth_spirit_petrify.vpcf"; } + virtual int StatusEffectPriority( void ) { return 420; } + + bool ProvidesTruesightForTeam( int nTeamNumber ) OVERRIDE { return nTeamNumber == GetTeam(); } + ModifierVariant_t GetOverrideAnimationRate( const CModifierParams ¶ms ); +private: + ParticleIndex_t m_nFXIndex; + bool m_bHasBeenMagnetized; +}; + +LINK_MODIFIER_TO_CLASS( modifier_aghsfort_earth_spirit_boss_petrify, CDOTA_Modifier_AghsFort_EarthSpiritBoss_Petrify ); + +//-------------------------------------------------------------------------------- + +void CDOTA_Modifier_AghsFort_EarthSpiritBoss_Petrify::OnCreated( KeyValues *pKV ) +{ +#ifdef SERVER_DLL + m_bHasBeenMagnetized = false; + + ParticleIndex_t nFXIndex = CreateBuffParticleEffect( "particles/units/heroes/hero_earth_spirit/earthspirit_petrify_debuff_stoned.vpcf", PATTACH_CUSTOMORIGIN_FOLLOW, GetParent() ); + GetParticleManager()->SetParticleControlEnt( nFXIndex, 0, GetParent(), PATTACH_ABSORIGIN_FOLLOW, NULL ); + GetParticleManager()->SetParticleControlEnt( nFXIndex, 1, GetParent(), PATTACH_ABSORIGIN_FOLLOW, NULL ); + AddParticle( nFXIndex, false ); + + + m_nFXIndex = CreateBuffParticleEffect( "particles/units/heroes/hero_earth_spirit/espirit_stoneremnant_base.vpcf", PATTACH_ABSORIGIN_FOLLOW, GetParent() ); + GetParticleManager()->SetParticleControlEnt( m_nFXIndex, 0, GetParent(), PATTACH_ABSORIGIN, NULL ); + GetParticleManager()->SetParticleControlEnt( m_nFXIndex, 1, GetParent(), PATTACH_ABSORIGIN_FOLLOW, NULL ); + GetParticleManager()->SetParticleControl( m_nFXIndex, 2, Vector( GetCaster()->GetSequence().GetRaw(), GetCaster()->GetModelScale(), 0 ) ); + + if ( FStrEq( GetParent()->GetUnitName(), "npc_dota_hero_wisp" ) ) + { + ParticleIndex_t nFXIndexWisp = CreateBuffParticleEffect( "particles/units/heroes/hero_earth_spirit/earthspirit_petrify_wisp.vpcf", PATTACH_CUSTOMORIGIN_FOLLOW, GetParent() ); + GetParticleManager()->SetParticleControlEnt( nFXIndexWisp, 0, GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc" ); + AddParticle( nFXIndexWisp, false ); + } +#endif +} + +//-------------------------------------------------------------------------------- + +void CDOTA_Modifier_AghsFort_EarthSpiritBoss_Petrify::OnDestroy( void ) +{ + float damage; + float aoe; + + DOTA_RETRIEVE_VALUE( damage ); + DOTA_RETRIEVE_VALUE( aoe ); + +#ifdef SERVER_DLL + CUtlVector hEntities; + FindUnitsInRadius( GetCaster()->GetGridNav(), GetCaster()->GetTeamNumber(), GetParent()->GetAbsOrigin(), GetCaster(), aoe, &hEntities, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_CREEP | DOTA_UNIT_TARGET_HERO ); + GetParticleManager()->DestroyParticleEffect( m_nFXIndex, false ); + + GetParent()->UnitEmitSound( "Hero_EarthSpirit.StoneRemnant.Destroy" ); + + for ( int i = 0; i < hEntities.Count(); i++ ) + { + CDOTA_BaseNPC *pNPC = ToDOTABaseNPC( hEntities[i] ); + if ( pNPC ) + { + ApplyDamage( GetCaster(), pNPC, GetAbility(), damage, DAMAGE_TYPE_MAGICAL ); + } + } + + if ( GetParent()->GetLocomotionInterface() && !GetParent()->GetLocomotionInterface()->IsCurrentlyMotionControlled() ) + { + FindClearSpaceForUnit( GetParent(), GetParent()->GetAbsOrigin(), false ); + } +#endif + + ParticleIndex_t nFXIndexShockC = CreateBuffParticleEffect( "particles/units/heroes/hero_earth_spirit/earthspirit_petrify_shockwave.vpcf", PATTACH_ABSORIGIN_FOLLOW, GetParent() ); + GetParticleManager()->SetParticleControlEnt( nFXIndexShockC, 0, GetParent(), PATTACH_ABSORIGIN, NULL, GetParent()->GetAbsOrigin() ); + GetParticleManager()->SetParticleControl( nFXIndexShockC, 3, Vector( aoe, aoe, aoe ) ); + GetParticleManager()->ReleaseParticleIndex( nFXIndexShockC ); + +} + +//----------------------------------------------------------------------------------- + +void CDOTA_Modifier_AghsFort_EarthSpiritBoss_Petrify::DeclareFunctions( void ) +{ + DOTA_LINK_FUNCTION( MODIFIER_PROPERTY_OVERRIDE_ANIMATION_RATE, &CDOTA_Modifier_AghsFort_EarthSpiritBoss_Petrify::GetOverrideAnimationRate ); +} +//----------------------------------------------------------------------------- + +ModifierVariant_t CDOTA_Modifier_AghsFort_EarthSpiritBoss_Petrify::GetOverrideAnimationRate( const CModifierParams ¶ms ) +{ + return 0; +} + +//----------------------------------------------------------------------------- + +void CDOTA_Modifier_AghsFort_EarthSpiritBoss_Petrify::CheckState( CDOTABuffState &buffState ) +{ + BaseClass::CheckState( buffState ); + + buffState.Enable( MODIFIER_STATE_STUNNED ); + buffState.Enable( MODIFIER_STATE_FROZEN ); + buffState.Enable( MODIFIER_STATE_ATTACK_IMMUNE ); + buffState.Enable( MODIFIER_STATE_INVULNERABLE ); + buffState.Enable( MODIFIER_STATE_OUT_OF_GAME ); + buffState.Enable( MODIFIER_STATE_NO_HEALTH_BAR ); + buffState.Disable( MODIFIER_STATE_INVISIBLE ); +} + +//----------------------------------------------------------------------------- + +]] diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_elemental_tiny_create_io_dummy.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_elemental_tiny_create_io_dummy.lua new file mode 100755 index 0000000..e1139e3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_elemental_tiny_create_io_dummy.lua @@ -0,0 +1,8 @@ + +modifier_elemental_tiny_create_io_dummy = class({}) + +-------------------------------------------------------------- + +function modifier_elemental_tiny_create_io_dummy:IsHidden() + return true +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_elemental_tiny_grab.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_elemental_tiny_grab.lua new file mode 100755 index 0000000..a71e8cc --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_elemental_tiny_grab.lua @@ -0,0 +1,97 @@ + +modifier_elemental_tiny_grab = class({}) + +-------------------------------------------------------------------------------- + +function modifier_elemental_tiny_grab:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_elemental_tiny_grab:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_elemental_tiny_grab:OnCreated( kv ) + if IsServer() then + if self:ApplyHorizontalMotionController() == false then + self:Destroy() + return + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_elemental_tiny_grab:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ANIMATION, + MODIFIER_EVENT_ON_DEATH, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_elemental_tiny_grab:CheckState() + local state = + { + [MODIFIER_STATE_STUNNED] = true, + [MODIFIER_STATE_INVULNERABLE] = true, + [MODIFIER_STATE_OUT_OF_GAME] = true, + } + return state +end + +-------------------------------------------------------------------------------- + +function modifier_elemental_tiny_grab:OnDestroy() + if IsServer() then + self:GetParent():RemoveHorizontalMotionController( self ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_elemental_tiny_grab:UpdateHorizontalMotion( me, dt ) + if IsServer() then + local vLocation = nil + if self:GetParent() ~= nil and self:GetParent():IsAlive() then + local attach = self:GetCaster():ScriptLookupAttachment( "attach_attack" ) + vLocation = self:GetCaster():GetAttachmentOrigin( attach ) + me:SetOrigin( vLocation ) + end + + end +end + + +-------------------------------------------------------------------------------- + +function modifier_elemental_tiny_grab:OnHorizontalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + +-------------------------------------------------------------------------------- + +function modifier_elemental_tiny_grab:GetOverrideAnimation( params ) + return ACT_DOTA_FLAIL +end + +-------------------------------------------------------------------------------- + +function modifier_elemental_tiny_grab:OnDeath( params ) + if IsServer() then + if params.unit == self:GetCaster() then + self:Destroy() + end + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_enraged_wildkin_tornado_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_enraged_wildkin_tornado_passive.lua new file mode 100755 index 0000000..4df119f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_enraged_wildkin_tornado_passive.lua @@ -0,0 +1,224 @@ + +modifier_enraged_wildkin_tornado_passive = class({}) + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:OnCreated( kv ) + self.radius = self:GetAbility():GetSpecialValueFor( "tornado_radius" ) + self.harpy_spawn_interval = self:GetAbility():GetSpecialValueFor( "harpy_spawn_interval" ) + self.harpy_spawn_amount = self:GetAbility():GetSpecialValueFor( "harpy_spawn_amount" ) + self.max_total_harpies = self:GetAbility():GetSpecialValueFor( "max_total_harpies" ) + + self.szHarpyUnit = "npc_aghsfort_creature_tornado_harpy" + self.flLastHarpyTime = GameRules:GetGameTime() + + self:StartIntervalThink( 0.5 ) +end + + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:GetModifierAura() + return "modifier_enraged_wildkin_tornado_passive_debuff" +end + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_ENEMY +end + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP +end + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS +end + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:GetAuraRadius() + return self.radius +end + + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:OnRefresh( kv ) + self.radius = self:GetAbility():GetSpecialValueFor( "tornado_radius" ) +end + +-------------------------------------------------------------------------------- +function modifier_enraged_wildkin_tornado_passive:DeclareFunctions() + local funcs = { + MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE, + } + + return funcs +end + +function modifier_enraged_wildkin_tornado_passive:OnIntervalThink() + if IsServer() then + + --if self:GetCaster() == nil or self:GetCaster():IsAlive() ~= true then + -- self:GetParent():ForceKill(false) + -- return + --end + + --local vDirection = self:GetParent():GetAbsOrigin() - self:GetCaster():GetAbsOrigin() + --self:GetCaster():SetForwardVector(vDirection) + + + if self.nPreviewFX ~= nil then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + end + + + if self:GetParent():IsMoving() == false then + self:DoMove() + end + if GameRules:GetGameTime() - self.flLastHarpyTime > self.harpy_spawn_interval then + -- for some reason can't find the harpies by names, so finding them by model + local hHarpies = Entities:FindAllByModel( "models/creeps/neutral_creeps/n_creep_harpy_b/n_creep_harpy_b.vmdl" ) + if #hHarpies < self.max_total_harpies then + --print ("we're at", #hHarpies, "now, max is", self.max_total_harpies) + self:SpawnHarpy() + end + end + + + end +end + +function modifier_enraged_wildkin_tornado_passive:DoMove() + if IsServer() then + + local heroes = FindRealLivingEnemyHeroesInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetAbsOrigin(), FIND_UNITS_EVERYWHERE ) + if #heroes > 0 then + local hero = heroes[RandomInt(1, #heroes)] + + for i=1,4 do + + local vLoc = FindPathablePositionNearby(hero:GetAbsOrigin(), 200, 200 ) + if GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vLoc ) then + + ExecuteOrderFromTable({ + UnitIndex = self:GetParent():entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = vLoc, + Queue = false, + }) + + break + end + end + end + end + return +end + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:GetModifierMoveSpeed_Absolute( params ) + return 320 +end + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:SpawnHarpy() + if IsServer() then + local hUnit = self:GetParent() + if hUnit == nil then + return + end + if not hUnit:IsAlive() then + return + end + + for i = 1, self.harpy_spawn_amount do + local hHarpy = CreateUnitByName( self.szHarpyUnit, self:GetParent():GetAbsOrigin(), true, self:GetParent(), self:GetParent(), self:GetParent():GetTeamNumber() ) + local nMaxDistance = 200 + local vLoc = FindPathablePositionNearby(self:GetParent():GetAbsOrigin(), 150, nMaxDistance ) + + hHarpy:SetInitialGoalEntity( self:GetParent().hInitialGoalEntity ) + hHarpy:SetDeathXP( 0 ) + hHarpy:SetMinimumGoldBounty( 0 ) + hHarpy:SetMaximumGoldBounty( 0 ) + + local kv = + { + vLocX = vLoc.x, + vLocY = vLoc.y, + vLocZ = vLoc.z, + } + hHarpy:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_frostivus2018_broodbaby_launch", kv ) + + end + + self.nPreviewFX = ParticleManager:CreateParticle( "particles/dark_moon/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( 100, 100, 100 ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 29, 55, 184 ) ) + + + self.flLastHarpyTime = GameRules:GetGameTime() + EmitSoundOn( "Creature_Bomb_Squad.LandMine.Plant", hHarpy ) + + end + + return +end + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:CheckState() + local state = {} + if IsServer() then + state = + { + [MODIFIER_STATE_STUNNED] = false, + [MODIFIER_STATE_ROOTED] = false, + [MODIFIER_STATE_MAGIC_IMMUNE] = true, + [MODIFIER_STATE_INVULNERABLE] = true, + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + [MODIFIER_STATE_FLYING] = true, + [MODIFIER_STATE_NO_UNIT_COLLISION] = true, + [MODIFIER_STATE_UNSELECTABLE] = true, + } + end + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:GetEffectName( ) + return "particles/creatures/enraged_wildkin/enraged_wildkin_tornado.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive:OnDestroy( ) + if IsServer() then + if self:GetCaster() and self:GetCaster():IsAlive() then + self:GetCaster():Interrupt() + end + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_enraged_wildkin_tornado_passive_debuff.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_enraged_wildkin_tornado_passive_debuff.lua new file mode 100755 index 0000000..e0d4c4d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_enraged_wildkin_tornado_passive_debuff.lua @@ -0,0 +1,49 @@ +modifier_enraged_wildkin_tornado_passive_debuff = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive_debuff:OnCreated( kv ) + self.movespeed_pct = self:GetAbility():GetSpecialValueFor( "movespeed_pct" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + if IsServer() then + self:StartIntervalThink( 0.5 ) + end +end + +----------------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive_debuff:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, + } + return funcs +end + + +----------------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive_debuff:GetModifierMoveSpeedBonus_Percentage( params ) + return -self.movespeed_pct +end + +----------------------------------------------------------------------------------------- + +function modifier_enraged_wildkin_tornado_passive_debuff:OnIntervalThink() + if IsServer() then + if self:GetParent() and self:GetParent():IsInvulnerable() == false then + + local damageInfo = + { + victim = self:GetParent(), + attacker = self:GetCaster(), + damage = self.damage / 2, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self:GetAbility() + } + + ApplyDamage( damageInfo ) + end + end +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_evil_greevil_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_evil_greevil_passive.lua new file mode 100755 index 0000000..c18120a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_evil_greevil_passive.lua @@ -0,0 +1,16 @@ +modifier_evil_greevil_passive = class({}) + +-------------------------------------------------------------- + +function modifier_evil_greevil_passive:CheckState() + local state = {} + + if IsServer() then + state[MODIFIER_STATE_MAGIC_IMMUNE] = true + end + + return state +end + +-------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_huge_brood_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_huge_brood_passive.lua new file mode 100755 index 0000000..b84a79f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_huge_brood_passive.lua @@ -0,0 +1,59 @@ + +modifier_huge_brood_passive = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_huge_brood_passive:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_huge_brood_passive:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_huge_brood_passive:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10000 +end + +-------------------------------------------------------------------------------- + +function modifier_huge_brood_passive:OnCreated( kv ) + self.status_resistance = self:GetAbility():GetSpecialValueFor( "status_resistance" ) +end + + +----------------------------------------------------------------------------------------- + +function modifier_huge_brood_passive:CheckState() + local state = + { + [MODIFIER_STATE_FEARED] = false, + --[MODIFIER_STATE_CANNOT_BE_MOTION_CONTROLLED] = true, + --[MODIFIER_STATE_UNSLOWABLE] = true, + } + + return state +end + +----------------------------------------------------------------------------------------- + +function modifier_huge_brood_passive:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATUS_RESISTANCE_STACKING, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_huge_brood_passive:GetModifierStatusResistanceStacking( params ) + return self.status_resistance +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_huge_broodmother_accrue_children.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_huge_broodmother_accrue_children.lua new file mode 100755 index 0000000..7641a62 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_huge_broodmother_accrue_children.lua @@ -0,0 +1,50 @@ + +modifier_huge_broodmother_accrue_children = class({}) + +-------------------------------------------------------------------------------- + +function modifier_huge_broodmother_accrue_children:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_huge_broodmother_accrue_children:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_huge_broodmother_accrue_children:OnCreated( kv ) + if IsServer() then + self.babies_to_spawn = self:GetAbility():GetSpecialValueFor( "babies_to_spawn" ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_huge_broodmother_accrue_children:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_DEATH, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_huge_broodmother_accrue_children:OnDeath( params ) + if IsServer() then + local hUnit = params.unit + if hUnit == self:GetParent() then + local hDummy = CreateUnitByName( "npc_dota_dummy_caster", self:GetParent():GetAbsOrigin(), true, self:GetParent(), self:GetParent(), self:GetParent():GetTeamNumber() ) + if hDummy ~= nil then + hDummy.nAmountToSpawn = self.babies_to_spawn + hDummy.hInitialGoalEntity = self:GetParent():GetInitialGoalEntity() + hDummy:AddAbility( "huge_broodmother_generate_children" ) -- the dummy is a creature and creatures auto-level their abilities + end + end + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_huge_broodmother_generate_children_thinker.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_huge_broodmother_generate_children_thinker.lua new file mode 100755 index 0000000..835b062 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_huge_broodmother_generate_children_thinker.lua @@ -0,0 +1,131 @@ + +-- Note: this modifier's ability gets added by hand to the dummy unit that Broodmother creates. + +modifier_huge_broodmother_generate_children_thinker = class({}) + +-------------------------------------------------------------------------------- + +function modifier_huge_broodmother_generate_children_thinker:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_huge_broodmother_generate_children_thinker:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_huge_broodmother_generate_children_thinker:OnCreated( kv ) + if IsServer() then + self.hBabies = { } + + self.spawn_interval = self:GetAbility():GetSpecialValueFor( "spawn_interval" ) + + -- Note: nAmountToSpawn gets attached to the parent (a dummy) by broodmother, prior to modifier being added + self.nAmountToSpawn = self:GetParent().nAmountToSpawn + self.bWantsToBeRemoved = false + self.nMaxSpawnRadius = 75 + ( self.nAmountToSpawn * 15 ) + + self.szBabyUnit = "npc_dota_creature_broodmother_baby_d" + + self.nFXIndex = ParticleManager:CreateParticle( "particles/baby_brood_venom_pool.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( self.nFXIndex, 0, self:GetCaster():GetAbsOrigin() ) + ParticleManager:SetParticleControl( self.nFXIndex, 1, Vector( self.nMaxSpawnRadius, 1, 1 ) ) + + self:StartIntervalThink( self.spawn_interval ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_huge_broodmother_generate_children_thinker:OnIntervalThink() + if IsServer() then + if #self.hBabies < self.nAmountToSpawn then + self:CreateBaby() + end + + if self.bWantsToBeRemoved == false and #self.hBabies >= self.nAmountToSpawn then + self.bWantsToBeRemoved = true + end + + if self.bWantsToBeRemoved then + self:TryToRemoveMyself() + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_huge_broodmother_generate_children_thinker:CreateBaby() + local hBaby = CreateUnitByName( self.szBabyUnit, self:GetParent():GetAbsOrigin(), true, self:GetParent(), self:GetParent(), self:GetParent():GetTeamNumber() ) + + local nMaxDistance = 75 + ( #self.hBabies * 15 ) + local vSpawnLoc = nil + + local nMaxAttempts = 7 + local nAttempts = 0 + + repeat + if nAttempts > nMaxAttempts then + vSpawnLoc = nil + printf( "WARNING - modifier_broodmother_generate_children:CreateBaby() - failed to find valid spawn loc for baby spider" ) + break + end + + local vPos = self:GetParent():GetAbsOrigin() + RandomVector( nMaxDistance ) + vSpawnLoc = FindPathablePositionNearby( vPos, 0, 100 ) + nAttempts = nAttempts + 1 + until ( GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vSpawnLoc ) ) + + if hBaby and vSpawnLoc ~= nil then + table.insert( self.hBabies, hBaby ) + + hBaby:SetInitialGoalEntity( self:GetParent().hInitialGoalEntity ) + hBaby:SetDeathXP( 0 ) + hBaby:SetMinimumGoldBounty( 0 ) + hBaby:SetMaximumGoldBounty( 0 ) + + local kv = + { + vLocX = vSpawnLoc.x, + vLocY = vSpawnLoc.y, + vLocZ = vSpawnLoc.z, + } + hBaby:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_frostivus2018_broodbaby_launch", kv ) + + EmitSoundOn( "Creature_Broodmother.CreateBabySpider", hBaby ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_huge_broodmother_generate_children_thinker:TryToRemoveMyself() + if IsServer() then + -- Are all my babies done with their movement modifier? + self.bSafeToRemove = true + for _, hBaby in pairs( self.hBabies ) do + if hBaby ~= nil and hBaby:IsNull() == false and hBaby:IsAlive() and hBaby:HasModifier( "modifier_frostivus2018_broodbaby_launch" ) then + self.bSafeToRemove = false + end + end + + if self.bSafeToRemove then + self:Destroy() + return + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_huge_broodmother_generate_children_thinker:OnDestroy() + if IsServer() then + ParticleManager:DestroyParticle( self.nFXIndex, false ) + self:GetParent():ForceKill( false ) + UTIL_Remove( self:GetParent() ) + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_lifestealer_damage_counter.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_lifestealer_damage_counter.lua new file mode 100755 index 0000000..f029af4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_lifestealer_damage_counter.lua @@ -0,0 +1,140 @@ + +modifier_lifestealer_damage_counter = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_damage_counter:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_damage_counter:OnCreated( kv ) + if IsServer() then + self.damage_threshold = self:GetAbility():GetSpecialValueFor( "damage_threshold" ) + self.enrage_duration = self:GetAbility():GetSpecialValueFor( "enrage_duration" ) + self.damage_counter_tiers = self:GetAbility():GetSpecialValueFor( "damage_counter_tiers" ) + self.time_before_reduction = self:GetAbility():GetSpecialValueFor( "time_before_reduction" ) + + self.nRecentDamageTaken = kv.damage or 0 + self.nOverheadParticleTier = 0 + self.nDamagePerTier = self.damage_threshold / self.damage_counter_tiers + self.fLastDamageTakenTime = GameRules:GetGameTime() + self.fLastReductionTime = GameRules:GetGameTime() + + --printf( "self.nDamagePerTier: %d", self.nDamagePerTier ) + + -- Created overhead particle + local vPos = Vector( 0, 0, 0 ) + self.nFXIndex = ParticleManager:CreateParticle( "particles/creatures/lifestealer/lifestealer_damage_counter_overhead.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControl( self.nFXIndex, 0, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 1, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 2, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 3, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 4, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 5, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 6, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 7, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 8, Vector( 1, 0, 0 ) ) + ParticleManager:SetParticleControl( self.nFXIndex, 9, Vector( 2, 0, 0 ) ) + ParticleManager:SetParticleControl( self.nFXIndex, 10, Vector( 3, 0, 0 ) ) + ParticleManager:SetParticleControl( self.nFXIndex, 11, Vector( 4, 0, 0 ) ) + ParticleManager:SetParticleControl( self.nFXIndex, 12, Vector( 5, 0, 0 ) ) + self:AddParticle( self.nFXIndex, false, false, -1, false, true ) + + local nInitialTier = 1 + self:IncrementOverheadParticle( nInitialTier ) + + self:StartIntervalThink( 0.1 ) + end +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_damage_counter:OnIntervalThink() + if IsServer() then + -- If some time has passed since I took damage, then reduce my ragebar tier by 1 + if GameRules:GetGameTime() >= self.fLastDamageTakenTime + self.time_before_reduction then + if GameRules:GetGameTime() >= self.fLastReductionTime + self.time_before_reduction then + --printf( "It's been at least %.2f secs since the last time I took damage", self.time_before_reduction ) + self.nRecentDamageTaken = self.nRecentDamageTaken - self.nDamagePerTier + local nTier = math.floor( self.nRecentDamageTaken / self.nDamagePerTier ) + --printf( " self.nRecentDamageTaken: %d, self.nDamagePerTier: %d, nTier: %d", self.nRecentDamageTaken, self.nDamagePerTier, nTier ) + + if nTier < self.nOverheadParticleTier then + --printf( " Reduce ragebar -- DecrementOverheadParticle" ) + self:DecrementOverheadParticle( nTier ) + end + + self.fLastReductionTime = GameRules:GetGameTime() + end + end + end +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_damage_counter:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_damage_counter:OnTakeDamage( params ) + if IsServer() then + local hAttacker = params.attacker + local hVictim = params.unit + if hAttacker ~= nil and hVictim ~= nil and hVictim == self:GetParent() then + local hToothy = hVictim + self.fLastDamageTakenTime = GameRules:GetGameTime() + --printf( "OnTakeDamage - hVictim is: %s", hVictim:GetUnitName() ) + self.nRecentDamageTaken = self.nRecentDamageTaken + params.damage + + local nTier = math.floor( self.nRecentDamageTaken / self.nDamagePerTier ) + + if nTier > self.nOverheadParticleTier then + self:IncrementOverheadParticle( nTier ) + end + + if self.nRecentDamageTaken >= self.damage_threshold then + if not ( hToothy:IsSilenced() or hToothy:IsStunned() or hToothy:IsHexed() or hToothy:IsFrozen() ) then + hToothy:AddNewModifier( hToothy, self:GetAbility(), "modifier_lifestealer_enraged", { duration = self.enrage_duration } ) + self:Destroy() + end + else + self:ForceRefresh() + end + end + end + + return 0 +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_damage_counter:IncrementOverheadParticle( nTier ) + local nTiersSinceLastUpdate = nTier - self.nOverheadParticleTier + + for i = 1, nTiersSinceLastUpdate do + ParticleManager:SetParticleControl( self.nFXIndex, self.nOverheadParticleTier + i, Vector( 1, 0, 0 ) ) + end + + self.nOverheadParticleTier = nTier +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_damage_counter:DecrementOverheadParticle( nTier ) + if self.nOverheadParticleTier - 1 > 0 then + ParticleManager:SetParticleControl( self.nFXIndex, self.nOverheadParticleTier, Vector( 0, 0, 0 ) ) + --printf( "DecrementOverheadParticle - self.nOverheadParticleTier: %d", self.nOverheadParticleTier ) + self.nOverheadParticleTier = nTier + else + self:Destroy() + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_lifestealer_enraged.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_lifestealer_enraged.lua new file mode 100755 index 0000000..8f56283 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_lifestealer_enraged.lua @@ -0,0 +1,94 @@ + +modifier_lifestealer_enraged = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_enraged:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_enraged:GetStatusEffectName() + return "particles/status_fx/status_effect_life_stealer_rage.vpcf" +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_enraged:StatusEffectPriority() + return 60 +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_enraged:OnCreated( kv ) + self.enrage_movespeed_bonus = self:GetAbility():GetSpecialValueFor( "enrage_movespeed_bonus" ) + self.enrage_attack_speed_bonus = self:GetAbility():GetSpecialValueFor( "enrage_attack_speed_bonus" ) + self.enrage_model_scale_bonus = self:GetAbility():GetSpecialValueFor( "enrage_model_scale_bonus" ) + + if IsServer() then + self.nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_life_stealer/life_stealer_rage.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nFXIndex, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_attack1", self:GetCaster():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( self.nFXIndex, 1, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_attack2", self:GetCaster():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( self.nFXIndex, 2, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( self.nFXIndex, 3, self:GetCaster(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetCaster():GetAbsOrigin(), false ) + self:AddParticle( self.nFXIndex, false, false, -1, false, false ) + + EmitSoundOn( "Lifestealer.Enraged.Activate", self:GetParent() ) + + local hEnragedPulseAbility = self:GetParent():FindAbilityByName( "aghsfort_lifestealer_enraged_pulse" ) + + if hEnragedPulseAbility then + ExecuteOrderFromTable({ + UnitIndex = self:GetParent():entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hEnragedPulseAbility:entindex() + }) + end + end +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_enraged:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT, + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + MODIFIER_PROPERTY_MODEL_SCALE, + } + + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_enraged:GetModifierMoveSpeedBonus_Constant( params ) + return self.enrage_movespeed_bonus +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_enraged:GetModifierAttackSpeedBonus_Constant( params ) + return self.enrage_attack_speed_bonus +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_enraged:GetModifierModelScale( params ) + return self.enrage_model_scale_bonus +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_enraged:CheckState() + local state = {} + + if IsServer() then + state[ MODIFIER_STATE_MAGIC_IMMUNE ] = true + end + + return state +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_lifestealer_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_lifestealer_passive.lua new file mode 100755 index 0000000..81ced39 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_lifestealer_passive.lua @@ -0,0 +1,58 @@ + +modifier_lifestealer_passive = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_passive:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_passive:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_passive:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10000 +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_passive:OnCreated( kv ) + if IsServer() then + self.damage_counter_duration = self:GetAbility():GetSpecialValueFor( "damage_counter_duration" ) + end +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_passive:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_lifestealer_passive:OnTakeDamage( params ) + if IsServer() then + local hAttacker = params.attacker + local hVictim = params.unit + if hAttacker ~= nil and hVictim ~= nil and hVictim == self:GetParent() then + if self:GetParent():FindModifierByName( "modifier_lifestealer_damage_counter" ) == nil then + if self:GetParent():FindModifierByName( "modifier_lifestealer_enraged" ) == nil then + local kv = { duration = -1 } -- self.damage_counter_duration + self:GetParent():AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_lifestealer_damage_counter", kv ) + end + end + end + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_mini_spider_slow_attack.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_mini_spider_slow_attack.lua new file mode 100755 index 0000000..a3e2409 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_mini_spider_slow_attack.lua @@ -0,0 +1,82 @@ + +modifier_mini_spider_slow_attack = class({}) + +------------------------------------------------------------------------------------ + +function modifier_mini_spider_slow_attack:IsHidden() + return true +end + +------------------------------------------------------------------------------------ + +function modifier_mini_spider_slow_attack:OnCreated( kv ) + self.duration = self:GetAbility():GetSpecialValueFor( "duration" ) + + if IsServer() then + -- Give the spider a chance to get aggro on its own; if it doesn't have it after some delay, we'll assign it + local fDelay = 1.5 + self:StartIntervalThink( fDelay ) + end +end + +------------------------------------------------------------------------------------ + + +function modifier_mini_spider_slow_attack:OnIntervalThink() + if IsServer() then + if self:GetParent():GetInitialGoalEntity() ~= nil then + return -1 + end + + local hHeroes = FindRealLivingEnemyHeroesInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), FIND_UNITS_EVERYWHERE ) + local hNearestHero = hHeroes[ 1 ] + if hNearestHero ~= nil then + self:GetParent():SetInitialGoalEntity( hNearestHero ) + end + + return -1 + end +end + +-------------------------------------------------------------------------------- + +function modifier_mini_spider_slow_attack:CheckState() + local state = + { + [MODIFIER_STATE_FLYING_FOR_PATHING_PURPOSES_ONLY] = false, + } + + return state +end + +------------------------------------------------------------------------------------ + +function modifier_mini_spider_slow_attack:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_ATTACKED, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_mini_spider_slow_attack:OnAttacked( params ) + if IsServer() then + if params.attacker == self:GetParent() then + local hTarget = params.target + if hTarget ~= nil then + local hDebuff = hTarget:FindModifierByName( "modifier_mini_spider_slow_attack_debuff" ) + if hDebuff ~= nil then + hDebuff:SetDuration( self.duration, true ) + hDebuff:IncrementStackCount() + else + hTarget:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_mini_spider_slow_attack_debuff", { duration = self.duration } ) + end + end + end + end +end + +------------------------------------------------------------------------------------ diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_mini_spider_slow_attack_debuff.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_mini_spider_slow_attack_debuff.lua new file mode 100755 index 0000000..7dc480f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_mini_spider_slow_attack_debuff.lua @@ -0,0 +1,32 @@ + +modifier_mini_spider_slow_attack_debuff = class({}) + +------------------------------------------------------------------------------------ + +function modifier_mini_spider_slow_attack_debuff:GetEffectName() + return "particles/units/heroes/hero_venomancer/venomancer_poison_debuff.vpcf" +end + +------------------------------------------------------------------------------------ + +function modifier_mini_spider_slow_attack_debuff:OnCreated( kv ) + self.movement_speed_slow = self:GetAbility():GetSpecialValueFor( "movement_speed_slow" ) +end + +------------------------------------------------------------------------------------ + +function modifier_mini_spider_slow_attack_debuff:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, + } + return funcs +end + +------------------------------------------------------------------------------------ + +function modifier_mini_spider_slow_attack_debuff:GetModifierMoveSpeedBonus_Percentage( params ) + return self.movement_speed_slow * self:GetStackCount() +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_morty_start_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_morty_start_passive.lua new file mode 100755 index 0000000..962442f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_morty_start_passive.lua @@ -0,0 +1,101 @@ +modifier_morty_start_passive = class({}) +---------------------------------------------------------------------------------- + +function modifier_morty_start_passive:IsHidden() + return true +end + +---------------------------------------------------------------------------------- + +function modifier_morty_start_passive:IsPurgable() + return false +end + +---------------------------------------------------------------------------------- + +function modifier_morty_start_passive:OnCreated( kv ) + if IsServer() then + self.hPlayerEnt = nil + self.bRideComplete = false + self.bRideStarted = false + end +end + +---------------------------------------------------------------------------------- + +function modifier_morty_start_passive:CheckState() + local state = + { + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + [MODIFIER_STATE_COMMAND_RESTRICTED] = true, + } + return state +end + + +----------------------------------------------------------------------- + +function modifier_morty_start_passive:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_ORDER, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_morty_start_passive:OnOrder( params ) + if IsServer() then + local hOrderedUnit = params.unit + local hTargetUnit = params.target + local nOrderType = params.order_type + if nOrderType ~= DOTA_UNIT_ORDER_MOVE_TO_TARGET and nOrderType ~= DOTA_UNIT_ORDER_ATTACK_TARGET then + return + end + + if hTargetUnit == nil or hTargetUnit ~= self:GetParent() then + return + end + + if hOrderedUnit ~= nil and hOrderedUnit:IsRealHero() and hOrderedUnit:GetTeamNumber() == DOTA_TEAM_GOODGUYS and hTargetUnit:GetOwnerEntity() == hOrderedUnit then + self.hPlayerEnt = hOrderedUnit + self:StartIntervalThink( 0.25 ) + return + end + + self:StartIntervalThink( -1 ) + end + + return 0 +end + + +----------------------------------------------------------------------- + +function modifier_morty_start_passive:OnIntervalThink() + if IsServer() then + if self.hPlayerEnt ~= nil then + local flTalkDistance = 250.0 + if flTalkDistance >= ( self.hPlayerEnt:GetOrigin() - self:GetParent():GetOrigin() ):Length2D() then + if GameRules.Aghanim ~= nil and self.bRideStarted == false then + self.hPlayerEnt:Interrupt() + + self:StartIntervalThink( -1 ) + self.bRideStarted = true + + local hRideMorty = self.hPlayerEnt:AddNewModifier( self:GetParent(), nil, "modifier_ride_morty", {} ) + if hRideMorty ~= nil then + self.hPlayerEnt:RemoveModifierByName( "modifier_bonus_room_start" ) + end + + if self.Encounter ~= nil then + self.Encounter:OnPlayerRideMorty( self.hPlayerEnt:GetPlayerOwnerID(), self:GetParent() ) + end + + end + end + end + end +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_nyx_suicide_heal.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_nyx_suicide_heal.lua new file mode 100755 index 0000000..bb9a318 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_nyx_suicide_heal.lua @@ -0,0 +1,56 @@ + +modifier_nyx_suicide_heal = class({}) + +-------------------------------------------------------------- + +function modifier_nyx_suicide_heal:IsHidden() + return true +end + +-------------------------------------------------------------- + +function modifier_nyx_suicide_heal:IsPurgable() + return true +end + +-------------------------------------------------------------- + +function modifier_nyx_suicide_heal:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_DEATH, + } + + return funcs +end +------------------------------------------------------------------- + +function modifier_nyx_suicide_heal:OnDeath( params ) + if IsServer() then + if params.unit == self:GetParent() then + local heal = self:GetAbility():GetSpecialValueFor( "heal" ) + local radius = self:GetAbility():GetSpecialValueFor( "radius" ) + + if self:GetParent().nFXIndex ~= nil then + ParticleManager:DestroyParticle( self:GetParent().nFXIndex, true ) + end + + EmitSoundOn( "Burrower.HealExplosion", self:GetParent() ) + + local nFXIndex2 = ParticleManager:CreateParticle( "particles/nyx_swarm_explosion/nyx_swarm_explosion.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex2, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex2, 1, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex2, 2, Vector( radius, radius, radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex2 ) + + local entities = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), nil, radius, DOTA_UNIT_TARGET_TEAM_BOTH, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + for _,entity in pairs( entities ) do + if entity ~= nil and entity:IsAlive() then + entity:Heal( heal, self:GetAbility() ) + ParticleManager:ReleaseParticleIndex( ParticleManager:CreateParticle( "particles/items3_fx/fish_bones_active.vpcf", PATTACH_ABSORIGIN_FOLLOW, entity ) ) + end + end + end + end +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogre_magi_area_ignite_thinker.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogre_magi_area_ignite_thinker.lua new file mode 100755 index 0000000..bd692d5 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogre_magi_area_ignite_thinker.lua @@ -0,0 +1,52 @@ + +modifier_ogre_magi_area_ignite_thinker = class({}) + +---------------------------------------------------------------------------------------- + +function modifier_ogre_magi_area_ignite_thinker:OnCreated( kv ) + if IsServer() then + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.area_duration = self:GetAbility():GetSpecialValueFor( "area_duration" ) + self.linger_duration = self:GetAbility():GetSpecialValueFor( "linger_duration" ) + self.bImpact = false + end +end + +---------------------------------------------------------------------------------------- + +function modifier_ogre_magi_area_ignite_thinker:OnImpact() + if IsServer() then + local nFXIndex = ParticleManager:CreateParticle( "particles/neutral_fx/black_dragon_fireball.vpcf", PATTACH_WORLDORIGIN, nil ); + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ); + ParticleManager:SetParticleControl( nFXIndex, 1, self:GetParent():GetOrigin() ); + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( self.area_duration, 0, 0 ) ); + ParticleManager:ReleaseParticleIndex( nFXIndex ); + + EmitSoundOn( "OgreMagi.Ignite.Target", self:GetParent() ) + + self:SetDuration( self.area_duration, true ) + self.bImpact = true + + self:StartIntervalThink( 0.5 ) + end +end + +---------------------------------------------------------------------------------------- + +function modifier_ogre_magi_area_ignite_thinker:OnIntervalThink() + if IsServer() then + if self.bImpact == false then + self:OnImpact() + return + end + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil then + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_ogre_magi_ignite", { duration = self.linger_duration } ) + end + end + end +end + +---------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogre_magi_channelled_bloodlust.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogre_magi_channelled_bloodlust.lua new file mode 100755 index 0000000..310ccf2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogre_magi_channelled_bloodlust.lua @@ -0,0 +1,64 @@ + +modifier_ogre_magi_channelled_bloodlust = class({}) + +----------------------------------------------------------------------------- + +function modifier_ogre_magi_channelled_bloodlust:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +----------------------------------------------------------------------------- + +function modifier_ogre_magi_channelled_bloodlust:GetEffectName() + return "particles/units/heroes/hero_ogre_magi/ogre_magi_bloodlust_buff.vpcf" +end + +----------------------------------------------------------------------------- + +function modifier_ogre_magi_channelled_bloodlust:OnCreated( kv ) + if not self:GetAbility() then + return + end + + self.bonus_attack_speed = self:GetAbility():GetSpecialValueFor( "bonus_attack_speed" ) + self.bonus_movement_speed = self:GetAbility():GetSpecialValueFor( "bonus_movement_speed" ) + self.modelscale = self:GetAbility():GetSpecialValueFor( "modelscale" ) + + if IsServer() then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_pugna/pugna_life_drain.vpcf", PATTACH_CUSTOMORIGIN, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetOrigin(), true ) + self:AddParticle( nFXIndex , true, false, 0, false, false ) + end +end + +----------------------------------------------------------------------------- + +function modifier_ogre_magi_channelled_bloodlust:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, + MODIFIER_PROPERTY_MODEL_SCALE, + } + return funcs +end + + +----------------------------------------------------------------------------- + +function modifier_ogre_magi_channelled_bloodlust:GetModifierAttackSpeedBonus_Constant( params ) + return self.bonus_attack_speed +end + +----------------------------------------------------------------------------- + +function modifier_ogre_magi_channelled_bloodlust:GetModifierMoveSpeedBonus_Percentage( params ) + return self.bonus_movement_speed +end + +----------------------------------------------------------------------------- + +function modifier_ogre_magi_channelled_bloodlust:GetModifierModelScale( params ) + return self.modelscale +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogre_seer_area_ignite_thinker.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogre_seer_area_ignite_thinker.lua new file mode 100755 index 0000000..42c4114 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogre_seer_area_ignite_thinker.lua @@ -0,0 +1,52 @@ + +modifier_ogre_seer_area_ignite_thinker = class({}) + +---------------------------------------------------------------------------------------- + +function modifier_ogre_seer_area_ignite_thinker:OnCreated( kv ) + if IsServer() then + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.area_duration = self:GetAbility():GetSpecialValueFor( "area_duration" ) + self.linger_duration = self:GetAbility():GetSpecialValueFor( "linger_duration" ) + self.bImpact = false + end +end + +---------------------------------------------------------------------------------------- + +function modifier_ogre_seer_area_ignite_thinker:OnImpact() + if IsServer() then + local nFXIndex = ParticleManager:CreateParticle( "particles/neutral_fx/black_dragon_fireball.vpcf", PATTACH_WORLDORIGIN, nil ); + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ); + ParticleManager:SetParticleControl( nFXIndex, 1, self:GetParent():GetOrigin() ); + ParticleManager:SetParticleControl( nFXIndex, 2, Vector( self.area_duration, 0, 0 ) ); + ParticleManager:ReleaseParticleIndex( nFXIndex ); + + EmitSoundOn( "OgreMagi.Ignite.Target", self:GetParent() ) + + self:SetDuration( self.area_duration, true ) + self.bImpact = true + + self:StartIntervalThink( 0.5 ) + end +end + +---------------------------------------------------------------------------------------- + +function modifier_ogre_seer_area_ignite_thinker:OnIntervalThink() + if IsServer() then + if self.bImpact == false then + self:OnImpact() + return + end + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil then + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_ogre_magi_ignite", { duration = self.linger_duration } ) + end + end + end +end + +---------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogre_tank_melee_smash_thinker.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogre_tank_melee_smash_thinker.lua new file mode 100755 index 0000000..365e2af --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogre_tank_melee_smash_thinker.lua @@ -0,0 +1,80 @@ + +modifier_ogre_tank_melee_smash_thinker = class({}) + +----------------------------------------------------------------------------- + +function modifier_ogre_tank_melee_smash_thinker:OnCreated( kv ) + if IsServer() then + self.impact_radius = self:GetAbility():GetSpecialValueFor( "impact_radius" ) + self.stun_duration = self:GetAbility():GetSpecialValueFor( "stun_duration" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + + self:StartIntervalThink( 0.01 ) + end +end + +----------------------------------------------------------------------------- + +function modifier_ogre_tank_melee_smash_thinker:OnIntervalThink() + if IsServer() then + if self:GetCaster() == nil or self:GetCaster():IsNull() or self:GetCaster():IsAlive() == false or self:GetCaster():IsStunned() then + --print( string.format( "Caster is nil, dead, or stunned, removing smash thinker" ) ) + UTIL_Remove( self:GetParent() ) + return -1 + end + end +end + +----------------------------------------------------------------------------- + +function modifier_ogre_tank_melee_smash_thinker:OnDestroy() + if IsServer() then + if self:GetCaster() ~= nil and self:GetCaster():IsAlive() then + EmitSoundOnLocationWithCaster( self:GetParent():GetOrigin(), "OgreTank.GroundSmash", self:GetCaster() ) + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/ogre/ogre_melee_smash.vpcf", PATTACH_WORLDORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.impact_radius, self.impact_radius, self.impact_radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local nTeamFlags = DOTA_UNIT_TARGET_TEAM_ENEMY + if self:GetCaster():FindModifierByName( "modifier_aghsfort_winter_wyvern_winters_curse" ) then + nTeamFlags = DOTA_UNIT_TARGET_TEAM_BOTH + end + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.impact_radius, nTeamFlags, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if not ( enemy:IsNull() ) and enemy ~= nil and enemy:IsInvulnerable() == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + if not ( enemy:IsNull() ) and enemy ~= nil and enemy:IsAlive() == false then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, enemy:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, -self:GetCaster():GetForwardVector() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 10, enemy, PATTACH_ABSORIGIN_FOLLOW, nil, enemy:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Dungeon.BloodSplatterImpact", enemy ) + elseif not ( enemy:IsNull() ) and enemy ~= nil then + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_stunned", { duration = self.stun_duration } ) + end + end + end + end + + ScreenShake( self:GetParent():GetOrigin(), 10.0, 100.0, 0.5, 1300.0, 0, true ) + + UTIL_Remove( self:GetParent() ) + end +end + +----------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogreseal_flop.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogreseal_flop.lua new file mode 100755 index 0000000..19142eb --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_ogreseal_flop.lua @@ -0,0 +1,237 @@ + +modifier_ogreseal_flop = class({}) + +-------------------------------------------------------------------------------- + +local OGRE_MINIMUM_HEIGHT_ABOVE_LOWEST = 150 +local OGRE_MINIMUM_HEIGHT_ABOVE_HIGHEST = 33 +local OGRE_ACCELERATION_Z = 1250 +local OGRE_MAX_HORIZONTAL_ACCELERATION = 800 + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:IsStunDebuff() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:RemoveOnDeath() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:OnCreated( kv ) + if IsServer() then + if self.nHopCount == nil then + self.nHopCount = 1 + self.flop_distances = { 200, 400, 400 } + + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/ogre_seal/ogre_seal_warcry.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetOrigin(), true ) + if self:GetCaster():IsRealHero() == false then + ParticleManager:SetParticleControlEnt( nFXIndex, 2, self:GetParent(), PATTACH_POINT_FOLLOW, "mouth", self:GetParent():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 6, self:GetParent(), PATTACH_POINT_FOLLOW, "eye_L", self:GetParent():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 7, self:GetParent(), PATTACH_POINT_FOLLOW, "eye_R", self:GetParent():GetOrigin(), true ) + end + + self:AddParticle( nFXIndex, false, false, -1, false, false ) + end + + if self:GetCaster():IsRealHero() then + self:GetCaster():StartGesture( ACT_DOTA_FLAIL ) + end + + self.bHorizontalMotionInterrupted = false + self.bDamageApplied = false + self.bTargetTeleported = false + + if self:ApplyHorizontalMotionController() == false or self:ApplyVerticalMotionController() == false then + self:Destroy() + return + end + + self.flTimer = 0.0 + self.vStartPosition = GetGroundPosition( self:GetParent():GetOrigin(), self:GetParent() ) + self.flCurrentTimeHoriz = 0.0 + self.flCurrentTimeVert = 0.0 + + self.vLoc = Vector( kv.vLocX, kv.vLocY, kv.vLocZ ) + self.vLastKnownTargetPos = self.vLoc + + local duration = self:GetAbility():GetSpecialValueFor( "duration" ) + local flDesiredHeight = OGRE_MINIMUM_HEIGHT_ABOVE_LOWEST * self.nHopCount * duration * duration + local flLowZ = math.min( self.vLastKnownTargetPos.z, self.vStartPosition.z ) + local flHighZ = math.max( self.vLastKnownTargetPos.z, self.vStartPosition.z ) + local flArcTopZ = math.max( flLowZ + flDesiredHeight, flHighZ + OGRE_MINIMUM_HEIGHT_ABOVE_HIGHEST * self.nHopCount ) + + local flArcDeltaZ = flArcTopZ - self.vStartPosition.z + self.flInitialVelocityZ = math.sqrt( 2.0 * flArcDeltaZ * OGRE_ACCELERATION_Z * self.nHopCount ) + + local flDeltaZ = self.vLastKnownTargetPos.z - self.vStartPosition.z + local flSqrtDet = math.sqrt( math.max( 0, ( self.flInitialVelocityZ * self.flInitialVelocityZ ) - 2.0 * OGRE_ACCELERATION_Z * self.nHopCount * flDeltaZ ) ) + self.flPredictedTotalTime = math.max( ( self.flInitialVelocityZ + flSqrtDet) / ( OGRE_ACCELERATION_Z * self.nHopCount ), ( self.flInitialVelocityZ - flSqrtDet) / ( OGRE_ACCELERATION_Z * self.nHopCount ) ) + + self.vHorizontalVelocity = ( self.vLastKnownTargetPos - self.vStartPosition ) / self.flPredictedTotalTime + self.vHorizontalVelocity.z = 0.0 + end +end + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:OnDestroy() + if IsServer() then + self:GetParent():RemoveHorizontalMotionController( self ) + self:GetParent():RemoveVerticalMotionController( self ) + + if self:GetCaster():IsRealHero() then + self:GetCaster():RemoveGesture( ACT_DOTA_FLAIL ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:DeclareFunctions() + local funcs = + { + -- MODIFIER_PROPERTY_OVERRIDE_ANIMATION, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:CheckState() + local state = + { + [MODIFIER_STATE_STUNNED] = true, + } + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:UpdateHorizontalMotion( me, dt ) + if IsServer() then + self.flTimer = self.flTimer + dt + self.flCurrentTimeHoriz = math.min( self.flCurrentTimeHoriz + dt, self.flPredictedTotalTime ) + local t = self.flCurrentTimeHoriz / self.flPredictedTotalTime + local vStartToTarget = self.vLastKnownTargetPos - self.vStartPosition + local vDesiredPos = self.vStartPosition + t * vStartToTarget + + GridNav:DestroyTreesAroundPoint( me:GetAbsOrigin(), 75, false ) + + --[[ + -- Prevent players from hopping through obstructions (players can cast ogre seal flop with the Ogre Seal Totem item) + if me:IsRealHero() then + if ( not GridNav:CanFindPath( me:GetOrigin(), vDesiredPos ) ) then + self:Destroy() + return + end + end + ]] + + local vOldPos = me:GetOrigin() + local vToDesired = vDesiredPos - vOldPos + vToDesired.z = 0.0 + local vDesiredVel = vToDesired / dt + local vVelDif = vDesiredVel - self.vHorizontalVelocity + local flVelDif = vVelDif:Length2D() + vVelDif = vVelDif:Normalized() + local flVelDelta = math.min( flVelDif, OGRE_MAX_HORIZONTAL_ACCELERATION * self.nHopCount ) + + self.vHorizontalVelocity = self.vHorizontalVelocity + vVelDif * flVelDelta * dt + local vNewPos = vOldPos + self.vHorizontalVelocity * dt + me:SetOrigin( vNewPos ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:UpdateVerticalMotion( me, dt ) + if IsServer() then + self.flCurrentTimeVert = self.flCurrentTimeVert + dt + local bGoingDown = ( -OGRE_ACCELERATION_Z * self.nHopCount * self.flCurrentTimeVert + self.flInitialVelocityZ ) < 0 + + local vNewPos = me:GetOrigin() + vNewPos.z = self.vStartPosition.z + ( -0.5 * OGRE_ACCELERATION_Z * self.nHopCount * ( self.flCurrentTimeVert * self.flCurrentTimeVert ) + self.flInitialVelocityZ * self.flCurrentTimeVert ) + + local flGroundHeight = GetGroundHeight( vNewPos, self:GetParent() ) + local bLanded = false + if ( vNewPos.z < flGroundHeight and bGoingDown == true ) then + vNewPos.z = flGroundHeight + bLanded = true + end + + me:SetOrigin( vNewPos ) + if bLanded == true then + + local bDoneHopping = self.nHopCount == 3 + + if self.bHorizontalMotionInterrupted == false then + if self.nHopCount > 1 then + + self:GetAbility():TryToDamage() + self.flTimer = 0.0 + end + else + bDoneHopping = true + end + + if bDoneHopping then + self:Destroy() + + else + self.nHopCount = self.nHopCount + 1 + self.vLoc = self.vLoc + self:GetCaster():GetForwardVector() * self.flop_distances[ self.nHopCount ] + local kv = + { + vLocX = self.vLoc.x, + vLocY = self.vLoc.y, + vLocZ = self.vLoc.z, + } + self:OnCreated( kv ) + end + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:OnHorizontalMotionInterrupted() + if IsServer() then + self.bHorizontalMotionInterrupted = true + end +end + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:OnVerticalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + +-------------------------------------------------------------------------------- + +function modifier_ogreseal_flop:GetOverrideAnimation( params ) + return ACT_DOTA_OVERRIDE_ABILITY_2 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_phoenix_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_phoenix_passive.lua new file mode 100755 index 0000000..1720cb8 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_phoenix_passive.lua @@ -0,0 +1,47 @@ + +modifier_phoenix_passive = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_phoenix_passive:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_phoenix_passive:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_phoenix_passive:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10000 +end + +-------------------------------------------------------------------------------- + +function modifier_phoenix_passive:OnCreated( kv ) + if IsServer() then + self:GetParent().bAbsoluteNoCC = true -- keep this for the modifier blacklist + end +end + +----------------------------------------------------------------------------------------- + +function modifier_phoenix_passive:CheckState() + local state = + { + [MODIFIER_STATE_HEXED] = false, + [MODIFIER_STATE_ROOTED] = false, + [MODIFIER_STATE_SILENCED] = false, + [MODIFIER_STATE_STUNNED] = false, + [MODIFIER_STATE_FROZEN] = false, + [MODIFIER_STATE_FEARED] = false, + + -- absolute_no_cc was preventing Phoenix from being motion controlled by his own Dive + --[MODIFIER_STATE_CANNOT_BE_MOTION_CONTROLLED] = true, + } + + return state +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_puck_flying_bomb.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_puck_flying_bomb.lua new file mode 100755 index 0000000..c9237e4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_puck_flying_bomb.lua @@ -0,0 +1,129 @@ + +modifier_puck_flying_bomb = class({}) + +------------------------------------------------------------------- + +function modifier_puck_flying_bomb:IsHidden() + return true +end + +------------------------------------------------------------------- + +function modifier_puck_flying_bomb:IsPurgable() + return false +end + +------------------------------------------------------------------- + +function modifier_puck_flying_bomb:RemoveOnDeath() + return false +end + +------------------------------------------------------------------- + +function modifier_puck_flying_bomb:OnCreated( kv ) + if IsServer() then + self.explosion_damage = self:GetAbility():GetSpecialValueFor( "explosion_damage" ) + self.flight_duration = self:GetAbility():GetSpecialValueFor( "flight_duration" ) + self.stun_duration = self:GetAbility():GetSpecialValueFor( "stun_duration" ) + self.explosion_radius = self:GetAbility():GetSpecialValueFor( "explosion_radius" ) + self.flight_speed = self:GetAbility():GetSpecialValueFor( "flight_speed" ) + + self.hBomb = CreateUnitByName( "npc_dota_beastmaster_axe", self:GetParent():GetOrigin(), false, nil, nil, self:GetParent():GetTeamNumber() ) + if self.hBomb == nil then + self:Destroy() + return + end + + self.hBomb:SetBaseMoveSpeed( self.flight_speed ) + + self.hBomb:AddEffects( EF_NODRAW ) + self.hBomb:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_beastmaster_axe_invulnerable", kv ) + + self.vSourceLoc = self:GetCaster():GetOrigin() + --self.vSourceLoc.z = self.vSourceLoc.z + 50 + self.vTargetLoc = Vector( kv["x"], kv["y"], self.vSourceLoc.z ) + local flGroundHeight = GetGroundHeight( self.vTargetLoc, nil ) + self.vTargetLoc.z = flGroundHeight + 50 + + local nDestinationRadius = self.explosion_radius / 2 + self.nPreviewFX = ParticleManager:CreateParticle( "particles/creatures/puck/flying_bomb_destination.vpcf", PATTACH_ABSORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self, PATTACH_ABSORIGIN, nil, self.vTargetLoc, true ) + ParticleManager:SetParticleControl( self.nPreviewFX, 1, Vector( nDestinationRadius, nDestinationRadius, nDestinationRadius ) ) + ParticleManager:SetParticleControl( self.nPreviewFX, 15, Vector( 190, 6, 215 ) ) + + local vForward = self:GetCaster():GetForwardVector() + self.hBomb:SetForwardVector( vForward ) + + self.nBombFXIndex = ParticleManager:CreateParticle( "particles/creatures/puck/puck_flying_bomb.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( self.nBombFXIndex, 0, self.hBomb, PATTACH_ABSORIGIN_FOLLOW, nil, self.hBomb:GetOrigin(), true ) + + EmitSoundOn( "Puck.FlyingBomb.Flight", self.hBomb ) + + self:StartIntervalThink( 0.05 ) + end +end + +------------------------------------------------------------------- + +function modifier_puck_flying_bomb:OnIntervalThink() + if IsServer() then + if not self.bIssuedMoveCommand then + ExecuteOrderFromTable({ + UnitIndex = self.hBomb:entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.vTargetLoc, + }) + + self.bIssuedMoveCommand = true + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_puck_flying_bomb:OnDestroy() + if IsServer() then + if self.nPreviewFX ~= nil then + ParticleManager:DestroyParticle( self.nPreviewFX, false ) + self.nPreviewFX = nil + end + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self.hBomb:GetOrigin(), self.hBomb, self.explosion_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.explosion_damage, + damage_type = self:GetAbility():GetAbilityDamageType(), + ability = self:GetAbility(), + } + ApplyDamage( damageInfo ) + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_stunned", { duration = self.stun_duration } ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_beastmaster/beastmaster_wildaxes_hit.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + + if self.nBombFXIndex then + ParticleManager:DestroyParticle( self.nBombFXIndex, true ) + end + + local vDetonationPos = self.hBomb:GetAbsOrigin() + Vector( 0, 0, 100 ) + local nDetonationFX = ParticleManager:CreateParticle( "particles/creatures/puck/puck_bomb_detonation.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nDetonationFX, 0, vDetonationPos ) + ParticleManager:SetParticleControl( nDetonationFX, 1, Vector( self.explosion_radius, self.explosion_radius, self.explosion_radius ) ) + ParticleManager:ReleaseParticleIndex( nDetonationFX ) + + StopSoundOn( "Puck.FlyingBomb.Flight", self.hBomb ) + EmitSoundOn( "Puck.FlyingBomb.Detonate", self.hBomb ) + + UTIL_Remove( self.hBomb ) + end +end + +------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_rock_golem_split.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_rock_golem_split.lua new file mode 100755 index 0000000..24b1dec --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_rock_golem_split.lua @@ -0,0 +1,98 @@ + +modifier_rock_golem_split = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_rock_golem_split:GetTexture() + return "sandking_caustic_finale" +end + +----------------------------------------------------------------------------------------- + +function modifier_rock_golem_split:OnCreated( kv ) + + if not IsServer() then + return + end + + self.unit_count = self:GetAbility():GetSpecialValueFor( "unit_count" ) + self.spawn_radius = self:GetAbility():GetSpecialValueFor( "spawn_radius" ) + self.knockback_duration_min = self:GetAbility():GetSpecialValueFor( "knockback_duration_min" ) + self.knockback_duration_max = self:GetAbility():GetSpecialValueFor( "knockback_duration_max" ) + self.knockback_distance_min = self:GetAbility():GetSpecialValueFor( "knockback_distance_min" ) + self.knockback_distance_max = self:GetAbility():GetSpecialValueFor( "knockback_distance_max" ) + self.knockback_height_min = self:GetAbility():GetSpecialValueFor( "knockback_height_min" ) + self.knockback_height_max = self:GetAbility():GetSpecialValueFor( "knockback_height_max" ) + + self.split_fx = self:GetAbility().strSplitFx + self.summoned_unit = self:GetAbility().strSummonedUnit + +end + +----------------------------------------------------------------------------------------- + +function modifier_rock_golem_split:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_DEATH, + } + + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_rock_golem_split:OnDeath( params ) + if not IsServer() or params.unit ~= self:GetParent() then + return 0 + end + + EmitSoundOn( "Ability.SplitA", self:GetParent() ) + + local nDeathFX = ParticleManager:CreateParticle( self.split_fx, PATTACH_ABSORIGIN, self:GetParent() ) + + ParticleManager:SetParticleControl( nDeathFX, 1, Vector( 100, 1, 1 ) ); + ParticleManager:SetParticleControl( nDeathFX, 2, Vector( 1, 1, 1 ) ); + ParticleManager:SetParticleControl( nDeathFX, 3, Vector( 100, 100, 100 ) ); + ParticleManager:SetParticleControl( nDeathFX, 4, Vector( 200, 200, 200 ) ); + ParticleManager:SetParticleControl( nDeathFX, 14, Vector( 1, 1, 1 ) ); + ParticleManager:SetParticleControl( nDeathFX, 15, Vector( 100, 100, 100 ) ); + + ParticleManager:ReleaseParticleIndex( nDeathFX ) + + for i = 1,self.unit_count do + local knockback_duration = RandomFloat( self.knockback_duration_min, self.knockback_duration_max ) + local knockback_distance = RandomFloat( self.knockback_distance_min, self.knockback_distance_max ) + local knockback_height = RandomFloat( self.knockback_height_min, self.knockback_height_max ) + print( 'duration: ' .. knockback_duration .. '. distance ' .. knockback_distance .. '. height ' .. knockback_height ) + + local kv = + { + center_x = self:GetParent():GetAbsOrigin().x, + center_y = self:GetParent():GetAbsOrigin().y, + center_z = self:GetParent():GetAbsOrigin().z, + should_stun = true, + duration = knockback_duration, + knockback_duration = knockback_duration, + knockback_distance = knockback_distance, + knockback_height = knockback_height, + } + + vSpawnPosition = self:GetParent():GetAbsOrigin() + RandomVector( self.spawn_radius ) + vSpawnPosition = FindPathablePositionNearby( vSpawnPosition, 250, 250 ) + + vSpawnDirection = vSpawnPosition - self:GetParent():GetAbsOrigin() + vSpawnDirection = vSpawnDirection:Normalized() + local angles = VectorAngles( vSpawnDirection ) + + local hSplitUnit = CreateUnitByName( self.summoned_unit , vSpawnPosition, true, + self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + + hSplitUnit:SetAbsAngles( angles.x, angles.y, angles.z ) + + hSplitUnit:AddNewModifier( hSplitUnit, self:GetAbility(), "modifier_knockback", kv ) + + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_burrow.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_burrow.lua new file mode 100755 index 0000000..93f86ae --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_burrow.lua @@ -0,0 +1,110 @@ +modifier_sand_king_boss_burrow = class({}) + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrow:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrow:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrow:GetPriority() + return MODIFIER_PRIORITY_SUPER_ULTRA +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrow:OnCreated( kv ) + if IsServer() then + local flInterval = 0.65 + if self:GetParent():GetHealthPercent() < 50 then + flInterval = 0.5 + end + if self:GetParent():GetHealthPercent() < 25 then + flInterval = 0.3 + end + self:StartIntervalThink( flInterval ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrow:CheckState() + local state = + { + [MODIFIER_STATE_ROOTED] = true, + [MODIFIER_STATE_DISARMED] = true, + [MODIFIER_STATE_STUNNED] = false, + } + return state +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrow:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS, + MODIFIER_PROPERTY_TURN_RATE_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrow:GetActivityTranslationModifiers( params ) + return "burrowed" +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrow:GetModifierTurnRate_Percentage( params ) + return -50 +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrow:OnIntervalThink() + if IsServer() then + local nBurrowerType = RandomInt( 0, 1 ) + local szBurrowerName = nil + if nBurrowerType == 0 then + szBurrowerName = "npc_dota_creature_healing_burrower" + end + if nBurrowerType == 1 then + szBurrowerName = "npc_dota_creature_big_exploding_burrower" + end + + local hMinion = CreateUnitByName( szBurrowerName, self:GetCaster():GetAbsOrigin(), true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + if hMinion ~= nil then + if self:GetCaster().zone ~= nil then + self:GetCaster().zone:AddEnemyToZone( hMinion ) + end + hMinion.hParent = self:GetCaster() + + local vCasterPos = self:GetCaster():GetAbsOrigin() + local vSpawnPoint = vCasterPos + RandomVector( 1 ) * 2500 + if nBurrowerType ~= 0 then + vSpawnPoint = vCasterPos + RandomVector( RandomFloat( 200, 500 ) ) + end + + FindClearSpaceForUnit( hMinion, vSpawnPoint, true ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, vSpawnPoint ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + if nBurrowerType == 0 then + local nFxIndex2 = ParticleManager:CreateParticle( "particles/units/heroes/hero_huskar/huskar_inner_vitality.vpcf", PATTACH_ABSORIGIN_FOLLOW, hMinion ) + ParticleManager:SetParticleControlEnt( nFxIndex2, 0, hMinion, PATTACH_ABSORIGIN_FOLLOW, nil, hMinion:GetOrigin(), false ) + hMinion.nFXIndex = nFxIndex2 + end + end + end +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_burrowstrike.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_burrowstrike.lua new file mode 100755 index 0000000..1fe9a39 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_burrowstrike.lua @@ -0,0 +1,123 @@ +modifier_sand_king_boss_burrowstrike = class ({}) + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike:GetPriority() + return MODIFIER_PRIORITY_SUPER_ULTRA +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike:OnCreated( kv ) + if IsServer() then + self.vTarget = Vector( kv["x"], kv["y"], kv["z"] ) + self.vDir = self.vTarget - self:GetParent():GetOrigin() + self.vDir = self.vDir:Normalized() + + local flHealthPct = self:GetParent():GetHealthPercent() / 100 + self.speed = self:GetAbility():GetSpecialValueFor( "speed" ) + ( self:GetAbility():GetSpecialValueFor( "scaling_speed" ) * ( 1 - flHealthPct ) ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + + self:GetParent():AddEffects( EF_NODRAW ) + self.nFXIndex = -1 + self.nFXIndex2 = -1 + self.nFXIndex3 = -1 + self:OnIntervalThink() + self:StartIntervalThink( 0.33 ) + if self:ApplyHorizontalMotionController() == false then + self:Destroy() + return + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike:OnDestroy() + if IsServer() then + self:GetParent():RemoveHorizontalMotionController( self ) + self:GetParent():RemoveEffects( EF_NODRAW ) + local kv = + { + x = self.vDir.x, + y = self.vDir.y, + z = self.vDir.z, + } + self:GetParent():AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_sand_king_boss_burrowstrike_end", kv ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike:OnIntervalThink() + if IsServer() then + if self.nFXIndex ~= -1 then + ParticleManager:DestroyParticle( self.nFXIndex, false ) + end + if self.nFXIndex2 ~= -1 then + ParticleManager:DestroyParticle( self.nFXIndex2, false ) + end + if self.nFXIndex3 ~= -1 then + ParticleManager:DestroyParticle( self.nFXIndex3, false ) + end + + self.nFXIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( self.nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControlForward( self.nFXIndex, 0, self:GetParent():GetForwardVector() ) + self.nFXIndex2 = ParticleManager:CreateParticle("particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( self.nFXIndex2, 0, self:GetParent():GetOrigin() + RandomVector( 1 ) * RandomInt( 50, 150 ) ) + ParticleManager:SetParticleControlForward( self.nFXIndex2, 0, self:GetParent():GetRightVector() ) + self.nFXIndex3 = ParticleManager:CreateParticle("particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( self.nFXIndex3, 0, self:GetParent():GetOrigin() + RandomVector( 1 ) * RandomInt( 50, 150 ) ) + ParticleManager:SetParticleControlForward( self.nFXIndex3, 0, -self:GetParent():GetRightVector() ) + + EmitSoundOn( "Hero_NyxAssassin.Burrow.In", self:GetParent() ) + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.radius / 2, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + if #enemies > 0 then + self:Destroy() + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike:UpdateHorizontalMotion( me, dt ) + if IsServer() then + local vNewLocation = self:GetParent():GetOrigin() + self.vDir * self.speed * dt + me:SetOrigin( vNewLocation ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike:OnHorizontalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike:CheckState() + local state = + { + [MODIFIER_STATE_STUNNED] = true, + [MODIFIER_STATE_INVULNERABLE] = true, + } + return state +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_burrowstrike_end.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_burrowstrike_end.lua new file mode 100755 index 0000000..fedc307 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_burrowstrike_end.lua @@ -0,0 +1,215 @@ +modifier_sand_king_boss_burrowstrike_end = class ({}) + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:GetPriority() + return MODIFIER_PRIORITY_SUPER_ULTRA +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:OnCreated( kv ) + if IsServer() then + self.vDir = Vector( kv["x"], kv["y"], kv["z"] ) + + local flHealthPct = self:GetParent():GetHealthPercent() / 100 + self.speed = self:GetAbility():GetSpecialValueFor( "speed" ) + ( self:GetAbility():GetSpecialValueFor( "scaling_speed" ) * ( 1 - flHealthPct ) ) + + self.delay = self:GetAbility():GetSpecialValueFor( "delay" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.stun_duration = self:GetAbility():GetSpecialValueFor( "stun_duration" ) + self.knockback_distance = self:GetAbility():GetSpecialValueFor( "knockback_distance" ) + self.knockback_height = self:GetAbility():GetSpecialValueFor( "knockback_height" ) + + self.bExitGround = false + + self:StartIntervalThink( 0.1 ) + + + if self:ApplyHorizontalMotionController() == false then + self:Destroy() + return + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:OnIntervalThink() + if IsServer() then + if self.bExitGround == false then + EmitSoundOn( "SandKingBoss.BurrowStrike", self:GetParent() ) + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + local kv = + { + center_x = self:GetParent():GetOrigin().x, + center_y = self:GetParent():GetOrigin().y, + center_z = self:GetParent():GetOrigin().z, + should_stun = true, + duration = self.stun_duration, + knockback_duration = self.stun_duration, + knockback_distance = self.knockback_distance, + knockback_height = self.knockback_height, + } + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_knockback", kv ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_elder_titan/elder_titan_echo_stomp_impact_physical.vpcf", PATTACH_ABSORIGIN_FOLLOW, enemy ) + local vDirection = enemy:GetOrigin() - self:GetParent():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + ParticleManager:SetParticleControl( nFXIndex, 1, enemy:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, vDirection ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + self.bExitGround = true + self:StartIntervalThink( self.delay - 0.1 ) + else + local nFXCastIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_elder_titan/elder_titan_echo_stomp_physical.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControl( nFXCastIndex, 1, Vector( self.radius, self.radius, self.radius ) ) + ParticleManager:ReleaseParticleIndex( nFXCastIndex ) + EmitSoundOn( "Burrower.Explosion", self:GetCaster() ) + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + local kv = + { + center_x = self:GetParent():GetOrigin().x, + center_y = self:GetParent():GetOrigin().y, + center_z = self:GetParent():GetOrigin().z, + should_stun = true, + duration = self.stun_duration, + knockback_duration = self.stun_duration, + knockback_distance = self.knockback_distance, + knockback_height = self.knockback_height, + } + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_knockback", kv ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_elder_titan/elder_titan_echo_stomp_impact_physical.vpcf", PATTACH_ABSORIGIN_FOLLOW, enemy ) + local vDirection = enemy:GetOrigin() - self:GetParent():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + ParticleManager:SetParticleControl( nFXIndex, 1, enemy:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, vDirection ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + self:Destroy() + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:UpdateHorizontalMotion( me, dt ) + if IsServer() then + local vNewLocation = self:GetParent():GetOrigin() + self.vDir * ( self.speed / 2 ) * dt + me:SetOrigin( vNewLocation ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:OnHorizontalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:OnDestroy() + if IsServer() then + self:GetParent():RemoveHorizontalMotionController( self ) + end +end + + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:CheckState() + if IsServer() then + local state = + { + [MODIFIER_STATE_INVISIBLE] = self.bExitGround ~= true, + [MODIFIER_STATE_STUNNED] = true, + } + end + return state +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ANIMATION, + MODIFIER_PROPERTY_OVERRIDE_ANIMATION_RATE, + MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS, + MODIFIER_PROPERTY_DISABLE_TURNING, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:GetModifierDisableTurning( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:GetOverrideAnimation( params ) + return ACT_DOTA_SAND_KING_BURROW_OUT +end + +------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:GetOverrideAnimationRate( params ) + return 0.5 +end + +------------------------------------------------------------------------------- + +function modifier_sand_king_boss_burrowstrike_end:GetActivityTranslationModifiers( params ) + return "sandking_rubyspire_burrowstrike" +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_caustic_finale.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_caustic_finale.lua new file mode 100755 index 0000000..8a4d3a5 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_caustic_finale.lua @@ -0,0 +1,70 @@ + +modifier_sand_king_boss_caustic_finale = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_caustic_finale:GetTexture() + return "sandking_caustic_finale" +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_caustic_finale:OnCreated( kv ) + self.caustic_radius = self:GetAbility():GetSpecialValueFor( "caustic_radius" ) + self.caustic_damage = self:GetAbility():GetSpecialValueFor( "caustic_damage" ) + self.nArmorReductionPerStack = math.max( math.floor( self:GetAbility():GetSpecialValueFor( "caustic_armor_reduction_pct" ) * self:GetParent():GetPhysicalArmorValue( false ) / 100 ), 1 ) + if IsServer() then + ParticleManager:ReleaseParticleIndex( ParticleManager:CreateParticle( "particles/units/heroes/hero_sandking/sandking_caustic_finale_debuff.vpcf", PATTACH_ABSORIGIN, self:GetParent() ) ) + end +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_caustic_finale:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + MODIFIER_EVENT_ON_DEATH, + } + + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_caustic_finale:GetModifierPhysicalArmorBonus() + if self.nArmorReductionPerStack == nil then + return 0 + end + + return self.nArmorReductionPerStack * self:GetStackCount() * -1 +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_caustic_finale:OnDeath( params ) + if IsServer() then + if params.unit == self:GetParent() then + EmitSoundOn( "Ability.SandKing_CausticFinale", self:GetParent() ) + ParticleManager:ReleaseParticleIndex( ParticleManager:CreateParticle( "particles/units/heroes/hero_sandking/sandking_caustic_finale_explode.vpcf", PATTACH_ABSORIGIN, self:GetParent() ) ) + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetParent():GetOrigin(), nil, self.caustic_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + for _,hEnemy in pairs( enemies ) do + if hEnemy ~= nil and hEnemy:IsAlive() and hEnemy:IsInvulnerable() == false then + local damageInfo = + { + victim = hEnemy, + attacker = self:GetCaster(), + damage = self.caustic_damage, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self, + } + ApplyDamage( damageInfo ) + + + end + end + end + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_directional_move.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_directional_move.lua new file mode 100755 index 0000000..6072177 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_directional_move.lua @@ -0,0 +1,99 @@ +modifier_sand_king_boss_directional_move = class({}) + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_directional_move:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_directional_move:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_directional_move:OnCreated( kv ) + if IsServer() then + + self.speed = self:GetAbility():GetSpecialValueFor( "speed" ) + if self:ApplyHorizontalMotionController() == false then + self:Destroy() + return + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_directional_move:OnDestroy() + if IsServer() then + self:GetParent():RemoveHorizontalMotionController( self ) + self:GetParent():Interrupt() + end +end + + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_directional_move:UpdateHorizontalMotion( me, dt ) + if IsServer() then + self.vMoveDir = nil + if self:GetAbility():GetAbilityName() == "sand_king_boss_move_left" then + self.vMoveDir = -self:GetParent():GetRightVector() + end + if self:GetAbility():GetAbilityName() == "sand_king_boss_move_right" then + self.vMoveDir = self:GetParent():GetRightVector() + end + if self:GetAbility():GetAbilityName() == "sand_king_boss_move_back" then + self.vMoveDir = -self:GetParent():GetForwardVector() + end + local vNewPos = self:GetParent():GetOrigin() + ( self.vMoveDir * self.speed * dt ) + if not GridNav:CanFindPath( self:GetParent():GetOrigin(), vNewPos ) then + self:Destroy() + return + end + me:SetOrigin( vNewPos ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_directional_move:OnHorizontalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_directional_move:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS, + MODIFIER_PROPERTY_TURN_RATE_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_directional_move:GetActivityTranslationModifiers( params ) + if self:GetAbility():GetAbilityName() == "sand_king_boss_move_left" then -- @fixme: GetAbility can be nil here + return "left" + end + if self:GetAbility():GetAbilityName() == "sand_king_boss_move_right" then + return "right" + end + if self:GetAbility():GetAbilityName() == "sand_king_boss_move_back" then + return "backward" + end + return "" +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_directional_move:GetModifierTurnRate_Percentage( params ) + return -90 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_epicenter.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_epicenter.lua new file mode 100755 index 0000000..33810e4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_epicenter.lua @@ -0,0 +1,111 @@ +modifier_sand_king_boss_epicenter = class({}) + +----------------------------------------------------------------------------- + +function modifier_sand_king_boss_epicenter:IsHidden() + return true +end + +----------------------------------------------------------------------------- + +function modifier_sand_king_boss_epicenter:IsPurgable() + return false +end + +----------------------------------------------------------------------------- + +function modifier_sand_king_boss_epicenter:OnCreated( kv ) + if IsServer() then + if self:GetAbility().nCastCount == nil then + self:GetAbility().nCastCount = 1 + else + self:GetAbility().nCastCount = self:GetAbility().nCastCount + 1 + end + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + self.interval = self:GetAbility():GetSpecialValueFor( "interval" ) + self.pulse_width = self:GetAbility():GetSpecialValueFor( "pulse_width" ) + self.pulse_end_width = self:GetAbility():GetSpecialValueFor( "pulse_end_width" ) + self.pulse_speed = math.min( self:GetAbility():GetSpecialValueFor( "min_pulse_speed" ) + self:GetAbility():GetSpecialValueFor( "speed_step" ) * self:GetAbility().nCastCount, self:GetAbility():GetSpecialValueFor( "max_pulse_speed" ) ) + self.pulse_distance = self:GetAbility():GetSpecialValueFor( "pulse_distance" ) + self.random_pulses_step = self:GetAbility():GetSpecialValueFor( "random_pulses_step" ) + self.random_pulses = math.min( self:GetAbility():GetSpecialValueFor( "min_random_pulses" ) + ( self:GetAbility().nCastCount * self.random_pulses_step ), self:GetAbility():GetSpecialValueFor( "max_random_pulses" ) ) + self:StartIntervalThink( self.interval ) + end +end + +----------------------------------------------------------------------------- + +function modifier_sand_king_boss_epicenter:OnDestroy() + if IsServer() then + end +end + +----------------------------------------------------------------------------- + +function modifier_sand_king_boss_epicenter:OnIntervalThink() + if IsServer() then + EmitSoundOn( "SandKing.Epicenter.PulsesBegin", self:GetCaster() ) + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetCaster(), FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil then + local vDirection = ( enemy:GetOrigin() + RandomVector( 1 ) * self.pulse_width ) - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + local info = + { + Ability = self:GetAbility(), + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = self.pulse_width, + fEndRadius = self.pulse_end_width, + vVelocity = vDirection * self.pulse_speed, + fDistance = self.pulse_distance, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + } + + local proj = {} + proj.handle = ProjectileManager:CreateLinearProjectile( info ) + proj.nFXIndex = ParticleManager:CreateParticle( "particles/test_particle/sand_king_projectile.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( proj.nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( proj.nFXIndex, 1, vDirection * self.pulse_speed ) + ParticleManager:SetParticleControl( proj.nFXIndex, 2, Vector( self.pulse_width, self.pulse_width, 0 ) ) + ParticleManager:SetParticleControl( proj.nFXIndex, 4, Vector( self.pulse_distance / self.pulse_speed + 1, 0, 0 ) ) + + table.insert( self:GetAbility().Projectiles, proj ) + EmitSoundOn( "SandKing.Epicenter.Pulse", self:GetParent() ) + end + end + + for i=1,self.random_pulses do + local vDirection = ( self:GetCaster():GetOrigin() + ( RandomVector( 1 ) * self.pulse_distance ) ) - self:GetCaster():GetOrigin() + vDirection.z = 0.0 + vDirection = vDirection:Normalized() + + local info = + { + Ability = self:GetAbility(), + vSpawnOrigin = self:GetCaster():GetOrigin(), + fStartRadius = self.pulse_width, + fEndRadius = self.pulse_end_width, + vVelocity = vDirection * self.pulse_speed, + fDistance = self.pulse_distance, + Source = self:GetCaster(), + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + } + + local proj = {} + proj.handle = ProjectileManager:CreateLinearProjectile( info ) + proj.nFXIndex = ParticleManager:CreateParticle( "particles/test_particle/sand_king_projectile.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( proj.nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( proj.nFXIndex, 1, vDirection * self.pulse_speed ) + ParticleManager:SetParticleControl( proj.nFXIndex, 2, Vector( self.pulse_width, self.pulse_width, 0 ) ) + ParticleManager:SetParticleControl( proj.nFXIndex, 4, Vector( self.pulse_distance / self.pulse_speed + 1, 0, 0 ) ) + + table.insert( self:GetAbility().Projectiles, proj ) + EmitSoundOn( "SandKing.Epicenter.Pulse", self:GetParent() ) + end + end +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_passive.lua new file mode 100755 index 0000000..85fd2a7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_passive.lua @@ -0,0 +1,154 @@ +modifier_sand_king_boss_passive = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:GetPriority() + return MODIFIER_PRIORITY_ULTRA +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:OnCreated( kv ) + if IsServer() then + self:GetCaster().bInSandStorm = false + end +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:CheckState() + local state = + { + [MODIFIER_STATE_HEXED] = false, + [MODIFIER_STATE_ROOTED] = false, + [MODIFIER_STATE_SILENCED] = false, + [MODIFIER_STATE_STUNNED] = false, + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + [MODIFIER_STATE_FLYING_FOR_PATHING_PURPOSES_ONLY] = true, + } + + if IsServer() then + state[MODIFIER_STATE_CANNOT_MISS] = self.bCannotMiss + state[MODIFIER_STATE_INVISIBLE] = false + state[MODIFIER_STATE_UNSELECTABLE] = self:GetCaster().bInSandStorm + end + return state +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_ATTACKSPEED_REDUCTION_PERCENTAGE, + MODIFIER_PROPERTY_MOVESPEED_REDUCTION_PERCENTAGE, + MODIFIER_PROPERTY_ATTACK_RANGE_BONUS, + MODIFIER_EVENT_ON_ATTACK_START, + MODIFIER_EVENT_ON_ATTACK_LANDED, + MODIFIER_PROPERTY_EVASION_CONSTANT, + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:GetModifierAttackSpeedReductionPercentage( params ) + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:GetModifierMoveSpeedReductionPercentage( params ) + return 20 +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:GetModifierAttackRangeBonus( params ) + if IsServer() then + if self.bInAttack == true then + return 200 + else + return 0 + end + end + return 0 +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:OnAttackStart( params ) + if IsServer() then + if self:GetParent() == params.attacker then + self.bInAttack = true + if RollPercentage( self:GetAbility():GetSpecialValueFor( "accuracy_pct" ) ) then + self.bCannotMiss = true + else + self.bCannotMiss = false + end + end + end + return 0 +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:OnAttackLanded( params ) + if IsServer() then + if self:GetParent() == params.attacker then + self.bInAttack = false + + local Target = params.target + if Target ~= nil then + local caustic_duration = self:GetAbility():GetSpecialValueFor( "caustic_duration" ) + local hCausticBuff = Target:FindModifierByName( "modifier_sand_king_boss_caustic_finale" ) + if hCausticBuff == nil then + hCausticBuff = Target:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_sand_king_boss_caustic_finale", { duration = caustic_duration } ) + if hCausticBuff ~= nil then + hCausticBuff:SetStackCount( 0 ) + end + end + if hCausticBuff ~= nil then + hCausticBuff:SetStackCount( hCausticBuff:GetStackCount() + 1 ) + hCausticBuff:SetDuration( caustic_duration, true ) + end + end + end + end + return 0 +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:GetModifierEvasion_Constant( params ) + return 33 +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_passive:OnTakeDamage( params ) + if IsServer() then + local hAttacker = params.attacker + local hVictim = params.unit + if hAttacker ~= nil and hVictim ~= nil and hVictim == self:GetParent() then + if hVictim:FindModifierByName( "modifier_provide_vision" ) == nil then + --printf( "Provide Vision" ) + hVictim:AddNewModifier( hAttacker, self:GetAbility(), "modifier_provide_vision", { duration = -1 } ) + end + end + end + return 0 +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_sandstorm.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_sandstorm.lua new file mode 100755 index 0000000..564b92a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_sandstorm.lua @@ -0,0 +1,130 @@ +modifier_sand_king_boss_sandstorm = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:IsAura() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:GetModifierAura() + return "modifier_sand_king_boss_sandstorm_effect" +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:GetAuraRadius() + return self.sand_storm_radius +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_ENEMY +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:OnCreated( kv ) + if IsServer() then + if self:ApplyHorizontalMotionController() == false then + self:Destroy() + return + end + + self.nProjHandle = self:GetParent().nProjHandle + self.sand_storm_radius = self:GetAbility():GetSpecialValueFor( "sand_storm_radius" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + self.storm_move_speed = self:GetAbility():GetSpecialValueFor( "storm_move_speed" ) + self.storm_decreased_turn_rate = self:GetAbility():GetSpecialValueFor( "storm_decreased_turn_rate" ) + + EmitSoundOn( "SandKingBoss.SandStorm.loop", self:GetParent() ) + end +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:OnDestroy() + if IsServer() then + self:GetParent():RemoveHorizontalMotionController( self ) + StopSoundOn( "SandKingBoss.SandStorm.loop", self:GetParent() ) + if self.nProjHandle ~= nil then + ProjectileManager:DestroyLinearProjectile( self.nProjHandle ) + end + end +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:CheckState() + local state = + { + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + [MODIFIER_STATE_FLYING_FOR_PATHING_PURPOSES_ONLY] = true, + [MODIFIER_STATE_INVULNERABLE] = true, + } + return state +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:DeclareFunctions() + local funcs = + { + --MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE, + MODIFIER_PROPERTY_TURN_RATE_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:GetModifierTurnRate_Percentage( params ) + return -self.storm_decreased_turn_rate +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:UpdateHorizontalMotion( me, dt ) + if IsServer() then + if self.nProjHandle == nil then + local vForward = self:GetParent():GetForwardVector() + local vNewPos = self:GetParent():GetOrigin() + vForward * dt * self:GetParent().storm_speed + me:SetOrigin( vNewPos ) + else + local vNewPos = ProjectileManager:GetLinearProjectileLocation( self.nProjHandle ) + me:SetOrigin( vNewPos ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm:OnHorizontalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + + + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_sandstorm_blind.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_sandstorm_blind.lua new file mode 100755 index 0000000..eb4e5af --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_sandstorm_blind.lua @@ -0,0 +1,12 @@ +modifier_sand_king_boss_sandstorm_blind = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm_blind:CheckState() + local state = + { + [MODIFIER_STATE_BLIND] = true, + } + return state +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_sandstorm_effect.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_sandstorm_effect.lua new file mode 100755 index 0000000..207abb9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_boss_sandstorm_effect.lua @@ -0,0 +1,65 @@ +modifier_sand_king_boss_sandstorm_effect = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm_effect:OnCreated( kv ) + self.movespeed_pct = self:GetAbility():GetSpecialValueFor( "movespeed_pct" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + self.blind_duration = self:GetAbility():GetSpecialValueFor( "blind_duration" ) + if IsServer() then + self:StartIntervalThink( 0.5 ) + end +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm_effect:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, + } + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm_effect:CheckState() + local state = + { + } + return state +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm_effect:GetModifierMoveSpeedBonus_Percentage( params ) + return -self.movespeed_pct +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm_effect:OnIntervalThink() + if IsServer() then + if self:GetParent() and self:GetParent():IsInvulnerable() == false then + + local damageInfo = + { + victim = self:GetParent(), + attacker = self:GetCaster(), + damage = self.damage / 2, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self:GetAbility() + } + + ApplyDamage( damageInfo ) + end + end +end + +----------------------------------------------------------------------------------------- + +function modifier_sand_king_boss_sandstorm_effect:OnDestroy() + if IsServer() then + --self:GetParent():AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_sand_king_boss_sandstorm_blind", { duration = self.blind_duration } ) + end +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_claw_attack.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_claw_attack.lua new file mode 100755 index 0000000..591bafd --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_claw_attack.lua @@ -0,0 +1,158 @@ +modifier_sand_king_claw_attack = class ({}) + +-------------------------------------------------------------------------------- + +function modifier_sand_king_claw_attack:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_claw_attack:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_claw_attack:OnCreated( kv ) + if IsServer() then + self.damage_radius = self:GetAbility():GetSpecialValueFor( "damage_radius" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + self.forward_movement = self:GetAbility():GetSpecialValueFor( "forward_movement" ) + self.hHitTargets = {} + + self:StartIntervalThink( kv["initial_delay"] ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_claw_attack:OnIntervalThink() + if IsServer() then + self:StartIntervalThink( 0.01 ) + local vForward = self:GetParent():GetForwardVector() + self:GetParent():SetOrigin( self:GetParent():GetOrigin() + vForward * self.forward_movement ) + + local szSequenceName = self:GetParent():GetSequence() + local attachAttack1 = nil + local attachAttack2 = nil + local vLocation1 = nil + local vLocation2 = nil + if szSequenceName == "sand_king_attack3_anim" or szSequenceName == "sand_king_attack_anim" then + attachAttack1 = self:GetParent():ScriptLookupAttachment( "attach_attack1" ) + vLocation1 = self:GetParent():GetAttachmentOrigin( attachAttack1 ) + + end + if szSequenceName == "sand_king_attack3_anim" or szSequenceName == "sand_king_attack2_anim" then + attachAttack2 = self:GetParent():ScriptLookupAttachment( "attach_attack2" ) + vLocation2 = self:GetParent():GetAttachmentOrigin( attachAttack2 ) + end + + if attachAttack1 ~= nil then + --DebugDrawCircle( vLocation1, Vector( 0, 255, 0 ), 255, self.damage_radius, false, 1.0 ) + local enemies1 = FindUnitsInRadius( self:GetParent():GetTeamNumber(), vLocation1, self:GetCaster(), self.damage_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + if #enemies1 > 0 then + for _,enemy in pairs( enemies1 ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and self:HasHitTarget( enemy ) == false then + self:AddHitTarget( enemy ) + local damageInfo = + { + victim = enemy, + attacker = self:GetParent(), + damage = self.damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + --enemy:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_bloodseeker_rupture", { duration = self:GetAbility():GetSpecialValueFor( "duration" ) } ) + EmitSoundOn( "DOTA_Item.Maim", enemy ) + end + end + end + end + + if attachAttack2 ~= nil then + --DebugDrawCircle( vLocation2, Vector( 0, 0, 255 ), 255, self.damage_radius, false, 1.0 ) + local enemies2 = FindUnitsInRadius( self:GetParent():GetTeamNumber(), vLocation2, self:GetCaster(), self.damage_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + if #enemies2 > 0 then + for _,enemy in pairs( enemies2 ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and self:HasHitTarget( enemy ) == false then + self:AddHitTarget( enemy ) + local damageInfo = + { + victim = enemy, + attacker = self:GetParent(), + damage = self.damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + --enemy:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_bloodseeker_rupture", { duration = self:GetAbility():GetSpecialValueFor( "duration" ) } ) + EmitSoundOn( "DOTA_Item.Maim", enemy ) + end + end + end + end + + --DebugDrawCircle( self:GetParent():GetOrigin(), Vector( 0, 0, 255 ), 255, self.damage_radius, false, 1.0 ) + local enemies3 = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetCaster(), self.damage_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + if #enemies3 > 0 then + for _,enemy in pairs( enemies3 ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and self:HasHitTarget( enemy ) == false then + self:AddHitTarget( enemy ) + local damageInfo = + { + victim = enemy, + attacker = self:GetParent(), + damage = self.damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + --enemy:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_bloodseeker_rupture", { duration = self:GetAbility():GetSpecialValueFor( "duration" ) } ) + EmitSoundOn( "DOTA_Item.Maim", enemy ) + end + end + end + + FindClearSpaceForUnit( self:GetParent(), self:GetParent():GetOrigin(), false ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_claw_attack:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_DISABLE_TURNING, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_claw_attack:GetModifierDisableTurning( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_claw_attack:HasHitTarget( hTarget ) + for _, target in pairs( self.hHitTargets ) do + if target == hTarget then + return true + end + end + + return false +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_claw_attack:AddHitTarget( hTarget ) + table.insert( self.hHitTargets, hTarget ) +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_tail_swipe.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_tail_swipe.lua new file mode 100755 index 0000000..db9dbcd --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_sand_king_tail_swipe.lua @@ -0,0 +1,178 @@ +modifier_sand_king_tail_swipe = class ({}) + +-------------------------------------------------------------------------------- + +function modifier_sand_king_tail_swipe:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_tail_swipe:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_tail_swipe:OnCreated( kv ) + if IsServer() then + self.nPreviewFX = ParticleManager:CreateParticle( "particles/units/heroes/hero_sandking/sandking_epicenter_tell.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( self.nPreviewFX, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_tail", self:GetCaster():GetOrigin(), true ) + + self.damage_radius = self:GetAbility():GetSpecialValueFor( "damage_radius" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + self.stun_duration = self:GetAbility():GetSpecialValueFor( "stun_duration" ) + self.knockback_distance = self:GetAbility():GetSpecialValueFor( "knockback_distance" ) + self.knockback_height = self:GetAbility():GetSpecialValueFor( "knockback_height" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + self.slow_duration = self:GetAbility():GetSpecialValueFor( "slow_duration" ) + + + self.hHitTargets = {} + + self:StartIntervalThink( kv["initial_delay"] ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_tail_swipe:OnIntervalThink() + if IsServer() then + local tail1 = self:GetParent():ScriptLookupAttachment( "attach_tail" ) + local tail2 = self:GetParent():ScriptLookupAttachment( "attach_tail2" ) + local tail3 = self:GetParent():ScriptLookupAttachment( "attach_tail3" ) + local tail4 = self:GetParent():ScriptLookupAttachment( "attach_tail4" ) + local vLocation1 = self:GetParent():GetAttachmentOrigin( tail1 ) + local vLocation2 = self:GetParent():GetAttachmentOrigin( tail2 ) + local vLocation3 = self:GetParent():GetAttachmentOrigin( tail3 ) + local vLocation4 = self:GetParent():GetAttachmentOrigin( tail4 ) + local Locations = {} + table.insert( Locations, vLocation1 ) + table.insert( Locations, vLocation2 ) + table.insert( Locations, vLocation3 ) + table.insert( Locations, vLocation4 ) + + if self:GetParent():FindModifierByName( "modifier_sand_king_boss_burrow" ) ~= nil then + for _,vPos in pairs ( Locations ) do + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/ogre/ogre_melee_smash.vpcf", PATTACH_WORLDORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, vPos ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.damage_radius, self.damage_radius, self.damage_radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), vPos, self:GetParent(), self.damage_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and self:HasHitTarget( enemy ) == false then + self:AddHitTarget( enemy ) + + local passive = self:GetCaster():FindAbilityByName( "sand_king_boss_passive" ) + local caustic_duration = passive:GetSpecialValueFor( "caustic_duration" ) + local hCausticBuff = enemy:FindModifierByName( "modifier_sand_king_boss_caustic_finale" ) + if hCausticBuff == nil then + hCausticBuff = enemy:AddNewModifier( self:GetCaster(), passive, "modifier_sand_king_boss_caustic_finale", { duration = caustic_duration } ) + hCausticBuff:SetStackCount( 0 ) + end + hCausticBuff:SetStackCount( hCausticBuff:GetStackCount() + 1 ) + hCausticBuff:SetDuration( caustic_duration, true ) + + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_stunned", { duration = self.stun_duration } ) + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_polar_furbolg_ursa_warrior_thunder_clap", { duration = self.slow_duration } ) + end + end + end + + EmitSoundOnLocationWithCaster( vLocation4, "OgreTank.GroundSmash", self:GetCaster() ) + self:StartIntervalThink( -1 ) + else + self:StartIntervalThink( 0.01 ) + for _,vPos in pairs( Locations ) do + --DebugDrawCircle( vPos, Vector( 0, 255, 0 ), 255, self.damage_radius, false, 1.0 ) + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), vPos, self:GetParent(), self.damage_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and self:HasHitTarget( enemy ) == false then + self:AddHitTarget( enemy ) + + local passive = self:GetCaster():FindAbilityByName( "sand_king_boss_passive" ) + local caustic_duration = passive:GetSpecialValueFor( "caustic_duration" ) + local hCausticBuff = enemy:FindModifierByName( "modifier_sand_king_boss_caustic_finale" ) + if hCausticBuff == nil then + hCausticBuff = enemy:AddNewModifier( self:GetCaster(), passive, "modifier_sand_king_boss_caustic_finale", { duration = caustic_duration } ) + hCausticBuff:SetStackCount( 0 ) + end + hCausticBuff:SetStackCount( hCausticBuff:GetStackCount() + 1 ) + hCausticBuff:SetDuration( caustic_duration, true ) + + local damageInfo = + { + victim = enemy, + attacker = self:GetParent(), + damage = self.damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + local kv = + { + center_x = self:GetParent():GetOrigin().x, + center_y = self:GetParent():GetOrigin().y, + center_z = self:GetParent():GetOrigin().z, + should_stun = true, + duration = self.stun_duration, + knockback_duration = self.stun_duration, + knockback_distance = self.knockback_distance, + knockback_height = self.knockback_height, + } + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_knockback", kv ) + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_polar_furbolg_ursa_warrior_thunder_clap", { duration = self.slow_duration } ) + EmitSoundOn( "DOTA_Item.Maim", enemy ) + end + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_tail_swipe:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_DISABLE_TURNING, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_tail_swipe:GetModifierDisableTurning( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_tail_swipe:HasHitTarget( hTarget ) + for _, target in pairs( self.hHitTargets ) do + if target == hTarget then + return true + end + end + + return false +end + +-------------------------------------------------------------------------------- + +function modifier_sand_king_tail_swipe:AddHitTarget( hTarget ) + table.insert( self.hHitTargets, hTarget ) +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_scarab_priest_summon_mound.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_scarab_priest_summon_mound.lua new file mode 100755 index 0000000..37c12f0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_scarab_priest_summon_mound.lua @@ -0,0 +1,97 @@ + +modifier_scarab_priest_summon_mound = class({}) + +-------------------------------------------------------------- + +function modifier_scarab_priest_summon_mound:IsHidden() + return true +end + +-------------------------------------------------------------- + +function modifier_scarab_priest_summon_mound:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_scarab_priest_summon_mound:OnCreated( kv ) + if IsServer() then + self.szSummonedUnitName = kv.summoned_unit + + local nSmokeFX = ParticleManager:CreateParticle( "particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow_exit.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nSmokeFX, 0, self:GetParent():GetAbsOrigin() ) + ParticleManager:ReleaseParticleIndex( nSmokeFX ) + + self:StartIntervalThink( self:GetDuration() - 0.5 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_scarab_priest_summon_mound:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_DEATH, + } + + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_scarab_priest_summon_mound:OnIntervalThink() + + local nUnburrowFX = ParticleManager:CreateParticle( "particles/units/heroes/hero_nyx_assassin/nyx_assassin_burrow_exit.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nUnburrowFX, 0, self:GetParent():GetAbsOrigin() ) + ParticleManager:ReleaseParticleIndex( nUnburrowFX ) + + EmitSoundOn( "Creature.Burrow.Out", self:GetParent() ) + self:StartIntervalThink( -1 ) + +end + +------------------------------------------------------------------- + +function modifier_scarab_priest_summon_mound:OnDestroy() + if not IsServer() then + return + end + + if self:GetParent():IsAlive() then + + self.bSpawned = true + local hMinion = CreateUnitByName( self.szSummonedUnitName, self:GetParent():GetAbsOrigin(), true, self:GetCaster(), self:GetCaster(), self:GetCaster():GetTeamNumber() ) + if hMinion ~= nil then + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetAbsOrigin() ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + end + + self:GetParent():ForceKill( false ) + + end + + UTIL_Remove( self:GetParent() ) + +end + +------------------------------------------------------------------- + +function modifier_scarab_priest_summon_mound:OnDeath( params ) + if not IsServer() or params.unit ~= self:GetParent() or self.bSpawned == true then + return + end + + EmitSoundOn( "Burrower.HealExplosion", self:GetParent() ) + + local nFXIndex2 = ParticleManager:CreateParticle( "particles/nyx_swarm_explosion/nyx_swarm_explosion.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex2, 0, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex2, 1, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex2, 2, Vector( 300, 300, 300 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex2 ) + +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_shroomling_enrage.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_shroomling_enrage.lua new file mode 100755 index 0000000..0367f5f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_shroomling_enrage.lua @@ -0,0 +1,81 @@ + +modifier_shroomling_enrage = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_shroomling_enrage:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_shroomling_enrage:OnCreated( kv ) + self.enrage_movespeed_bonus = 400 + self.enrage_attack_speed_bonus = 50 + self.enrage_model_scale_bonus = 40 + self.enrage_lifesteal_bonus_pct = 50 + + if IsServer() then + EmitSoundOn( "DOTA_Item.MaskOfMadness.Activate", self:GetParent() ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_shroomling_enrage:GetEffectName() + return "particles/items2_fx/mask_of_madness.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_shroomling_enrage:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT, + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + MODIFIER_PROPERTY_MODEL_SCALE, + MODIFIER_EVENT_ON_ATTACKED, + } + + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_shroomling_enrage:GetModifierMoveSpeedBonus_Constant( params ) + return self.enrage_movespeed_bonus +end + +----------------------------------------------------------------------------------------- + +function modifier_shroomling_enrage:GetModifierAttackSpeedBonus_Constant( params ) + return self.enrage_attack_speed_bonus +end + +----------------------------------------------------------------------------------------- + +function modifier_shroomling_enrage:GetModifierModelScale( params ) + return self.enrage_model_scale_bonus +end + +----------------------------------------------------------------------------------------- + +function modifier_shroomling_enrage:OnAttacked( params ) + if IsServer() then + + --print( 'modifier_shroomling_enrage:OnAttacked' ) + + if self:GetParent():PassivesDisabled() then + return 1 + end + + if params.attacker ~= nil and params.attacker == self:GetParent() and params.target ~= nil then + local heal = ( params.damage * self.enrage_lifesteal_bonus_pct / 100 ) + --print( 'modifier_shroomling_enrage healing for ' .. heal ) + self:GetParent():Heal( heal, nil ) + ParticleManager:ReleaseParticleIndex( ParticleManager:CreateParticle( "particles/generic_gameplay/generic_lifesteal.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) ) + end + end + + return 1 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_shroomling_sleep.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_shroomling_sleep.lua new file mode 100755 index 0000000..845d2e6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_shroomling_sleep.lua @@ -0,0 +1,141 @@ + +modifier_shroomling_sleep = class({}) + +-------------------------------------------------------------------------------- + +function modifier_shroomling_sleep:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_shroomling_sleep:CanParentBeAutoAttacked() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_shroomling_sleep:OnCreated( kv ) + if IsServer() then + --print( 'modifier_shroomling_sleep:OnCreated()' ) + self.nWakeRange = 200 + self:StartIntervalThink( 1 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_shroomling_sleep:CheckState() + local state = {} + if IsServer() then + state[MODIFIER_STATE_ROOTED] = true + state[MODIFIER_STATE_BLIND] = true + state[MODIFIER_STATE_STUNNED] = true + state[MODIFIER_STATE_SILENCED] = true + end + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_shroomling_sleep:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_ATTACKED, + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_shroomling_sleep:GetEffectName() + return "particles/generic_gameplay/generic_sleep.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_shroomling_sleep:GetEffectAttachType() + return PATTACH_OVERHEAD_FOLLOW +end + +----------------------------------------------------------------------------- + +function modifier_shroomling_sleep:OnDurationExpired( params ) + --print( 'modifier_shroomling_sleep:OnDurationExpired' ) + if IsServer() then + self:GetParent():AddNewModifier( self:GetParent(), nil, "modifier_shroomling_weakened", { duration = -1.0 } ) + end + + return 0 +end + +-------------------------------------------------------------------------------- +--[[ +function modifier_shroomling_sleep:OnDestroy() + if IsServer() then + end +end +--]] +-------------------------------------------------------------------------------- + +function modifier_shroomling_sleep:OnAttacked( params ) + if IsServer() then + if params.target == self:GetParent() then + self:Destroy() + self:GetParent():AddNewModifier( self:GetParent(), nil, "modifier_shroomling_enrage", { duration = -1.0 } ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_shroomling_sleep:OnTakeDamage( params ) + if IsServer() then + if params.unit == self:GetParent() then + self:Destroy() + self:GetParent():AddNewModifier( self:GetParent(), nil, "modifier_shroomling_enrage", { duration = -1.0 } ) + end + end + + return 0 +end + +----------------------------------------------------------------------------- + +function modifier_shroomling_sleep:OnIntervalThink() + if IsServer() then + -- don't wake up while we are still invulnerable + local hInvulnBuff = self:GetParent():FindModifierByName( "modifier_invulnerable" ) + if hInvulnBuff ~= nil then + --print( 'modifier_shroomling_sleep:OnIntervalThink() - shroom is currently invulnerable - skipping wakeup check!' ) + return + end + + local hEnemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), nil, self.nWakeRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + --print( 'modifier_shroomling_sleep:OnIntervalThink() found enemies = ' .. #hEnemies ) + if #hEnemies > 0 then + self:Destroy() + self:GetParent():AddNewModifier( self:GetParent(), nil, "modifier_shroomling_enrage", { duration = -1.0 } ) + end + end +end + +-------------------------------------------------------------------------------- + +--[[ +function modifier_shroomling_sleep:OnDestroy() + if not IsServer() then + return + end + + local hAllies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _, hAlly in pairs( hAllies ) do + if hAlly:HasModifier( "modifier_shroomling_sleep" ) then + hAlly:RemoveModifierByName( "modifier_shroomling_sleep" ) + end + end +end +--]] +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_shroomling_weakened.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_shroomling_weakened.lua new file mode 100755 index 0000000..2ad6824 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_shroomling_weakened.lua @@ -0,0 +1,44 @@ + +modifier_shroomling_weakened = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_shroomling_weakened:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_shroomling_weakened:OnCreated( kv ) + self.enrage_model_scale_bonus = -20 +end + +-------------------------------------------------------------------------------- + +function modifier_shroomling_weakened:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MODEL_SCALE, + MODIFIER_PROPERTY_EXTRA_HEALTH_PERCENTAGE, + } + + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_shroomling_weakened:GetModifierModelScale( params ) + return self.enrage_model_scale_bonus +end + +----------------------------------------------------------------------------------------- + +function modifier_shroomling_weakened:GetModifierExtraHealthPercentage( params ) + if self:GetCaster() == nil or self:GetCaster():PassivesDisabled() then + return 0 + end + + -- How is this number intended to work? It seems to have regressed. + return -200 --8.0 --self.bonus_hp_multiplier +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_skeleton_king_boss_run.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_skeleton_king_boss_run.lua new file mode 100755 index 0000000..76e5641 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_skeleton_king_boss_run.lua @@ -0,0 +1,29 @@ +modifier_skeleton_king_boss_run = class({}) + +-------------------------------------------------------------------------------- + +function modifier_skeleton_king_boss_run:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_skeleton_king_boss_run:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_skeleton_king_boss_run:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_skeleton_king_boss_run:GetActivityTranslationModifiers( params ) + return "run" +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_slark_sleep.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_slark_sleep.lua new file mode 100755 index 0000000..5ecde50 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_slark_sleep.lua @@ -0,0 +1,42 @@ + +modifier_slark_sleep = class({}) + +-------------------------------------------------------------------------------- + +function modifier_slark_sleep:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_slark_sleep:CanParentBeAutoAttacked() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_slark_sleep:CheckState() + local state = {} + if IsServer() then + state[MODIFIER_STATE_ROOTED] = true + state[MODIFIER_STATE_BLIND] = true + state[MODIFIER_STATE_STUNNED] = true + state[MODIFIER_STATE_SILENCED] = true + end + + return state +end + +----------------------------------------------------------------------- + +function modifier_slark_sleep:GetEffectName() + return "particles/generic_gameplay/generic_sleep.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_slark_sleep:GetEffectAttachType() + return PATTACH_OVERHEAD_FOLLOW +end + +----------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_spider_egg_sack.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_spider_egg_sack.lua new file mode 100755 index 0000000..12f2cc1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_spider_egg_sack.lua @@ -0,0 +1,141 @@ + +modifier_spider_egg_sack = class({}) + +------------------------------------------------------------------- + +function modifier_spider_egg_sack:IsHidden() + return true +end + +------------------------------------------------------------------- + +function modifier_spider_egg_sack:CheckState() + local state = + { + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + [MODIFIER_STATE_NO_UNIT_COLLISION] = false, + [MODIFIER_STATE_INVULNERABLE] = true, + } + return state +end + +------------------------------------------------------------------- + +function modifier_spider_egg_sack:OnCreated( kv ) + if IsServer() then + self.spider_min = self:GetAbility():GetSpecialValueFor( "spider_min" ) + self.spider_max = self:GetAbility():GetSpecialValueFor( "spider_max" ) + self.trigger_radius = self:GetAbility():GetSpecialValueFor( "trigger_radius" ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.duration = self:GetAbility():GetSpecialValueFor( "duration" ) + + self.bBurst = false + self.bTriggered = false + self:StartIntervalThink( 0.25 ) + + end +end + +------------------------------------------------------------------- + +function modifier_spider_egg_sack:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_DEATH, + } + + return funcs +end + +------------------------------------------------------------------- + +function modifier_spider_egg_sack:OnDeath( params ) + if IsServer() then + if params.unit == self:GetParent() then + self:Burst( nil ) + end + end +end + +------------------------------------------------------------------- + +function modifier_spider_egg_sack:OnIntervalThink() + if IsServer() then + if self.bTriggered == false then + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.trigger_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + if #enemies > 0 then + self.bTriggered = true + return + end + else + self:Burst( nil ) + self:StartIntervalThink( -1 ) + end + end +end + +------------------------------------------------------------------- + +function modifier_spider_egg_sack:Burst( hHero ) + if IsServer() then + if self.bBurst == true then + return + end + + local hTarget = hHero + if hHero == nil then + hTarget = self:GetParent() + end + + for i=0,RandomInt( self.spider_min, self.spider_max ) do + local nMaxDistance = 25 + local vSpawnLoc = nil + + local nMaxAttempts = 3 + local nAttempts = 0 + + repeat + if nAttempts > nMaxAttempts then + vSpawnLoc = nil + printf( "WARNING - modifier_spider_egg_sack - failed to find valid spawn loc for newborn spider" ) + break + end + + local vPos = self:GetParent():GetAbsOrigin() + RandomVector( nMaxDistance ) + vSpawnLoc = FindPathablePositionNearby( vPos, 0, 50 ) + nAttempts = nAttempts + 1 + until ( GameRules.Aghanim:GetCurrentRoom():IsInRoomBounds( vSpawnLoc ) ) + + if vSpawnLoc == nil then + vSpawnLoc = self:GetParent():GetOrigin() + end + + if vSpawnLoc ~= nil then + CreateUnitByName( "npc_dota_creature_newborn_spider", vSpawnLoc, true, nil, nil, DOTA_TEAM_BADGUYS ) + else + printf( "WARNING - modifier_spider_egg_sack: failed to spawn newborn spider" ) + end + end + + self.bBurst = true + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_venomancer/venomancer_poison_nova.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.radius / 2, 0.4, self.radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs ( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and enemy:IsMagicImmune() == false then + --print( "Add modifier for " .. self.duration ) + enemy:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_venomancer_poison_nova", { duration = self.duration } ) + end + end + + EmitSoundOn( "Broodmother.LarvalParasite.Burst", self:GetParent() ) + EmitSoundOn( "EggSac.Burst", self:GetParent() ) + self:GetParent():AddEffects( EF_NODRAW ) + self:GetParent():ForceKill( false ) + end +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_arm_slam.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_arm_slam.lua new file mode 100755 index 0000000..822d901 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_arm_slam.lua @@ -0,0 +1,146 @@ + +modifier_storegga_arm_slam = class ({}) + +-------------------------------------------------------------------------------- + +function modifier_storegga_arm_slam:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_arm_slam:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_arm_slam:OnCreated( kv ) + if IsServer() then + self.damage_radius = self:GetAbility():GetSpecialValueFor( "damage_radius" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + self.stun_duration = self:GetAbility():GetSpecialValueFor( "stun_duration" ) + self.bAttackBegin = false + self.hHitTargets = {} + self:StartIntervalThink( kv["initial_delay"] / 2 ) + end + +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_arm_slam:OnIntervalThink() + if IsServer() then + if self.bAttackBegin == false then + self.bAttackBegin = true + return + end + local attach1 = self:GetParent():ScriptLookupAttachment( "attach_attack1" ) + local attach2 = self:GetParent():ScriptLookupAttachment( "attach_attack1_2" ) + + local vLocation1 = self:GetParent():GetAttachmentOrigin( attach1 ) + vLocation1 = GetGroundPosition( vLocation1, self:GetParent() ) + local vLocation2 = self:GetParent():GetAttachmentOrigin( attach2 ) + vLocation2 = GetGroundPosition( vLocation2, self:GetParent() ) + local Locations = {} + table.insert( Locations, vLocation1 ) + table.insert( Locations, vLocation2 ) + + for _,vPos in pairs ( Locations ) do + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/ogre/ogre_melee_smash.vpcf", PATTACH_WORLDORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, vPos ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.damage_radius, self.damage_radius, self.damage_radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), vPos, self:GetParent(), self.damage_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and self:HasHitTarget( enemy ) == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self, + } + + ApplyDamage( damageInfo ) + self:AddHitTarget( enemy ) + if enemy:IsAlive() == false then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, enemy:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, -self:GetCaster():GetForwardVector() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 10, enemy, PATTACH_ABSORIGIN_FOLLOW, nil, enemy:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Dungeon.BloodSplatterImpact", enemy ) + else + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_stunned", { duration = self.stun_duration } ) + end + end + end + + local hTiny = CreateUnitByName( "npc_dota_creature_small_storegga", vPos, true, self:GetParent(), self:GetParent():GetOwner(), self:GetParent():GetTeamNumber() ) + if hTiny ~= nil then + hTiny:SetControllableByPlayer( self:GetParent():GetPlayerOwnerID(), false ) + hTiny:SetOwner( self:GetParent() ) + hTiny.bBossMinion = true + if self:GetParent().Encounter then + self:GetParent().Encounter:SuppressRewardsOnDeath( hTiny ) + end + end + end + + EmitSoundOnLocationWithCaster( vLocation1, "OgreTank.GroundSmash", self:GetCaster() ) + self:StartIntervalThink( -1 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_arm_slam:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_DISABLE_TURNING, + MODIFIER_PROPERTY_TURN_RATE_PERCENTAGE, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_arm_slam:GetModifierDisableTurning( params ) + if IsServer() then + if self.bAttackBegin == true then + return 1 + end + end + + return 0 +end + +------------------------------------------------------------------------------- + +function modifier_storegga_arm_slam:GetModifierTurnRate_Percentage( params ) + return -99 +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_arm_slam:HasHitTarget( hTarget ) + for _, target in pairs( self.hHitTargets ) do + if target == hTarget then + return true + end + end + + return false +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_arm_slam:AddHitTarget( hTarget ) + table.insert( self.hHitTargets, hTarget ) +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_avalanche_thinker.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_avalanche_thinker.lua new file mode 100755 index 0000000..85bf792 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_avalanche_thinker.lua @@ -0,0 +1,127 @@ + +modifier_storegga_avalanche_thinker = class({}) + +-------------------------------------------------------------------------------- + +function modifier_storegga_avalanche_thinker:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_avalanche_thinker:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_avalanche_thinker:OnCreated( kv ) + if IsServer() then + self.interval = self:GetAbility():GetSpecialValueFor( "interval" ) + self.slow_duration = self:GetAbility():GetSpecialValueFor( "slow_duration" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.movement = self:GetAbility():GetSpecialValueFor( "movement" ) + + self.Avalanches = {} + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetParent():GetOrigin(), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + self.hAvalancheTarget = enemies[RandomInt(1, #enemies)] + + self:OnIntervalThink() + self:StartIntervalThink( self.interval ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_avalanche_thinker:OnIntervalThink() + if IsServer() then + if self:GetCaster():IsNull() then + self:Destroy() + return + end + + local vNewAvalancheDir1 = RandomVector( 1 ) + local vNewAvalancheDir2 = RandomVector( 1 ) + if self.hAvalancheTarget ~= nil and self.hAvalancheTarget:IsAlive() then + vNewAvalancheDir2 = self.hAvalancheTarget:GetOrigin() - self:GetCaster():GetOrigin() + else + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), self:GetParent():GetOrigin(), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + self.hAvalancheTarget = enemies[RandomInt(1, #enemies)] + if self.hAvalancheTarget ~= nil then + vNewAvalancheDir2 = self.hAvalancheTarget:GetOrigin() - self:GetCaster():GetOrigin() + end + end + + EmitSoundOnLocationWithCaster( self:GetParent():GetOrigin(), "Storegga.Avalanche", self:GetCaster() ) + + local hTiny = CreateUnitByName( "npc_dota_creature_small_storegga", self:GetParent():GetOrigin(), true, self:GetParent(), self:GetParent():GetOwner(), self:GetParent():GetTeamNumber() ) + if hTiny ~= nil then + hTiny:SetControllableByPlayer( self:GetParent():GetPlayerOwnerID(), false ) + hTiny:SetOwner( self:GetParent() ) + hTiny.bBossMinion = true + if self:GetParent().Encounter then + self:GetParent().Encounter:SuppressRewardsOnDeath( hTiny ) + end + end + + vNewAvalancheDir1 = vNewAvalancheDir1:Normalized() + vNewAvalancheDir2 = vNewAvalancheDir2:Normalized() + + local vRadius = Vector( self.radius * .72, self.radius * .72, self.radius * .72 ) + local nFXIndex1 = ParticleManager:CreateParticle( "particles/creatures/storegga/storegga_avalanche.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex1, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex1, 1, vRadius ) + ParticleManager:SetParticleControlForward( nFXIndex1, 0, vNewAvalancheDir1 ) + self:AddParticle( nFXIndex1, false, false, -1, false, false ) + + local nFXIndex2 = ParticleManager:CreateParticle( "particles/creatures/storegga/storegga_avalanche.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex2, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex2, 1, vRadius ) + ParticleManager:SetParticleControlForward( nFXIndex2, 0, vNewAvalancheDir2 ) + self:AddParticle( nFXIndex2, false, false, -1, false, false ) + + local Avalanche1 = + { + vCurPos = self:GetCaster():GetOrigin(), + vDir = vNewAvalancheDir1, + nFX = nFXIndex1, + } + local Avalanche2 = + { + vCurPos = self:GetCaster():GetOrigin(), + vDir = vNewAvalancheDir2, + nFX = nFXIndex2, + } + + table.insert( self.Avalanches, Avalanche1 ) + table.insert( self.Avalanches, Avalanche2 ) + + for _,ava in pairs ( self.Avalanches ) do + local vNewPos = ava.vCurPos + ava.vDir * self.movement + vNewPos.z = GetGroundHeight( vNewPos, self:GetCaster() ) + ava.vCurPos = vNewPos + + + ParticleManager:SetParticleControl( ava.nFX, 0, vNewPos ) + + + local enemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), vNewPos, nil, self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and enemy:IsMagicImmune() == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self:GetAbility(), + } + ApplyDamage( damageInfo ) + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_polar_furbolg_ursa_warrior_thunder_clap", { duration = self.slow_duration } ) + end + end + end + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_grab.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_grab.lua new file mode 100755 index 0000000..1e3c7a7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_grab.lua @@ -0,0 +1,54 @@ + +modifier_storegga_grab = class({}) + +-------------------------------------------------------------------------------- + +function modifier_storegga_grab:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grab:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grab:OnCreated( kv ) + if IsServer() then + self.grab_radius = self:GetAbility():GetSpecialValueFor( "grab_radius" ) + self.min_hold_time = self:GetAbility():GetSpecialValueFor( "min_hold_time" ) + self.max_hold_time = self:GetAbility():GetSpecialValueFor( "max_hold_time" ) + + self:StartIntervalThink( kv["initial_delay"] ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/test_particle/generic_attack_crit_blur.vpcf", PATTACH_CUSTOMORIGIN, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_attack2", self:GetParent():GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grab:OnIntervalThink() + if IsServer() then + if self.hTarget == nil then + return + end + + local flDist = ( self.hTarget:GetOrigin() - self:GetParent():GetOrigin() ):Length2D() + if flDist > 700 then + return + end + + local hBuff = self:GetCaster():AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_storegga_grabbed_buff", {} ) + if hBuff ~= nil then + self:GetCaster().flThrowTimer = GameRules:GetGameTime() + RandomFloat( self.min_hold_time, self.max_hold_time ) + hBuff.hThrowObject = self.hTarget + self.hTarget:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_storegga_grabbed_debuff", {} ) + end + self:Destroy() + return + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_grabbed_buff.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_grabbed_buff.lua new file mode 100755 index 0000000..b7000f7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_grabbed_buff.lua @@ -0,0 +1,37 @@ + +modifier_storegga_grabbed_buff = class({}) + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_buff:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_buff:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_buff:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS, + MODIFIER_PROPERTY_TURN_RATE_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_buff:GetActivityTranslationModifiers( params ) + return "tree" +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_buff:GetModifierTurnRate_Percentage( params ) + return -90 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_grabbed_debuff.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_grabbed_debuff.lua new file mode 100755 index 0000000..152caba --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_grabbed_debuff.lua @@ -0,0 +1,135 @@ + +modifier_storegga_grabbed_debuff = class({}) + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:GetAttributes() + return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:OnCreated( kv ) + if IsServer() then + if self:ApplyHorizontalMotionController() == false or self:ApplyVerticalMotionController() == false then + self:Destroy() + return + end + + self.nProjHandle = -1 + self.flTime = 0.0 + self.flHeight = 0.0 + end +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ANIMATION, + MODIFIER_EVENT_ON_DEATH, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:CheckState() + local state = + { + [MODIFIER_STATE_STUNNED] = true, + [MODIFIER_STATE_INVULNERABLE] = true, + [MODIFIER_STATE_OUT_OF_GAME] = true, + } + return state +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:OnDestroy() + if IsServer() then + self:GetParent():RemoveHorizontalMotionController( self ) + self:GetParent():RemoveVerticalMotionController( self ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:UpdateHorizontalMotion( me, dt ) + if IsServer() then + local vLocation = nil + if self.nProjHandle == -1 then + local attach = self:GetCaster():ScriptLookupAttachment( "attach_attack2" ) + vLocation = self:GetCaster():GetAttachmentOrigin( attach ) + else + vLocation = ProjectileManager:GetLinearProjectileLocation( self.nProjHandle ) + end + vLocation.z = 0.0 + me:SetOrigin( vLocation ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:UpdateVerticalMotion( me, dt ) + if IsServer() then + local vMyPos = me:GetOrigin() + if self.nProjHandle == -1 then + local attach = self:GetCaster():ScriptLookupAttachment( "attach_attack2" ) + local vLocation = self:GetCaster():GetAttachmentOrigin( attach ) + vMyPos.z = vLocation.z + else + local flGroundHeight = GetGroundHeight( vMyPos, me ) + local flHeightChange = dt * self.flTime * self.flHeight * 1.3 + vMyPos.z = math.max( vMyPos.z - flHeightChange, flGroundHeight ) + end + me:SetOrigin( vMyPos ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:OnHorizontalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:OnVerticalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:GetOverrideAnimation( params ) + return ACT_DOTA_FLAIL +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_grabbed_debuff:OnDeath( params ) + if IsServer() then + if params.unit == self:GetCaster() then + self:Destroy() + end + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_ground_pound_thinker.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_ground_pound_thinker.lua new file mode 100755 index 0000000..715590d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_ground_pound_thinker.lua @@ -0,0 +1,101 @@ + +modifier_storegga_ground_pound_thinker = class({}) + +-------------------------------------------------------------------------------- + +function modifier_storegga_ground_pound_thinker:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_ground_pound_thinker:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_ground_pound_thinker:OnCreated( kv ) + if IsServer() then + self.pound_interval = self:GetAbility():GetSpecialValueFor( "pound_interval" ) + self.slow_duration = self:GetAbility():GetSpecialValueFor( "slow_duration" ) + self.damage = self:GetAbility():GetSpecialValueFor( "damage" ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.movespeed_slow = self:GetAbility():GetSpecialValueFor( "movespeed_slow" ) + + self.fTimeStarted = GameRules:GetGameTime() + + self:OnIntervalThink() + self:StartIntervalThink( self.pound_interval ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_ground_pound_thinker:OnIntervalThink() + if IsServer() then + if self:GetCaster() == nil or self:GetCaster():IsNull() then + self:Destroy() + return + end + + --print( string.format( "OnIntervalThink - time is: %.2f", GameRules:GetGameTime() ) ) + + local vThinkerPos = self:GetParent():GetAbsOrigin() + local hEnemies = FindUnitsInRadius( self:GetCaster():GetTeamNumber(), vThinkerPos, nil, self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _, hEnemy in pairs( hEnemies ) do + if hEnemy ~= nil and hEnemy:IsInvulnerable() == false and hEnemy:IsMagicImmune() == false then + local damageInfo = + { + victim = hEnemy, + attacker = self:GetCaster(), + damage = self.damage, + damage_type = self:GetAbility():GetAbilityDamageType(), + ability = self:GetAbility(), + } + ApplyDamage( damageInfo ) + + if hEnemy:IsAlive() == false then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, hEnemy, PATTACH_POINT_FOLLOW, "attach_hitloc", hEnemy:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, hEnemy:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, -self:GetCaster():GetForwardVector() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 10, hEnemy, PATTACH_ABSORIGIN_FOLLOW, nil, hEnemy:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "BloodSplatterImpact", hEnemy ) + else + local kv = { + movespeed_slow = self.movespeed_slow, + duration = self.slow_duration, + } + hEnemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_polar_furbolg_ursa_warrior_thunder_clap", kv ) + end + end + end + + EmitSoundOnLocationWithCaster( self:GetParent():GetOrigin(), "OgreTank.GroundSmash", self:GetCaster() ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/ogre/ogre_melee_smash.vpcf", PATTACH_WORLDORIGIN, self:GetCaster() ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.radius, self.radius, self.radius ) ) + ParticleManager:SetParticleFoWProperties( nFXIndex, 0, -1, self.radius ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + ScreenShake( self:GetParent():GetOrigin(), 10.0, 100.0, 0.5, 1300.0, 0, true ) + + for i=1,2 do + local hTiny = CreateUnitByName( "npc_dota_creature_small_storegga", vThinkerPos, true, self:GetParent(), self:GetParent():GetOwner(), self:GetParent():GetTeamNumber() ) + if hTiny ~= nil then + hTiny:SetControllableByPlayer( self:GetParent():GetPlayerOwnerID(), false ) + hTiny:SetOwner( self:GetParent() ) + hTiny.bBossMinion = true + if self:GetParent().Encounter then + self:GetParent().Encounter:SuppressRewardsOnDeath( hTiny ) + end + end + end + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_passive.lua new file mode 100755 index 0000000..609f8ba --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_storegga_passive.lua @@ -0,0 +1,61 @@ + +modifier_storegga_passive = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_storegga_passive:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_storegga_passive:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_passive:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10000 +end + +----------------------------------------------------------------------------------------- + +function modifier_storegga_passive:CheckState() + local state = + { + [MODIFIER_STATE_HEXED] = false, + [MODIFIER_STATE_ROOTED] = false, + [MODIFIER_STATE_SILENCED] = false, + [MODIFIER_STATE_STUNNED] = false, + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + [MODIFIER_STATE_FROZEN] = false, + [MODIFIER_STATE_FEARED] = false, + [MODIFIER_STATE_CANNOT_BE_MOTION_CONTROLLED] = true, + } + return state +end + +-------------------------------------------------------------------------------- + +function modifier_storegga_passive:OnCreated( kv ) + if IsServer() then + self:GetParent().bAbsoluteNoCC = true + end +end + +----------------------------------------------------------------------------------------- + +function modifier_storegga_passive:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_REDUCTION_PERCENTAGE, + } + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_storegga_passive:GetModifierMoveSpeedReductionPercentage( params ) + return 0 +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_story_crystal.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_story_crystal.lua new file mode 100755 index 0000000..3556a3e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_story_crystal.lua @@ -0,0 +1,175 @@ + +modifier_story_crystal = class({}) + +---------------------------------------- + +function modifier_story_crystal:OnCreated( kv ) + self.hPlayerEnt = nil + + if IsServer() then + self.Players = {} + self.bInMotion = false + self.flMinHeight = 100 + self.flMaxHeight = 150 + self.bAscending = true + self.flOssiclateTime = 5.0 + self:StartIntervalThink( 0.1 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_story_crystal:IsHidden() + return true +end + + +--------------------------------------------------------------------------- + +function modifier_story_crystal:GetEffectName() + return "particles/creatures/aghanim/aghanim_crystal_spellswap_ambient.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_story_crystal:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_story_crystal:CheckState() + local state = {} + if IsServer() then + state[ MODIFIER_STATE_INVULNERABLE ] = true + state[ MODIFIER_STATE_MAGIC_IMMUNE ] = true + state[ MODIFIER_STATE_NO_HEALTH_BAR ] = true + state[ MODIFIER_STATE_DISARMED ] = true + state[ MODIFIER_STATE_ROOTED ] = false + state[ MODIFIER_STATE_ATTACK_IMMUNE ] = true + end + + return state +end + +----------------------------------------------------------------------- + +function modifier_story_crystal:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_ORDER, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_story_crystal:OnOrder( params ) + if IsServer() then + local hOrderedUnit = params.unit + local hTargetUnit = params.target + local nOrderType = params.order_type + if nOrderType ~= DOTA_UNIT_ORDER_MOVE_TO_TARGET and nOrderType ~= DOTA_UNIT_ORDER_ATTACK_TARGET then + return + end + + if hTargetUnit == nil or hTargetUnit ~= self:GetParent() then + return + end + + if hOrderedUnit ~= nil and hOrderedUnit:IsRealHero() and hOrderedUnit:GetTeamNumber() == DOTA_TEAM_GOODGUYS then + self.hPlayerEnt = hOrderedUnit + self:StartIntervalThink( 0.1 ) + return + end + + self:StartIntervalThink( -1 ) + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_story_crystal:OnIntervalThink() + if IsServer() then + if self.bInMotion == false then + if self:ApplyVerticalMotionController() == false then + self:Destroy() + end + self.bInMotion = true + self:StartIntervalThink( -1 ) + return + end + + if self.hPlayerEnt ~= nil then + local flTalkDistance = 250.0 + if flTalkDistance >= ( self.hPlayerEnt:GetOrigin() - self:GetParent():GetOrigin() ):Length2D() then + local nPlayerID = self.hPlayerEnt:GetPlayerOwnerID() + for _,nID in pairs ( self.Players ) do + if nPlayerID == nID then + return + end + end + + if GameRules.Aghanim ~= nil then + self.hPlayerEnt:Interrupt() + local nCrystalID = 1 + #GameRules.Aghanim.PlayerCrystals[ nPlayerID ] + local szLine = tostring( "announcer_aghanim_agh_story_time_" .. tostring( nCrystalID ) .. "_01" ) + print( "crystal .. " .. nCrystalID .. "spoken to by " .. self.hPlayerEnt:GetUnitName() .. ", speaking line " .. szLine ) + -- EmitSoundOn( "wisp_thanks", self:GetParent() ) + EmitSoundOnLocationForPlayer( szLine, self:GetParent():GetAbsOrigin(), nPlayerID ) + table.insert( self.Players, nPlayerID ) + table.insert( GameRules.Aghanim.PlayerCrystals[ nPlayerID ], nCrystalID ) + self:StartIntervalThink( -1 ) + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_story_crystal:OnDestroy() + if IsServer() then + self:GetParent():RemoveVerticalMotionController( self ) + end +end + + +-------------------------------------------------------------------------------- + +function modifier_story_crystal:UpdateVerticalMotion( me, dt ) + if IsServer() then + local flGroundHeight = GetGroundHeight( self:GetParent():GetAbsOrigin(), self:GetParent() ) + local flCurHeight = self:GetParent():GetAbsOrigin().z - flGroundHeight + local flChange = ( self.flMaxHeight - self.flMinHeight ) / self.flOssiclateTime * dt + if self.bAscending == false then + flChange = flChange * -1 + end + + local vNewLocation = self:GetParent():GetAbsOrigin() + vNewLocation.z = flGroundHeight + flCurHeight + flChange + me:SetOrigin( vNewLocation ) + + if ( vNewLocation.z - flGroundHeight ) > self.flMaxHeight then + self.bAscending = false + end + if ( vNewLocation.z - flGroundHeight ) < self.flMinHeight then + self.bAscending = true + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_story_crystal:OnVerticalMotionInterrupted() + if IsServer() then + print( "motion interrupted" ) + self:Destroy() + end +end + + + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_hammer_throw.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_hammer_throw.lua new file mode 100755 index 0000000..f32cc83 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_hammer_throw.lua @@ -0,0 +1,142 @@ + +modifier_temple_guardian_hammer_throw = class({}) + +------------------------------------------------------------------- + +function modifier_temple_guardian_hammer_throw:IsHidden() + return true +end + +------------------------------------------------------------------- + +function modifier_temple_guardian_hammer_throw:IsPurgable() + return false +end + +------------------------------------------------------------------- + +function modifier_temple_guardian_hammer_throw:RemoveOnDeath() + return false +end + +------------------------------------------------------------------- + +function modifier_temple_guardian_hammer_throw:OnCreated( kv ) + if IsServer() then + self.hammer_damage = self:GetAbility():GetSpecialValueFor( "hammer_damage" ) + self.throw_duration = self:GetAbility():GetSpecialValueFor( "throw_duration" ) + self.stun_duration = self:GetAbility():GetSpecialValueFor( "stun_duration" ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + + self.hHitEntities = {} + + self.hHammer = CreateUnitByName( "npc_dota_beastmaster_axe", self:GetParent():GetOrigin(), false, nil, nil, self:GetParent():GetTeamNumber() ) + if self.hHammer == nil then + self:Destroy() + return + end + + self.hHammer:AddEffects( EF_NODRAW ) + self.hHammer:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_beastmaster_axe_invulnerable", kv ) + + self.vSourceLoc = self:GetCaster():GetOrigin() + self.vSourceLoc.z = self.vSourceLoc.z + 180 + self.vTargetLoc = Vector( kv["x"], kv["y"], self.vSourceLoc.z ) + self.vToTarget = self.vTargetLoc - self.vSourceLoc + self.vDir = self.vToTarget:Normalized() + self.flDist = self.vToTarget:Length2D() + + self.flDieTime = GameRules:GetGameTime() + self.throw_duration + self.bReturning = false + + self.nFXIndex = ParticleManager:CreateParticle( "particles/test_particle/omniknight_wildaxe.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( self.nFXIndex, 0, self.hHammer, PATTACH_ABSORIGIN_FOLLOW, nil, self.hHammer:GetOrigin(), true ) + + EmitSoundOn( "TempleGuardian.HammerThrow", self:GetCaster() ) + + self:StartIntervalThink( 0.05 ) + end +end + +------------------------------------------------------------------- + +function modifier_temple_guardian_hammer_throw:OnIntervalThink() + if IsServer() then + local flPct = ( self.flDieTime - GameRules:GetGameTime() ) / self.throw_duration + local t = 1.0 - flPct + + local vPos = self.vSourceLoc + ( self.vDir * self.flDist * t * 2 ) + if self.bReturning == true then + vPos = self.vTargetLoc - ( self.vDir * self.flDist * ( t - 0.5 ) * 2 ) + end + + if FrameTime() > 0.0 then + local vVel = vPos - self.hHammer:GetOrigin() / FrameTime() + self.hHammer:SetVelocity( vVel ) + end + + self.hHammer:SetOrigin( vPos ) + + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self.hHammer:GetOrigin(), self.hHammer, self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false and self:HasHitTarget( enemy ) == false then + self:AddHitTarget( enemy ) + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.hammer_damage, + damage_type = DAMAGE_TYPE_MAGICAL, + ability = self:GetAbility(), + } + ApplyDamage( damageInfo ) + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_stunned", { duration = self.stun_duration } ) + EmitSoundOn( "TempleGuardian.HammerThrow.Damage", enemy ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_beastmaster/beastmaster_wildaxes_hit.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + + if t >= 0.5 then + self.bReturning = true + end + + if t >= 0.95 then + self:Destroy() + end + end +end + +------------------------------------------------------------------- + +function modifier_temple_guardian_hammer_throw:OnDestroy() + if IsServer() then + UTIL_Remove( self.hHammer ) + ParticleManager:DestroyParticle( self.nFXIndex, true ) + end +end + +------------------------------------------------------------------- + +function modifier_temple_guardian_hammer_throw:HasHitTarget( enemy ) + if IsServer() then + for _,hitEnemy in pairs( self.hHitEntities ) do + if hitEnemy == enemy then + return true + end + end + return false + end +end + +------------------------------------------------------------------- + +function modifier_temple_guardian_hammer_throw:AddHitTarget( enemy ) + if IsServer() then + table.insert( self.hHitEntities, enemy ) + end +end + +------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_immunity.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_immunity.lua new file mode 100755 index 0000000..4c17902 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_immunity.lua @@ -0,0 +1,35 @@ + +modifier_temple_guardian_immunity = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_temple_guardian_immunity:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_temple_guardian_immunity:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_temple_guardian_immunity:CheckState() + local state = {} + if IsServer() then + state[MODIFIER_STATE_MAGIC_IMMUNE] = true + state[MODIFIER_STATE_INVULNERABLE] = true + state[MODIFIER_STATE_OUT_OF_GAME] = true + end + + return state +end + +----------------------------------------------------------------------------------------- + +function modifier_temple_guardian_immunity:GetPriority() + return MODIFIER_PRIORITY_SUPER_ULTRA +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_passive.lua new file mode 100755 index 0000000..a8b96d6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_passive.lua @@ -0,0 +1,109 @@ + +modifier_temple_guardian_passive = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_temple_guardian_passive:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_temple_guardian_passive:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_temple_guardian_passive:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10000 +end + +-------------------------------------------------------------------------------- + +function modifier_temple_guardian_passive:OnCreated( kv ) + if IsServer() then + self.nonrage_status_resistance = self:GetAbility():GetSpecialValueFor( "nonrage_status_resistance" ) + self.rage_move_speed_bonus = self:GetAbility():GetSpecialValueFor( "rage_move_speed_bonus" ) + self.rage_model_scale_bonus = self:GetAbility():GetSpecialValueFor( "rage_model_scale_bonus" ) + self.rage_turn_rate_bonus_pct = self:GetAbility():GetSpecialValueFor( "rage_turn_rate_bonus_pct" ) + end +end + + +----------------------------------------------------------------------------------------- + +function modifier_temple_guardian_passive:CheckState() + local state = + { + [ MODIFIER_STATE_FEARED ] = false, + [ MODIFIER_STATE_CANNOT_BE_MOTION_CONTROLLED ] = true, + [ MODIFIER_STATE_UNSLOWABLE ] = true, + } + + return state +end + +----------------------------------------------------------------------------------------- + +function modifier_temple_guardian_passive:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATUS_RESISTANCE_STACKING, + MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT, + MODIFIER_PROPERTY_MODEL_SCALE, + MODIFIER_PROPERTY_TURN_RATE_PERCENTAGE, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_temple_guardian_passive:GetModifierStatusResistanceStacking( params ) + if IsServer() then + if self:GetParent().bIsEnraged == true then + return 100 + end + end + + return self.nonrage_status_resistance +end + +-------------------------------------------------------------------------------- + +function modifier_temple_guardian_passive:GetModifierMoveSpeedBonus_Constant( params ) + if IsServer() then + if self:GetParent().bIsEnraged == true then + return self.rage_move_speed_bonus + end + end + + return 0 +end + +----------------------------------------------------------------------------------------- + +function modifier_temple_guardian_passive:GetModifierModelScale( params ) + if IsServer() then + if self:GetParent().bIsEnraged == true then + return self.rage_model_scale_bonus + end + end + + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_temple_guardian_passive:GetModifierTurnRate_Percentage( params ) + if IsServer() then + if self:GetParent().bIsEnraged == true then + return self.rage_turn_rate_bonus_pct + end + end + + return 0 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_statue.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_statue.lua new file mode 100755 index 0000000..51e4505 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_statue.lua @@ -0,0 +1,42 @@ + +modifier_temple_guardian_statue = class({}) + +----------------------------------------------------------------------------- + +function modifier_temple_guardian_statue:IsHidden() + return true +end + +------------------------------------------------------------------- + +function modifier_temple_guardian_statue:CheckState() + local state = + { + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + [MODIFIER_STATE_STUNNED] = true, + [MODIFIER_STATE_INVULNERABLE] = true, + [MODIFIER_STATE_UNSELECTABLE] = true, + [MODIFIER_STATE_NOT_ON_MINIMAP] = true, + } + + return state +end + +------------------------------------------------------------------- + +function modifier_temple_guardian_statue:OnCreated( kv ) + if IsServer() then + local vAngles = self:GetParent():GetAnglesAsVector() + self:GetParent():SetAngles( vAngles.x, vAngles.y - 90.0, vAngles.z ) + self:GetParent():StartGesture( ACT_DOTA_CAST_ABILITY_7 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_temple_guardian_statue:OnDestroy() + if IsServer() then + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_wrath_thinker.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_wrath_thinker.lua new file mode 100755 index 0000000..7832b8b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_temple_guardian_wrath_thinker.lua @@ -0,0 +1,69 @@ + +modifier_temple_guardian_wrath_thinker = class({}) + +----------------------------------------------------------------------------- + +function modifier_temple_guardian_wrath_thinker:OnCreated( kv ) + if IsServer() then + self.delay = self:GetAbility():GetSpecialValueFor( "delay" ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.radius = self.radius + kv[ "extra_radius" ] + self.blast_damage = self:GetAbility():GetSpecialValueFor( "blast_damage" ) + + self:StartIntervalThink( self.delay ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/test_particle/dungeon_generic_blast_pre.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.radius, self.delay, 1.0 ) ) + ParticleManager:SetParticleControl( nFXIndex, 15, Vector( 175, 238, 238 ) ) + ParticleManager:SetParticleControl( nFXIndex, 16, Vector( 1, 0, 0 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end +end + +----------------------------------------------------------------------------- + +function modifier_temple_guardian_wrath_thinker:OnIntervalThink() + if IsServer() then + local nFXIndex = ParticleManager:CreateParticle( "particles/test_particle/dungeon_generic_blast.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector ( self.radius, self.radius, self.radius ) ) + ParticleManager:SetParticleControl( nFXIndex, 15, Vector( 175, 238, 238 ) ) + ParticleManager:SetParticleControl( nFXIndex, 16, Vector( 1, 0, 0 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "TempleGuardian.Wrath.Explosion", self:GetParent() ) + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), nil, self.radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false then + local damageInfo = + { + victim = enemy, + attacker = self:GetCaster(), + damage = self.blast_damage, + damage_type = self:GetAbility():GetAbilityDamageType(), + ability = self:GetAbility(), + } + ApplyDamage( damageInfo ) + end + end + + if RollPercentage( 3 ) then + local vLocation = self:GetParent():GetAbsOrigin() + if GridNav:CanFindPath( self:GetCaster():GetAbsOrigin(), vLocation ) then + local newItem = CreateItem( "item_mana_potion", nil, nil ) + newItem:SetPurchaseTime( 0 ) + if newItem:IsPermanent() and newItem:GetShareability() == ITEM_FULLY_SHAREABLE then + item:SetStacksWithOtherOwners( true ) + end + + local drop = CreateItemOnPositionSync( vLocation, newItem ) + newItem:LaunchLoot( true, 300, 0.75, vLocation ) + end + end + + UTIL_Remove( self:GetParent() ) + end +end + +----------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tidehunter_damage_counter.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tidehunter_damage_counter.lua new file mode 100755 index 0000000..793e0f9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tidehunter_damage_counter.lua @@ -0,0 +1,154 @@ + +modifier_tidehunter_damage_counter = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_damage_counter:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_damage_counter:OnCreated( kv ) + if IsServer() then + + self.damage_threshold = self:GetAbility():GetSpecialValueFor( "damage_threshold" ) + self.damage_counter_tiers = self:GetAbility():GetSpecialValueFor( "damage_counter_tiers" ) + self.time_before_reduction = self:GetAbility():GetSpecialValueFor( "time_before_reduction" ) + + self.nRecentDamageTaken = kv.damage or 0 + self.nOverheadParticleTier = 0 + self.nDamagePerTier = self.damage_threshold / self.damage_counter_tiers + self.fLastDamageTakenTime = GameRules:GetGameTime() + self.fLastReductionTime = GameRules:GetGameTime() + + -- Created overhead particle + local vPos = Vector( 0, 0, 0 ) + self.nFXIndex = ParticleManager:CreateParticle( "particles/creatures/lifestealer/lifestealer_damage_counter_overhead.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControl( self.nFXIndex, 0, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 1, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 2, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 3, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 4, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 5, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 6, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 7, vPos ) + ParticleManager:SetParticleControl( self.nFXIndex, 8, Vector( 1, 0, 0 ) ) + ParticleManager:SetParticleControl( self.nFXIndex, 9, Vector( 2, 0, 0 ) ) + ParticleManager:SetParticleControl( self.nFXIndex, 10, Vector( 3, 0, 0 ) ) + ParticleManager:SetParticleControl( self.nFXIndex, 11, Vector( 4, 0, 0 ) ) + ParticleManager:SetParticleControl( self.nFXIndex, 12, Vector( 5, 0, 0 ) ) + self:AddParticle( self.nFXIndex, false, false, -1, false, true ) + + local nTier = math.floor( self.nRecentDamageTaken / self.nDamagePerTier ) + if nTier > self.nOverheadParticleTier then + self:IncrementOverheadParticle( nTier ) + end + + self:StartIntervalThink( 0.1 ) + + end +end + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_damage_counter:OnIntervalThink() + if IsServer() then + -- if it's been at least 2s since the last time I took damage, then reduce my ragebar tier by 1 + if GameRules:GetGameTime() >= self.fLastDamageTakenTime + self.time_before_reduction then + if GameRules:GetGameTime() >= self.fLastReductionTime + self.time_before_reduction then + --printf( "It's been at least %.2f secs since the last time I took damage", self.time_before_reduction ) + self.nRecentDamageTaken = self.nRecentDamageTaken - self.nDamagePerTier + local nTier = math.floor( self.nRecentDamageTaken / self.nDamagePerTier ) + --printf( " self.nRecentDamageTaken: %d, self.nDamagePerTier: %d, nTier: %d", self.nRecentDamageTaken, self.nDamagePerTier, nTier ) + + if nTier < self.nOverheadParticleTier then + --printf( " Reduce ragebar -- DecrementOverheadParticle" ) + self:DecrementOverheadParticle( nTier ) + end + + self.fLastReductionTime = GameRules:GetGameTime() + end + end + end +end + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_damage_counter:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_damage_counter:OnTakeDamage( params ) + if IsServer() then + local hAttacker = params.attacker + local hVictim = params.unit + local hEntity = self:GetParent() + local hRavage = hEntity:FindAbilityByName( "tidehunter_ravage" ) + if hAttacker ~= nil and hVictim ~= nil and hVictim == self:GetParent() then + self.fLastDamageTakenTime = GameRules:GetGameTime() + --printf( "OnTakeDamage - hVictim is: %s", hVictim:GetUnitName() ) + self.nRecentDamageTaken = self.nRecentDamageTaken + params.damage + + local nTier = math.floor( self.nRecentDamageTaken / self.nDamagePerTier ) + + if nTier > self.nOverheadParticleTier then + self:IncrementOverheadParticle( nTier ) + end + + if self.nRecentDamageTaken >= self.damage_threshold then + + self:GetParent():Purge( false, true, false, true, false ) + ParticleManager:CreateParticle( "particles/units/heroes/hero_tidehunter/tidehunter_krakenshell_purge.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + EmitSoundOn( "Hero_Tidehunter.KrakenShell", self:GetParent() ) + + self:GetParent():Interrupt() + + if not ( hVictim:IsSilenced() or hVictim:IsStunned() or hVictim:IsHexed() or hVictim:IsFrozen() ) then + ExecuteOrderFromTable({ + UnitIndex = hVictim:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = hRavage:entindex(), + Queue = false, + }) + self:Destroy() + end + else + self:ForceRefresh() + end + end + end + + return 0 +end + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_damage_counter:IncrementOverheadParticle( nTier ) + local nTiersSinceLastUpdate = nTier - self.nOverheadParticleTier + + for i = 1, nTiersSinceLastUpdate do + ParticleManager:SetParticleControl( self.nFXIndex, self.nOverheadParticleTier + i, Vector( 1, 0, 0 ) ) + end + + self.nOverheadParticleTier = nTier +end + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_damage_counter:DecrementOverheadParticle( nTier ) + if self.nOverheadParticleTier - 1 > 0 then + ParticleManager:SetParticleControl( self.nFXIndex, self.nOverheadParticleTier, Vector( 0, 0, 0 ) ) + --printf( "DecrementOverheadParticle - self.nOverheadParticleTier: %d", self.nOverheadParticleTier ) + self.nOverheadParticleTier = nTier + else + self:Destroy() + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tidehunter_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tidehunter_passive.lua new file mode 100755 index 0000000..623ec1d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tidehunter_passive.lua @@ -0,0 +1,57 @@ + +modifier_tidehunter_passive = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_passive:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_passive:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_passive:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10000 +end + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_passive:OnCreated( kv ) + if IsServer() then + self.damage_counter_duration = self:GetAbility():GetSpecialValueFor( "damage_counter_duration" ) + end +end + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_passive:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_tidehunter_passive:OnTakeDamage( params ) + if IsServer() then + local hAttacker = params.attacker + local hVictim = params.unit + if hAttacker ~= nil and hVictim ~= nil and hVictim == self:GetParent() then + if self:GetParent():FindModifierByName( "modifier_tidehunter_damage_counter" ) == nil then + local kv = { duration = -1 } -- self.damage_counter_duration + kv.damage = params.damage + self:GetParent():AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_tidehunter_damage_counter", kv ) + end + end + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tornado_harpy_intrinsic.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tornado_harpy_intrinsic.lua new file mode 100755 index 0000000..e92f316 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tornado_harpy_intrinsic.lua @@ -0,0 +1,31 @@ +modifier_tornado_harpy_intrinsic = class({}) + + +function modifier_tornado_harpy_intrinsic:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_ABILITY_EXECUTED, + } + return funcs +end + + +function modifier_tornado_harpy_intrinsic:OnAbilityExecuted(keys) + if IsServer() then + local unit = keys.unit + local parent = self:GetParent() + if unit ~= parent then + return + end + + local justCast = keys.ability:GetAbilityName() == "harpy_storm_chain_lightning" + if not justCast then + return + end + + local duration = self:GetAbility():GetSpecialValueFor("duration") + parent:AddNewModifier(parent, self:GetAbility(), "modifier_tornado_harpy_surge", {duration = duration}) + + end + + return 0 +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tornado_harpy_surge.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tornado_harpy_surge.lua new file mode 100755 index 0000000..07e52d0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tornado_harpy_surge.lua @@ -0,0 +1,17 @@ +modifier_tornado_harpy_surge = class({}) + + +function modifier_tornado_harpy_surge:DeclareFunctions() + local funcs = { + MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT, + } + return funcs +end + + +function modifier_tornado_harpy_surge:GetModifierMoveSpeedBonus_Constant(params) + + return self:GetAbility():GetSpecialValueFor("speed_boost") + +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tusk_mage_freezing_blast.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tusk_mage_freezing_blast.lua new file mode 100755 index 0000000..d587ab7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_tusk_mage_freezing_blast.lua @@ -0,0 +1,56 @@ + +modifier_tusk_mage_freezing_blast = class({}) + +----------------------------------------------------------------------------- + +function modifier_tusk_mage_freezing_blast:IsHidden() + return false +end + +----------------------------------------------------------------------------- + +function modifier_tusk_mage_freezing_blast:GetEffectName() + return "particles/units/heroes/hero_winter_wyvern/wyvern_arctic_burn_slow.vpcf" +end + +----------------------------------------------------------------------------- + +function modifier_tusk_mage_freezing_blast:GetStatusEffectName() + return "particles/status_fx/status_effect_wyvern_arctic_burn.vpcf" +end + +----------------------------------------------------------------------------- + +function modifier_tusk_mage_freezing_blast:OnCreated( kv ) + if not IsServer() then + return + end + + self.movespeed_slow = self:GetAbility():GetSpecialValueFor( "movespeed_slow" ) + self.attackspeed_slow = self:GetAbility():GetSpecialValueFor( "attackspeed_slow" ) +end + +----------------------------------------------------------------------------- + +function modifier_tusk_mage_freezing_blast:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + } + return funcs +end +---------------------------------------- + +function modifier_tusk_mage_freezing_blast:GetModifierMoveSpeedBonus_Percentage( params ) + return self.movespeed_slow +end + +---------------------------------------- + +function modifier_tusk_mage_freezing_blast:GetModifierAttackSpeedBonus_Constant( params ) + return self.attackspeed_slow +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_undead_tusk_mage_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_undead_tusk_mage_passive.lua new file mode 100755 index 0000000..0425b78 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_undead_tusk_mage_passive.lua @@ -0,0 +1,45 @@ +modifier_undead_tusk_mage_passive = class({}) + +--------------------------------------------------------------------------- + +function modifier_undead_tusk_mage_passive:IsHidden() + return true +end + +--------------------------------------------------------------------------- + +function modifier_undead_tusk_mage_passive:IsPurgable() + return false +end + +--------------------------------------------------------------------------- + +function modifier_undead_tusk_mage_passive:GetStatusEffectName() + return "particles/status_fx/status_effect_ghost.vpcf" +end + +--------------------------------------------------------------------------- + +function modifier_undead_tusk_mage_passive:CheckState() + local state = + { + [MODIFIER_STATE_ATTACK_IMMUNE] = true, + } + return state +end + +--------------------------------------------------------------------------- + +function modifier_undead_tusk_mage_passive:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_ABSOLUTE_NO_DAMAGE_PHYSICAL, + } + return funcs +end + +--------------------------------------------------------------------------- + +function modifier_undead_tusk_mage_passive:GetAbsoluteNoDamagePhysical( params ) + return 1 +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_undead_tusk_mage_tombstone.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_undead_tusk_mage_tombstone.lua new file mode 100755 index 0000000..3e627a7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_undead_tusk_mage_tombstone.lua @@ -0,0 +1,107 @@ + +modifier_undead_tusk_mage_tombstone = class({}) + +--------------------------------------------------------- + +function modifier_undead_tusk_mage_tombstone:IsHidden() + return true +end + +--------------------------------------------------------- + +function modifier_undead_tusk_mage_tombstone:IsPurgable() + return false +end + +--------------------------------------------------------- + +function modifier_undead_tusk_mage_tombstone:CheckState() + local state = + { + [MODIFIER_STATE_MAGIC_IMMUNE] = true, + [MODIFIER_STATE_ROOTED] = true, + [MODIFIER_STATE_DISARMED] = true, + } + + return state +end + +--------------------------------------------------------- + +function modifier_undead_tusk_mage_tombstone:OnCreated() + if IsServer() then + self.hSkeletons = {} + + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.skeleton_interval = self:GetAbility():GetSpecialValueFor( "skeleton_interval" ) + self.skeletons_per_tick = self:GetAbility():GetSpecialValueFor( "skeletons_per_tick" ) + self.max_skeletons = self:GetAbility():GetSpecialValueFor( "max_skeletons" ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/act_2/undead_tusk_mage_sigil.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.radius, 1, -self.radius ) ) + self:AddParticle( nFXIndex, false, false, -1, false, false ) + + self:StartIntervalThink( self.skeleton_interval ) + end +end + +--------------------------------------------------------- + +function modifier_undead_tusk_mage_tombstone:OnDestroy() + if IsServer() then + --self:GetParent():AddEffects( EF_NODRAW ) + --UTIL_Remove( self:GetParent() ) + end +end + +--------------------------------------------------------- + +function modifier_undead_tusk_mage_tombstone:OnIntervalThink() + if IsServer() then + for k, hSkeleton in pairs( self.hSkeletons ) do + if hSkeleton == nil or hSkeleton:IsNull() or hSkeleton:IsAlive() == false then + table.remove( self.hSkeletons, k ) + end + end + + local hGoalEnt = nil + + -- Find a player hero that this tick of spawns will path to + local hAllHeroes = HeroList:GetAllHeroes() + for _, hHero in pairs( hAllHeroes ) do + if hHero ~= nil and hHero:IsAlive() then + hGoalEnt = hHero + break + end + end + + for i = 1, self.skeletons_per_tick do + if #self.hSkeletons < self.max_skeletons then + --print( string.format( "modifier_undead_tusk_mage_tombstone - This tombstone owns less than %d skels, so making another one now", self.max_skeletons ) ) + + local vSpawnPos = self:GetParent():GetAbsOrigin() + RandomVector( 150 ) + local hSkeleton = CreateUnitByName( "npc_dota_creature_tusk_skeleton", vSpawnPos, true, self:GetParent(), self:GetParent(), self:GetParent():GetTeamNumber() ) + if hSkeleton ~= nil then + table.insert( self.hSkeletons, hSkeleton ) + + if hGoalEnt then + hSkeleton:SetInitialGoalEntity( hGoalEnt ) + else + print( string.format( "ERROR - modifier_undead_tusk_mage_tombstone: Could not set initial goal entity for %s", hSkeleton:GetUnitName() ) ) + end + + hSkeleton:SetOwner( self:GetParent() ) + hSkeleton:SetDeathXP( 0 ) + hSkeleton:SetMinimumGoldBounty( 0 ) + hSkeleton:SetMaximumGoldBounty( 0 ) + + ParticleManager:ReleaseParticleIndex( ParticleManager:CreateParticle( "particles/neutral_fx/skeleton_spawn.vpcf", PATTACH_ABSORIGIN, hSkeleton ) ) + + EmitSoundOn( "Tombstone.RaiseDead", hSkeleton ) + end + end + end + end +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_underlord_channelled_buff.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_underlord_channelled_buff.lua new file mode 100755 index 0000000..950ed57 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_underlord_channelled_buff.lua @@ -0,0 +1,67 @@ + +modifier_underlord_channelled_buff = class({}) + +----------------------------------------------------------------------------- + +function modifier_underlord_channelled_buff:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +----------------------------------------------------------------------------- + +function modifier_underlord_channelled_buff:GetEffectName() + return "particles/units/heroes/hero_ogre_magi/ogre_magi_bloodlust_buff.vpcf" +end + +----------------------------------------------------------------------------- + +function modifier_underlord_channelled_buff:OnCreated( kv ) + if not self:GetAbility() then + return + end + + self.bonus_attack_speed = self:GetAbility():GetSpecialValueFor( "bonus_attack_speed" ) + self.bonus_movement_speed = self:GetAbility():GetSpecialValueFor( "bonus_movement_speed" ) + self.modelscale = self:GetAbility():GetSpecialValueFor( "modelscale" ) + + if IsServer() then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_pugna/pugna_life_drain.vpcf", PATTACH_CUSTOMORIGIN, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetCaster():GetOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetOrigin(), true ) + self:AddParticle( nFXIndex , true, false, 0, false, false ) + end +end + +----------------------------------------------------------------------------- + +function modifier_underlord_channelled_buff:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, + MODIFIER_PROPERTY_MODEL_SCALE, + } + + return funcs +end + + +----------------------------------------------------------------------------- + +function modifier_underlord_channelled_buff:GetModifierAttackSpeedBonus_Constant( params ) + return self.bonus_attack_speed +end + +----------------------------------------------------------------------------- + +function modifier_underlord_channelled_buff:GetModifierMoveSpeedBonus_Percentage( params ) + return self.bonus_movement_speed +end + +----------------------------------------------------------------------------- + +function modifier_underlord_channelled_buff:GetModifierModelScale( params ) + return self.modelscale +end + +----------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_upheaval_urn_incoming_damage_rules.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_upheaval_urn_incoming_damage_rules.lua new file mode 100755 index 0000000..48ea198 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_upheaval_urn_incoming_damage_rules.lua @@ -0,0 +1,87 @@ +modifier_upheaval_urn_incoming_damage_rules = class({}) + +-------------------------------------------------------------------------------- + +function modifier_upheaval_urn_incoming_damage_rules:CheckState() + local state = + { + [MODIFIER_STATE_MAGIC_IMMUNE] = true, + [MODIFIER_STATE_INVULNERABLE] = true, + [MODIFIER_STATE_UNSELECTABLE] = true, + } + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_upheaval_urn_incoming_damage_rules:DeclareFunctions() + local funcs = { +-- MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE, +-- MODIFIER_EVENT_ON_ATTACKED, + } + + return funcs + +end + +---------------------------------------------------------------------------------- + +function modifier_upheaval_urn_incoming_damage_rules:IsHidden() + return true +end + +---------------------------------------------------------------------------------- + +function modifier_upheaval_urn_incoming_damage_rules:IsPurgable() + return false +end + +---------------------------------------------------------------------------------- + +function modifier_upheaval_urn_incoming_damage_rules:CanParentBeAutoAttacked() + return false +end + +------------------------------------------------------------ + +function modifier_upheaval_urn_incoming_damage_rules:GetAbsoluteNoDamageMagical( params ) + return 1 +end + +------------------------------------------------------------ + +function modifier_upheaval_urn_incoming_damage_rules:GetAbsoluteNoDamagePure( params ) + return 1 +end + +------------------------------------------------------------ + +function modifier_upheaval_urn_incoming_damage_rules:GetAbsoluteNoDamagePhysical( params ) + return 1 +end + +------------------------------------------------------------ + +function modifier_upheaval_urn_incoming_damage_rules:GetModifierIncomingDamage_Percentage( params ) + return -100 +end + + +------------------------------------------------------------ + +function modifier_upheaval_urn_incoming_damage_rules:OnAttacked( params ) + if IsServer() then + + if params.target == self:GetParent() then + local nHealth = self:GetParent():GetHealth() + if nHealth - 1 <= 0 then + self:GetParent():ForceKill( false ) + else + self:GetParent():ModifyHealth( self:GetParent():GetHealth() - 1, nil, true, 0 ) + end + end + end + + return 1 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_void_spirit_boss_immunity.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_void_spirit_boss_immunity.lua new file mode 100755 index 0000000..6313ce2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_void_spirit_boss_immunity.lua @@ -0,0 +1,35 @@ + +modifier_void_spirit_boss_immunity = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_void_spirit_boss_immunity:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_void_spirit_boss_immunity:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_void_spirit_boss_immunity:CheckState() + local state = {} + if IsServer() then + state[MODIFIER_STATE_MAGIC_IMMUNE] = true + state[MODIFIER_STATE_INVULNERABLE] = true + state[MODIFIER_STATE_OUT_OF_GAME] = true + end + + return state +end + +----------------------------------------------------------------------------------------- + +function modifier_void_spirit_boss_immunity:GetPriority() + return MODIFIER_PRIORITY_SUPER_ULTRA +end + +----------------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_wandering_ogre_seal.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_wandering_ogre_seal.lua new file mode 100755 index 0000000..091fe0e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_wandering_ogre_seal.lua @@ -0,0 +1,109 @@ + +require( "utility_functions" ) + +modifier_wandering_ogre_seal = class({}) + +-------------------------------------------------------------------------------- + +function modifier_wandering_ogre_seal:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_wandering_ogre_seal:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +--[[ +function modifier_wandering_ogre_seal:GetPriority() + return MODIFIER_PRIORITY_SUPER_ULTRA +end +]] + +-------------------------------------------------------------------------------- + +function modifier_wandering_ogre_seal:OnCreated( kv ) + if IsServer() then + self.max_wander_range = self:GetAbility():GetSpecialValueFor( "max_wander_range" ) + self.min_wander_range = self:GetAbility():GetSpecialValueFor( "min_wander_range" ) + self.move_interval = self:GetAbility():GetSpecialValueFor( "move_interval" ) + + local flNow = GameRules:GetGameTime() + + self:StartIntervalThink( 1 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_wandering_ogre_seal:OnIntervalThink() + if IsServer() then + local hUnit = self:GetParent() + + local flNow = GameRules:GetGameTime() + + if self.flNextMoveTime == nil or ( flNow > self.flNextMoveTime ) then + local vGoalPosition = GetRandomPathablePositionWithin( hUnit:GetAbsOrigin(), self.max_wander_range, self.min_wander_range ) + + ExecuteOrderFromTable({ + UnitIndex = self:GetParent():entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = vGoalPosition + }) + self.flNextMoveTime = flNow + self.move_interval + end + end +end + +-------------------------------------------------------------------------------- + +--[[ +function modifier_wandering_ogre_seal:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_wandering_ogre_seal:OnTakeDamage( params ) + if IsServer() then + -- make Penguins do 1 damage to me? + + local hUnit = params.unit + if hUnit == self:GetParent() then + local flDamage = params.damage + if flDamage <= 0 then + return + end + + EmitSoundOn( "GingerRoshan.LowPitchGrunt", hUnit ) + end + end + + return 0 +end +]] + +-------------------------------------------------------------------------------- + +function modifier_wandering_ogre_seal:CheckState() + local state = {} + if IsServer() then + state = + { + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + [MODIFIER_STATE_OUT_OF_GAME] = true, + [MODIFIER_STATE_DISARMED] = true, + } + end + + return state +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_warlock_hp_aura.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_warlock_hp_aura.lua new file mode 100755 index 0000000..f47853c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_warlock_hp_aura.lua @@ -0,0 +1,58 @@ + +modifier_warlock_hp_aura = class({}) + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura:GetModifierAura() + return "modifier_warlock_hp_aura_effect" +end + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_FRIENDLY +end + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP +end + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS +end + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura:GetAuraRadius() + return self.radius +end + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura:OnCreated( kv ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) +end + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura:OnRefresh( kv ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_warlock_hp_aura_effect.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_warlock_hp_aura_effect.lua new file mode 100755 index 0000000..bd1ac69 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/creatures/modifier_warlock_hp_aura_effect.lua @@ -0,0 +1,55 @@ + +modifier_warlock_hp_aura_effect = class({}) + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura_effect:OnCreated( kv ) + if IsServer() then + --print( "test" ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura_effect:DeclareFunctions() + local funcs = { + MODIFIER_PROPERTY_EXTRA_HEALTH_PERCENTAGE, + MODIFIER_PROPERTY_MODEL_SCALE, + MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura_effect:GetModifierExtraHealthPercentage( params ) + if self:GetCaster() == nil or self:GetCaster():PassivesDisabled() then + return 0 + end + + -- How is this number intended to work? It seems to have regressed. + return 600 --8.0 --self.bonus_hp_multiplier +end + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura_effect:GetModifierModelScale( params ) + if self:GetCaster() == nil or self:GetCaster():PassivesDisabled() then + return 0 + end + + return 130 +end + +-------------------------------------------------------------------------------- + +function modifier_warlock_hp_aura_effect:GetModifierDamageOutgoing_Percentage( params ) + if self:GetCaster() == nil or self:GetCaster():PassivesDisabled() then + return 0 + end + + return 100 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ability_cast_warning.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ability_cast_warning.lua new file mode 100755 index 0000000..fefe6a8 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ability_cast_warning.lua @@ -0,0 +1,128 @@ + +modifier_ability_cast_warning = class({}) + +-------------------------------------------------------------------------------- + +function modifier_ability_cast_warning:IsHidden() + return true +end + + +-------------------------------------------------------------------------------- + +function modifier_ability_cast_warning:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_ABILITY_START, + MODIFIER_EVENT_ON_ABILITY_EXECUTED, + MODIFIER_EVENT_ON_STATE_CHANGED, + MODIFIER_EVENT_ON_ORDER, + + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_ability_cast_warning:OnAbilityStart( params ) + if IsServer() then + if params.unit ~= self:GetParent() then + return + end + + -- Don't show exclamation mark on bosses + if self:GetParent().bIsBoss then + self:Destroy() + end + + --printf("function modifier_ability_cast_warning:OnAbilityStart( params )") + self.m_nWarningFX = ParticleManager:CreateParticle( "particles/generic_gameplay/generic_has_quest.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetParent() ) + self:AddParticle( self.m_nWarningFX, false, false, -1, false, true ) + + self:StartIntervalThink( 0.75 ) + end + return + +end + +----------------------------------------------------------------------- + +function modifier_ability_cast_warning:OnIntervalThink() + if IsServer() then + if self.m_nWarningFX ~= nil then + ParticleManager:DestroyParticle( self.m_nWarningFX, true ) + end + return -1 + end + return +end +-------------------------------------------------------------------------------- + +----------------------------------------------------------------------- + +function modifier_ability_cast_warning:OnAbilityExecuted( params ) + if IsServer() then + if params.unit ~= self:GetParent() then + return + end + if self.m_nWarningFX == nil then + return + end + ParticleManager:DestroyParticle( self.m_nWarningFX, true ) + + end + return +end +-------------------------------------------------------------------------------- + +function modifier_ability_cast_warning:OnStateChanged( params ) + if IsServer() then + local hParent = self:GetParent() + if params.unit ~= hParent then + return + end + + if self.m_nWarningFX == nil then + return + end + + if hParent ~= nil and hParent:IsAlive() then + if hParent:IsSilenced() or hParent:IsStunned() or hParent:IsHexed() or hParent:IsFrozen() then + ParticleManager:DestroyParticle( self.m_nWarningFX, true ) + end + return + else + ParticleManager:DestroyParticle( self.m_nWarningFX, true ) + end + end + return +end + +----------------------------------------------------------------------- + +function modifier_ability_cast_warning:OnDeath( params ) + if IsServer() then + if params.unit ~= self:GetParent() then + return + end + if self.m_nWarningFX ~= nil then + ParticleManager:DestroyParticle( self.m_nWarningFX, true ) + return + end + end + return +end + +----------------------------------------------------------------------- + +function modifier_ability_cast_warning:OnOrder( params ) + if IsServer() then + if params.unit ~= self:GetParent() then + return + end + if self.m_nWarningFX ~= nil then + ParticleManager:DestroyParticle( self.m_nWarningFX, true ) + return + end + end + return +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_absolute_no_cc.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_absolute_no_cc.lua new file mode 100755 index 0000000..4fc60e3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_absolute_no_cc.lua @@ -0,0 +1,44 @@ + +modifier_absolute_no_cc = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_absolute_no_cc:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_absolute_no_cc:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_absolute_no_cc:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10000 +end + +-------------------------------------------------------------------------------- + +function modifier_absolute_no_cc:OnCreated( kv ) + if IsServer() then + self:GetParent().bAbsoluteNoCC = true + end +end + +----------------------------------------------------------------------------------------- + +function modifier_absolute_no_cc:CheckState() + local state = + { + [MODIFIER_STATE_HEXED] = false, + [MODIFIER_STATE_ROOTED] = false, + [MODIFIER_STATE_SILENCED] = false, + [MODIFIER_STATE_STUNNED] = false, + [MODIFIER_STATE_FROZEN] = false, + [MODIFIER_STATE_FEARED] = false, + [MODIFIER_STATE_CANNOT_BE_MOTION_CONTROLLED] = true, + } + return state +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_aggro_on_damage.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_aggro_on_damage.lua new file mode 100755 index 0000000..ced14a2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_aggro_on_damage.lua @@ -0,0 +1,61 @@ +LinkLuaModifier( "modifier_detect_invisible", "modifiers/modifier_detect_invisible", LUA_MODIFIER_MOTION_NONE ) + +modifier_aggro_on_damage = class({}) + +-------------------------------------------------------------------------------- + +function modifier_aggro_on_damage:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_aggro_on_damage:IsPermanent() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_aggro_on_damage:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_aggro_on_damage:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_aggro_on_damage:OnTakeDamage( params ) + if IsServer() then + -- Are we being attacked? + local hUnit = params.unit + if hUnit ~= self:GetParent() then + return 0 + end + + -- if we already have an aggro target just ignore + if hUnit:GetAggroTarget() then + return 0 + end + + -- Is the attacker is not something we can attack ignore it + local hAttacker = params.attacker + if hAttacker == nil then + return 0 + end + + --print( 'modifier_aggro_on_damage:OnTakeDamage() - setting SetInitialGoalEntity() to ' .. hAttacker:GetUnitName() ) + self:GetParent():SetInitialGoalEntity( hAttacker ) + + return 0 + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension.lua new file mode 100755 index 0000000..157acd3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension.lua @@ -0,0 +1,179 @@ + +modifier_ascension = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_ascension:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_ascension:OnCreated( kv ) + self:OnRefresh( kv ) +end + +---------------------------------------- + +function modifier_ascension:OnRefresh( kv ) + if self:GetAbility() == nil then + return + end + + self.bonus_magic_resist = self:GetAbility():GetSpecialValueFor( "bonus_magic_resist" ) + self.min_bonus_armor = self:GetAbility():GetSpecialValueFor( "min_bonus_armor" ) + self.max_bonus_armor = self:GetAbility():GetSpecialValueFor( "max_bonus_armor" ) + self.crit_chance = self:GetAbility():GetSpecialValueFor( "crit_chance" ) + self.crit_multiplier = self:GetAbility():GetSpecialValueFor( "crit_multiplier" ) + self.bonus_attack_speed = self:GetAbility():GetSpecialValueFor( "bonus_attack_speed" ) + self.bonus_hp = self:GetAbility():GetSpecialValueFor( "bonus_hp" ) + self.bonus_cooldown = self:GetAbility():GetSpecialValueFor( "bonus_cooldown" ) + self.bonus_outgoing_damage = self:GetAbility():GetSpecialValueFor( "bonus_outgoing_damage" ) + self.attack_speed_reduction_pct = self:GetAbility():GetSpecialValueFor( "attack_speed_reduction_pct" ) + self.move_speed_reduction_pct = self:GetAbility():GetSpecialValueFor( "move_speed_reduction_pct" ) + self.act_1_modifier = self:GetAbility():GetSpecialValueFor( "act_1_modifier" ) + self.act_2_modifier = self:GetAbility():GetSpecialValueFor( "act_2_modifier" ) + + self.flActModifier = self:CalculateActModifier() +end + +-------------------------------------------------------------------------------- + +function modifier_ascension:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS, + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + MODIFIER_PROPERTY_PREATTACK_CRITICALSTRIKE, + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + MODIFIER_PROPERTY_EXTRA_HEALTH_PERCENTAGE, + MODIFIER_PROPERTY_COOLDOWN_PERCENTAGE, + MODIFIER_PROPERTY_TOTALDAMAGEOUTGOING_PERCENTAGE, + MODIFIER_PROPERTY_ATTACKSPEED_REDUCTION_PERCENTAGE, + MODIFIER_PROPERTY_MOVESPEED_REDUCTION_PERCENTAGE, + } + return funcs +end + +function modifier_ascension:CalculateActModifier() + if IsServer() == false then + return 0 + end + + if self:GetParent().Encounter == nil or self:GetParent().Encounter:GetRoom() == nil then + return 0 + end + + local nAct = self:GetParent().Encounter:GetRoom():GetAct() + if nAct == 1 then + return self.act_1_modifier + end + if nAct == 2 then + return self.act_2_modifier + end + + return 0 +end + +---------------------------------------- + +function modifier_ascension:GetDepth() + if IsServer() == false then + return 0 + end + if self:GetParent().Encounter == nil then + return 0 + end + return self:GetParent().Encounter:GetRoom():GetDepth() +end + +-------------------------------------------------------------------------------- + +function modifier_ascension:GetModifierMagicalResistanceBonus( params ) + return self.bonus_magic_resist +end + +-------------------------------------------------------------------------------- + +function modifier_ascension:GetModifierPhysicalArmorBonus( params ) + if self:GetDepth() == 0 then + return 0 + end + + local flArmor = Lerp( ( self:GetDepth() - 2.0 ) / ( GameRules.Aghanim:GetMaxDepth() - 2.0 ), self.min_bonus_armor, self.max_bonus_armor ) + return flArmor +end + +-------------------------------------------------------------------------------- + +function modifier_ascension:GetModifierTotalDamageOutgoing_Percentage( params ) + if IsServer() then + return self.bonus_outgoing_damage + self.flActModifier + end + + return self.bonus_outgoing_damage +end + +-------------------------------------------------------------------------------- + +function modifier_ascension:GetModifierPreAttack_CriticalStrike( params ) + if IsServer() then + local hTarget = params.target + local hAttacker = params.attacker + + if hTarget and ( hTarget:IsBuilding() == false ) and ( hTarget:IsOther() == false ) and hAttacker and ( hAttacker:GetTeamNumber() ~= hTarget:GetTeamNumber() ) then + if RandomFloat( 1, 100 ) <= self.crit_chance then -- expose RollPseudoRandomPercentage? + self.bIsCrit = true + return self.crit_multiplier + end + end + end + + return 0.0 +end + +-------------------------------------------------------------------------------- + +function modifier_ascension:GetModifierAttackSpeedBonus_Constant( params ) + return self.bonus_attack_speed +end + +-------------------------------------------------------------------------------- + +function modifier_ascension:GetModifierExtraHealthPercentage( params ) + if IsServer() then + return self.bonus_hp + self.flActModifier + end + + return self.bonus_hp +end + +-------------------------------------------------------------------------------- + +function modifier_ascension:GetModifierPercentageCooldown( params ) + return self.bonus_cooldown +end + +-------------------------------------------------------------------------------- + +function modifier_ascension:GetModifierAttackSpeedReductionPercentage( params ) + if self:GetParent():IsConsideredHero() then + return self.attack_speed_reduction_pct + end + return 100 +end + +-------------------------------------------------------------------------------- + +function modifier_ascension:GetModifierMoveSpeedReductionPercentage( params ) + if self:GetParent():IsConsideredHero() then + return self.move_speed_reduction_pct + end + return 100 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_armor.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_armor.lua new file mode 100755 index 0000000..6e90b9e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_armor.lua @@ -0,0 +1,59 @@ + +modifier_ascension_armor = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_ascension_armor:constructor() + self.flArmor = 0 +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension_armor:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_ascension_armor:OnCreated( kv ) + self:OnRefresh( kv ) +end + +---------------------------------------- + +function modifier_ascension_armor:OnRefresh( kv ) + if self:GetAbility() == nil then + return + end + + local nDepth = 0 + local depth = CustomNetTables:GetTableValue( "encounter_state", "depth" ) + if depth ~= nil then + nDepth = depth["1"] + end + + local min_bonus_armor = self:GetAbility():GetSpecialValueFor( "min_bonus_armor" ) + local max_bonus_armor = self:GetAbility():GetSpecialValueFor( "max_bonus_armor" ) + + -- 2 is the min depth for encounters, 17 is the max + -- Hardcoded since we don't have access to GameRules.Aghanim on the client + self.flArmor = LerpClamp( ( nDepth - 2.0 ) / ( 17.0 - 2.0 ), min_bonus_armor, max_bonus_armor ) + +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_armor:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + } + return funcs +end + + +-------------------------------------------------------------------------------- + +function modifier_ascension_armor:GetModifierPhysicalArmorBonus( params ) + return self.flArmor +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_armor_sapping.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_armor_sapping.lua new file mode 100755 index 0000000..6498e04 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_armor_sapping.lua @@ -0,0 +1,47 @@ + +modifier_ascension_armor_sapping = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_ascension_armor_sapping:GetTexture() + return "ascension_armor_sapping" +end + +---------------------------------------- + +function modifier_ascension_armor_sapping:OnCreated( kv ) + self.model_scale_per_stack = self:GetAbility():GetSpecialValueFor( "model_scale_per_stack" ) + self.armor_reduction_per_stack = self:GetAbility():GetSpecialValueFor( "armor_reduction_per_stack" ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/items2_fx/medallion_of_courage.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetAbsOrigin(), true ); + self:AddParticle( nFXIndex, false, false, -1, false, true ); +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_armor_sapping:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MODEL_SCALE, + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + } + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension_armor_sapping:GetModifierModelScale( params ) + local flScale = self.model_scale_per_stack * self:GetStackCount() + if flScale < 50 then + return -flScale + else + return -50 + end +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_armor_sapping:GetModifierPhysicalArmorBonus( params ) + return -self.armor_reduction_per_stack * self:GetStackCount() +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_armor_sapping_display.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_armor_sapping_display.lua new file mode 100755 index 0000000..8d7e888 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_armor_sapping_display.lua @@ -0,0 +1,9 @@ + +modifier_ascension_armor_sapping_display = class({}) + +----------------------------------------------------------------------------------------- +-- All this does is display a visible icon, useful for abilities that trigger on death for example + +function modifier_ascension_armor_sapping_display:IsPurgable() + return false +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_armor_sapping_instance.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_armor_sapping_instance.lua new file mode 100755 index 0000000..b487809 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_armor_sapping_instance.lua @@ -0,0 +1,42 @@ + +modifier_ascension_armor_sapping_instance = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_ascension_armor_sapping_instance:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension_armor_sapping_instance:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension_armor_sapping_instance:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +---------------------------------------- + +function modifier_ascension_armor_sapping_instance:OnRemoved( ) + + if IsServer() == false then + return + end + + local hBuff = self:GetParent():FindModifierByName( "modifier_ascension_armor_sapping" ) + if hBuff == nil then + return + end + + local nNewStackCount = hBuff:GetStackCount() - 1 + if nNewStackCount > 0 then + hBuff:SetStackCount( nNewStackCount ) + else + hBuff:Destroy() + end + +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_attack_speed.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_attack_speed.lua new file mode 100755 index 0000000..4fe9ec1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_attack_speed.lua @@ -0,0 +1,48 @@ + +modifier_ascension_attack_speed = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_ascension_attack_speed:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_ascension_attack_speed:OnCreated( kv ) + self:OnRefresh( kv ) + + EmitSoundOn( "DOTA_Item.MaskOfMadness.Activate", self:GetParent() ) +end + +---------------------------------------- + +function modifier_ascension_attack_speed:OnRefresh( kv ) + if self:GetAbility() == nil then + return + end + + self.bonus_attack_speed = self:GetAbility():GetSpecialValueFor( "bonus_attack_speed" ) +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_attack_speed:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_attack_speed:GetEffectName() + return "particles/items2_fx/mask_of_madness.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_attack_speed:GetModifierAttackSpeedBonus_Constant( params ) + return self.bonus_attack_speed +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_chilling_touch.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_chilling_touch.lua new file mode 100755 index 0000000..c603ca1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_chilling_touch.lua @@ -0,0 +1,74 @@ + +modifier_ascension_chilling_touch = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_ascension_chilling_touch:IsHidden() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension_chilling_touch:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_ascension_chilling_touch:OnCreated( kv ) + self:OnRefresh( kv ) +end + +---------------------------------------- + +function modifier_ascension_chilling_touch:OnRefresh( kv ) + if self:GetAbility() == nil then + return + end + + self.slow = self:GetAbility():GetSpecialValueFor( "slow" ) + self.duration = self:GetAbility():GetSpecialValueFor( "duration" ) +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_chilling_touch:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + MODIFIER_PROPERTY_TOOLTIP, + MODIFIER_PROPERTY_TOOLTIP2, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_chilling_touch:OnTakeDamage( params ) + + if IsServer() then + if self:GetParent() == params.attacker then + local hTarget = params.unit + if hTarget ~= nil and hTarget:IsMagicImmune() == false then + hTarget:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_chilling_touch_slow", { duration = self.duration } ) + end + end + end + + return 0.0 + +end + +----------------------------------------------------------------------- + +function modifier_ascension_chilling_touch:OnTooltip( params ) + return self.slow +end + +----------------------------------------------------------------------- + +function modifier_ascension_chilling_touch:OnTooltip2( params ) + return self.duration +end + +----------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_crit.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_crit.lua new file mode 100755 index 0000000..341737e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_crit.lua @@ -0,0 +1,101 @@ + +modifier_ascension_crit = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_ascension_crit:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_ascension_crit:OnCreated( kv ) + self:OnRefresh( kv ) +end + +---------------------------------------- + +function modifier_ascension_crit:OnRefresh( kv ) + if self:GetAbility() == nil then + return + end + + self.crit_chance = self:GetAbility():GetSpecialValueFor( "crit_chance" ) + self.crit_multiplier = self:GetAbility():GetSpecialValueFor( "crit_multiplier" ) + self.bIsCrit = false +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_crit:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PREATTACK_CRITICALSTRIKE, + MODIFIER_EVENT_ON_ATTACK_LANDED, + MODIFIER_PROPERTY_TOOLTIP, + MODIFIER_PROPERTY_TOOLTIP2, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_crit:OnTooltip( params ) + return self.crit_chance +end + + +-------------------------------------------------------------------------------- + +function modifier_ascension_crit:OnTooltip2( params ) + return self.crit_multiplier +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_crit:GetModifierPreAttack_CriticalStrike( params ) + if IsServer() then + local hTarget = params.target + local hAttacker = params.attacker + + if hTarget and ( hTarget:IsBuilding() == false ) and ( hTarget:IsOther() == false ) + and hAttacker and ( hAttacker == self:GetParent() ) + and ( hAttacker:GetTeamNumber() ~= hTarget:GetTeamNumber() ) then + if RollPseudoRandomPercentage( self.crit_chance, DOTA_PSEUDO_RANDOM_CUSTOM_GAME_1, hAttacker ) == true then + self.bIsCrit = true + return self.crit_multiplier + end + end + end + + return 0.0 +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_crit:OnAttackLanded( params ) + + if IsServer() then + -- play sounds and stuff + if self:GetParent() == params.attacker then + local hTarget = params.target + if hTarget ~= nil and self.bIsCrit then + + local vDir = ( self:GetParent():GetAbsOrigin() - hTarget:GetAbsOrigin() ):Normalized() + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, hTarget, PATTACH_POINT_FOLLOW, "attach_hitloc", hTarget:GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, hTarget:GetAbsOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, vDir ) + ParticleManager:SetParticleControlEnt( nFXIndex, 10, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetAbsOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Ability.CoupDeGrace", self:GetParent() ) + self.bIsCrit = false + end + end + end + + return 0.0 + +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_damage.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_damage.lua new file mode 100755 index 0000000..3cf7319 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_damage.lua @@ -0,0 +1,40 @@ + +modifier_ascension_damage = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_ascension_damage:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_ascension_damage:OnCreated( kv ) + self:OnRefresh( kv ) +end + +---------------------------------------- + +function modifier_ascension_damage:OnRefresh( kv ) + if self:GetAbility() == nil then + return + end + + self.bonus_outgoing_damage = self:GetAbility():GetSpecialValueFor( "bonus_outgoing_damage" ) +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_damage:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_TOTALDAMAGEOUTGOING_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_damage:GetModifierTotalDamageOutgoing_Percentage( params ) + return self.bonus_outgoing_damage +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_drunken_display.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_drunken_display.lua new file mode 100755 index 0000000..b5a654e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_drunken_display.lua @@ -0,0 +1,9 @@ + +modifier_ascension_drunken_display = class({}) + +----------------------------------------------------------------------------------------- +-- All this does is display a visible icon, useful for abilities that trigger on death for example + +function modifier_ascension_drunken_display:IsPurgable() + return false +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_extra_fast.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_extra_fast.lua new file mode 100755 index 0000000..a641302 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_extra_fast.lua @@ -0,0 +1,64 @@ + +modifier_ascension_extra_fast = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_ascension_extra_fast:IsHidden() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension_extra_fast:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_ascension_extra_fast:OnCreated( kv ) + self:OnRefresh( kv ) +end + +---------------------------------------- + +function modifier_ascension_extra_fast:OnRefresh( kv ) + if self:GetAbility() == nil then + return + end + + self.bonus_move_speed = self:GetAbility():GetSpecialValueFor( "bonus_move_speed" ) +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_extra_fast:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, + } + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension_extra_fast:CheckState() + local state = + { + [MODIFIER_STATE_UNSLOWABLE] = true, + } + return state +end + + +-------------------------------------------------------------------------------- + +function modifier_ascension_extra_fast:GetEffectName() + return "particles/units/heroes/hero_dark_seer/dark_seer_surge.vpcf" +end + +----------------------------------------------------------------------------- + +function modifier_ascension_extra_fast:GetModifierMoveSpeedBonus_Percentage( params ) + return self.bonus_move_speed +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_flicker_display.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_flicker_display.lua new file mode 100755 index 0000000..d3ca082 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_flicker_display.lua @@ -0,0 +1,9 @@ + +modifier_ascension_flicker_display = class({}) + +----------------------------------------------------------------------------------------- +-- All this does is display a visible icon, useful for abilities that trigger on death for example + +function modifier_ascension_flicker_display:IsPurgable() + return false +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_heal_suppression.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_heal_suppression.lua new file mode 100755 index 0000000..a41d4ec --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_heal_suppression.lua @@ -0,0 +1,64 @@ + +modifier_ascension_heal_suppression = class({}) + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression:GetEffectName() + return "particles/items4_fx/spirit_vessel_damage.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression:OnCreated( kv ) + self.heal_suppression_pct = self:GetAbility():GetSpecialValueFor( "heal_suppression_pct" ) +end + + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression:OnRefresh( kv ) + self.heal_suppression_pct = self:GetAbility():GetSpecialValueFor( "heal_suppression_pct" ) +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_HEAL_AMPLIFY_PERCENTAGE_TARGET, + MODIFIER_PROPERTY_HP_REGEN_AMPLIFY_PERCENTAGE, + MODIFIER_PROPERTY_LIFESTEAL_AMPLIFY_PERCENTAGE, + MODIFIER_PROPERTY_SPELL_LIFESTEAL_AMPLIFY_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression:GetModifierHealAmplify_PercentageTarget( params ) + return -self.heal_suppression_pct +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression:GetModifierHPRegenAmplify_Percentage( params ) + return -self.heal_suppression_pct +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression:GetModifierLifestealRegenAmplify_Percentage( params ) + return -self.heal_suppression_pct +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression:GetModifierSpellLifestealRegenAmplify_Percentage( params ) + return -self.heal_suppression_pct +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_heal_suppression_aura.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_heal_suppression_aura.lua new file mode 100755 index 0000000..7d8b208 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_heal_suppression_aura.lua @@ -0,0 +1,83 @@ + +LinkLuaModifier( "modifier_ascension_heal_suppression", "modifiers/modifier_ascension_heal_suppression", LUA_MODIFIER_MOTION_NONE ) + +modifier_ascension_heal_suppression_aura = class({}) + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression_aura:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression_aura:GetEffectName() + return "particles/units/heroes/hero_necrolyte/necrolyte_spirit.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression_aura:GetStatusEffectName() + return "particles/status_fx/status_effect_necrolyte_spirit.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression_aura:OnCreated( kv ) + self.aura_radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.heal_suppression_pct = self:GetAbility():GetSpecialValueFor( "heal_suppression_pct" ) +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression_aura:OnRefresh( kv ) + self.aura_radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.heal_suppression_pct = self:GetAbility():GetSpecialValueFor( "heal_suppression_pct" ) +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression_aura:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression_aura:GetModifierAura() + return "modifier_ascension_heal_suppression" +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression_aura:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_ENEMY +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression_aura:GetAuraSearchType() + return DOTA_UNIT_TARGET_ALL +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression_aura:GetAuraRadius() + return self.aura_radius +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression_aura:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_TOOLTIP, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_heal_suppression_aura:OnTooltip( params ) + return -self.heal_suppression_pct +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_magic_immunity.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_magic_immunity.lua new file mode 100755 index 0000000..008c533 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_magic_immunity.lua @@ -0,0 +1,53 @@ + +modifier_ascension_magic_immunity = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_ascension_magic_immunity:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_ascension_magic_immunity:OnCreated( kv ) + self.model_scale = self:GetAbility():GetSpecialValueFor( "model_scale" ) + EmitSoundOn( "DOTA_Item.BlackKingBar.Activate", self:GetParent() ) +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension_magic_immunity:CheckState() + local state = + { + [MODIFIER_STATE_MAGIC_IMMUNE] = true, + } + return state +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_magic_immunity:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MODEL_SCALE, + } + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension_magic_immunity:GetModifierModelScale( params ) + return self.model_scale +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_magic_immunity:GetEffectName() + return "particles/items_fx/black_king_bar_avatar.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_magic_immunity:GetStatusEffectName() + return "particles/status_fx/status_effect_avatar.vpcf" +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_magic_resist.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_magic_resist.lua new file mode 100755 index 0000000..87cc9d4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_magic_resist.lua @@ -0,0 +1,40 @@ + +modifier_ascension_magic_resist = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_ascension_magic_resist:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_ascension_magic_resist:OnCreated( kv ) + self:OnRefresh( kv ) +end + +---------------------------------------- + +function modifier_ascension_magic_resist:OnRefresh( kv ) + if self:GetAbility() == nil then + return + end + + self.bonus_magic_resist = self:GetAbility():GetSpecialValueFor( "bonus_magic_resist" ) +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_magic_resist:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_magic_resist:GetModifierMagicalResistanceBonus( params ) + return self.bonus_magic_resist +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_plasma_field_display.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_plasma_field_display.lua new file mode 100755 index 0000000..c1452e1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_plasma_field_display.lua @@ -0,0 +1,9 @@ + +modifier_ascension_plasma_field_display = class({}) + +----------------------------------------------------------------------------------------- +-- All this does is display a visible icon, useful for abilities that trigger on death for example + +function modifier_ascension_plasma_field_display:IsPurgable() + return false +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_vampiric.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_vampiric.lua new file mode 100755 index 0000000..ffeb9fd --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ascension_vampiric.lua @@ -0,0 +1,105 @@ + +modifier_ascension_vampiric = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_ascension_vampiric:IsHidden() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension_vampiric:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension_vampiric:GetEffectName() + return "particles/items2_fx/satanic_buff.vpcf" +end + +----------------------------------------------------------------------------------------- + +function modifier_ascension_vampiric:GetStatusEffectName() + return "particles/status_fx/status_effect_life_stealer_rage.vpcf" +end + +---------------------------------------- + +function modifier_ascension_vampiric:OnCreated( kv ) + self:OnRefresh( kv ) + + if IsServer() then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_life_stealer/life_stealer_rage.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_attack1", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_attack2", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 2, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt(nFXIndex, 3, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetAbsOrigin(), true ) + self:AddParticle( nFXIndex, false, false, -1, false, false ) + end +end + +---------------------------------------- + +function modifier_ascension_vampiric:OnRefresh( kv ) + if self:GetAbility() == nil then + return + end + + self.lifesteal_pct = self:GetAbility():GetSpecialValueFor( "lifesteal_pct" ) +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_vampiric:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + MODIFIER_PROPERTY_TOOLTIP, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_ascension_vampiric:OnTakeDamage( params ) + + if IsServer() then + local Attacker = params.attacker + local Target = params.unit + local Ability = params.inflictor + local flDamage = params.damage + + if Attacker ~= self:GetParent() or Target == nil then + return 0 + end + + if bit.band( params.damage_flags, DOTA_DAMAGE_FLAG_REFLECTION ) == DOTA_DAMAGE_FLAG_REFLECTION then + return 0 + end + if bit.band( params.damage_flags, DOTA_DAMAGE_FLAG_NO_SPELL_LIFESTEAL ) == DOTA_DAMAGE_FLAG_NO_SPELL_LIFESTEAL then + return 0 + end + + if Ability then + local nFXIndex = ParticleManager:CreateParticle( "particles/items3_fx/octarine_core_lifesteal.vpcf", PATTACH_ABSORIGIN_FOLLOW, Attacker ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + else + local nFXIndex = ParticleManager:CreateParticle( "particles/generic_gameplay/generic_lifesteal.vpcf", PATTACH_ABSORIGIN_FOLLOW, Attacker ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + + local flLifesteal = flDamage * self.lifesteal_pct / 100 + Attacker:Heal( flLifesteal, self:GetAbility() ) + end + + return 0.0 + +end + +----------------------------------------------------------------------- + +function modifier_ascension_vampiric:OnTooltip( params ) + return self.lifesteal_pct +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_attack_speed_unslowable.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_attack_speed_unslowable.lua new file mode 100755 index 0000000..2ecbfa9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_attack_speed_unslowable.lua @@ -0,0 +1,71 @@ + +modifier_attack_speed_unslowable = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_attack_speed_unslowable:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_attack_speed_unslowable:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_attack_speed_unslowable:OnCreated( kv ) + + -- Allow units to directly use this modifier, in which case the kv has the amount of reduction + if self:GetAbility() == nil and IsServer() == true then + self.attack_speed_reduction_pct = 0 + if kv.attack_speed_reduction_pct ~= nil then + self.attack_speed_reduction_pct = kv.attack_speed_reduction_pct + if self.attack_speed_reduction_pct ~= 0 then + self:SetHasCustomTransmitterData( true ) + end + end + end + + self:OnRefresh( kv ) +end + +---------------------------------------- + +function modifier_attack_speed_unslowable:OnRefresh( kv ) + if self:GetAbility() ~= nil then + self.attack_speed_reduction_pct = self:GetAbility():GetSpecialValueFor( "attack_speed_reduction_pct" ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_attack_speed_unslowable:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_ATTACKSPEED_REDUCTION_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_attack_speed_unslowable:GetModifierAttackSpeedReductionPercentage( params ) + return self.attack_speed_reduction_pct +end + +-------------------------------------------------------------------------------- + +function modifier_attack_speed_unslowable:AddCustomTransmitterData( ) + return + { + armor = self.attack_speed_reduction_pct + } +end + +-------------------------------------------------------------------------------- + +function modifier_attack_speed_unslowable:HandleCustomTransmitterData( data ) + self.attack_speed_reduction_pct = data.armor +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_battle_royale.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_battle_royale.lua new file mode 100755 index 0000000..127bba4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_battle_royale.lua @@ -0,0 +1,156 @@ +-- This is the modifier that punishes players for not being in the active room +LinkLuaModifier( "modifier_battle_royale_damage", "modifiers/modifier_battle_royale_damage", LUA_MODIFIER_MOTION_NONE ) + +modifier_battle_royale = class({}) + +-------------------------------------------------------------------------------- + +function modifier_battle_royale:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_battle_royale:IsPermanent() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_battle_royale:RemoveOnDeath() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_battle_royale:OnCreated( kv ) + if IsServer() then + self.nDeepestDepth = 0 + self.hDeepestRoom = nil + self.vLastValidPos = self:GetParent():GetAbsOrigin() + self.flLastTimeInCurrentRoom = GameRules:GetGameTime() + self:StartIntervalThink( 0.01 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_battle_royale:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + + return funcs +end + +----------------------------------------------------------------------- + +function modifier_battle_royale:OnIntervalThink() + + local bIsRidingMorty = self:GetParent():FindModifierByName( "modifier_snapfire_gobble_up_creep" ) ~= nil + if bIsRidingMorty == true then + return + end + + -- Determine whether we have a valid position and valid room + + local bValidRoom = false + local bValidFlyingPos = false + local bValidPosition = IsUnitInValidPosition( self:GetParent() ) + + local nDepth = 0 + local vCurrentPos = self:GetParent():GetAbsOrigin() + local vClampedValidFlyingPos = self.vLastValidPos + local hRoom = GameRules.Aghanim:FindRoomForPoint( vCurrentPos ) + if hRoom ~= nil then + + nDepth = hRoom:GetDepth() + + -- Update the deepest we've ever been in the dungeon + -- But don't allow people to skip ahead to unselected rooms + local hCurrentRoom = GameRules.Aghanim:GetCurrentRoom() + if nDepth > self.nDeepestDepth then + if ( hCurrentRoom == hRoom ) or + ( hCurrentRoom:GetExitRoomSelected() == hRoom:GetName() ) or + ( GameRules.Aghanim:GetTestEncounterDebugRoom() == hRoom ) then + self.nDeepestDepth = nDepth + self.hDeepestRoom = hRoom + + -- Ok, they advanced rooms. We can stop punishment. + if self:GetParent():FindModifierByName( "modifier_battle_royale_damage" ) ~= nil then + self:GetParent():RemoveModifierByName( "modifier_battle_royale_damage" ) + end + end + end + + if hCurrentRoom == hRoom then + self.flLastTimeInCurrentRoom = GameRules:GetGameTime() + end + + bValidRoom = ( nDepth == self.nDeepestDepth ) + + vClampedValidFlyingPos = vCurrentPos + if bValidPosition == false or bValidRoom == false then + local flBoundary = 192.0 + if bValidPosition == true then + flBoundary = 4.0 + end + vClampedValidFlyingPos = self.hDeepestRoom:ClampPointToRoomBounds( vCurrentPos, flBoundary ) + end + end + + if ( GameRules:GetGameTime() - self.flLastTimeInCurrentRoom ) > 8.0 and self:GetParent():IsSummoned() == false then + GameRules.Aghanim:GetAnnouncer():OnLaggingHero( self:GetParent():GetUnitName(), GameRules.Aghanim:GetCurrentRoom():GetDepth() ) + end + + if bValidRoom == true and bValidPosition == true then + self.vLastValidPos = vCurrentPos + end + + local bIsMotionControlled = self:GetParent():IsCurrentlyHorizontalMotionControlled() == true or self:GetParent():IsCurrentlyVerticalMotionControlled() == true + if self:GetParent():HasFlyMovementCapability() == false and bIsMotionControlled == false then + if bValidRoom == false or bValidPosition == false then + --print( "Teleporting to " .. tostring( self.vLastValidPos ) ) + FindClearSpaceForUnit( self:GetParent(), self.vLastValidPos, true ) + end + else + if bValidRoom == false or vCurrentPos ~= vClampedValidFlyingPos then + --print( "Flying Teleporting to " .. tostring( vClampedValidFlyingPos ) ) + FindClearSpaceForUnit( self:GetParent(), vClampedValidFlyingPos, true ) + end + end + +end + +----------------------------------------------------------------------- + +function modifier_battle_royale:OnTakeDamage( params ) + + if IsServer() == false then + return + end + + if params.attacker ~= self:GetParent() then + return + end + + local hUnit = params.unit + if hUnit == nil or hUnit.Encounter == nil then + return + end + + local nUnitDepth = hUnit.Encounter:GetRoom():GetDepth() + if nUnitDepth <= self.nDeepestDepth then + return + end + + -- They are attacking a unit at the wrong depth. PUNISH THEM + if self:GetParent():FindModifierByName( "modifier_battle_royale_damage" ) == nil then + self:GetParent():AddNewModifier( self:GetParent(), nil, "modifier_battle_royale_damage", {} ) + if self:GetParent():GetPlayerOwner() ~= nil then + CustomGameEventManager:Send_ServerToPlayer( self:GetParent():GetPlayerOwner(), "battle_royale_damage_starting", {} ) + GameRules.Aghanim:GetAnnouncer():OnCowardlyHero( self:GetParent():GetUnitName(), self:GetCaster():GetUnitName() ) + end + end +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_battle_royale_damage.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_battle_royale_damage.lua new file mode 100755 index 0000000..55154c1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_battle_royale_damage.lua @@ -0,0 +1,59 @@ +-- This is the modifier that punishes players for not being in the active room + +modifier_battle_royale_damage = class({}) + +-------------------------------------------------------------------------------- + +function modifier_battle_royale_damage:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_battle_royale_damage:OnCreated( kv ) + if IsServer() then + self.flStartTime = GameRules:GetGameTime() + self:OnIntervalThink() + self:StartIntervalThink( 1.0 ) + end +end + +----------------------------------------------------------------------- + +function modifier_battle_royale_damage:OnIntervalThink() + + -- If the player is disconnected, should we give them a break? Not sure... + local nPlayerID = self:GetParent():GetPlayerOwnerID() + if PlayerResource:GetConnectionState( nPlayerID ) == 3 then + return + end + + local vecStartPos = self:GetParent():GetAbsOrigin() + vecStartPos.z = vecStartPos.z + 4000 + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_zuus/zuus_lightning_bolt.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, vecStartPos ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local flTimeSinceStart = GameRules:GetGameTime() - self.flStartTime + local flDamagePercent = flTimeSinceStart / 10 + if flDamagePercent > 1 then + flDamagePercent = 1 + end + flDamagePercent = SimpleSpline( flDamagePercent ) + flDamagePercent = ( 1 - flDamagePercent ) * 0.03 + flDamagePercent * 0.15 -- Linear Interpolation + + local damageInfo = + { + victim = self:GetParent(), + attacker = self:GetParent(), + damage = flDamagePercent * self:GetParent():GetMaxHealth(), + damage_type = DAMAGE_TYPE_PURE, + ability = nil, + } + ApplyDamage( damageInfo ) + + EmitSoundOn( "BattleRoyaleDamage", self:GetParent() ) + +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_agility.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_agility.lua new file mode 100755 index 0000000..b62b60c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_agility.lua @@ -0,0 +1,26 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_agility = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_agility:OnBlessingCreated( kv ) + self.bonus_agility = kv.agi_bonus + --print ( "Agility Bonus = " .. self.bonus_agility ) +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_agility:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_AGILITY_BONUS, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_agility:GetModifierBonusStats_Agility( params ) + return self.bonus_agility +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_armor.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_armor.lua new file mode 100755 index 0000000..603e44d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_armor.lua @@ -0,0 +1,25 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_armor = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_armor:OnBlessingCreated( kv ) + self.flArmor = kv.bonus_armor +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_armor:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_armor:GetModifierPhysicalArmorBonus( params ) + return self.flArmor +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_attack_speed.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_attack_speed.lua new file mode 100755 index 0000000..33d84a1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_attack_speed.lua @@ -0,0 +1,25 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_attack_speed = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_attack_speed:OnBlessingCreated( kv ) + self.bonus_attack_speed = kv.bonus_attack_speed +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_attack_speed:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_attack_speed:GetModifierAttackSpeedBonus_Constant( params ) + return self.bonus_attack_speed +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_base.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_base.lua new file mode 100755 index 0000000..093b111 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_base.lua @@ -0,0 +1,81 @@ + +require( "blessings" ) + +modifier_blessing_base = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_blessing_base:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_blessing_base:IsPermanent() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_blessing_base:IsBlessing() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_base:GetTexture() + return self:GetName() +end + +---------------------------------------- + +function modifier_blessing_base:OnCreated( kv ) + self:SetHasCustomTransmitterData( true ) + if IsServer() == true then + self.nBlessingLevel = kv.blessing_level + self:InvokeBlessingOnCreated() + end +end + +---------------------------------------- + +function modifier_blessing_base:InvokeBlessingOnCreated( ) + + local kv = BLESSING_MODIFIERS[ self:GetName() ].keys + + -- Allow you to specify different keys for each claim level + if #kv > 0 then + local nIndex = self.nBlessingLevel + if nIndex > #kv then + nIndex = #kv + end + kv = kv[ nIndex ] + end + + self:OnBlessingCreated( kv ) + +end + +---------------------------------------- + +function modifier_blessing_base:OnBlessingCreated( kv ) + -- Derived classes should modify this +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_base:AddCustomTransmitterData( ) + return + { + armor = self.nBlessingLevel + } +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_base:HandleCustomTransmitterData( data ) + if data.armor ~= nil and self.nBlessingLevel ~= data.armor then + self.nBlessingLevel = data.armor + self:InvokeBlessingOnCreated() + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_book_agility.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_book_agility.lua new file mode 100755 index 0000000..e4509c1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_book_agility.lua @@ -0,0 +1,78 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_book_agility = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_book_agility:GetTexture() + return "../items/necronomicon" +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_book_agility:OnBlessingCreated( kv ) + self.bonus_stat = kv.bonus_stat +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_book_agility:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + MODIFIER_PROPERTY_TOOLTIP, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_blessing_book_agility:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if szAbilityName == nil or szSpecialValueName == nil then + return 0 + end + + --print( "modifier_blessing_book_agility: " .. szAbilityName .. " is asking for " .. szSpecialValueName ) + + if szAbilityName == "item_book_of_agility" or szAbilityName == "item_book_of_greater_agility" then + if szSpecialValueName == "bonus_stat" then + --print( szAbilityName .. " is asking for " .. szSpecialValueName ) + return 1 + end + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_book_agility:GetModifierOverrideAbilitySpecialValue( params ) + local szAbilityName = params.ability:GetAbilityName() + if szAbilityName == "item_book_of_agility" or szAbilityName == "item_book_of_greater_agility" then + local szSpecialValueName = params.ability_special_value + if szSpecialValueName == "bonus_stat" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + + --print( szAbilityName .. " base value for " .. szSpecialValueName .. " is " .. flBaseValue .. ". Adding " .. self.bonus_stat ) + + return flBaseValue + self.bonus_stat + end + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_book_agility:OnTooltip( params ) + return self.bonus_stat +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_book_intelligence.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_book_intelligence.lua new file mode 100755 index 0000000..e4b096f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_book_intelligence.lua @@ -0,0 +1,72 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_book_intelligence = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_book_intelligence:GetTexture() + return "../items/necronomicon" +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_book_intelligence:OnBlessingCreated( kv ) + self.bonus_stat = kv.bonus_stat +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_book_intelligence:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + MODIFIER_PROPERTY_TOOLTIP, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_blessing_book_intelligence:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if szAbilityName == "item_book_of_intelligence" or szAbilityName == "item_book_of_greater_intelligence" then + if szSpecialValueName == "bonus_stat" then + --print( szAbilityName .. " is asking for " .. szSpecialValueName ) + return 1 + end + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_book_intelligence:GetModifierOverrideAbilitySpecialValue( params ) + local szAbilityName = params.ability:GetAbilityName() + if szAbilityName == "item_book_of_intelligence" or szAbilityName == "item_book_of_greater_intelligence" then + local szSpecialValueName = params.ability_special_value + if szSpecialValueName == "bonus_stat" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + + --print( szAbilityName .. " base value for " .. szSpecialValueName .. " is " .. flBaseValue .. ". Adding " .. self.bonus_stat ) + + return flBaseValue + self.bonus_stat + end + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_book_intelligence:OnTooltip( params ) + return self.bonus_stat +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_book_strength.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_book_strength.lua new file mode 100755 index 0000000..485a536 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_book_strength.lua @@ -0,0 +1,78 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_book_strength = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_book_strength:GetTexture() + return "../items/necronomicon" +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_book_strength:OnBlessingCreated( kv ) + self.bonus_stat = kv.bonus_stat +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_book_strength:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + MODIFIER_PROPERTY_TOOLTIP, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_blessing_book_strength:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if szAbilityName == nil or szSpecialValueName == nil then + return 0 + end + + --print( "modifier_blessing_book_strength: " .. szAbilityName .. " is asking for " .. szSpecialValueName ) + + if szAbilityName == "item_book_of_strength" or szAbilityName == "item_book_of_greater_strength" then + if szSpecialValueName == "bonus_stat" then + --print( szAbilityName .. " is asking for " .. szSpecialValueName ) + return 1 + end + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_book_strength:GetModifierOverrideAbilitySpecialValue( params ) + local szAbilityName = params.ability:GetAbilityName() + if szAbilityName == "item_book_of_strength" or szAbilityName == "item_book_of_greater_strength" then + local szSpecialValueName = params.ability_special_value + if szSpecialValueName == "bonus_stat" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + + --print( szAbilityName .. " base value for " .. szSpecialValueName .. " is " .. flBaseValue .. ". Adding " .. self.bonus_stat ) + + return flBaseValue + self.bonus_stat + end + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_book_strength:OnTooltip( params ) + return self.bonus_stat +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_bottle_upgrade.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_bottle_upgrade.lua new file mode 100755 index 0000000..dee67be --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_bottle_upgrade.lua @@ -0,0 +1,68 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_bottle_upgrade = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_bottle_upgrade:GetTexture() + return "../items/bottle" +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_bottle_upgrade:OnBlessingCreated( kv ) + self.max_charges = kv.max_charges +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_bottle_upgrade:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_blessing_bottle_upgrade:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if szAbilityName ~= "item_bottle" then + return 0 + end + + if szSpecialValueName == "max_charges" then + --print( 'modifier_blessing_bottle_upgrade:GetModifierOverrideAbilitySpecial - looking for max_charges!' ) + return 1 + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_bottle_upgrade:GetModifierOverrideAbilitySpecialValue( params ) + local szAbilityName = params.ability:GetAbilityName() + if szAbilityName ~= "item_bottle" then + return 0 + end + + local szSpecialValueName = params.ability_special_value + if szSpecialValueName == "max_charges" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + --print( 'modifier_blessing_bottle_upgrade:GetModifierOverrideAbilitySpecialValue - max_charges is ' .. flBaseValue .. '. Adding on an additional ' .. self.max_charges ) + + return flBaseValue + self.max_charges + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_damage_bonus.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_damage_bonus.lua new file mode 100755 index 0000000..4f13bfc --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_damage_bonus.lua @@ -0,0 +1,37 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_damage_bonus = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_damage_bonus:OnBlessingCreated( kv ) + self.bonus_damage = kv.bonus_damage +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_damage_bonus:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, + MODIFIER_PROPERTY_TOOLTIP, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_damage_bonus:GetModifierPreAttack_BonusDamage( params ) + if self:GetParent() ~= nil and self:GetParent():IsNull() == false then + return self.bonus_damage * self:GetParent():GetLevel() + end + + print( 'WARNING: modifier_blessing_damage_bonus:GetModifierPreAttack_BonusDamage - parent not found - returning 0' ) + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_damage_bonus:OnTooltip( params ) + return self.bonus_damage +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_damage_reflect.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_damage_reflect.lua new file mode 100755 index 0000000..9d9683d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_damage_reflect.lua @@ -0,0 +1,76 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_damage_reflect = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_damage_reflect:OnBlessingCreated( kv ) + self.flDamageReflectPercentage = kv.damage_reflect + --print ( "Reflecting Damage = " .. self.flDamageReflectPercentage ) +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_damage_reflect:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + MODIFIER_PROPERTY_TOOLTIP, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_damage_reflect:OnTakeDamage( params ) + if IsServer() then + -- Are we being attacked? + local hUnit = params.unit + if hUnit ~= self:GetParent() then + return 0 + end + + -- Is the attacker something to reflect damage upon + local hAttacker = params.attacker + if hAttacker == nil or hAttacker:IsBuilding() then + return 0 + end + + if hAttacker == self:GetParent() or hAttacker:GetTeamNumber() == self:GetParent():GetTeamNumber() then + return 0 + end + + if bit.band( params.damage_flags, DOTA_DAMAGE_FLAG_REFLECTION ) == DOTA_DAMAGE_FLAG_REFLECTION then + return 0 + end + + -- Get damage amount and calculate the relfected amount + local flDamage = params.damage + local flDamageReflect = flDamage * self.flDamageReflectPercentage + + -- Create reflect sound (BladeMail) + --EmitSoundOn( "DOTA_Item.BladeMail.Damage", self:GetParent() ) + + -- Send damage back + local damageInfo = + { + victim = hAttacker, + attacker = self:GetParent(), + damage = flDamageReflect, + damage_type = params.damage_type, + damage_flags = DOTA_DAMAGE_FLAG_REFLECTION, + ability = nil, + } + ApplyDamage( damageInfo ) + --print( "Damage = " .. flDamage .. ", Reflecting Damage = " .. flDamageReflect ) + end + + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_damage_reflect:OnTooltip( params ) + local nDamageReflectPercentage = ( self.flDamageReflectPercentage * 100.0 ) + return nDamageReflectPercentage +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_death_detonation.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_death_detonation.lua new file mode 100755 index 0000000..4d271fa --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_death_detonation.lua @@ -0,0 +1,63 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_death_detonation = class( modifier_blessing_base ) + +------------------------------------------------------------------------------- + +function modifier_blessing_death_detonation:OnBlessingCreated( kv ) + self.detonation_damage_per_level = kv.detonation_damage_per_level + self.detonation_radius = kv.detonation_radius +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_death_detonation:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_DEATH + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_death_detonation:OnDeath( params ) + if IsServer() then + if self:GetParent():PassivesDisabled() then + return 1 + end + + if params.unit ~= nil and params.unit == self:GetParent() then + + local damage = self.detonation_damage_per_level * self:GetParent():GetLevel() + --print( 'modifier_blessing_death_detonation damage = ' .. damage ) + + local nTeam = DOTA_UNIT_TARGET_TEAM_ENEMY + local entities = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), nil, self.detonation_radius, nTeam, + DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + + if #entities > 0 then + for _,entity in pairs(entities) do + if entity ~= nil and entity:IsNull() == false and entity ~= self:GetParent() and ( not entity:IsMagicImmune() ) and ( not entity:IsInvulnerable() ) then + local DamageInfo = + { + victim = entity, + attacker = self:GetCaster(), + ability = self, + damage = damage, + damage_type = DAMAGE_TYPE_MAGICAL, + } + ApplyDamage( DamageInfo ) + end + end + end + + --EmitSoundOn( "Ability.Bomber.Detonate", self:GetParent() ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/blessings/death_detonation/death_detonation_remote_mines_detonate.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.detonation_radius, self.detonation_radius, self.detonation_radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_evasion.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_evasion.lua new file mode 100755 index 0000000..dad6203 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_evasion.lua @@ -0,0 +1,25 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_evasion = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_evasion:OnBlessingCreated( kv ) + self.bonus_evasion = kv.bonus_evasion +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_evasion:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_EVASION_CONSTANT, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_evasion:GetModifierEvasion_Constant( params ) + return self.bonus_evasion +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_health_boost.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_health_boost.lua new file mode 100755 index 0000000..e343b45 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_health_boost.lua @@ -0,0 +1,32 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_health_boost = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_health_boost:OnBlessingCreated( kv ) + self.bonus_health_per_level = kv.bonus_health_per_level +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_health_boost:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_HEALTH_BONUS, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_health_boost:GetModifierHealthBonus( params ) + if self:GetParent() ~= nil and self:GetParent():IsNull() == false then + local nHealthBoost = self.bonus_health_per_level * self:GetParent():GetLevel() + --print( 'modifier_blessing_health_boost:GetModifierHealthBonus - bonus is ' .. nHealthBoost ) + return nHealthBoost + end + + print( 'WARNING: modifier_blessing_health_boost:GetModifierHealthBonus - parent not found - returning 0' ) + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_intelligence.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_intelligence.lua new file mode 100755 index 0000000..8b869b3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_intelligence.lua @@ -0,0 +1,26 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_intelligence = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_intelligence:OnBlessingCreated( kv ) + self.bonus_intelligence = kv.int_bonus + --print ( "Intelligence Bonus = " .. self.bonus_intelligence ) +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_intelligence:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_intelligence:GetModifierBonusStats_Intellect( params ) + return self.bonus_intelligence +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_life_steal.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_life_steal.lua new file mode 100755 index 0000000..1e8df06 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_life_steal.lua @@ -0,0 +1,59 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_life_steal = class( modifier_blessing_base ) + +------------------------------------------------------------------------------- + +function modifier_blessing_life_steal:GetTexture() + return "../items/lifesteal" +end + +------------------------------------------------------------------------------- + +function modifier_blessing_life_steal:OnBlessingCreated( kv ) + self.life_steal_pct = kv.life_steal_pct +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_life_steal:GetStatusEffectName() + return "particles/generic_gameplay/generic_lifesteal.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_life_steal:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_ATTACKED, + MODIFIER_PROPERTY_TOOLTIP, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_life_steal:OnAttacked( params ) + if IsServer() then + --print( 'modifier_blessing_life_steal:OnAttacked' ) + + if self:GetParent():PassivesDisabled() then + return 1 + end + + if params.attacker ~= nil and params.attacker == self:GetParent() and params.target ~= nil then + local heal = ( params.damage * self.life_steal_pct / 100 ) + --print( 'modifier_blessing_life_steal healing for ' .. heal ) + self:GetParent():Heal( heal, nil ) + ParticleManager:ReleaseParticleIndex( ParticleManager:CreateParticle( "particles/generic_gameplay/generic_lifesteal.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) ) + end + end + + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_life_steal:OnTooltip( params ) + return self.life_steal_pct +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_magic_damage_bonus.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_magic_damage_bonus.lua new file mode 100755 index 0000000..d0324f8 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_magic_damage_bonus.lua @@ -0,0 +1,25 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_magic_damage_bonus = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_magic_damage_bonus:OnBlessingCreated( kv ) + self.bonus_magic_damage = kv.bonus_magic_damage +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_magic_damage_bonus:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_magic_damage_bonus:GetModifierSpellAmplify_Percentage( params ) + return self.bonus_magic_damage +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_magic_resist.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_magic_resist.lua new file mode 100755 index 0000000..63f726e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_magic_resist.lua @@ -0,0 +1,25 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_magic_resist = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_magic_resist:OnBlessingCreated( kv ) + self.bonus_magic_resist = kv.bonus_magic_resist +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_magic_resist:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_magic_resist:GetModifierMagicalResistanceBonus( params ) + return self.bonus_magic_resist +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_mana_boost.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_mana_boost.lua new file mode 100755 index 0000000..7fe4ca3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_mana_boost.lua @@ -0,0 +1,25 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_mana_boost = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_mana_boost:OnBlessingCreated( kv ) + self.bonus_mana = kv.bonus_mana +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_mana_boost:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_EXTRA_MANA_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_mana_boost:GetModifierExtraManaPercentage( params ) + return self.bonus_mana +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_movement_speed.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_movement_speed.lua new file mode 100755 index 0000000..21955dc --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_movement_speed.lua @@ -0,0 +1,25 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_movement_speed = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_movement_speed:OnBlessingCreated( kv ) + self.bonus_movement_speed = kv.bonus_movement_speed +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_movement_speed:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_movement_speed:GetModifierMoveSpeedBonus_Percentage( params ) + return self.bonus_movement_speed +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_arcanist.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_arcanist.lua new file mode 100755 index 0000000..a39e995 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_arcanist.lua @@ -0,0 +1,69 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_potion_arcanist = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_arcanist:OnBlessingCreated( kv ) + self.cooldown_reduction_percent = kv.cooldown_reduction_percent + self.manacost_reduction_percent = kv.manacost_reduction_percent +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_arcanist:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_arcanist:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if szAbilityName ~= "item_arcanist_potion" then + return 0 + end + + if szSpecialValueName == "cooldown_reduction_pct" or szSpecialValueName == "manacost_reduction_pct" then + print( 'modifier_blessing_potion_arcanist:GetModifierOverrideAbilitySpecial - looking for cooldown_reduction_pct or manacost_reduction_pct!' ) + return 1 + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_arcanist:GetModifierOverrideAbilitySpecialValue( params ) + local szAbilityName = params.ability:GetAbilityName() + if szAbilityName ~= "item_arcanist_potion" then + return 0 + end + + local szSpecialValueName = params.ability_special_value + if szSpecialValueName == "cooldown_reduction_pct" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + print( 'modifier_blessing_potion_arcanist:GetModifierOverrideAbilitySpecialValue - cooldown_reduction_pct is ' .. flBaseValue .. '. Adding on an additional ' .. self.cooldown_reduction_percent ) + + return flBaseValue * ( ( 100 + self.cooldown_reduction_percent ) / 100 ) + elseif szSpecialValueName == "manacost_reduction_pct" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + print( 'modifier_blessing_potion_arcanist:GetModifierOverrideAbilitySpecialValue - manacost_reduction_pct is ' .. flBaseValue .. '. Adding on an additional ' .. self.manacost_reduction_percent ) + + return flBaseValue * ( ( 100 + self.manacost_reduction_percent ) / 100 ) + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_dragon.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_dragon.lua new file mode 100755 index 0000000..42c0c6b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_dragon.lua @@ -0,0 +1,62 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_potion_dragon = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_dragon:OnBlessingCreated( kv ) + self.bonus_attack_damage_percent = kv.bonus_attack_damage_percent +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_dragon:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_dragon:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if szAbilityName ~= "item_dragon_potion" then + return 0 + end + + if szSpecialValueName == "bonus_attack_damage" then + --print( 'modifier_blessing_potion_dragon:GetModifierOverrideAbilitySpecial - looking for ' .. szSpecialValueName ) + return 1 + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_dragon:GetModifierOverrideAbilitySpecialValue( params ) + local szAbilityName = params.ability:GetAbilityName() + if szAbilityName ~= "item_dragon_potion" then + return 0 + end + + local szSpecialValueName = params.ability_special_value + if szSpecialValueName == "bonus_attack_damage" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + --print( 'modifier_blessing_potion_dragon:GetModifierOverrideAbilitySpecialValue - bonus_attack_damage is ' .. flBaseValue .. '. Adding on an additional ' .. self.bonus_attack_damage_percent ) + + return flBaseValue * ( ( 100 + self.bonus_attack_damage_percent ) / 100 ) + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_echo_slam.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_echo_slam.lua new file mode 100755 index 0000000..d7d48cd --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_echo_slam.lua @@ -0,0 +1,62 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_potion_echo_slam = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_echo_slam:OnBlessingCreated( kv ) + self.echo_slam_echo_damage_percent = kv.echo_slam_echo_damage_percent +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_echo_slam:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_echo_slam:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if szAbilityName ~= "item_echo_slam_potion" then + return 0 + end + + if szSpecialValueName == "echo_slam_echo_damage" then + --print( 'modifier_blessing_potion_echo_slam:GetModifierOverrideAbilitySpecial - looking for echo_slam_echo_damage!' ) + return 1 + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_echo_slam:GetModifierOverrideAbilitySpecialValue( params ) + local szAbilityName = params.ability:GetAbilityName() + if szAbilityName ~= "item_echo_slam_potion" then + return 0 + end + + local szSpecialValueName = params.ability_special_value + if szSpecialValueName == "echo_slam_echo_damage" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + --print( 'modifier_blessing_potion_echo_slam:GetModifierOverrideAbilitySpecialValue - echo_slam_echo_damage is ' .. flBaseValue .. '. Adding on an additional ' .. self.echo_slam_echo_damage_percent ) + + return flBaseValue * ( ( 100 + self.echo_slam_echo_damage_percent ) / 100 ) + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_health.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_health.lua new file mode 100755 index 0000000..38b8e0d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_health.lua @@ -0,0 +1,15 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_potion_health = class( modifier_blessing_base ) + +------------------------------------------------------------------------------- + +function modifier_blessing_potion_health:OnBlessingCreated( kv ) + self.hp_restore_pct_bonus = kv.hp_restore_pct_bonus +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_health:GetHealthRestorePercentBonus() + return self.hp_restore_pct_bonus +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_mana.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_mana.lua new file mode 100755 index 0000000..97b1800 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_mana.lua @@ -0,0 +1,15 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_potion_mana = class( modifier_blessing_base ) + +------------------------------------------------------------------------------- + +function modifier_blessing_potion_mana:OnBlessingCreated( kv ) + self.mana_restore_pct_bonus = kv.mana_restore_pct_bonus +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_mana:GetManaRestorePercentBonus() + return self.mana_restore_pct_bonus +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_purification.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_purification.lua new file mode 100755 index 0000000..d9270e8 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_purification.lua @@ -0,0 +1,68 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_potion_purification = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_purification:GetTexture() + return "../items/river_painter4" +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_purification:OnBlessingCreated( kv ) + self.radius_percent = kv.radius_percent +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_purification:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_purification:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if szAbilityName ~= "item_purification_potion" then + return 0 + end + + if szSpecialValueName == "radius" then + --print( 'modifier_blessing_potion_purification:GetModifierOverrideAbilitySpecial - looking for radius!' ) + return 1 + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_purification:GetModifierOverrideAbilitySpecialValue( params ) + local szAbilityName = params.ability:GetAbilityName() + if szAbilityName ~= "item_purification_potion" then + return 0 + end + + local szSpecialValueName = params.ability_special_value + if szSpecialValueName == "radius" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + --print( 'modifier_blessing_potion_purification:GetModifierOverrideAbilitySpecialValue - radius is ' .. flBaseValue .. '. Adding on an additional ' .. self.radius_percent ) + + return flBaseValue * ( ( 100 + self.radius_percent ) / 100 ) + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_ravage.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_ravage.lua new file mode 100755 index 0000000..8b1703a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_ravage.lua @@ -0,0 +1,68 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_potion_ravage = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_ravage:GetTexture() + return "../items/river_painter4" +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_ravage:OnBlessingCreated( kv ) + self.duration_percent = kv.duration_percent +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_ravage:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_ravage:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if szAbilityName ~= "item_ravage_potion" then + return 0 + end + + if szSpecialValueName == "duration" then + --print( 'modifier_blessing_potion_ravage:GetModifierOverrideAbilitySpecial - looking for duration!' ) + return 1 + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_ravage:GetModifierOverrideAbilitySpecialValue( params ) + local szAbilityName = params.ability:GetAbilityName() + if szAbilityName ~= "item_ravage_potion" then + return 0 + end + + local szSpecialValueName = params.ability_special_value + if szSpecialValueName == "duration" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + --print( 'modifier_blessing_potion_ravage:GetModifierOverrideAbilitySpecialValue - duration_percent is ' .. flBaseValue .. '. Adding on an additional ' .. self.duration_percent ) + + return flBaseValue * ( ( 100 + self.duration_percent ) / 100 ) + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_shadow_wave.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_shadow_wave.lua new file mode 100755 index 0000000..355bf68 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_shadow_wave.lua @@ -0,0 +1,62 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_potion_shadow_wave = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_shadow_wave:OnBlessingCreated( kv ) + self.damage_percent = kv.damage_percent +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_shadow_wave:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_shadow_wave:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if szAbilityName ~= "item_shadow_wave_effect_potion" then + return 0 + end + + if szSpecialValueName == "damage" then + --print( 'modifier_blessing_potion_shadow_wave:GetModifierOverrideAbilitySpecial - looking for damage!' ) + return 1 + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_shadow_wave:GetModifierOverrideAbilitySpecialValue( params ) + local szAbilityName = params.ability:GetAbilityName() + if szAbilityName ~= "item_shadow_wave_effect_potion" then + return 0 + end + + local szSpecialValueName = params.ability_special_value + if szSpecialValueName == "damage" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + --print( 'modifier_blessing_potion_shadow_wave:GetModifierOverrideAbilitySpecialValue - damage is ' .. flBaseValue .. '. Adding on an additional ' .. self.damage_percent ) + + return flBaseValue * ( ( 100 + self.damage_percent ) / 100 ) + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_torrent.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_torrent.lua new file mode 100755 index 0000000..4fbb5d2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_potion_torrent.lua @@ -0,0 +1,62 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_potion_torrent = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_torrent:OnBlessingCreated( kv ) + self.torrent_damage_percent = kv.torrent_damage_percent +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_potion_torrent:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_torrent:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if szAbilityName ~= "item_torrent_effect_potion" then + return 0 + end + + if szSpecialValueName == "torrent_damage" then + --print( 'modifier_blessing_potion_torrent:GetModifierOverrideAbilitySpecial - looking for torrent_damage!' ) + return 1 + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_potion_torrent:GetModifierOverrideAbilitySpecialValue( params ) + local szAbilityName = params.ability:GetAbilityName() + if szAbilityName ~= "item_torrent_effect_potion" then + return 0 + end + + local szSpecialValueName = params.ability_special_value + if szSpecialValueName == "torrent_damage" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + --print( 'modifier_blessing_potion_torrent:GetModifierOverrideAbilitySpecialValue - torrent_damage is ' .. flBaseValue .. '. Adding on an additional ' .. self.torrent_damage_percent ) + + return flBaseValue * ( ( 100 + self.torrent_damage_percent ) / 100 ) + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_refresher_shard.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_refresher_shard.lua new file mode 100755 index 0000000..319ed35 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_refresher_shard.lua @@ -0,0 +1,68 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_refresher_shard = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_refresher_shard:GetTexture() + return "../items/river_painter4" +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_refresher_shard:OnBlessingCreated( kv ) + self.health_restore_percent = kv.health_restore_percent +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_refresher_shard:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_blessing_refresher_shard:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if szAbilityName ~= "item_aghsfort_refresher_shard" then + return 0 + end + + if szSpecialValueName == "health_restore_percent" then + print( 'modifier_blessing_refresher_shard:GetModifierOverrideAbilitySpecial - looking for health_restore_percent!' ) + return 1 + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_blessing_refresher_shard:GetModifierOverrideAbilitySpecialValue( params ) + local szAbilityName = params.ability:GetAbilityName() + if szAbilityName ~= "item_aghsfort_refresher_shard" then + return 0 + end + + local szSpecialValueName = params.ability_special_value + if szSpecialValueName == "health_restore_percent" then + local nSpecialLevel = params.ability_special_level + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + print( 'modifier_blessing_refresher_shard:GetModifierOverrideAbilitySpecialValue - health_restore_percent is ' .. flBaseValue .. '. Adding on an additional ' .. self.health_restore_percent ) + + return flBaseValue + self.health_restore_percent + end + + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_respawn_invulnerability.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_respawn_invulnerability.lua new file mode 100755 index 0000000..4cb93b0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_respawn_invulnerability.lua @@ -0,0 +1,11 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_respawn_invulnerability = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_respawn_invulnerability:OnBlessingCreated( kv ) + self.respawn_invulnerability_time_bonus = kv.respawn_invulnerability_time_bonus + self.min_move_speed = kv.min_move_speed + self.bonus_attack_speed = kv.bonus_attack_speed +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_respawn_time_reduction.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_respawn_time_reduction.lua new file mode 100755 index 0000000..6cdb8ff --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_respawn_time_reduction.lua @@ -0,0 +1,39 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_respawn_time_reduction = class( modifier_blessing_base ) + +-------------------------------------------------------------------------------- + +function modifier_blessing_respawn_time_reduction:OnBlessingCreated( kv ) + self.respawn_time_reduction = kv.respawn_time_reduction +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_respawn_time_reduction:GetRespawnTimeReduction() + return self.respawn_time_reduction +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_respawn_time_reduction:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_RESPAWNTIME_PERCENTAGE, + MODIFIER_PROPERTY_TOOLTIP, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_respawn_time_reduction:GetModifierPercentageRespawnTime( params ) + return self.respawn_time_reduction +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_respawn_time_reduction:OnTooltip( params ) + local nRespawnReduction = ( self.respawn_time_reduction * 100.0 ) + return nRespawnReduction +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_restore_mana.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_restore_mana.lua new file mode 100755 index 0000000..a0ca2ee --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_restore_mana.lua @@ -0,0 +1,49 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_restore_mana = class( modifier_blessing_base ) + +------------------------------------------------------------------------------- + +function modifier_blessing_restore_mana:GetTexture() + return "../items/lifesteal" +end + +------------------------------------------------------------------------------- + +function modifier_blessing_restore_mana:OnBlessingCreated( kv ) + self.mana_on_kill = kv.mana_on_kill +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_restore_mana:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_DEATH, + MODIFIER_PROPERTY_TOOLTIP, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_restore_mana:OnDeath( params ) + if IsServer() then + if self:GetParent():PassivesDisabled() then + return 1 + end + + if params.unit ~= nil and params.attacker ~= nil and params.attacker == self:GetParent() then + self:GetParent():GiveMana( self.mana_on_kill ) + + local nFXIndex = ParticleManager:CreateParticle( "particles/items3_fx/mango_active.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_restore_mana:OnTooltip( params ) + return self.mana_on_kill +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_spell_life_steal.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_spell_life_steal.lua new file mode 100755 index 0000000..9cbd1d1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_spell_life_steal.lua @@ -0,0 +1,63 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_spell_life_steal = class( modifier_blessing_base ) + +------------------------------------------------------------------------------- + +function modifier_blessing_spell_life_steal:GetTexture() + return "../items/satanic" +end + +------------------------------------------------------------------------------- + +function modifier_blessing_spell_life_steal:OnBlessingCreated( kv ) + self.spell_lifesteal_pct = kv.spell_life_steal +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_spell_life_steal:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + MODIFIER_PROPERTY_TOOLTIP, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_spell_life_steal:OnTakeDamage( params ) + if IsServer() then + local Attacker = params.attacker + local Target = params.unit + local Ability = params.inflictor + local flDamage = params.damage + + if Attacker ~= self:GetParent() or Ability == nil or Target == nil then + return 0 + end + + if bit.band( params.damage_flags, DOTA_DAMAGE_FLAG_REFLECTION ) == DOTA_DAMAGE_FLAG_REFLECTION then + return 0 + end + if bit.band( params.damage_flags, DOTA_DAMAGE_FLAG_NO_SPELL_LIFESTEAL ) == DOTA_DAMAGE_FLAG_NO_SPELL_LIFESTEAL then + return 0 + end + + local nFXIndex = ParticleManager:CreateParticle( "particles/items3_fx/octarine_core_lifesteal.vpcf", PATTACH_ABSORIGIN_FOLLOW, Attacker ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local flLifesteal = flDamage * self.spell_lifesteal_pct / 100 + --print( 'modifier_blessing_spell_life_steal healing for ' .. flLifesteal ) + Attacker:Heal( flLifesteal, self:GetAbility() ) + end + + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_spell_life_steal:OnTooltip( params ) + return self.spell_lifesteal_pct +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_strength.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_strength.lua new file mode 100755 index 0000000..73bbfda --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_blessing_strength.lua @@ -0,0 +1,26 @@ +require( "modifiers/modifier_blessing_base" ) + +modifier_blessing_strength = class( modifier_blessing_base ) + +---------------------------------------- + +function modifier_blessing_strength:OnBlessingCreated( kv ) + self.bonus_strength = kv.str_bonus + --print ( "Strength Bonus = " .. self.bonus_strength ) +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_strength:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_blessing_strength:GetModifierBonusStats_Strength( params ) + return self.bonus_strength +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_bonus_room_start.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_bonus_room_start.lua new file mode 100755 index 0000000..2adddfb --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_bonus_room_start.lua @@ -0,0 +1,58 @@ +modifier_bonus_room_start = class({}) + +-------------------------------------------------------------------------------- + +function modifier_bonus_room_start:IsHidden() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_bonus_room_start:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_bonus_room_start:GetTexture() + return "buyback" +end + +-- ----------------------------------------------------------------------------------------- + +-- function modifier_bonus_room_start:ShouldUseOverheadOffset() +-- return true +-- end + +-- ----------------------------------------------------------------------------------------- + +-- function modifier_bonus_room_start:GetEffectAttachType() +-- return PATTACH_OVERHEAD_FOLLOW +-- end + +-- ----------------------------------------------------------------------------------------- + +-- function modifier_bonus_room_start:GetEffectName() +-- return "particles/generic_gameplay/generic_silenced.vpcf" +-- end + +-------------------------------------------------------------------------------- + +function modifier_bonus_room_start:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10001 +end + +-------------------------------------------------------------------------------- + +function modifier_bonus_room_start:CheckState() + local state = {} + + if IsServer() then + state[MODIFIER_STATE_SILENCED] = true + state[MODIFIER_STATE_MUTED] = true + end + + return state +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_boss_intro.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_boss_intro.lua new file mode 100755 index 0000000..df9460d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_boss_intro.lua @@ -0,0 +1,33 @@ +modifier_boss_intro = class({}) + +-------------------------------------------------------------------------------- + +function modifier_boss_intro:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_boss_intro:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_boss_intro:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10001 +end + +-------------------------------------------------------------------------------- + +function modifier_boss_intro:CheckState() + local state = + { + [MODIFIER_STATE_STUNNED] = true, + [MODIFIER_STATE_INVULNERABLE] = true, + } + + return state +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_breakable_container.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_breakable_container.lua new file mode 100755 index 0000000..c7c8b4b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_breakable_container.lua @@ -0,0 +1,81 @@ + +modifier_breakable_container = class({}) + +-------------------------------------------------------------------------------- + +function modifier_breakable_container:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_breakable_container:CanParentBeAutoAttacked() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_breakable_container:OnCreated( kv ) + if IsServer() then + if self:GetParent():GetUnitName() == "npc_dota_crate" then + self:GetParent():SetModelScale( RandomFloat( 0.6, 0.9 ) ) + elseif self:GetParent():GetUnitName() == "npc_dota_vase" then + self:GetParent():SetModelScale( RandomFloat( 0.4, 0.6 ) ) + end + --self:GetParent():AddNewModifier( nil, nil, "modifier_aghsfort_disable_aggro", { duration = -1 } ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_breakable_container:CheckState() + local state = {} + if IsServer() then + state[MODIFIER_STATE_ROOTED] = true + state[MODIFIER_STATE_NO_HEALTH_BAR] = true + state[MODIFIER_STATE_BLIND] = true + state[MODIFIER_STATE_NOT_ON_MINIMAP] = true + state[MODIFIER_STATE_LOW_ATTACK_PRIORITY] = true + end + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_breakable_container:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_DEATH, + MODIFIER_PROPERTY_PROVIDES_FOW_POSITION, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_breakable_container:GetModifierProvidesFOWVision( params ) + return 1 +end + +----------------------------------------------------------------------- + +function modifier_breakable_container:OnDeath( params ) + if IsServer() then + if ( params.unit == self:GetParent() ) then + --print( string.format( "Breakable container \"%s\" destroyed by \"%s\"", self:GetParent():GetUnitName() or "Unknown Attacker", self.hAttacker:GetUnitName() ) ) + if self:GetParent():GetUnitName() == "npc_dota_crate" then + if RandomInt( 0, 1 ) >= 1 then + EmitSoundOn( "Dungeon.SmashCrateShort", self:GetParent() ) + else + EmitSoundOn( "Dungeon.SmashCrateLong", self:GetParent() ) + end + elseif self:GetParent():GetUnitName() == "npc_dota_vase" then + EmitSoundOn( "Dungeon.VaseBreak", self:GetParent() ) + end + GameRules.Aghanim:ChooseBreakableSurprise( params.attacker, self:GetParent() ) + end + end +end + +----------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_creature_bonus_chicken.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_creature_bonus_chicken.lua new file mode 100755 index 0000000..b418a91 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_creature_bonus_chicken.lua @@ -0,0 +1,192 @@ +modifier_creature_bonus_chicken = class({}) + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_chicken:IsPurgable() + return false; +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_chicken:IsHidden() + return true; +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_chicken:OnCreated( kv ) + self.total_gold = self:GetAbility():GetSpecialValueFor( "total_gold" ) + self.time_limit = self:GetAbility():GetSpecialValueFor( "time_limit" ) + self.gold_bag_duration = self:GetAbility():GetSpecialValueFor( "gold_bag_duration" ) + if IsServer() then + self.flAccumDamage = 0 + self.nBagsDropped = 0 + self.bTeleporting = false + self.vCenter = GameRules.Aghanim:GetCurrentRoom():GetOrigin() + RandomVector( RandomFloat( 0, 500 ) ) + ExecuteOrderFromTable({ + UnitIndex = self:GetParent():entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.vCenter + }) + + self.flExpireTime = GameRules:GetGameTime() + self.time_limit + self:StartIntervalThink( 3.0 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_chicken:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE, + MODIFIER_PROPERTY_MIN_HEALTH, + MODIFIER_EVENT_ON_TELEPORTED, + } + + return funcs +end + +function modifier_creature_bonus_chicken:OnIntervalThink() + if not IsServer() then + return + end + + if self.bTeleporting == true then + return + end + + if GameRules:GetGameTime() > self.flExpireTime then + self:TeleportOut() + return + end + + ExecuteOrderFromTable({ + UnitIndex = self:GetParent():entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = FindPathablePositionNearby( self.vCenter, 500, 2500 ) + }) + +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_chicken:OnTakeDamage( params ) + if IsServer() then + local hUnit = params.unit + local hAttacker = params.attacker + if hAttacker == nil or hAttacker:IsBuilding() then + return 0 + end + if hUnit == self:GetParent() then + local flDamage = params.damage + if flDamage <= 0 then + return + end + self.flAccumDamage = self.flAccumDamage + flDamage + if self.flAccumDamage >= 100 then + local newItem = CreateItem( "item_bag_of_gold", nil, nil ) + local nGoldAmount = 20 + newItem:SetPurchaseTime( 0 ) + newItem:SetCurrentCharges( nGoldAmount ) + + local drop = CreateItemOnPositionSync( hUnit:GetAbsOrigin(), newItem ) + local dropTarget = FindPathablePositionNearby( hUnit:GetAbsOrigin(), 50, 250 ) + newItem:LaunchLoot( true, 300, 0.75, dropTarget ) + newItem:SetLifeTime( self.gold_bag_duration ) + + self.flAccumDamage = self.flAccumDamage - 100 + self.nBagsDropped = self.nBagsDropped + 1 + self.total_gold = self.total_gold - 20 + if self.total_gold <= 0 then + self:TeleportOut() + end + end + end + end + + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_chicken:TeleportOut() + local tower = Entities:FindByName( nil, "bonus_chicken_tp_target" ) + if tower == nil then + self:GetParent():ForceKill( false ) + return + end + + for i = 0, DOTA_ITEM_MAX - 1 do + local item = self:GetParent():GetItemInSlot( i ) + if item then + if item:GetAbilityName() == "item_travel_boots" then + ExecuteOrderFromTable({ + UnitIndex = self:GetParent():entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + AbilityIndex = item:entindex(), + TargetIndex = tower:entindex() + }) + self.bTeleporting = true + return + end + end + end + + FindClearSpaceForUnit( self:GetParent(), tower:GetOrigin(), true ) + self:GetParent():ForceKill( false ) + +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_chicken:OnTeleported( params ) + if IsServer() then + if params.unit == self:GetParent() then + self:GetParent():ForceKill( false ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_chicken:GetModifierMoveSpeed_Absolute( params ) + if IsServer() then + return 500 + ( self.nBagsDropped * 10 ) + end + return 500 +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_chicken:GetMinHealth( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_chicken:CheckState() + local state = {} + if IsServer() then + state = + { + [MODIFIER_STATE_STUNNED] = false, + [MODIFIER_STATE_ROOTED] = false, + } + if GameRules:GetGameTime() > self.flExpireTime or self.total_gold <= 0 then + state[MODIFIER_STATE_MAGIC_IMMUNE] = true + state[MODIFIER_STATE_INVULNERABLE] = true + state[MODIFIER_STATE_OUT_OF_GAME] = true + end + end + + return state +end + + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_chicken:GetPriority() + return MODIFIER_PRIORITY_SUPER_ULTRA +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_creature_bonus_greevil.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_creature_bonus_greevil.lua new file mode 100755 index 0000000..ebead2d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_creature_bonus_greevil.lua @@ -0,0 +1,192 @@ +modifier_creature_bonus_greevil = class({}) + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_greevil:IsPurgable() + return false; +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_greevil:IsHidden() + return true; +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_greevil:OnCreated( kv ) + self.total_gold = self:GetAbility():GetSpecialValueFor( "total_gold" ) + self.time_limit = self:GetAbility():GetSpecialValueFor( "time_limit" ) + self.gold_bag_duration = self:GetAbility():GetSpecialValueFor( "gold_bag_duration" ) + if IsServer() then + self.flAccumDamage = 0 + self.nBagsDropped = 0 + self.bTeleporting = false + self.vCenter = GameRules.Aghanim:GetCurrentRoom():GetOrigin() + RandomVector( RandomFloat( 0, 500 ) ) + ExecuteOrderFromTable({ + UnitIndex = self:GetParent():entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = self.vCenter + }) + + self.flExpireTime = GameRules:GetGameTime() + self.time_limit + self:StartIntervalThink( 3.0 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_greevil:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE, + MODIFIER_PROPERTY_MIN_HEALTH, + MODIFIER_EVENT_ON_TELEPORTED, + } + + return funcs +end + +function modifier_creature_bonus_greevil:OnIntervalThink() + if not IsServer() then + return + end + + if self.bTeleporting == true then + return + end + + if GameRules:GetGameTime() > self.flExpireTime then + self:TeleportOut() + return + end + + ExecuteOrderFromTable({ + UnitIndex = self:GetParent():entindex(), + OrderType = DOTA_UNIT_ORDER_MOVE_TO_POSITION, + Position = FindPathablePositionNearby( self.vCenter, 500, 2500 ) + }) + +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_greevil:OnTakeDamage( params ) + if IsServer() then + local hUnit = params.unit + local hAttacker = params.attacker + if hAttacker == nil or hAttacker:IsBuilding() then + return 0 + end + if hUnit == self:GetParent() then + local flDamage = params.damage + if flDamage <= 0 then + return + end + self.flAccumDamage = self.flAccumDamage + flDamage + if self.flAccumDamage >= 100 then + local newItem = CreateItem( "item_bag_of_gold", nil, nil ) + local nGoldAmount = 50 + newItem:SetPurchaseTime( 0 ) + newItem:SetCurrentCharges( nGoldAmount ) + + local drop = CreateItemOnPositionSync( hUnit:GetAbsOrigin(), newItem ) + local dropTarget = FindPathablePositionNearby( hUnit:GetAbsOrigin(), 50, 250 ) + newItem:LaunchLoot( true, 300, 0.75, dropTarget ) + newItem:SetLifeTime( self.gold_bag_duration ) + + self.flAccumDamage = self.flAccumDamage - 100 + self.nBagsDropped = self.nBagsDropped + 1 + self.total_gold = self.total_gold - 20 + if self.total_gold <= 0 then + self:TeleportOut() + end + end + end + end + + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_greevil:TeleportOut() + local tower = Entities:FindByName( nil, "bonus_chicken_tp_target" ) + if tower == nil then + self:GetParent():ForceKill( false ) + return + end + + for i = 0, DOTA_ITEM_MAX - 1 do + local item = self:GetParent():GetItemInSlot( i ) + if item then + if item:GetAbilityName() == "item_travel_boots" then + ExecuteOrderFromTable({ + UnitIndex = self:GetParent():entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_TARGET, + AbilityIndex = item:entindex(), + TargetIndex = tower:entindex() + }) + self.bTeleporting = true + return + end + end + end + + FindClearSpaceForUnit( self:GetParent(), tower:GetOrigin(), true ) + self:GetParent():ForceKill( false ) + +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_greevil:OnTeleported( params ) + if IsServer() then + if params.unit == self:GetParent() then + self:GetParent():ForceKill( false ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_greevil:GetModifierMoveSpeed_Absolute( params ) + if IsServer() then + return 500 + ( self.nBagsDropped * 10 ) + end + return 500 +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_greevil:GetMinHealth( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_greevil:CheckState() + local state = {} + if IsServer() then + state = + { + [MODIFIER_STATE_STUNNED] = false, + [MODIFIER_STATE_ROOTED] = false, + } + if GameRules:GetGameTime() > self.flExpireTime or self.total_gold <= 0 then + state[MODIFIER_STATE_MAGIC_IMMUNE] = true + state[MODIFIER_STATE_INVULNERABLE] = true + state[MODIFIER_STATE_OUT_OF_GAME] = true + end + end + + return state +end + + +-------------------------------------------------------------------------------- + +function modifier_creature_bonus_greevil:GetPriority() + return MODIFIER_PRIORITY_SUPER_ULTRA +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_detect_invisible.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_detect_invisible.lua new file mode 100755 index 0000000..cd63ae3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_detect_invisible.lua @@ -0,0 +1,70 @@ +modifier_detect_invisible = class({}) + +-------------------------------------------------------------------------------- + +function modifier_detect_invisible:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_detect_invisible:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_detect_invisible:OnCreated( kv ) + self.flRadius = 900 + if IsServer() then + EmitSoundOn( "Item.DropGemWorld", self:GetParent() ) + end +end + +----------------------------------------------------------------------- + +function modifier_detect_invisible:GetEffectName() + return "particles/creature_true_sight.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_detect_invisible:GetEffectAttachType() + return PATTACH_OVERHEAD_FOLLOW +end + +---------------------------------------- + +function modifier_detect_invisible:IsAura() + return true +end + +---------------------------------------- + +function modifier_detect_invisible:GetModifierAura() + return "modifier_truesight" +end + +---------------------------------------- + +function modifier_detect_invisible:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_ENEMY +end + +---------------------------------------- + +function modifier_detect_invisible:GetAuraSearchType() + return DOTA_UNIT_TARGET_ALL +end + +-------------------------------------------------------------------------------- + +function modifier_detect_invisible:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_INVULNERABLE +end + +---------------------------------------- + +function modifier_detect_invisible:GetAuraRadius() + return self.flRadius +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_fake_treasure_chest.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_fake_treasure_chest.lua new file mode 100755 index 0000000..3c8ceff --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_fake_treasure_chest.lua @@ -0,0 +1,119 @@ + +modifier_fake_treasure_chest = class({}) + +-------------------------------------------------------------------------------- + +function modifier_fake_treasure_chest:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_fake_treasure_chest:OnCreated( kv ) + if IsServer() then + self:StartIntervalThink( 0.5 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_fake_treasure_chest:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_ORDER, + MODIFIER_PROPERTY_FIXED_DAY_VISION, + MODIFIER_PROPERTY_FIXED_NIGHT_VISION, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_fake_treasure_chest:OnOrder( params ) + if IsServer() then + local hOrderedUnit = params.unit + local hTargetUnit = params.target + local nOrderType = params.order_type + if nOrderType ~= DOTA_UNIT_ORDER_MOVE_TO_TARGET then + return + end + + if hTargetUnit == nil or hTargetUnit ~= self:GetParent() then + return + end + + if hOrderedUnit ~= nil and hOrderedUnit:IsRealHero() and hOrderedUnit:GetTeamNumber() == DOTA_TEAM_GOODGUYS then + self.hPlayerEnt = hOrderedUnit + self:StartIntervalThink( 0.25 ) + return + end + + self:StartIntervalThink( -1 ) + end + + return 0 +end + + +----------------------------------------------------------------------- + +function modifier_fake_treasure_chest:OnIntervalThink() + if IsServer() then + if self.hPlayerEnt ~= nil then + local flOpenDistance = 250.0 + if flOpenDistance >= ( self.hPlayerEnt:GetOrigin() - self:GetParent():GetOrigin() ):Length2D() then + if GameRules.Dungeon ~= nil then + self.hPlayerEnt:Interrupt() + --GameRules.Dungeon:OnTreasureOpen( self.hPlayerEnt, self:GetParent() ) + self.hPlayerEnt = nil + + -- Gain Living Treasure modifier + --self:GetParent():AddNewModifier( nil, self:GetAbility(), "modifier_living_treasure", { duration = -1 } ) + + -- Lose Fake Treasure modifier + self:Destroy() + + return -1 + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_fake_treasure_chest:GetFixedDayVision( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_fake_treasure_chest:GetFixedNightVision( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_fake_treasure_chest:CheckState() + local state = {} + if IsServer() then + state[MODIFIER_STATE_ATTACK_IMMUNE] = true + state[MODIFIER_STATE_ROOTED] = true + state[MODIFIER_STATE_NO_HEALTH_BAR] = true + state[MODIFIER_STATE_BLIND] = true + state[MODIFIER_STATE_NOT_ON_MINIMAP] = true + state[MODIFIER_STATE_INVULNERABLE] = true + end + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_fake_treasure_chest:OnDestroy() + if IsServer() then + self:GetParent():AddAbility( "living_treasure" ) + end +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_ambient_sorcery.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_ambient_sorcery.lua new file mode 100755 index 0000000..ed14e27 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_ambient_sorcery.lua @@ -0,0 +1,70 @@ + +modifier_item_ambient_sorcery = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_ambient_sorcery:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_ambient_sorcery:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_ambient_sorcery:IsAura() + return true +end + +---------------------------------------- + +function modifier_item_ambient_sorcery:GetModifierAura() + return "modifier_item_ambient_sorcery_effect" +end + +---------------------------------------- + +function modifier_item_ambient_sorcery:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_ENEMY +end + +---------------------------------------- + +function modifier_item_ambient_sorcery:GetAuraSearchType() + return DOTA_UNIT_TARGET_ALL +end + +---------------------------------------- + +function modifier_item_ambient_sorcery:GetAuraRadius() + return self.radius +end + +---------------------------------------- + +function modifier_item_ambient_sorcery:OnCreated( kv ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.bonus_intelligence = self:GetAbility():GetSpecialValueFor( "bonus_intelligence" ) +end + +---------------------------------------- + +function modifier_item_ambient_sorcery:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + } + + return funcs +end + +---------------------------------------- + +function modifier_item_ambient_sorcery:GetModifierBonusStats_Intellect( params ) + return self.bonus_intelligence +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_ambient_sorcery_effect.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_ambient_sorcery_effect.lua new file mode 100755 index 0000000..e1c9bb6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_ambient_sorcery_effect.lua @@ -0,0 +1,34 @@ + +modifier_item_ambient_sorcery_effect = class({}) + +---------------------------------------- + +function modifier_item_ambient_sorcery_effect:GetTexture() + return "item_ambient_sorcery" +end + +---------------------------------------- + +function modifier_item_ambient_sorcery_effect:OnCreated( kv ) + self.aura_magic_reduction = self:GetAbility():GetSpecialValueFor( "aura_magic_reduction" ) +end + +---------------------------------------- + +function modifier_item_ambient_sorcery_effect:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS, + } + + return funcs +end + +---------------------------------------- + +function modifier_item_ambient_sorcery_effect:GetModifierMagicalResistanceBonus( params ) + return self.aura_magic_reduction +end + +---------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_amorphotic_shell.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_amorphotic_shell.lua new file mode 100755 index 0000000..8b3c390 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_amorphotic_shell.lua @@ -0,0 +1,83 @@ +modifier_item_amorphotic_shell = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_amorphotic_shell:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_amorphotic_shell:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_amorphotic_shell:OnCreated( kv ) + self.amoeba_duration = self:GetAbility():GetSpecialValueFor( "amoeba_duration" ) + self.amoeba_chance = self:GetAbility():GetSpecialValueFor( "amoeba_chance" ) + self.bonus_strength = self:GetAbility():GetSpecialValueFor( "bonus_strength" ) + self.bonus_intelligence = self:GetAbility():GetSpecialValueFor( "bonus_intelligence" ) + self.bonus_agility = self:GetAbility():GetSpecialValueFor( "bonus_agility" ) +end + +---------------------------------------- + +function modifier_item_amorphotic_shell:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_TAKEDAMAGE, + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_STATS_AGILITY_BONUS, + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + } + return funcs +end + +---------------------------------------- + +function modifier_item_amorphotic_shell:OnTakeDamage( params ) + if IsServer() then + if params.unit == self:GetParent() then + if params.damage > 25 and RollPercentage( self.amoeba_chance ) then + local vSpawnPos = self:GetParent():GetOrigin() + RandomVector( 75 ) + local nFXCastIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_alchemist/alchemist_acid_spray_cast.vpcf", PATTACH_CUSTOMORIGIN, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXCastIndex, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_attack1", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( nFXCastIndex, 1, vSpawnPos ) + ParticleManager:ReleaseParticleIndex( nFXCastIndex ) + + local hAmoeba = CreateUnitByName( "npc_dota_creature_pet_amoeba", vSpawnPos, true, self:GetParent(), self:GetParent(), self:GetParent():GetTeamNumber() ) + if hAmoeba ~= nil then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_batrider/batrider_stickynapalm_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, vSpawnPos ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( 150, 150, 150 ) ) + ParticleManager:SetParticleControlEnt( nFXIndex, 2, hAmoeba, PATTACH_POINT_FOLLOW, "attach_hitloc", hAmoeba:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + hAmoeba:AddNewModifier( self:GetParent(), self, "modifier_kill", { duration = self.amoeba_duration } ) + end + end + end + return 0 +end + + +---------------------------------------- + +function modifier_item_amorphotic_shell:GetModifierBonusStats_Strength( params ) + return self.bonus_strength +end + +---------------------------------------- + +function modifier_item_amorphotic_shell:GetModifierBonusStats_Agility( params ) + return self.bonus_agility +end + +---------------------------------------- + +function modifier_item_amorphotic_shell:GetModifierBonusStats_Intellect( params ) + return self.bonus_intelligence +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bear_cloak.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bear_cloak.lua new file mode 100755 index 0000000..bbb557f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bear_cloak.lua @@ -0,0 +1,72 @@ + +modifier_item_bear_cloak = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_bear_cloak:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_bear_cloak:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_bear_cloak:OnCreated( kv ) + self.bonus_magic_resist = self:GetAbility():GetSpecialValueFor( "bonus_magic_resist" ) + self.aura_radius = self:GetAbility():GetSpecialValueFor( "aura_radius" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_bear_cloak:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_bear_cloak:GetModifierAura() + return "modifier_item_bear_cloak_effect" +end + +-------------------------------------------------------------------------------- + +function modifier_item_bear_cloak:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_FRIENDLY +end + +-------------------------------------------------------------------------------- + +function modifier_item_bear_cloak:GetAuraSearchType() + return DOTA_UNIT_TARGET_ALL +end + +-------------------------------------------------------------------------------- + +function modifier_item_bear_cloak:GetAuraRadius() + return self.aura_radius +end + +-------------------------------------------------------------------------------- + +function modifier_item_bear_cloak:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_bear_cloak:GetModifierMagicalResistanceBonus( params ) + return self.bonus_magic_resist +end + +-------------------------------------------------------------------------------- + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bear_cloak_effect.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bear_cloak_effect.lua new file mode 100755 index 0000000..180afe1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bear_cloak_effect.lua @@ -0,0 +1,41 @@ + +modifier_item_bear_cloak_effect = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_bear_cloak_effect:GetTexture() + return "item_bear_cloak" +end + +------------------------------------------------------------------------------ + +function modifier_item_bear_cloak_effect:IsPurgable() + return false +end + +------------------------------------------------------------------------------ + +function modifier_item_bear_cloak_effect:OnCreated( kv ) + self.aura_bonus_magic_resist = self:GetAbility():GetSpecialValueFor( "aura_bonus_magic_resist" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_bear_cloak_effect:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_bear_cloak_effect:GetModifierMagicalResistanceBonus( params ) + return self.aura_bonus_magic_resist +end + +-------------------------------------------------------------------------------- + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bogduggs_baldric.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bogduggs_baldric.lua new file mode 100755 index 0000000..f19013b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bogduggs_baldric.lua @@ -0,0 +1,64 @@ +modifier_item_bogduggs_baldric = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_baldric:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_baldric:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_baldric:OnCreated( kv ) + self.bonus_armor = self:GetAbility():GetSpecialValueFor( "bonus_armor" ) + self.disable_resist_pct = self:GetAbility():GetSpecialValueFor( "disable_resist_pct" ) + self.move_speed_penalty = self:GetAbility():GetSpecialValueFor( "move_speed_penalty" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_baldric:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_STATE_CHANGED, + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_baldric:GetModifierPhysicalArmorBonus( params ) + return self.bonus_armor +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_baldric:GetModifierMoveSpeedBonus_Constant( params ) + return -self.move_speed_penalty +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_baldric:OnStateChanged( params ) + if IsServer() then + if params.unit == self:GetParent() then + local buffs = self:GetParent():FindAllModifiers() + for _,buff in pairs( buffs ) do + if buff ~= nil and buff:IsStunDebuff() and buff.bBaldricApplied == nil and buff:GetCaster() ~= self:GetParent() then + --print( "Applying Baldric" ) + buff.bBaldricApplied = true + --print( "Old Duration: " .. buff:GetDuration() ) + buff:SetDuration( buff:GetDuration() * self.disable_resist_pct / 100, true ) + --print( "New Duration: " .. buff:GetDuration() ) + end + end + end + end +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bogduggs_cudgel.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bogduggs_cudgel.lua new file mode 100755 index 0000000..40a9f48 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bogduggs_cudgel.lua @@ -0,0 +1,135 @@ +modifier_item_bogduggs_cudgel = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_cudgel:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_cudgel:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_cudgel:GetPriority() + return MODIFIER_PRIORITY_SUPER_ULTRA +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_cudgel:OnCreated( kv ) + self.base_attack_time_penalty_pct = self:GetAbility():GetSpecialValueFor( "base_attack_time_penalty_pct" ) + self.attack_speed_penalty_pct = self:GetAbility():GetSpecialValueFor( "attack_speed_penalty_pct" ) + self.bonus_strength = self:GetAbility():GetSpecialValueFor( "bonus_strength" ) + self.bonus_damage = self:GetAbility():GetSpecialValueFor( "bonus_damage" ) + self.damage_radius = self:GetAbility():GetSpecialValueFor( "damage_radius" ) + self.stun_duration = self:GetAbility():GetSpecialValueFor( "stun_duration" ) + + if self:GetParent():IsRangedAttacker() then + self.flAttackSpeedReduction = 0 + else + if self.flAttackSpeedReduction == nil then + self.flAttackSpeedReduction = 0 + end + + self.flAttackSpeedReduction = ( ( self:GetParent():GetAttackSpeed() + self.flAttackSpeedReduction ) * self.attack_speed_penalty_pct ) / 100 + end +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_cudgel:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + MODIFIER_EVENT_ON_ATTACK_LANDED, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_cudgel:GetModifierBonusStats_Strength( params ) + return self.bonus_strength +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_cudgel:GetModifierPreAttack_BonusDamage( params ) + return self.bonus_damage +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_cudgel:GetModifierAttackSpeedBonus_Constant( params ) + if self.flAttackSpeedReduction == nil then + return 0 + end + + return -self.flAttackSpeedReduction * 100 +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_cudgel:OnAttackLanded( params ) + if IsServer() then + local Attacker = params.attacker + local Target = params.target + + if Attacker ~= nil and Attacker == self:GetParent() and Attacker:IsRangedAttacker() == false and Target ~= nil then + EmitSoundOn( "OgreTank.GroundSmash.Lesser", Target ) + local nFXIndex = ParticleManager:CreateParticle( "particles/creatures/ogre/ogre_melee_smash.vpcf", PATTACH_WORLDORIGIN, Attacker ) + ParticleManager:SetParticleControl( nFXIndex, 0, Target:GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.damage_radius, self.damage_radius, self.damage_radius ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local enemies = FindUnitsInRadius( Attacker:GetTeamNumber(), Target:GetOrigin(), Attacker, self.damage_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,enemy in pairs( enemies ) do + if enemy ~= nil and enemy:IsInvulnerable() == false then + if enemy ~= Target then + local damageInfo = + { + victim = enemy, + attacker = Attacker, + damage = params.original_damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self:GetAbility(), + } + ApplyDamage( damageInfo ) + end + if enemy:IsAlive() == false then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_phantom_assassin/phantom_assassin_crit_impact.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( nFXIndex, 0, enemy, PATTACH_POINT_FOLLOW, "attach_hitloc", enemy:GetOrigin(), true ) + ParticleManager:SetParticleControl( nFXIndex, 1, enemy:GetOrigin() ) + ParticleManager:SetParticleControlForward( nFXIndex, 1, -Attacker:GetForwardVector() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 10, enemy, PATTACH_ABSORIGIN_FOLLOW, nil, enemy:GetOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "Dungeon.BloodSplatterImpact.Lesser", enemy ) + else + enemy:AddNewModifier( Attacker, self:GetAbility(), "modifier_stunned", { duration = self.stun_duration } ) + end + end + end + end + end + + if self:GetParent():IsRangedAttacker() then + self.flAttackSpeedReduction = 0 + else + if self.flAttackSpeedReduction == nil then + self.flAttackSpeedReduction = 0 + end + + self.flAttackSpeedReduction = ( ( self:GetParent():GetAttackSpeed() + self.flAttackSpeedReduction ) * self.attack_speed_penalty_pct ) / 100 + end + + return 0 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bogduggs_lucky_femur.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bogduggs_lucky_femur.lua new file mode 100755 index 0000000..840cc32 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_bogduggs_lucky_femur.lua @@ -0,0 +1,82 @@ +modifier_item_bogduggs_lucky_femur = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_lucky_femur:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_lucky_femur:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_lucky_femur:OnCreated( kv ) + self.max_mana_penalty = self:GetAbility():GetSpecialValueFor( "max_mana_penalty" ) + self.intelligence_penalty = self:GetAbility():GetSpecialValueFor( "intelligence_penalty" ) + self.mana_regen_sec = self:GetAbility():GetSpecialValueFor( "mana_regen_sec" ) + self.refresh_pct = self:GetAbility():GetSpecialValueFor( "refresh_pct" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_lucky_femur:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + MODIFIER_EVENT_ON_ABILITY_FULLY_CAST, + MODIFIER_PROPERTY_MANA_BONUS, + MODIFIER_PROPERTY_MANA_REGEN_CONSTANT, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_lucky_femur:GetModifierBonusStats_Intellect( params ) + return -self.intelligence_penalty +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_lucky_femur:OnAbilityFullyCast( params ) + if IsServer() then + if params.unit ~= self:GetParent() then + return 0 + end + local Ability = params.ability + if Ability == nil then + return 0 + end + + if self:GetAbility() == nil or self:GetAbility():IsCooldownReady() == false then + return 0 + end + + if Ability:IsRefreshable() and Ability:IsItem() == false and RollPercentage( self.refresh_pct ) then + self:GetAbility():StartCooldown( Ability:GetCooldown( -1 ) ) + + Ability:EndCooldown() + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_ogre_magi/ogre_magi_multicast.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( 1, 2, 1 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + EmitSoundOn( "Bogduggs.LuckyFemur", self:GetParent() ) + end + end + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_lucky_femur:GetModifierManaBonus( params ) + return -self.max_mana_penalty +end + +-------------------------------------------------------------------------------- + +function modifier_item_bogduggs_lucky_femur:GetModifierConstantManaRegen( params ) + return self.mana_regen_sec +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_carapace_of_qaldin.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_carapace_of_qaldin.lua new file mode 100755 index 0000000..19fa25a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_carapace_of_qaldin.lua @@ -0,0 +1,78 @@ +modifier_item_carapace_of_qaldin = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_carapace_of_qaldin:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_carapace_of_qaldin:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_carapace_of_qaldin:OnCreated( kv ) + self.bonus_hp = self:GetAbility():GetSpecialValueFor( "bonus_hp" ) + self.bonus_mana = self:GetAbility():GetSpecialValueFor( "bonus_mana" ) + self.bonus_restore_pct = self:GetAbility():GetSpecialValueFor( "bonus_restore_pct" ) + self.damage_return_pct = self:GetAbility():GetSpecialValueFor( "damage_return_pct" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_carapace_of_qaldin:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_HEALTH_BONUS, + MODIFIER_PROPERTY_MANA_BONUS, + MODIFIER_PROPERTY_HEAL_AMPLIFY_PERCENTAGE, + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_carapace_of_qaldin:GetModifierHealthBonus( params ) + return self.bonus_hp +end + +-------------------------------------------------------------------------------- + +function modifier_item_carapace_of_qaldin:GetModifierManaBonus( params ) + return self.bonus_mana +end + +-------------------------------------------------------------------------------- + +function modifier_item_carapace_of_qaldin:GetModifierHealAmplify_Percentage( params ) + return self.bonus_restore_pct +end + +-------------------------------------------------------------------------------- + +function modifier_item_carapace_of_qaldin:OnTakeDamage( params ) + if IsServer() then + if params.unit ~= self:GetParent() then + return + end + + local Attacker = params.attacker + if Attacker ~= nil and Attacker ~= self:GetParent() and Attacker:GetTeamNumber() ~= self:GetParent():GetTeamNumber() then + local damageInfo = + { + victim = Attacker, + attacker = self:GetParent(), + damage = params.damage * self.damage_return_pct / 100, + damage_type = params.damage_type, + damage_flags = DOTA_DAMAGE_FLAG_REFLECTION + DOTA_DAMAGE_FLAG_NO_SPELL_LIFESTEAL, + ability = self:GetAbility(), + } + ApplyDamage( damageInfo ) + end + end + return 0 +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_corrupting_blade.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_corrupting_blade.lua new file mode 100755 index 0000000..1976bad --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_corrupting_blade.lua @@ -0,0 +1,116 @@ + +modifier_item_corrupting_blade = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_corrupting_blade:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_corrupting_blade:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_corrupting_blade:OnCreated( kv ) + self.bonus_damage = self:GetAbility():GetSpecialValueFor( "bonus_damage" ) + self.corruption_duration = self:GetAbility():GetSpecialValueFor( "corruption_duration" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_corrupting_blade:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, + MODIFIER_EVENT_ON_ATTACK, + MODIFIER_EVENT_ON_ATTACK_LANDED, + --MODIFIER_EVENT_ON_ATTACK_FAIL, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_corrupting_blade:GetModifierPreAttack_BonusDamage( params ) + return self.bonus_damage +end + +-------------------------------------------------------------------------------- + +function modifier_item_corrupting_blade:OnAttack( params ) + if IsServer() then + if self:GetParent() ~= params.attacker then + return 0 + end + + local hTarget = params.target + local hAttacker = params.attacker + + if hTarget == nil or hAttacker == nil then + return 0 + end + + if hAttacker:IsIllusion() then + return 0 + end + + --[[ + CDOTA_AttackRecord *pAttackRecord = GetAttackRecordsManager( )->GetRecordByIndex( params.iRecord ); + pAttackRecord->m_iszAutoAttackRangedParticle = MAKE_STRING( "particles/items_fx/desolator_projectile.vpcf" ); + m_InFlightAttackRecords.AddToTail( pAttackRecord->m_iRecord ); + ]] + end +end + +-------------------------------------------------------------------------------- + +function modifier_item_corrupting_blade:OnAttackLanded( params ) + if IsServer() then + if self:GetParent() ~= params.attacker then + return 0 + end + + local hTarget = params.target + local hAttacker = params.attacker + + if hTarget == nil then + print( "OnAttackLanded - target is nil" ) + end + + if hAttacker == nil then + print( "OnAttackLanded - attacker is nil" ) + end + + if self:GetAbility() == nil then + print( "OnAttackLanded - ability is nil" ) + end + + if hTarget == nil or hAttacker == nil or self:GetAbility() == nil then + return 0 + end + + if hAttacker:IsIllusion() then + return 0 + end + + hTarget:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_item_corrupting_blade_buff", { duration = self.corruption_duration } ) + + EmitSoundOn( "Item_Desolator.Target", hTarget ) + end +end + +-------------------------------------------------------------------------------- + +--[[ +function modifier_item_corrupting_blade:OnAttackFail( params ) + +end +]] + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_corrupting_blade_buff.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_corrupting_blade_buff.lua new file mode 100755 index 0000000..94b63b9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_corrupting_blade_buff.lua @@ -0,0 +1,41 @@ + +modifier_item_corrupting_blade_buff = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_corrupting_blade_buff:GetTexture() + return "item_corrupting_blade" +end + +-------------------------------------------------------------------------------- + +function modifier_item_corrupting_blade_buff:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_corrupting_blade_buff:OnCreated( kv ) + self.corruption_armor = self:GetAbility():GetSpecialValueFor( "corruption_armor" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_corrupting_blade_buff:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + } + + return funcs +end + +-------------------------------------------------------------------------------- + + +function modifier_item_corrupting_blade_buff:GetModifierPhysicalArmorBonus( params ) + return self.corruption_armor +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_creed_of_omniscience.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_creed_of_omniscience.lua new file mode 100755 index 0000000..095d0a9 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_creed_of_omniscience.lua @@ -0,0 +1,35 @@ +modifier_item_creed_of_omniscience = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_creed_of_omniscience:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_creed_of_omniscience:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_creed_of_omniscience:OnCreated( kv ) + self.bonus_xp = self:GetAbility():GetSpecialValueFor( "bonus_xp" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_creed_of_omniscience:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_EXP_RATE_BOOST, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_creed_of_omniscience:GetModifierPercentageExpRateBoost( params ) + return self.bonus_xp +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_double_damage_potion.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_double_damage_potion.lua new file mode 100755 index 0000000..d2925f1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_double_damage_potion.lua @@ -0,0 +1,43 @@ + +modifier_item_double_damage_potion = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_double_damage_potion:GetEffectName() + return "particles/generic_gameplay/rune_doubledamage_owner.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_item_double_damage_potion:GetTexture() + return "rune_doubledamage" +end + +-------------------------------------------------------------------------------- + +function modifier_item_double_damage_potion:OnCreated( kv ) + self.damage_bonus_pct = self:GetAbility():GetSpecialValueFor( "damage_bonus_pct" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_double_damage_potion:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_BASEDAMAGEOUTGOING_PERCENTAGE + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_double_damage_potion:GetModifierBaseDamageOutgoing_Percentage( params ) + if self:GetParent():IsIllusion() then + return 0 + end + + return self.damage_bonus_pct +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_dredged_trident.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_dredged_trident.lua new file mode 100755 index 0000000..05bd89a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_dredged_trident.lua @@ -0,0 +1,80 @@ + +modifier_item_dredged_trident = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_dredged_trident:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_dredged_trident:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_dredged_trident:OnCreated( kv ) + self.bonus_damage = self:GetAbility():GetSpecialValueFor( "bonus_damage" ) + self.crit_chance = self:GetAbility():GetSpecialValueFor( "crit_chance" ) + self.crit_multiplier = self:GetAbility():GetSpecialValueFor( "crit_multiplier" ) + + self.bIsCrit = false +end + +-------------------------------------------------------------------------------- + +function modifier_item_dredged_trident:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, + MODIFIER_PROPERTY_PREATTACK_CRITICALSTRIKE, + MODIFIER_EVENT_ON_ATTACK_LANDED, + } + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_item_dredged_trident:GetModifierPreAttack_BonusDamage( params ) + return self.bonus_damage +end + +-------------------------------------------------------------------------------- + +function modifier_item_dredged_trident:GetModifierPreAttack_CriticalStrike( params ) + if IsServer() then + local hTarget = params.target + local hAttacker = params.attacker + + if hTarget and ( hTarget:IsBuilding() == false ) and ( hTarget:IsOther() == false ) and hAttacker and ( hAttacker:GetTeamNumber() ~= hTarget:GetTeamNumber() ) then + if RandomFloat( 1, 100 ) <= self.crit_chance then -- expose RollPseudoRandomPercentage? + self.bIsCrit = true + return self.crit_multiplier + end + end + end + + return 0.0 +end + +-------------------------------------------------------------------------------- + +function modifier_item_dredged_trident:OnAttackLanded( params ) + if IsServer() then + -- play sounds and stuff + if self:GetParent() == params.attacker then + local hTarget = params.target + if hTarget ~= nil and self.bIsCrit then + EmitSoundOn( "DOTA_Item.Daedelus.Crit", self:GetParent() ) + self.bIsCrit = false + end + end + end + + return 0.0 +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_evasion_potion.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_evasion_potion.lua new file mode 100755 index 0000000..5321a54 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_evasion_potion.lua @@ -0,0 +1,43 @@ + +modifier_item_evasion_potion = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_evasion_potion:GetEffectName() + return "particles/generic_gameplay/evasion_potion_owner.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_item_evasion_potion:GetTexture() + return "evasion_potion" +end + +-------------------------------------------------------------------------------- + +function modifier_item_evasion_potion:OnCreated( kv ) + self.evasion_bonus_pct = self:GetAbility():GetSpecialValueFor( "evasion_bonus_pct" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_evasion_potion:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_EVASION_CONSTANT + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_evasion_potion:GetModifierEvasion_Constant( params ) + if self:GetParent():IsIllusion() then + return 0 + end + + return self.evasion_bonus_pct +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_glimmerdark_shield.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_glimmerdark_shield.lua new file mode 100755 index 0000000..b2361f3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_glimmerdark_shield.lua @@ -0,0 +1,72 @@ + +modifier_item_glimmerdark_shield = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield:OnCreated( kv ) + self.bonus_strength = self:GetAbility():GetSpecialValueFor( "bonus_strength" ) + self.bonus_agility = self:GetAbility():GetSpecialValueFor( "bonus_agility" ) + self.bonus_intellect = self:GetAbility():GetSpecialValueFor( "bonus_intellect" ) + self.bonus_health_regen = self:GetAbility():GetSpecialValueFor( "bonus_health_regen" ) + self.bonus_armor = self:GetAbility():GetSpecialValueFor( "bonus_armor" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_STATS_AGILITY_BONUS, + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT, + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + } + return funcs +end + +-------------------------------------------------------------------------------- + + +function modifier_item_glimmerdark_shield:GetModifierBonusStats_Strength( params ) + return self.bonus_strength +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield:GetModifierBonusStats_Agility( params ) + return self.bonus_agility +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield:GetModifierBonusStats_Intellect( params ) + return self.bonus_intellect +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield:GetModifierConstantHealthRegen( params ) + return self.bonus_health_regen +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield:GetModifierPhysicalArmorBonus( params ) + return self.bonus_armor +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_glimmerdark_shield_prism.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_glimmerdark_shield_prism.lua new file mode 100755 index 0000000..18c8dd7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_glimmerdark_shield_prism.lua @@ -0,0 +1,75 @@ + +modifier_item_glimmerdark_shield_prism = class({}) + +-------------------------------------------------------------------------------- + +--[[ +function modifier_item_glimmerdark_shield_prism:GetEffectName() + return "particles/act_2/gleam.vpcf" +end +]] + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield_prism:GetStatusEffectName() + return "particles/status_fx/status_effect_ghost.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield_prism:GetTexture() + return "item_glimmerdark_shield" +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield_prism:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield_prism:OnCreated( kv ) + self.prism_bonus_magic_dmg = self:GetAbility():GetSpecialValueFor( "prism_bonus_magic_dmg" ) + + if IsServer() then + self.nFXIndex = ParticleManager:CreateParticle( "particles/act_2/gleam.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControlEnt( self.nFXIndex, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetOrigin(), true ) + --ParticleManager:SetParticleControlEnt( self.nFXIndex, 0, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nFXIndex, 3, Vector( 100, 100, 100 ) ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield_prism:OnDestroy() + if IsServer() then + ParticleManager:DestroyParticle( self.nFXIndex, false ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield_prism:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_ABSOLUTE_NO_DAMAGE_PHYSICAL, + MODIFIER_PROPERTY_MAGICAL_RESISTANCE_DECREPIFY_UNIQUE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield_prism:GetAbsoluteNoDamagePhysical( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_item_glimmerdark_shield_prism:GetModifierMagicalResistanceDecrepifyUnique( params ) + return self.prism_bonus_magic_dmg +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_gravel_foot.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_gravel_foot.lua new file mode 100755 index 0000000..9313aef --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_gravel_foot.lua @@ -0,0 +1,75 @@ +modifier_item_gravel_foot = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_gravel_foot:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_gravel_foot:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_gravel_foot:OnCreated( kv ) + self.bonus_movement_speed = self:GetAbility():GetSpecialValueFor( "bonus_movement_speed" ) + self.damage_block = self:GetAbility():GetSpecialValueFor( "damage_block" ) + self.bonus_all_stats = self:GetAbility():GetSpecialValueFor( "bonus_all_stats" ) + self.bonus_hp_regen = self:GetAbility():GetSpecialValueFor( "bonus_hp_regen" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_gravel_foot:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_BONUS_UNIQUE, + MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT, + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_STATS_AGILITY_BONUS, + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + MODIFIER_PROPERTY_TOTAL_CONSTANT_BLOCK, + } + return funcs +end + +---------------------------------------- + +function modifier_item_gravel_foot:GetModifierMoveSpeedBonus_Special_Boots( params ) + return self.bonus_movement_speed +end + +---------------------------------------- + +function modifier_item_gravel_foot:GetModifierBonusStats_Strength( params ) + return self.bonus_all_stats +end + +---------------------------------------- + +function modifier_item_gravel_foot:GetModifierBonusStats_Agility( params ) + return self.bonus_all_stats +end + +---------------------------------------- + +function modifier_item_gravel_foot:GetModifierBonusStats_Intellect( params ) + return self.bonus_all_stats +end + +-------------------------------------------------------------------------------- + +function modifier_item_gravel_foot:GetModifierConstantHealthRegen( params ) + return self.bonus_hp_regen +end + +-------------------------------------------------------------------------------- + +function modifier_item_gravel_foot:GetModifierTotal_ConstantBlock( params ) + return self.damage_block +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_guardian_shell.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_guardian_shell.lua new file mode 100755 index 0000000..31c6174 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_guardian_shell.lua @@ -0,0 +1,62 @@ +modifier_item_guardian_shell = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_guardian_shell:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_guardian_shell:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_guardian_shell:CheckState() + local state = + { + [MODIFIER_STATE_ROOTED] = false, + [MODIFIER_STATE_UNSLOWABLE] = true, + } + return state +end + +-------------------------------------------------------------------------------- + +function modifier_item_guardian_shell:GetPriority() + return MODIFIER_PRIORITY_HIGH +end + +---------------------------------------- + +function modifier_item_guardian_shell:OnCreated( kv ) + self.bonus_armor = self:GetAbility():GetSpecialValueFor( "bonus_armor" ) + self.magic_resistance = self:GetAbility():GetSpecialValueFor( "magic_resistance" ) +end + + +---------------------------------------- + +function modifier_item_guardian_shell:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS, + } + return funcs +end + +---------------------------------------- + +function modifier_item_guardian_shell:GetModifierPhysicalArmorBonus( params ) + return self.bonus_armor +end + +---------------------------------------- + +function modifier_item_guardian_shell:GetModifierMagicalResistanceBonus( params ) + return self.magic_resistance +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_ice_dragon_maw.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_ice_dragon_maw.lua new file mode 100755 index 0000000..c37c2ef --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_ice_dragon_maw.lua @@ -0,0 +1,82 @@ + +modifier_item_ice_dragon_maw = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_ice_dragon_maw:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_ice_dragon_maw:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_ice_dragon_maw:OnCreated( kv ) + self.bonus_damage = self:GetAbility():GetSpecialValueFor( "bonus_damage" ) + self.bonus_attack_range = self:GetAbility():GetSpecialValueFor( "bonus_attack_range" ) + self.chance_to_freeze = self:GetAbility():GetSpecialValueFor( "chance_to_freeze" ) + self.freeze_duration = self:GetAbility():GetSpecialValueFor( "freeze_duration" ) + self.freeze_cooldown = self:GetAbility():GetSpecialValueFor( "freeze_cooldown" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_ice_dragon_maw:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, + MODIFIER_PROPERTY_ATTACK_RANGE_BONUS, + MODIFIER_EVENT_ON_ATTACK_LANDED, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_ice_dragon_maw:GetModifierAttackRangeBonus( params ) + if self:GetParent():IsRangedAttacker() then + return self.bonus_attack_range + end + + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_item_ice_dragon_maw:GetModifierPreAttack_BonusDamage( params ) + return self.bonus_damage +end + +-------------------------------------------------------------------------------- + +function modifier_item_ice_dragon_maw:OnAttackLanded( params ) + if IsServer() then + local hAttacker = params.attacker + local hTarget = params.target + if hAttacker == nil or hAttacker ~= self:GetParent() or hTarget == nil then + return 0 + end + + if hTarget:IsMagicImmune() == false and hTarget:IsInvulnerable() == false and RollPercentage( self.chance_to_freeze ) then + if self.fLastFreezeTime == nil or ( GameRules:GetGameTime() >= ( self.fLastFreezeTime + self.freeze_cooldown ) ) then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_crystalmaiden/maiden_frostbite.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetCaster() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, hTarget, PATTACH_ABSORIGIN_FOLLOW, nil, hTarget:GetAbsOrigin(), false ) + ParticleManager:ReleaseParticleIndex( nFXIndex ); + + hTarget:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_large_frostbitten_icicle", { duration = self.freeze_duration } ) + EmitSoundOn( "IceDragonMaw.Trigger", hTarget ) + + self.fLastFreezeTime = GameRules:GetGameTime() + end + end + end + + return 0 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_lifestone.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_lifestone.lua new file mode 100755 index 0000000..a94906e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_lifestone.lua @@ -0,0 +1,40 @@ + +modifier_item_lifestone = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_lifestone:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_lifestone:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_lifestone:OnCreated( kv ) + self.hp_regen = self:GetAbility():GetSpecialValueFor( "hp_regen" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_lifestone:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_lifestone:GetModifierConstantHealthRegen( params ) + return self.hp_regen +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_lifestone_pact.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_lifestone_pact.lua new file mode 100755 index 0000000..530ee97 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_lifestone_pact.lua @@ -0,0 +1,53 @@ + +modifier_item_lifestone_pact = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_lifestone_pact:GetTexture() + return "item_lifestone" +end + +-------------------------------------------------------------------------------- + +function modifier_item_lifestone_pact:OnCreated( kv ) + self.pact_interval = self:GetAbility():GetSpecialValueFor( "pact_interval" ) + self.pact_hp_cost = self:GetAbility():GetSpecialValueFor( "pact_hp_cost" ) + self.pact_mana_gained = self:GetAbility():GetSpecialValueFor( "pact_mana_gained" ) + + if IsServer() then + EmitSoundOn( "Lifestone.Activate", self:GetParent() ) + + self:StartIntervalThink( self.pact_interval ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_item_lifestone_pact:OnIntervalThink() + if IsServer() then + local damage = + { + victim = self:GetParent(), + attacker = self:GetCaster(), + damage = self.pact_hp_cost, + damage_type = self:GetAbility():GetAbilityDamageType(), + ability = self + } + ApplyDamage( damage ) + + self:GetParent():GiveMana( self.pact_mana_gained ) + SendOverheadEventMessage( self:GetCaster():GetPlayerOwner(), OVERHEAD_ALERT_MANA_ADD, self:GetParent(), self.pact_mana_gained, nil ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_item_lifestone_pact:OnDestroy() + if IsServer() then + StopSoundOn( "Lifestone.Activate", self:GetParent() ) + EmitSoundOn( "Lifestone.Deactivate", self:GetParent() ) + end +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_longclaws_amulet.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_longclaws_amulet.lua new file mode 100755 index 0000000..ef93e87 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_longclaws_amulet.lua @@ -0,0 +1,83 @@ +modifier_item_longclaws_amulet = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_longclaws_amulet:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_longclaws_amulet:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_longclaws_amulet:OnCreated( kv ) + self.spell_lifesteal_pct = self:GetAbility():GetSpecialValueFor( "spell_lifesteal_pct" ) + self.cooldown_reduction_pct = self:GetAbility():GetSpecialValueFor( "cooldown_reduction_pct" ) + self.mana_cost_reduction_pct = self:GetAbility():GetSpecialValueFor( "mana_cost_reduction_pct" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_longclaws_amulet:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_COOLDOWN_PERCENTAGE, + MODIFIER_PROPERTY_MANACOST_PERCENTAGE, + MODIFIER_PROPERTY_UNIT_STATS_NEEDS_REFRESH, + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_longclaws_amulet:GetModifierPercentageCooldown( params ) + return self.cooldown_reduction_pct +end + +-------------------------------------------------------------------------------- + +function modifier_item_longclaws_amulet:GetModifierPercentageManacost( params ) + return self.mana_cost_reduction_pct +end + +-------------------------------------------------------------------------------- + +function modifier_item_longclaws_amulet:GetModifierUnitStatsNeedsRefresh( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_item_longclaws_amulet:OnTakeDamage( params ) + if IsServer() then + local Attacker = params.attacker + local Target = params.unit + local Ability = params.inflictor + local flDamage = params.damage + + if Attacker ~= self:GetParent() or Ability == nil or Target == nil then + return 0 + end + + if bit.band( params.damage_flags, DOTA_DAMAGE_FLAG_REFLECTION ) == DOTA_DAMAGE_FLAG_REFLECTION then + return 0 + end + if bit.band( params.damage_flags, DOTA_DAMAGE_FLAG_NO_SPELL_LIFESTEAL ) == DOTA_DAMAGE_FLAG_NO_SPELL_LIFESTEAL then + return 0 + end + + local nFXIndex = ParticleManager:CreateParticle( "particles/items3_fx/octarine_core_lifesteal.vpcf", PATTACH_ABSORIGIN_FOLLOW, Attacker ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local flLifesteal = flDamage * self.spell_lifesteal_pct / 100 + Attacker:Heal( flLifesteal, self:GetAbility() ) + end + return 0 +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_oblivions_locket.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_oblivions_locket.lua new file mode 100755 index 0000000..724e368 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_oblivions_locket.lua @@ -0,0 +1,47 @@ +modifier_item_oblivions_locket = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_oblivions_locket:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_oblivions_locket:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_oblivions_locket:OnCreated( kv ) + self.bonus_all_stats = self:GetAbility():GetSpecialValueFor( "bonus_all_stats" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_oblivions_locket:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_STATS_AGILITY_BONUS, + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_oblivions_locket:GetModifierBonusStats_Strength( params ) + return self.bonus_all_stats +end +-------------------------------------------------------------------------------- + +function modifier_item_oblivions_locket:GetModifierBonusStats_Agility( params ) + return self.bonus_all_stats +end +-------------------------------------------------------------------------------- + +function modifier_item_oblivions_locket:GetModifierBonusStats_Intellect( params ) + return self.bonus_all_stats +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_ogre_seal_totem.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_ogre_seal_totem.lua new file mode 100755 index 0000000..be48d8e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_ogre_seal_totem.lua @@ -0,0 +1,49 @@ + +modifier_item_ogre_seal_totem = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_ogre_seal_totem:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_ogre_seal_totem:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_ogre_seal_totem:OnCreated( kv ) + self.bonus_strength = self:GetAbility():GetSpecialValueFor( "bonus_strength" ) + self.bonus_hp = self:GetAbility():GetSpecialValueFor( "bonus_hp" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_ogre_seal_totem:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_HEALTH_BONUS, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_ogre_seal_totem:GetModifierBonusStats_Strength( params ) + return self.bonus_strength +end + +-------------------------------------------------------------------------------- + +function modifier_item_ogre_seal_totem:GetModifierHealthBonus( params ) + return self.bonus_hp +end + +-------------------------------------------------------------------------------- + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_paw_of_lucius.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_paw_of_lucius.lua new file mode 100755 index 0000000..e787e50 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_paw_of_lucius.lua @@ -0,0 +1,62 @@ +modifier_item_paw_of_lucius = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_paw_of_lucius:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_paw_of_lucius:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_paw_of_lucius:OnCreated( kv ) + self.bonus_strength = self:GetAbility():GetSpecialValueFor( "bonus_strength" ) + self.bonus_attack_speed = self:GetAbility():GetSpecialValueFor( "bonus_attack_speed" ) + self.rupture_chance = self:GetAbility():GetSpecialValueFor( "rupture_chance" ) + self.rupture_duration = self:GetAbility():GetSpecialValueFor( "rupture_duration" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_paw_of_lucius:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + MODIFIER_EVENT_ON_ATTACK_LANDED, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_paw_of_lucius:GetModifierBonusStats_Strength( params ) + return self.bonus_strength +end + +-------------------------------------------------------------------------------- + +function modifier_item_paw_of_lucius:GetModifierAttackSpeedBonus_Constant( params ) + return self.bonus_attack_speed +end + +-------------------------------------------------------------------------------- + +function modifier_item_paw_of_lucius:OnAttackLanded( params ) + if IsServer() then + if params.attacker == self:GetParent() and RollPercentage( self.rupture_chance ) then + if params.target ~= nil then + params.target:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_bloodseeker_rupture", { duration = self.rupture_duration } ) + EmitSoundOn( "DOTA_Item.Maim", params.target ) + end + end + end + return 0 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_pelt_of_the_old_wolf.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_pelt_of_the_old_wolf.lua new file mode 100755 index 0000000..b351984 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_pelt_of_the_old_wolf.lua @@ -0,0 +1,51 @@ +modifier_item_pelt_of_the_old_wolf = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_pelt_of_the_old_wolf:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_pelt_of_the_old_wolf:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_pelt_of_the_old_wolf:OnCreated( kv ) + self.bonus_armor = self:GetAbility():GetSpecialValueFor( "bonus_armor" ) + self.bonus_move_speed = self:GetAbility():GetSpecialValueFor( "bonus_move_speed" ) + self.bonus_evasion = self:GetAbility():GetSpecialValueFor( "bonus_evasion" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_pelt_of_the_old_wolf:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT, + MODIFIER_PROPERTY_EVASION_CONSTANT, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_pelt_of_the_old_wolf:GetModifierPhysicalArmorBonus( params ) + return self.bonus_armor +end + +-------------------------------------------------------------------------------- + +function modifier_item_pelt_of_the_old_wolf:GetModifierMoveSpeedBonus_Constant( params ) + return self.bonus_move_speed +end + +-------------------------------------------------------------------------------- + +function modifier_item_pelt_of_the_old_wolf:GetModifierEvasion_Constant( params ) + return self.bonus_evasion +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_precious_egg.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_precious_egg.lua new file mode 100755 index 0000000..f90aade --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_precious_egg.lua @@ -0,0 +1,79 @@ +modifier_item_precious_egg = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_precious_egg:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_precious_egg:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_precious_egg:OnCreated( kv ) + self.bonus_all_stats = self:GetAbility():GetSpecialValueFor( "bonus_all_stats" ) + self.chance_to_resist_death = self:GetAbility():GetSpecialValueFor( "chance_to_resist_death" ) + self.bDeathPrevented = false +end + +-------------------------------------------------------------------------------- + +function modifier_item_precious_egg:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_STATS_AGILITY_BONUS, + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + MODIFIER_PROPERTY_MIN_HEALTH, + MODIFIER_EVENT_ON_DEATH_PREVENTED, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_precious_egg:GetModifierBonusStats_Strength( params ) + return self.bonus_all_stats +end +-------------------------------------------------------------------------------- + +function modifier_item_precious_egg:GetModifierBonusStats_Agility( params ) + return self.bonus_all_stats +end +-------------------------------------------------------------------------------- + +function modifier_item_precious_egg:GetModifierBonusStats_Intellect( params ) + return self.bonus_all_stats +end + +-------------------------------------------------------------------------------- + +function modifier_item_precious_egg:GetMinHealth( params ) + if IsServer() then + if RollPercentage( self.chance_to_resist_death ) then + self.bDeathPrevented = true + return 1 + end + end + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_item_precious_egg:OnDeathPrevented( params ) + if IsServer() then + if self:GetParent() == params.unit and self:GetParent():IsAlive() and self.bDeathPrevented then + local nFXIndex = ParticleManager:CreateParticle( "particles/items4_fx/combo_breaker_spell.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + ParticleManager:SetParticleControlEnt( nFXIndex, 1, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetAbsOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOn( "DOTA_Item.ComboBreaker", self:GetParent() ) + self.bDeathPrevented = false + end + end + return 0 +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_preserved_skull.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_preserved_skull.lua new file mode 100755 index 0000000..8c93a88 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_preserved_skull.lua @@ -0,0 +1,68 @@ +modifier_item_preserved_skull = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_preserved_skull:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_preserved_skull:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_preserved_skull:IsAura() + return true +end + +---------------------------------------- + +function modifier_item_preserved_skull:GetModifierAura() + return "modifier_item_preserved_skull_effect" +end + +---------------------------------------- + +function modifier_item_preserved_skull:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_FRIENDLY +end + +---------------------------------------- + +function modifier_item_preserved_skull:GetAuraSearchType() + return DOTA_UNIT_TARGET_ALL +end + +---------------------------------------- + +function modifier_item_preserved_skull:GetAuraRadius() + return self.radius +end + +---------------------------------------- + +function modifier_item_preserved_skull:OnCreated( kv ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.bonus_intelligence = self:GetAbility():GetSpecialValueFor( "bonus_intelligence" ) +end + +---------------------------------------- + +function modifier_item_preserved_skull:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + } + return funcs +end + +---------------------------------------- + +function modifier_item_preserved_skull:GetModifierBonusStats_Intellect( params ) + return self.bonus_intelligence +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_preserved_skull_effect.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_preserved_skull_effect.lua new file mode 100755 index 0000000..fdf57ed --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_preserved_skull_effect.lua @@ -0,0 +1,40 @@ +modifier_item_preserved_skull_effect = class({}) + +---------------------------------------- + +function modifier_item_preserved_skull_effect:GetTexture() + return "item_preserved_skull" +end + +---------------------------------------- + +function modifier_item_preserved_skull_effect:OnCreated( kv ) + self.cooldown_reduction_pct = self:GetAbility():GetSpecialValueFor( "cooldown_reduction_pct" ) + self.aura_mana_regen = self:GetAbility():GetSpecialValueFor( "aura_mana_regen" ) +end + +---------------------------------------- + +function modifier_item_preserved_skull_effect:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_COOLDOWN_PERCENTAGE, + MODIFIER_PROPERTY_MANA_REGEN_CONSTANT, + } + return funcs +end + +---------------------------------------- + +function modifier_item_preserved_skull_effect:GetModifierConstantManaRegen( params ) + return self.aura_mana_regen +end + +---------------------------------------- + +function modifier_item_preserved_skull_effect:GetModifierPercentageCooldown( params ) + return self.cooldown_reduction_pct +end + + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_rhyziks_eye.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_rhyziks_eye.lua new file mode 100755 index 0000000..6106f74 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_rhyziks_eye.lua @@ -0,0 +1,82 @@ +modifier_item_rhyziks_eye = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_rhyziks_eye:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_rhyziks_eye:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_rhyziks_eye:OnCreated( kv ) + self.bonus_damage_pct = self:GetAbility():GetSpecialValueFor( "bonus_damage_pct" ) + self.damage_reduction = self:GetAbility():GetSpecialValueFor( "damage_reduction" ) + self.mana_regen_sec = self:GetAbility():GetSpecialValueFor( "mana_regen_sec" ) + self.hp_regen_sec = self:GetAbility():GetSpecialValueFor( "hp_regen_sec" ) + self.bonus_all_stats = self:GetAbility():GetSpecialValueFor( "bonus_all_stats" ) +end + +---------------------------------------- + +function modifier_item_rhyziks_eye:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE, + MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE, + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_STATS_AGILITY_BONUS, + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + MODIFIER_PROPERTY_MANA_REGEN_CONSTANT, + MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT, + + } + return funcs +end + +---------------------------------------- + +function modifier_item_rhyziks_eye:GetModifierDamageOutgoing_Percentage( params ) + return self.bonus_damage_pct +end + +---------------------------------------- + +function modifier_item_rhyziks_eye:GetModifierIncomingDamage_Percentage( params ) + return -self.damage_reduction +end + +---------------------------------------- + +function modifier_item_rhyziks_eye:GetModifierBonusStats_Strength( params ) + return self.bonus_all_stats +end + +---------------------------------------- + +function modifier_item_rhyziks_eye:GetModifierBonusStats_Agility( params ) + return self.bonus_all_stats +end + +---------------------------------------- + +function modifier_item_rhyziks_eye:GetModifierBonusStats_Intellect( params ) + return self.bonus_all_stats +end + +---------------------------------------- + +function modifier_item_rhyziks_eye:GetModifierConstantHealthRegen( params ) + return self.hp_regen_sec +end + +---------------------------------------- + +function modifier_item_rhyziks_eye:GetModifierConstantManaRegen( params ) + return self.mana_regen_sec +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_sign_of_the_arachnid.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_sign_of_the_arachnid.lua new file mode 100755 index 0000000..77aecc2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_sign_of_the_arachnid.lua @@ -0,0 +1,68 @@ +modifier_item_sign_of_the_arachnid = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_sign_of_the_arachnid:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_sign_of_the_arachnid:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid:IsAura() + return true +end + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid:GetModifierAura() + return "modifier_item_sign_of_the_arachnid_effect" +end + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_FRIENDLY +end + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid:GetAuraSearchType() + return DOTA_UNIT_TARGET_ALL +end + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid:GetAuraRadius() + return self.radius +end + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid:OnCreated( kv ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.bonus_agility = self:GetAbility():GetSpecialValueFor( "bonus_agility" ) +end + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_AGILITY_BONUS, + } + return funcs +end + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid:GetModifierBonusStats_Agility( params ) + return self.bonus_agility +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_sign_of_the_arachnid_effect.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_sign_of_the_arachnid_effect.lua new file mode 100755 index 0000000..1f733ed --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_sign_of_the_arachnid_effect.lua @@ -0,0 +1,37 @@ +modifier_item_sign_of_the_arachnid_effect = class({}) + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid_effect:GetTexture() + return "item_sign_of_the_arachnid" +end + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid_effect:OnCreated( kv ) + self.bonus_move_speed_pct = self:GetAbility():GetSpecialValueFor( "bonus_move_speed_pct" ) + self.attack_speed = self:GetAbility():GetSpecialValueFor( "attack_speed" ) +end + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid_effect:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + } + return funcs +end + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid_effect:GetModifierMoveSpeedBonus_Percentage( params ) + return self.bonus_move_speed_pct +end + +---------------------------------------- + +function modifier_item_sign_of_the_arachnid_effect:GetModifierAttackSpeedBonus_Constant( params ) + return self.attack_speed +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_slippers_of_the_abyss.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_slippers_of_the_abyss.lua new file mode 100755 index 0000000..fbb7800 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_slippers_of_the_abyss.lua @@ -0,0 +1,63 @@ + +modifier_item_slippers_of_the_abyss = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_slippers_of_the_abyss:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_slippers_of_the_abyss:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_slippers_of_the_abyss:OnCreated( kv ) + self.bonus_movement_speed = self:GetAbility():GetSpecialValueFor( "bonus_movement_speed" ) + self.bonus_strength = self:GetAbility():GetSpecialValueFor( "bonus_strength" ) + self.bonus_agility = self:GetAbility():GetSpecialValueFor( "bonus_agility" ) + self.bonus_atk_speed = self:GetAbility():GetSpecialValueFor( "bonus_atk_speed" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_slippers_of_the_abyss:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_BONUS_UNIQUE, + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_STATS_AGILITY_BONUS, + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_slippers_of_the_abyss:GetModifierMoveSpeedBonus_Special_Boots( params ) + return self.bonus_movement_speed +end + +-------------------------------------------------------------------------------- + +function modifier_item_slippers_of_the_abyss:GetModifierBonusStats_Strength( params ) + return self.bonus_strength +end + +-------------------------------------------------------------------------------- + +function modifier_item_slippers_of_the_abyss:GetModifierBonusStats_Agility( params ) + return self.bonus_agility +end + +-------------------------------------------------------------------------------- + +function modifier_item_slippers_of_the_abyss:GetModifierAttackSpeedBonus_Constant( params ) + return self.bonus_atk_speed +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_slippers_of_the_abyss_sprint.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_slippers_of_the_abyss_sprint.lua new file mode 100755 index 0000000..275496f --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_slippers_of_the_abyss_sprint.lua @@ -0,0 +1,72 @@ + +modifier_item_slippers_of_the_abyss_sprint = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_slippers_of_the_abyss_sprint:GetTexture() + return "item_slippers_of_the_abyss" +end + +------------------------------------------------------------------------------ + +function modifier_item_slippers_of_the_abyss_sprint:GetEffectName() + return "particles/units/heroes/hero_slardar/slardar_sprint.vpcf" +end + +------------------------------------------------------------------------------ + +function modifier_item_slippers_of_the_abyss_sprint:IsPurgable() + return false +end + +------------------------------------------------------------------------------ + +function modifier_item_slippers_of_the_abyss_sprint:OnCreated( kv ) + self.sprint_bonus_ms = self:GetAbility():GetSpecialValueFor( "sprint_bonus_ms" ) + self.sprint_bonus_dmg = self:GetAbility():GetSpecialValueFor( "sprint_bonus_dmg" ) + self.sprint_bonus_atk_speed = self:GetAbility():GetSpecialValueFor( "sprint_bonus_atk_speed" ) +end + +------------------------------------------------------------------------------ + +function modifier_item_slippers_of_the_abyss_sprint:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT, + MODIFIER_PROPERTY_MOVESPEED_MAX, + MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + } + return funcs +end + +------------------------------------------------------------------------------ + +function modifier_item_slippers_of_the_abyss_sprint:GetModifierMoveSpeedBonus_Constant( params ) + return self.sprint_bonus_ms +end + +------------------------------------------------------------------------------ + +function modifier_item_slippers_of_the_abyss_sprint:GetModifierMoveSpeed_Max( params ) + if IsServer() then + return 750 + end + + return 750 +end + +------------------------------------------------------------------------------ + +function modifier_item_slippers_of_the_abyss_sprint:GetModifierPreAttack_BonusDamage( params ) + return self.sprint_bonus_dmg +end + +------------------------------------------------------------------------------ + +function modifier_item_slippers_of_the_abyss_sprint:GetModifierAttackSpeedBonus_Constant( params ) + return self.sprint_bonus_atk_speed +end + +------------------------------------------------------------------------------ + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_spell_amp_potion.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_spell_amp_potion.lua new file mode 100755 index 0000000..d0ae306 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_spell_amp_potion.lua @@ -0,0 +1,43 @@ + +modifier_item_spell_amp_potion = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_spell_amp_potion:GetEffectName() + return "particles/generic_gameplay/spell_amp_potion_owner.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_item_spell_amp_potion:GetTexture() + return "spell_amp_potion" +end + +-------------------------------------------------------------------------------- + +function modifier_item_spell_amp_potion:OnCreated( kv ) + self.spell_amp_bonus_pct = self:GetAbility():GetSpecialValueFor( "spell_amp_bonus_pct" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_spell_amp_potion:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE_UNIQUE + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_spell_amp_potion:GetModifierSpellAmplify_PercentageUnique( params ) + if self:GetParent():IsIllusion() then + return 0 + end + + return self.spell_amp_bonus_pct +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_stonework_pendant.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_stonework_pendant.lua new file mode 100755 index 0000000..d6f93a4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_stonework_pendant.lua @@ -0,0 +1,123 @@ +modifier_item_stonework_pendant = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_stonework_pendant:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_stonework_pendant:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_stonework_pendant:OnCreated( kv ) + self.spell_lifesteal = self:GetAbility():GetSpecialValueFor( "spell_lifesteal" ) + self.hp_cost_multiplier = self:GetAbility():GetSpecialValueFor( "hp_cost_multiplier" ) + self.flBonusHP = self:GetParent():GetMaxMana() + self.flBonusHPRegen = self:GetParent():GetManaRegen() + if IsServer() then + self:GetParent():CalculateStatBonus() + end + self:StartIntervalThink( 0.5 ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_stonework_pendant:OnIntervalThink() + self.flBonusHP = self.flBonusHP + self:GetParent():GetMaxMana() + self.flBonusHPRegen = self.flBonusHPRegen + self:GetParent():GetManaRegen() + if IsServer() then + self:GetParent():CalculateStatBonus() + end +end + +-------------------------------------------------------------------------------- + +function modifier_item_stonework_pendant:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_HEALTH_BONUS, + MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT, + MODIFIER_PROPERTY_MANA_REGEN_CONSTANT, + MODIFIER_PROPERTY_MANA_BONUS, + MODIFIER_EVENT_ON_TAKEDAMAGE, + MODIFIER_PROPERTY_SPELLS_REQUIRE_HP, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_stonework_pendant:GetModifierHealthBonus( params ) + if self.flBonusHP == nil then + return 0 + end + + return self.flBonusHP +end + +-------------------------------------------------------------------------------- + +function modifier_item_stonework_pendant:GetModifierConstantHealthRegen( params ) + if self.flBonusHPRegen == nil then + return 0 + end + return self.flBonusHPRegen +end + +-------------------------------------------------------------------------------- + +function modifier_item_stonework_pendant:GetModifierManaBonus( params ) + if self.flBonusHP == nil then + return 0 + end + return -self.flBonusHP +end + +-------------------------------------------------------------------------------- + +function modifier_item_stonework_pendant:GetModifierConstantManaRegen( params ) + if self.flBonusHPRegen == nil then + return 0 + end + return -self.flBonusHPRegen +end + +-------------------------------------------------------------------------------- + +function modifier_item_stonework_pendant:OnTakeDamage( params ) + if IsServer() then + local Attacker = params.attacker + local Target = params.unit + local Ability = params.inflictor + local flDamage = params.damage + + if Attacker ~= self:GetParent() or Ability == nil or Target == nil then + return 0 + end + + if bit.band( params.damage_flags, DOTA_DAMAGE_FLAG_REFLECTION ) == DOTA_DAMAGE_FLAG_REFLECTION then + return 0 + end + if bit.band( params.damage_flags, DOTA_DAMAGE_FLAG_NO_SPELL_LIFESTEAL ) == DOTA_DAMAGE_FLAG_NO_SPELL_LIFESTEAL then + return 0 + end + + local nFXIndex = ParticleManager:CreateParticle( "particles/items3_fx/octarine_core_lifesteal.vpcf", PATTACH_ABSORIGIN_FOLLOW, Attacker ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + local flLifesteal = flDamage * self.spell_lifesteal / 100 + Attacker:Heal( flLifesteal, self:GetAbility() ) + end + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_item_stonework_pendant:GetModifierSpellsRequireHP( params ) + return self.hp_cost_multiplier +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_stony_coat.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_stony_coat.lua new file mode 100755 index 0000000..599b1d7 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_stony_coat.lua @@ -0,0 +1,74 @@ +modifier_item_stony_coat = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_stony_coat:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_stony_coat:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_stony_coat:OnCreated( kv ) + self.bonus_strength = self:GetAbility():GetSpecialValueFor( "bonus_strength" ) + self.bonus_armor = self:GetAbility():GetSpecialValueFor( "bonus_armor" ) + self.boulder_chance = self:GetAbility():GetSpecialValueFor( "boulder_chance" ) + self.boulder_speed = self:GetAbility():GetSpecialValueFor( "boulder_speed" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_stony_coat:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + MODIFIER_EVENT_ON_TAKEDAMAGE + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_stony_coat:GetModifierBonusStats_Strength( params ) + return self.bonus_strength +end + +-------------------------------------------------------------------------------- + +function modifier_item_stony_coat:GetModifierPhysicalArmorBonus( params ) + return self.bonus_armor +end + +-------------------------------------------------------------------------------- + +function modifier_item_stony_coat:OnTakeDamage( params ) + if IsServer() then + if params.unit == self:GetParent() then + local hAttacker = params.attacker + if hAttacker ~= nil and RollPercentage( self.boulder_chance ) then + local info = + { + Target = hAttacker, + Source = self:GetParent(), + Ability = self:GetAbility(), + iMoveSpeed = self.boulder_speed, + vSourceLoc = self:GetParent():GetOrigin(), + EffectName = "particles/neutral_fx/mud_golem_hurl_boulder.vpcf", + } + ProjectileManager:CreateTrackingProjectile( info ) + + EmitSoundOn( "n_mud_golem.Boulder.Cast", self:GetParent() ) + end + end + end + return 0 +end + + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_the_caustic_finale.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_the_caustic_finale.lua new file mode 100755 index 0000000..4e07a08 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_the_caustic_finale.lua @@ -0,0 +1,71 @@ +modifier_item_the_caustic_finale = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_the_caustic_finale:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_the_caustic_finale:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_the_caustic_finale:OnCreated( kv ) + self.bonus_damage = self:GetAbility():GetSpecialValueFor( "bonus_damage" ) + self.bonus_attack_speed = self:GetAbility():GetSpecialValueFor( "bonus_attack_speed" ) + self.caustic_duration = self:GetAbility():GetSpecialValueFor( "caustic_duration" ) + self.max_stack_count = self:GetAbility():GetSpecialValueFor( "max_stack_count" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_the_caustic_finale:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_ATTACK_LANDED, + MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE, + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + } + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_item_the_caustic_finale:OnAttackLanded( params ) + if IsServer() then + if self:GetParent() == params.attacker then + local Target = params.target + if Target ~= nil then + local hCausticBuff = Target:FindModifierByName( "modifier_sand_king_boss_caustic_finale" ) + if hCausticBuff == nil then + hCausticBuff = Target:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_sand_king_boss_caustic_finale", { duration = self.caustic_duration } ) + if hCausticBuff ~= nil then + hCausticBuff:SetStackCount( 0 ) + end + end + if hCausticBuff ~= nil then + hCausticBuff:SetStackCount( math.min( hCausticBuff:GetStackCount() + 1, self.max_stack_count ) ) + hCausticBuff:SetDuration( self.caustic_duration, true ) + end + end + end + end + return 0 +end + +----------------------------------------------------------------------------------------- + +function modifier_item_the_caustic_finale:GetModifierPreAttack_BonusDamage( params ) + return self.bonus_damage +end + +-------------------------------------------------------------------------------- + +function modifier_item_the_caustic_finale:GetModifierAttackSpeedBonus_Constant( params ) + return self.bonus_attack_speed +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_torrent_effect_potion.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_torrent_effect_potion.lua new file mode 100755 index 0000000..667b239 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_torrent_effect_potion.lua @@ -0,0 +1,89 @@ + +modifier_item_torrent_effect_potion = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_torrent_effect_potion:GetTexture() + return "item_torrent_effect_potion" +end + +-------------------------------------------------------------------------------- + +function modifier_item_torrent_effect_potion:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_torrent_effect_potion:IsPermanent() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_torrent_effect_potion:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +-------------------------------------------------------------------------------- + +function modifier_item_torrent_effect_potion:RemoveOnDeath() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_torrent_effect_potion:OnCreated( kv ) + if IsServer() then + self.proc_chance = self:GetAbility():GetSpecialValueFor( "proc_chance" ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.movespeed_bonus = self:GetAbility():GetSpecialValueFor( "movespeed_bonus" ) + self.slow_duration = self:GetAbility():GetSpecialValueFor( "slow_duration" ) + self.stun_duration = self:GetAbility():GetSpecialValueFor( "stun_duration" ) + self.delay = self:GetAbility():GetSpecialValueFor( "delay" ) + self.torrent_damage = self:GetAbility():GetSpecialValueFor( "torrent_damage" ) + self.torrent_cooldown = self:GetAbility():GetSpecialValueFor( "torrent_cooldown" ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_item_torrent_effect_potion:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_ATTACKED, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_torrent_effect_potion:OnAttacked( params ) + if IsServer() then + if params.target == self:GetParent() and params.attacker ~= nil then + if RollPercentage( self.proc_chance ) then + if self.fLastTorrentTime == nil or ( GameRules:GetGameTime() >= ( self.fLastTorrentTime + self.torrent_cooldown ) ) then + -- Create a torrent at the attacker's feet + local kv = + { + radius = self.radius, + movespeed_bonus = self.movespeed_bonus, + slow_duration = self.slow_duration, + stun_duration = self.stun_duration, + duration = self.delay, + torrent_damage = self.torrent_damage, + } + + CreateModifierThinker( self:GetCaster(), self, "modifier_aghsfort_torrent_effect_potion_thinker", kv, params.attacker:GetOrigin(), self:GetCaster():GetTeamNumber(), false ) + + self.fLastTorrentTime = GameRules:GetGameTime() + end + end + end + end + + return 1 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_treads_of_ermacor.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_treads_of_ermacor.lua new file mode 100755 index 0000000..87a41c3 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_treads_of_ermacor.lua @@ -0,0 +1,69 @@ +modifier_item_treads_of_ermacor = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_treads_of_ermacor:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_treads_of_ermacor:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_treads_of_ermacor:OnCreated( kv ) + self.bonus_movement_speed = self:GetAbility():GetSpecialValueFor( "bonus_movement_speed" ) + self.bonus_attack_speed = self:GetAbility():GetSpecialValueFor( "bonus_attack_speed" ) + self.bonus_all_stats = self:GetAbility():GetSpecialValueFor( "bonus_all_stats" ) +end + +---------------------------------------- + +function modifier_item_treads_of_ermacor:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + MODIFIER_PROPERTY_MOVESPEED_BONUS_UNIQUE, + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_STATS_AGILITY_BONUS, + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + } + return funcs +end + +---------------------------------------- + +function modifier_item_treads_of_ermacor:GetModifierAttackSpeedBonus_Constant( params ) + return self.bonus_attack_speed +end + +---------------------------------------- + +function modifier_item_treads_of_ermacor:GetModifierMoveSpeedBonus_Special_Boots( params ) + return self.bonus_movement_speed +end + +---------------------------------------- + +function modifier_item_treads_of_ermacor:GetModifierBonusStats_Strength( params ) + return self.bonus_all_stats +end + +---------------------------------------- + +function modifier_item_treads_of_ermacor:GetModifierBonusStats_Agility( params ) + return self.bonus_all_stats +end + +---------------------------------------- + +function modifier_item_treads_of_ermacor:GetModifierBonusStats_Intellect( params ) + return self.bonus_all_stats +end + + + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_unhallowed_icon.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_unhallowed_icon.lua new file mode 100755 index 0000000..0d5f332 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_unhallowed_icon.lua @@ -0,0 +1,68 @@ +modifier_item_unhallowed_icon = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_unhallowed_icon:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_unhallowed_icon:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_unhallowed_icon:IsAura() + return true +end + +---------------------------------------- + +function modifier_item_unhallowed_icon:GetModifierAura() + return "modifier_item_unhallowed_icon_effect" +end + +---------------------------------------- + +function modifier_item_unhallowed_icon:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_FRIENDLY +end + +---------------------------------------- + +function modifier_item_unhallowed_icon:GetAuraSearchType() + return DOTA_UNIT_TARGET_ALL +end + +---------------------------------------- + +function modifier_item_unhallowed_icon:GetAuraRadius() + return self.radius +end + +---------------------------------------- + +function modifier_item_unhallowed_icon:OnCreated( kv ) + self.radius = self:GetAbility():GetSpecialValueFor( "radius" ) + self.bonus_strength = self:GetAbility():GetSpecialValueFor( "bonus_strength" ) +end + +---------------------------------------- + +function modifier_item_unhallowed_icon:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + } + return funcs +end + +---------------------------------------- + +function modifier_item_unhallowed_icon:GetModifierBonusStats_Strength( params ) + return self.bonus_strength +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_unhallowed_icon_effect.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_unhallowed_icon_effect.lua new file mode 100755 index 0000000..dc37463 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_unhallowed_icon_effect.lua @@ -0,0 +1,52 @@ +modifier_item_unhallowed_icon_effect = class({}) + +---------------------------------------- + +function modifier_item_unhallowed_icon_effect:GetTexture() + return "item_unhallowed_icon" +end + +---------------------------------------- + +function modifier_item_unhallowed_icon_effect:OnCreated( kv ) + self.lifesteal_pct = self:GetAbility():GetSpecialValueFor( "lifesteal_pct" ) + self.hp_regen = self:GetAbility():GetSpecialValueFor( "hp_regen" ) +end + +---------------------------------------- + +function modifier_item_unhallowed_icon_effect:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT, + MODIFIER_EVENT_ON_ATTACK_LANDED, + } + return funcs +end + +---------------------------------------- + +function modifier_item_unhallowed_icon_effect:GetModifierConstantHealthRegen( params ) + return self.hp_regen +end + +---------------------------------------- + +function modifier_item_unhallowed_icon_effect:OnAttackLanded( params ) + if IsServer() then + local Target = params.target + local Attacker = params.attacker + if Attacker ~= nil and Attacker == self:GetParent() and Target ~= nil then + local allies = FindUnitsInRadius( Attacker:GetTeamNumber(), self:GetCaster():GetOrigin(), nil, 1500, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, 0, false ) + for _,ally in pairs( allies ) do + if ally ~= nil and ally:FindModifierByName( "modifier_item_unhallowed_icon_effect" ) then + local heal = ( params.damage * self.lifesteal_pct / 100 ) / #allies + ally:Heal( heal, self:GetAbility() ) + local nFXIndex = ParticleManager:CreateParticle( "particles/generic_gameplay/generic_lifesteal.vpcf", PATTACH_ABSORIGIN_FOLLOW, ally ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + end + end + end + end + return 0 +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_wand_of_the_brine.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_wand_of_the_brine.lua new file mode 100755 index 0000000..2335c9d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_wand_of_the_brine.lua @@ -0,0 +1,47 @@ + +modifier_item_wand_of_the_brine = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_wand_of_the_brine:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_wand_of_the_brine:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_item_wand_of_the_brine:OnCreated( kv ) + self.bonus_intelligence = self:GetAbility():GetSpecialValueFor( "bonus_intelligence" ) + self.bonus_mana_regen_pct = self:GetAbility():GetSpecialValueFor( "bonus_mana_regen_pct" ) +end + +-------------------------------------------------------------------------------- + +function modifier_item_wand_of_the_brine:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + MODIFIER_PROPERTY_MANA_REGEN_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_item_wand_of_the_brine:GetModifierBonusStats_Intellect( params ) + return self.bonus_intelligence +end + +-------------------------------------------------------------------------------- + +function modifier_item_wand_of_the_brine:GetModifierPercentageManaRegen( params ) + return self.bonus_mana_regen_pct +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_wand_of_the_brine_bubble.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_wand_of_the_brine_bubble.lua new file mode 100755 index 0000000..faeea31 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_wand_of_the_brine_bubble.lua @@ -0,0 +1,63 @@ + +modifier_item_wand_of_the_brine_bubble = class({}) + +-------------------------------------------------------------------------------- + +function modifier_item_wand_of_the_brine_bubble:GetTexture() + return "item_wand_of_the_brine" +end + +-------------------------------------------------------------------------------- + +function modifier_item_wand_of_the_brine_bubble:OnCreated( kv ) + if IsServer() then + self.bubble_heal_per_tick = self:GetAbility():GetSpecialValueFor( "bubble_heal_per_tick" ) + self.heal_tick_interval = self:GetAbility():GetSpecialValueFor( "heal_tick_interval" ) + + self.nFXIndex = ParticleManager:CreateParticle( "particles/act_2/wand_of_the_brine_bubble.vpcf", PATTACH_CUSTOMORIGIN, nil ) + ParticleManager:SetParticleControlEnt( self.nFXIndex, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetOrigin(), true ) + ParticleManager:SetParticleControl( self.nFXIndex, 1, Vector( 2.5, 2.5, 2.5 ) ) -- target model scale + --ParticleManager:SetParticleControlEnt( self.nFXIndex, 2, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_attack1", self:GetParent():GetOrigin(), true ) + --ParticleManager:SetParticleControlEnt( self.nFXIndex, 3, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_attack2", self:GetParent():GetOrigin(), true ) + --ParticleManager:SetParticleControlEnt( self.nFXIndex, 4, self:GetParent(), PATTACH_ABSORIGIN_FOLLOW, nil, self:GetParent():GetOrigin(), true ) + + self:StartIntervalThink( self.heal_tick_interval ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_item_wand_of_the_brine_bubble:OnIntervalThink() + if IsServer() then + self:GetParent():Heal( self.bubble_heal_per_tick, self:GetAbility() ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_item_wand_of_the_brine_bubble:CheckState() + local state = {} + if IsServer() then + state[ MODIFIER_STATE_STUNNED] = true + state[ MODIFIER_STATE_ROOTED ] = true + state[ MODIFIER_STATE_DISARMED] = true + state[ MODIFIER_STATE_OUT_OF_GAME ] = true + state[ MODIFIER_STATE_MAGIC_IMMUNE ] = true + state[ MODIFIER_STATE_INVULNERABLE ] = true + state[ MODIFIER_STATE_OUT_OF_GAME ] = true + state[ MODIFIER_STATE_UNSELECTABLE ] = true + end + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_item_wand_of_the_brine_bubble:OnDestroy() + if IsServer() then + ParticleManager:DestroyParticle( self.nFXIndex, false ) + end +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_watchers_gaze.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_watchers_gaze.lua new file mode 100755 index 0000000..d5e4016 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_watchers_gaze.lua @@ -0,0 +1,49 @@ +modifier_item_watchers_gaze = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_watchers_gaze:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_watchers_gaze:IsPurgable() + return false +end +---------------------------------------- + +function modifier_item_watchers_gaze:OnCreated( kv ) + self.bonus_stats = self:GetAbility():GetSpecialValueFor( "bonus_stats" ) +end + +---------------------------------------- + +function modifier_item_watchers_gaze:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_STATS_STRENGTH_BONUS, + MODIFIER_PROPERTY_STATS_AGILITY_BONUS, + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + } + return funcs +end + +---------------------------------------- + +function modifier_item_watchers_gaze:GetModifierBonusStats_Strength( params ) + return self.bonus_stats +end + +---------------------------------------- + +function modifier_item_watchers_gaze:GetModifierBonusStats_Agility( params ) + return self.bonus_stats +end + +---------------------------------------- + +function modifier_item_watchers_gaze:GetModifierBonusStats_Intellect( params ) + return self.bonus_stats +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_winter_embrace.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_winter_embrace.lua new file mode 100755 index 0000000..15f3771 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_item_winter_embrace.lua @@ -0,0 +1,63 @@ +modifier_item_winter_embrace = class({}) + +------------------------------------------------------------------------------ + +function modifier_item_winter_embrace:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_item_winter_embrace:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_item_winter_embrace:OnCreated( kv ) + self.bonus_armor = self:GetAbility():GetSpecialValueFor( "bonus_armor" ) + self.bonus_intelligence = self:GetAbility():GetSpecialValueFor( "bonus_intelligence" ) + self.slow_duration = self:GetAbility():GetSpecialValueFor( "slow_duration" ) + +end + +---------------------------------------- + +function modifier_item_winter_embrace:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS, + MODIFIER_PROPERTY_STATS_INTELLECT_BONUS, + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + return funcs +end + +---------------------------------------- + +function modifier_item_winter_embrace:GetModifierPhysicalArmorBonus( params ) + return self.bonus_armor +end + +---------------------------------------- + +function modifier_item_winter_embrace:GetModifierBonusStats_Intellect( params ) + return self.bonus_intelligence +end + +---------------------------------------- + +function modifier_item_winter_embrace:OnTakeDamage( params ) + if IsServer() then + if params.unit ~= self:GetParent() then + return 0 + end + + local hAttacker = params.attacker + if hAttacker ~= nil and hAttacker:IsMagicImmune() == false and hAttacker:IsInvulnerable() == false and params.damage_type == DAMAGE_TYPE_PHYSICAL then + hAttacker:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_ogre_magi_frost_armor_slow", { duration = self.slow_duration} ) + end + end + return 0 +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_large_frostbitten_icicle.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_large_frostbitten_icicle.lua new file mode 100755 index 0000000..d8bbd9d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_large_frostbitten_icicle.lua @@ -0,0 +1,30 @@ +modifier_large_frostbitten_icicle = class({}) + +------------------------------------------------------------------ + +function modifier_large_frostbitten_icicle:OnCreated( kv ) + if IsServer() then + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_crystalmaiden/maiden_frostbite_buff.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + self:AddParticle( nFXIndex, false, false, -1, false, false ) + end +end + +------------------------------------------------------------------ + +function modifier_large_frostbitten_icicle:GetStatusEffectName() + return "particles/status_fx/status_effect_wyvern_cold_embrace.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_large_frostbitten_icicle:CheckState() + local state = {} + state[MODIFIER_STATE_STUNNED] = true + state[MODIFIER_STATE_FROZEN] = true + + return state +end + + + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_minor_ability_upgrades.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_minor_ability_upgrades.lua new file mode 100755 index 0000000..2b13d0a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_minor_ability_upgrades.lua @@ -0,0 +1,339 @@ +require( "aghanim_ability_upgrade_constants" ) +require( "utility_functions" ) + + +modifier_minor_ability_upgrades = class({}) + +-------------------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:IsPermanent() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:RemoveOnDeath() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:OnCreated( kv ) + self.bDirty = true + + if IsServer() then + ListenToGameEvent( "dota_player_learned_ability", Dynamic_Wrap( modifier_minor_ability_upgrades, "OnPlayerLearnedAbility" ), self ) + CustomNetTables:SetTableValue( "minor_ability_upgrades", tostring( self:GetParent():GetPlayerOwnerID() ), self:GetParent().MinorAbilityUpgrades ) + else + self:GetParent().MinorAbilityUpgrades = CustomNetTables:GetTableValue( "minor_ability_upgrades", tostring( self:GetParent():GetPlayerOwnerID() ) ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:OnRefresh( kv ) + self.bDirty = true + + if IsServer() then + CustomNetTables:SetTableValue( "minor_ability_upgrades", tostring( self:GetParent():GetPlayerOwnerID() ), self:GetParent().MinorAbilityUpgrades ) + else + self:GetParent().MinorAbilityUpgrades = CustomNetTables:GetTableValue( "minor_ability_upgrades", tostring( self:GetParent():GetPlayerOwnerID() ) ) + end +end + +----------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:OnPlayerLearnedAbility( event ) + if IsServer() then + if event.PlayerID == self:GetParent():GetPlayerOwnerID() then + self:ForceRefresh() + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:DeclareFunctions( ) + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + MODIFIER_PROPERTY_COOLDOWN_REDUCTION_CONSTANT, + MODIFIER_PROPERTY_COOLDOWN_PERCENTAGE, + MODIFIER_PROPERTY_MANACOST_REDUCTION_CONSTANT, + MODIFIER_PROPERTY_MANACOST_PERCENTAGE_STACKING, + } + return funcs +end + + +----------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local hUpgrades = self:GetParent().MinorAbilityUpgrades + if hUpgrades == nil then + hUpgrades = CustomNetTables:GetTableValue( "minor_ability_upgrades", tostring( self:GetParent():GetPlayerOwnerID() ) ) + end + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + if hUpgrades == nil or hUpgrades[ szAbilityName ] == nil then + return 0 + end + + if hUpgrades[ szAbilityName ][ szSpecialValueName ] == nil then + return 0 + end + + return 1 +end + +----------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:GetModifierOverrideAbilitySpecialValue( params ) + local hUpgrades = self:GetParent().MinorAbilityUpgrades + if hUpgrades == nil then + hUpgrades = CustomNetTables:GetTableValue( "minor_ability_upgrades", tostring( self:GetParent():GetPlayerOwnerID() ) ) + end + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + local nSpecialLevel = params.ability_special_level + if hUpgrades == nil or hUpgrades[ szAbilityName ] == nil then + return 0 + end + + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel ) + local SpecialValueUpgrades = hUpgrades[ szAbilityName ][ szSpecialValueName ] + + if SpecialValueUpgrades ~= nil then + if self.bDirty == false and SpecialValueUpgrades[ "cached_result" ] ~= nil and SpecialValueUpgrades[ "cached_result" ][ nSpecialLevel ] ~= nil then + return SpecialValueUpgrades[ "cached_result" ][ nSpecialLevel ] + end + + local flAddResult = 0 + local flMulResult = 1.0 + + for _,Upgrade in pairs ( SpecialValueUpgrades ) do + if Upgrade[ "operator" ] == MINOR_ABILITY_UPGRADE_OP_ADD then + flAddResult = flAddResult + Upgrade[ "value" ] + end + if Upgrade[ "operator" ] == MINOR_ABILITY_UPGRADE_OP_MUL then + flMulResult = flMulResult * ( 1.0 - ( Upgrade[ "value" ] / 100.0 ) ) + end + end + + flMulResult = 1.0 + ( 1.0 - flMulResult ) + + local flResult = ( flBaseValue + flAddResult ) * flMulResult + if SpecialValueUpgrades[ "cached_result" ] == nil then + SpecialValueUpgrades[ "cached_result" ] = {} + end + SpecialValueUpgrades[ "cached_result" ][ nSpecialLevel ] = flResult + self.bDirty = false + return flResult + + end + + return flBaseValue +end + +----------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:EnsureCachedResult( CooldownUpgrades ) + if CooldownUpgrades[ "cached_result" ] == nil then + CooldownUpgrades[ "cached_result" ] = {} + end + if CooldownUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ] == nil then + CooldownUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ] = {} + end + if CooldownUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_MUL ] == nil then + CooldownUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_MUL ] = {} + end +end + +----------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:GetModifierCooldownReduction_Constant( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local hUpgrades = self:GetParent().MinorAbilityUpgrades + if hUpgrades == nil then + hUpgrades = CustomNetTables:GetTableValue( "minor_ability_upgrades", tostring( self:GetParent():GetPlayerOwnerID() ) ) + end + + local szAbilityName = params.ability:GetAbilityName() + local nSpecialLevel = params.ability_special_level + if hUpgrades == nil or hUpgrades[ szAbilityName ] == nil or nSpecialLevel == nil then + return 0 + end + + local flResult = 0 + local CooldownUpgrades = hUpgrades[ szAbilityName ][ "cooldown" ] + if CooldownUpgrades ~= nil then + if self.bDirty == false and CooldownUpgrades[ "cached_result" ] ~= nil and CooldownUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ] ~= nil and CooldownUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ][ nSpecialLevel ] ~= nil then + return CooldownUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ][ nSpecialLevel ] + end + + for _,Upgrade in pairs ( CooldownUpgrades ) do + if Upgrade[ "operator" ] == MINOR_ABILITY_UPGRADE_OP_ADD then + flResult = flResult + Upgrade[ "value" ] + end + end + + self:EnsureCachedResult( CooldownUpgrades ) + CooldownUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ][ nSpecialLevel ] = flResult + return flResult + end + return flResult +end + +----------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:GetModifierPercentageCooldown( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local hUpgrades = self:GetParent().MinorAbilityUpgrades + if hUpgrades == nil then + hUpgrades = CustomNetTables:GetTableValue( "minor_ability_upgrades", tostring( self:GetParent():GetPlayerOwnerID() ) ) + end + + local szAbilityName = params.ability:GetAbilityName() + local nSpecialLevel = params.ability_special_level + if hUpgrades == nil or hUpgrades[ szAbilityName ] == nil or nSpecialLevel == nil then + return 0 + end + + local flResult = 0.0 + local CooldownUpgrades = hUpgrades[ szAbilityName ][ "cooldown" ] + if CooldownUpgrades ~= nil then + if self.bDirty == false and CooldownUpgrades[ "cached_result" ] ~= nil and CooldownUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_MUL ] ~= nil and CooldownUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_MUL ][ nSpecialLevel ] ~= nil then + return CooldownUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_MUL ][ nSpecialLevel ] + end + + flResult = 1.0 + + for _,Upgrade in pairs ( CooldownUpgrades ) do + if Upgrade[ "operator" ] == MINOR_ABILITY_UPGRADE_OP_MUL then + flResult = flResult * ( 1.0 - ( Upgrade[ "value" ] / 100.0 ) ) + end + end + + flResult = ( 1.0 - flResult ) * 100 + + --print( "cooldown result:" .. flResult ) + + self:EnsureCachedResult( CooldownUpgrades ) + CooldownUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_MUL ][ nSpecialLevel ] = flResult + self.bDirty = false + end + return flResult +end + +----------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:GetModifierManacostReduction_Constant( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local hUpgrades = self:GetParent().MinorAbilityUpgrades + if hUpgrades == nil then + hUpgrades = CustomNetTables:GetTableValue( "minor_ability_upgrades", tostring( self:GetParent():GetPlayerOwnerID() ) ) + end + + local szAbilityName = params.ability:GetAbilityName() + local nSpecialLevel = params.ability_special_level + if hUpgrades == nil or hUpgrades[ szAbilityName ] == nil or nSpecialLevel == nil then + return 0 + end + + local flResult = 0 + local ManaCostUpgrades = hUpgrades[ szAbilityName ][ "mana_cost" ] + if ManaCostUpgrades ~= nil then + if self.bDirty == false and ManaCostUpgrades[ "cached_result" ] ~= nil and ManaCostUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ] ~= nil and ManaCostUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ][ nSpecialLevel ] ~= nil then + -- if IsServer() then + -- print( "S: cached result for:" .. "mana_cost" .. " at " .. nSpecialLevel ) + -- PrintTable( ManaCostUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ], "SSS: " ) + -- else + -- print( "C: cached result for:" .. "mana_cost" .. " at " .. nSpecialLevel ) + -- PrintTable( ManaCostUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ], "CCC: " ) + -- end + --print( "CACHED VALUE for " .. szAbilityName .. ":" .. ManaCostUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ][ nSpecialLevel ] ) + return ManaCostUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ][ nSpecialLevel ] + end + + for _,Upgrade in pairs ( ManaCostUpgrades ) do + if Upgrade[ "operator" ] == MINOR_ABILITY_UPGRADE_OP_ADD then + flResult = flResult + Upgrade[ "value" ] + end + end + + self:EnsureCachedResult( ManaCostUpgrades ) + ManaCostUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_ADD ][ nSpecialLevel ] = flResult + + self.bDirty = false + end + --print( "First run of func: " .. flResult ) + return flResult +end + +----------------------------------------------------------------------- + +function modifier_minor_ability_upgrades:GetModifierPercentageManacostStacking( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local hUpgrades = self:GetParent().MinorAbilityUpgrades + if hUpgrades == nil then + hUpgrades = CustomNetTables:GetTableValue( "minor_ability_upgrades", tostring( self:GetParent():GetPlayerOwnerID() ) ) + end + + + local szAbilityName = params.ability:GetAbilityName() + local nSpecialLevel = params.ability_special_level + if hUpgrades == nil or hUpgrades[ szAbilityName ] == nil or nSpecialLevel == nil then + return 0 + end + + if nSpecialLevel == nil then + print( "** Missing special level for " .. szAbilityName ) + return 0 + end + + local flResult = 0 + local ManaCostUpgrades = hUpgrades[ szAbilityName ][ "mana_cost" ] + if ManaCostUpgrades ~= nil then + if self.bDirty == false and ManaCostUpgrades[ "cached_result" ] ~= nil and ManaCostUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_MUL ] ~= nil and ManaCostUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_MUL ][ nSpecialLevel ] ~= nil then + return ManaCostUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_MUL ][ nSpecialLevel ] + end + + flResult = 1.0 + + for _,Upgrade in pairs ( ManaCostUpgrades ) do + if Upgrade[ "operator" ] == MINOR_ABILITY_UPGRADE_OP_MUL then + flResult = flResult * ( 1.0 - ( Upgrade[ "value" ] / 100.0 ) ) + end + end + + flResult = ( 1.0 - flResult ) * 100 + --print( "mana cost result:" .. flResult ) + self:EnsureCachedResult( ManaCostUpgrades ) + ManaCostUpgrades[ "cached_result" ][ MINOR_ABILITY_UPGRADE_OP_MUL ][ nSpecialLevel ] = flResult + self.bDirty = false + end + return flResult +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_monster_leash.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_monster_leash.lua new file mode 100755 index 0000000..fc750f0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_monster_leash.lua @@ -0,0 +1,79 @@ +LinkLuaModifier( "modifier_detect_invisible", "modifiers/modifier_detect_invisible", LUA_MODIFIER_MOTION_NONE ) + +modifier_monster_leash = class({}) + +-------------------------------------------------------------------------------- + +function modifier_monster_leash:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_monster_leash:IsPermanent() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_monster_leash:OnCreated( kv ) + if IsServer() then + self.flKillStartTime = -1 + self.bAddedGem = false + + self.bProvideVision = false + self.fProvideVisionTime = 240 + + self:StartIntervalThink( 0.01 ) + end +end + +----------------------------------------------------------------------- + +function modifier_monster_leash:OnIntervalThink() + + local hEncounter = self:GetParent().Encounter + if hEncounter == nil then + self:Destroy() + return + end + + -- Check to see if we want to add a gem as counter-invisibility + if self.bAddedGem == false and self:GetParent():IsConsideredHero() and + hEncounter:HasStarted() == true and ( ( GameRules:GetGameTime() - hEncounter:GetStartTime() ) > 150 ) then + self.bAddedGem = true + self:GetParent():AddNewModifier( self:GetParent(), nil, "modifier_detect_invisible", {} ) + end + + -- Provide vision if the room has gone on for too long - helps to protect against enemies getting lost or stuck + if self.bProvideVision == false and + hEncounter:HasStarted() == true and ( ( GameRules:GetGameTime() - hEncounter:GetStartTime() ) > self.fProvideVisionTime ) then + + self.bProvideVision = true + self:GetParent():AddNewModifier( thisEntity, nil, "modifier_provide_vision", { duration = -1 } ) + end + + local vOrigin = self:GetParent():GetAbsOrigin() + local vClampedPos = hEncounter:GetRoom():ClampPointToRoomBounds( vOrigin, 128.0 ) + if vOrigin ~= vClampedPos then + FindClearSpaceForUnit( self:GetParent(), vClampedPos, true ) + end + + if vOrigin.z > -1000 then + self.flKillStartTime = -1 + return + end + + if self.flKillStartTime < 0 then + self.flKillStartTime = GameRules:GetGameTime() + end + + --print ("killcountdown = ", self.killcountdown ) + -- only kill the unit if they are in a bad position for 3 seconds, + -- to make sure it's not a weird flying unit thing that is actually behaving legally. + if ( GameRules:GetGameTime() - self.flKillStartTime ) >= 3 then + SendToServerConsole( "say *** KILLING ROGUE UNIT " .. self:GetParent():GetUnitName() .. " at " .. tostring( vOrigin ) ) + self:GetParent():ForceKill( false ) + end + +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_morty_leash.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_morty_leash.lua new file mode 100755 index 0000000..7b8a194 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_morty_leash.lua @@ -0,0 +1,58 @@ + +modifier_morty_leash = class({}) + +-------------------------------------------------------------------------------- + +function modifier_morty_leash:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_morty_leash:IsPermanent() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_morty_leash:RemoveOnDeath() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_morty_leash:OnCreated( kv ) + if IsServer() then + self.flMinX = kv.min_x + self.flMinY = kv.min_y + self.flMaxX = kv.max_x + self.flMaxY = kv.max_y + self:StartIntervalThink( 0.01 ) + end +end + +----------------------------------------------------------------------- + +function modifier_morty_leash:OnIntervalThink() + + local vCurrentPos = self:GetParent():GetAbsOrigin() + local vClamped = Vector( vCurrentPos.x, vCurrentPos.y, vCurrentPos.z ) + + if vClamped.x < self.flMinX then + vClamped.x = self.flMinX + elseif vClamped.x > self.flMaxX then + vClamped.x = self.flMaxX + end + + if vClamped.y < self.flMinY then + vClamped.y = self.flMinY + elseif vClamped.y > self.flMaxY then + vClamped.y = self.flMaxY + end + + if vCurrentPos ~= vClamped then + --print( "Flying Teleporting to " .. tostring( vClamped ) ) + FindClearSpaceForUnit( self:GetParent(), vClamped, true ) + end + +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_move_speed_unslowable.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_move_speed_unslowable.lua new file mode 100755 index 0000000..5f500ea --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_move_speed_unslowable.lua @@ -0,0 +1,72 @@ + +modifier_move_speed_unslowable = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_move_speed_unslowable:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_move_speed_unslowable:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_move_speed_unslowable:OnCreated( kv ) + + -- Allow units to directly use this modifier, in which case the kv has the amount of reduction + if self:GetAbility() == nil and IsServer() == true then + self.move_speed_reduction_pct = 0 + if kv.move_speed_reduction_pct ~= nil then + self.move_speed_reduction_pct = kv.move_speed_reduction_pct + if self.move_speed_reduction_pct ~= 0 then + self:SetHasCustomTransmitterData( true ) + end + end + end + + self:OnRefresh( kv ) +end + +---------------------------------------- + +function modifier_move_speed_unslowable:OnRefresh( kv ) + if self:GetAbility() ~= nil then + self.move_speed_reduction_pct = self:GetAbility():GetSpecialValueFor( "move_speed_reduction_pct" ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_move_speed_unslowable:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_REDUCTION_PERCENTAGE, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_move_speed_unslowable:GetModifierMoveSpeedReductionPercentage( params ) + return self.move_speed_reduction_pct +end + +-------------------------------------------------------------------------------- + +function modifier_move_speed_unslowable:AddCustomTransmitterData( ) + return + { + armor = self.move_speed_reduction_pct + } +end + +-------------------------------------------------------------------------------- + +function modifier_move_speed_unslowable:HandleCustomTransmitterData( data ) + self.move_speed_reduction_pct = data.armor +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_pango_bonus.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_pango_bonus.lua new file mode 100755 index 0000000..8efeb1a --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_pango_bonus.lua @@ -0,0 +1,38 @@ +modifier_pango_bonus = class({}) + +-------------------------------------------------------------------------------- + +function modifier_pango_bonus:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_pango_bonus:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_pango_bonus:GetPriority() + return MODIFIER_PRIORITY_ULTRA + 10001 +end + +-------------------------------------------------------------------------------- + +function modifier_pango_bonus:CheckState() + local state = {} + + if IsServer() then + local hModifier = self:GetParent():FindModifierByName( "modifier_pangolier_gyroshell" ) + state[MODIFIER_STATE_SILENCED] = ( hModifier ~= nil ) + state[MODIFIER_STATE_MUTED] = true + state[MODIFIER_STATE_IGNORING_STOP_ORDERS] = true + state[MODIFIER_STATE_IGNORING_MOVE_AND_ATTACK_ORDERS] = ( hModifier == nil ) + state[MODIFIER_STATE_MAGIC_IMMUNE] = false + end + + return state +end + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_passive_autocast.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_passive_autocast.lua new file mode 100755 index 0000000..1fc37ad --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_passive_autocast.lua @@ -0,0 +1,269 @@ + +require( "utility_functions" ) + +modifier_passive_autocast = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_passive_autocast:IsHidden() + return true +end + +----------------------------------------------------------------------------------------- + +function modifier_passive_autocast:IsPurgable() + return false +end + +----------------------------------------------------------------------------------------- + +function modifier_passive_autocast:OnCreated( kv ) + if IsServer() then + self.nCastBehavior = kv[ "cast_behavior" ] + self.nTargetType = kv[ "target_type" ] + self.flHealthPercent = kv[ "health_percent" ] + self.nRange = kv[ "range" ] + self.flNextCastTime = GameRules:GetGameTime() + + -- If waiting for CD, then don't cast immediately + if self.nCastBehavior == ASCENSION_CAST_WHEN_COOLDOWN_READY then + local flCooldownTime = self:GetAbility():GetCooldownTimeRemaining() + if flCooldownTime > 0 then + self.flNextCastTime = GameRules:GetGameTime() + flCooldownTime + RandomFloat( 0.1, 1.0 ); + else + self.flNextCastTime = GameRules:GetGameTime() + RandomFloat( 1.0, 3.0 ); + end + end + + --print( "modifier_passive_autocast created " .. self:GetParent():GetUnitName() .. " " .. self:GetAbility():GetAbilityName() .. " " .. self.nCastBehavior .. " " .. self.nTargetType ) + + if self.nCastBehavior == ASCENSION_CAST_WHEN_COOLDOWN_READY or + self.nCastBehavior == ASCENSION_CAST_ON_LOW_HEALTH or + self.nCastBehavior == ASCENSION_CAST_ON_NEARBY_ENEMY + then + self:StartIntervalThink( 0.1 ) + elseif self.nCastBehavior == ASCENSION_CAST_ON_DEATH then + if bitand( self:GetAbility():GetBehavior(), DOTA_ABILITY_BEHAVIOR_UNRESTRICTED ) == 0 then + print( "*** WARNING: OnDeath behaviors must have DOTA_ABILITY_BEHAVIOR_UNRESTRICTED set " .. self:GetAbility():GetAbilityName() ) + end + end + + if self.nTargetType == ASCENSION_TARGET_NO_TARGET then + if bitand( self:GetAbility():GetBehavior(), DOTA_ABILITY_BEHAVIOR_UNIT_TARGET ) ~= 0 then + self.nTargetType = ASCENSION_TARGET_RANDOM_PLAYER + print( "*** WARNING: DOTA_ABILITY_BEHAVIOR_UNIT_TARGET didn't specify a target type " .. self:GetAbility():GetAbilityName() ) + end + end + + end +end + +-------------------------------------------------------------------------------- + +function modifier_passive_autocast:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_DEATH, + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + return funcs +end + +----------------------------------------------------------------------------------------- + +function modifier_passive_autocast:GetAttributes() + -- Needed because we may have many ascension abilities on the same unit + -- and we need one passive_autocast modifier per ability + return MODIFIER_ATTRIBUTE_MULTIPLE +end + + -------------------------------------------------------------------------------- + +function modifier_passive_autocast:OnTakeDamage( params ) + if IsServer() == false then + return 0 + end + + if params.unit ~= self:GetParent() then + return 0 + end + + if self.nCastBehavior ~= ASCENSION_CAST_ON_TAKE_MAGIC_DAMAGE then + return 0 + end + + if params.damage_type ~= DAMAGE_TYPE_MAGICAL then + return 0 + end + + self:CastModifierAbility( params.attacker ) + return 0 +end + +----------------------------------------------------------------------------------------- + +function modifier_passive_autocast:OnIntervalThink() + + if not IsServer() then + return + end + + local hCaster = self:GetCaster() + if hCaster == nil then + return + end + + if self.flNextCastTime < 0 or self.flNextCastTime > GameRules:GetGameTime() then + return + end + + if self.nCastBehavior == ASCENSION_CAST_ON_LOW_HEALTH then + if hCaster:GetHealthPercent() > self.flHealthPercent then + return + end + end + + -- For CAST ON NEARBY ENEMY, check for enemies within range + if self.nCastBehavior == ASCENSION_CAST_ON_NEARBY_ENEMY then + local vecEnemies = FindUnitsInRadius( hCaster:GetTeamNumber(), hCaster:GetAbsOrigin(), + nil, self.nRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, + DOTA_UNIT_TARGET_FLAG_INVULNERABLE, 0, false ) + if #vecEnemies == 0 then + return + end + end + + -- Specifically for firefily + wave blaster, wait until leap + if self:GetAbility():GetAbilityName() == "aghsfort_ascension_firefly" then + if hCaster:GetUnitName() == "npc_dota_creature_wave_blaster" then + if hCaster:FindModifierByName( "modifier_aghsfort_waveblaster_leap" ) == nil then + return + end + end + end + + self:CastModifierAbility( nil ) + +end + +----------------------------------------------------------------------------------------- + +function modifier_passive_autocast:SelectClumpedPlayer() + + local vecPlayers = GetAliveHeroesInRoom( ) + local hBestTarget = nil + local flClumpAmount = 1000000000 + + for i=1,#vecPlayers do + local hTarget = vecPlayers[i] + local flDist = 0 + for j=1,#vecPlayers do + if i~=j then + local flCurDist = ( hTarget:GetAbsOrigin() - vecPlayers[j]:GetAbsOrigin() ):Length2D() + if self.nRange ~= nil and flCurDist > self.nRange then + flCurDist = self.nRange + end + flDist = flDist + flCurDist + end + end + if flDist < flClumpAmount then + hBestTarget = hTarget + flClumpAmount = flDist + end + end + return hBestTarget + +end + +----------------------------------------------------------------------------------------- + +function modifier_passive_autocast:CastModifierAbility( hAttackerUnit ) + + if self.flNextCastTime < 0 or self.flNextCastTime > GameRules:GetGameTime() then + return + end + + if self:GetAbility() == nil or self:GetAbility():IsFullyCastable() == false then + return + end + + local hCaster = self:GetCaster() + if hCaster == nil then + return + end + + -- NOTE: This is a little tricky. We're trying to completely avoid using + -- orders / behaviors for the passive so it doesn't interrupt normal AI behavior + -- However, for dummy casters, it's no problem since we know those are the + -- global encounter entity used for environmental effects so there's nothing to interrupt + + local bIsDummyCaster = hCaster:GetUnitName() == "npc_dota_dummy_caster" + local nBehavior = self:GetAbility():GetBehavior() + + --print( "modifier_passive_autocast cooldown-based cast " .. self:GetParent():entindex() .. " " .. self:GetParent():GetUnitName() .. " " .. self:GetAbility():GetAbilityName() ) + + if bitand( nBehavior, DOTA_ABILITY_BEHAVIOR_CHANNELLED ) ~= 0 then + + if not bIsDummyCaster then + print( "*** WARNING: Channeled behaviors cannot be autocast from normal units " .. self:GetAbility():GetAbilityName() ) + return + end + + ExecuteOrderFromTable({ + UnitIndex = hCaster:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = self:GetAbility():entindex(), + Queue = false, + }) + + else + + local hTarget = nil + if self.nTargetType == ASCENSION_TARGET_RANDOM_PLAYER then + local vecPlayers = GetAliveHeroes( ) + local nPlayerCount = #vecPlayers + if nPlayerCount > 0 then + local nPlayer = math.random( 1, nPlayerCount ) + hTarget = vecPlayers[nPlayer] + end + elseif self.nTargetType == ASCENSION_TARGET_CLUMPED_PLAYER then + hTarget = self:SelectClumpedPlayer() + elseif self.nTargetType == ASCENSION_TARGET_ATTACKER then + hTarget = hAttackerUnit + end + + if hTarget == nil and self.nTargetType ~= ASCENSION_TARGET_NO_TARGET then + return + end + + hCaster:SetCursorCastTarget( hTarget ) + self:GetAbility():CastAbility() + + end + + if self.nCastBehavior ~= ASCENSION_CAST_ON_LOW_HEALTH then + local flCooldown = self:GetAbility():GetEffectiveCooldown( -1 ) + self.flNextCastTime = GameRules:GetGameTime() + flCooldown + RandomFloat( 0.01, 1.0 ) + else + -- Cast on low health only gets to cast once + self.flNextCastTime = -1 + end + +end + +-------------------------------------------------------------------------------- + +function modifier_passive_autocast:OnDeath( params ) + if IsServer() then + if self.nCastBehavior == ASCENSION_CAST_ON_DEATH then + local hUnit = params.unit + if hUnit:entindex() == self:GetParent():entindex() then + --print( "modifier_passive_autocast death-based cast " .. self:GetParent():GetUnitName() .. " " .. self:GetAbility():GetAbilityName() ) + self:GetAbility():EndCooldown() + self.flNextCastTime = GameRules:GetGameTime() + self:CastModifierAbility( params.attacker ) + end + end + end +end + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_player_light.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_player_light.lua new file mode 100755 index 0000000..2c854c1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_player_light.lua @@ -0,0 +1,26 @@ + +modifier_player_light = class({}) + +-------------------------------------------------------------------------------- + +--[[ +function modifier_player_light:GetEffectName() + return "particles/addons_gameplay/player_deferred_light.vpcf" +end +]] + +-------------------------------------------------------------------------------- + +function modifier_player_light:OnCreated( kv ) + if IsServer() then + local hPlayerHero = self:GetParent() + if hPlayerHero ~= nil then + local nLightParticleID = ParticleManager:CreateParticle( "particles/addons_gameplay/player_deferred_light.vpcf", PATTACH_ABSORIGIN_FOLLOW, hPlayerHero ) + ParticleManager:SetParticleControlEnt( nLightParticleID, PATTACH_ABSORIGIN_FOLLOW, hPlayerHero, PATTACH_ABSORIGIN_FOLLOW, "attach_hitloc", hPlayerHero:GetAbsOrigin(), true ) + hPlayerHero.nLightParticleID = nLightParticleID + end + end +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_provides_fow_position.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_provides_fow_position.lua new file mode 100755 index 0000000..0284c6c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_provides_fow_position.lua @@ -0,0 +1,33 @@ + +modifier_provides_fow_position = class({}) + +-------------------------------------------------------------------------------- + +function modifier_provides_fow_position:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_provides_fow_position:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_provides_fow_position:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_PROVIDES_FOW_POSITION, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_provides_fow_position:GetModifierProvidesFOWVision( params ) + return 1 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_respawn_haste.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_respawn_haste.lua new file mode 100755 index 0000000..2237510 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_respawn_haste.lua @@ -0,0 +1,48 @@ + +modifier_respawn_haste = class({}) + +----------------------------------------------------------------------------------------- + +function modifier_respawn_haste:IsPurgable() + return false +end + +---------------------------------------- + +function modifier_respawn_haste:OnCreated( kv ) + self:OnRefresh( kv ) + + self.min_move_speed = kv.min_move_speed + self.bonus_attack_speed = kv.bonus_attack_speed + + EmitSoundOn( "DOTA_Item.MaskOfMadness.Activate", self:GetParent() ) +end + +-------------------------------------------------------------------------------- + +function modifier_respawn_haste:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE_MIN, + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_respawn_haste:GetEffectName() + return "particles/items2_fx/mask_of_madness.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_respawn_haste:GetModifierMoveSpeed_AbsoluteMin( params ) + return self.min_move_speed +end + +-------------------------------------------------------------------------------- + +function modifier_respawn_haste:GetModifierAttackSpeedBonus_Constant( params ) + return self.bonus_attack_speed +end diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ride_morty.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ride_morty.lua new file mode 100755 index 0000000..e805bb4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_ride_morty.lua @@ -0,0 +1,117 @@ + +modifier_ride_morty = class({}) + +---------------------------------------------------------------------------------- + +function modifier_ride_morty:IsHidden() + return true +end + +---------------------------------------------------------------------------------- + +function modifier_ride_morty:IsPurgable() + return false +end + +----------------------------------------------------------------------- + +function modifier_ride_morty:GetOverrideAnimation( params ) + return ACT_DOTA_FLAIL +end + +---------------------------------------------------------------------------------- + +function modifier_ride_morty:OnCreated( kv ) + if IsServer() then + if self:ApplyHorizontalMotionController() == false or self:ApplyVerticalMotionController() == false then + self:Destroy() + return + end + end +end + + +-------------------------------------------------------------------------------- + +function modifier_ride_morty:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ANIMATION, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_ride_morty:CheckState() + local state = + { + [ MODIFIER_STATE_INVULNERABLE ] = true, + [ MODIFIER_STATE_NO_HEALTH_BAR ] = true, + [ MODIFIER_STATE_SILENCED ] = true, + [ MODIFIER_STATE_UNSELECTABLE ] = true, + [ MODIFIER_STATE_COMMAND_RESTRICTED ] = true, + } + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_ride_morty:UpdateHorizontalMotion( me, dt ) + if IsServer() then + if self:GetCaster() then + me:SetAbsOrigin( self:GetCaster():GetAbsOrigin() ) + + local MortyAngles = self:GetCaster():GetAngles() + me:SetAbsAngles( MortyAngles.x, MortyAngles.y, MortyAngles.z ) + end + end +end + + +-------------------------------------------------------------------------------- + +function modifier_ride_morty:UpdateVerticalMotion( me, dt ) + if IsServer() then + if self:GetCaster() then + + local vPos = self:GetCaster():GetAbsOrigin() + vPos.z = vPos.z + 50 + me:SetAbsOrigin( vPos ) + end + end +end + + +-------------------------------------------------------------------------------- + +function modifier_ride_morty:OnDestroy() + if IsServer() then + self:GetParent():RemoveHorizontalMotionController( self ) + self:GetParent():RemoveVerticalMotionController( self ) + end +end + + +-------------------------------------------------------------------------------- + +function modifier_ride_morty:OnHorizontalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + + +-------------------------------------------------------------------------------- + +function modifier_ride_morty:OnVerticalMotionInterrupted() + if IsServer() then + self:Destroy() + end +end + + + + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_room_monster_sleep.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_room_monster_sleep.lua new file mode 100755 index 0000000..78d019c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_room_monster_sleep.lua @@ -0,0 +1,103 @@ + +modifier_room_monster_sleep = class({}) + +-------------------------------------------------------------------------------- + +function modifier_room_monster_sleep:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_room_monster_sleep:OnCreated( kv ) + if IsServer() then + self.iWakeRange = 500 + self:StartIntervalThink( 1 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_room_monster_sleep:CheckState() + local state = {} + if IsServer() then + state[MODIFIER_STATE_ROOTED] = true + state[MODIFIER_STATE_BLIND] = true + state[MODIFIER_STATE_STUNNED] = true + state[MODIFIER_STATE_SILENCED] = true + end + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_room_monster_sleep:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_ATTACKED, + MODIFIER_EVENT_ON_TAKEDAMAGE, + } + return funcs +end + +----------------------------------------------------------------------- +function modifier_room_monster_sleep:GetEffectName() + return "particles/generic_gameplay/generic_sleep.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_room_monster_sleep:GetEffectAttachType() + return PATTACH_OVERHEAD_FOLLOW +end +-------------------------------------------------------------------------------- + +function modifier_room_monster_sleep:OnAttacked( params ) + if IsServer() then + if params.target == self:GetParent() then + self:Destroy() + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_room_monster_sleep:OnTakeDamage( params ) + if IsServer() then + if params.unit == self:GetParent() then + self:Destroy() + end + end + + return 0 +end +----------------------------------------------------------------------------- + +function modifier_room_monster_sleep:OnIntervalThink() + if IsServer() then + local hEnemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), nil, self.iWakeRange, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_CREEP, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_CLOSEST, false ) + if #hEnemies > 0 then + self:Destroy() + end + + end +end + + +-------------------------------------------------------------------------------- + +function modifier_room_monster_sleep:OnDestroy() + if not IsServer() then + return + end + + local hAllies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, FIND_CLOSEST, false ) + for _, hAlly in pairs( hAllies ) do + if hAlly:HasModifier( "modifier_room_monster_sleep" ) then + hAlly:RemoveModifierByName( "modifier_room_monster_sleep" ) + end + end +end + +-------------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_crash.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_crash.lua new file mode 100755 index 0000000..ad74381 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_crash.lua @@ -0,0 +1,57 @@ + +modifier_sled_penguin_crash = class({}) + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_crash:IsHidden() + return true +end + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_crash:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_crash:OnCreated( kv ) + if IsServer() then + self.reset_pos_offset = self:GetAbility():GetSpecialValueFor( "reset_pos_offset" ) + + local vForward = self:GetCaster():GetForwardVector() + self.vResetPos = self:GetCaster():GetAbsOrigin() - ( vForward * self.reset_pos_offset ) + + self:GetCaster():RemoveGesture( ACT_DOTA_IDLE ) + self:GetCaster():RemoveGesture( ACT_DOTA_SLIDE_LOOP ) + self:GetCaster():StartGesture( ACT_DOTA_DIE ) + + EmitSoundOn( "SledPenguin.Crash.Impact", self:GetParent() ) + EmitSoundOn( "SledPenguin.Crash.Ow", self:GetParent() ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_crash:OnDestroy() + if IsServer() then + self:GetCaster():SetForwardVector( self:GetCaster():GetForwardVector() * -1 ) + + self:GetCaster():SetAbsOrigin( self.vResetPos ) + + --self:GetCaster():StartGesture( ACT_DOTA_IDLE ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_crash:CheckState() + local state = + { + [ MODIFIER_STATE_STUNNED ] = true, + } + + return state +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_impairment.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_impairment.lua new file mode 100755 index 0000000..5962448 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_impairment.lua @@ -0,0 +1,34 @@ + +modifier_sled_penguin_impairment = class({}) + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_impairment:IsHidden() + return true +end + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_impairment:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_impairment:GetEffectName() + return "particles/units/heroes/hero_brewmaster/brewmaster_drunken_haze_debuff.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_impairment:GetStatusEffectName() + return "particles/status_fx/status_effect_brewmaster_drunken_haze.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_impairment:StatusEffectPriority() + return 50 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_movement.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_movement.lua new file mode 100755 index 0000000..d2c6e9b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_movement.lua @@ -0,0 +1,301 @@ + +modifier_sled_penguin_movement = class({}) + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_movement:IsHidden() + return true +end + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_movement:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + + +function modifier_sled_penguin_movement:GetModifierDisableTurning( params ) + return 1 +end + +----------------------------------------------------------------------- + +function modifier_sled_penguin_movement:GetOverrideAnimation( params ) + if self:GetParent() ~= self:GetCaster() then + return ACT_DOTA_FLAIL + end + + return ACT_DOTA_SLIDE_LOOP +end + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_movement:OnCreated( kv ) + if IsServer() then + self.max_sled_speed = self:GetAbility():GetSpecialValueFor( "max_sled_speed" ) + self.speed_step = self:GetAbility():GetSpecialValueFor( "speed_step" ) + self.tree_destroy_radius = self:GetAbility():GetSpecialValueFor( "tree_destroy_radius" ) + self.collision_radius = self:GetAbility():GetSpecialValueFor( "collision_radius" ) + self.reset_pos_offset = self:GetAbility():GetSpecialValueFor( "reset_pos_offset" ) + + self.nCurSpeed = 20 + self.flDesiredYaw = self:GetCaster():GetAnglesAsVector().y + + self.bPlayedVroomSinceLastCrash = false + + if kv.just_crashed ~= nil then + self.speed_step = self.speed_step / 2.0 + self.nCurSpeed = 0 + + local impaired_duration = self:GetAbility():GetSpecialValueFor( "impaired_duration" ) + self:GetParent():AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_sled_penguin_impairment", { duration = impaired_duration } ) + + self:GetParent():StartGesture( ACT_DOTA_DIE ) + + if self:IsParentPenguin() then + FindClearSpaceForUnit( self:GetParent(), self:GetParent():GetAbsOrigin(), true ) + end + end + + if self:ApplyHorizontalMotionController() == false then + self:Destroy() + return + end + + self.fThinkInterval = 0.02 + + self:StartIntervalThink( self.fThinkInterval ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_movement:OnIntervalThink() + if IsServer() then + if self:GetParent():HasModifier( "modifier_sled_penguin_movement" ) and self:GetParent():HasModifier( "modifier_sled_penguin_crash" ) == false then + if self:GetParent():GetUnitName() == "npc_dota_sled_penguin" then + -- Search for any ogre seals to determine if I've crashed into them + local nTargetFlags = DOTA_UNIT_TARGET_FLAG_OUT_OF_WORLD + DOTA_UNIT_TARGET_FLAG_INVULNERABLE + DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + local hEnemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.collision_radius, DOTA_UNIT_TARGET_TEAM_ENEMY, self:GetAbility():GetAbilityTargetType(), nTargetFlags, 0, false ) + for _, hOgreSeal in pairs( hEnemies ) do + if hOgreSeal ~= nil and hOgreSeal:IsNull() == false and ( hOgreSeal:GetUnitName() == "npc_dota_creature_wandering_ogre_seal" ) then + -- Knock ogre seal back + local vLocation = self:GetParent():GetAbsOrigin() + ( self:GetParent():GetForwardVector() * 50 ) + local kv = + { + center_x = vLocation.x, + center_y = vLocation.y, + center_z = vLocation.z, + should_stun = false, + duration = 0.4, + knockback_duration = 0.2, + knockback_distance = 150, + knockback_height = 50, + } + + EmitSoundOn( "OgreTank.Grunt", hOgreSeal ) + + hOgreSeal:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_knockback", kv ) + + self:CrashAndRecover() + return self.fThinkInterval + end + end + end + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_movement:OnDestroy() + if IsServer() then + self:GetParent():RemoveHorizontalMotionController( self ) + if self:IsParentPenguin() then + self:GetCaster():RemoveGesture( ACT_DOTA_SLIDE_LOOP ) + + --StopSoundOn( "SledPenguin.RidingLoop", self:GetParent() ) + + EmitSoundOn( "Hero_Tusk.IceShards.Penguin", self:GetParent() ) + else + -- Apply knockback to player hero + local vLocation = self:GetParent():GetAbsOrigin() + ( self:GetParent():GetForwardVector() * 50 ) + local kv = + { + center_x = vLocation.x, + center_y = vLocation.y, + center_z = vLocation.z, + should_stun = true, + duration = 0.4, + knockback_duration = 0.3, + knockback_distance = 250, + knockback_height = 75, + } + + self:GetParent():AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_knockback", kv ) + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_movement:DeclareFunctions() + local funcs = + { + MODIFIER_PROPERTY_OVERRIDE_ANIMATION, + MODIFIER_EVENT_ON_ORDER, + MODIFIER_PROPERTY_DISABLE_TURNING, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_movement:CheckState() + local state = + { + [ MODIFIER_STATE_STUNNED ] = self:IsParentPenguin(), + [ MODIFIER_STATE_INVULNERABLE ] = self:IsParentPenguin(), + [ MODIFIER_STATE_NO_HEALTH_BAR ] = self:IsParentPenguin(), + + [ MODIFIER_STATE_MUTED ] = self:IsParentPenguin() == false, + [ MODIFIER_STATE_SILENCED ] = self:IsParentPenguin() == false, + } + + return state +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_movement:UpdateHorizontalMotion( me, dt ) + if IsServer() then + + if not self:GetCaster() then + return + end + + if self:IsParentPenguin() then + if self.bStartedLoop == nil and self:GetElapsedTime() > 0.3 then + self.bStartedLoop = true + self:GetCaster():StartGesture( ACT_DOTA_SLIDE_LOOP ) + end + + if self:GetParent().Encounter == nil or self:GetParent().Encounter.bGameStarted == false then + return + end + + local flTurnAmount = 0.0 + local curAngles = self:GetCaster():GetAngles() + + local flAngleDiff = UTIL_AngleDiff( self.flDesiredYaw, curAngles.y ) + + local flTurnRate = 100 + flTurnAmount = flTurnRate * dt + flTurnAmount = math.min( flTurnAmount, math.abs( flAngleDiff ) ) + + if flAngleDiff < 0.0 then + flTurnAmount = flTurnAmount * -1 + end + + if flAngleDiff ~= 0.0 then + curAngles.y = curAngles.y + flTurnAmount + me:SetAbsAngles( curAngles.x, curAngles.y, curAngles.z ) + end + + local vNewPos = self:GetCaster():GetOrigin() + self:GetCaster():GetForwardVector() * ( dt * self.nCurSpeed ) + if GridNav:CanFindPath( me:GetOrigin(), vNewPos ) == false then + self:CrashAndRecover() + return + end + + me:SetOrigin( vNewPos ) + self.nCurSpeed = math.min( self.nCurSpeed + self.speed_step, self.max_sled_speed ) + + if ( self.nCurSpeed >= self.max_sled_speed ) and ( self.bPlayedVroomSinceLastCrash == false ) then + EmitSoundOn( "Frosthaven.Vroom", self:GetParent() ) + self.bPlayedVroomSinceLastCrash = true + + self.nHasteFXIndex = ParticleManager:CreateParticle( "particles/generic_gameplay/rune_haste.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() ) + end + else + if self:GetCaster():IsAlive() == false or self:GetCaster():FindModifierByName( "modifier_sled_penguin_movement" ) == nil then + self:Destroy() + return + end + me:SetOrigin( self:GetCaster():GetOrigin() ) + local casterAngles = self:GetCaster():GetAngles() + me:SetAbsAngles( casterAngles.x, casterAngles.y, casterAngles.z ) + end + + end +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_movement:CrashAndRecover() + GridNav:DestroyTreesAroundPoint( self:GetParent():GetOrigin(), self.tree_destroy_radius, false ) + + -- Start a screenshake with the following parameters: vecCenter, flAmplitude, flFrequency, flDuration, flRadius, eCommand( SHAKE_START = 0, SHAKE_STOP = 1 ), bAirShake + ScreenShake( self:GetParent():GetOrigin(), 10.0, 100.0, 0.5, 1300.0, 0, true ) + + EmitSoundOn( "SledPenguin.Crash.Impact", self:GetParent() ) + EmitSoundOn( "SledPenguin.Crash.Ow", self:GetParent() ) + + if self.nHasteFXIndex then + ParticleManager:DestroyParticle( self.nHasteFXIndex, false ) + end + + local vForward = self:GetParent():GetForwardVector() + self.vResetPos = self:GetParent():GetAbsOrigin() - ( vForward * self.reset_pos_offset ) + + self:GetParent():SetForwardVector( self:GetParent():GetForwardVector() * -1 ) + self:GetParent():SetAbsOrigin( self.vResetPos ) + + self.bPlayedVroomSinceLastCrash = false + + self:Destroy() + + local kv = {} + kv.just_crashed = true + + self:GetParent():AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_sled_penguin_movement", kv ) +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_movement:OnOrder( params ) + if IsServer() then + if not self:GetCaster() then + return 0 + end + + local hOrderedUnit = params.unit + local hTargetUnit = params.target + local nOrderType = params.order_type + if nOrderType == DOTA_UNIT_ORDER_MOVE_TO_POSITION or nOrderType == DOTA_UNIT_ORDER_ATTACK_MOVE then + if hOrderedUnit == self:GetParent() and self:IsParentPenguin() == false then + local vDir = params.new_pos - self:GetCaster():GetOrigin() + vDir.z = 0 + vDir = vDir:Normalized() + local angles = VectorAngles( vDir ) + local hBuff = self:GetCaster():FindModifierByName( "modifier_sled_penguin_movement" ) + if hBuff ~= nil then + hBuff.flDesiredYaw = angles.y + end + end + end + end + + return 0 +end + +-------------------------------------------------------------------------------- + +function modifier_sled_penguin_movement:IsParentPenguin() + return ( self:GetCaster() == self:GetParent() ) +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_passive.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_passive.lua new file mode 100755 index 0000000..7d6c303 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_passive.lua @@ -0,0 +1,117 @@ + +modifier_sled_penguin_passive = class({}) + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_passive:IsHidden() + return true +end + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_passive:IsPurgable() + return false +end + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_passive:OnCreated( kv ) + if IsServer() then + self.hPlayerEnt = nil + self.bRideComplete = false + self.bRideStarted = false + end +end + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_passive:DeclareFunctions() + local funcs = + { + MODIFIER_EVENT_ON_ORDER, + } + + return funcs +end + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_passive:CheckState() + local state = + { + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + } + return state +end + + +----------------------------------------------------------------------- + +function modifier_sled_penguin_passive:OnOrder( params ) + if IsServer() then + local hOrderedUnit = params.unit + local hTargetUnit = params.target + local nOrderType = params.order_type + if nOrderType ~= DOTA_UNIT_ORDER_MOVE_TO_TARGET then + return + end + + if hTargetUnit == nil or hTargetUnit ~= self:GetParent() then + return + end + + if hOrderedUnit ~= nil and hOrderedUnit:IsRealHero() and hOrderedUnit:GetTeamNumber() == DOTA_TEAM_GOODGUYS and hTargetUnit:GetOwnerEntity() == hOrderedUnit then + self.hPlayerEnt = hOrderedUnit + self:StartIntervalThink( 0.25 ) + return + end + + self:StartIntervalThink( -1 ) + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_sled_penguin_passive:OnDestroy() + if IsServer() then + if self.hPlayerEnt ~= nil and self.hPlayerEnt:IsNull() == false then + self.hPlayerEnt:RemoveModifierByName( "modifier_sled_penguin_movement" ) + end + + UTIL_Remove( self:GetParent() ) + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_sled_penguin_passive:OnIntervalThink() + if IsServer() then + if self.hPlayerEnt ~= nil then + local flTalkDistance = 250.0 + if flTalkDistance >= ( self.hPlayerEnt:GetOrigin() - self:GetParent():GetOrigin() ):Length2D() then + if GameRules.Aghanim ~= nil and self.bRideStarted == false then + self.hPlayerEnt:Interrupt() + + self:StartIntervalThink( -1 ) + self.bRideStarted = true + + EmitSoundOn( "SledPenguin.PlayerHopOn", self:GetParent() ) + + self:GetParent():AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_sled_penguin_movement", {} ) + self.hPlayerEnt:AddNewModifier( self:GetParent(), self:GetAbility(), "modifier_sled_penguin_movement", {} ) + + if self:GetParent().Encounter ~= nil then + self:GetParent().Encounter:OnPlayerRidePenguin( self.hPlayerEnt:GetPlayerOwnerID(), self:GetParent() ) + end + + end + end + end + end +end + +--------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_timed_removal.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_timed_removal.lua new file mode 100755 index 0000000..e1552d0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_sled_penguin_timed_removal.lua @@ -0,0 +1,24 @@ + +modifier_sled_penguin_timed_removal = class({}) + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_timed_removal:IsHidden() + return true +end + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_timed_removal:IsPurgable() + return false +end + +---------------------------------------------------------------------------------- + +function modifier_sled_penguin_timed_removal:OnDestroy() + if IsServer() then + self:GetParent():ForceKill( false ) + end +end + +----------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_spike_trap_lua.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_spike_trap_lua.lua new file mode 100755 index 0000000..b523df4 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_spike_trap_lua.lua @@ -0,0 +1,54 @@ +modifier_spike_trap_lua = class({}) + +-------------------------------------------------------------------------------- + +function modifier_spike_trap_lua:IsDebuff() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_spike_trap_lua:IsStunDebuff() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_spike_trap_lua:GetEffectName() + return "particles/generic_gameplay/generic_stunned.vpcf" +end + +-------------------------------------------------------------------------------- + +function modifier_spike_trap_lua:GetEffectAttachType() + return PATTACH_OVERHEAD_FOLLOW +end + +-------------------------------------------------------------------------------- + +function modifier_spike_trap_lua:DeclareFunctions() + local funcs = { + MODIFIER_PROPERTY_OVERRIDE_ANIMATION, + } + + return funcs +end + +-------------------------------------------------------------------------------- + +function modifier_spike_trap_lua:GetOverrideAnimation( params ) + return ACT_DOTA_DISABLED +end + +-------------------------------------------------------------------------------- + +function modifier_spike_trap_lua:CheckState() + local state = { + [MODIFIER_STATE_STUNNED] = true, + } + + return state +end + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_spike_trap_thinker_lua.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_spike_trap_thinker_lua.lua new file mode 100755 index 0000000..a2e115d --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_spike_trap_thinker_lua.lua @@ -0,0 +1,64 @@ +modifier_spike_trap_thinker_lua = class({}) + +-------------------------------------------------------------------------------- + +function modifier_spike_trap_thinker_lua:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_spike_trap_thinker_lua:OnCreated( kv ) + self.light_strike_array_aoe = self:GetAbility():GetSpecialValueFor( "light_strike_array_aoe" ) + self.light_strike_array_damage = self:GetAbility():GetSpecialValueFor( "light_strike_array_damage" ) + self.light_strike_array_stun_duration = self:GetAbility():GetSpecialValueFor( "light_strike_array_stun_duration" ) + self.light_strike_array_delay_time = self:GetAbility():GetSpecialValueFor( "light_strike_array_delay_time" ) + if IsServer() then + self:StartIntervalThink( self.light_strike_array_delay_time ) + + EmitSoundOnLocationForAllies( self:GetParent():GetOrigin(), "Ability.PreLightStrikeArray", self:GetCaster() ) + + --local nFXIndex = ParticleManager:CreateParticleForTeam( "particles/units/heroes/hero_lina/lina_spell_light_strike_array_ray_team.vpcf", PATTACH_WORLDORIGIN, self:GetCaster(), self:GetCaster():GetTeamNumber() ) + --ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + --ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.light_strike_array_aoe, 1, 1 ) ) + --ParticleManager:ReleaseParticleIndex( nFXIndex ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_spike_trap_thinker_lua:OnIntervalThink() + if IsServer() then + GridNav:DestroyTreesAroundPoint( self:GetParent():GetOrigin(), self.light_strike_array_aoe, false ) + local enemies = FindUnitsInRadius( self:GetParent():GetTeamNumber(), self:GetParent():GetOrigin(), self:GetParent(), self.light_strike_array_aoe, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, 0, 0, false ) + if #enemies > 0 then + for _,enemy in pairs(enemies) do + if enemy ~= nil and ( not enemy:IsMagicImmune() ) and ( not enemy:IsInvulnerable() ) then + + local damage = { + victim = enemy, + attacker = self:GetCaster(), + damage = self.light_strike_array_damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + ability = self:GetAbility() + } + + ApplyDamage( damage ) + enemy:AddNewModifier( self:GetCaster(), self:GetAbility(), "modifier_spike_trap_lua", { duration = self.light_strike_array_stun_duration } ) + end + end + end + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_axe/axe_culling_blade.vpcf", PATTACH_WORLDORIGIN, nil ) + ParticleManager:SetParticleControl( nFXIndex, 0, self:GetParent():GetOrigin() ) + ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self.light_strike_array_aoe, 1, 1 ) ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + EmitSoundOnLocationWithCaster( self:GetParent():GetOrigin(), "Creature.SpikedCarapace.Stun", self:GetCaster() ) + + UTIL_Remove( self:GetParent() ) + end +end + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_treasure_chest.lua b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_treasure_chest.lua new file mode 100755 index 0000000..b863e90 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/modifiers/modifier_treasure_chest.lua @@ -0,0 +1,127 @@ + +modifier_treasure_chest = class({}) + +-------------------------------------------------------------------------------- + +function modifier_treasure_chest:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function modifier_treasure_chest:OnCreated( kv ) + if IsServer() then + self:StartIntervalThink( 0.5 ) + end +end + +-------------------------------------------------------------------------------- + +function modifier_treasure_chest:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_ORDER, + MODIFIER_EVENT_ON_TAKEDAMAGE, + MODIFIER_PROPERTY_FIXED_DAY_VISION, + MODIFIER_PROPERTY_FIXED_NIGHT_VISION, + } + return funcs +end + +----------------------------------------------------------------------- + +function modifier_treasure_chest:OnOrder( params ) + if IsServer() then + local hOrderedUnit = params.unit + local hTargetUnit = params.target + local nOrderType = params.order_type + if nOrderType ~= DOTA_UNIT_ORDER_MOVE_TO_TARGET then + return + end + + if hTargetUnit == nil or hTargetUnit ~= self:GetParent() then + return + end + + if hOrderedUnit ~= nil and hOrderedUnit:IsRealHero() and hOrderedUnit:GetTeamNumber() == DOTA_TEAM_GOODGUYS then + self.hPlayerEnt = hOrderedUnit + self:StartIntervalThink( 0.25 ) + return + end + + self:StartIntervalThink( -1 ) + end + + return 0 +end + +----------------------------------------------------------------------- + +function modifier_treasure_chest:OnTakeDamage( params ) + return 0 +end + +----------------------------------------------------------------------- + +function modifier_treasure_chest:OnIntervalThink() + if IsServer() then + if not self.bWasOpened then + if self.hPlayerEnt ~= nil then + local flOpenDistance = 150.0 + if flOpenDistance >= ( self.hPlayerEnt:GetOrigin() - self:GetParent():GetOrigin() ):Length2D() then + if GameRules.Aghanim ~= nil then + self.hPlayerEnt:Interrupt() + self:GetParent():StartGesture( ACT_DOTA_PRESENT_ITEM ) + GameRules.Aghanim:OnTreasureOpen( self.hPlayerEnt, self:GetParent() ) + self.bWasOpened = true + self.hPlayerEnt = nil + + self.fTimeChestOpened = GameRules:GetGameTime() + self:StartIntervalThink( 4 ) + + return -1 + end + end + end + else + self:GetParent():Destroy() + end + end +end + +-------------------------------------------------------------------------------- + +function modifier_treasure_chest:GetFixedDayVision( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_treasure_chest:GetFixedNightVision( params ) + return 1 +end + +-------------------------------------------------------------------------------- + +function modifier_treasure_chest:CheckState() + local state = {} + if IsServer() then + state[MODIFIER_STATE_ATTACK_IMMUNE] = true + state[MODIFIER_STATE_ROOTED] = true + state[MODIFIER_STATE_NO_HEALTH_BAR] = true + state[MODIFIER_STATE_BLIND] = true + state[MODIFIER_STATE_NOT_ON_MINIMAP] = true + state[MODIFIER_STATE_INVULNERABLE] = true + + if self.bWasOpened then + state[MODIFIER_STATE_UNSELECTABLE] = true + + if self.fTimeChestOpened and ( GameRules:GetGameTime() > self.fTimeChestOpened + 2.5 ) then + state[MODIFIER_STATE_NO_UNIT_COLLISION] = true + end + end + end + + return state +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/portalspawner.lua b/aghanim_singleplayer/scripts/vscripts/portalspawner.lua new file mode 100755 index 0000000..dedc294 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/portalspawner.lua @@ -0,0 +1,383 @@ +if CPortalSpawner == nil then + CPortalSpawner = class({}) +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:constructor( szSpawnerNameInput, szLocatorNameInput, nPortalHealthInput, flInitialPortalSpawnDelayInput, flInitialSummonTimeInput, flPortalIntervalInput, flScaleInput, rgUnitsInfoInput ) + self.szSpawnerName = szSpawnerNameInput + self.szLocatorName = szLocatorNameInput + self.rgUnitsInfo = rgUnitsInfoInput + self.nPortalHealth = nPortalHealthInput + self.flInitialPortalSpawnDelay = flInitialPortalSpawnDelayInput + self.flInitialSummonTime = flInitialSummonTimeInput + self.flPortalInterval = flPortalIntervalInput + self.flScale = flScaleInput + + self.nNumSpawnsRemaining = 3 + + self.Encounter = nil + + self.vLocation = nil + self.bHasCreatedPortal = false + self.hPortalEnt = nil + self.flNextSpawnTime = -1.0 + self.nWarningFX = nil +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:GetSpawnerType() + return "CPortalSpawner" +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:Precache( context ) + --print( "CPortalSpawner:Precache called for " .. self.szSpawnerName ) + + PrecacheUnitByNameSync( "npc_aghsfort_dark_portal", context, -1 ) + PrecacheResource( "particle", "particles/units/heroes/heroes_underlord/abyssal_underlord_darkrift_target.vpcf", context ) + PrecacheResource( "particle", "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", context ) + + for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do + PrecacheUnitByNameSync( rgUnitInfo.EntityName, context, -1 ) + end +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:SetLocation( vLocationInput ) + self.vLocation = vLocationInput +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:OnEncounterLoaded( EncounterInput ) + --print( "CPortalSpawner:OnEncounterLoaded called for " .. self.szSpawnerName ) + self.Encounter = EncounterInput + + ListenToGameEvent( "entity_killed", Dynamic_Wrap( CPortalSpawner, 'OnEntityKilled' ), self ) +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:Start( flStartTime ) + self.flNextSpawnTime = GameRules:GetGameTime() + self.flInitialPortalSpawnDelay +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:IsDestroyed() + if self.bHasCreatedPortal == false then + return false + end + + if not self.hPortalEnt or self.hPortalEnt:IsNull() or self.hPortalEnt:IsAlive() == false then + return true + end + + return false +end + +---------------------------------------------------------------------------- +--[[ +function CPortalSpawner:GetSpawnCountPerSpawnPosition() + + local nCount = 0 + for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do + nCount = nCount + rgUnitInfo.Count + end + return nCount + +end +--]] + +---------------------------------------------------------------------------- + +function CPortalSpawner:SpawnSingleUnitType( rgUnitInfo ) + + local hSpawnedUnits = {} + for i=1,rgUnitInfo.Count do + + local vSpawnPos = self.vLocation + if rgUnitInfo.PositionNoise ~= nil then + local nAttempts = 0 + while nAttempts < 16 do + local vTestPos = vSpawnPos + RandomVector( RandomFloat( 0.0, rgUnitInfo.PositionNoise ) ) + vTestPos.z = GetGroundHeight( vTestPos, nil ) + if GridNav:CanFindPath( vTestPos, self.vLocation ) then + vSpawnPos = vTestPos + break + end + nAttempts = nAttempts + 1 + end + end + + local hUnit = CreateUnitByName( rgUnitInfo.EntityName, vSpawnPos, true, nil, nil, rgUnitInfo.Team ) + + if hUnit == nil then + print( "ERROR! Failed to spawn unit named " .. rgUnitInfo.EntityName ) + return nil + else + hUnit.bPortalUnit = true + hUnit:FaceTowards( self.vLocation ) + if rgUnitInfo.PostSpawn ~= nil then + rgUnitInfo.PostSpawn( hUnit ) + end + + local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", PATTACH_CUSTOMORIGIN, hUnit ); + ParticleManager:SetParticleControl( nFXIndex, 0, hUnit:GetAbsOrigin() ); + ParticleManager:SetParticleControlEnt( nFXIndex, 1, hUnit, PATTACH_POINT_FOLLOW, "attach_hitloc", hUnit:GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 2, hUnit, PATTACH_POINT_FOLLOW, "attach_hitloc", hUnit:GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 3, hUnit, PATTACH_POINT_FOLLOW, "attach_hitloc", hUnit:GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( nFXIndex, 4, hUnit, PATTACH_POINT_FOLLOW, "attach_hitloc", hUnit:GetAbsOrigin(), true ) + ParticleManager:ReleaseParticleIndex( nFXIndex ) + + table.insert( hSpawnedUnits, hUnit ) + end + end + + return hSpawnedUnits +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:TrySpawningUnits() + --print( "CPortalSpawner:TrySpawningUnits" ) + + -- Don't spawn if Start() hasn't been called + if self.flNextSpawnTime < 0 then + return + end + + if self.bHasCreatedPortal == false then + local flTimeReaminingToPortalSpawn = self.flNextSpawnTime - GameRules:GetGameTime() + + if flTimeReaminingToPortalSpawn <= 0 then + --print( "Portal named " .. self:GetSpawnerName() .. " spawning portal!" ) + self:SpawnPortal() + end + end + + if self.bHasCreatedPortal == false then + return + end + + if self.hPortalEnt ~= nil and self.hPortalEnt:IsNull() == false and self.hPortalEnt:IsAlive() then + local flTimeRemaining = self.flNextSpawnTime - GameRules:GetGameTime() + --print( "Portal named " .. self:GetSpawnerName() .. " has " .. flTimeRemaining .. " time remaining till spawn." ) + + if flTimeRemaining <= 0 then + --print( "Portal named " .. self:GetSpawnerName() .. " is spawning units!" ) + self:SpawnUnits() + if self.nNumSpawnsRemaining > 0 then + self.flNextSpawnTime = self.flNextSpawnTime + self.flPortalInterval + else + self.flNextSpawnTime = -1 -- disabled from here on out + end + end + + if flTimeRemaining <= 5 and flTimeRemaining > 0 and self.nWarningFX == nil then + --print( "Portal named " .. self:GetSpawnerName() .. " creating warning fx and sounds" ) + + self.nWarningFX = ParticleManager:CreateParticle( "particles/units/heroes/heroes_underlord/abyssal_underlord_darkrift_target.vpcf", PATTACH_OVERHEAD_FOLLOW, self.hPortalEnt ) + ParticleManager:SetParticleControlEnt( self.nWarningFX, 1, self.hPortalEnt, PATTACH_POINT_FOLLOW, "attach_hitloc", self.hPortalEnt:GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( self.nWarningFX, 6, self.hPortalEnt, PATTACH_ABSORIGIN_FOLLOW, nil, self.hPortalEnt:GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( self.nWarningFX, 10, Vector( flTimeRemaining*0.9, flTimeRemaining*0.9, flTimeRemaining*0.9 ) ); + + EmitSoundOn( "Aghsfort_DarkPortal.StartSummon", self.hPortalEnt ) + end + end +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:SpawnUnits() + if self.vLocation == nil then + print( "ERROR - Spawner " .. self.szSpawnerName .. " does not have a valid location!" ) + return + end + + local nSpawned = 0 + + local hSpawnedUnits = {} + + for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do + local hSingleSpawnedUnits = self:SpawnSingleUnitType( rgUnitInfo ) + nSpawned = nSpawned + rgUnitInfo.Count + + for _,hUnit in pairs ( hSingleSpawnedUnits ) do + table.insert( hSpawnedUnits, hUnit ) + end + end + + --printf( "%s spawning %d units", self.szSpawnerName, nSpawned ) + + if self.nWarningFX ~= nil then + ParticleManager:DestroyParticle( self.nWarningFX, false ) + self.nWarningFX = nil + end + + EmitSoundOn( "Aghsfort_DarkPortal.Complete", self.hPortalEnt ) + StopSoundOn( "Aghsfort_DarkPortal.StartSummon", self.hPortalEnt ) + + if #hSpawnedUnits > 0 then + self.Encounter:OnSpawnerFinished( self, hSpawnedUnits ) + end + + self.nNumSpawnsRemaining = self.nNumSpawnsRemaining - 1 + + if self.nNumSpawnsRemaining <= 0 then + self.hPortalEnt:SetSkin( 1 ) + end + +--[[ + if self.nNumSpawnsRemaining <= 0 then + if self.Encounter ~= nil then + local hAttacker = nil + self.Encounter:OnPortalKilled( self.hPortalEnt, hAttacker, 0 ) + end + + self:DestroyPortal( true ) + end +--]] + return hSpawnedUnits +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:SpawnPortal() + --print( "CPortalSpawner:SpawnPortal" ) + + if self.bHasCreatedPortal == true then + print( 'ERROR: Trying to spawn a portal named ' .. self.szSpawnerName .. ' but it has already spawned a portal!') + return + end + + if self.hPortalEnt ~= nil then + print( 'ERROR: Trying to spawn a portal named ' .. self.szSpawnerName .. ' but it already has a portal!') + return + end + + if self.vLocation == nil then + print( 'ERROR: Trying to spawn a portal named ' .. self.szSpawnerName .. ' with a nil location!' ) + return + end + + local portalTable = + { + MapUnitName = "npc_aghsfort_dark_portal", + origin = tostring( self.vLocation.x ) .. " " .. tostring( self.vLocation.y ) .. " " .. tostring( self.vLocation.z ), + StatusHealth = self.nPortalHealth, + teamnumber = DOTA_TEAM_BADGUYS, + modelscale = self.flScale, + } + + self.hPortalEnt = CreateUnitFromTable( portalTable, self.vLocation ) + + self.hPortalEnt:SetTeam( DOTA_TEAM_BADGUYS ) + self.hPortalEnt:RemoveModifierByName( "modifier_invulnerable" ) + + self.hPortalEnt:SetMaxHealth( self.nPortalHealth ) + self.hPortalEnt:SetBaseMaxHealth( self.nPortalHealth ) + self.hPortalEnt:Heal( self.nPortalHealth, nil ) + self.hPortalEnt:AddNewModifier( self.hPortalEnt, nil, "modifier_provide_vision", { duration = -1 } ) + self.hPortalEnt:AddNewModifier( self.hPortalEnt, nil, "modifier_magic_immune", { duration = -1 } ) + self.hPortalEnt:AddNewModifier( self.hPortalEnt, nil, "modifier_phased", { duration = -1 } ) + + self.hPortalEnt:SetAbsScale( self.flScale ) + + self.flNextSpawnTime = GameRules:GetGameTime() + self.flInitialSummonTime + +-- hPortalEnt.nAmbientFX = ParticleManager:CreateParticle( "particles/units/heroes/heroes_underlord/abyssal_underlord_darkrift_target.vpcf", PATTACH_OVERHEAD_FOLLOW, hPortalEnt ) +-- ParticleManager:SetParticleControlEnt( hPortalEnt.nAmbientFX , 1, hPortalEnt, PATTACH_POINT_FOLLOW, "attach_hitloc", hPortalEnt:GetAbsOrigin(), true ) +-- ParticleManager:SetParticleControlEnt( hPortalEnt.nAmbientFX , 6, hPortalEnt, PATTACH_ABSORIGIN_FOLLOW, nil, hPortalEnt:GetAbsOrigin(), true ) +-- ParticleManager:SetParticleControl( hPortalEnt.nAmbientFX , 10, Vector( 30, 30, 30 ) ); + +-- self.nWarningFX = ParticleManager:CreateParticle( "particles/units/heroes/heroes_underlord/abyssal_underlord_darkrift_target.vpcf", PATTACH_OVERHEAD_FOLLOW, self.hPortalEnt ) +-- ParticleManager:SetParticleControlEnt( self.nWarningFX, 1, self.hPortalEnt, PATTACH_POINT_FOLLOW, "attach_hitloc", self.hPortalEnt:GetAbsOrigin(), true ) +-- ParticleManager:SetParticleControlEnt( self.nWarningFX, 6, self.hPortalEnt, PATTACH_ABSORIGIN_FOLLOW, nil, self.hPortalEnt:GetAbsOrigin(), true ) +-- ParticleManager:SetParticleControl( self.nWarningFX, 10, Vector( self.flNextSpawnTime*0.9, self.flNextSpawnTime*0.9, self.flNextSpawnTime*0.9 ) ); + + EmitSoundOn( "Aghsfort_DarkPortal.Created", self.hPortalEnt ) + + self.bHasCreatedPortal = true +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:OnEntityKilled( event ) + local hVictim = nil + if event.entindex_killed ~= nil then + hVictim = EntIndexToHScript( event.entindex_killed ) + end + + if hVictim == nil or hVictim:IsRealHero() then + return + end + + if hVictim ~= self.hPortalEnt then + return + end + + if self.Encounter ~= nil then + local hAttacker = nil + if event.entindex_attacker ~= nil then + hAttacker = EntIndexToHScript( event.entindex_attacker ) + end + + local nSupressedUnits = 0 + for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do + nSupressedUnits = nSupressedUnits + ( rgUnitInfo.Count * self.nNumSpawnsRemaining ) + end + + self.Encounter:OnPortalKilled( hVictim, hAttacker, nSupressedUnits ) + end + + self:DestroyPortal( false ) +end + + +---------------------------------------------------------------------------- + +function CPortalSpawner:DestroyPortal( bRemove ) + StopSoundOn( "Aghsfort_DarkPortal.StartSummon", self.hPortalEnt ) + StopSoundOn( "Aghsfort_DarkPortal.Created", self.hPortal ) + if self.hPortal and not self.hPortal:IsNull() then + EmitSoundOnLocationWithCaster( self.hPortal:GetAbsOrigin(), "Aghsfort_DarkPortal.Cancel", self.hPortal ) + end + + if self.nWarningFX ~= nil then + ParticleManager:DestroyParticle( self.nWarningFX, false ) + self.nWarningFX = nil + end + + if bRemove and self.hPortalEnt and not self.hPortalEnt:IsNull() then + UTIL_Remove( self.hPortalEnt ) + self.hPortalEnt = nil + end + +-- if hVictim.nAmbientFX ~= nil then +-- ParticleManager:DestroyParticle( hPortal.nAmbientFX, false ) +-- hPortal.nAmbientFX = nil +-- end +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:GetSpawnerName() + return self.szSpawnerName +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:GetLocatorName() + return self.szLocatorName +end + +---------------------------------------------------------------------------- + +function CPortalSpawner:GetNumSpawnsRemaining() + return self.nNumSpawnsRemaining +end diff --git a/aghanim_singleplayer/scripts/vscripts/portalspawnerv2.lua b/aghanim_singleplayer/scripts/vscripts/portalspawnerv2.lua new file mode 100755 index 0000000..2114f8c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/portalspawnerv2.lua @@ -0,0 +1,399 @@ +if CPortalSpawnerV2 == nil then + CPortalSpawnerV2 = class({}) +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:constructor( szSpawnerNameInput, szLocatorNameInput, nPortalHealthInput, flSummonTimeInput, flScaleInput, rgUnitsInfoInput, bInvulnerableInput ) + self.szSpawnerName = szSpawnerNameInput + self.szLocatorName = szLocatorNameInput + self.rgUnitsInfo = rgUnitsInfoInput + self.nPortalHealth = nPortalHealthInput + self.flSummonTime = flSummonTimeInput + + if bInvulnerableInput == nil then + self.bInvulnerable = false + else + self.bInvulnerable = bInvulnerableInput + end + + self.flScale = flScaleInput + self.vFocusPosition = nil + self.flFocusRadius = nil + self.rgSpawners = {} + self.rgSpawnedPortals = {} + self.Encounter = nil +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:GetSpawnerType() + return "CPortalSpawnerV2" +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:Precache( context ) + + PrecacheUnitByNameSync( "npc_aghsfort_dark_portal_v2", context, -1 ) + PrecacheResource( "particle", "particles/units/heroes/heroes_underlord/abyssal_underlord_darkrift_target.vpcf", context ) + PrecacheResource( "particle", "particles/portals/portal_ground_spawn_endpoint.vpcf", context ) + + for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do + PrecacheUnitByNameSync( rgUnitInfo.EntityName, context, -1 ) + end +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:OnEncounterLoaded( EncounterInput ) + --print( "CPortalSpawnerV2:OnEncounterLoaded called for " .. self.szSpawnerName ) + + self.Encounter = EncounterInput + self.rgSpawners = self.Encounter:GetRoom():FindAllEntitiesInRoomByName( self.szLocatorName, false ) + + if #self.rgSpawners == 0 then + print( "Failed to find entity " .. self.szSpawnerName .. " as spawner position in map " .. self.Encounter:GetRoom():GetMapName() ) + end + + ListenToGameEvent( "entity_killed", Dynamic_Wrap( CPortalSpawnerV2, 'OnEntityKilled' ), self ) + +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:GetSpawnPositionCount() + return #self.rgSpawners +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:GetSpawnPositions() + return self.rgSpawners +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:GetSpawnCountPerSpawnPosition() + + local nCount = 0 + for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do + nCount = nCount + rgUnitInfo.Count + end + return nCount + +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:SetSpawnInfo( vMins, vMaxs, vEndPos ) + self.vMins = vMins + self.vMaxs = vMaxs + self.vEndPos = vEndPos +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:SetSpawnFocus( vCenter, flRadius ) + self.vFocusPosition = vCenter + self.flFocusRadius = flRadius +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:SpawnSingleUnitType( rgUnitInfo, vLocation ) + + local hSpawnedUnits = {} + for i=1,rgUnitInfo.Count do + + local vSpawnPos = vLocation + if rgUnitInfo.PositionNoise ~= nil then + local nAttempts = 0 + while nAttempts < 16 do + local vTestPos = vSpawnPos + RandomVector( RandomFloat( 0.0, rgUnitInfo.PositionNoise ) ) + vTestPos.z = GetGroundHeight( vTestPos, nil ) + if GridNav:CanFindPath( vTestPos, vLocation ) then + vSpawnPos = vTestPos + break + end + nAttempts = nAttempts + 1 + end + end + + local hUnit = CreateUnitByName( rgUnitInfo.EntityName, vSpawnPos, true, nil, nil, rgUnitInfo.Team ) + + if hUnit == nil then + print( "ERROR! Failed to spawn unit named " .. rgUnitInfo.EntityName ) + else + hUnit.bPortalUnit = true + hUnit:FaceTowards( vLocation ) + if rgUnitInfo.PostSpawn ~= nil then + rgUnitInfo.PostSpawn( hUnit ) + end + table.insert( hSpawnedUnits, hUnit ) + end + end + + return hSpawnedUnits +end + +-------------------------------------------------------------------------------- + +function CPortalSpawnerV2:TrySpawningPortalUnits() + + local hSpawnedUnits={} + local hActivatedPortals={} + + for i=#self.rgSpawnedPortals,1,-1 do + local hPortal = self.rgSpawnedPortals[i] + if hPortal ~= nil then + if hPortal.bStartedSound == false and ( hPortal.flSpawnTime - GameRules:GetGameTime() ) <= 6 then + hPortal.bStartedSound = true + EmitSoundOn( "Aghsfort_DarkPortal.StartSummon", hPortal ) + end + + if hPortal.flSpawnTime <= GameRules:GetGameTime() then + + local nSpawned = 0 + local vLocation = hPortal:GetAbsOrigin() + for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do + local hSingleSpawnedUnits = self:SpawnSingleUnitType( rgUnitInfo, vLocation ) + for _,hUnit in pairs ( hSingleSpawnedUnits ) do + table.insert( hSpawnedUnits, hUnit ) + end + end + + table.insert( hActivatedPortals, hPortal ) + --printf( "%s spawning %d units", self.szSpawnerName, nSpawned ) + end + end + end + + if #hSpawnedUnits > 0 then + self.Encounter:OnSpawnerFinished( self, hSpawnedUnits ) + end + + -- Once a portal has been spawned, it can die + for i=#hActivatedPortals,1,-1 do + + local hPortal = hActivatedPortals[i] + StopSoundOn( "Aghsfort_DarkPortal.StartSummon", hPortal ) + EmitSoundOn( "Aghsfort_DarkPortal.Complete", hPortal ) + + self:RemoveSpawnedPortal( hPortal ) + self:DestroyPortal( hPortal ) + UTIL_Remove( hPortal ) + end + + return hSpawnedUnits + +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:SpawnPortal( hPortalEnt ) + + hPortalEnt:SetTeam( DOTA_TEAM_BADGUYS ) + + hPortalEnt:SetMaxHealth( self.nPortalHealth ) + hPortalEnt:SetBaseMaxHealth( self.nPortalHealth ) + hPortalEnt:Heal( self.nPortalHealth, nil ) + hPortalEnt:AddNewModifier( hPortalEnt, nil, "modifier_provide_vision", { duration = -1 } ) + hPortalEnt:AddNewModifier( hPortalEnt, nil, "modifier_magic_immune", { duration = -1 } ) + hPortalEnt:AddNewModifier( hPortalEnt, nil, "modifier_phased", { duration = -1 } ) + + hPortalEnt:SetAbsScale( self.flScale ) + + hPortalEnt.flSpawnTime = GameRules:GetGameTime() + self.flSummonTime + hPortalEnt.bStartedSound = false + +-- hPortalEnt.nAmbientFX = ParticleManager:CreateParticle( "particles/units/heroes/heroes_underlord/abyssal_underlord_darkrift_target.vpcf", PATTACH_OVERHEAD_FOLLOW, hPortalEnt ) +-- ParticleManager:SetParticleControlEnt( hPortalEnt.nAmbientFX , 1, hPortalEnt, PATTACH_POINT_FOLLOW, "attach_hitloc", hPortalEnt:GetAbsOrigin(), true ) +-- ParticleManager:SetParticleControlEnt( hPortalEnt.nAmbientFX , 6, hPortalEnt, PATTACH_ABSORIGIN_FOLLOW, nil, hPortalEnt:GetAbsOrigin(), true ) +-- ParticleManager:SetParticleControl( hPortalEnt.nAmbientFX , 10, Vector( 30, 30, 30 ) ); + + if self.bInvulnerable == true then + -- invulnerable portals make the portal invisible and place an effect on the ground + hPortalEnt:AddEffects( EF_NODRAW ) + + hPortalEnt.nWarningFX = ParticleManager:CreateParticle( "particles/portals/portal_ground_spawn_endpoint.vpcf", PATTACH_WORLDORIGIN, nil ) + ParticleManager:SetParticleControl( hPortalEnt.nWarningFX, 0, hPortalEnt:GetAbsOrigin() ) + + else + -- vulnerable portals need to remove the invulnerable modifier that's built in to the building + hPortalEnt:RemoveModifierByName( "modifier_invulnerable" ) + + hPortalEnt.nWarningFX = ParticleManager:CreateParticle( "particles/units/heroes/heroes_underlord/abyssal_underlord_darkrift_target.vpcf", PATTACH_OVERHEAD_FOLLOW, hPortalEnt ) + ParticleManager:SetParticleControlEnt( hPortalEnt.nWarningFX, 1, hPortalEnt, PATTACH_POINT_FOLLOW, "attach_hitloc", hPortalEnt:GetAbsOrigin(), true ) + ParticleManager:SetParticleControlEnt( hPortalEnt.nWarningFX, 6, hPortalEnt, PATTACH_ABSORIGIN_FOLLOW, nil, hPortalEnt:GetAbsOrigin(), true ) + ParticleManager:SetParticleControl( hPortalEnt.nWarningFX, 10, Vector( self.flSummonTime*0.9, self.flSummonTime*0.9, self.flSummonTime*0.9 ) ); + end + + if self.flSummonTime <= 6 then + hPortalEnt.bStartedSound = true + EmitSoundOn( "Aghsfort_DarkPortal.StartSummon", hPortalEnt ) + end +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:DestroyPortal( hPortal ) + + if hPortal.nWarningFX ~= nil then + ParticleManager:DestroyParticle( hPortal.nWarningFX, false ) + hPortal.nWarningFX = nil + end + +-- if hVictim.nAmbientFX ~= nil then +-- ParticleManager:DestroyParticle( hPortal.nAmbientFX, false ) +-- hPortal.nAmbientFX = nil +-- end + + StopSoundOn( "Aghsfort_DarkPortal.StartSummon", hPortal ) + EmitSoundOnLocationWithCaster( hPortal:GetAbsOrigin(), "Aghsfort_DarkPortal.Cancel", hPortal ) + +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:ComputeSpawnerWeights( ) + + if self.vFocusPosition == nil then + return nil + end + + -- Ok, focus position. Means we're going to preferentially pick + -- spawn positions nearer to the spawn focus position + local flTotalWeight = 0.0 + for i=1,#self.rgSpawners do + local flDist = ( self.rgSpawners[i]:GetAbsOrigin() - self.vFocusPosition ):Length2D() + local flWeight = math.exp( -0.5 * flDist * flDist / ( self.flFocusRadius * self.flFocusRadius ) ) + self.rgSpawners[i].flFocusWeight = flWeight + flTotalWeight = flTotalWeight + flWeight + end + return flTotalWeight +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:RandomlySelectSpawner( Spawners, flTotalSpawnerWeight ) + + if flTotalSpawnerWeight == nil then + return math.random( 1, #Spawners ) + end + + -- Ok, focus position. Means we're going to preferentially pick + -- spawn positions close to the focus position. + -- We've already computed weights in ComputeSpawnerWeights + local flValue = RandomFloat( 0, flTotalSpawnerWeight ) + local flWeight = 0 + for i=1,#Spawners do + flWeight = flWeight + Spawners[i].flFocusWeight + if flValue < flWeight then + return i + end + end + return #Spawners +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:SpawnUnitsFromRandomSpawners( nSpawners ) + + --print( "spawning from " .. nSpawners .. " " .. self.szSpawnerName .. " spawers out of " .. #self.rgSpawners ) + local hAllSpawnedUnits = {} + local Spawners = nil + local flTotalSpawnerWeight = self:ComputeSpawnerWeights( ) + for n=1,nSpawners do + if Spawners == nil or #Spawners == 0 then + Spawners = deepcopy( self.rgSpawners ) + end + + local nIndex = self:RandomlySelectSpawner( Spawners, flTotalSpawnerWeight ) + local Spawner = Spawners[ nIndex ] + if Spawner == nil then + print ( "ERROR! CPortalSpawnerV2:SpawnUnitsFromRandomSpawners went WRONG!!!!!!!!!!!!!" ) + else + + if flTotalSpawnerWeight ~= nil then + flTotalSpawnerWeight = flTotalSpawnerWeight - Spawner.flFocusWeight + end + + local vLocation = Spawner:GetAbsOrigin() + + local portalTable = + { + MapUnitName = "npc_aghsfort_dark_portal_v2", + origin = tostring( vLocation.x ) .. " " .. tostring( vLocation.y ) .. " " .. tostring( vLocation.z ), + StatusHealth = self.nPortalHealth, + teamnumber = DOTA_TEAM_BADGUYS, + modelscale = self.flScale, + } + + local hPortal = CreateUnitFromTable( portalTable, vLocation ) + self:SpawnPortal( hPortal ) + table.insert( hAllSpawnedUnits, hPortal ) + table.insert( self.rgSpawnedPortals, hPortal ) + end + table.remove( Spawners, nIndex ) + end + + return hAllSpawnedUnits +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:RemoveSpawnedPortal( hPortal ) + + for i=#self.rgSpawnedPortals,1,-1 do + if self.rgSpawnedPortals[i] == hPortal then + table.remove( self.rgSpawnedPortals, i ) + return true + end + end + return false + +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:OnEntityKilled( event ) + local hVictim = nil + if event.entindex_killed ~= nil then + hVictim = EntIndexToHScript( event.entindex_killed ) + end + + if hVictim == nil or hVictim:IsRealHero() then + return + end + + if self:RemoveSpawnedPortal( hVictim ) == true then + if self.Encounter ~= nil then + local hAttacker = nil + if event.entindex_attacker ~= nil then + hAttacker = EntIndexToHScript( event.entindex_attacker ) + end + self.Encounter:OnPortalV2Killed( hVictim, hAttacker, self:GetSpawnCountPerSpawnPosition() ) + end + + self:DestroyPortal( hVictim ) + end +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:GetPortalUnitCount( event ) + return #self.rgSpawnedPortals +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:GetSpawnerName() + return self.szSpawnerName +end + +---------------------------------------------------------------------------- + +function CPortalSpawnerV2:GetLocatorName() + return self.szLocatorName +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/precache.lua b/aghanim_singleplayer/scripts/vscripts/precache.lua new file mode 100755 index 0000000..22bc07b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/precache.lua @@ -0,0 +1,120 @@ +g_ItemPrecache = +{ + "item_tombstone", + "item_bag_of_gold", + "item_health_potion", + "item_mana_potion", + "item_life_rune", + "item_battle_points", + "item_arcane_fragments", + "item_javelin", + "item_monkey_king_bar", +} + +g_UnitPrecache = +{ + -- YOU THERE!!!! YES, YOU!!!!!!! + -- Don't put your precaches in here. Units will already be precached by dota spawners + -- Put your other precache in Precache methods in your encounters, ai, or abilities + -- whether they are in script or C++ code. + -- Doing so means quicker load time and less total memory used + + -- Assets in Aghanim path + "npc_treasure_chest", + "npc_dota_explosive_barrel", + "aghsfort_ascension_level_picker_1", + "aghsfort_ascension_level_picker_2", + "aghsfort_ascension_level_picker_3", + "aghsfort_ascension_level_picker_4", + "npc_dota_announcer_aghanim", + "npc_dota_story_crystal", + + -- Assets in Dota path +} + +g_ModelPrecache = +{ + -- YOU THERE!!!! YES, YOU!!!!!!! + -- Don't put your precaches in here. Units will already be precached by dota spawners + -- Put your other precache in Precache methods in your encounters, ai, or abilities + -- whether they are in script or C++ code. + -- Doing so means quicker load time and less total memory used + "models/gameplay/breakingcrate_dest.vmdl", -- item_bag_of_gold + --"models/gameplay/attrib_tome_str.vmdl", -- item_book_of_strength + --"models/gameplay/attrib_tome_agi.vmdl", -- item_book_of_agility + --"models/gameplay/attrib_tome_int.vmdl", -- item_book_of_intelligence + + -- Assets in Dota path + "models/props_gameplay/treasure_chest_gold.vmdl", -- Bunch of gold from treasure + "models/props_gameplay/treasure_chest001.vmdl", -- Netural item chests + "models/props_gameplay/gold_bag.vmdl", -- item_bag_of_gold + "models/ui/exclamation/questionmark.vmdl", -- hidden challenges + "models/heroes/bristleback/bristleback_back.vmdl", + "models/heroes/bristleback/bristleback_bracer.vmdl", + "models/heroes/bristleback/bristleback_head.vmdl", + "models/heroes/bristleback/bristleback_necklace.vmdl", + "models/heroes/bristleback/bristleback_weapon.vmdl", +} + +g_ParticlePrecache = +{ + -- YOU THERE!!!! YES, YOU!!!!!!! + -- Don't put your precaches in here. Units will already be precached by dota spawners + -- Put your other precache in Precache methods in your encounters, ai, or abilities + -- whether they are in script or C++ code. + -- Doing so means quicker load time and less total memory unsed + + -- Assets in Aghanim path + "particles/dark_moon/darkmoon_last_hit_effect.vpcf", -- Last hit effect + "particles/dark_moon/darkmoon_creep_warning.vpcf", -- used in many places to warn about an attack + "particles/forest/crate_destruction.vpcf", -- crate + "particles/forest/vase_destruction.vpcf", -- vase + + -- Blessings + "particles/blessings/death_detonation/death_detonation_remote_mines_detonate.vpcf", + + -- Assets in Dota path + "particles/units/heroes/hero_visage/visage_summon_familiars.vpcf", -- dark portal fx + "particles/units/heroes/heroes_underlord/abyssal_underlord_darkrift_target.vpcf", -- dark portal fx + "particles/units/heroes/heroes_underlord/abbysal_underlord_darkrift_ambient.vpcf", -- dark portal fx + "particles/units/heroes/hero_dazzle/dazzle_shadow_wave.vpcf", -- fx for test_encounter concommand + "particles/units/heroes/hero_zuus/zuus_lightning_bolt.vpcf", -- fx for battle royale + "particles/units/heroes/hero_omniknight/omniknight_guardian_angel_halo_buff.vpcf", -- Used by modifier_omninight_guardian_angel, for player respawn + "particles/units/heroes/hero_omniknight/omniknight_guardian_angel_wings_buff.vpcf", -- Used by modifier_omninight_guardian_angel, for player respawn + "particles/status_fx/status_effect_guardian_angel.vpcf", -- Used by modifier_omninight_guardian_angel, for player respawn + "particles/units/heroes/hero_omniknight/omniknight_guardian_angel_omni.vpcf", -- Used by modifier_omninight_guardian_angel, for player respawn + "particles/units/heroes/hero_omniknight/omniknight_guardian_angel_ally.vpcf", -- Used by modifier_omninight_guardian_angel, for player respawn + "particles/units/heroes/hero_ogre_magi/ogre_magi_bloodlust_buff.vpcf", -- used by modifier_enrage + "particles/items5_fx/neutral_treasurebox.vpcf", -- neutral item drop + "particles/items5_fx/neutral_treasurebox_lvl0.vpcf", -- neutral item drop + "particles/items5_fx/neutral_treasurebox_lvl1.vpcf", -- neutral item drop + "particles/items5_fx/neutral_treasurebox_lvl2.vpcf", -- neutral item drop + "particles/items5_fx/neutral_treasurebox_lvl3.vpcf", -- neutral item drop + "particles/items5_fx/neutral_treasurebox_lvl4.vpcf", -- neutral item drop + "particles/neutral_fx/neutral_item_drop_lvl0.vpcf", -- neutral item drop + "particles/neutral_fx/neutral_item_drop_lvl1.vpcf", -- neutral item drop + "particles/neutral_fx/neutral_item_drop_lvl2.vpcf", -- neutral item drop + "particles/neutral_fx/neutral_item_drop_lvl3.vpcf", -- neutral item drop + "particles/neutral_fx/neutral_item_drop_lvl4.vpcf", -- neutral item drop + "particles/neutral_fx/neutral_item_drop_lvl5.vpcf", -- neutral item drop + "particles/units/heroes/hero_invoker/invoker_sun_strike_team.vpcf", -- treasure chest surprise + "particles/units/heroes/hero_invoker/invoker_sun_strike.vpcf", + "particles/creature_true_sight.vpcf", -- modifier_detect_invisible + "particles/msg_fx/msg_bp.vpcf", + "particles/generic_gameplay/battle_point_splash.vpcf", +} + +g_SoundPrecache = +{ + -- Assets in Aghanim path + "soundevents/game_sounds_aghanim.vsndevts", + "soundevents/game_sounds_dungeon.vsndevts", + "soundevents/game_sounds_aghanim_creatures.vsndevts", + "soundevents/game_sounds_dungeon_enemies.vsndevts", + "soundevents/game_sounds_pudge_miniboss.vsndevts", + + -- Assets in Dota path + "soundevents/voscripts/game_sounds_vo_meepo.vsndevts", + "soundevents/voscripts/game_sounds_vo_bristleback.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_abyssal_underlord.vsndevts", -- dark portal sounds +} diff --git a/aghanim_singleplayer/scripts/vscripts/reward_tables.lua b/aghanim_singleplayer/scripts/vscripts/reward_tables.lua new file mode 100755 index 0000000..88f0708 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/reward_tables.lua @@ -0,0 +1,375 @@ +require( "constants" ) + +_G.USE_PRICED_REWARDS = true +_G.PRICED_ITEM_GOLD_MIN_PCT = 0.60 +_G.PRICED_ITEM_GOLD_MAX_PCT = 1.20 +_G.PRICED_ITEM_BONUS_DEPTH_PCT = 0.05 +_G.GOLD_REWARD_CHOICE_MIN_PCT = 0.375 -- 1.5 * 0.25 +_G.GOLD_REWARD_CHOICE_MAX_PCT = 0.525 -- 1.5 * 0.35 +_G.ELITE_VALUE_MODIFIER = 2 +_G.ARCANE_FRAGMENT_ELITE_VALUE_MODIFIER = 1.25 +_G.ELITE_NEUTRAL_ITEM_VALUE_MODIFIER = 1.5 + +-- Amount of XP earned per hero per depth (if the encounter gives XP) +_G.ENCOUNTER_DEPTH_XP_REWARD = +{ + 0, --1 Starting Room + 900, --2, + 1000, --3, + 1100, --4, + 1200, --5, + 400, --6 Act 1 Boss + 0, --7 Transition->Act2, Reward Room + 1575, --8, + 1775, --9, + 1975, --10, + 2175, --11, + 0, --12, + 1900, --13 Act 2 Boss + 2700, --14 Act 3 Reward Room + 3200, --15 + 3500, --16, + 6395, --17, + 0, --18, + 0, --19 Act 3 Boss +} + +-- Amount of gold earned per hero per depth (if the encounter gives gold) +_G.ENCOUNTER_DEPTH_GOLD_REWARD = +{ + 0, --1 Starting Room + 650, --2, + 775, --3, + 900, --4, + 1000, --5, + 1000, --6 Act 1 Boss README: The boss has a gold bag fountain ability that gives 1000 gold, but gets slammed to 0 at reward time + 2500, --7 Transition->Act2 ( Note: this gold is not guaranteed ) + 1250, --8 + 1500, --9 + 1750, --10 + 2000, --11 + 0, --12 + 2000, --13 Act 2 Boss README: The boss has a gold bag fountain ability that gives 2000 gold, but gets slammed to 0 at reward time + 0, --14 Act 3 Reward Room [chickens drop loot] + 2300, --15 + 2500, --16 + 2700, --17 + 0, --18 + 2800, --19 Act 3 Boss, gold reward is for items at Bristle only +} + +_G.ENCOUNTER_DEPTH_BATTLE_POINTS = +{ + 0, --1 + 25, --2 + 25, --3 + 25, --4 + 25, --5 + 50, --6 120 + 0, --7 + 25, --8 + 25, --9 + 25, --10 + 25, --11 + 0, --12 + 50, --13 240 + 0, --14 + 25, --15 + 25, --16 + 25, --17 + 0, --18 + 50, --19 340 +} + +_G.BATTLE_POINT_DIFFICULTY_MODIFIERS = +{ + 1, + 1.1, + 1.2, + 1.3 +} + +_G.BATTLE_POINT_MIN_DROP_VALUE = 15 +_G.BATTLE_POINT_MAX_DROP_VALUE = 30 + +_G.ARCANE_FRAGMENT_ROOM_CLEAR_VALUE = 0.5 +_G.ARCANE_FRAGMENT_DROP_VALUE = 0.5 + +_G.ARCANE_FRAGMENT_DROP_VALUE_VARIANCE = 0.4 + +_G.ENCOUNTER_DEPTH_ARCANE_FRAGMENTS = +{ + 0, --1 + 20, --2 + 20, --3 + 20, --4 + 20, --5 + 40, --6 + 0, --7 + 22, --8 + 22, --9 + 22, --10 + 22, --11 + 0, --12 + 44, --13 + 0, --14 + 24, --15 + 24, --16 + 24, --17 + 0, --18 + 48, --19 +} + +_G.ARCANE_FRAGMENT_DIFFICULTY_MODIFIERS = +{ + 1, + 1.1, + 1.2, + 1.3, + 1.4 +} + +_G.ARCANE_FRAGMENT_RANDOM_DROP_CHANCES = +{ + { low_chance = 0, high_chance = 60, num_fragments = 0 }, + { low_chance = 60, high_chance = 90, num_fragments = 1 }, + { low_chance = 90, high_chance = 100, num_fragments = 2 }, +} + +_G.REWARD_TIER_TABLE = +{ + REWARD_TIER_UPGRADE = + { + REWARD_TYPE_ABILITY_UPGRADE = 100, + }, + + REWARD_TIER_MINOR_UPGRADE = + { + REWARD_TYPE_MINOR_ABILITY_UPGRADE = 100, + }, + + REWARD_TIER_OTHER = + { + --REWARD_TYPE_GOLD = 33, + --REWARD_TYPE_ITEM = 33, + --REWARD_TYPE_MINOR_ABILITY_UPGRADE = 100, + REWARD_TYPE_MINOR_STATS_UPGRADE = 100, + --REWARD_TYPE_EXTRA_LIVES = 1, + + }, +} + +_G.ROOM_CHOICE_REWARDS = +{ + REWARD_TYPE_GOLD = 40, + REWARD_TYPE_EXTRA_LIVES = 20, + REWARD_TYPE_TREASURE = 40, +} + +_G.TREASURE_REWARDS = {} +table.insert( TREASURE_REWARDS, 1, + { + "item_purification_potion", + "item_ravage_potion", + "item_echo_slam_potion", + "item_arcanist_potion", + "item_book_of_strength", + "item_book_of_agility", + "item_book_of_intelligence", + "item_dragon_potion", +} ) + +table.insert( TREASURE_REWARDS, 2, + { + "item_torrent_effect_potion", + "item_shadow_wave_effect_potion", + "item_tome_of_greater_knowledge", + "item_book_of_greater_strength", + "item_book_of_greater_agility", + "item_book_of_greater_intelligence", + "item_aghsfort_refresher_shard", +}) + +_G.PRICED_ITEM_REWARD_LIST = +{ + item_broom_handle = 600, + item_keen_optic = 600, + item_ocean_heart = 600, + item_oblivions_locket = 600, + item_precious_egg = 600, + item_faded_broach = 600, + item_arcane_ring = 600, + + + item_longclaws_amulet = 750, + item_bear_cloak = 750, + item_winter_embrace = 750, + item_poor_mans_shield = 750, + + --item_creed_of_omniscience = 750, + + item_ogre_seal_totem = 1000, + item_dragon_scale = 1000, + item_essence_ring = 1000, + item_pupils_gift = 1000, + + item_paw_of_lucius = 1250, + item_enchanted_quiver = 1250, + item_ring_of_aquila = 1250, + item_grove_bow = 1250, + item_bogduggs_baldric = 1250, + item_craggy_coat = 1250, + item_pelt_of_the_old_wolf = 1250, + + item_nether_shawl = 1500, + item_imp_claw = 1500, + item_ambient_sorcery = 1500, + item_vambrace = 1500, + + item_greater_faerie_fire = 1750, + + item_vampire_fangs = 2000, + --item_lifestone = 2000, + --item_ice_dragon_maw = 2000, + + item_quickening_charm = 2500, + item_titan_sliver = 2500, + item_sign_of_the_arachnid = 2500, + item_phoenix_ash = 2500, + + item_preserved_skull = 3000, + item_gravel_foot = 3000, + item_bogduggs_cudgel = 3000, + item_orb_of_destruction = 3000, + item_paladin_sword = 3000, + item_havoc_hammer = 3000, + item_witless_shako = 3000, + item_panic_button = 3000, + item_minotaur_horn = 3000, + + item_stony_coat = 3250, + item_bogduggs_lucky_femur = 3250, + item_illusionsts_cape = 3500, + + item_stonework_pendant = 3750, + item_spell_prism = 4000, + item_timeless_relic = 4000, + item_watchers_gaze = 4250, + item_guardian_shell = 4250, + + + item_ex_machina = 4500, + item_mirror_shield = 4750, + item_wand_of_the_brine = 4750, + item_fallen_sky = 4750, + + item_treads_of_ermacor = 5000, + item_demonicon = 5000, + item_force_boots = 5500, + item_slippers_of_the_abyss = 5500, + item_apex = 6000, + item_desolator_2 = 6000, +} + + +_G.ROOM_REWARDS = +{ + -- Act 1 + depth_1 = + { + normal = { { REWARD_TIER_UPGRADE = 100 }, { REWARD_TIER_UPGRADE = 100 }, { REWARD_TIER_UPGRADE = 100 } } + }, + depth_2 = + { + normal = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + elite = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + }, + depth_3 = + { + normal = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + elite = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + }, + depth_4 = + { + normal = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + elite = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + }, + depth_5 = + { + normal = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + elite = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + }, + depth_6 = -- Boss + { + normal = { { REWARD_TIER_UPGRADE = 100 }, { REWARD_TIER_UPGRADE = 100 }, { REWARD_TIER_UPGRADE = 100 } } + }, + depth_7 = -- Transition + { + normal = { } + }, + + -- Act 2 + depth_8 = + { + normal = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + elite = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + }, + depth_9 = + { + normal = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + elite = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + }, + depth_10 = + { + normal = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + elite = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + }, + depth_11 = + { + normal = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + elite = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + }, + depth_12 = + { + normal = { }, + }, + depth_13 = -- Boss + { + normal = { { REWARD_TIER_UPGRADE = 100 }, { REWARD_TIER_UPGRADE = 100 }, { REWARD_TIER_UPGRADE = 100 } } + }, + + -- Act 3 + depth_14 = + { + normal = { }, + }, + depth_15 = + { + normal = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + elite = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + }, + depth_16 = + { + normal = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + elite = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + }, + depth_17 = + { + normal = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + elite = { { REWARD_TIER_OTHER = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, { REWARD_TIER_MINOR_UPGRADE = 100 }, }, + }, + depth_18 = + { + normal = { }, + }, + depth_19 = -- Boss + { + normal = { }, -- No need for rewards, the game is done [or should we put BP rewards in here?] + }, + + -- Traps + traps = + { + normal = { { REWARD_TIER_UPGRADE = 100 }, { REWARD_TIER_UPGRADE = 100 }, { REWARD_TIER_UPGRADE = 100 } } + }, +} diff --git a/aghanim_singleplayer/scripts/vscripts/rewards.lua b/aghanim_singleplayer/scripts/vscripts/rewards.lua new file mode 100755 index 0000000..8b274aa --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/rewards.lua @@ -0,0 +1,477 @@ +require( "constants" ) +require( "gameplay_shared" ) +require( "map_room" ) +require( "reward_tables" ) +require( "utility_functions" ) +require( "ai/shared" ) +require( "aghanim_ability_upgrade_interface" ) + + +function GetMinMaxGoldChoiceReward( nRoomDepth, bElite ) + local nFixedGoldAwardOfDepth = ENCOUNTER_DEPTH_GOLD_REWARD[ nRoomDepth ] + if bElite then + --print( "Elite Room, increasing expected value of item reward " .. nFixedGoldAwardOfDepth .. " to " .. nFixedGoldAwardOfDepth * ELITE_VALUE_MODIFIER ) + nFixedGoldAwardOfDepth = nFixedGoldAwardOfDepth * ELITE_VALUE_MODIFIER + end + local nMaxValue = math.ceil( nFixedGoldAwardOfDepth * GOLD_REWARD_CHOICE_MAX_PCT ) + local nMinValue = math.floor( nFixedGoldAwardOfDepth * GOLD_REWARD_CHOICE_MIN_PCT ) + return nMinValue, nMaxValue +end + +function GetPricedNeutralItems( nRoomDepth, bElite ) + local vecItemRewards = PRICED_ITEM_REWARD_LIST + local nFixedGoldAwardOfDepth = ENCOUNTER_DEPTH_GOLD_REWARD[ nRoomDepth ] + if bElite then + --print( "Elite Room, increasing expected value of item reward " .. nFixedGoldAwardOfDepth .. " to " .. nFixedGoldAwardOfDepth * ELITE_NEUTRAL_ITEM_VALUE_MODIFIER ) + nFixedGoldAwardOfDepth = nFixedGoldAwardOfDepth * ELITE_NEUTRAL_ITEM_VALUE_MODIFIER + end + local flBonusPct = PRICED_ITEM_BONUS_DEPTH_PCT * nRoomDepth + local nMaxValue = math.ceil( nFixedGoldAwardOfDepth * ( PRICED_ITEM_GOLD_MAX_PCT + flBonusPct ) ) + local nMinValue = math.floor( nFixedGoldAwardOfDepth * ( PRICED_ITEM_GOLD_MIN_PCT + flBonusPct ) ) + local vecPossibleItems = {} + + for szItemName, nValue in pairs( vecItemRewards ) do + if nValue >= nMinValue and nValue <= nMaxValue then + table.insert( vecPossibleItems, szItemName ) + end + end + + return vecPossibleItems +end + + +function GetRandomUnique( hRandomStream, Array, BlacklistValues ) + if Array == nil then + return nil + end + + --PrintTable( Array, "Array:" ) + --PrintTable( BlacklistValues, "BlacklistValues:" ) + + local Whitelist = {} + if BlacklistValues == nil then + Whitelist = Array + else + for _,Value in pairs(Array) do + if not TableContainsValue( BlacklistValues, Value ) then + table.insert(Whitelist, Value) + end + end + end + + local bIgnoreBlacklist = false + if #Whitelist < 1 then + bIgnoreBlacklist = true + Whitelist = Array + end + + local Candidate = nil + nIndex = hRandomStream:RandomInt(1,#Whitelist) + Candidate = Whitelist[ nIndex ] + + if bIgnoreBlacklist then + printf("WARNING: GetRandomUnique returning array[%d] = %s, ignoring blacklist.", nIndex, Candidate) + end + + return Candidate +end + +function GetRoomRewards( nRoomDepth, nRoomType, bElite, nPlayerID, vecExternalExcludeList ) + + local vecRewardStruct = nil + + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + + if hPlayerHero == nil then + printf("GetRoomRewards; Aborting, no hero entity for Player %d", nPlayerID ) + return nil + end + + if( vecExternalExcludeList == nil ) then + vecExternalExcludeList = {} + end + + local bLimitUltimateUpgrades = tonumber(nRoomDepth) == 1 + + local szHeroName = hPlayerHero:GetName() + local bHardRoom = bElite --or nRoomType == ROOM_TYPE_TRAPS + + -- Rarity: + -- Common = 0 + -- Rare = 1 + -- Epic = 2 + local iRewardRarity = 0 + + if bHardRoom == true then + iRewardRarity = 1 + end + + vecRewardStruct = ROOM_REWARDS[ "depth_" .. nRoomDepth].normal + + local hHeroRandomStream = GameRules.Aghanim:GetHeroRandomStream( nPlayerID ) + + -- first, choose the appropriate reward tier for each option + local vecGeneratedRewardTiers = {} + + for _,aRewardDef in pairs( vecRewardStruct ) do + + local flRoll = hHeroRandomStream:RandomFloat(0, 100.0) + local flThreshold = 0.0 + + for eRewardTier,flPct in pairs( aRewardDef ) do + flThreshold = flThreshold + flPct + if flRoll <= flThreshold then + table.insert( vecGeneratedRewardTiers, eRewardTier ) + break + end + end + end + + if TableLength(vecGeneratedRewardTiers) < 1 then + return nil + end + + -- shuffle the chosen reward tiers so that progressive probabilities are randomized + ShuffleListInPlace( vecGeneratedRewardTiers, hHeroRandomStream ) + + -- exclude any item or ability they've learned, chosen, have in inventory or are externally marked for exclusion + local vecAbilitiesToExclude = GetPlayerAbilitiesAndItems( nPlayerID ) + for ii=1,nRoomDepth-1 do + local RewardChoices = CustomNetTables:GetTableValue( "reward_choices", tostring(ii) ) + local RewardChoice = RewardChoices and RewardChoices[ tostring(nPlayerID) ] or nil + if RewardChoice and RewardChoice["ability_name"] and RewardChoice["reward_type"] ~= "REWARD_TYPE_MINOR_ABILITY_UPGRADE" and RewardChoice["reward_type"] ~= "REWARD_TYPE_MINOR_STATS_UPGRADE" then + table.insert( vecAbilitiesToExclude, RewardChoice["ability_name"] ) + end + end + + for _,ExcludeAbility in pairs(vecExternalExcludeList) do + table.insert( vecAbilitiesToExclude, ExcludeAbility ) + end + + local MinorUpgrades = deepcopy( MINOR_ABILITY_UPGRADES[ szHeroName ] ) + local MinorStatsUpgrades = deepcopy( MINOR_ABILITY_UPGRADES ["base_stats_upgrades"]) + + -- then for each option, roll a reward type, and don't repeat types + local vecGeneratedRewards = {} + local vecMinorAbilityIDsToExclude = {} + for _,eRewardTier in pairs(vecGeneratedRewardTiers) do + + local eGeneratedRewardType = nil + + local aRewardTierDef = RebalanceRewards( REWARD_TIER_TABLE[eRewardTier], vecGeneratedRewards ) + + local flRoll = hHeroRandomStream:RandomFloat(0, 100.0) + local flThreshold = 0.0 + local MinorAbilityUpgrade = nil + local MinorStatsUpgrade = nil + + for eRewardType,flPct in pairs( aRewardTierDef ) do + + flThreshold = flThreshold + flPct + if flRoll <= flThreshold then + + local szAbilityName = nil + local nQuantity = nil + + if eRewardType == "REWARD_TYPE_ABILITY_UPGRADE" then + + szAbilityName = GetRandomUnique( hHeroRandomStream, SPECIAL_ABILITY_UPGRADES[szHeroName], vecAbilitiesToExclude ) + iRewardRarity = 2 + + elseif eRewardType == "REWARD_TYPE_MINOR_ABILITY_UPGRADE" then + local k = hHeroRandomStream:RandomInt( 1, #MinorUpgrades ) + local Upgrade = MinorUpgrades[ k ] + table.remove( MinorUpgrades, k ) + MinorAbilityUpgrade = deepcopy( Upgrade ) + if bHardRoom then + print( "Elite Room, increasing expected value of ability upgrade from " .. MinorAbilityUpgrade[ "value" ] .. " to " .. MinorAbilityUpgrade[ "value" ] * ELITE_VALUE_MODIFIER ) + MinorAbilityUpgrade[ "value" ] = MinorAbilityUpgrade[ "value" ] * ELITE_VALUE_MODIFIER + end + --table.insert( vecMinorAbilityIDsToExclude, MinorAbilityUpgrade[ "id" ] ) + elseif eRewardType == "REWARD_TYPE_MINOR_STATS_UPGRADE" then + local k = hHeroRandomStream:RandomInt( 1, #MinorStatsUpgrades ) + local StatsUpgrade = MinorStatsUpgrades[ k ] + table.remove( MinorStatsUpgrades, k ) + MinorStatsUpgrade = deepcopy( StatsUpgrade ) + if bHardRoom then + print( "Elite Room, increasing expected value of stats upgrade from " .. MinorStatsUpgrade[ "value" ] .. " to " .. MinorStatsUpgrade[ "value" ] * ELITE_VALUE_MODIFIER ) + MinorStatsUpgrade[ "value" ] = MinorStatsUpgrade[ "value" ] * ELITE_VALUE_MODIFIER + end + + end + + if szAbilityName ~= nil then + + if bLimitUltimateUpgrades and szAbilityName and string.match(szAbilityName, ULTIMATE_ABILITY_NAMES[szHeroName] ) then + for _key,szAbilityUpgrade in pairs(SPECIAL_ABILITY_UPGRADES[szHeroName]) do + if string.match(szAbilityUpgrade, ULTIMATE_ABILITY_NAMES[szHeroName] ) then + table.insert( vecAbilitiesToExclude, szAbilityUpgrade ) + end + end + end + + table.insert( vecAbilitiesToExclude, szAbilityName ) + end + + local GeneratedReward = + { + reward_type = eRewardType, + reward_tier = eRewardTier, + ability_name = szAbilityName, + quantity = nQuantity, + rarity = iRewardRarity, + } + + if bHardRoom then + GeneratedReward[ "elite" ] = 1 + else + GeneratedReward[ "elite" ] = 0 + end + + if MinorAbilityUpgrade ~= nil then + GeneratedReward[ "ability_name" ] = MinorAbilityUpgrade[ "ability_name" ] + GeneratedReward[ "description" ] = MinorAbilityUpgrade[ "description" ] + GeneratedReward[ "value" ] = MinorAbilityUpgrade[ "value" ] + GeneratedReward[ "id" ] = MinorAbilityUpgrade[ "id" ] + end + + if MinorStatsUpgrade ~= nil then + GeneratedReward[ "ability_name" ] = MinorStatsUpgrade[ "ability_name" ] + GeneratedReward[ "description" ] = MinorStatsUpgrade[ "description" ] + GeneratedReward[ "value" ] = MinorStatsUpgrade[ "value" ] + GeneratedReward[ "id" ] = MinorStatsUpgrade[ "id" ] + end + + table.insert( vecGeneratedRewards, GeneratedReward ) + break + end + end + + table.insert( vecGeneratedRewards, GeneratedReward ) + end + + return vecGeneratedRewards + +end + +function TestRoomRewardConsoleCommand( cmdName, szRoomDepth, szIsElite, szIsTrapRoom ) + + --CustomNetTables:SetTableValue( "reward_options", "current_depth", { szRoomDepth } ); + + local bIsElite = (szIsElite == "true") + local bIsTrapRoom = (szIsTrapRoom == "true") + local szRoomDepth = tostring( tonumber( szRoomDepth ) ) + local nPlayerID = Entities:GetLocalPlayer():GetPlayerID() + local nRoomType = ROOM_TYPE_ENEMY + if bIsTrapRoom == true then + nRoomType = ROOM_TYPE_TRAPS + end + + --printf( "Running %s %d %s %s %s...", cmdName, nPlayerID, szRoomDepth, szIsElite, szIsTrapRoom ) + + CustomNetTables:SetTableValue( "reward_options", "current_depth", { szRoomDepth } ) + + CustomNetTables:SetTableValue( "reward_choices", szRoomDepth, {} ) + + local RewardOptions = {} + local vecPlayerRewards = GetRoomRewards( tonumber(szRoomDepth), nRoomType, bIsElite, nPlayerID ) + RewardOptions[ tostring(nPlayerID) ] = vecPlayerRewards; + + --DeepPrintTable( vecPlayerRewards ) + + CustomNetTables:SetTableValue( "reward_options", szRoomDepth, RewardOptions ) + +end + +function RebalanceRewards( aRewardDef, vecPreviouslyGeneratedRewards ) + + local aRebalancedRewardDef = deepcopy( aRewardDef ) + NormalizeFloatArrayInPlace( aRebalancedRewardDef, 100.0 ) + return aRebalancedRewardDef + +end + +function NormalizeFloatArrayInPlace( aFloatValues, flDesiredSum ) + + if flDesiredSum == nil then + flDesiredSum = 1.0 + end + + local flSum = 0 + for _,flFloatValue in pairs( aFloatValues ) do + flSum = flSum + flFloatValue + end + + for key,flFloatValue in pairs( aFloatValues ) do + aFloatValues[key] = ( aFloatValues[key] / flSum ) * flDesiredSum + end + +end + +function GrantRewards( nPlayerID, szRoomDepth, aReward ) + + local hPlayerHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + if hPlayerHero == nil then + printf("Aborting grant reward, no hero entity for Player %d", nPlayerID ) + return + end + + local RewardChoices = CustomNetTables:GetTableValue( "reward_choices", szRoomDepth ) + if RewardChoices == nil then + RewardChoices = {} + end + + local aExistingReward = RewardChoices[ tostring(nPlayerID) ] + if aExistingReward ~= nil then + printf("GrantRewards: Player %d, Depth %s, aborting granting Reward %s to to existing Reward: %s", nPlayerID, szRoomDepth, DeepToString(aReward), DeepToString(aExistingReward) ) + return + end + + printf("granting reward to %s: %s", hPlayerHero:GetName(), DeepToString(aReward) ) + + local eRewardType = aReward["reward_type"] + local nQuantity = aReward["quantity"] + local szAbilityName = aReward["ability_name"] + local bEliteReward = aReward["elite"] == 1 + + + --local eRewardTier = aReward["reward_tier" + if eRewardType == "REWARD_TYPE_ABILITY_UPGRADE" then + local data = {} + data["PlayerID"] = nPlayerID + data["AbilityName"] = szAbilityName + data["LevelReward"] = true + CAghanim:OnAbilityUpgradeButtonClicked(1, data) + GameRules.Aghanim:GetAnnouncer():OnRewardSelected( hPlayerHero, tonumber( szRoomDepth ), eRewardType, szAbilityName ) + elseif eRewardType == "REWARD_TYPE_MINOR_ABILITY_UPGRADE" then + local Upgrade = deepcopy( MINOR_ABILITY_UPGRADES[ hPlayerHero:GetUnitName() ][ aReward[ "id" ] ] ) + if bEliteReward then + Upgrade[ "value" ] = Upgrade[ "value" ] * ELITE_VALUE_MODIFIER + end + CAghanim:AddMinorAbilityUpgrade( hPlayerHero, Upgrade ) + GameRules.Aghanim:GetAnnouncer():OnRewardSelected( hPlayerHero, tonumber( szRoomDepth ), eRewardType, Upgrade.description ) + elseif eRewardType == "REWARD_TYPE_MINOR_STATS_UPGRADE" then + --Hook up via the same path as the minor ability upgrades + local StatsUpgrade = deepcopy( MINOR_ABILITY_UPGRADES[ "base_stats_upgrades" ][aReward[ "id" ] ] ) + if bEliteReward then + StatsUpgrade[ "value" ] = StatsUpgrade[ "value" ] * ELITE_VALUE_MODIFIER + end + --Make sure to grant and level up the stats ability if we haven't taken this reward yet + CAghanim:AddMinorAbilityUpgrade( hPlayerHero, StatsUpgrade ) + CAghanim:VerifyStatsAbility(hPlayerHero, StatsUpgrade[ "ability_name" ]) + GameRules.Aghanim:GetAnnouncer():OnRewardSelected( hPlayerHero, tonumber( szRoomDepth ), eRewardType, StatsUpgrade.description ) + end + + RewardChoices[ tostring(nPlayerID) ] = aReward + CustomNetTables:SetTableValue( "reward_choices", szRoomDepth, RewardChoices ) + CustomNetTables:SetTableValue( "reward_choices", "current_depth", { szRoomDepth } ) + + + local gameEvent = {} + if aReward["quantity"] then + gameEvent["int_value"] = tonumber(aReward["quantity"]) + end + if aReward["ability_name"] then + if eRewardType == "REWARD_TYPE_MINOR_ABILITY_UPGRADE" or eRewardType == "REWARD_TYPE_MINOR_STATS_UPGRADE" then + --PrintTable( aReward, " reward choice: " ) + gameEvent["string_replace_token"] = aReward [ "description" ] + gameEvent["ability_name"] = aReward[ "ability_name" ] + gameEvent["value"] = tonumber(aReward[ "value" ]) + else + gameEvent["locstring_value"] ="#DOTA_Tooltip_Ability_" .. aReward["ability_name"] + end + end + gameEvent["player_id"] = nPlayerID + gameEvent["teamnumber"] = -1 + gameEvent["message"] = "#DOTA_HUD_" .. aReward["reward_type"] .. "_Toast" + + --DeepPrintTable( RewardChoices ) + FireGameEvent( "dota_combat_event_message", gameEvent ) +end + +-------------------------------------------------------------------------------- + +function GenerateRewardStatsForPlayer( hPlayerHero, reward ) + + local szAbilityName = nil + local szAbilityTexture = nil + + if reward.reward_type == "REWARD_TYPE_ABILITY_UPGRADE" then + szAbilityName = reward.ability_name + szAbilityTexture = GetAbilityTextureNameForAbility( szAbilityName ) + elseif reward.reward_type == "REWARD_TYPE_MINOR_ABILITY_UPGRADE" then + szAbilityName = MINOR_ABILITY_UPGRADES[ hPlayerHero:GetUnitName() ][ reward.id ].description + szAbilityTexture = GetAbilityTextureNameForAbility( reward.ability_name ) + elseif reward.reward_type == "REWARD_TYPE_MINOR_STATS_UPGRADE" then + szAbilityName = MINOR_ABILITY_UPGRADES[ "base_stats_upgrades" ][ reward.id ].description + szAbilityTexture = "attribute_bonus" + end + + if szAbilityName == nil then + return nil + end + + local rewardStats = + { + ability_name = szAbilityName, + rarity = reward.rarity, -- 0 - normal, 1 - elite, 2 - boss + } + + if reward.value ~= nil then + rewardStats.value = reward.value + end + + if szAbilityTexture ~= nil then + rewardStats.ability_texture = szAbilityTexture + end + + return rewardStats + +end + +-------------------------------------------------------------------------------- + +function GenerateRewardStats( nPlayerID, szRoomDepth, roomOptions, szRewardIndex ) + + local hHero = PlayerResource:GetSelectedHeroEntity( nPlayerID ) + local rewardStats = + { + selected_reward = GenerateRewardStatsForPlayer( hHero, roomOptions[ szRewardIndex ] ), + unselected_rewards = {} + } + + for key,reward in pairs ( roomOptions ) do + if key ~= szRewardIndex then + table.insert( rewardStats.unselected_rewards, GenerateRewardStatsForPlayer( hHero, reward ) ) + end + end + + GameRules.Aghanim:RegisterRewardStats( nPlayerID, szRoomDepth, rewardStats ) + +end + +-------------------------------------------------------------------------------- + +function OnRewardChoice( eventSourceIndex, data ) + + local nPlayerID = data["PlayerID"] + local szRoomDepth = tostring(data["room_depth"]) + local szRewardIndex = tostring(data["reward_index"]) + + --printf("Processing reward choice for Player %d, %s", nPlayerID, DeepToString(data)) + + local rewardOptions = CustomNetTables:GetTableValue( "reward_options", szRoomDepth ) + if rewardOptions == nil then + return + end + + local roomOptions = rewardOptions[ tostring( nPlayerID ) ] + + --printf("reward options data %d %s %s %s", nPlayerID, szRewardIndex, DeepToString(roomOptions.keys), DeepToString(roomOptions)); + + local aReward = roomOptions[szRewardIndex] + + GrantRewards( nPlayerID, szRoomDepth, aReward ) + + GenerateRewardStats( nPlayerID, szRoomDepth, roomOptions, szRewardIndex ) +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/room_tables.lua b/aghanim_singleplayer/scripts/vscripts/room_tables.lua new file mode 100755 index 0000000..311e8d2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/room_tables.lua @@ -0,0 +1,1187 @@ +require( "constants" ) + +_G.MAP_ATLAS_ROOM_SIZE = 4096 +_G.MAP_ATLAS_ACT2_OFFSET = 1536 +_G.MAP_ATLAS_ELITE_ROOMS_PER_ACT = +{ + -- NOTE: Indexed by ascension level + { + 3, 4, 4 + }, + { + 4, 5, 5 + }, + { + 5, 6, 6 + }, + { + 6, 6, 7 + }, +} +_G.MAP_TRAP_ROOMS_PER_ACT = +{ + 1, 1, 1 +} +_G.MAP_HIDDEN_ENCOUNTERS_PER_ACT = +{ + 3, 3, 3 +} + +-- Starting bottom left +_G.MAP_ATLAS = +{ + -- + -- Act 1 + -- + + a1_1a = + { + name="a1_1a", + exit_up="a1_2a", + exit_side="a1_2b", + nRoomType = ROOM_TYPE_STARTING, + bCannotBeElite = true, + nDepth = 1, + vCenter = Vector( -7 * MAP_ATLAS_ROOM_SIZE / 2, -7 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a1_2a = + { + name="a1_2a", + exit_up="a1_3a", + exit_side="a1_3b", + nRoomType = ROOM_TYPE_ENEMY, + bCannotBeTrap = true, + nDepth = 2, + vCenter = Vector( -7 * MAP_ATLAS_ROOM_SIZE / 2, -5 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a1_2b = + { + name="a1_2b", + exit_up="a1_3b", + exit_side="a1_3c", + nRoomType = ROOM_TYPE_ENEMY, + bCannotBeTrap = true, + nDepth = 2, + vCenter = Vector( -5 * MAP_ATLAS_ROOM_SIZE / 2, -7 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a1_3a = + { + name="a1_3a", + exit_up="a1_4a", + exit_side="a1_4b", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 3, + vCenter = Vector( -7 * MAP_ATLAS_ROOM_SIZE / 2, -3 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a1_3b = + { + name="a1_3b", + exit_up="a1_4b", + exit_side="a1_4c", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 3, + vCenter = Vector( -5 * MAP_ATLAS_ROOM_SIZE / 2, -5 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a1_3c = + { + name="a1_3c", + exit_up="a1_4c", + exit_side="a1_4d", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 3, + vCenter = Vector( -3 * MAP_ATLAS_ROOM_SIZE / 2, -7 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a1_4a = + { + name="a1_4a", + exit_side="a1_5a", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 4, + vCenter = Vector( -7 * MAP_ATLAS_ROOM_SIZE / 2, -1 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a1_4b = + { + name="a1_4b", + exit_up="a1_5a", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 4, + vCenter = Vector( -5 * MAP_ATLAS_ROOM_SIZE / 2, -3 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a1_4c = + { + name="a1_4c", + exit_side="a1_5b", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 4, + vCenter = Vector( -3 * MAP_ATLAS_ROOM_SIZE / 2, -5 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a1_4d = + { + name="a1_4d", + exit_up="a1_5b", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 4, + vCenter = Vector( -1 * MAP_ATLAS_ROOM_SIZE / 2, -7 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a1_5a = + { + name="a1_5a", + exit_side="a1_boss", + nRoomType = ROOM_TYPE_ENEMY, + bCannotBeTrap = true, + bCannotBeElite = true, + nDepth = 5, + vCenter = Vector( -5 * MAP_ATLAS_ROOM_SIZE / 2, -1 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a1_5b = + { + name="a1_5b", + exit_up="a1_boss", + nRoomType = ROOM_TYPE_ENEMY, + bCannotBeTrap = true, + bCannotBeElite = true, + nDepth = 5, + vCenter = Vector( -1 * MAP_ATLAS_ROOM_SIZE / 2, -5 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a1_boss = + { + name="a1_boss", + exit_side="a2_transition", + nRoomType = ROOM_TYPE_BOSS, + bCannotBeElite = true, + nDepth = 6, + vCenter = Vector( -1 * MAP_ATLAS_ROOM_SIZE, -1 * MAP_ATLAS_ROOM_SIZE, 0 ), + vSize = Vector( 2 * MAP_ATLAS_ROOM_SIZE, 2 * MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + -- + -- Transition Act 1 -> Act 2 + -- + + a2_transition = + { + name="a2_transition", + exit_up="a2_1a", + nRoomType = ROOM_TYPE_BONUS, + bCannotBeElite = true, + nDepth = 7, + vCenter = Vector( 2 * MAP_ATLAS_ROOM_SIZE, -11 * MAP_ATLAS_ROOM_SIZE / 4 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( 4 * MAP_ATLAS_ROOM_SIZE, 3 * MAP_ATLAS_ROOM_SIZE / 2, 0 ) + }, + + -- + -- Act 2 + -- + a2_1a = + { + name="a2_1a", + exit_up="a2_2a", + exit_side="a2_2b", + nRoomType = ROOM_TYPE_ENEMY, + bCannotBeElite = true, + bCannotBeTrap = true, + nDepth = 8, + vCenter = Vector( 7 * MAP_ATLAS_ROOM_SIZE / 2, -3 * MAP_ATLAS_ROOM_SIZE / 2 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a2_2a = + { + name="a2_2a", + exit_up="a2_3a", + exit_side="a2_3b", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 9, + vCenter = Vector( 7 * MAP_ATLAS_ROOM_SIZE / 2, -1 * MAP_ATLAS_ROOM_SIZE / 2 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a2_2b = + { + name="a2_2b", + exit_up="a2_3b", + exit_side="a2_3c", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 9, + vCenter = Vector( 5 * MAP_ATLAS_ROOM_SIZE / 2, -3 * MAP_ATLAS_ROOM_SIZE / 2 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a2_3a = + { + name="a2_3a", + exit_up="a2_4a", + exit_side="a2_4b", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 10, + vCenter = Vector( 7 * MAP_ATLAS_ROOM_SIZE / 2, 1 * MAP_ATLAS_ROOM_SIZE / 2 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a2_3b = + { + name="a2_3b", + exit_up="a2_4b", + exit_side="a2_4c", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 10, + vCenter = Vector( 5 * MAP_ATLAS_ROOM_SIZE / 2, -1 * MAP_ATLAS_ROOM_SIZE / 2 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a2_3c = + { + name="a2_3c", + exit_up="a2_4c", + exit_side="a2_4d", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 10, + vCenter = Vector( 3 * MAP_ATLAS_ROOM_SIZE / 2, -3 * MAP_ATLAS_ROOM_SIZE / 2 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a2_4a = + { + name="a2_4a", + exit_side="a2_5a", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 11, + vCenter = Vector( 7 * MAP_ATLAS_ROOM_SIZE / 2, 3 * MAP_ATLAS_ROOM_SIZE / 2 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a2_4b = + { + name="a2_4b", + exit_up="a2_5a", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 11, + vCenter = Vector( 5 * MAP_ATLAS_ROOM_SIZE / 2, 1 * MAP_ATLAS_ROOM_SIZE / 2 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a2_4c = + { + name="a2_4c", + exit_side="a2_5b", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 11, + vCenter = Vector( 3 * MAP_ATLAS_ROOM_SIZE / 2, -1 * MAP_ATLAS_ROOM_SIZE / 2 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a2_4d = + { + name="a2_4d", + exit_up="a2_5b", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 11, + vCenter = Vector( 1 * MAP_ATLAS_ROOM_SIZE / 2, -3 * MAP_ATLAS_ROOM_SIZE / 2 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a2_5a = + { + name="a2_5a", + exit_side="a2_boss", + nRoomType = ROOM_TYPE_TRANSITIONAL, + bCannotBeElite = true, + nDepth = 12, + vCenter = Vector( 5 * MAP_ATLAS_ROOM_SIZE / 2, 3 * MAP_ATLAS_ROOM_SIZE / 2 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a2_5b = + { + name="a2_5b", + exit_up="a2_boss", + nRoomType = ROOM_TYPE_TRANSITIONAL, + bCannotBeElite = true, + nDepth = 12, + vCenter = Vector( 1 * MAP_ATLAS_ROOM_SIZE / 2, -1 * MAP_ATLAS_ROOM_SIZE / 2 + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a2_boss = + { + name="a2_boss", + exit_side="a3_1a", + nRoomType = ROOM_TYPE_BOSS, + bCannotBeElite = true, + nDepth = 13, + vCenter = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE + MAP_ATLAS_ACT2_OFFSET, 0 ), + vSize = Vector( 2 * MAP_ATLAS_ROOM_SIZE, 2 * MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + -- + -- Act 3 + -- + a3_1a = + { + name="a3_1a", + exit_up="a3_2a", + exit_side="a3_2b", + nRoomType = ROOM_TYPE_BONUS, + bCannotBeElite = true, + nDepth = 14, + vCenter = Vector( -1 * MAP_ATLAS_ROOM_SIZE / 2, 1 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a3_2a = + { + name="a3_2a", + exit_up="a3_3a", + exit_side="a3_3b", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 15, + vCenter = Vector( -1 * MAP_ATLAS_ROOM_SIZE / 2, 3 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a3_2b = + { + name="a3_2b", + exit_up="a3_3b", + exit_side="a3_3c", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 15, + vCenter = Vector( -3 * MAP_ATLAS_ROOM_SIZE / 2, 1 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a3_3a = + { + name="a3_3a", + exit_up="a3_4a", + exit_side="a3_4b", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 16, + vCenter = Vector( -1 * MAP_ATLAS_ROOM_SIZE / 2, 5 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a3_3b = + { + name="a3_3b", + exit_up="a3_4b", + exit_side="a3_4c", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 16, + vCenter = Vector( -3 * MAP_ATLAS_ROOM_SIZE / 2, 3 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a3_3c = + { + name="a3_3c", + exit_up="a3_4c", + exit_side="a3_4d", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 16, + vCenter = Vector( -5 * MAP_ATLAS_ROOM_SIZE / 2, 1 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a3_4a = + { + name="a3_4a", + exit_side="a3_5a", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 17, + vCenter = Vector( -1 * MAP_ATLAS_ROOM_SIZE / 2, 7 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a3_4b = + { + name="a3_4b", + exit_up="a3_5a", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 17, + vCenter = Vector( -3 * MAP_ATLAS_ROOM_SIZE / 2, 5 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a3_4c = + { + name="a3_4c", + exit_side="a3_5b", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 17, + vCenter = Vector( -5 * MAP_ATLAS_ROOM_SIZE / 2, 3 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a3_4d = + { + name="a3_4d", + exit_up="a3_5b", + nRoomType = ROOM_TYPE_ENEMY, + nDepth = 17, + vCenter = Vector( -7 * MAP_ATLAS_ROOM_SIZE / 2, 1 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a3_5a = + { + name="a3_5a", + exit_side="a3_boss", + nRoomType = ROOM_TYPE_TRANSITIONAL, + bCannotBeElite = true, + nDepth = 18, + vCenter = Vector( -3 * MAP_ATLAS_ROOM_SIZE / 2, 7 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + a3_5b = + { + name="a3_5b", + exit_up="a3_boss", + nRoomType = ROOM_TYPE_TRANSITIONAL, + bCannotBeElite = true, + nDepth = 18, + vCenter = Vector( -7 * MAP_ATLAS_ROOM_SIZE / 2, 3 * MAP_ATLAS_ROOM_SIZE / 2, 0 ), + vSize = Vector( MAP_ATLAS_ROOM_SIZE, MAP_ATLAS_ROOM_SIZE, 0 ) + }, + + a3_boss = + { + name="a3_boss", + nRoomType = ROOM_TYPE_BOSS, + bCannotBeElite = true, + nDepth = 19, + vCenter = Vector( -3 * MAP_ATLAS_ROOM_SIZE, 3 * MAP_ATLAS_ROOM_SIZE, 0 ), + vSize = Vector( 2 * MAP_ATLAS_ROOM_SIZE, 2 * MAP_ATLAS_ROOM_SIZE, 0 ) + }, +} + +_G.ENCOUNTER_DEFINITIONS = +{ + -- Spawn room encounter + encounter_starting_room = + { + nEncounterType = ROOM_TYPE_STARTING, + nMinDepth = 1, + nMaxDepth = 1, + }, + + -- Normal encounters + encounter_empty_cavern = + { + szMapNames = { "empty_cavern" }, + nEncounterType = ROOM_TYPE_TRANSITIONAL, + nMinDepth = 12, + nMaxDepth = 12, + }, + + encounter_empty_beach = + { + szMapNames = { "empty_beach" }, + nEncounterType = ROOM_TYPE_TRANSITIONAL, + nMinDepth = 18, + nMaxDepth = 18, + }, + encounter_brewmaster = + { + szMapNames = { "radiant_ring" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 2, + nMaxDepth = 2, + }, + encounter_hellbears_portal_v3 = + { + szMapNames = { "fodder_arena2" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 2, + nMaxDepth = 2, + }, + encounter_pinecones = + { + szMapNames = { "fodder_random_portals", }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 2, + nMaxDepth = 2, + }, + encounter_quill_beasts = + { + szMapNames = { "radiant_forest", }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 2, + nMaxDepth = 2, + }, + encounter_jungle_hijinx = + { + szMapNames = { "jungle_hijinx" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 3, + nMaxDepth = 3, + }, + encounter_tusk_skeletons = + { + szMapNames = { "defend_highground_snow", }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 3, + nMaxDepth = 3, + }, + encounter_bombers = + { + szMapNames = { "defend_highground" }, -- Need a "trigger_spawn_creatures" trigger + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 3, + nMaxDepth = 3, + }, + encounter_drow_ranger_miniboss = + { + szMapNames = { "drow_ranger_miniboss" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 3, + nMaxDepth = 3, + }, + + encounter_wave_blasters = + { + szMapNames = { "arena" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 4, + nMaxDepth = 4, + }, + encounter_baby_ogres = + { + szMapNames = { "baby_ogres", }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 4, + nMaxDepth = 4, + }, + encounter_morphlings_b = + { + szMapNames = { "shoal", }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 4, + nMaxDepth = 4, + }, + encounter_zealot_scarabs = + { + szMapNames = { "desert_oasis" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 4, + nMaxDepth = 4, + }, + + encounter_ogre_seals = + { + szMapNames = { "snowy_river" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 5, + nMaxDepth = 5, + }, + encounter_warlocks = + { + szMapNames = { "scorched_plain" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 5, + nMaxDepth = 5, + }, + encounter_gauntlet = + { + szMapNames = { "catacombs", }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 5, + nMaxDepth = 5, + }, + + -- Act 2 + + encounter_morty_transition = + { + szMapNames = { "morty_transition" }, + nEncounterType = ROOM_TYPE_BONUS, + nMinDepth = 7, + nMaxDepth = 7, + }, + encounter_penguins_transition = + { + szMapNames = { "penguins_transition" }, + nEncounterType = ROOM_TYPE_BONUS, + nMinDepth = 7, + nMaxDepth = 7, + }, + + encounter_mirana = + { + szMapNames = { "plains" }, -- If you add more here, make sure there are info_target "retreat_point" entities authored in the map + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 8, + nMaxDepth = 8, + }, + encounter_mushroom_mines = + { + szMapNames = { "mushroom_mines" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 8, + nMaxDepth = 8, + }, + encounter_legion_commander = + { + szMapNames = { "radiant_stadium" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 8, + nMaxDepth = 8, + }, + + encounter_troll_warlord = + { + szMapNames = { "dire_trading_post" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 9, + nMaxDepth = 9, + }, + encounter_pudge_miniboss = + { + szMapNames = { "pudge_defend_lowground" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 9, + nMaxDepth = 9, + }, + encounter_pucks = + { + szMapNames = { "meadow" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 9, + nMaxDepth = 9, + }, + encounter_dark_seer = + { + szMapNames = { "frozen_cliffs" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 9, + nMaxDepth = 9, + }, + + encounter_spectres = + { + szMapNames = { "gloom" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 10, + nMaxDepth = 10, + }, + encounter_shadow_demons = + { + szMapNames = { "shadow_demon_forest" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 10, + nMaxDepth = 10, + }, + encounter_rock_golems = + { + szMapNames = { "mines_arena" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 10, + nMaxDepth = 10, + }, + + encounter_naga_siren = + { + szMapNames = { "defend_lowground" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 10, + nMaxDepth = 10, + }, + + encounter_dire_siege = + { + szMapNames = { "a2_gauntlet" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 11, + nMaxDepth = 11, + }, + encounter_big_ogres = + { + szMapNames = { "bog", }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 11, + nMaxDepth = 11, + }, + encounter_dragon_knight = + { + szMapNames = { "fortress", }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 11, + nMaxDepth = 11, + }, + + encounter_kunkka_tide = + { + szMapNames = { "coastal_arena", }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 11, + nMaxDepth = 11, + }, + + -- Act 3 + encounter_alchemist = + { + szMapNames = { "chemlab" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 15, + nMaxDepth = 15, + }, + + encounter_enraged_wildwings = + { + szMapNames = { "wildwings_arena" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 15, + nMaxDepth = 15, + }, + encounter_elemental_tiny = + { + szMapNames = { "tiny_arena" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 15, + nMaxDepth = 15, + }, + + encounter_bandits = + { + szMapNames = { "badlands" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 16, + nMaxDepth = 16, + }, + encounter_bomb_squad = + { + szMapNames = { "snowy_portals" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 16, + nMaxDepth = 16, + }, + encounter_undead_woods = + { + szMapNames = { "undead_woods" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 16, + nMaxDepth = 16, + }, + + encounter_phoenix = + { + szMapNames = { "burning_mesa" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 17, + nMaxDepth = 17, + }, + encounter_broodmothers = + { + szMapNames = { "spider_cave" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 17, + nMaxDepth = 17, + }, + + encounter_fire_roshan = + { + szMapNames = { "underground_cave" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 17, + nMaxDepth = 17, + }, + + + encounter_boss_visage = + { + szMapNames = { "mausoleum" }, + nEncounterType = ROOM_TYPE_BOSS, + nMinDepth = 6, + nMaxDepth = 6, + }, + + encounter_boss_timbersaw = + { + szMapNames = { "forest_hill_boss" }, + nEncounterType = ROOM_TYPE_BOSS, + nMinDepth = 6, + nMaxDepth = 6, + }, + encounter_temple_guardians = + { + szMapNames = { "floating_chamber_boss2" }, + szFlippedMapNames = { "template_boss_r_to_l" }, + nEncounterType = ROOM_TYPE_BOSS, + nMinDepth = 6, + nMaxDepth = 6, + }, + + encounter_storegga = + { + szMapNames = { "boss_island_r_to_l" }, + szFlippedMapNames = { "template_boss_l_to_r" }, + nEncounterType = ROOM_TYPE_BOSS, + nMinDepth = 13, + nMaxDepth = 13, + }, + encounter_boss_void_spirit = + { + szMapNames = { "boss_void_spirit" }, + szFlippedMapNames = { "template_boss_l_to_r" }, + nEncounterType = ROOM_TYPE_BOSS, + nMinDepth = 13, + nMaxDepth = 13, + }, + + encounter_aghanim = + { + szMapNames = { "aghanim_arena2" }, + nEncounterType = ROOM_TYPE_BOSS, + nMinDepth = 19, + nMaxDepth = 19, + }, + + encounter_rhyzik = + { + szMapNames = { "boss_island_r_to_l" }, + szFlippedMapNames = { "template_boss_l_to_r" }, + nEncounterType = ROOM_TYPE_BOSS, + nMinDepth = 19, + nMaxDepth = 19, + }, + + -- Traps + encounter_jungle_fire_maze = + { + szMapNames = { "jungle_fire_maze" }, + nEncounterType = ROOM_TYPE_TRAPS, + nMinDepth = 3, + nMaxDepth = 6, + }, + + encounter_cliff_pass = + { + szMapNames = { "desert_cliff_pass" }, + nEncounterType = ROOM_TYPE_TRAPS, + nMinDepth = 3, + nMaxDepth = 6, + }, + + encounter_hellfire_canyon = + { + szMapNames = { "hellfire_canyon" }, + nEncounterType = ROOM_TYPE_TRAPS, + nMinDepth = 8, + nMaxDepth = 12, + }, + + encounter_temple_garden = + { + szMapNames = { "temple_garden_traps" }, + nEncounterType = ROOM_TYPE_TRAPS, + nMinDepth = 8, + nMaxDepth = 12, + }, + + encounter_castle_traps = + { + szMapNames = { "castle_traps" }, + nEncounterType = ROOM_TYPE_TRAPS, + nMinDepth = 15, + nMaxDepth = 17, + }, + + encounter_crypt_traps = + { + szMapNames = { "crypt_traps" }, + nEncounterType = ROOM_TYPE_TRAPS, + nMinDepth = 15, + nMaxDepth = 17, + }, + + --[[ + encounter_wrath = + { + szMapNames = { "kerblam" }, + nEncounterType = ROOM_TYPE_TRAPS, + nMinDepth = 7, + nMaxDepth = 19, + }, + ]] + + -- Transitions + --[[ + encounter_transition = + { + szMapNames = { "template_transitional_l_to_r" }, + szFlippedMapNames = { "template_transitional_r_to_l" }, + nEncounterType = ROOM_TYPE_BONUS, + nMinDepth = 1, + nMaxDepth = 19, + }, + ]] + + -- Reward room encounter + --[[ + encounter_test_reward_room = + { + szMapNames = { "template" }, + nEncounterType = ROOM_TYPE_BONUS, + nMinDepth = 2, + nMaxDepth = 19, + }, + ]] + + encounter_bonus_chicken = + { + szMapNames = { "defend_highground_chickens" }, -- Need a "trigger_spawn_creatures" trigger + nEncounterType = ROOM_TYPE_BONUS, + nMinDepth = 14, + nMaxDepth = 14, + }, + + encounter_pangolier = + { + szMapNames = { "temple_arena" }, -- Need a "trigger_spawn_creatures" trigger + nEncounterType = ROOM_TYPE_BONUS, + nMinDepth = 14, + nMaxDepth = 14, + }, + + + + + -- CUT ENCOUNTERS + --[[ + encounter_hellbears_portal_v2 = + { + szMapNames = { "fodder_arena2" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 2, + nMaxDepth = 2, + }, + + encounter_hellbears = + { + szMapNames = { "fodder_arena2" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 2, + nMaxDepth = 2, + }, + + encounter_enraged_hellbears = + { + szMapNames = { "fodder_arena", }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 2, + nMaxDepth = 2, + }, + ]]-- + + --[[ + encounter_wildwings = + { + szMapNames = { "fodder_arena2" }, + nEncounterType = ROOM_TYPE_ENEMY, + nMinDepth = 3, + nMaxDepth = 3, + }, + ]]-- + +} + +-- Used to specify exit heights for particular maps +_G.MAP_EXIT_HEIGHTS = +{ + arena = + { + up = 128, + left = 0, + right = 0, + down = 0, + }, + + baby_ogres = + { + up = 128, + left = 0, + right = 0, + down = 0, + }, + + desert_oasis = + { + up = 128, + left = 0, + right = 0, + down = 0, + }, + + morty_transition = + { + up = 384, + left = 384, + right = 0, + down = 0, + }, + + penguins_transition = + { + up = 0, + left = 0, + right = 0, + down = 0, + }, + + floating_chamber_boss2 = + { + up = 256, + left = 256, + right = 256, + down = 256, + }, + + radiant_stadium = + { + up = 0, + left = 0, + right = 0, + down = 0, + }, + + test_height_diff = + { + up = 256, + left = 0, + right = 128, + down = 0, + }, + + empty_cavern = + { + up = 256, + left = 0, + right = 128, + down = 0, + }, + + empty_beach = + { + up = 256, + left = 0, + right = 128, + down = 0, + }, + + hellfire_canyon = + { + up = 128, + left = 128, + right = 128, + down = 128, + }, + + temple_garden_traps = + { + up = 0, + left = 0, + right = 0, + down = 0, + }, + + mausoleum = + { + up = 256, + left = 256, + right = 0, + down = 0, + }, +} + +-- If you want a particular unit to have a different model scale, put it here +_G.ENCOUNTER_PREVIEW_SCALES = +{ + npc_dota_pinecone_champion = 1.2, + npc_dota_creature_hellbear = 1.2, + npc_dota_creature_spectral_tusk_mage = 1.5, + npc_dota_creature_baby_ogre_tank = 1.3, + npc_dota_creature_large_ogre_seal = 0.8, + npc_dota_creature_dazzle = 1.35, + npc_dota_creature_huge_broodmother = 1.6, + npc_dota_creature_morphling_big = 1.4, + npc_dota_creature_zealot_scarab = 1.4, + npc_dota_creature_ogre_tank = 1.8, + npc_dota_sled_penguin = 3.5, + npc_dota_creature_storegga = 1.5, + npc_dota_creature_mirana = 1.25, + npc_dota_creature_puck = 1.2, + npc_dota_creature_alchemist = 1.2, + npc_dota_creature_pudge = 1.2, + npc_dota_creature_warlock = 1.4, + npc_dota_creature_dragon_knight = 1.2, + npc_dota_creature_pudge_miniboss = 1.3, + npc_dota_creature_bomber = 1.5, + npc_dota_creature_bonus_chicken = 2.8, + npc_dota_creature_temple_guardian = 1.2, + npc_dota_boss_void_spirit = 1.2, + npc_aghsfort_creature_tornado_harpy = 1.8, + npc_dota_creature_drow_ranger_miniboss = 1.5, + npc_dota_creature_dark_seer = 1.5, + npc_dota_creature_shroom_giant = 1.6, + npc_dota_creature_troll_warlord_ranged = 1.5, + npc_dota_creature_bonus_greevil = 2.0, + npc_dota_creature_naga_siren_boss = 1.5, + npc_dota_creature_legion_commander = 1.25, + npc_dota_shop_keeper = 1.5, + npc_dota_spike_trap_ward = 0.5, + npc_dota_creature_huskar = 1.5, +} + +-- For debugging at the moment, a fixed layout of rooms +_G.USE_ENCOUNTER_FIXED_LAYOUT = false + +_G.ENCOUNTER_FIXED_LAYOUT = +{ + a1_1a = "encounter_starting_room", + a1_2a = "encounter_quill_beasts", + a1_2b = "encounter_enraged_hellbears", + a1_3a = "encounter_bombers", + a1_3b = "encounter_jungle_fire_maze", --"encounter_tusk_skeletons", + a1_3c = "encounter_wildwings", + a1_4a = "encounter_wave_blasters", + a1_4b = "encounter_baby_ogres", + a1_4c = "encounter_morphlings", + a1_4d = "encounter_zealot_scarabs", + a1_5a = "encounter_warlocks", + a1_5b = "encounter_ogre_seals", + a1_boss = "encounter_boss_timbersaw", + + a2_transition = "encounter_morty_transition", + + a2_1a = "encounter_pudge_miniboss", + a2_2a = "encounter_mirana", + a2_2b = "encounter_mirana", + a2_3a = "encounter_spectres", + a2_3b = "encounter_rock_golems", + a2_3c = "encounter_spectres", + a2_4a = "encounter_dire_siege", + a2_4b = "encounter_big_ogres", + a2_4c = "encounter_hellfire_canyon", + a2_4d = "encounter_big_ogres", + a2_5a = "encounter_test_immediate_victory", + a2_5b = "encounter_test_immediate_victory", + a2_boss = "encounter_storegga", + + a3_1a = "encounter_bonus_chicken", + a3_2a = "encounter_alchemist", + a3_2b = "encounter_enraged_wildwings", + a3_3a = "encounter_elemental_tiny", + a3_3b = "encounter_bandits", + a3_3c = "encounter_bomb_squad", + a3_4a = "encounter_broodmothers", + a3_4b = "encounter_kunkka_tide", + a3_4c = "encounter_broodmothers", + a3_4d = "encounter_kunkka_tide", + a3_5a = "encounter_test_immediate_victory", + a3_5b = "encounter_test_immediate_victory", + a3_boss = "encounter_rhyzik", +} \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/spawner.lua b/aghanim_singleplayer/scripts/vscripts/spawner.lua new file mode 100755 index 0000000..e3a6e91 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/spawner.lua @@ -0,0 +1,173 @@ +if CDotaSpawner == nil then + CDotaSpawner = class({}) +end + +---------------------------------------------------------------------------- + +function CDotaSpawner:constructor( szSpawnerNameInput, szLocatorNameInput, rgUnitsInfoInput ) + self.szSpawnerName = szSpawnerNameInput + self.szLocatorName = szLocatorNameInput + self.rgUnitsInfo = rgUnitsInfoInput + self.rgSpawners = {} + self.Encounter = nil +end + +---------------------------------------------------------------------------- + +function CDotaSpawner:GetSpawnerType() + return "CDotaSpawner" +end + +---------------------------------------------------------------------------- + +function CDotaSpawner:Precache( context ) + --print( "CDotaSpawner:Precache called for " .. self.szSpawnerName ) + + for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do + PrecacheUnitByNameSync( rgUnitInfo.EntityName, context, -1 ) + end +end + +---------------------------------------------------------------------------- + +function CDotaSpawner:OnEncounterLoaded( EncounterInput ) + --print( "CDotaSpawner:OnEncounterLoaded called for " .. self.szSpawnerName ) + self.Encounter = EncounterInput + self.rgSpawners = self.Encounter:GetRoom():FindAllEntitiesInRoomByName( self.szLocatorName, false ) + if #self.rgSpawners == 0 then + print( "Failed to find entity " .. self.szSpawnerName .. " as spawner position in map " .. self.Encounter:GetRoom():GetMapName() ) + end +end + +---------------------------------------------------------------------------- + +function CDotaSpawner:GetSpawnPositionCount() + return #self.rgSpawners +end + +---------------------------------------------------------------------------- + +function CDotaSpawner:GetSpawnCountPerSpawnPosition() + + local nCount = 0 + for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do + nCount = nCount + rgUnitInfo.Count + end + return nCount + +end + +---------------------------------------------------------------------------- + +function CDotaSpawner:SpawnUnits() + + if #self.rgSpawners == 0 then + print( "ERROR - Spawner " .. self.szSpawnerName .. " found no spawn entities, cannot spawn" ) + return + end + + local nSpawned = 0 + + local hSpawnedUnits = {} + + for nSpawnerIndex,hSpawner in pairs( self.rgSpawners ) do + local vLocation = hSpawner:GetAbsOrigin() + for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do + local hSingleSpawnedUnits = self:SpawnSingleUnitType( rgUnitInfo, vLocation ) + nSpawned = nSpawned + rgUnitInfo.Count + + for _,hUnit in pairs ( hSingleSpawnedUnits ) do + table.insert( hSpawnedUnits, hUnit ) + end + end + end + + printf( "%s spawning %d units", self.szSpawnerName, nSpawned ) + + if #hSpawnedUnits > 0 then + self.Encounter:OnSpawnerFinished( self, hSpawnedUnits ) + end + + return hSpawnedUnits +end + +---------------------------------------------------------------------------- + +function CDotaSpawner:SpawnSingleUnitType( rgUnitInfo, vLocation ) + local hSpawnedUnits = {} + for i=1,rgUnitInfo.Count do + local vSpawnPos = vLocation + if rgUnitInfo.PositionNoise ~= nil then + vSpawnPos = vSpawnPos + RandomVector( RandomFloat( 0.0, rgUnitInfo.PositionNoise ) ) + end + + local hUnit = CreateUnitByName( rgUnitInfo.EntityName, vSpawnPos, true, nil, nil, rgUnitInfo.Team ) + + if hUnit == nil then + print( "ERROR! Failed to spawn unit named " .. rgUnitInfo.EntityName ) + + else + hUnit:FaceTowards( vLocation ) + if rgUnitInfo.PostSpawn ~= nil then + rgUnitInfo.PostSpawn( hUnit ) + end + table.insert( hSpawnedUnits, hUnit ) + end + end + + return hSpawnedUnits +end + +---------------------------------------------------------------------------- + +function CDotaSpawner:GetSpawners() + return self.rgSpawners +end + +---------------------------------------------------------------------------- + +function CDotaSpawner:SpawnUnitsFromRandomSpawners( nSpawners ) + print( "spawning from " .. nSpawners .. " " .. self.szSpawnerName .. " spawers out of " .. #self.rgSpawners ) + local hAllSpawnedUnits = {} + local Spawners = nil + for n=1,nSpawners do + if Spawners == nil or #Spawners == 0 then + Spawners = deepcopy( self.rgSpawners ) + end + + --print ( #Spawners .. " potential spawners to use." ) + + local nIndex = math.random( 1, #Spawners ) + local Spawner = Spawners[ nIndex ] + if Spawner == nil then + print ( "ERROR! SpawnUnitsFromRandomSpawners went WRONG!!!!!!!!!!!!!" ) + else + local vLocation = Spawner:GetAbsOrigin() + for _,rgUnitInfo in pairs ( self.rgUnitsInfo ) do + local hSpawnedUnits = self:SpawnSingleUnitType( rgUnitInfo, vLocation ) + for _,hUnit in pairs ( hSpawnedUnits ) do + table.insert( hAllSpawnedUnits, hUnit ) + end + end + end + table.remove( Spawners, nIndex ) + end + + if #hAllSpawnedUnits > 0 then + self.Encounter:OnSpawnerFinished( self, hAllSpawnedUnits ) + end + + return hAllSpawnedUnits +end + +---------------------------------------------------------------------------- + +function CDotaSpawner:GetSpawnerName() + return self.szSpawnerName +end + +---------------------------------------------------------------------------- + +function CDotaSpawner:GetLocatorName() + return self.szLocatorName +end \ No newline at end of file diff --git a/aghanim_singleplayer/scripts/vscripts/traps/arrow_trap_triggered.lua b/aghanim_singleplayer/scripts/vscripts/traps/arrow_trap_triggered.lua new file mode 100755 index 0000000..55658e0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/traps/arrow_trap_triggered.lua @@ -0,0 +1,47 @@ + +--------------------------------------------------------------------------- +-- Arrow Trap +--------------------------------------------------------------------------- + +function OnTrigger( trigger ) + if thisEntity.isTrapActivated then + printf( "Trap Skip" ) + return + end + + EmitGlobalSound( "ui.ui_player_disconnected" ) + EmitSoundOn( "AghanimsFortress.TrapActivate", thisEntity ) + thisEntity.isTrapActivated = true + + thisEntity.hArrowAbility = thisEntity:FindAbilityByName( "arrow" ) + if thisEntity.hArrowAbility == nil then + print( "ERROR: thisEntity.hArrowAbility not found" ) + return + end + + local fDelay = 0.6 + thisEntity:SetContextThink( "ArrowTrapActivate", function() return ArrowTrapActivate() end, fDelay ) +end + +--------------------------------------------------------------------------- + +function ArrowTrapActivate() + if not IsServer() then + return + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + if thisEntity.isTrapActivated == true then + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hArrowAbility, -1 ) + + thisEntity.isTrapActivated = false + end + + return -1 +end + +--------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_a.lua b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_a.lua new file mode 100755 index 0000000..3b344d0 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_a.lua @@ -0,0 +1,56 @@ + +--print( "fire_trap_cycle_a" ) + +--------------------------------------------------------------------------- +-- Fire Trap Cycle +--------------------------------------------------------------------------- + +function OnTrigger( trigger ) + thisEntity.fRefireTime = 1.5 + + EmitGlobalSound( "ui.ui_player_disconnected" ) + EmitSoundOn( "AghanimsFortress.FireTrap", hTrigger ) + + thisEntity.hBreatheFireAbility = thisEntity:FindAbilityByName( "breathe_fire" ) + if thisEntity.hBreatheFireAbility == nil then + print( "ERROR: thisEntity.hBreatheFireAbility not found" ) + return + end + + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + + thisEntity:SetContextThink( "ActivateTrap", function() return FireTrapActivate() end, 0 ) +end + +--------------------------------------------------------------------------- + +function DisableTrap( trigger ) + thisEntity.bDisabled = true +end + +--------------------------------------------------------------------------- + +function FireTrapActivate() + if not IsServer() then + return + end + + if thisEntity.bDisabled then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + if GameRules:GetGameTime() >= thisEntity.fNextAttackTime then + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hBreatheFireAbility, -1 ) + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + end + + return 0.5 +end + +--------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_alternating.lua b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_alternating.lua new file mode 100755 index 0000000..6d04d1b --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_alternating.lua @@ -0,0 +1,90 @@ + +--------------------------------------------------------------------------- +-- Fire Trap +--------------------------------------------------------------------------- + +function OnTrigger( trigger ) + EmitGlobalSound( "ui.ui_player_disconnected" ) + EmitSoundOn( "AghanimsFortress.FireTrap", hTrigger ) + + thisEntity.hBreatheFireAbility = thisEntity:FindAbilityByName( "breathe_fire" ) + if thisEntity.hBreatheFireAbility == nil then + print( "ERROR: thisEntity.hBreatheFireAbility not found" ) + return + end + + thisEntity.fRefireTime = 1.8 + thisEntity.fQuickRefireTime = 0.5 + thisEntity.bNextAttackIsNormal = false + + thisEntity.nQuickRefires = 0 + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fQuickRefireTime + + thisEntity:SetContextThink( "FireTrapActivateAlternating", function() return FireTrapActivateAlternating() end, 0 ) +end + +--------------------------------------------------------------------------- + +function DisableTrap( trigger ) + thisEntity.bDisabled = true +end + +--------------------------------------------------------------------------- + +function FireTrapActivateAlternating() + if not IsServer() then + return + end + + if thisEntity.bDisabled then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + if GameRules:GetGameTime() >= thisEntity.fNextAttackTime then + if thisEntity.bNextAttackIsNormal == false then + return QuickRefire() + else + return NormalRefire() + end + end + + return 0.25 +end + +--------------------------------------------------------------------------- + +function QuickRefire() + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hBreatheFireAbility, -1 ) + + thisEntity.nQuickRefires = thisEntity.nQuickRefires + 1 + + if thisEntity.nQuickRefires <= 2 then + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fQuickRefireTime + else + thisEntity.bNextAttackIsNormal = true + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + thisEntity.nQuickRefires = 0 -- reset counter + end + + return 0.25 +end + +--------------------------------------------------------------------------- + +function NormalRefire() + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hBreatheFireAbility, -1 ) + + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + thisEntity.bNextAttackIsNormal = false + + return 0.25 +end + +--------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_b.lua b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_b.lua new file mode 100755 index 0000000..738ebd6 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_b.lua @@ -0,0 +1,54 @@ + +--------------------------------------------------------------------------- +-- Fire Trap Cycle +--------------------------------------------------------------------------- + +function OnTrigger( trigger ) + thisEntity.fRefireTime = 2.0 + + EmitGlobalSound( "ui.ui_player_disconnected" ) + EmitSoundOn( "AghanimsFortress.FireTrap", hTrigger ) + + thisEntity.hBreatheFireAbility = thisEntity:FindAbilityByName( "breathe_fire" ) + if thisEntity.hBreatheFireAbility == nil then + print( "ERROR: thisEntity.hBreatheFireAbility not found" ) + return + end + + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + + thisEntity:SetContextThink( "ActivateTrap", function() return FireTrapActivate() end, 0 ) +end + +--------------------------------------------------------------------------- + +function DisableTrap( trigger ) + thisEntity.bDisabled = true +end + +--------------------------------------------------------------------------- + +function FireTrapActivate() + if not IsServer() then + return + end + + if thisEntity.bDisabled then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + if GameRules:GetGameTime() >= thisEntity.fNextAttackTime then + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hBreatheFireAbility, -1 ) + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + end + + return 0.5 +end + +--------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_c.lua b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_c.lua new file mode 100755 index 0000000..0b68f0e --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_c.lua @@ -0,0 +1,54 @@ + +--------------------------------------------------------------------------- +-- Fire Trap Cycle +--------------------------------------------------------------------------- + +function OnTrigger( trigger ) + thisEntity.fRefireTime = 2.5 + + EmitGlobalSound( "ui.ui_player_disconnected" ) + EmitSoundOn( "AghanimsFortress.FireTrap", hTrigger ) + + thisEntity.hBreatheFireAbility = thisEntity:FindAbilityByName( "breathe_fire" ) + if thisEntity.hBreatheFireAbility == nil then + print( "ERROR: thisEntity.hBreatheFireAbility not found" ) + return + end + + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + + thisEntity:SetContextThink( "ActivateTrap", function() return FireTrapActivate() end, 0 ) +end + +--------------------------------------------------------------------------- + +function DisableTrap( trigger ) + thisEntity.bDisabled = true +end + +--------------------------------------------------------------------------- + +function FireTrapActivate() + if not IsServer() then + return + end + + if thisEntity.bDisabled then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + if GameRules:GetGameTime() >= thisEntity.fNextAttackTime then + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hBreatheFireAbility, -1 ) + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + end + + return 0.5 +end + +--------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_d.lua b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_d.lua new file mode 100755 index 0000000..d30f604 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_d.lua @@ -0,0 +1,54 @@ + +--------------------------------------------------------------------------- +-- Fire Trap Cycle +--------------------------------------------------------------------------- + +function OnTrigger( trigger ) + thisEntity.fRefireTime = 3.9 + + EmitGlobalSound( "ui.ui_player_disconnected" ) + EmitSoundOn( "AghanimsFortress.FireTrap", hTrigger ) + + thisEntity.hBreatheFireAbility = thisEntity:FindAbilityByName( "breathe_fire" ) + if thisEntity.hBreatheFireAbility == nil then + print( "ERROR: thisEntity.hBreatheFireAbility not found" ) + return + end + + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + + thisEntity:SetContextThink( "ActivateTrap", function() return FireTrapActivate() end, 0 ) +end + +--------------------------------------------------------------------------- + +function DisableTrap( trigger ) + thisEntity.bDisabled = true +end + +--------------------------------------------------------------------------- + +function FireTrapActivate() + if not IsServer() then + return + end + + if thisEntity.bDisabled then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + if GameRules:GetGameTime() >= thisEntity.fNextAttackTime then + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hBreatheFireAbility, -1 ) + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + end + + return 0.5 +end + +--------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_shuffle.lua b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_shuffle.lua new file mode 100755 index 0000000..cd2f487 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_shuffle.lua @@ -0,0 +1,220 @@ + +--print( "fire_trap_cycle_shuffle" ) + +--------------------------------------------------------------------------- +-- Fire Trap Cycle Shuffle +--------------------------------------------------------------------------- +function Spawn( entityKeyValues ) + if not IsServer() then + return + end + + if thisEntity == nil then + return + end + -- Determine the type of trap + -- If any one type is weighted we can insert more entries into the table + thisEntity.hTrapTable = { "standard", "standard", "standard", "tripleshot", "alternating" } + local nRandomType = RandomInt( 1,5 ) -- Change this number to correspond to the trap table entries + thisEntity.szTrapType = thisEntity.hTrapTable[nRandomType] + thisEntity.hRefireTable = { 1.5, 2.0, 2.5, 3.9 } + thisEntity.nQuickRefires = 0 + thisEntity.bNextAttackIsNormal = false + thisEntity.fRefireTime = 1.5 + thisEntity.fQuickRefireTime = 0.5 + + if thisEntity.szTrapType == "standard" then + --print("Standard Trap") + local nRandomRefireTime = RandomInt( 1,4 ) + thisEntity.fRefireTime = thisEntity.hRefireTable[ nRandomRefireTime ] + --print( "Refire time = " .. thisEntity.fRefireTime ) + elseif thisEntity.szTrapType == "tripleshot" then + --print("Triple Shot Trap") + thisEntity.fRefireTime = 2.0 + --print( "Refire time = " .. thisEntity.fRefireTime ) + elseif thisEntity.szTrapType == "alternating" then + --print("Alternating Trap") + thisEntity.fRefireTime = 1.8 + --print( "Refire time = " .. thisEntity.fRefireTime ) + end +end + + +function OnTrigger( trigger ) + EmitGlobalSound( "ui.ui_player_disconnected" ) + EmitSoundOn( "AghanimsFortress.FireTrap", hTrigger ) + + thisEntity.hBreatheFireAbility = thisEntity:FindAbilityByName( "breathe_fire" ) + if thisEntity.hBreatheFireAbility == nil then + print( "ERROR: thisEntity.hBreatheFireAbility not found" ) + return + end + + if thisEntity.szTrapType == "standard" then + -- Standard + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + + thisEntity:SetContextThink( "FireTrapActivate", function() return FireTrapActivate() end, 0 ) + elseif thisEntity.szTrapType == "tripleshot" then + -- TripleShot + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fQuickRefireTime + + thisEntity:SetContextThink( "FireTrapActivateTriple", function() return FireTrapActivateTriple() end, 0 ) + elseif thisEntity.szTrapType == "alternating" then + -- Alternating + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fQuickRefireTime + + thisEntity:SetContextThink( "FireTrapActivateAlternating", function() return FireTrapActivateAlternating() end, 0 ) + end +end + +--------------------------------------------------------------------------- + +function DisableTrap( trigger ) + thisEntity.bDisabled = true +end + +--------------------------------------------------------------------------- + +function FireTrapActivate() + if not IsServer() then + return + end + + if thisEntity.bDisabled then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + if GameRules:GetGameTime() >= thisEntity.fNextAttackTime then + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hBreatheFireAbility, -1 ) + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + end + + return 0.5 +end + +--------------------------------------------------------------------------- + +function FireTrapActivateTriple() + if not IsServer() then + return + end + + if thisEntity.bDisabled then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + if GameRules:GetGameTime() >= thisEntity.fNextAttackTime then + return QuickRefireTriple() + end + + return 0.25 +end + +--------------------------------------------------------------------------- + +function QuickRefireTriple() + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hBreatheFireAbility, -1 ) + + thisEntity.nQuickRefires = thisEntity.nQuickRefires + 1 + + if thisEntity.nQuickRefires <= 2 then + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fQuickRefireTime + else + thisEntity.bNextAttackIsNormal = true + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + thisEntity.nQuickRefires = 0 -- reset counter + end + + return 0.25 +end + +--------------------------------------------------------------------------- + +function FireTrapActivateAlternating() + if not IsServer() then + return + end + + if thisEntity.bDisabled then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + if GameRules:GetGameTime() >= thisEntity.fNextAttackTime then + if thisEntity.bNextAttackIsNormal == false then + return QuickRefireAlternating() + else + return NormalRefire() + end + end + + return 0.25 +end + +--------------------------------------------------------------------------- + +function QuickRefireAlternating() + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hBreatheFireAbility, -1 ) + + thisEntity.nQuickRefires = thisEntity.nQuickRefires + 1 + + if thisEntity.nQuickRefires <= 2 then + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fQuickRefireTime + else + thisEntity.bNextAttackIsNormal = true + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + thisEntity.nQuickRefires = 0 -- reset counter + end + + return 0.25 +end + +--------------------------------------------------------------------------- + +function NormalRefire() + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hBreatheFireAbility, -1 ) + + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + thisEntity.bNextAttackIsNormal = false + + return 0.25 +end + +--------------------------------------------------------------------------- + +function PickRandomShuffle( reference_list, bucket ) + if ( #reference_list == 0 ) then + return nil + end + + if ( #bucket == 0 ) then + -- ran out of options, refill the bucket from the reference + for k, v in pairs(reference_list) do + bucket[k] = v + end + end + + -- pick a value from the bucket and remove it + local pick_index = RandomInt( 1, #bucket ) + local result = bucket[ pick_index ] + table.remove( bucket, pick_index ) + return result +end + +--------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_tripleshot.lua b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_tripleshot.lua new file mode 100755 index 0000000..1106e38 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_cycle_tripleshot.lua @@ -0,0 +1,73 @@ + +--------------------------------------------------------------------------- +-- Fire Trap +--------------------------------------------------------------------------- + +function OnTrigger( trigger ) + EmitGlobalSound( "ui.ui_player_disconnected" ) + EmitSoundOn( "AghanimsFortress.FireTrap", hTrigger ) + + thisEntity.hBreatheFireAbility = thisEntity:FindAbilityByName( "breathe_fire" ) + if thisEntity.hBreatheFireAbility == nil then + print( "ERROR: thisEntity.hBreatheFireAbility not found" ) + return + end + + thisEntity.fRefireTime = 2.0 + thisEntity.fQuickRefireTime = 0.5 + + thisEntity.nQuickRefires = 0 + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fQuickRefireTime + + thisEntity:SetContextThink( "ActivateTrap", function() return FireTrapActivate() end, 0 ) +end + +--------------------------------------------------------------------------- + +function DisableTrap( trigger ) + thisEntity.bDisabled = true +end + +--------------------------------------------------------------------------- + +function FireTrapActivate() + if not IsServer() then + return + end + + if thisEntity.bDisabled then + return -1 + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + if GameRules:GetGameTime() >= thisEntity.fNextAttackTime then + return QuickRefire() + end + + return 0.25 +end + +--------------------------------------------------------------------------- + +function QuickRefire() + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hBreatheFireAbility, -1 ) + + thisEntity.nQuickRefires = thisEntity.nQuickRefires + 1 + + if thisEntity.nQuickRefires <= 2 then + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fQuickRefireTime + else + thisEntity.bNextAttackIsNormal = true + thisEntity.fNextAttackTime = GameRules:GetGameTime() + thisEntity.fRefireTime + thisEntity.nQuickRefires = 0 -- reset counter + end + + return 0.25 +end + +--------------------------------------------------------------------------- + diff --git a/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_triggered.lua b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_triggered.lua new file mode 100755 index 0000000..0496d7c --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/traps/fire_trap_triggered.lua @@ -0,0 +1,49 @@ + +--------------------------------------------------------------------------- +-- Fire Trap +--------------------------------------------------------------------------- + +function OnTrigger( trigger ) + if thisEntity.isTrapActivated then + print( "Trap Skip" ) + return + end + + EmitGlobalSound( "ui.ui_player_disconnected" ) + EmitSoundOn( "AghanimsFortress.FireTrap", thisEntity ) + thisEntity.isTrapActivated = true + + thisEntity.hBreatheFireAbility = thisEntity:FindAbilityByName( "breathe_fire" ) + if thisEntity.hBreatheFireAbility == nil then + print( "ERROR: thisEntity.hBreatheFireAbility not found" ) + return + end + + thisEntity:SetContextThink( "ActivateTrap", function() return FireTrapActivate() end, 0 ) +end + +function FireTrapActivate() + if not IsServer() then + return + end + + if GameRules:IsGamePaused() == true then + return 0.5 + end + + if thisEntity.isTrapActivated == true then + --[[ + print( "----------------------------------------------------------" ) + print( "FireTrapActivate... thisEntity:" ) + PrintTable( thisEntity, " " ) + ]] + + thisEntity:SetAnimation( "bark_attack" ); + thisEntity:CastAbilityOnPosition( thisEntity:GetTrapTarget(), thisEntity.hBreatheFireAbility, -1 ) + + thisEntity.isTrapActivated = false + end + + return -1 +end + diff --git a/aghanim_singleplayer/scripts/vscripts/traps/pendulum_trap.lua b/aghanim_singleplayer/scripts/vscripts/traps/pendulum_trap.lua new file mode 100755 index 0000000..baeb6f8 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/traps/pendulum_trap.lua @@ -0,0 +1,41 @@ + +require("ai/shared") + +-------------------------------------------------------------------------------- + +function Spawn( entityKeyValues ) + if IsServer() == false then + return + end + + --printf( "thisEntity:GetUnitName() == %s", thisEntity:GetUnitName() ) + + thisEntity.hSwingAbility = thisEntity:FindAbilityByName( "pendulum_swing" ) + thisEntity:SetContextThink( "PendulumTrapThink", PendulumTrapThink, RandomFloat( 0.1, 1.0 ) ) +end + +-------------------------------------------------------------------------------- + +function PendulumTrapThink() + if IsServer() then + local enemies = GetEnemyHeroesInRange( thisEntity, 2048 ) -- will need to search just in room + if not enemies or #enemies == 0 then + --print( "no enemies" ) + thisEntity:InterruptChannel() + return RandomFloat( 0.1, 1.0 ) + end + + if not thisEntity:IsChanneling() then + ExecuteOrderFromTable({ + UnitIndex = thisEntity:entindex(), + OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET, + AbilityIndex = thisEntity.hSwingAbility:entindex(), + Queue = false, + }) + end + end + + return 1 +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/traps/spike_trap_ai.lua b/aghanim_singleplayer/scripts/vscripts/traps/spike_trap_ai.lua new file mode 100755 index 0000000..982bdd2 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/traps/spike_trap_ai.lua @@ -0,0 +1,38 @@ +--[[ spike_trap_ai.lua ]] + +--------------------------------------------------------------------------- +-- AI for the Spike Trap +--------------------------------------------------------------------------- + +local triggerActive = true + +function Fire(trigger) + local triggerName = thisEntity:GetName() + --print(tostring(triggerName)) + local level = trigger.activator:GetLevel() + local target = Entities:FindByName( nil, triggerName .. "_target" ) + local spikes = triggerName .. "_model" + local dust = triggerName .. "_particle" + local fx = triggerName .. "_fx" + --print(spikes) + if target ~= nil and triggerActive == true then + local spikeTrap = thisEntity:FindAbilityByName("spike_trap") + thisEntity:CastAbilityOnPosition(target:GetOrigin(), spikeTrap, -1 ) + EmitSoundOn( "AghanimsFortress.TrapActivate" , spikeTrap) + DoEntFire( spikes, "SetAnimation", "spiketrap_activate", 0, self, self ) + DoEntFire( dust, "Start", "", 0, self, self ) + DoEntFire( dust, "Stop", "", 2, self, self ) + DoEntFire( fx, "Start", "", 0, self, self ) + DoEntFire( fx, "Stop", "", 2, self, self ) + + --thisEntity:SetContextThink( "ResetTrapModel", function() ResetTrapModel( spikes ) end, 3 ) + triggerActive = false + thisEntity:SetContextThink( "ResetTrapModel", function() ResetTrapModel() end, 4 ) + end +end + +function ResetTrapModel() + DoEntFire( spikes, "SetAnimation", "spiketrap_idle", 0, self, self ) + triggerActive = true +end + diff --git a/aghanim_singleplayer/scripts/vscripts/triggers.lua b/aghanim_singleplayer/scripts/vscripts/triggers.lua new file mode 100755 index 0000000..c94eeef --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/triggers.lua @@ -0,0 +1,29 @@ + +-- This file is a redirection to events.lua +--print( "loaded triggers.lua" ) + +function OnStartTouch( trigger ) + local triggerName = thisEntity:GetName() + --printf( "OnStartTouch - trigger \"%s\"", triggerName ) + + local event = {} + event["trigger_name"] = triggerName + event["activator_entindex"] = trigger.activator:GetEntityIndex() + event["caller_entindex"] = trigger.caller:GetEntityIndex() + FireGameEvent( "trigger_start_touch", event ) +end + +-------------------------------------------------------------------------------- + +function OnEndTouch( trigger ) + local triggerName = thisEntity:GetName() + --printf( "OnEndTouch - trigger \"%s\"", triggerName ) + + local event = {} + event["trigger_name"] = triggerName + event["activator_entindex"] = trigger.activator:GetEntityIndex() + event["caller_entindex"] = trigger.caller:GetEntityIndex() + FireGameEvent( "trigger_end_touch", event ) +end + +-------------------------------------------------------------------------------- diff --git a/aghanim_singleplayer/scripts/vscripts/utility_functions.lua b/aghanim_singleplayer/scripts/vscripts/utility_functions.lua new file mode 100755 index 0000000..a7eb0f1 --- /dev/null +++ b/aghanim_singleplayer/scripts/vscripts/utility_functions.lua @@ -0,0 +1,313 @@ +--[[ Utility Functions ]] + +--------------------------------------------------------------------------- +-- Bitwise and +-------------------------------------------------------------------------- +function bitand(a, b) + local result = 0 + local bitval = 1 + while a > 0 and b > 0 do + if a % 2 == 1 and b % 2 == 1 then -- test the rightmost bits + result = result + bitval -- set the current bit + end + bitval = bitval * 2 -- shift left + a = math.floor(a/2) -- shift right + b = math.floor(b/2) + end + return result +end + +--------------------------------------------------------------------------- +function Lerp(t, a, b) + return a + t * (b - a) +end + +--------------------------------------------------------------------------- +function LerpClamp(t, a, b) + if t < 0 then + t = 0 + elseif t > 1 then + t = 1 + end + return Lerp( t, a, b ) +end + +--------------------------------------------------------------------------- +-- Broadcast messages to screen +--------------------------------------------------------------------------- +function printf(...) + print(string.format(...)) +end + +--------------------------------------------------------------------------- +-- Broadcast messages to screen +--------------------------------------------------------------------------- +function BroadcastMessage( sMessage, fDuration ) + local centerMessage = { + message = sMessage, + duration = fDuration + } + FireGameEvent( "show_center_message", centerMessage ) +end + +--------------------------------------------------------------------------- +-- GetRandomElement +--------------------------------------------------------------------------- +function GetRandomElement( table ) + local nRandomIndex = RandomInt( 1, #table ) + local randomElement = table[ nRandomIndex ] + return randomElement +end + +--------------------------------------------------------------------------- +-- ShuffledList +--------------------------------------------------------------------------- +function ShuffledList( orig_list ) + local list = shallowcopy( orig_list ) + local result = {} + local count = #list + for i = 1, count do + local pick = RandomInt( 1, #list ) + result[ #result + 1 ] = list[ pick ] + table.remove( list, pick ) + end + return result +end + +--------------------------------------------------------------------------- +-- ShuffleListInPlace +--------------------------------------------------------------------------- +function ShuffleListInPlace( list, hRandomStream ) + local count = #list + for i = 1, count do + local j = 0 + if hRandomStream == nil then + j = RandomInt( 1, #list ) + else + j = hRandomStream:RandomInt( 1, #list ) + end + list[i] , list[j] = list[j] , list[i] + end +end + +--------------------------------------------------------------------------- +-- string.starts +--------------------------------------------------------------------------- +function string.starts( string, start ) + return string.sub( string, 1, string.len( start ) ) == start +end + +function string.ends( String, End ) + return End=='' or string.sub(String,-string.len(End))==End +end + +--------------------------------------------------------------------------- +-- string.split +--------------------------------------------------------------------------- +function string.split( str, sep ) + local sep, fields = sep or ":", {} + local pattern = string.format("([^%s]+)", sep) + str:gsub(pattern, function(c) fields[#fields+1] = c end) + return fields +end + +--------------------------------------------------------------------------- +-- shallowcopy +--------------------------------------------------------------------------- +function shallowcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in pairs(orig) do + copy[orig_key] = orig_value + end + else -- number, string, boolean, etc + copy = orig + end + return copy +end + +--------------------------------------------------------------------------- +-- deepcopy +--------------------------------------------------------------------------- +function deepcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in next, orig, nil do + copy[deepcopy(orig_key)] = deepcopy(orig_value) + end + setmetatable(copy, deepcopy(getmetatable(orig))) + else -- number, string, boolean, etc + copy = orig + end + + return copy +end + + +--------------------------------------------------------------------------- +-- Table functions +--------------------------------------------------------------------------- +function PrintTable( t, indent ) + --print( "PrintTable( t, indent ): " ) + + if type(t) ~= "table" then return end + + if indent == nil then + indent = " " + end + + for k,v in pairs( t ) do + if type( v ) == "table" then + if ( v ~= t ) then + print( indent .. tostring( k ) .. ":\n" .. indent .. "{" ) + PrintTable( v, indent .. " " ) + print( indent .. "}" ) + end + else + print( indent .. tostring( k ) .. ":" .. tostring(v) ) + end + end +end + +function table.ToStringShallow(t) + if t == nil then return "nil" end + + local s = "{" + for k,v in pairs(t) do + s = string.format(" %s %s=%s, ", s, k, v) + end + s = s .. "}" + return s +end + +function TableFindKey( table, val ) + if table == nil then + print( "nil" ) + return nil + end + + for k, v in pairs( table ) do + if v == val then + return k + end + end + return nil +end + +function TableLength( t ) + local nCount = 0 + for _ in pairs( t ) do + nCount = nCount + 1 + end + return nCount +end + +function tablefirstkey( t ) + for k, _ in pairs( t ) do + return k + end + return nil +end + +function tablehaselements( t ) + return tablefirstkey( t ) ~= nil +end + +--------------------------------------------------------------------------- + +function TableContainsValue( t, value ) + for _, v in pairs( t ) do + if v == value then + return true + end + end + + return false +end + +function TableContainsSubstring( t, substr ) + for _, v in pairs( t ) do + if v and string.match(v,substr) then + return true + end + end + + return false +end + +--------------------------------------------------------------------------- + +function ConvertToTime( value ) + local value = tonumber( value ) + + if value <= 0 then + return "00:00:00"; + else + hours = string.format( "%02.f", math.floor( value / 3600 ) ); + mins = string.format( "%02.f", math.floor( value / 60 - ( hours * 60 ) ) ); + secs = string.format( "%02.f", math.floor( value - hours * 3600 - mins * 60 ) ); + if math.floor( value / 3600 ) == 0 then + return mins .. ":" .. secs + end + return hours .. ":" .. mins .. ":" .. secs + end +end + +--------------------------------------------------------------------------- + +function SimpleSpline( value ) + local valueSquared = value * value; + return ( 3 * valueSquared ) - ( 2 * valueSquared * value ) +end + +--------------------------------------------------------------------------- + +function IsGlobalAscensionCaster( hUnit ) + if hUnit == nil then + return false + end + return hUnit:GetName() == "ascension_global_caster" +end + +--------------------------------------------------------------------------- +-- AI functions +--------------------------------------------------------------------------- + +function SetAggroRange( hUnit, fRange ) + --print( string.format( "Set search radius and acquisition range (%.2f) for unit %s", fRange, hUnit:GetUnitName() ) ) + hUnit.fSearchRadius = fRange + hUnit:SetAcquisitionRange( fRange ) + hUnit.bAcqRangeModified = true +end + +-------------------------------------------------------------------------------- + +function GetRandomPathablePositionWithin( vPos, nRadius, nMinRadius ) + if IsServer() then + -- Try to find a good position, be willing to fail and return a nil value + local nMaxAttempts = 10 + local nAttempts = 0 + local vTryPos = nil + + if nMinRadius == nil then + nMinRadius = nRadius + end + + repeat + vTryPos = vPos + RandomVector( RandomFloat( nMinRadius, nRadius ) ) + + nAttempts = nAttempts + 1 + if nAttempts >= nMaxAttempts then + break + end + until ( GridNav:CanFindPath( vPos, vTryPos ) ) + + return vTryPos + end +end + +-------------------------------------------------------------------------------- diff --git a/effect/3sha/killbanner_text_a.vpcf_c b/effect/3sha/killbanner_text_a.vpcf_c new file mode 100755 index 0000000..bee6ee1 Binary files /dev/null and b/effect/3sha/killbanner_text_a.vpcf_c differ diff --git a/effect/3sha/tripple_kill_text.vpcf_c b/effect/3sha/tripple_kill_text.vpcf_c new file mode 100755 index 0000000..cb00e37 Binary files /dev/null and b/effect/3sha/tripple_kill_text.vpcf_c differ diff --git a/effect/3sha/vr_killbanner_triplekill.vpcf_c b/effect/3sha/vr_killbanner_triplekill.vpcf_c new file mode 100755 index 0000000..c2db43b Binary files /dev/null and b/effect/3sha/vr_killbanner_triplekill.vpcf_c differ diff --git a/effect/3sha/vr_killbanner_triplekill_a.vpcf_c b/effect/3sha/vr_killbanner_triplekill_a.vpcf_c new file mode 100755 index 0000000..1cef9c6 Binary files /dev/null and b/effect/3sha/vr_killbanner_triplekill_a.vpcf_c differ diff --git a/effect/3sha/vr_killbanner_triplekill_b.vpcf_c b/effect/3sha/vr_killbanner_triplekill_b.vpcf_c new file mode 100755 index 0000000..ea7391b Binary files /dev/null and b/effect/3sha/vr_killbanner_triplekill_b.vpcf_c differ diff --git a/effect/3sha/vr_killbanner_triplekill_c.vpcf_c b/effect/3sha/vr_killbanner_triplekill_c.vpcf_c new file mode 100755 index 0000000..1c5c096 Binary files /dev/null and b/effect/3sha/vr_killbanner_triplekill_c.vpcf_c differ diff --git a/effect/3sha/vr_killbanner_triplekill_d.vpcf_c b/effect/3sha/vr_killbanner_triplekill_d.vpcf_c new file mode 100755 index 0000000..0b61b68 Binary files /dev/null and b/effect/3sha/vr_killbanner_triplekill_d.vpcf_c differ diff --git a/effect/3sha/vr_killbanner_triplekill_e.vpcf_c b/effect/3sha/vr_killbanner_triplekill_e.vpcf_c new file mode 100755 index 0000000..527a84b Binary files /dev/null and b/effect/3sha/vr_killbanner_triplekill_e.vpcf_c differ diff --git a/effect/5sha/rampage_text.vpcf_c b/effect/5sha/rampage_text.vpcf_c new file mode 100755 index 0000000..62392e8 Binary files /dev/null and b/effect/5sha/rampage_text.vpcf_c differ diff --git a/effect/5sha/rampage_text_a.vpcf_c b/effect/5sha/rampage_text_a.vpcf_c new file mode 100755 index 0000000..993823c Binary files /dev/null and b/effect/5sha/rampage_text_a.vpcf_c differ diff --git a/effect/5sha/vr_killbanner_rampage.vpcf_c b/effect/5sha/vr_killbanner_rampage.vpcf_c new file mode 100755 index 0000000..b4034e7 Binary files /dev/null and b/effect/5sha/vr_killbanner_rampage.vpcf_c differ diff --git a/effect/5sha/vr_killbanner_rampage_a.vpcf_c b/effect/5sha/vr_killbanner_rampage_a.vpcf_c new file mode 100755 index 0000000..652d7d4 Binary files /dev/null and b/effect/5sha/vr_killbanner_rampage_a.vpcf_c differ diff --git a/effect/5sha/vr_killbanner_rampage_a0.vpcf_c b/effect/5sha/vr_killbanner_rampage_a0.vpcf_c new file mode 100755 index 0000000..59485ba Binary files /dev/null and b/effect/5sha/vr_killbanner_rampage_a0.vpcf_c differ diff --git a/effect/5sha/vr_killbanner_rampage_a1.vpcf_c b/effect/5sha/vr_killbanner_rampage_a1.vpcf_c new file mode 100755 index 0000000..06875bf Binary files /dev/null and b/effect/5sha/vr_killbanner_rampage_a1.vpcf_c differ diff --git a/effect/5sha/vr_killbanner_rampage_a2.vpcf_c b/effect/5sha/vr_killbanner_rampage_a2.vpcf_c new file mode 100755 index 0000000..5397f2b Binary files /dev/null and b/effect/5sha/vr_killbanner_rampage_a2.vpcf_c differ diff --git a/effect/5sha/vr_killbanner_rampage_a3.vpcf_c b/effect/5sha/vr_killbanner_rampage_a3.vpcf_c new file mode 100755 index 0000000..218fa68 Binary files /dev/null and b/effect/5sha/vr_killbanner_rampage_a3.vpcf_c differ diff --git a/effect/5sha/vr_killbanner_rampage_b.vpcf_c b/effect/5sha/vr_killbanner_rampage_b.vpcf_c new file mode 100755 index 0000000..c833c34 Binary files /dev/null and b/effect/5sha/vr_killbanner_rampage_b.vpcf_c differ diff --git a/effect/5sha/vr_killbanner_rampage_c.vpcf_c b/effect/5sha/vr_killbanner_rampage_c.vpcf_c new file mode 100755 index 0000000..0f31f4e Binary files /dev/null and b/effect/5sha/vr_killbanner_rampage_c.vpcf_c differ diff --git a/effect/5sha/vr_killbanner_rampage_d.vpcf_c b/effect/5sha/vr_killbanner_rampage_d.vpcf_c new file mode 100755 index 0000000..05de892 Binary files /dev/null and b/effect/5sha/vr_killbanner_rampage_d.vpcf_c differ diff --git a/effect/5sha/vr_killbanner_rampage_d0.vpcf_c b/effect/5sha/vr_killbanner_rampage_d0.vpcf_c new file mode 100755 index 0000000..325ab7d Binary files /dev/null and b/effect/5sha/vr_killbanner_rampage_d0.vpcf_c differ diff --git a/effect/5sha/vr_killbanner_rampage_e.vpcf_c b/effect/5sha/vr_killbanner_rampage_e.vpcf_c new file mode 100755 index 0000000..628cddc Binary files /dev/null and b/effect/5sha/vr_killbanner_rampage_e.vpcf_c differ diff --git a/effect/airen/1.vpcf_c b/effect/airen/1.vpcf_c new file mode 100755 index 0000000..3e78127 Binary files /dev/null and b/effect/airen/1.vpcf_c differ diff --git a/effect/airen/1_c.vpcf_c b/effect/airen/1_c.vpcf_c new file mode 100755 index 0000000..65d4396 Binary files /dev/null and b/effect/airen/1_c.vpcf_c differ diff --git a/effect/anyue/anyueember.vpcf_c b/effect/anyue/anyueember.vpcf_c new file mode 100755 index 0000000..596d594 Binary files /dev/null and b/effect/anyue/anyueember.vpcf_c differ diff --git a/effect/anyue/anyueeyes.vpcf_c b/effect/anyue/anyueeyes.vpcf_c new file mode 100755 index 0000000..fb4e88c Binary files /dev/null and b/effect/anyue/anyueeyes.vpcf_c differ diff --git a/effect/anyue/anyueeyes_b.vpcf_c b/effect/anyue/anyueeyes_b.vpcf_c new file mode 100755 index 0000000..46dc77e Binary files /dev/null and b/effect/anyue/anyueeyes_b.vpcf_c differ diff --git a/effect/anyue/anyueeyes_c.vpcf_c b/effect/anyue/anyueeyes_c.vpcf_c new file mode 100755 index 0000000..d1f449a Binary files /dev/null and b/effect/anyue/anyueeyes_c.vpcf_c differ diff --git a/effect/anyue/anyueeyes_d.vpcf_c b/effect/anyue/anyueeyes_d.vpcf_c new file mode 100755 index 0000000..e82ec83 Binary files /dev/null and b/effect/anyue/anyueeyes_d.vpcf_c differ diff --git a/effect/anyue/anyueflying.vpcf_c b/effect/anyue/anyueflying.vpcf_c new file mode 100755 index 0000000..54cb961 Binary files /dev/null and b/effect/anyue/anyueflying.vpcf_c differ diff --git a/effect/anyue/anyueglow.vpcf_c b/effect/anyue/anyueglow.vpcf_c new file mode 100755 index 0000000..6542fc9 Binary files /dev/null and b/effect/anyue/anyueglow.vpcf_c differ diff --git a/effect/anyue/anyuelight.vpcf_c b/effect/anyue/anyuelight.vpcf_c new file mode 100755 index 0000000..6aae83b Binary files /dev/null and b/effect/anyue/anyuelight.vpcf_c differ diff --git a/effect/anyue/anyuelight_flying.vpcf_c b/effect/anyue/anyuelight_flying.vpcf_c new file mode 100755 index 0000000..4d40757 Binary files /dev/null and b/effect/anyue/anyuelight_flying.vpcf_c differ diff --git a/effect/anyue/anyuemagic.vpcf_c b/effect/anyue/anyuemagic.vpcf_c new file mode 100755 index 0000000..c4df93d Binary files /dev/null and b/effect/anyue/anyuemagic.vpcf_c differ diff --git a/effect/anyue/anyuesteam.vpcf_c b/effect/anyue/anyuesteam.vpcf_c new file mode 100755 index 0000000..70ad8cf Binary files /dev/null and b/effect/anyue/anyuesteam.vpcf_c differ diff --git a/effect/anyue/anyuetrail.vpcf_c b/effect/anyue/anyuetrail.vpcf_c new file mode 100755 index 0000000..bf197c8 Binary files /dev/null and b/effect/anyue/anyuetrail.vpcf_c differ diff --git a/effect/anyue/anyuetrail_wing.vpcf_c b/effect/anyue/anyuetrail_wing.vpcf_c new file mode 100755 index 0000000..420facf Binary files /dev/null and b/effect/anyue/anyuetrail_wing.vpcf_c differ diff --git a/effect/arrow/0.vpcf_c b/effect/arrow/0.vpcf_c new file mode 100755 index 0000000..a431e4b Binary files /dev/null and b/effect/arrow/0.vpcf_c differ diff --git a/effect/arrow/1.vpcf_c b/effect/arrow/1.vpcf_c new file mode 100755 index 0000000..bf40753 Binary files /dev/null and b/effect/arrow/1.vpcf_c differ diff --git a/effect/arrow/1/star1.vpcf_c b/effect/arrow/1/star1.vpcf_c new file mode 100755 index 0000000..9c08adf Binary files /dev/null and b/effect/arrow/1/star1.vpcf_c differ diff --git a/effect/arrow/1/star2.vpcf_c b/effect/arrow/1/star2.vpcf_c new file mode 100755 index 0000000..fbb3f59 Binary files /dev/null and b/effect/arrow/1/star2.vpcf_c differ diff --git a/effect/arrow/1/star2_1.vpcf_c b/effect/arrow/1/star2_1.vpcf_c new file mode 100755 index 0000000..0676103 Binary files /dev/null and b/effect/arrow/1/star2_1.vpcf_c differ diff --git a/effect/arrow/1/star3.vpcf_c b/effect/arrow/1/star3.vpcf_c new file mode 100755 index 0000000..1dbfb99 Binary files /dev/null and b/effect/arrow/1/star3.vpcf_c differ diff --git a/effect/arrow/1/star3_1.vpcf_c b/effect/arrow/1/star3_1.vpcf_c new file mode 100755 index 0000000..45cfd2e Binary files /dev/null and b/effect/arrow/1/star3_1.vpcf_c differ diff --git a/effect/arrow/1/star3_2.vpcf_c b/effect/arrow/1/star3_2.vpcf_c new file mode 100755 index 0000000..91e6e9c Binary files /dev/null and b/effect/arrow/1/star3_2.vpcf_c differ diff --git a/effect/arrow/2.vpcf_c b/effect/arrow/2.vpcf_c new file mode 100755 index 0000000..9e9e13e Binary files /dev/null and b/effect/arrow/2.vpcf_c differ diff --git a/effect/arrow/2/star1.vpcf_c b/effect/arrow/2/star1.vpcf_c new file mode 100755 index 0000000..b316daa Binary files /dev/null and b/effect/arrow/2/star1.vpcf_c differ diff --git a/effect/arrow/2/star2.vpcf_c b/effect/arrow/2/star2.vpcf_c new file mode 100755 index 0000000..f1ffaa7 Binary files /dev/null and b/effect/arrow/2/star2.vpcf_c differ diff --git a/effect/arrow/2/star2_1.vpcf_c b/effect/arrow/2/star2_1.vpcf_c new file mode 100755 index 0000000..5182926 Binary files /dev/null and b/effect/arrow/2/star2_1.vpcf_c differ diff --git a/effect/arrow/2/star3.vpcf_c b/effect/arrow/2/star3.vpcf_c new file mode 100755 index 0000000..4512a87 Binary files /dev/null and b/effect/arrow/2/star3.vpcf_c differ diff --git a/effect/arrow/2/star3_1.vpcf_c b/effect/arrow/2/star3_1.vpcf_c new file mode 100755 index 0000000..34e47d6 Binary files /dev/null and b/effect/arrow/2/star3_1.vpcf_c differ diff --git a/effect/arrow/2/star3_2.vpcf_c b/effect/arrow/2/star3_2.vpcf_c new file mode 100755 index 0000000..7fd5d6d Binary files /dev/null and b/effect/arrow/2/star3_2.vpcf_c differ diff --git a/effect/arrow/3.vpcf_c b/effect/arrow/3.vpcf_c new file mode 100755 index 0000000..2d14d79 Binary files /dev/null and b/effect/arrow/3.vpcf_c differ diff --git a/effect/arrow/3/star1.vpcf_c b/effect/arrow/3/star1.vpcf_c new file mode 100755 index 0000000..6f5d012 Binary files /dev/null and b/effect/arrow/3/star1.vpcf_c differ diff --git a/effect/arrow/3/star2.vpcf_c b/effect/arrow/3/star2.vpcf_c new file mode 100755 index 0000000..b12f2de Binary files /dev/null and b/effect/arrow/3/star2.vpcf_c differ diff --git a/effect/arrow/3/star2_1.vpcf_c b/effect/arrow/3/star2_1.vpcf_c new file mode 100755 index 0000000..208bfc5 Binary files /dev/null and b/effect/arrow/3/star2_1.vpcf_c differ diff --git a/effect/arrow/3/star3.vpcf_c b/effect/arrow/3/star3.vpcf_c new file mode 100755 index 0000000..6fd7ef7 Binary files /dev/null and b/effect/arrow/3/star3.vpcf_c differ diff --git a/effect/arrow/3/star3_1.vpcf_c b/effect/arrow/3/star3_1.vpcf_c new file mode 100755 index 0000000..46115a6 Binary files /dev/null and b/effect/arrow/3/star3_1.vpcf_c differ diff --git a/effect/arrow/3/star3_2.vpcf_c b/effect/arrow/3/star3_2.vpcf_c new file mode 100755 index 0000000..8c001b0 Binary files /dev/null and b/effect/arrow/3/star3_2.vpcf_c differ diff --git a/effect/arrow/4.vpcf_c b/effect/arrow/4.vpcf_c new file mode 100755 index 0000000..91baac3 Binary files /dev/null and b/effect/arrow/4.vpcf_c differ diff --git a/effect/arrow/4/star1.vpcf_c b/effect/arrow/4/star1.vpcf_c new file mode 100755 index 0000000..4dc1943 Binary files /dev/null and b/effect/arrow/4/star1.vpcf_c differ diff --git a/effect/arrow/4/star2.vpcf_c b/effect/arrow/4/star2.vpcf_c new file mode 100755 index 0000000..c2820f1 Binary files /dev/null and b/effect/arrow/4/star2.vpcf_c differ diff --git a/effect/arrow/4/star2_1.vpcf_c b/effect/arrow/4/star2_1.vpcf_c new file mode 100755 index 0000000..bc0177c Binary files /dev/null and b/effect/arrow/4/star2_1.vpcf_c differ diff --git a/effect/arrow/4/star3.vpcf_c b/effect/arrow/4/star3.vpcf_c new file mode 100755 index 0000000..8d51ac6 Binary files /dev/null and b/effect/arrow/4/star3.vpcf_c differ diff --git a/effect/arrow/4/star3_1.vpcf_c b/effect/arrow/4/star3_1.vpcf_c new file mode 100755 index 0000000..4f8bd6a Binary files /dev/null and b/effect/arrow/4/star3_1.vpcf_c differ diff --git a/effect/arrow/4/star3_2.vpcf_c b/effect/arrow/4/star3_2.vpcf_c new file mode 100755 index 0000000..24b9452 Binary files /dev/null and b/effect/arrow/4/star3_2.vpcf_c differ diff --git a/effect/arrow/5.vpcf_c b/effect/arrow/5.vpcf_c new file mode 100755 index 0000000..a47a3f6 Binary files /dev/null and b/effect/arrow/5.vpcf_c differ diff --git a/effect/arrow/5/star1.vpcf_c b/effect/arrow/5/star1.vpcf_c new file mode 100755 index 0000000..515638d Binary files /dev/null and b/effect/arrow/5/star1.vpcf_c differ diff --git a/effect/arrow/5/star2.vpcf_c b/effect/arrow/5/star2.vpcf_c new file mode 100755 index 0000000..14072c7 Binary files /dev/null and b/effect/arrow/5/star2.vpcf_c differ diff --git a/effect/arrow/5/star2_1.vpcf_c b/effect/arrow/5/star2_1.vpcf_c new file mode 100755 index 0000000..54c87fe Binary files /dev/null and b/effect/arrow/5/star2_1.vpcf_c differ diff --git a/effect/arrow/5/star3.vpcf_c b/effect/arrow/5/star3.vpcf_c new file mode 100755 index 0000000..e9184d5 Binary files /dev/null and b/effect/arrow/5/star3.vpcf_c differ diff --git a/effect/arrow/5/star3_1.vpcf_c b/effect/arrow/5/star3_1.vpcf_c new file mode 100755 index 0000000..61f40bc Binary files /dev/null and b/effect/arrow/5/star3_1.vpcf_c differ diff --git a/effect/arrow/5/star3_2.vpcf_c b/effect/arrow/5/star3_2.vpcf_c new file mode 100755 index 0000000..d3dfe5d Binary files /dev/null and b/effect/arrow/5/star3_2.vpcf_c differ diff --git a/effect/arrow/ssr/star1.vpcf_c b/effect/arrow/ssr/star1.vpcf_c new file mode 100755 index 0000000..d62efa5 Binary files /dev/null and b/effect/arrow/ssr/star1.vpcf_c differ diff --git a/effect/arrow/star1.vpcf_c b/effect/arrow/star1.vpcf_c new file mode 100755 index 0000000..62fd672 Binary files /dev/null and b/effect/arrow/star1.vpcf_c differ diff --git a/effect/arrow/star2.vpcf_c b/effect/arrow/star2.vpcf_c new file mode 100755 index 0000000..218ee8d Binary files /dev/null and b/effect/arrow/star2.vpcf_c differ diff --git a/effect/arrow/star2_1.vpcf_c b/effect/arrow/star2_1.vpcf_c new file mode 100755 index 0000000..50ad1aa Binary files /dev/null and b/effect/arrow/star2_1.vpcf_c differ diff --git a/effect/arrow/star3.vpcf_c b/effect/arrow/star3.vpcf_c new file mode 100755 index 0000000..e37078b Binary files /dev/null and b/effect/arrow/star3.vpcf_c differ diff --git a/effect/arrow/star3_1.vpcf_c b/effect/arrow/star3_1.vpcf_c new file mode 100755 index 0000000..1e7635a Binary files /dev/null and b/effect/arrow/star3_1.vpcf_c differ diff --git a/effect/arrow/star3_2.vpcf_c b/effect/arrow/star3_2.vpcf_c new file mode 100755 index 0000000..c8d23bb Binary files /dev/null and b/effect/arrow/star3_2.vpcf_c differ diff --git a/effect/bianpao/bianpaobig_explosion.vpcf_c b/effect/bianpao/bianpaobig_explosion.vpcf_c new file mode 100755 index 0000000..6bdb965 Binary files /dev/null and b/effect/bianpao/bianpaobig_explosion.vpcf_c differ diff --git a/effect/bianpao/bianpaobig_explosion_trail.vpcf_c b/effect/bianpao/bianpaobig_explosion_trail.vpcf_c new file mode 100755 index 0000000..2a36616 Binary files /dev/null and b/effect/bianpao/bianpaobig_explosion_trail.vpcf_c differ diff --git a/effect/bianpao/bianpaofireworks.vpcf_c b/effect/bianpao/bianpaofireworks.vpcf_c new file mode 100755 index 0000000..415df5b Binary files /dev/null and b/effect/bianpao/bianpaofireworks.vpcf_c differ diff --git a/effect/bianpao/bianpaofireworks_b.vpcf_c b/effect/bianpao/bianpaofireworks_b.vpcf_c new file mode 100755 index 0000000..d291717 Binary files /dev/null and b/effect/bianpao/bianpaofireworks_b.vpcf_c differ diff --git a/effect/bianpao/bianpaofireworks_explosion_b.vpcf_c b/effect/bianpao/bianpaofireworks_explosion_b.vpcf_c new file mode 100755 index 0000000..3cfe6e7 Binary files /dev/null and b/effect/bianpao/bianpaofireworks_explosion_b.vpcf_c differ diff --git a/effect/bianpao/bianpaofireworks_explosion_c.vpcf_c b/effect/bianpao/bianpaofireworks_explosion_c.vpcf_c new file mode 100755 index 0000000..c83cdbb Binary files /dev/null and b/effect/bianpao/bianpaofireworks_explosion_c.vpcf_c differ diff --git a/effect/bianpao/bianpaofireworks_explosion_d.vpcf_c b/effect/bianpao/bianpaofireworks_explosion_d.vpcf_c new file mode 100755 index 0000000..dc36796 Binary files /dev/null and b/effect/bianpao/bianpaofireworks_explosion_d.vpcf_c differ diff --git a/effect/bianpao/bianpaofireworks_fuse_sparks.vpcf_c b/effect/bianpao/bianpaofireworks_fuse_sparks.vpcf_c new file mode 100755 index 0000000..9e4c951 Binary files /dev/null and b/effect/bianpao/bianpaofireworks_fuse_sparks.vpcf_c differ diff --git a/effect/bianpao/bianpaofireworks_fuse_sparks_b.vpcf_c b/effect/bianpao/bianpaofireworks_fuse_sparks_b.vpcf_c new file mode 100755 index 0000000..7e1ccda Binary files /dev/null and b/effect/bianpao/bianpaofireworks_fuse_sparks_b.vpcf_c differ diff --git a/effect/bianpao/bianpaofireworks_fuse_sparks_c.vpcf_c b/effect/bianpao/bianpaofireworks_fuse_sparks_c.vpcf_c new file mode 100755 index 0000000..ede33c6 Binary files /dev/null and b/effect/bianpao/bianpaofireworks_fuse_sparks_c.vpcf_c differ diff --git a/effect/bianpao/bianpaofireworks_fuse_sparks_d.vpcf_c b/effect/bianpao/bianpaofireworks_fuse_sparks_d.vpcf_c new file mode 100755 index 0000000..a828720 Binary files /dev/null and b/effect/bianpao/bianpaofireworks_fuse_sparks_d.vpcf_c differ diff --git a/effect/bianpao/bianpaofireworks_special.vpcf_c b/effect/bianpao/bianpaofireworks_special.vpcf_c new file mode 100755 index 0000000..fc8f111 Binary files /dev/null and b/effect/bianpao/bianpaofireworks_special.vpcf_c differ diff --git a/effect/big.vpcf_c b/effect/big.vpcf_c new file mode 100755 index 0000000..587f0a6 Binary files /dev/null and b/effect/big.vpcf_c differ diff --git a/effect/bingnv/ambient.vpcf_c b/effect/bingnv/ambient.vpcf_c new file mode 100755 index 0000000..27293ec Binary files /dev/null and b/effect/bingnv/ambient.vpcf_c differ diff --git a/effect/bingnv/b_ambient.vpcf_c b/effect/bingnv/b_ambient.vpcf_c new file mode 100755 index 0000000..d23bf43 Binary files /dev/null and b/effect/bingnv/b_ambient.vpcf_c differ diff --git a/effect/bingnv/c_ambient.vpcf_c b/effect/bingnv/c_ambient.vpcf_c new file mode 100755 index 0000000..7142dbb Binary files /dev/null and b/effect/bingnv/c_ambient.vpcf_c differ diff --git a/effect/bingnv/d_ambient.vpcf_c b/effect/bingnv/d_ambient.vpcf_c new file mode 100755 index 0000000..8dff91a Binary files /dev/null and b/effect/bingnv/d_ambient.vpcf_c differ diff --git a/effect/biyu_roshan/1.vpcf_c b/effect/biyu_roshan/1.vpcf_c new file mode 100755 index 0000000..0c25ac4 Binary files /dev/null and b/effect/biyu_roshan/1.vpcf_c differ diff --git a/effect/biyu_roshan/1_bodytrail.vpcf_c b/effect/biyu_roshan/1_bodytrail.vpcf_c new file mode 100755 index 0000000..5236d5a Binary files /dev/null and b/effect/biyu_roshan/1_bodytrail.vpcf_c differ diff --git a/effect/biyu_roshan/1_bodytrail_glow.vpcf_c b/effect/biyu_roshan/1_bodytrail_glow.vpcf_c new file mode 100755 index 0000000..55d4571 Binary files /dev/null and b/effect/biyu_roshan/1_bodytrail_glow.vpcf_c differ diff --git a/effect/biyu_roshan/1_drop.vpcf_c b/effect/biyu_roshan/1_drop.vpcf_c new file mode 100755 index 0000000..36423e2 Binary files /dev/null and b/effect/biyu_roshan/1_drop.vpcf_c differ diff --git a/effect/biyu_roshan/1_drop_b.vpcf_c b/effect/biyu_roshan/1_drop_b.vpcf_c new file mode 100755 index 0000000..1448bd0 Binary files /dev/null and b/effect/biyu_roshan/1_drop_b.vpcf_c differ diff --git a/effect/biyu_roshan/1_drop_b_glow.vpcf_c b/effect/biyu_roshan/1_drop_b_glow.vpcf_c new file mode 100755 index 0000000..fa2873f Binary files /dev/null and b/effect/biyu_roshan/1_drop_b_glow.vpcf_c differ diff --git a/effect/biyu_roshan/1_eye.vpcf_c b/effect/biyu_roshan/1_eye.vpcf_c new file mode 100755 index 0000000..2d31467 Binary files /dev/null and b/effect/biyu_roshan/1_eye.vpcf_c differ diff --git a/effect/biyu_roshan/1_eye_a.vpcf_c b/effect/biyu_roshan/1_eye_a.vpcf_c new file mode 100755 index 0000000..4339a90 Binary files /dev/null and b/effect/biyu_roshan/1_eye_a.vpcf_c differ diff --git a/effect/biyu_roshan/1_eye_glow.vpcf_c b/effect/biyu_roshan/1_eye_glow.vpcf_c new file mode 100755 index 0000000..091a1cd Binary files /dev/null and b/effect/biyu_roshan/1_eye_glow.vpcf_c differ diff --git a/effect/biyu_roshan/1_eye_streak.vpcf_c b/effect/biyu_roshan/1_eye_streak.vpcf_c new file mode 100755 index 0000000..74df14a Binary files /dev/null and b/effect/biyu_roshan/1_eye_streak.vpcf_c differ diff --git a/effect/biyu_roshan/1_gem.vpcf_c b/effect/biyu_roshan/1_gem.vpcf_c new file mode 100755 index 0000000..177fc1d Binary files /dev/null and b/effect/biyu_roshan/1_gem.vpcf_c differ diff --git a/effect/biyu_roshan/1_gem_glow.vpcf_c b/effect/biyu_roshan/1_gem_glow.vpcf_c new file mode 100755 index 0000000..5810d1d Binary files /dev/null and b/effect/biyu_roshan/1_gem_glow.vpcf_c differ diff --git a/effect/biyu_roshan/1_glow.vpcf_c b/effect/biyu_roshan/1_glow.vpcf_c new file mode 100755 index 0000000..7fc1d4f Binary files /dev/null and b/effect/biyu_roshan/1_glow.vpcf_c differ diff --git a/effect/biyu_roshan/1_sparks.vpcf_c b/effect/biyu_roshan/1_sparks.vpcf_c new file mode 100755 index 0000000..c72ed3f Binary files /dev/null and b/effect/biyu_roshan/1_sparks.vpcf_c differ diff --git a/effect/biyu_roshan/1_sparks_red.vpcf_c b/effect/biyu_roshan/1_sparks_red.vpcf_c new file mode 100755 index 0000000..57e4f63 Binary files /dev/null and b/effect/biyu_roshan/1_sparks_red.vpcf_c differ diff --git a/effect/biyu_roshan/1_trail.vpcf_c b/effect/biyu_roshan/1_trail.vpcf_c new file mode 100755 index 0000000..c3fe085 Binary files /dev/null and b/effect/biyu_roshan/1_trail.vpcf_c differ diff --git a/effect/biyu_roshan/1_trail_rope.vpcf_c b/effect/biyu_roshan/1_trail_rope.vpcf_c new file mode 100755 index 0000000..c788f50 Binary files /dev/null and b/effect/biyu_roshan/1_trail_rope.vpcf_c differ diff --git a/effect/biyu_roshan/1_trail_rope_glow.vpcf_c b/effect/biyu_roshan/1_trail_rope_glow.vpcf_c new file mode 100755 index 0000000..f065035 Binary files /dev/null and b/effect/biyu_roshan/1_trail_rope_glow.vpcf_c differ diff --git a/effect/biyu_roshan/1_trail_rope_red.vpcf_c b/effect/biyu_roshan/1_trail_rope_red.vpcf_c new file mode 100755 index 0000000..f4011ac Binary files /dev/null and b/effect/biyu_roshan/1_trail_rope_red.vpcf_c differ diff --git a/effect/blue_gem/ti7.vpcf_c b/effect/blue_gem/ti7.vpcf_c new file mode 100755 index 0000000..b61c010 Binary files /dev/null and b/effect/blue_gem/ti7.vpcf_c differ diff --git a/effect/blue_gem/ti7_angels.vpcf_c b/effect/blue_gem/ti7_angels.vpcf_c new file mode 100755 index 0000000..faab0c5 Binary files /dev/null and b/effect/blue_gem/ti7_angels.vpcf_c differ diff --git a/effect/blue_gem/ti7_angels_glow.vpcf_c b/effect/blue_gem/ti7_angels_glow.vpcf_c new file mode 100755 index 0000000..c39bc38 Binary files /dev/null and b/effect/blue_gem/ti7_angels_glow.vpcf_c differ diff --git a/effect/blue_gem/ti7_cm.vpcf_c b/effect/blue_gem/ti7_cm.vpcf_c new file mode 100755 index 0000000..96da375 Binary files /dev/null and b/effect/blue_gem/ti7_cm.vpcf_c differ diff --git a/effect/blue_gem/ti7_ember.vpcf_c b/effect/blue_gem/ti7_ember.vpcf_c new file mode 100755 index 0000000..405481b Binary files /dev/null and b/effect/blue_gem/ti7_ember.vpcf_c differ diff --git a/effect/blue_gem/ti7_flakes.vpcf_c b/effect/blue_gem/ti7_flakes.vpcf_c new file mode 100755 index 0000000..d038359 Binary files /dev/null and b/effect/blue_gem/ti7_flakes.vpcf_c differ diff --git a/effect/blue_gem/ti7_flakes_b.vpcf_c b/effect/blue_gem/ti7_flakes_b.vpcf_c new file mode 100755 index 0000000..d921627 Binary files /dev/null and b/effect/blue_gem/ti7_flakes_b.vpcf_c differ diff --git a/effect/blue_gem/ti7_flare.vpcf_c b/effect/blue_gem/ti7_flare.vpcf_c new file mode 100755 index 0000000..fd05df7 Binary files /dev/null and b/effect/blue_gem/ti7_flare.vpcf_c differ diff --git a/effect/blue_gem/ti7_frost.vpcf_c b/effect/blue_gem/ti7_frost.vpcf_c new file mode 100755 index 0000000..ce5a582 Binary files /dev/null and b/effect/blue_gem/ti7_frost.vpcf_c differ diff --git a/effect/blue_gem/ti7_glow.vpcf_c b/effect/blue_gem/ti7_glow.vpcf_c new file mode 100755 index 0000000..ccd320c Binary files /dev/null and b/effect/blue_gem/ti7_glow.vpcf_c differ diff --git a/effect/blue_gem/ti7_ground_frost.vpcf_c b/effect/blue_gem/ti7_ground_frost.vpcf_c new file mode 100755 index 0000000..1ef10dd Binary files /dev/null and b/effect/blue_gem/ti7_ground_frost.vpcf_c differ diff --git a/effect/blue_gem/ti7_ground_glint.vpcf_c b/effect/blue_gem/ti7_ground_glint.vpcf_c new file mode 100755 index 0000000..329de49 Binary files /dev/null and b/effect/blue_gem/ti7_ground_glint.vpcf_c differ diff --git a/effect/blue_gem/ti7_ground_ice.vpcf_c b/effect/blue_gem/ti7_ground_ice.vpcf_c new file mode 100755 index 0000000..354657b Binary files /dev/null and b/effect/blue_gem/ti7_ground_ice.vpcf_c differ diff --git a/effect/blue_gem/ti7_ground_shard.vpcf_c b/effect/blue_gem/ti7_ground_shard.vpcf_c new file mode 100755 index 0000000..179c68d Binary files /dev/null and b/effect/blue_gem/ti7_ground_shard.vpcf_c differ diff --git a/effect/blue_gem/ti7_halo.vpcf_c b/effect/blue_gem/ti7_halo.vpcf_c new file mode 100755 index 0000000..071f76b Binary files /dev/null and b/effect/blue_gem/ti7_halo.vpcf_c differ diff --git a/effect/blue_gem/ti7_poof.vpcf_c b/effect/blue_gem/ti7_poof.vpcf_c new file mode 100755 index 0000000..dec61a6 Binary files /dev/null and b/effect/blue_gem/ti7_poof.vpcf_c differ diff --git a/effect/blue_gem/ti7_trail.vpcf_c b/effect/blue_gem/ti7_trail.vpcf_c new file mode 100755 index 0000000..d369ae0 Binary files /dev/null and b/effect/blue_gem/ti7_trail.vpcf_c differ diff --git a/effect/blue_gem/ti7_trail_b.vpcf_c b/effect/blue_gem/ti7_trail_b.vpcf_c new file mode 100755 index 0000000..4ee4639 Binary files /dev/null and b/effect/blue_gem/ti7_trail_b.vpcf_c differ diff --git a/effect/bottle/1_concoction_explosion_smoke.vpcf_c b/effect/bottle/1_concoction_explosion_smoke.vpcf_c new file mode 100755 index 0000000..87c5a5a Binary files /dev/null and b/effect/bottle/1_concoction_explosion_smoke.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile.vpcf_c b/effect/bottle/1_concoction_projectile.vpcf_c new file mode 100755 index 0000000..adc59f6 Binary files /dev/null and b/effect/bottle/1_concoction_projectile.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_explosion.vpcf_c b/effect/bottle/1_concoction_projectile_explosion.vpcf_c new file mode 100755 index 0000000..398761c Binary files /dev/null and b/effect/bottle/1_concoction_projectile_explosion.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_explosion_a.vpcf_c b/effect/bottle/1_concoction_projectile_explosion_a.vpcf_c new file mode 100755 index 0000000..f8be7f0 Binary files /dev/null and b/effect/bottle/1_concoction_projectile_explosion_a.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_explosion_fire.vpcf_c b/effect/bottle/1_concoction_projectile_explosion_fire.vpcf_c new file mode 100755 index 0000000..b95c1c4 Binary files /dev/null and b/effect/bottle/1_concoction_projectile_explosion_fire.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_explosion_flash_b.vpcf_c b/effect/bottle/1_concoction_projectile_explosion_flash_b.vpcf_c new file mode 100755 index 0000000..028aea4 Binary files /dev/null and b/effect/bottle/1_concoction_projectile_explosion_flash_b.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_explosion_flash_c.vpcf_c b/effect/bottle/1_concoction_projectile_explosion_flash_c.vpcf_c new file mode 100755 index 0000000..c30e525 Binary files /dev/null and b/effect/bottle/1_concoction_projectile_explosion_flash_c.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_explosion_flash_d.vpcf_c b/effect/bottle/1_concoction_projectile_explosion_flash_d.vpcf_c new file mode 100755 index 0000000..7196332 Binary files /dev/null and b/effect/bottle/1_concoction_projectile_explosion_flash_d.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_explosion_flash_e.vpcf_c b/effect/bottle/1_concoction_projectile_explosion_flash_e.vpcf_c new file mode 100755 index 0000000..0604eec Binary files /dev/null and b/effect/bottle/1_concoction_projectile_explosion_flash_e.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_explosion_flash_light.vpcf_c b/effect/bottle/1_concoction_projectile_explosion_flash_light.vpcf_c new file mode 100755 index 0000000..b415af5 Binary files /dev/null and b/effect/bottle/1_concoction_projectile_explosion_flash_light.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_explosion_ring.vpcf_c b/effect/bottle/1_concoction_projectile_explosion_ring.vpcf_c new file mode 100755 index 0000000..ccdce6e Binary files /dev/null and b/effect/bottle/1_concoction_projectile_explosion_ring.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_explosion_sphere.vpcf_c b/effect/bottle/1_concoction_projectile_explosion_sphere.vpcf_c new file mode 100755 index 0000000..d6970bb Binary files /dev/null and b/effect/bottle/1_concoction_projectile_explosion_sphere.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_glow.vpcf_c b/effect/bottle/1_concoction_projectile_glow.vpcf_c new file mode 100755 index 0000000..2ffc7e3 Binary files /dev/null and b/effect/bottle/1_concoction_projectile_glow.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_glow_b.vpcf_c b/effect/bottle/1_concoction_projectile_glow_b.vpcf_c new file mode 100755 index 0000000..7e6606f Binary files /dev/null and b/effect/bottle/1_concoction_projectile_glow_b.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_impact_burst.vpcf_c b/effect/bottle/1_concoction_projectile_impact_burst.vpcf_c new file mode 100755 index 0000000..e43db6d Binary files /dev/null and b/effect/bottle/1_concoction_projectile_impact_burst.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_launch.vpcf_c b/effect/bottle/1_concoction_projectile_launch.vpcf_c new file mode 100755 index 0000000..32a4f90 Binary files /dev/null and b/effect/bottle/1_concoction_projectile_launch.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_model.vpcf_c b/effect/bottle/1_concoction_projectile_model.vpcf_c new file mode 100755 index 0000000..a3ba32b Binary files /dev/null and b/effect/bottle/1_concoction_projectile_model.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_trail.vpcf_c b/effect/bottle/1_concoction_projectile_trail.vpcf_c new file mode 100755 index 0000000..ea81753 Binary files /dev/null and b/effect/bottle/1_concoction_projectile_trail.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_trail_b.vpcf_c b/effect/bottle/1_concoction_projectile_trail_b.vpcf_c new file mode 100755 index 0000000..dcdb609 Binary files /dev/null and b/effect/bottle/1_concoction_projectile_trail_b.vpcf_c differ diff --git a/effect/bottle/1_concoction_projectile_trail_d.vpcf_c b/effect/bottle/1_concoction_projectile_trail_d.vpcf_c new file mode 100755 index 0000000..8fa353b Binary files /dev/null and b/effect/bottle/1_concoction_projectile_trail_d.vpcf_c differ diff --git a/effect/bottle/1_concoction_trail_smoke.vpcf_c b/effect/bottle/1_concoction_trail_smoke.vpcf_c new file mode 100755 index 0000000..9d22774 Binary files /dev/null and b/effect/bottle/1_concoction_trail_smoke.vpcf_c differ diff --git a/effect/bottle/1conc_flying_bottle.vpcf_c b/effect/bottle/1conc_flying_bottle.vpcf_c new file mode 100755 index 0000000..b088279 Binary files /dev/null and b/effect/bottle/1conc_flying_bottle.vpcf_c differ diff --git a/effect/bottle/2_concoction_explosion_smoke.vpcf_c b/effect/bottle/2_concoction_explosion_smoke.vpcf_c new file mode 100755 index 0000000..7823596 Binary files /dev/null and b/effect/bottle/2_concoction_explosion_smoke.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile.vpcf_c b/effect/bottle/2_concoction_projectile.vpcf_c new file mode 100755 index 0000000..d65c415 Binary files /dev/null and b/effect/bottle/2_concoction_projectile.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_explosion.vpcf_c b/effect/bottle/2_concoction_projectile_explosion.vpcf_c new file mode 100755 index 0000000..921d728 Binary files /dev/null and b/effect/bottle/2_concoction_projectile_explosion.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_explosion_a.vpcf_c b/effect/bottle/2_concoction_projectile_explosion_a.vpcf_c new file mode 100755 index 0000000..7612d55 Binary files /dev/null and b/effect/bottle/2_concoction_projectile_explosion_a.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_explosion_fire.vpcf_c b/effect/bottle/2_concoction_projectile_explosion_fire.vpcf_c new file mode 100755 index 0000000..341871d Binary files /dev/null and b/effect/bottle/2_concoction_projectile_explosion_fire.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_explosion_flash_b.vpcf_c b/effect/bottle/2_concoction_projectile_explosion_flash_b.vpcf_c new file mode 100755 index 0000000..4d94ce1 Binary files /dev/null and b/effect/bottle/2_concoction_projectile_explosion_flash_b.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_explosion_flash_c.vpcf_c b/effect/bottle/2_concoction_projectile_explosion_flash_c.vpcf_c new file mode 100755 index 0000000..38397e5 Binary files /dev/null and b/effect/bottle/2_concoction_projectile_explosion_flash_c.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_explosion_flash_d.vpcf_c b/effect/bottle/2_concoction_projectile_explosion_flash_d.vpcf_c new file mode 100755 index 0000000..0585196 Binary files /dev/null and b/effect/bottle/2_concoction_projectile_explosion_flash_d.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_explosion_flash_e.vpcf_c b/effect/bottle/2_concoction_projectile_explosion_flash_e.vpcf_c new file mode 100755 index 0000000..6062765 Binary files /dev/null and b/effect/bottle/2_concoction_projectile_explosion_flash_e.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_explosion_flash_light.vpcf_c b/effect/bottle/2_concoction_projectile_explosion_flash_light.vpcf_c new file mode 100755 index 0000000..4d35d84 Binary files /dev/null and b/effect/bottle/2_concoction_projectile_explosion_flash_light.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_explosion_ring.vpcf_c b/effect/bottle/2_concoction_projectile_explosion_ring.vpcf_c new file mode 100755 index 0000000..53d9aaf Binary files /dev/null and b/effect/bottle/2_concoction_projectile_explosion_ring.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_explosion_sphere.vpcf_c b/effect/bottle/2_concoction_projectile_explosion_sphere.vpcf_c new file mode 100755 index 0000000..25e0912 Binary files /dev/null and b/effect/bottle/2_concoction_projectile_explosion_sphere.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_glow.vpcf_c b/effect/bottle/2_concoction_projectile_glow.vpcf_c new file mode 100755 index 0000000..f0735e8 Binary files /dev/null and b/effect/bottle/2_concoction_projectile_glow.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_glow_b.vpcf_c b/effect/bottle/2_concoction_projectile_glow_b.vpcf_c new file mode 100755 index 0000000..dd17e99 Binary files /dev/null and b/effect/bottle/2_concoction_projectile_glow_b.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_impact_burst.vpcf_c b/effect/bottle/2_concoction_projectile_impact_burst.vpcf_c new file mode 100755 index 0000000..8396e14 Binary files /dev/null and b/effect/bottle/2_concoction_projectile_impact_burst.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_launch.vpcf_c b/effect/bottle/2_concoction_projectile_launch.vpcf_c new file mode 100755 index 0000000..9e6c17d Binary files /dev/null and b/effect/bottle/2_concoction_projectile_launch.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_model.vpcf_c b/effect/bottle/2_concoction_projectile_model.vpcf_c new file mode 100755 index 0000000..61c3695 Binary files /dev/null and b/effect/bottle/2_concoction_projectile_model.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_trail.vpcf_c b/effect/bottle/2_concoction_projectile_trail.vpcf_c new file mode 100755 index 0000000..17af48d Binary files /dev/null and b/effect/bottle/2_concoction_projectile_trail.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_trail_b.vpcf_c b/effect/bottle/2_concoction_projectile_trail_b.vpcf_c new file mode 100755 index 0000000..f80ca9f Binary files /dev/null and b/effect/bottle/2_concoction_projectile_trail_b.vpcf_c differ diff --git a/effect/bottle/2_concoction_projectile_trail_d.vpcf_c b/effect/bottle/2_concoction_projectile_trail_d.vpcf_c new file mode 100755 index 0000000..254452a Binary files /dev/null and b/effect/bottle/2_concoction_projectile_trail_d.vpcf_c differ diff --git a/effect/bottle/2_concoction_trail_smoke.vpcf_c b/effect/bottle/2_concoction_trail_smoke.vpcf_c new file mode 100755 index 0000000..8d24942 Binary files /dev/null and b/effect/bottle/2_concoction_trail_smoke.vpcf_c differ diff --git a/effect/bottle/2conc_flying_bottle.vpcf_c b/effect/bottle/2conc_flying_bottle.vpcf_c new file mode 100755 index 0000000..716f6a4 Binary files /dev/null and b/effect/bottle/2conc_flying_bottle.vpcf_c differ diff --git a/effect/bottle2/1_concoction_explosion_smoke.vpcf_c b/effect/bottle2/1_concoction_explosion_smoke.vpcf_c new file mode 100755 index 0000000..8b22c94 Binary files /dev/null and b/effect/bottle2/1_concoction_explosion_smoke.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile.vpcf_c b/effect/bottle2/1_concoction_projectile.vpcf_c new file mode 100755 index 0000000..c53e11c Binary files /dev/null and b/effect/bottle2/1_concoction_projectile.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_explosion.vpcf_c b/effect/bottle2/1_concoction_projectile_explosion.vpcf_c new file mode 100755 index 0000000..572e860 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_explosion.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_explosion_a.vpcf_c b/effect/bottle2/1_concoction_projectile_explosion_a.vpcf_c new file mode 100755 index 0000000..c68e085 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_explosion_a.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_explosion_fire.vpcf_c b/effect/bottle2/1_concoction_projectile_explosion_fire.vpcf_c new file mode 100755 index 0000000..31bfa59 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_explosion_fire.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_explosion_flash_b.vpcf_c b/effect/bottle2/1_concoction_projectile_explosion_flash_b.vpcf_c new file mode 100755 index 0000000..fd02171 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_explosion_flash_b.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_explosion_flash_c.vpcf_c b/effect/bottle2/1_concoction_projectile_explosion_flash_c.vpcf_c new file mode 100755 index 0000000..3e9fbe3 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_explosion_flash_c.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_explosion_flash_d.vpcf_c b/effect/bottle2/1_concoction_projectile_explosion_flash_d.vpcf_c new file mode 100755 index 0000000..4c46d05 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_explosion_flash_d.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_explosion_flash_e.vpcf_c b/effect/bottle2/1_concoction_projectile_explosion_flash_e.vpcf_c new file mode 100755 index 0000000..42b54c0 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_explosion_flash_e.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_explosion_flash_light.vpcf_c b/effect/bottle2/1_concoction_projectile_explosion_flash_light.vpcf_c new file mode 100755 index 0000000..dbcbecc Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_explosion_flash_light.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_explosion_ring.vpcf_c b/effect/bottle2/1_concoction_projectile_explosion_ring.vpcf_c new file mode 100755 index 0000000..233672c Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_explosion_ring.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_explosion_sphere.vpcf_c b/effect/bottle2/1_concoction_projectile_explosion_sphere.vpcf_c new file mode 100755 index 0000000..bebf519 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_explosion_sphere.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_glow.vpcf_c b/effect/bottle2/1_concoction_projectile_glow.vpcf_c new file mode 100755 index 0000000..0b2fa30 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_glow.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_glow_b.vpcf_c b/effect/bottle2/1_concoction_projectile_glow_b.vpcf_c new file mode 100755 index 0000000..8eacdf5 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_glow_b.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_impact_burst.vpcf_c b/effect/bottle2/1_concoction_projectile_impact_burst.vpcf_c new file mode 100755 index 0000000..1a500d0 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_impact_burst.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_launch.vpcf_c b/effect/bottle2/1_concoction_projectile_launch.vpcf_c new file mode 100755 index 0000000..3c74aea Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_launch.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_model.vpcf_c b/effect/bottle2/1_concoction_projectile_model.vpcf_c new file mode 100755 index 0000000..29a7af4 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_model.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_trail.vpcf_c b/effect/bottle2/1_concoction_projectile_trail.vpcf_c new file mode 100755 index 0000000..f1c8cf3 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_trail.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_trail_b.vpcf_c b/effect/bottle2/1_concoction_projectile_trail_b.vpcf_c new file mode 100755 index 0000000..6f67cae Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_trail_b.vpcf_c differ diff --git a/effect/bottle2/1_concoction_projectile_trail_d.vpcf_c b/effect/bottle2/1_concoction_projectile_trail_d.vpcf_c new file mode 100755 index 0000000..17bf2a1 Binary files /dev/null and b/effect/bottle2/1_concoction_projectile_trail_d.vpcf_c differ diff --git a/effect/bottle2/1_concoction_trail_smoke.vpcf_c b/effect/bottle2/1_concoction_trail_smoke.vpcf_c new file mode 100755 index 0000000..bc25291 Binary files /dev/null and b/effect/bottle2/1_concoction_trail_smoke.vpcf_c differ diff --git a/effect/bottle2/1conc_flying_bottle.vpcf_c b/effect/bottle2/1conc_flying_bottle.vpcf_c new file mode 100755 index 0000000..b0aa2e7 Binary files /dev/null and b/effect/bottle2/1conc_flying_bottle.vpcf_c differ diff --git a/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok.vpcf_c b/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok.vpcf_c new file mode 100755 index 0000000..9cc3dc0 Binary files /dev/null and b/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok.vpcf_c differ diff --git a/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc.vpcf_c b/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc.vpcf_c new file mode 100755 index 0000000..4b5c76c Binary files /dev/null and b/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc.vpcf_c differ diff --git a/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc_glow.vpcf_c b/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc_glow.vpcf_c new file mode 100755 index 0000000..707708b Binary files /dev/null and b/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc_glow.vpcf_c differ diff --git a/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_drips.vpcf_c b/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_drips.vpcf_c new file mode 100755 index 0000000..192d6c2 Binary files /dev/null and b/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_drips.vpcf_c differ diff --git a/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_splatter.vpcf_c b/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_splatter.vpcf_c new file mode 100755 index 0000000..9a71772 Binary files /dev/null and b/effect/cike/1econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_splatter.vpcf_c differ diff --git a/effect/cike/1units/heroes/hero_bloodseeker/bloodseeker_bloodbath_e_lv.vpcf_c b/effect/cike/1units/heroes/hero_bloodseeker/bloodseeker_bloodbath_e_lv.vpcf_c new file mode 100755 index 0000000..0c365b7 Binary files /dev/null and b/effect/cike/1units/heroes/hero_bloodseeker/bloodseeker_bloodbath_e_lv.vpcf_c differ diff --git a/effect/crown/1.vpcf_c b/effect/crown/1.vpcf_c new file mode 100755 index 0000000..72eba18 Binary files /dev/null and b/effect/crown/1.vpcf_c differ diff --git a/effect/crown/1_ring.vpcf_c b/effect/crown/1_ring.vpcf_c new file mode 100755 index 0000000..12e2414 Binary files /dev/null and b/effect/crown/1_ring.vpcf_c differ diff --git a/effect/crown/1_ring_sparks.vpcf_c b/effect/crown/1_ring_sparks.vpcf_c new file mode 100755 index 0000000..2e7d18a Binary files /dev/null and b/effect/crown/1_ring_sparks.vpcf_c differ diff --git a/effect/crown/1_shield.vpcf_c b/effect/crown/1_shield.vpcf_c new file mode 100755 index 0000000..ed2fce1 Binary files /dev/null and b/effect/crown/1_shield.vpcf_c differ diff --git a/effect/crown/1_shield_glow.vpcf_c b/effect/crown/1_shield_glow.vpcf_c new file mode 100755 index 0000000..0c0e6f7 Binary files /dev/null and b/effect/crown/1_shield_glow.vpcf_c differ diff --git a/effect/crown/2.vpcf_c b/effect/crown/2.vpcf_c new file mode 100755 index 0000000..97a70e5 Binary files /dev/null and b/effect/crown/2.vpcf_c differ diff --git a/effect/crown/2_ring.vpcf_c b/effect/crown/2_ring.vpcf_c new file mode 100755 index 0000000..e6f99e2 Binary files /dev/null and b/effect/crown/2_ring.vpcf_c differ diff --git a/effect/crown/2_ring_sparks.vpcf_c b/effect/crown/2_ring_sparks.vpcf_c new file mode 100755 index 0000000..d8d57af Binary files /dev/null and b/effect/crown/2_ring_sparks.vpcf_c differ diff --git a/effect/crown/2_shield.vpcf_c b/effect/crown/2_shield.vpcf_c new file mode 100755 index 0000000..ac2582c Binary files /dev/null and b/effect/crown/2_shield.vpcf_c differ diff --git a/effect/crown/2_shield_glow.vpcf_c b/effect/crown/2_shield_glow.vpcf_c new file mode 100755 index 0000000..7565667 Binary files /dev/null and b/effect/crown/2_shield_glow.vpcf_c differ diff --git a/effect/dabaiyin/laser_cutter_sparks.vpcf_c b/effect/dabaiyin/laser_cutter_sparks.vpcf_c new file mode 100755 index 0000000..4f8aedb Binary files /dev/null and b/effect/dabaiyin/laser_cutter_sparks.vpcf_c differ diff --git a/effect/dabaiyin/laser_cutter_sparks_b.vpcf_c b/effect/dabaiyin/laser_cutter_sparks_b.vpcf_c new file mode 100755 index 0000000..4036640 Binary files /dev/null and b/effect/dabaiyin/laser_cutter_sparks_b.vpcf_c differ diff --git a/effect/dabaiyin/laser_cutter_sparks_c.vpcf_c b/effect/dabaiyin/laser_cutter_sparks_c.vpcf_c new file mode 100755 index 0000000..8662267 Binary files /dev/null and b/effect/dabaiyin/laser_cutter_sparks_c.vpcf_c differ diff --git a/effect/dabaiyin/laser_cutter_sparks_d.vpcf_c b/effect/dabaiyin/laser_cutter_sparks_d.vpcf_c new file mode 100755 index 0000000..7f80cbd Binary files /dev/null and b/effect/dabaiyin/laser_cutter_sparks_d.vpcf_c differ diff --git a/effect/dabaiyin/laser_cutter_sparks_e.vpcf_c b/effect/dabaiyin/laser_cutter_sparks_e.vpcf_c new file mode 100755 index 0000000..3ff1c83 Binary files /dev/null and b/effect/dabaiyin/laser_cutter_sparks_e.vpcf_c differ diff --git a/effect/dabaiyin/laser_cutter_sparks_f.vpcf_c b/effect/dabaiyin/laser_cutter_sparks_f.vpcf_c new file mode 100755 index 0000000..7cc24c0 Binary files /dev/null and b/effect/dabaiyin/laser_cutter_sparks_f.vpcf_c differ diff --git a/effect/dabaiyin/laser_cutter_sparks_g.vpcf_c b/effect/dabaiyin/laser_cutter_sparks_g.vpcf_c new file mode 100755 index 0000000..cd473c7 Binary files /dev/null and b/effect/dabaiyin/laser_cutter_sparks_g.vpcf_c differ diff --git a/effect/dabaiyin/laser_cutter_sparks_h.vpcf_c b/effect/dabaiyin/laser_cutter_sparks_h.vpcf_c new file mode 100755 index 0000000..7a176b1 Binary files /dev/null and b/effect/dabaiyin/laser_cutter_sparks_h.vpcf_c differ diff --git a/effect/dabaiyin/laser_cutter_sparks_i.vpcf_c b/effect/dabaiyin/laser_cutter_sparks_i.vpcf_c new file mode 100755 index 0000000..9ca829a Binary files /dev/null and b/effect/dabaiyin/laser_cutter_sparks_i.vpcf_c differ diff --git a/effect/dabaiyin/laser_cutter_sparks_j.vpcf_c b/effect/dabaiyin/laser_cutter_sparks_j.vpcf_c new file mode 100755 index 0000000..94c4552 Binary files /dev/null and b/effect/dabaiyin/laser_cutter_sparks_j.vpcf_c differ diff --git a/effect/dabaiyin/laser_cutter_sparks_k.vpcf_c b/effect/dabaiyin/laser_cutter_sparks_k.vpcf_c new file mode 100755 index 0000000..e92fb7d Binary files /dev/null and b/effect/dabaiyin/laser_cutter_sparks_k.vpcf_c differ diff --git a/effect/dabaiyin/tinker_laser.vpcf_c b/effect/dabaiyin/tinker_laser.vpcf_c new file mode 100755 index 0000000..1c4b198 Binary files /dev/null and b/effect/dabaiyin/tinker_laser.vpcf_c differ diff --git a/effect/dabaiyin/tinker_laser_b.vpcf_c b/effect/dabaiyin/tinker_laser_b.vpcf_c new file mode 100755 index 0000000..ee5178b Binary files /dev/null and b/effect/dabaiyin/tinker_laser_b.vpcf_c differ diff --git a/effect/dabaiyin/tinker_laser_c.vpcf_c b/effect/dabaiyin/tinker_laser_c.vpcf_c new file mode 100755 index 0000000..47dcfc5 Binary files /dev/null and b/effect/dabaiyin/tinker_laser_c.vpcf_c differ diff --git a/effect/dabaiyin/tinker_laser_d.vpcf_c b/effect/dabaiyin/tinker_laser_d.vpcf_c new file mode 100755 index 0000000..3cb0620 Binary files /dev/null and b/effect/dabaiyin/tinker_laser_d.vpcf_c differ diff --git a/effect/dabaiyin/tinker_laser_e.vpcf_c b/effect/dabaiyin/tinker_laser_e.vpcf_c new file mode 100755 index 0000000..c41242e Binary files /dev/null and b/effect/dabaiyin/tinker_laser_e.vpcf_c differ diff --git a/effect/dabaiyin/tinker_laser_f.vpcf_c b/effect/dabaiyin/tinker_laser_f.vpcf_c new file mode 100755 index 0000000..76f472b Binary files /dev/null and b/effect/dabaiyin/tinker_laser_f.vpcf_c differ diff --git a/effect/dabaiyin/tinker_laser_g.vpcf_c b/effect/dabaiyin/tinker_laser_g.vpcf_c new file mode 100755 index 0000000..e8c10c8 Binary files /dev/null and b/effect/dabaiyin/tinker_laser_g.vpcf_c differ diff --git a/effect/dabaiyin/tinker_laser_h.vpcf_c b/effect/dabaiyin/tinker_laser_h.vpcf_c new file mode 100755 index 0000000..96d881d Binary files /dev/null and b/effect/dabaiyin/tinker_laser_h.vpcf_c differ diff --git a/effect/dabaiyin2/laser_cutter_sparks.vpcf_c b/effect/dabaiyin2/laser_cutter_sparks.vpcf_c new file mode 100755 index 0000000..2b065fc Binary files /dev/null and b/effect/dabaiyin2/laser_cutter_sparks.vpcf_c differ diff --git a/effect/dabaiyin2/laser_cutter_sparks_b.vpcf_c b/effect/dabaiyin2/laser_cutter_sparks_b.vpcf_c new file mode 100755 index 0000000..49c1211 Binary files /dev/null and b/effect/dabaiyin2/laser_cutter_sparks_b.vpcf_c differ diff --git a/effect/dabaiyin2/laser_cutter_sparks_c.vpcf_c b/effect/dabaiyin2/laser_cutter_sparks_c.vpcf_c new file mode 100755 index 0000000..ce8a48b Binary files /dev/null and b/effect/dabaiyin2/laser_cutter_sparks_c.vpcf_c differ diff --git a/effect/dabaiyin2/laser_cutter_sparks_d.vpcf_c b/effect/dabaiyin2/laser_cutter_sparks_d.vpcf_c new file mode 100755 index 0000000..d89378b Binary files /dev/null and b/effect/dabaiyin2/laser_cutter_sparks_d.vpcf_c differ diff --git a/effect/dabaiyin2/laser_cutter_sparks_e.vpcf_c b/effect/dabaiyin2/laser_cutter_sparks_e.vpcf_c new file mode 100755 index 0000000..1ecaea6 Binary files /dev/null and b/effect/dabaiyin2/laser_cutter_sparks_e.vpcf_c differ diff --git a/effect/dabaiyin2/laser_cutter_sparks_f.vpcf_c b/effect/dabaiyin2/laser_cutter_sparks_f.vpcf_c new file mode 100755 index 0000000..e72ebdf Binary files /dev/null and b/effect/dabaiyin2/laser_cutter_sparks_f.vpcf_c differ diff --git a/effect/dabaiyin2/laser_cutter_sparks_g.vpcf_c b/effect/dabaiyin2/laser_cutter_sparks_g.vpcf_c new file mode 100755 index 0000000..0c48f51 Binary files /dev/null and b/effect/dabaiyin2/laser_cutter_sparks_g.vpcf_c differ diff --git a/effect/dabaiyin2/laser_cutter_sparks_h.vpcf_c b/effect/dabaiyin2/laser_cutter_sparks_h.vpcf_c new file mode 100755 index 0000000..3a5b39a Binary files /dev/null and b/effect/dabaiyin2/laser_cutter_sparks_h.vpcf_c differ diff --git a/effect/dabaiyin2/laser_cutter_sparks_i.vpcf_c b/effect/dabaiyin2/laser_cutter_sparks_i.vpcf_c new file mode 100755 index 0000000..ffe6e93 Binary files /dev/null and b/effect/dabaiyin2/laser_cutter_sparks_i.vpcf_c differ diff --git a/effect/dabaiyin2/laser_cutter_sparks_j.vpcf_c b/effect/dabaiyin2/laser_cutter_sparks_j.vpcf_c new file mode 100755 index 0000000..10247b6 Binary files /dev/null and b/effect/dabaiyin2/laser_cutter_sparks_j.vpcf_c differ diff --git a/effect/dabaiyin2/laser_cutter_sparks_k.vpcf_c b/effect/dabaiyin2/laser_cutter_sparks_k.vpcf_c new file mode 100755 index 0000000..aa0e805 Binary files /dev/null and b/effect/dabaiyin2/laser_cutter_sparks_k.vpcf_c differ diff --git a/effect/dabaiyin2/tinker_laser.vpcf_c b/effect/dabaiyin2/tinker_laser.vpcf_c new file mode 100755 index 0000000..533b6dd Binary files /dev/null and b/effect/dabaiyin2/tinker_laser.vpcf_c differ diff --git a/effect/dabaiyin2/tinker_laser_b.vpcf_c b/effect/dabaiyin2/tinker_laser_b.vpcf_c new file mode 100755 index 0000000..39e60ab Binary files /dev/null and b/effect/dabaiyin2/tinker_laser_b.vpcf_c differ diff --git a/effect/dabaiyin2/tinker_laser_c.vpcf_c b/effect/dabaiyin2/tinker_laser_c.vpcf_c new file mode 100755 index 0000000..1d2edf2 Binary files /dev/null and b/effect/dabaiyin2/tinker_laser_c.vpcf_c differ diff --git a/effect/dabaiyin2/tinker_laser_d.vpcf_c b/effect/dabaiyin2/tinker_laser_d.vpcf_c new file mode 100755 index 0000000..8a514d6 Binary files /dev/null and b/effect/dabaiyin2/tinker_laser_d.vpcf_c differ diff --git a/effect/dabaiyin2/tinker_laser_e.vpcf_c b/effect/dabaiyin2/tinker_laser_e.vpcf_c new file mode 100755 index 0000000..0fa40cd Binary files /dev/null and b/effect/dabaiyin2/tinker_laser_e.vpcf_c differ diff --git a/effect/dabaiyin2/tinker_laser_f.vpcf_c b/effect/dabaiyin2/tinker_laser_f.vpcf_c new file mode 100755 index 0000000..3e90d1d Binary files /dev/null and b/effect/dabaiyin2/tinker_laser_f.vpcf_c differ diff --git a/effect/dabaiyin2/tinker_laser_g.vpcf_c b/effect/dabaiyin2/tinker_laser_g.vpcf_c new file mode 100755 index 0000000..d2c1da9 Binary files /dev/null and b/effect/dabaiyin2/tinker_laser_g.vpcf_c differ diff --git a/effect/dabaiyin2/tinker_laser_h.vpcf_c b/effect/dabaiyin2/tinker_laser_h.vpcf_c new file mode 100755 index 0000000..29e9789 Binary files /dev/null and b/effect/dabaiyin2/tinker_laser_h.vpcf_c differ diff --git a/effect/dakongque/hantomlancer_lance_smoke.vpcf_c b/effect/dakongque/hantomlancer_lance_smoke.vpcf_c new file mode 100755 index 0000000..211d84f Binary files /dev/null and b/effect/dakongque/hantomlancer_lance_smoke.vpcf_c differ diff --git a/effect/dakongque/hantomlancer_phant_lance_trail.vpcf_c b/effect/dakongque/hantomlancer_phant_lance_trail.vpcf_c new file mode 100755 index 0000000..d75d1e4 Binary files /dev/null and b/effect/dakongque/hantomlancer_phant_lance_trail.vpcf_c differ diff --git a/effect/dakongque/hantomlancer_spiritlance_projectile.vpcf_c b/effect/dakongque/hantomlancer_spiritlance_projectile.vpcf_c new file mode 100755 index 0000000..553b12e Binary files /dev/null and b/effect/dakongque/hantomlancer_spiritlance_projectile.vpcf_c differ diff --git a/effect/dakongque/hantomlancer_spiritlance_projectile_explosion.vpcf_c b/effect/dakongque/hantomlancer_spiritlance_projectile_explosion.vpcf_c new file mode 100755 index 0000000..ebac4f2 Binary files /dev/null and b/effect/dakongque/hantomlancer_spiritlance_projectile_explosion.vpcf_c differ diff --git a/effect/dakongque/hantomlancer_spiritlance_projectile_explosion_flash.vpcf_c b/effect/dakongque/hantomlancer_spiritlance_projectile_explosion_flash.vpcf_c new file mode 100755 index 0000000..550f53c Binary files /dev/null and b/effect/dakongque/hantomlancer_spiritlance_projectile_explosion_flash.vpcf_c differ diff --git a/effect/dakongque/hantomlancer_spiritlance_projectile_launch.vpcf_c b/effect/dakongque/hantomlancer_spiritlance_projectile_launch.vpcf_c new file mode 100755 index 0000000..a019f30 Binary files /dev/null and b/effect/dakongque/hantomlancer_spiritlance_projectile_launch.vpcf_c differ diff --git a/effect/dakongque/hantomlancer_spiritlance_projectile_launch_trails.vpcf_c b/effect/dakongque/hantomlancer_spiritlance_projectile_launch_trails.vpcf_c new file mode 100755 index 0000000..5b1d41d Binary files /dev/null and b/effect/dakongque/hantomlancer_spiritlance_projectile_launch_trails.vpcf_c differ diff --git a/effect/dakongque/hantomlancer_spiritlance_projectile_trail.vpcf_c b/effect/dakongque/hantomlancer_spiritlance_projectile_trail.vpcf_c new file mode 100755 index 0000000..794853a Binary files /dev/null and b/effect/dakongque/hantomlancer_spiritlance_projectile_trail.vpcf_c differ diff --git a/effect/dakongque/hantomlancer_spiritlance_projectile_trail_sparkexpl.vpcf_c b/effect/dakongque/hantomlancer_spiritlance_projectile_trail_sparkexpl.vpcf_c new file mode 100755 index 0000000..4f8d88c Binary files /dev/null and b/effect/dakongque/hantomlancer_spiritlance_projectile_trail_sparkexpl.vpcf_c differ diff --git a/effect/dakongque/hantomlancer_spiritlance_projectile_trail_sparks.vpcf_c b/effect/dakongque/hantomlancer_spiritlance_projectile_trail_sparks.vpcf_c new file mode 100755 index 0000000..53109a1 Binary files /dev/null and b/effect/dakongque/hantomlancer_spiritlance_projectile_trail_sparks.vpcf_c differ diff --git a/effect/dakongque/l_pl_slash_flashbang_glow.vpcf_c b/effect/dakongque/l_pl_slash_flashbang_glow.vpcf_c new file mode 100755 index 0000000..fa01da1 Binary files /dev/null and b/effect/dakongque/l_pl_slash_flashbang_glow.vpcf_c differ diff --git a/effect/dakongque/l_pl_slash_radiant_smoke.vpcf_c b/effect/dakongque/l_pl_slash_radiant_smoke.vpcf_c new file mode 100755 index 0000000..1277c0b Binary files /dev/null and b/effect/dakongque/l_pl_slash_radiant_smoke.vpcf_c differ diff --git a/effect/dapao/1.vpcf_c b/effect/dapao/1.vpcf_c new file mode 100755 index 0000000..08a37d6 Binary files /dev/null and b/effect/dapao/1.vpcf_c differ diff --git a/effect/dapao/1_b.vpcf_c b/effect/dapao/1_b.vpcf_c new file mode 100755 index 0000000..2fd3599 Binary files /dev/null and b/effect/dapao/1_b.vpcf_c differ diff --git a/effect/dapao/1_cross.vpcf_c b/effect/dapao/1_cross.vpcf_c new file mode 100755 index 0000000..c692a62 Binary files /dev/null and b/effect/dapao/1_cross.vpcf_c differ diff --git a/effect/dapao/1_glow.vpcf_c b/effect/dapao/1_glow.vpcf_c new file mode 100755 index 0000000..730f1f7 Binary files /dev/null and b/effect/dapao/1_glow.vpcf_c differ diff --git a/effect/dapao/1_glow_b.vpcf_c b/effect/dapao/1_glow_b.vpcf_c new file mode 100755 index 0000000..71e28e4 Binary files /dev/null and b/effect/dapao/1_glow_b.vpcf_c differ diff --git a/effect/dapao/1_left.vpcf_c b/effect/dapao/1_left.vpcf_c new file mode 100755 index 0000000..f1cd212 Binary files /dev/null and b/effect/dapao/1_left.vpcf_c differ diff --git a/effect/dapao/1_right.vpcf_c b/effect/dapao/1_right.vpcf_c new file mode 100755 index 0000000..447eb86 Binary files /dev/null and b/effect/dapao/1_right.vpcf_c differ diff --git a/effect/darkmoon_roshan/1.vpcf_c b/effect/darkmoon_roshan/1.vpcf_c new file mode 100755 index 0000000..0d7ee34 Binary files /dev/null and b/effect/darkmoon_roshan/1.vpcf_c differ diff --git a/effect/darkmoon_roshan/1_ember.vpcf_c b/effect/darkmoon_roshan/1_ember.vpcf_c new file mode 100755 index 0000000..f5178ff Binary files /dev/null and b/effect/darkmoon_roshan/1_ember.vpcf_c differ diff --git a/effect/darkmoon_roshan/1_eyes.vpcf_c b/effect/darkmoon_roshan/1_eyes.vpcf_c new file mode 100755 index 0000000..9fd008b Binary files /dev/null and b/effect/darkmoon_roshan/1_eyes.vpcf_c differ diff --git a/effect/darkmoon_roshan/1_eyes_b.vpcf_c b/effect/darkmoon_roshan/1_eyes_b.vpcf_c new file mode 100755 index 0000000..0a25dcc Binary files /dev/null and b/effect/darkmoon_roshan/1_eyes_b.vpcf_c differ diff --git a/effect/darkmoon_roshan/1_eyes_c.vpcf_c b/effect/darkmoon_roshan/1_eyes_c.vpcf_c new file mode 100755 index 0000000..f037d10 Binary files /dev/null and b/effect/darkmoon_roshan/1_eyes_c.vpcf_c differ diff --git a/effect/darkmoon_roshan/1_eyes_d.vpcf_c b/effect/darkmoon_roshan/1_eyes_d.vpcf_c new file mode 100755 index 0000000..cd4f8c2 Binary files /dev/null and b/effect/darkmoon_roshan/1_eyes_d.vpcf_c differ diff --git a/effect/darkmoon_roshan/1_glow.vpcf_c b/effect/darkmoon_roshan/1_glow.vpcf_c new file mode 100755 index 0000000..2cbfc0e Binary files /dev/null and b/effect/darkmoon_roshan/1_glow.vpcf_c differ diff --git a/effect/darkmoon_roshan/1_light.vpcf_c b/effect/darkmoon_roshan/1_light.vpcf_c new file mode 100755 index 0000000..eb930a6 Binary files /dev/null and b/effect/darkmoon_roshan/1_light.vpcf_c differ diff --git a/effect/darkmoon_roshan/1_magic.vpcf_c b/effect/darkmoon_roshan/1_magic.vpcf_c new file mode 100755 index 0000000..9ec1109 Binary files /dev/null and b/effect/darkmoon_roshan/1_magic.vpcf_c differ diff --git a/effect/darkmoon_roshan/1_steam.vpcf_c b/effect/darkmoon_roshan/1_steam.vpcf_c new file mode 100755 index 0000000..6c694b7 Binary files /dev/null and b/effect/darkmoon_roshan/1_steam.vpcf_c differ diff --git a/effect/darkmoon_roshan/1_trail.vpcf_c b/effect/darkmoon_roshan/1_trail.vpcf_c new file mode 100755 index 0000000..214b117 Binary files /dev/null and b/effect/darkmoon_roshan/1_trail.vpcf_c differ diff --git a/effect/darkmoon_roshan/1_trail_wing.vpcf_c b/effect/darkmoon_roshan/1_trail_wing.vpcf_c new file mode 100755 index 0000000..91ec65c Binary files /dev/null and b/effect/darkmoon_roshan/1_trail_wing.vpcf_c differ diff --git a/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker.vpcf_c b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker.vpcf_c new file mode 100755 index 0000000..7fb5014 Binary files /dev/null and b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker.vpcf_c differ diff --git a/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_center.vpcf_c b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_center.vpcf_c new file mode 100755 index 0000000..c4ec473 Binary files /dev/null and b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_center.vpcf_c differ diff --git a/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_gulls.vpcf_c b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_gulls.vpcf_c new file mode 100755 index 0000000..5aa989d Binary files /dev/null and b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_gulls.vpcf_c differ diff --git a/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_model.vpcf_c b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_model.vpcf_c new file mode 100755 index 0000000..31e36b6 Binary files /dev/null and b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_model.vpcf_c differ diff --git a/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_outer.vpcf_c b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_outer.vpcf_c new file mode 100755 index 0000000..ecb2a9e Binary files /dev/null and b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_outer.vpcf_c differ diff --git a/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_puddle.vpcf_c b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_puddle.vpcf_c new file mode 100755 index 0000000..05fc75d Binary files /dev/null and b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_puddle.vpcf_c differ diff --git a/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_splash.vpcf_c b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_splash.vpcf_c new file mode 100755 index 0000000..867c7af Binary files /dev/null and b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_splash.vpcf_c differ diff --git a/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_splash_ring.vpcf_c b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_splash_ring.vpcf_c new file mode 100755 index 0000000..a3df4f7 Binary files /dev/null and b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_splash_ring.vpcf_c differ diff --git a/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_swirl.vpcf_c b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_swirl.vpcf_c new file mode 100755 index 0000000..ed5b9f0 Binary files /dev/null and b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_swirl.vpcf_c differ diff --git a/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_texture.vpcf_c b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_texture.vpcf_c new file mode 100755 index 0000000..58b6a78 Binary files /dev/null and b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_texture.vpcf_c differ diff --git a/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_wake.vpcf_c b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_wake.vpcf_c new file mode 100755 index 0000000..a4831ad Binary files /dev/null and b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_wake.vpcf_c differ diff --git a/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_x.vpcf_c b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_x.vpcf_c new file mode 100755 index 0000000..4689784 Binary files /dev/null and b/effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker_x.vpcf_c differ diff --git a/effect/daxuanwo/xuanwounits/heroes/hero_kunkka/kunkka_ghostship_marker_glow.vpcf_c b/effect/daxuanwo/xuanwounits/heroes/hero_kunkka/kunkka_ghostship_marker_glow.vpcf_c new file mode 100755 index 0000000..8377924 Binary files /dev/null and b/effect/daxuanwo/xuanwounits/heroes/hero_kunkka/kunkka_ghostship_marker_glow.vpcf_c differ diff --git a/effect/dizuo/1.vpcf_c b/effect/dizuo/1.vpcf_c new file mode 100755 index 0000000..dc0b5a6 Binary files /dev/null and b/effect/dizuo/1.vpcf_c differ diff --git a/effect/dizuo/1_glow.vpcf_c b/effect/dizuo/1_glow.vpcf_c new file mode 100755 index 0000000..3c297fd Binary files /dev/null and b/effect/dizuo/1_glow.vpcf_c differ diff --git a/effect/douyu/2.vpcf_c b/effect/douyu/2.vpcf_c new file mode 100755 index 0000000..2beaa23 Binary files /dev/null and b/effect/douyu/2.vpcf_c differ diff --git a/effect/dragon/baseattack/2.vpcf_c b/effect/dragon/baseattack/2.vpcf_c new file mode 100755 index 0000000..ff56b56 Binary files /dev/null and b/effect/dragon/baseattack/2.vpcf_c differ diff --git a/effect/dragon/baseattack/2_explosion.vpcf_c b/effect/dragon/baseattack/2_explosion.vpcf_c new file mode 100755 index 0000000..9fb2e85 Binary files /dev/null and b/effect/dragon/baseattack/2_explosion.vpcf_c differ diff --git a/effect/dragon/baseattack/2_explosion_ember.vpcf_c b/effect/dragon/baseattack/2_explosion_ember.vpcf_c new file mode 100755 index 0000000..e5a27ce Binary files /dev/null and b/effect/dragon/baseattack/2_explosion_ember.vpcf_c differ diff --git a/effect/dragon/baseattack/2_explosion_flare.vpcf_c b/effect/dragon/baseattack/2_explosion_flare.vpcf_c new file mode 100755 index 0000000..2a5e36c Binary files /dev/null and b/effect/dragon/baseattack/2_explosion_flare.vpcf_c differ diff --git a/effect/dragon/baseattack/2_explosion_flash.vpcf_c b/effect/dragon/baseattack/2_explosion_flash.vpcf_c new file mode 100755 index 0000000..4d60f4a Binary files /dev/null and b/effect/dragon/baseattack/2_explosion_flash.vpcf_c differ diff --git a/effect/dragon/baseattack/2_explosion_smoke.vpcf_c b/effect/dragon/baseattack/2_explosion_smoke.vpcf_c new file mode 100755 index 0000000..a87148d Binary files /dev/null and b/effect/dragon/baseattack/2_explosion_smoke.vpcf_c differ diff --git a/effect/dragon/baseattack/2_explosion_spark.vpcf_c b/effect/dragon/baseattack/2_explosion_spark.vpcf_c new file mode 100755 index 0000000..dc4721c Binary files /dev/null and b/effect/dragon/baseattack/2_explosion_spark.vpcf_c differ diff --git a/effect/dragon/baseattack/2_hot_core.vpcf_c b/effect/dragon/baseattack/2_hot_core.vpcf_c new file mode 100755 index 0000000..6f929f3 Binary files /dev/null and b/effect/dragon/baseattack/2_hot_core.vpcf_c differ diff --git a/effect/dragon/baseattack/2_rope.vpcf_c b/effect/dragon/baseattack/2_rope.vpcf_c new file mode 100755 index 0000000..31ab4a7 Binary files /dev/null and b/effect/dragon/baseattack/2_rope.vpcf_c differ diff --git a/effect/dragon/baseattack/2_smoke.vpcf_c b/effect/dragon/baseattack/2_smoke.vpcf_c new file mode 100755 index 0000000..9ce0cd5 Binary files /dev/null and b/effect/dragon/baseattack/2_smoke.vpcf_c differ diff --git a/effect/dragon/baseattack/2_trail_fire.vpcf_c b/effect/dragon/baseattack/2_trail_fire.vpcf_c new file mode 100755 index 0000000..f39d9db Binary files /dev/null and b/effect/dragon/baseattack/2_trail_fire.vpcf_c differ diff --git a/effect/dragon/baseattack/3.vpcf_c b/effect/dragon/baseattack/3.vpcf_c new file mode 100755 index 0000000..e2616ac Binary files /dev/null and b/effect/dragon/baseattack/3.vpcf_c differ diff --git a/effect/dragon/baseattack/3_c.vpcf_c b/effect/dragon/baseattack/3_c.vpcf_c new file mode 100755 index 0000000..0215037 Binary files /dev/null and b/effect/dragon/baseattack/3_c.vpcf_c differ diff --git a/effect/dragon/baseattack/3_e.vpcf_c b/effect/dragon/baseattack/3_e.vpcf_c new file mode 100755 index 0000000..2c1f83e Binary files /dev/null and b/effect/dragon/baseattack/3_e.vpcf_c differ diff --git a/effect/dragon/baseattack/3_explode.vpcf_c b/effect/dragon/baseattack/3_explode.vpcf_c new file mode 100755 index 0000000..9e4bd76 Binary files /dev/null and b/effect/dragon/baseattack/3_explode.vpcf_c differ diff --git a/effect/dragon/baseattack/3_explode_b.vpcf_c b/effect/dragon/baseattack/3_explode_b.vpcf_c new file mode 100755 index 0000000..4caf8bf Binary files /dev/null and b/effect/dragon/baseattack/3_explode_b.vpcf_c differ diff --git a/effect/dragon/baseattack/3_explode_beam.vpcf_c b/effect/dragon/baseattack/3_explode_beam.vpcf_c new file mode 100755 index 0000000..10e3591 Binary files /dev/null and b/effect/dragon/baseattack/3_explode_beam.vpcf_c differ diff --git a/effect/dragon/baseattack/3_explode_c.vpcf_c b/effect/dragon/baseattack/3_explode_c.vpcf_c new file mode 100755 index 0000000..c692e79 Binary files /dev/null and b/effect/dragon/baseattack/3_explode_c.vpcf_c differ diff --git a/effect/dragon/baseattack/3_explode_d.vpcf_c b/effect/dragon/baseattack/3_explode_d.vpcf_c new file mode 100755 index 0000000..15f5d9e Binary files /dev/null and b/effect/dragon/baseattack/3_explode_d.vpcf_c differ diff --git a/effect/dragon/baseattack/3_f.vpcf_c b/effect/dragon/baseattack/3_f.vpcf_c new file mode 100755 index 0000000..4c0b460 Binary files /dev/null and b/effect/dragon/baseattack/3_f.vpcf_c differ diff --git a/effect/dragon/baseattack/3_flakes.vpcf_c b/effect/dragon/baseattack/3_flakes.vpcf_c new file mode 100755 index 0000000..7c12d6a Binary files /dev/null and b/effect/dragon/baseattack/3_flakes.vpcf_c differ diff --git a/effect/dragon/baseattack/3_g.vpcf_c b/effect/dragon/baseattack/3_g.vpcf_c new file mode 100755 index 0000000..55482f6 Binary files /dev/null and b/effect/dragon/baseattack/3_g.vpcf_c differ diff --git a/effect/dragon/baseattack/3_launch.vpcf_c b/effect/dragon/baseattack/3_launch.vpcf_c new file mode 100755 index 0000000..117cbdd Binary files /dev/null and b/effect/dragon/baseattack/3_launch.vpcf_c differ diff --git a/effect/dragon/baseattack/3_launch_b.vpcf_c b/effect/dragon/baseattack/3_launch_b.vpcf_c new file mode 100755 index 0000000..d21e8bf Binary files /dev/null and b/effect/dragon/baseattack/3_launch_b.vpcf_c differ diff --git a/effect/dragon/baseattack/3_light.vpcf_c b/effect/dragon/baseattack/3_light.vpcf_c new file mode 100755 index 0000000..88ff217 Binary files /dev/null and b/effect/dragon/baseattack/3_light.vpcf_c differ diff --git a/effect/dragon/baseattack/3_mist.vpcf_c b/effect/dragon/baseattack/3_mist.vpcf_c new file mode 100755 index 0000000..7942dd3 Binary files /dev/null and b/effect/dragon/baseattack/3_mist.vpcf_c differ diff --git a/effect/dragon/baseattack/3_trail.vpcf_c b/effect/dragon/baseattack/3_trail.vpcf_c new file mode 100755 index 0000000..b978fd9 Binary files /dev/null and b/effect/dragon/baseattack/3_trail.vpcf_c differ diff --git a/effect/drodo/1.vpcf_c b/effect/drodo/1.vpcf_c new file mode 100755 index 0000000..7832741 Binary files /dev/null and b/effect/drodo/1.vpcf_c differ diff --git a/effect/drodo/1_death.vpcf_c b/effect/drodo/1_death.vpcf_c new file mode 100755 index 0000000..2a6b534 Binary files /dev/null and b/effect/drodo/1_death.vpcf_c differ diff --git a/effect/drodo/1_death_b.vpcf_c b/effect/drodo/1_death_b.vpcf_c new file mode 100755 index 0000000..15fd7e9 Binary files /dev/null and b/effect/drodo/1_death_b.vpcf_c differ diff --git a/effect/emengchanrao/1.vpcf_c b/effect/emengchanrao/1.vpcf_c new file mode 100755 index 0000000..c0563bd Binary files /dev/null and b/effect/emengchanrao/1.vpcf_c differ diff --git a/effect/emengchanrao/1_end_ember.vpcf_c b/effect/emengchanrao/1_end_ember.vpcf_c new file mode 100755 index 0000000..ac5e3ff Binary files /dev/null and b/effect/emengchanrao/1_end_ember.vpcf_c differ diff --git a/effect/emengchanrao/1_light.vpcf_c b/effect/emengchanrao/1_light.vpcf_c new file mode 100755 index 0000000..2ffa0d6 Binary files /dev/null and b/effect/emengchanrao/1_light.vpcf_c differ diff --git a/effect/emengchanrao/1_ring.vpcf_c b/effect/emengchanrao/1_ring.vpcf_c new file mode 100755 index 0000000..7412f95 Binary files /dev/null and b/effect/emengchanrao/1_ring.vpcf_c differ diff --git a/effect/emengchanrao/1_ring_edge.vpcf_c b/effect/emengchanrao/1_ring_edge.vpcf_c new file mode 100755 index 0000000..4d25167 Binary files /dev/null and b/effect/emengchanrao/1_ring_edge.vpcf_c differ diff --git a/effect/emengchanrao/1_ring_ember.vpcf_c b/effect/emengchanrao/1_ring_ember.vpcf_c new file mode 100755 index 0000000..1734580 Binary files /dev/null and b/effect/emengchanrao/1_ring_ember.vpcf_c differ diff --git a/effect/emengchanrao/1_ring_end.vpcf_c b/effect/emengchanrao/1_ring_end.vpcf_c new file mode 100755 index 0000000..0b093ca Binary files /dev/null and b/effect/emengchanrao/1_ring_end.vpcf_c differ diff --git a/effect/emengchanrao/1_ring_end_flash.vpcf_c b/effect/emengchanrao/1_ring_end_flash.vpcf_c new file mode 100755 index 0000000..240da02 Binary files /dev/null and b/effect/emengchanrao/1_ring_end_flash.vpcf_c differ diff --git a/effect/emengchanrao/1_ring_mist.vpcf_c b/effect/emengchanrao/1_ring_mist.vpcf_c new file mode 100755 index 0000000..31ea457 Binary files /dev/null and b/effect/emengchanrao/1_ring_mist.vpcf_c differ diff --git a/effect/emengchanrao/1_ring_rope.vpcf_c b/effect/emengchanrao/1_ring_rope.vpcf_c new file mode 100755 index 0000000..49fda74 Binary files /dev/null and b/effect/emengchanrao/1_ring_rope.vpcf_c differ diff --git a/effect/emengchanrao/1_rope.vpcf_c b/effect/emengchanrao/1_rope.vpcf_c new file mode 100755 index 0000000..15b3a40 Binary files /dev/null and b/effect/emengchanrao/1_rope.vpcf_c differ diff --git a/effect/emengchanrao/1_rope_core.vpcf_c b/effect/emengchanrao/1_rope_core.vpcf_c new file mode 100755 index 0000000..1164c2f Binary files /dev/null and b/effect/emengchanrao/1_rope_core.vpcf_c differ diff --git a/effect/emengchanrao/1_rope_pnt.vpcf_c b/effect/emengchanrao/1_rope_pnt.vpcf_c new file mode 100755 index 0000000..7d568c0 Binary files /dev/null and b/effect/emengchanrao/1_rope_pnt.vpcf_c differ diff --git a/effect/emengchanrao/1_rope_rig.vpcf_c b/effect/emengchanrao/1_rope_rig.vpcf_c new file mode 100755 index 0000000..c7792d9 Binary files /dev/null and b/effect/emengchanrao/1_rope_rig.vpcf_c differ diff --git a/effect/fangtexiao/child.vpcf_c b/effect/fangtexiao/child.vpcf_c new file mode 100755 index 0000000..59aced8 Binary files /dev/null and b/effect/fangtexiao/child.vpcf_c differ diff --git a/effect/fangtexiao/child_embers.vpcf_c b/effect/fangtexiao/child_embers.vpcf_c new file mode 100755 index 0000000..9340d8a Binary files /dev/null and b/effect/fangtexiao/child_embers.vpcf_c differ diff --git a/effect/fangtexiao/square.vpcf_c b/effect/fangtexiao/square.vpcf_c new file mode 100755 index 0000000..0af0615 Binary files /dev/null and b/effect/fangtexiao/square.vpcf_c differ diff --git a/effect/fenghuolun/1.vpcf_c b/effect/fenghuolun/1.vpcf_c new file mode 100755 index 0000000..45a82a8 Binary files /dev/null and b/effect/fenghuolun/1.vpcf_c differ diff --git a/effect/fenghuolun/1_ember.vpcf_c b/effect/fenghuolun/1_ember.vpcf_c new file mode 100755 index 0000000..121e8d2 Binary files /dev/null and b/effect/fenghuolun/1_ember.vpcf_c differ diff --git a/effect/fenghuolun/1_ember_b.vpcf_c b/effect/fenghuolun/1_ember_b.vpcf_c new file mode 100755 index 0000000..0aff157 Binary files /dev/null and b/effect/fenghuolun/1_ember_b.vpcf_c differ diff --git a/effect/fenghuolun/1_flare.vpcf_c b/effect/fenghuolun/1_flare.vpcf_c new file mode 100755 index 0000000..00d28e2 Binary files /dev/null and b/effect/fenghuolun/1_flare.vpcf_c differ diff --git a/effect/fenghuolun/1_glow.vpcf_c b/effect/fenghuolun/1_glow.vpcf_c new file mode 100755 index 0000000..66e6611 Binary files /dev/null and b/effect/fenghuolun/1_glow.vpcf_c differ diff --git a/effect/fenghuolun/1_glow_b.vpcf_c b/effect/fenghuolun/1_glow_b.vpcf_c new file mode 100755 index 0000000..3a902d1 Binary files /dev/null and b/effect/fenghuolun/1_glow_b.vpcf_c differ diff --git a/effect/fire/f.vpcf_c b/effect/fire/f.vpcf_c new file mode 100755 index 0000000..60ca108 Binary files /dev/null and b/effect/fire/f.vpcf_c differ diff --git a/effect/frost_roshan/ambient.vpcf_c b/effect/frost_roshan/ambient.vpcf_c new file mode 100755 index 0000000..09db2f4 Binary files /dev/null and b/effect/frost_roshan/ambient.vpcf_c differ diff --git a/effect/frost_roshan/eye.vpcf_c b/effect/frost_roshan/eye.vpcf_c new file mode 100755 index 0000000..f5a7cc9 Binary files /dev/null and b/effect/frost_roshan/eye.vpcf_c differ diff --git a/effect/frost_roshan/eyes.vpcf_c b/effect/frost_roshan/eyes.vpcf_c new file mode 100755 index 0000000..f9e218d Binary files /dev/null and b/effect/frost_roshan/eyes.vpcf_c differ diff --git a/effect/frost_roshan/eyes_b.vpcf_c b/effect/frost_roshan/eyes_b.vpcf_c new file mode 100755 index 0000000..ec10083 Binary files /dev/null and b/effect/frost_roshan/eyes_b.vpcf_c differ diff --git a/effect/frost_roshan/eyes_c.vpcf_c b/effect/frost_roshan/eyes_c.vpcf_c new file mode 100755 index 0000000..1ed1552 Binary files /dev/null and b/effect/frost_roshan/eyes_c.vpcf_c differ diff --git a/effect/frost_roshan/eyes_d.vpcf_c b/effect/frost_roshan/eyes_d.vpcf_c new file mode 100755 index 0000000..98b0bba Binary files /dev/null and b/effect/frost_roshan/eyes_d.vpcf_c differ diff --git a/effect/frost_roshan/flek.vpcf_c b/effect/frost_roshan/flek.vpcf_c new file mode 100755 index 0000000..384e8cc Binary files /dev/null and b/effect/frost_roshan/flek.vpcf_c differ diff --git a/effect/frost_roshan/ground.vpcf_c b/effect/frost_roshan/ground.vpcf_c new file mode 100755 index 0000000..ffefef6 Binary files /dev/null and b/effect/frost_roshan/ground.vpcf_c differ diff --git a/effect/frost_roshan/ground_crystal.vpcf_c b/effect/frost_roshan/ground_crystal.vpcf_c new file mode 100755 index 0000000..dc86980 Binary files /dev/null and b/effect/frost_roshan/ground_crystal.vpcf_c differ diff --git a/effect/frost_roshan/ice.vpcf_c b/effect/frost_roshan/ice.vpcf_c new file mode 100755 index 0000000..04d3691 Binary files /dev/null and b/effect/frost_roshan/ice.vpcf_c differ diff --git a/effect/frost_roshan/snowball_proj.vpcf_c b/effect/frost_roshan/snowball_proj.vpcf_c new file mode 100755 index 0000000..7fa901e Binary files /dev/null and b/effect/frost_roshan/snowball_proj.vpcf_c differ diff --git a/effect/frost_roshan/steam.vpcf_c b/effect/frost_roshan/steam.vpcf_c new file mode 100755 index 0000000..44c0a25 Binary files /dev/null and b/effect/frost_roshan/steam.vpcf_c differ diff --git a/effect/gewugu/1.vpcf_c b/effect/gewugu/1.vpcf_c new file mode 100755 index 0000000..add66dc Binary files /dev/null and b/effect/gewugu/1.vpcf_c differ diff --git a/effect/gewugu/2.vpcf_c b/effect/gewugu/2.vpcf_c new file mode 100755 index 0000000..dc04a7f Binary files /dev/null and b/effect/gewugu/2.vpcf_c differ diff --git a/effect/gewugu/2_b.vpcf_c b/effect/gewugu/2_b.vpcf_c new file mode 100755 index 0000000..fa80489 Binary files /dev/null and b/effect/gewugu/2_b.vpcf_c differ diff --git a/effect/gewugu/2_c.vpcf_c b/effect/gewugu/2_c.vpcf_c new file mode 100755 index 0000000..232dfad Binary files /dev/null and b/effect/gewugu/2_c.vpcf_c differ diff --git a/effect/gewugu/2_d.vpcf_c b/effect/gewugu/2_d.vpcf_c new file mode 100755 index 0000000..9917c35 Binary files /dev/null and b/effect/gewugu/2_d.vpcf_c differ diff --git a/effect/gewugu/2_e.vpcf_c b/effect/gewugu/2_e.vpcf_c new file mode 100755 index 0000000..e365a18 Binary files /dev/null and b/effect/gewugu/2_e.vpcf_c differ diff --git a/effect/gewugu/2_f.vpcf_c b/effect/gewugu/2_f.vpcf_c new file mode 100755 index 0000000..2b7e994 Binary files /dev/null and b/effect/gewugu/2_f.vpcf_c differ diff --git a/effect/gewugu/2_g.vpcf_c b/effect/gewugu/2_g.vpcf_c new file mode 100755 index 0000000..6a6d62c Binary files /dev/null and b/effect/gewugu/2_g.vpcf_c differ diff --git a/effect/gewugu/3.vpcf_c b/effect/gewugu/3.vpcf_c new file mode 100755 index 0000000..caf30e8 Binary files /dev/null and b/effect/gewugu/3.vpcf_c differ diff --git a/effect/gewugu/3_c.vpcf_c b/effect/gewugu/3_c.vpcf_c new file mode 100755 index 0000000..5039ba9 Binary files /dev/null and b/effect/gewugu/3_c.vpcf_c differ diff --git a/effect/gewugu/3_e.vpcf_c b/effect/gewugu/3_e.vpcf_c new file mode 100755 index 0000000..e93c11e Binary files /dev/null and b/effect/gewugu/3_e.vpcf_c differ diff --git a/effect/gewugu/3_g.vpcf_c b/effect/gewugu/3_g.vpcf_c new file mode 100755 index 0000000..39506fd Binary files /dev/null and b/effect/gewugu/3_g.vpcf_c differ diff --git a/effect/gewugu/flyup/ambient.vpcf_c b/effect/gewugu/flyup/ambient.vpcf_c new file mode 100755 index 0000000..dbcac46 Binary files /dev/null and b/effect/gewugu/flyup/ambient.vpcf_c differ diff --git a/effect/gewugu/flyup/bag.vpcf_c b/effect/gewugu/flyup/bag.vpcf_c new file mode 100755 index 0000000..e860b57 Binary files /dev/null and b/effect/gewugu/flyup/bag.vpcf_c differ diff --git a/effect/gewugu/flyup/bag_coin.vpcf_c b/effect/gewugu/flyup/bag_coin.vpcf_c new file mode 100755 index 0000000..5ab8426 Binary files /dev/null and b/effect/gewugu/flyup/bag_coin.vpcf_c differ diff --git a/effect/gewugu/flyup/bag_coin_glint.vpcf_c b/effect/gewugu/flyup/bag_coin_glint.vpcf_c new file mode 100755 index 0000000..8270074 Binary files /dev/null and b/effect/gewugu/flyup/bag_coin_glint.vpcf_c differ diff --git a/effect/gewugu/flyup/bag_coin_ground.vpcf_c b/effect/gewugu/flyup/bag_coin_ground.vpcf_c new file mode 100755 index 0000000..e78e9ea Binary files /dev/null and b/effect/gewugu/flyup/bag_coin_ground.vpcf_c differ diff --git a/effect/gewugu/flyup/bag_gold_glint.vpcf_c b/effect/gewugu/flyup/bag_gold_glint.vpcf_c new file mode 100755 index 0000000..7305d5b Binary files /dev/null and b/effect/gewugu/flyup/bag_gold_glint.vpcf_c differ diff --git a/effect/gewugu/flyup/bag_gold_twinkle.vpcf_c b/effect/gewugu/flyup/bag_gold_twinkle.vpcf_c new file mode 100755 index 0000000..e5d44ce Binary files /dev/null and b/effect/gewugu/flyup/bag_gold_twinkle.vpcf_c differ diff --git a/effect/god/1.vpcf_c b/effect/god/1.vpcf_c new file mode 100755 index 0000000..a27ad2f Binary files /dev/null and b/effect/god/1.vpcf_c differ diff --git a/effect/god/1_b.vpcf_c b/effect/god/1_b.vpcf_c new file mode 100755 index 0000000..2faae98 Binary files /dev/null and b/effect/god/1_b.vpcf_c differ diff --git a/effect/god/1_c.vpcf_c b/effect/god/1_c.vpcf_c new file mode 100755 index 0000000..f4bf027 Binary files /dev/null and b/effect/god/1_c.vpcf_c differ diff --git a/effect/god/1_c_fallback_mid.vpcf_c b/effect/god/1_c_fallback_mid.vpcf_c new file mode 100755 index 0000000..0171e3f Binary files /dev/null and b/effect/god/1_c_fallback_mid.vpcf_c differ diff --git a/effect/god/1_e.vpcf_c b/effect/god/1_e.vpcf_c new file mode 100755 index 0000000..26c2497 Binary files /dev/null and b/effect/god/1_e.vpcf_c differ diff --git a/effect/god/1_fallback_mid.vpcf_c b/effect/god/1_fallback_mid.vpcf_c new file mode 100755 index 0000000..8143ad2 Binary files /dev/null and b/effect/god/1_fallback_mid.vpcf_c differ diff --git a/effect/gold_angel/angels.vpcf_c b/effect/gold_angel/angels.vpcf_c new file mode 100755 index 0000000..a4e02c4 Binary files /dev/null and b/effect/gold_angel/angels.vpcf_c differ diff --git a/effect/gold_angel/angels_glow.vpcf_c b/effect/gold_angel/angels_glow.vpcf_c new file mode 100755 index 0000000..6f60605 Binary files /dev/null and b/effect/gold_angel/angels_glow.vpcf_c differ diff --git a/effect/gold_angel/flare.vpcf_c b/effect/gold_angel/flare.vpcf_c new file mode 100755 index 0000000..a949774 Binary files /dev/null and b/effect/gold_angel/flare.vpcf_c differ diff --git a/effect/gold_angel/ti7angels.vpcf_c b/effect/gold_angel/ti7angels.vpcf_c new file mode 100755 index 0000000..8282b65 Binary files /dev/null and b/effect/gold_angel/ti7angels.vpcf_c differ diff --git a/effect/gold_angel/ti7angels_glow.vpcf_c b/effect/gold_angel/ti7angels_glow.vpcf_c new file mode 100755 index 0000000..f827948 Binary files /dev/null and b/effect/gold_angel/ti7angels_glow.vpcf_c differ diff --git a/effect/gold_angel/ti7flare.vpcf_c b/effect/gold_angel/ti7flare.vpcf_c new file mode 100755 index 0000000..eb53cf5 Binary files /dev/null and b/effect/gold_angel/ti7flare.vpcf_c differ diff --git a/effect/golden_roshan/ambient.vpcf_c b/effect/golden_roshan/ambient.vpcf_c new file mode 100755 index 0000000..8cc76bc Binary files /dev/null and b/effect/golden_roshan/ambient.vpcf_c differ diff --git a/effect/golden_roshan/ambient_b.vpcf_c b/effect/golden_roshan/ambient_b.vpcf_c new file mode 100755 index 0000000..de73d59 Binary files /dev/null and b/effect/golden_roshan/ambient_b.vpcf_c differ diff --git a/effect/golden_roshan/ambient_c.vpcf_c b/effect/golden_roshan/ambient_c.vpcf_c new file mode 100755 index 0000000..88ffea2 Binary files /dev/null and b/effect/golden_roshan/ambient_c.vpcf_c differ diff --git a/effect/golden_roshan/ambient_d.vpcf_c b/effect/golden_roshan/ambient_d.vpcf_c new file mode 100755 index 0000000..2cd8c59 Binary files /dev/null and b/effect/golden_roshan/ambient_d.vpcf_c differ diff --git a/effect/golden_roshan/eyes.vpcf_c b/effect/golden_roshan/eyes.vpcf_c new file mode 100755 index 0000000..e17ab2c Binary files /dev/null and b/effect/golden_roshan/eyes.vpcf_c differ diff --git a/effect/golden_roshan/eyes_b.vpcf_c b/effect/golden_roshan/eyes_b.vpcf_c new file mode 100755 index 0000000..7dac12f Binary files /dev/null and b/effect/golden_roshan/eyes_b.vpcf_c differ diff --git a/effect/golden_roshan/eyes_c.vpcf_c b/effect/golden_roshan/eyes_c.vpcf_c new file mode 100755 index 0000000..3ca00ee Binary files /dev/null and b/effect/golden_roshan/eyes_c.vpcf_c differ diff --git a/effect/golden_roshan/eyes_d.vpcf_c b/effect/golden_roshan/eyes_d.vpcf_c new file mode 100755 index 0000000..836b1d1 Binary files /dev/null and b/effect/golden_roshan/eyes_d.vpcf_c differ diff --git a/effect/golden_roshan/goldenambient.vpcf_c b/effect/golden_roshan/goldenambient.vpcf_c new file mode 100755 index 0000000..8280d94 Binary files /dev/null and b/effect/golden_roshan/goldenambient.vpcf_c differ diff --git a/effect/golden_roshan/goldenambient_b.vpcf_c b/effect/golden_roshan/goldenambient_b.vpcf_c new file mode 100755 index 0000000..bbf60bf Binary files /dev/null and b/effect/golden_roshan/goldenambient_b.vpcf_c differ diff --git a/effect/golden_roshan/goldenambient_c.vpcf_c b/effect/golden_roshan/goldenambient_c.vpcf_c new file mode 100755 index 0000000..30df7c4 Binary files /dev/null and b/effect/golden_roshan/goldenambient_c.vpcf_c differ diff --git a/effect/golden_roshan/goldenambient_d.vpcf_c b/effect/golden_roshan/goldenambient_d.vpcf_c new file mode 100755 index 0000000..d859f24 Binary files /dev/null and b/effect/golden_roshan/goldenambient_d.vpcf_c differ diff --git a/effect/golden_roshan/goldeneyes.vpcf_c b/effect/golden_roshan/goldeneyes.vpcf_c new file mode 100755 index 0000000..33a0928 Binary files /dev/null and b/effect/golden_roshan/goldeneyes.vpcf_c differ diff --git a/effect/golden_roshan/goldeneyes_b.vpcf_c b/effect/golden_roshan/goldeneyes_b.vpcf_c new file mode 100755 index 0000000..e119e10 Binary files /dev/null and b/effect/golden_roshan/goldeneyes_b.vpcf_c differ diff --git a/effect/golden_roshan/goldeneyes_c.vpcf_c b/effect/golden_roshan/goldeneyes_c.vpcf_c new file mode 100755 index 0000000..7c6f22f Binary files /dev/null and b/effect/golden_roshan/goldeneyes_c.vpcf_c differ diff --git a/effect/golden_roshan/goldeneyes_d.vpcf_c b/effect/golden_roshan/goldeneyes_d.vpcf_c new file mode 100755 index 0000000..9add54c Binary files /dev/null and b/effect/golden_roshan/goldeneyes_d.vpcf_c differ diff --git a/effect/golden_treasure_ti7_ambient_2/ti7.vpcf_c b/effect/golden_treasure_ti7_ambient_2/ti7.vpcf_c new file mode 100755 index 0000000..3a116b1 Binary files /dev/null and b/effect/golden_treasure_ti7_ambient_2/ti7.vpcf_c differ diff --git a/effect/golden_treasure_ti7_ambient_2/ti7_glow.vpcf_c b/effect/golden_treasure_ti7_ambient_2/ti7_glow.vpcf_c new file mode 100755 index 0000000..01d5480 Binary files /dev/null and b/effect/golden_treasure_ti7_ambient_2/ti7_glow.vpcf_c differ diff --git a/effect/golden_treasure_ti7_ambient_2/ti7_magic.vpcf_c b/effect/golden_treasure_ti7_ambient_2/ti7_magic.vpcf_c new file mode 100755 index 0000000..898fc78 Binary files /dev/null and b/effect/golden_treasure_ti7_ambient_2/ti7_magic.vpcf_c differ diff --git a/effect/golden_treasure_ti7_ambient_2/ti7_shine.vpcf_c b/effect/golden_treasure_ti7_ambient_2/ti7_shine.vpcf_c new file mode 100755 index 0000000..a5ef51b Binary files /dev/null and b/effect/golden_treasure_ti7_ambient_2/ti7_shine.vpcf_c differ diff --git a/effect/golden_treasure_ti7_ambient_2/ti7_twinkle.vpcf_c b/effect/golden_treasure_ti7_ambient_2/ti7_twinkle.vpcf_c new file mode 100755 index 0000000..423355f Binary files /dev/null and b/effect/golden_treasure_ti7_ambient_2/ti7_twinkle.vpcf_c differ diff --git a/effect/golden_ww/1.vpcf_c b/effect/golden_ww/1.vpcf_c new file mode 100755 index 0000000..2ee07ba Binary files /dev/null and b/effect/golden_ww/1.vpcf_c differ diff --git a/effect/gs_fuhun/debuffdebuff.vpcf_c b/effect/gs_fuhun/debuffdebuff.vpcf_c new file mode 100755 index 0000000..834f99b Binary files /dev/null and b/effect/gs_fuhun/debuffdebuff.vpcf_c differ diff --git a/effect/gs_fuhun/debuffground_chains_glow.vpcf_c b/effect/gs_fuhun/debuffground_chains_glow.vpcf_c new file mode 100755 index 0000000..185b612 Binary files /dev/null and b/effect/gs_fuhun/debuffground_chains_glow.vpcf_c differ diff --git a/effect/gs_fuhun/debuffground_model.vpcf_c b/effect/gs_fuhun/debuffground_model.vpcf_c new file mode 100755 index 0000000..2014ac3 Binary files /dev/null and b/effect/gs_fuhun/debuffground_model.vpcf_c differ diff --git a/effect/gs_fuhun/debuffground_proj.vpcf_c b/effect/gs_fuhun/debuffground_proj.vpcf_c new file mode 100755 index 0000000..06b67c6 Binary files /dev/null and b/effect/gs_fuhun/debuffground_proj.vpcf_c differ diff --git a/effect/gs_fuhun/debuffground_rope.vpcf_c b/effect/gs_fuhun/debuffground_rope.vpcf_c new file mode 100755 index 0000000..f725cd4 Binary files /dev/null and b/effect/gs_fuhun/debuffground_rope.vpcf_c differ diff --git a/effect/gs_fuhun/debuffground_splash.vpcf_c b/effect/gs_fuhun/debuffground_splash.vpcf_c new file mode 100755 index 0000000..7e22651 Binary files /dev/null and b/effect/gs_fuhun/debuffground_splash.vpcf_c differ diff --git a/effect/gs_fuhun/debuffground_splatter.vpcf_c b/effect/gs_fuhun/debuffground_splatter.vpcf_c new file mode 100755 index 0000000..87b5fd8 Binary files /dev/null and b/effect/gs_fuhun/debuffground_splatter.vpcf_c differ diff --git a/effect/gs_fuhun/debuffmain_embers.vpcf_c b/effect/gs_fuhun/debuffmain_embers.vpcf_c new file mode 100755 index 0000000..e3e2cd5 Binary files /dev/null and b/effect/gs_fuhun/debuffmain_embers.vpcf_c differ diff --git a/effect/gs_fuhun/debuffmain_glow.vpcf_c b/effect/gs_fuhun/debuffmain_glow.vpcf_c new file mode 100755 index 0000000..b2feb27 Binary files /dev/null and b/effect/gs_fuhun/debuffmain_glow.vpcf_c differ diff --git a/effect/gs_fuhun/debuffmain_outline.vpcf_c b/effect/gs_fuhun/debuffmain_outline.vpcf_c new file mode 100755 index 0000000..0d1b042 Binary files /dev/null and b/effect/gs_fuhun/debuffmain_outline.vpcf_c differ diff --git a/effect/huangsha/roushanbaby_roshan_desert_sands_ambient.vpcf_c b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient.vpcf_c new file mode 100755 index 0000000..59a9058 Binary files /dev/null and b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient.vpcf_c differ diff --git a/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_a.vpcf_c b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_a.vpcf_c new file mode 100755 index 0000000..d0fe604 Binary files /dev/null and b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_a.vpcf_c differ diff --git a/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_b.vpcf_c b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_b.vpcf_c new file mode 100755 index 0000000..9596eb3 Binary files /dev/null and b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_b.vpcf_c differ diff --git a/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_b_trail.vpcf_c b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_b_trail.vpcf_c new file mode 100755 index 0000000..387cd48 Binary files /dev/null and b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_b_trail.vpcf_c differ diff --git a/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_c.vpcf_c b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_c.vpcf_c new file mode 100755 index 0000000..61b9527 Binary files /dev/null and b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_c.vpcf_c differ diff --git a/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_c_trail.vpcf_c b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_c_trail.vpcf_c new file mode 100755 index 0000000..4e59d18 Binary files /dev/null and b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_c_trail.vpcf_c differ diff --git a/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_d.vpcf_c b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_d.vpcf_c new file mode 100755 index 0000000..8772793 Binary files /dev/null and b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_d.vpcf_c differ diff --git a/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_sand_trail.vpcf_c b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_sand_trail.vpcf_c new file mode 100755 index 0000000..c49310d Binary files /dev/null and b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_sand_trail.vpcf_c differ diff --git a/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_wings_a.vpcf_c b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_wings_a.vpcf_c new file mode 100755 index 0000000..f1fcd42 Binary files /dev/null and b/effect/huangsha/roushanbaby_roshan_desert_sands_ambient_wings_a.vpcf_c differ diff --git a/effect/huangsha/roushanbaby_roshan_desert_sands_rocks_model.vpcf_c b/effect/huangsha/roushanbaby_roshan_desert_sands_rocks_model.vpcf_c new file mode 100755 index 0000000..011ae29 Binary files /dev/null and b/effect/huangsha/roushanbaby_roshan_desert_sands_rocks_model.vpcf_c differ diff --git a/effect/huangsha/roushancourier_roshan_desert_sands_eyes.vpcf_c b/effect/huangsha/roushancourier_roshan_desert_sands_eyes.vpcf_c new file mode 100755 index 0000000..7370064 Binary files /dev/null and b/effect/huangsha/roushancourier_roshan_desert_sands_eyes.vpcf_c differ diff --git a/effect/huangsha/roushancourier_roshan_desert_sands_eyes_a.vpcf_c b/effect/huangsha/roushancourier_roshan_desert_sands_eyes_a.vpcf_c new file mode 100755 index 0000000..19dfade Binary files /dev/null and b/effect/huangsha/roushancourier_roshan_desert_sands_eyes_a.vpcf_c differ diff --git a/effect/huangsha/roushancourier_roshan_desert_sands_eyes_b.vpcf_c b/effect/huangsha/roushancourier_roshan_desert_sands_eyes_b.vpcf_c new file mode 100755 index 0000000..29f99d0 Binary files /dev/null and b/effect/huangsha/roushancourier_roshan_desert_sands_eyes_b.vpcf_c differ diff --git a/effect/huangsha/roushancourier_roshan_desert_sands_eyes_embers.vpcf_c b/effect/huangsha/roushancourier_roshan_desert_sands_eyes_embers.vpcf_c new file mode 100755 index 0000000..a7e0930 Binary files /dev/null and b/effect/huangsha/roushancourier_roshan_desert_sands_eyes_embers.vpcf_c differ diff --git a/effect/huangsha/roushancourier_roshan_desert_sands_eyes_embers_b.vpcf_c b/effect/huangsha/roushancourier_roshan_desert_sands_eyes_embers_b.vpcf_c new file mode 100755 index 0000000..6030cf5 Binary files /dev/null and b/effect/huangsha/roushancourier_roshan_desert_sands_eyes_embers_b.vpcf_c differ diff --git a/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient.vpcf_c b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient.vpcf_c new file mode 100755 index 0000000..8a17893 Binary files /dev/null and b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient.vpcf_c differ diff --git a/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_a.vpcf_c b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_a.vpcf_c new file mode 100755 index 0000000..d70852a Binary files /dev/null and b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_a.vpcf_c differ diff --git a/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_b.vpcf_c b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_b.vpcf_c new file mode 100755 index 0000000..8ee73ef Binary files /dev/null and b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_b.vpcf_c differ diff --git a/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_b_trail.vpcf_c b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_b_trail.vpcf_c new file mode 100755 index 0000000..da9e7d4 Binary files /dev/null and b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_b_trail.vpcf_c differ diff --git a/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_c.vpcf_c b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_c.vpcf_c new file mode 100755 index 0000000..a252011 Binary files /dev/null and b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_c.vpcf_c differ diff --git a/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_c_trail.vpcf_c b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_c_trail.vpcf_c new file mode 100755 index 0000000..b4c0d25 Binary files /dev/null and b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_c_trail.vpcf_c differ diff --git a/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_d.vpcf_c b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_d.vpcf_c new file mode 100755 index 0000000..376c14a Binary files /dev/null and b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_d.vpcf_c differ diff --git a/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_sand_trail.vpcf_c b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_sand_trail.vpcf_c new file mode 100755 index 0000000..9d1bc5d Binary files /dev/null and b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_sand_trail.vpcf_c differ diff --git a/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_wings_a.vpcf_c b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_wings_a.vpcf_c new file mode 100755 index 0000000..67a1e12 Binary files /dev/null and b/effect/huangsha2/roushanbaby_roshan_desert_sands_ambient_wings_a.vpcf_c differ diff --git a/effect/huangsha2/roushanbaby_roshan_desert_sands_rocks_model.vpcf_c b/effect/huangsha2/roushanbaby_roshan_desert_sands_rocks_model.vpcf_c new file mode 100755 index 0000000..d4db107 Binary files /dev/null and b/effect/huangsha2/roushanbaby_roshan_desert_sands_rocks_model.vpcf_c differ diff --git a/effect/huangsha2/roushancourier_roshan_desert_sands_eyes.vpcf_c b/effect/huangsha2/roushancourier_roshan_desert_sands_eyes.vpcf_c new file mode 100755 index 0000000..dfe4b38 Binary files /dev/null and b/effect/huangsha2/roushancourier_roshan_desert_sands_eyes.vpcf_c differ diff --git a/effect/huangsha2/roushancourier_roshan_desert_sands_eyes_a.vpcf_c b/effect/huangsha2/roushancourier_roshan_desert_sands_eyes_a.vpcf_c new file mode 100755 index 0000000..ce07430 Binary files /dev/null and b/effect/huangsha2/roushancourier_roshan_desert_sands_eyes_a.vpcf_c differ diff --git a/effect/huangsha2/roushancourier_roshan_desert_sands_eyes_b.vpcf_c b/effect/huangsha2/roushancourier_roshan_desert_sands_eyes_b.vpcf_c new file mode 100755 index 0000000..5171f5c Binary files /dev/null and b/effect/huangsha2/roushancourier_roshan_desert_sands_eyes_b.vpcf_c differ diff --git a/effect/huangsha2/roushancourier_roshan_desert_sands_eyes_embers.vpcf_c b/effect/huangsha2/roushancourier_roshan_desert_sands_eyes_embers.vpcf_c new file mode 100755 index 0000000..7038a71 Binary files /dev/null and b/effect/huangsha2/roushancourier_roshan_desert_sands_eyes_embers.vpcf_c differ diff --git a/effect/huangsha2/roushancourier_roshan_desert_sands_eyes_embers_b.vpcf_c b/effect/huangsha2/roushancourier_roshan_desert_sands_eyes_embers_b.vpcf_c new file mode 100755 index 0000000..d691e60 Binary files /dev/null and b/effect/huangsha2/roushancourier_roshan_desert_sands_eyes_embers_b.vpcf_c differ diff --git a/effect/hunter/monkey_king_fur_army_destroy.vpcf_c b/effect/hunter/monkey_king_fur_army_destroy.vpcf_c new file mode 100755 index 0000000..660843b Binary files /dev/null and b/effect/hunter/monkey_king_fur_army_destroy.vpcf_c differ diff --git a/effect/hunter/monkey_king_fur_army_positions.vpcf_c b/effect/hunter/monkey_king_fur_army_positions.vpcf_c new file mode 100755 index 0000000..79a1778 Binary files /dev/null and b/effect/hunter/monkey_king_fur_army_positions.vpcf_c differ diff --git a/effect/hunter/monkey_king_fur_army_positions_ring_base.vpcf_c b/effect/hunter/monkey_king_fur_army_positions_ring_base.vpcf_c new file mode 100755 index 0000000..6c6e9e3 Binary files /dev/null and b/effect/hunter/monkey_king_fur_army_positions_ring_base.vpcf_c differ diff --git a/effect/hunter/monkey_king_fur_army_positions_ring_dragon.vpcf_c b/effect/hunter/monkey_king_fur_army_positions_ring_dragon.vpcf_c new file mode 100755 index 0000000..2622fdd Binary files /dev/null and b/effect/hunter/monkey_king_fur_army_positions_ring_dragon.vpcf_c differ diff --git a/effect/hunter/monkey_king_fur_army_positions_ring_flash.vpcf_c b/effect/hunter/monkey_king_fur_army_positions_ring_flash.vpcf_c new file mode 100755 index 0000000..4693ac5 Binary files /dev/null and b/effect/hunter/monkey_king_fur_army_positions_ring_flash.vpcf_c differ diff --git a/effect/item_shanguang/1.vpcf_c b/effect/item_shanguang/1.vpcf_c new file mode 100755 index 0000000..8d7d489 Binary files /dev/null and b/effect/item_shanguang/1.vpcf_c differ diff --git a/effect/jiangbing/1.vpcf_c b/effect/jiangbing/1.vpcf_c new file mode 100755 index 0000000..ebdd1b6 Binary files /dev/null and b/effect/jiangbing/1.vpcf_c differ diff --git a/effect/jiangbing/1_bodytrail.vpcf_c b/effect/jiangbing/1_bodytrail.vpcf_c new file mode 100755 index 0000000..21e11a6 Binary files /dev/null and b/effect/jiangbing/1_bodytrail.vpcf_c differ diff --git a/effect/jiangbing/1_bodytrail_glow.vpcf_c b/effect/jiangbing/1_bodytrail_glow.vpcf_c new file mode 100755 index 0000000..96f6b91 Binary files /dev/null and b/effect/jiangbing/1_bodytrail_glow.vpcf_c differ diff --git a/effect/jiangbing/1_drop.vpcf_c b/effect/jiangbing/1_drop.vpcf_c new file mode 100755 index 0000000..6cb67b8 Binary files /dev/null and b/effect/jiangbing/1_drop.vpcf_c differ diff --git a/effect/jiangbing/1_drop_b.vpcf_c b/effect/jiangbing/1_drop_b.vpcf_c new file mode 100755 index 0000000..0af9f35 Binary files /dev/null and b/effect/jiangbing/1_drop_b.vpcf_c differ diff --git a/effect/jiangbing/1_drop_b_glow.vpcf_c b/effect/jiangbing/1_drop_b_glow.vpcf_c new file mode 100755 index 0000000..4556162 Binary files /dev/null and b/effect/jiangbing/1_drop_b_glow.vpcf_c differ diff --git a/effect/jiangbing/1_eye.vpcf_c b/effect/jiangbing/1_eye.vpcf_c new file mode 100755 index 0000000..2c09d1c Binary files /dev/null and b/effect/jiangbing/1_eye.vpcf_c differ diff --git a/effect/jiangbing/1_eye_a.vpcf_c b/effect/jiangbing/1_eye_a.vpcf_c new file mode 100755 index 0000000..e78dc2d Binary files /dev/null and b/effect/jiangbing/1_eye_a.vpcf_c differ diff --git a/effect/jiangbing/1_eye_glow.vpcf_c b/effect/jiangbing/1_eye_glow.vpcf_c new file mode 100755 index 0000000..9f0e377 Binary files /dev/null and b/effect/jiangbing/1_eye_glow.vpcf_c differ diff --git a/effect/jiangbing/1_eye_streak.vpcf_c b/effect/jiangbing/1_eye_streak.vpcf_c new file mode 100755 index 0000000..aa63a27 Binary files /dev/null and b/effect/jiangbing/1_eye_streak.vpcf_c differ diff --git a/effect/jiangbing/1_gem.vpcf_c b/effect/jiangbing/1_gem.vpcf_c new file mode 100755 index 0000000..caaa2c8 Binary files /dev/null and b/effect/jiangbing/1_gem.vpcf_c differ diff --git a/effect/jiangbing/1_gem_glow.vpcf_c b/effect/jiangbing/1_gem_glow.vpcf_c new file mode 100755 index 0000000..f11c86d Binary files /dev/null and b/effect/jiangbing/1_gem_glow.vpcf_c differ diff --git a/effect/jiangbing/1_glow.vpcf_c b/effect/jiangbing/1_glow.vpcf_c new file mode 100755 index 0000000..9e49b93 Binary files /dev/null and b/effect/jiangbing/1_glow.vpcf_c differ diff --git a/effect/jiangbing/1_sparks.vpcf_c b/effect/jiangbing/1_sparks.vpcf_c new file mode 100755 index 0000000..2578328 Binary files /dev/null and b/effect/jiangbing/1_sparks.vpcf_c differ diff --git a/effect/jiangbing/1_sparks_red.vpcf_c b/effect/jiangbing/1_sparks_red.vpcf_c new file mode 100755 index 0000000..0bdb505 Binary files /dev/null and b/effect/jiangbing/1_sparks_red.vpcf_c differ diff --git a/effect/jiangbing/1_trail.vpcf_c b/effect/jiangbing/1_trail.vpcf_c new file mode 100755 index 0000000..e014e24 Binary files /dev/null and b/effect/jiangbing/1_trail.vpcf_c differ diff --git a/effect/jiangbing/1_trail_rope.vpcf_c b/effect/jiangbing/1_trail_rope.vpcf_c new file mode 100755 index 0000000..e22501c Binary files /dev/null and b/effect/jiangbing/1_trail_rope.vpcf_c differ diff --git a/effect/jiangbing/1_trail_rope_glow.vpcf_c b/effect/jiangbing/1_trail_rope_glow.vpcf_c new file mode 100755 index 0000000..246e84b Binary files /dev/null and b/effect/jiangbing/1_trail_rope_glow.vpcf_c differ diff --git a/effect/jiangbing/1_trail_rope_red.vpcf_c b/effect/jiangbing/1_trail_rope_red.vpcf_c new file mode 100755 index 0000000..76c8737 Binary files /dev/null and b/effect/jiangbing/1_trail_rope_red.vpcf_c differ diff --git a/effect/jigubang/1.vpcf_c b/effect/jigubang/1.vpcf_c new file mode 100755 index 0000000..e0b2e67 Binary files /dev/null and b/effect/jigubang/1.vpcf_c differ diff --git a/effect/jin_dp/courier_krobeling_gold_ambient.vpcf_c b/effect/jin_dp/courier_krobeling_gold_ambient.vpcf_c new file mode 100755 index 0000000..3437118 Binary files /dev/null and b/effect/jin_dp/courier_krobeling_gold_ambient.vpcf_c differ diff --git a/effect/jin_dp/courier_krobeling_gold_ambient_glow.vpcf_c b/effect/jin_dp/courier_krobeling_gold_ambient_glow.vpcf_c new file mode 100755 index 0000000..ad45e05 Binary files /dev/null and b/effect/jin_dp/courier_krobeling_gold_ambient_glow.vpcf_c differ diff --git a/effect/jin_dp/courier_krobeling_gold_ambient_magic.vpcf_c b/effect/jin_dp/courier_krobeling_gold_ambient_magic.vpcf_c new file mode 100755 index 0000000..4c83cba Binary files /dev/null and b/effect/jin_dp/courier_krobeling_gold_ambient_magic.vpcf_c differ diff --git a/effect/jin_dp/courier_krobeling_gold_ambient_twinkle.vpcf_c b/effect/jin_dp/courier_krobeling_gold_ambient_twinkle.vpcf_c new file mode 100755 index 0000000..1783f86 Binary files /dev/null and b/effect/jin_dp/courier_krobeling_gold_ambient_twinkle.vpcf_c differ diff --git a/effect/jinbi/jinbigold.vpcf_c b/effect/jinbi/jinbigold.vpcf_c new file mode 100755 index 0000000..12f6d93 Binary files /dev/null and b/effect/jinbi/jinbigold.vpcf_c differ diff --git a/effect/jinbi/jinbigoldend.vpcf_c b/effect/jinbi/jinbigoldend.vpcf_c new file mode 100755 index 0000000..048864b Binary files /dev/null and b/effect/jinbi/jinbigoldend.vpcf_c differ diff --git a/effect/jinbi/jinbigoldglow.vpcf_c b/effect/jinbi/jinbigoldglow.vpcf_c new file mode 100755 index 0000000..b6bc984 Binary files /dev/null and b/effect/jinbi/jinbigoldglow.vpcf_c differ diff --git a/effect/jinbi/jinbitrail.vpcf_c b/effect/jinbi/jinbitrail.vpcf_c new file mode 100755 index 0000000..d2ec57d Binary files /dev/null and b/effect/jinbi/jinbitrail.vpcf_c differ diff --git a/effect/knight/1.vpcf_c b/effect/knight/1.vpcf_c new file mode 100755 index 0000000..bf93446 Binary files /dev/null and b/effect/knight/1.vpcf_c differ diff --git a/effect/knight/1_body_glow.vpcf_c b/effect/knight/1_body_glow.vpcf_c new file mode 100755 index 0000000..10d9824 Binary files /dev/null and b/effect/knight/1_body_glow.vpcf_c differ diff --git a/effect/knight/1_cylinder.vpcf_c b/effect/knight/1_cylinder.vpcf_c new file mode 100755 index 0000000..86e4c46 Binary files /dev/null and b/effect/knight/1_cylinder.vpcf_c differ diff --git a/effect/knight/1_cylinder_active.vpcf_c b/effect/knight/1_cylinder_active.vpcf_c new file mode 100755 index 0000000..a3dce75 Binary files /dev/null and b/effect/knight/1_cylinder_active.vpcf_c differ diff --git a/effect/knight/1_flash.vpcf_c b/effect/knight/1_flash.vpcf_c new file mode 100755 index 0000000..28d00d3 Binary files /dev/null and b/effect/knight/1_flash.vpcf_c differ diff --git a/effect/knight/1_glyph.vpcf_c b/effect/knight/1_glyph.vpcf_c new file mode 100755 index 0000000..0214f0a Binary files /dev/null and b/effect/knight/1_glyph.vpcf_c differ diff --git a/effect/knight/1_glyph_glow.vpcf_c b/effect/knight/1_glyph_glow.vpcf_c new file mode 100755 index 0000000..b8a062a Binary files /dev/null and b/effect/knight/1_glyph_glow.vpcf_c differ diff --git a/effect/knight/1_rings.vpcf_c b/effect/knight/1_rings.vpcf_c new file mode 100755 index 0000000..7ca0ea9 Binary files /dev/null and b/effect/knight/1_rings.vpcf_c differ diff --git a/effect/knight/1_sphere.vpcf_c b/effect/knight/1_sphere.vpcf_c new file mode 100755 index 0000000..e218175 Binary files /dev/null and b/effect/knight/1_sphere.vpcf_c differ diff --git a/effect/knight/1_swoosh.vpcf_c b/effect/knight/1_swoosh.vpcf_c new file mode 100755 index 0000000..756e35a Binary files /dev/null and b/effect/knight/1_swoosh.vpcf_c differ diff --git a/effect/knight/1_swoosh_b.vpcf_c b/effect/knight/1_swoosh_b.vpcf_c new file mode 100755 index 0000000..3542da6 Binary files /dev/null and b/effect/knight/1_swoosh_b.vpcf_c differ diff --git a/effect/lanhuo/b_motenai.vpcf_c b/effect/lanhuo/b_motenai.vpcf_c new file mode 100755 index 0000000..35ee87e Binary files /dev/null and b/effect/lanhuo/b_motenai.vpcf_c differ diff --git a/effect/lanhuo/c_motenai.vpcf_c b/effect/lanhuo/c_motenai.vpcf_c new file mode 100755 index 0000000..c86acc9 Binary files /dev/null and b/effect/lanhuo/c_motenai.vpcf_c differ diff --git a/effect/lanhuo/glow_motenai.vpcf_c b/effect/lanhuo/glow_motenai.vpcf_c new file mode 100755 index 0000000..ad485af Binary files /dev/null and b/effect/lanhuo/glow_motenai.vpcf_c differ diff --git a/effect/lanhuo/motenai.vpcf_c b/effect/lanhuo/motenai.vpcf_c new file mode 100755 index 0000000..fec1834 Binary files /dev/null and b/effect/lanhuo/motenai.vpcf_c differ diff --git a/effect/lava_roshan/1.vpcf_c b/effect/lava_roshan/1.vpcf_c new file mode 100755 index 0000000..6d9c984 Binary files /dev/null and b/effect/lava_roshan/1.vpcf_c differ diff --git a/effect/lava_roshan/1_ember.vpcf_c b/effect/lava_roshan/1_ember.vpcf_c new file mode 100755 index 0000000..d5097e9 Binary files /dev/null and b/effect/lava_roshan/1_ember.vpcf_c differ diff --git a/effect/lava_roshan/1_eyes.vpcf_c b/effect/lava_roshan/1_eyes.vpcf_c new file mode 100755 index 0000000..113008b Binary files /dev/null and b/effect/lava_roshan/1_eyes.vpcf_c differ diff --git a/effect/lava_roshan/1_eyes_b.vpcf_c b/effect/lava_roshan/1_eyes_b.vpcf_c new file mode 100755 index 0000000..1ad17ff Binary files /dev/null and b/effect/lava_roshan/1_eyes_b.vpcf_c differ diff --git a/effect/lava_roshan/1_eyes_c.vpcf_c b/effect/lava_roshan/1_eyes_c.vpcf_c new file mode 100755 index 0000000..84e263f Binary files /dev/null and b/effect/lava_roshan/1_eyes_c.vpcf_c differ diff --git a/effect/lava_roshan/1_eyes_d.vpcf_c b/effect/lava_roshan/1_eyes_d.vpcf_c new file mode 100755 index 0000000..f5fa66c Binary files /dev/null and b/effect/lava_roshan/1_eyes_d.vpcf_c differ diff --git a/effect/lava_roshan/1_fire.vpcf_c b/effect/lava_roshan/1_fire.vpcf_c new file mode 100755 index 0000000..5858210 Binary files /dev/null and b/effect/lava_roshan/1_fire.vpcf_c differ diff --git a/effect/lava_roshan/1_ground.vpcf_c b/effect/lava_roshan/1_ground.vpcf_c new file mode 100755 index 0000000..b7def35 Binary files /dev/null and b/effect/lava_roshan/1_ground.vpcf_c differ diff --git a/effect/lava_roshan/1_halo.vpcf_c b/effect/lava_roshan/1_halo.vpcf_c new file mode 100755 index 0000000..6bfdbcc Binary files /dev/null and b/effect/lava_roshan/1_halo.vpcf_c differ diff --git a/effect/lava_roshan/1_steam.vpcf_c b/effect/lava_roshan/1_steam.vpcf_c new file mode 100755 index 0000000..e64b20e Binary files /dev/null and b/effect/lava_roshan/1_steam.vpcf_c differ diff --git a/effect/lianhua/lianhua.vpcf_c b/effect/lianhua/lianhua.vpcf_c new file mode 100755 index 0000000..6b15af5 Binary files /dev/null and b/effect/lianhua/lianhua.vpcf_c differ diff --git a/effect/lianhua/lianhua_b.vpcf_c b/effect/lianhua/lianhua_b.vpcf_c new file mode 100755 index 0000000..98285e0 Binary files /dev/null and b/effect/lianhua/lianhua_b.vpcf_c differ diff --git a/effect/liansai_dog/1.vpcf_c b/effect/liansai_dog/1.vpcf_c new file mode 100755 index 0000000..0ca4a23 Binary files /dev/null and b/effect/liansai_dog/1.vpcf_c differ diff --git a/effect/liansai_dog/1_a.vpcf_c b/effect/liansai_dog/1_a.vpcf_c new file mode 100755 index 0000000..65b0d7a Binary files /dev/null and b/effect/liansai_dog/1_a.vpcf_c differ diff --git a/effect/liansai_dog/1_base.vpcf_c b/effect/liansai_dog/1_base.vpcf_c new file mode 100755 index 0000000..b5a7453 Binary files /dev/null and b/effect/liansai_dog/1_base.vpcf_c differ diff --git a/effect/liansai_dog/1_base_b.vpcf_c b/effect/liansai_dog/1_base_b.vpcf_c new file mode 100755 index 0000000..a06911c Binary files /dev/null and b/effect/liansai_dog/1_base_b.vpcf_c differ diff --git a/effect/liansai_dog/1_body_flash.vpcf_c b/effect/liansai_dog/1_body_flash.vpcf_c new file mode 100755 index 0000000..92b54d2 Binary files /dev/null and b/effect/liansai_dog/1_body_flash.vpcf_c differ diff --git a/effect/liansai_dog/1_body_glow.vpcf_c b/effect/liansai_dog/1_body_glow.vpcf_c new file mode 100755 index 0000000..1d29567 Binary files /dev/null and b/effect/liansai_dog/1_body_glow.vpcf_c differ diff --git a/effect/liansai_dog/1_body_sparkle.vpcf_c b/effect/liansai_dog/1_body_sparkle.vpcf_c new file mode 100755 index 0000000..defa8b6 Binary files /dev/null and b/effect/liansai_dog/1_body_sparkle.vpcf_c differ diff --git a/effect/liansai_dog/1_buff.vpcf_c b/effect/liansai_dog/1_buff.vpcf_c new file mode 100755 index 0000000..a89fddd Binary files /dev/null and b/effect/liansai_dog/1_buff.vpcf_c differ diff --git a/effect/liansai_dog/1_buff_elec.vpcf_c b/effect/liansai_dog/1_buff_elec.vpcf_c new file mode 100755 index 0000000..0a990c8 Binary files /dev/null and b/effect/liansai_dog/1_buff_elec.vpcf_c differ diff --git a/effect/liansai_dog/1_ember.vpcf_c b/effect/liansai_dog/1_ember.vpcf_c new file mode 100755 index 0000000..714c14a Binary files /dev/null and b/effect/liansai_dog/1_ember.vpcf_c differ diff --git a/effect/liansai_dog/1_halo_body.vpcf_c b/effect/liansai_dog/1_halo_body.vpcf_c new file mode 100755 index 0000000..53574cc Binary files /dev/null and b/effect/liansai_dog/1_halo_body.vpcf_c differ diff --git a/effect/liansai_dog/1_hands.vpcf_c b/effect/liansai_dog/1_hands.vpcf_c new file mode 100755 index 0000000..105b040 Binary files /dev/null and b/effect/liansai_dog/1_hands.vpcf_c differ diff --git a/effect/liansai_dog/1_hands_arc.vpcf_c b/effect/liansai_dog/1_hands_arc.vpcf_c new file mode 100755 index 0000000..24d4420 Binary files /dev/null and b/effect/liansai_dog/1_hands_arc.vpcf_c differ diff --git a/effect/liansai_dog/1_hands_arc_head.vpcf_c b/effect/liansai_dog/1_hands_arc_head.vpcf_c new file mode 100755 index 0000000..22dcbc9 Binary files /dev/null and b/effect/liansai_dog/1_hands_arc_head.vpcf_c differ diff --git a/effect/liansai_dog/1_hands_arc_pnt.vpcf_c b/effect/liansai_dog/1_hands_arc_pnt.vpcf_c new file mode 100755 index 0000000..15b8f77 Binary files /dev/null and b/effect/liansai_dog/1_hands_arc_pnt.vpcf_c differ diff --git a/effect/liansai_dog/1_hands_glow.vpcf_c b/effect/liansai_dog/1_hands_glow.vpcf_c new file mode 100755 index 0000000..d554054 Binary files /dev/null and b/effect/liansai_dog/1_hands_glow.vpcf_c differ diff --git a/effect/liansai_dog/1_light.vpcf_c b/effect/liansai_dog/1_light.vpcf_c new file mode 100755 index 0000000..cddbf63 Binary files /dev/null and b/effect/liansai_dog/1_light.vpcf_c differ diff --git a/effect/liansai_dog/1_magic.vpcf_c b/effect/liansai_dog/1_magic.vpcf_c new file mode 100755 index 0000000..fdaca5c Binary files /dev/null and b/effect/liansai_dog/1_magic.vpcf_c differ diff --git a/effect/liansai_dog/1_magic_burst.vpcf_c b/effect/liansai_dog/1_magic_burst.vpcf_c new file mode 100755 index 0000000..6804777 Binary files /dev/null and b/effect/liansai_dog/1_magic_burst.vpcf_c differ diff --git a/effect/liansai_dog/1_regen.vpcf_c b/effect/liansai_dog/1_regen.vpcf_c new file mode 100755 index 0000000..0b9a106 Binary files /dev/null and b/effect/liansai_dog/1_regen.vpcf_c differ diff --git a/effect/liansai_dog/1_ribbon.vpcf_c b/effect/liansai_dog/1_ribbon.vpcf_c new file mode 100755 index 0000000..b6a2251 Binary files /dev/null and b/effect/liansai_dog/1_ribbon.vpcf_c differ diff --git a/effect/liansai_dog/1_ribbon_glow.vpcf_c b/effect/liansai_dog/1_ribbon_glow.vpcf_c new file mode 100755 index 0000000..bd2f217 Binary files /dev/null and b/effect/liansai_dog/1_ribbon_glow.vpcf_c differ diff --git a/effect/liansai_dog/1_ribbon_glow_rev.vpcf_c b/effect/liansai_dog/1_ribbon_glow_rev.vpcf_c new file mode 100755 index 0000000..0b9cbc9 Binary files /dev/null and b/effect/liansai_dog/1_ribbon_glow_rev.vpcf_c differ diff --git a/effect/liansai_dog/1_ring.vpcf_c b/effect/liansai_dog/1_ring.vpcf_c new file mode 100755 index 0000000..c6cfe84 Binary files /dev/null and b/effect/liansai_dog/1_ring.vpcf_c differ diff --git a/effect/liansai_dog/1_sphere.vpcf_c b/effect/liansai_dog/1_sphere.vpcf_c new file mode 100755 index 0000000..a1d3646 Binary files /dev/null and b/effect/liansai_dog/1_sphere.vpcf_c differ diff --git a/effect/liansai_dog/1_sphere_b.vpcf_c b/effect/liansai_dog/1_sphere_b.vpcf_c new file mode 100755 index 0000000..60a7f3d Binary files /dev/null and b/effect/liansai_dog/1_sphere_b.vpcf_c differ diff --git a/effect/liansai_dog/1_sphere_edge.vpcf_c b/effect/liansai_dog/1_sphere_edge.vpcf_c new file mode 100755 index 0000000..eebf70a Binary files /dev/null and b/effect/liansai_dog/1_sphere_edge.vpcf_c differ diff --git a/effect/liansai_dog/1_streamers_l.vpcf_c b/effect/liansai_dog/1_streamers_l.vpcf_c new file mode 100755 index 0000000..4c604ee Binary files /dev/null and b/effect/liansai_dog/1_streamers_l.vpcf_c differ diff --git a/effect/liansai_dog/1_streamers_l_b.vpcf_c b/effect/liansai_dog/1_streamers_l_b.vpcf_c new file mode 100755 index 0000000..25fcea0 Binary files /dev/null and b/effect/liansai_dog/1_streamers_l_b.vpcf_c differ diff --git a/effect/liansai_dog/1_streamers_r.vpcf_c b/effect/liansai_dog/1_streamers_r.vpcf_c new file mode 100755 index 0000000..861b8da Binary files /dev/null and b/effect/liansai_dog/1_streamers_r.vpcf_c differ diff --git a/effect/liansai_dog/1_streamers_r_b.vpcf_c b/effect/liansai_dog/1_streamers_r_b.vpcf_c new file mode 100755 index 0000000..d750844 Binary files /dev/null and b/effect/liansai_dog/1_streamers_r_b.vpcf_c differ diff --git a/effect/liansai_dog2/1.vpcf_c b/effect/liansai_dog2/1.vpcf_c new file mode 100755 index 0000000..613ffd6 Binary files /dev/null and b/effect/liansai_dog2/1.vpcf_c differ diff --git a/effect/liansai_dog2/1_a.vpcf_c b/effect/liansai_dog2/1_a.vpcf_c new file mode 100755 index 0000000..5a133a0 Binary files /dev/null and b/effect/liansai_dog2/1_a.vpcf_c differ diff --git a/effect/liansai_dog2/1_base.vpcf_c b/effect/liansai_dog2/1_base.vpcf_c new file mode 100755 index 0000000..2d1094a Binary files /dev/null and b/effect/liansai_dog2/1_base.vpcf_c differ diff --git a/effect/liansai_dog2/1_base_b.vpcf_c b/effect/liansai_dog2/1_base_b.vpcf_c new file mode 100755 index 0000000..da7c7b5 Binary files /dev/null and b/effect/liansai_dog2/1_base_b.vpcf_c differ diff --git a/effect/liansai_dog2/1_body_flash.vpcf_c b/effect/liansai_dog2/1_body_flash.vpcf_c new file mode 100755 index 0000000..94cf4c1 Binary files /dev/null and b/effect/liansai_dog2/1_body_flash.vpcf_c differ diff --git a/effect/liansai_dog2/1_body_glow.vpcf_c b/effect/liansai_dog2/1_body_glow.vpcf_c new file mode 100755 index 0000000..3a7d889 Binary files /dev/null and b/effect/liansai_dog2/1_body_glow.vpcf_c differ diff --git a/effect/liansai_dog2/1_body_sparkle.vpcf_c b/effect/liansai_dog2/1_body_sparkle.vpcf_c new file mode 100755 index 0000000..0e13482 Binary files /dev/null and b/effect/liansai_dog2/1_body_sparkle.vpcf_c differ diff --git a/effect/liansai_dog2/1_buff.vpcf_c b/effect/liansai_dog2/1_buff.vpcf_c new file mode 100755 index 0000000..8b7084e Binary files /dev/null and b/effect/liansai_dog2/1_buff.vpcf_c differ diff --git a/effect/liansai_dog2/1_buff_elec.vpcf_c b/effect/liansai_dog2/1_buff_elec.vpcf_c new file mode 100755 index 0000000..f1dabea Binary files /dev/null and b/effect/liansai_dog2/1_buff_elec.vpcf_c differ diff --git a/effect/liansai_dog2/1_ember.vpcf_c b/effect/liansai_dog2/1_ember.vpcf_c new file mode 100755 index 0000000..111ad7f Binary files /dev/null and b/effect/liansai_dog2/1_ember.vpcf_c differ diff --git a/effect/liansai_dog2/1_halo_body.vpcf_c b/effect/liansai_dog2/1_halo_body.vpcf_c new file mode 100755 index 0000000..b013270 Binary files /dev/null and b/effect/liansai_dog2/1_halo_body.vpcf_c differ diff --git a/effect/liansai_dog2/1_hands.vpcf_c b/effect/liansai_dog2/1_hands.vpcf_c new file mode 100755 index 0000000..5d2b426 Binary files /dev/null and b/effect/liansai_dog2/1_hands.vpcf_c differ diff --git a/effect/liansai_dog2/1_hands_arc.vpcf_c b/effect/liansai_dog2/1_hands_arc.vpcf_c new file mode 100755 index 0000000..d8ba4d1 Binary files /dev/null and b/effect/liansai_dog2/1_hands_arc.vpcf_c differ diff --git a/effect/liansai_dog2/1_hands_arc_head.vpcf_c b/effect/liansai_dog2/1_hands_arc_head.vpcf_c new file mode 100755 index 0000000..70ec705 Binary files /dev/null and b/effect/liansai_dog2/1_hands_arc_head.vpcf_c differ diff --git a/effect/liansai_dog2/1_hands_arc_pnt.vpcf_c b/effect/liansai_dog2/1_hands_arc_pnt.vpcf_c new file mode 100755 index 0000000..d0eef50 Binary files /dev/null and b/effect/liansai_dog2/1_hands_arc_pnt.vpcf_c differ diff --git a/effect/liansai_dog2/1_hands_glow.vpcf_c b/effect/liansai_dog2/1_hands_glow.vpcf_c new file mode 100755 index 0000000..a39bd21 Binary files /dev/null and b/effect/liansai_dog2/1_hands_glow.vpcf_c differ diff --git a/effect/liansai_dog2/1_light.vpcf_c b/effect/liansai_dog2/1_light.vpcf_c new file mode 100755 index 0000000..7a506a8 Binary files /dev/null and b/effect/liansai_dog2/1_light.vpcf_c differ diff --git a/effect/liansai_dog2/1_magic.vpcf_c b/effect/liansai_dog2/1_magic.vpcf_c new file mode 100755 index 0000000..1c208dd Binary files /dev/null and b/effect/liansai_dog2/1_magic.vpcf_c differ diff --git a/effect/liansai_dog2/1_magic_burst.vpcf_c b/effect/liansai_dog2/1_magic_burst.vpcf_c new file mode 100755 index 0000000..04a5efb Binary files /dev/null and b/effect/liansai_dog2/1_magic_burst.vpcf_c differ diff --git a/effect/liansai_dog2/1_regen.vpcf_c b/effect/liansai_dog2/1_regen.vpcf_c new file mode 100755 index 0000000..1f1e17a Binary files /dev/null and b/effect/liansai_dog2/1_regen.vpcf_c differ diff --git a/effect/liansai_dog2/1_ribbon.vpcf_c b/effect/liansai_dog2/1_ribbon.vpcf_c new file mode 100755 index 0000000..f67137d Binary files /dev/null and b/effect/liansai_dog2/1_ribbon.vpcf_c differ diff --git a/effect/liansai_dog2/1_ribbon_glow.vpcf_c b/effect/liansai_dog2/1_ribbon_glow.vpcf_c new file mode 100755 index 0000000..18fd009 Binary files /dev/null and b/effect/liansai_dog2/1_ribbon_glow.vpcf_c differ diff --git a/effect/liansai_dog2/1_ribbon_glow_rev.vpcf_c b/effect/liansai_dog2/1_ribbon_glow_rev.vpcf_c new file mode 100755 index 0000000..0c3002d Binary files /dev/null and b/effect/liansai_dog2/1_ribbon_glow_rev.vpcf_c differ diff --git a/effect/liansai_dog2/1_ring.vpcf_c b/effect/liansai_dog2/1_ring.vpcf_c new file mode 100755 index 0000000..468798c Binary files /dev/null and b/effect/liansai_dog2/1_ring.vpcf_c differ diff --git a/effect/liansai_dog2/1_sphere.vpcf_c b/effect/liansai_dog2/1_sphere.vpcf_c new file mode 100755 index 0000000..a4194fb Binary files /dev/null and b/effect/liansai_dog2/1_sphere.vpcf_c differ diff --git a/effect/liansai_dog2/1_sphere_b.vpcf_c b/effect/liansai_dog2/1_sphere_b.vpcf_c new file mode 100755 index 0000000..2545ec7 Binary files /dev/null and b/effect/liansai_dog2/1_sphere_b.vpcf_c differ diff --git a/effect/liansai_dog2/1_sphere_edge.vpcf_c b/effect/liansai_dog2/1_sphere_edge.vpcf_c new file mode 100755 index 0000000..02b9a89 Binary files /dev/null and b/effect/liansai_dog2/1_sphere_edge.vpcf_c differ diff --git a/effect/liansai_dog2/1_streamers_l.vpcf_c b/effect/liansai_dog2/1_streamers_l.vpcf_c new file mode 100755 index 0000000..9ef40d3 Binary files /dev/null and b/effect/liansai_dog2/1_streamers_l.vpcf_c differ diff --git a/effect/liansai_dog2/1_streamers_l_b.vpcf_c b/effect/liansai_dog2/1_streamers_l_b.vpcf_c new file mode 100755 index 0000000..06e90ad Binary files /dev/null and b/effect/liansai_dog2/1_streamers_l_b.vpcf_c differ diff --git a/effect/liansai_dog2/1_streamers_r.vpcf_c b/effect/liansai_dog2/1_streamers_r.vpcf_c new file mode 100755 index 0000000..ec79028 Binary files /dev/null and b/effect/liansai_dog2/1_streamers_r.vpcf_c differ diff --git a/effect/liansai_dog2/1_streamers_r_b.vpcf_c b/effect/liansai_dog2/1_streamers_r_b.vpcf_c new file mode 100755 index 0000000..c66c3be Binary files /dev/null and b/effect/liansai_dog2/1_streamers_r_b.vpcf_c differ diff --git a/effect/lieren/1.vpcf_c b/effect/lieren/1.vpcf_c new file mode 100755 index 0000000..e44f648 Binary files /dev/null and b/effect/lieren/1.vpcf_c differ diff --git a/effect/lieren/1_b.vpcf_c b/effect/lieren/1_b.vpcf_c new file mode 100755 index 0000000..45372f5 Binary files /dev/null and b/effect/lieren/1_b.vpcf_c differ diff --git a/effect/lieren/1_c.vpcf_c b/effect/lieren/1_c.vpcf_c new file mode 100755 index 0000000..8a4d43a Binary files /dev/null and b/effect/lieren/1_c.vpcf_c differ diff --git a/effect/lieren/1huriken_glow.vpcf_c b/effect/lieren/1huriken_glow.vpcf_c new file mode 100755 index 0000000..5ea8b13 Binary files /dev/null and b/effect/lieren/1huriken_glow.vpcf_c differ diff --git a/effect/lieren/1huriken_glow_add.vpcf_c b/effect/lieren/1huriken_glow_add.vpcf_c new file mode 100755 index 0000000..019d818 Binary files /dev/null and b/effect/lieren/1huriken_glow_add.vpcf_c differ diff --git a/effect/lieren/1huriken_glow_gb.vpcf_c b/effect/lieren/1huriken_glow_gb.vpcf_c new file mode 100755 index 0000000..6c4f254 Binary files /dev/null and b/effect/lieren/1huriken_glow_gb.vpcf_c differ diff --git a/effect/lieren/1huriken_toss_main.vpcf_c b/effect/lieren/1huriken_toss_main.vpcf_c new file mode 100755 index 0000000..55e1af1 Binary files /dev/null and b/effect/lieren/1huriken_toss_main.vpcf_c differ diff --git a/effect/lieren/1huriken_trail.vpcf_c b/effect/lieren/1huriken_trail.vpcf_c new file mode 100755 index 0000000..2a73ba0 Binary files /dev/null and b/effect/lieren/1huriken_trail.vpcf_c differ diff --git a/effect/lieren/1uriken_impact.vpcf_c b/effect/lieren/1uriken_impact.vpcf_c new file mode 100755 index 0000000..d4a2fbf Binary files /dev/null and b/effect/lieren/1uriken_impact.vpcf_c differ diff --git a/effect/lieren/1uriken_impact_flash.vpcf_c b/effect/lieren/1uriken_impact_flash.vpcf_c new file mode 100755 index 0000000..ebaf371 Binary files /dev/null and b/effect/lieren/1uriken_impact_flash.vpcf_c differ diff --git a/effect/lieren/1uriken_impact_flashb.vpcf_c b/effect/lieren/1uriken_impact_flashb.vpcf_c new file mode 100755 index 0000000..82a6f1a Binary files /dev/null and b/effect/lieren/1uriken_impact_flashb.vpcf_c differ diff --git a/effect/lieren/1uriken_impact_sparks.vpcf_c b/effect/lieren/1uriken_impact_sparks.vpcf_c new file mode 100755 index 0000000..98882cc Binary files /dev/null and b/effect/lieren/1uriken_impact_sparks.vpcf_c differ diff --git a/effect/lieren/1uriken_toss.vpcf_c b/effect/lieren/1uriken_toss.vpcf_c new file mode 100755 index 0000000..ae8ed46 Binary files /dev/null and b/effect/lieren/1uriken_toss.vpcf_c differ diff --git a/effect/lieren/1uriken_toss_traila.vpcf_c b/effect/lieren/1uriken_toss_traila.vpcf_c new file mode 100755 index 0000000..9a0c462 Binary files /dev/null and b/effect/lieren/1uriken_toss_traila.vpcf_c differ diff --git a/effect/lieren/1uriken_toss_trailb.vpcf_c b/effect/lieren/1uriken_toss_trailb.vpcf_c new file mode 100755 index 0000000..3c231d4 Binary files /dev/null and b/effect/lieren/1uriken_toss_trailb.vpcf_c differ diff --git a/effect/longxin/1.vpcf_c b/effect/longxin/1.vpcf_c new file mode 100755 index 0000000..e82f5d1 Binary files /dev/null and b/effect/longxin/1.vpcf_c differ diff --git a/effect/longxin/1_disk.vpcf_c b/effect/longxin/1_disk.vpcf_c new file mode 100755 index 0000000..03ecc87 Binary files /dev/null and b/effect/longxin/1_disk.vpcf_c differ diff --git a/effect/longxin/1_dragon.vpcf_c b/effect/longxin/1_dragon.vpcf_c new file mode 100755 index 0000000..0c0cc27 Binary files /dev/null and b/effect/longxin/1_dragon.vpcf_c differ diff --git a/effect/longxin/1_dragon_trail.vpcf_c b/effect/longxin/1_dragon_trail.vpcf_c new file mode 100755 index 0000000..f86a23c Binary files /dev/null and b/effect/longxin/1_dragon_trail.vpcf_c differ diff --git a/effect/longxin/1_dragon_trail_detail.vpcf_c b/effect/longxin/1_dragon_trail_detail.vpcf_c new file mode 100755 index 0000000..02d6cd0 Binary files /dev/null and b/effect/longxin/1_dragon_trail_detail.vpcf_c differ diff --git a/effect/longxin/1_dragon_trail_embers.vpcf_c b/effect/longxin/1_dragon_trail_embers.vpcf_c new file mode 100755 index 0000000..df0f24f Binary files /dev/null and b/effect/longxin/1_dragon_trail_embers.vpcf_c differ diff --git a/effect/mars/1/e.vpcf_c b/effect/mars/1/e.vpcf_c new file mode 100755 index 0000000..7897a23 Binary files /dev/null and b/effect/mars/1/e.vpcf_c differ diff --git a/effect/mars/1/e_smoke.vpcf_c b/effect/mars/1/e_smoke.vpcf_c new file mode 100755 index 0000000..fb19b74 Binary files /dev/null and b/effect/mars/1/e_smoke.vpcf_c differ diff --git a/effect/mars/1/e_sparkles.vpcf_c b/effect/mars/1/e_sparkles.vpcf_c new file mode 100755 index 0000000..fd26cca Binary files /dev/null and b/effect/mars/1/e_sparkles.vpcf_c differ diff --git a/effect/mars/2/e.vpcf_c b/effect/mars/2/e.vpcf_c new file mode 100755 index 0000000..224f8d0 Binary files /dev/null and b/effect/mars/2/e.vpcf_c differ diff --git a/effect/mars/2/e_smoke.vpcf_c b/effect/mars/2/e_smoke.vpcf_c new file mode 100755 index 0000000..dfe6183 Binary files /dev/null and b/effect/mars/2/e_smoke.vpcf_c differ diff --git a/effect/mars/2/e_sparkles.vpcf_c b/effect/mars/2/e_sparkles.vpcf_c new file mode 100755 index 0000000..cbb0b82 Binary files /dev/null and b/effect/mars/2/e_sparkles.vpcf_c differ diff --git a/effect/merge/prime/hero_spawn_hero_level_4_center.vpcf_c b/effect/merge/prime/hero_spawn_hero_level_4_center.vpcf_c new file mode 100755 index 0000000..670d0c2 Binary files /dev/null and b/effect/merge/prime/hero_spawn_hero_level_4_center.vpcf_c differ diff --git a/effect/merge/prime/hero_spawn_hero_level_4_elec.vpcf_c b/effect/merge/prime/hero_spawn_hero_level_4_elec.vpcf_c new file mode 100755 index 0000000..53d1afb Binary files /dev/null and b/effect/merge/prime/hero_spawn_hero_level_4_elec.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_badge_glow.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_badge_glow.vpcf_c new file mode 100755 index 0000000..8202628 Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_badge_glow.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_bg_glow.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_bg_glow.vpcf_c new file mode 100755 index 0000000..cb84481 Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_bg_glow.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_center.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_center.vpcf_c new file mode 100755 index 0000000..d535f5a Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_center.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_core.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_core.vpcf_c new file mode 100755 index 0000000..fdd3dca Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_core.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_embers.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_embers.vpcf_c new file mode 100755 index 0000000..322c458 Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_embers.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_icon_ambient.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_icon_ambient.vpcf_c new file mode 100755 index 0000000..90b898e Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_icon_ambient.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_icon_ambient_anim.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_icon_ambient_anim.vpcf_c new file mode 100755 index 0000000..caf7d3d Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_icon_ambient_anim.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_icon_ambient_glow.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_icon_ambient_glow.vpcf_c new file mode 100755 index 0000000..3137f1e Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_icon_ambient_glow.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_icon_ambient_light.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_icon_ambient_light.vpcf_c new file mode 100755 index 0000000..7247759 Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_icon_ambient_light.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_icon_ambient_rays.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_icon_ambient_rays.vpcf_c new file mode 100755 index 0000000..e3c8b29 Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_icon_ambient_rays.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_magic.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_magic.vpcf_c new file mode 100755 index 0000000..9e559c2 Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_magic.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_model.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_model.vpcf_c new file mode 100755 index 0000000..5e0cb05 Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_model.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_model_static.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_model_static.vpcf_c new file mode 100755 index 0000000..1c8cc14 Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_model_static.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_rays.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_rays.vpcf_c new file mode 100755 index 0000000..df17c84 Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_rays.vpcf_c differ diff --git a/effect/merge/ui/plus/ui_hero_level_4_soft_glow.vpcf_c b/effect/merge/ui/plus/ui_hero_level_4_soft_glow.vpcf_c new file mode 100755 index 0000000..9985f7e Binary files /dev/null and b/effect/merge/ui/plus/ui_hero_level_4_soft_glow.vpcf_c differ diff --git a/effect/music/1.vpcf_c b/effect/music/1.vpcf_c new file mode 100755 index 0000000..934c9e6 Binary files /dev/null and b/effect/music/1.vpcf_c differ diff --git a/effect/music/1_ember.vpcf_c b/effect/music/1_ember.vpcf_c new file mode 100755 index 0000000..6dc2fd6 Binary files /dev/null and b/effect/music/1_ember.vpcf_c differ diff --git a/effect/music/1_ground_frost.vpcf_c b/effect/music/1_ground_frost.vpcf_c new file mode 100755 index 0000000..dbede9c Binary files /dev/null and b/effect/music/1_ground_frost.vpcf_c differ diff --git a/effect/music/1_ground_ice.vpcf_c b/effect/music/1_ground_ice.vpcf_c new file mode 100755 index 0000000..0d90635 Binary files /dev/null and b/effect/music/1_ground_ice.vpcf_c differ diff --git a/effect/nianshou/courier_nian_ambient.vpcf_c b/effect/nianshou/courier_nian_ambient.vpcf_c new file mode 100755 index 0000000..f0af596 Binary files /dev/null and b/effect/nianshou/courier_nian_ambient.vpcf_c differ diff --git a/effect/nianshou/courier_nian_bag.vpcf_c b/effect/nianshou/courier_nian_bag.vpcf_c new file mode 100755 index 0000000..7895a0e Binary files /dev/null and b/effect/nianshou/courier_nian_bag.vpcf_c differ diff --git a/effect/nianshou/courier_nian_bag_coin.vpcf_c b/effect/nianshou/courier_nian_bag_coin.vpcf_c new file mode 100755 index 0000000..a0bdeb5 Binary files /dev/null and b/effect/nianshou/courier_nian_bag_coin.vpcf_c differ diff --git a/effect/nianshou/courier_nian_bag_coin_glint.vpcf_c b/effect/nianshou/courier_nian_bag_coin_glint.vpcf_c new file mode 100755 index 0000000..1cd159f Binary files /dev/null and b/effect/nianshou/courier_nian_bag_coin_glint.vpcf_c differ diff --git a/effect/nianshou/courier_nian_bag_coin_ground.vpcf_c b/effect/nianshou/courier_nian_bag_coin_ground.vpcf_c new file mode 100755 index 0000000..8cfae35 Binary files /dev/null and b/effect/nianshou/courier_nian_bag_coin_ground.vpcf_c differ diff --git a/effect/nianshou/courier_nian_bag_gold_glint.vpcf_c b/effect/nianshou/courier_nian_bag_gold_glint.vpcf_c new file mode 100755 index 0000000..e6e84d8 Binary files /dev/null and b/effect/nianshou/courier_nian_bag_gold_glint.vpcf_c differ diff --git a/effect/nianshou/courier_nian_bag_gold_twinkle.vpcf_c b/effect/nianshou/courier_nian_bag_gold_twinkle.vpcf_c new file mode 100755 index 0000000..9f1ae9f Binary files /dev/null and b/effect/nianshou/courier_nian_bag_gold_twinkle.vpcf_c differ diff --git a/effect/omniwings/ally.vpcf_c b/effect/omniwings/ally.vpcf_c new file mode 100755 index 0000000..d61cc7a Binary files /dev/null and b/effect/omniwings/ally.vpcf_c differ diff --git a/effect/omniwings/buff_b.vpcf_c b/effect/omniwings/buff_b.vpcf_c new file mode 100755 index 0000000..5517741 Binary files /dev/null and b/effect/omniwings/buff_b.vpcf_c differ diff --git a/effect/omniwings/buff_d.vpcf_c b/effect/omniwings/buff_d.vpcf_c new file mode 100755 index 0000000..3bbdeb8 Binary files /dev/null and b/effect/omniwings/buff_d.vpcf_c differ diff --git a/effect/omniwings/buff_e.vpcf_c b/effect/omniwings/buff_e.vpcf_c new file mode 100755 index 0000000..b4a6a6b Binary files /dev/null and b/effect/omniwings/buff_e.vpcf_c differ diff --git a/effect/omniwings/buff_f.vpcf_c b/effect/omniwings/buff_f.vpcf_c new file mode 100755 index 0000000..029d0c9 Binary files /dev/null and b/effect/omniwings/buff_f.vpcf_c differ diff --git a/effect/omniwings/buff_h.vpcf_c b/effect/omniwings/buff_h.vpcf_c new file mode 100755 index 0000000..d5d8b45 Binary files /dev/null and b/effect/omniwings/buff_h.vpcf_c differ diff --git a/effect/omniwings/buff_i.vpcf_c b/effect/omniwings/buff_i.vpcf_c new file mode 100755 index 0000000..cc73b0d Binary files /dev/null and b/effect/omniwings/buff_i.vpcf_c differ diff --git a/effect/omniwings/buff_j.vpcf_c b/effect/omniwings/buff_j.vpcf_c new file mode 100755 index 0000000..b48e9f2 Binary files /dev/null and b/effect/omniwings/buff_j.vpcf_c differ diff --git a/effect/omniwings/buff_k.vpcf_c b/effect/omniwings/buff_k.vpcf_c new file mode 100755 index 0000000..3ea83f0 Binary files /dev/null and b/effect/omniwings/buff_k.vpcf_c differ diff --git a/effect/omniwings/buff_l.vpcf_c b/effect/omniwings/buff_l.vpcf_c new file mode 100755 index 0000000..c82686d Binary files /dev/null and b/effect/omniwings/buff_l.vpcf_c differ diff --git a/effect/omniwings/buff_m.vpcf_c b/effect/omniwings/buff_m.vpcf_c new file mode 100755 index 0000000..149cca1 Binary files /dev/null and b/effect/omniwings/buff_m.vpcf_c differ diff --git a/effect/omniwings/buff_n.vpcf_c b/effect/omniwings/buff_n.vpcf_c new file mode 100755 index 0000000..fb5c4d4 Binary files /dev/null and b/effect/omniwings/buff_n.vpcf_c differ diff --git a/effect/omniwings/buff_start_wings.vpcf_c b/effect/omniwings/buff_start_wings.vpcf_c new file mode 100755 index 0000000..dd9d3e6 Binary files /dev/null and b/effect/omniwings/buff_start_wings.vpcf_c differ diff --git a/effect/omniwings/omni.vpcf_c b/effect/omniwings/omni.vpcf_c new file mode 100755 index 0000000..7ad9135 Binary files /dev/null and b/effect/omniwings/omni.vpcf_c differ diff --git a/effect/omniwings/wings.vpcf_c b/effect/omniwings/wings.vpcf_c new file mode 100755 index 0000000..93e88ee Binary files /dev/null and b/effect/omniwings/wings.vpcf_c differ diff --git a/effect/overhead_arrow/1.vpcf_c b/effect/overhead_arrow/1.vpcf_c new file mode 100755 index 0000000..fa12076 Binary files /dev/null and b/effect/overhead_arrow/1.vpcf_c differ diff --git a/effect/platinum_roshan/ambient.vpcf_c b/effect/platinum_roshan/ambient.vpcf_c new file mode 100755 index 0000000..b3e0696 Binary files /dev/null and b/effect/platinum_roshan/ambient.vpcf_c differ diff --git a/effect/platinum_roshan/ambient_b.vpcf_c b/effect/platinum_roshan/ambient_b.vpcf_c new file mode 100755 index 0000000..aeabd82 Binary files /dev/null and b/effect/platinum_roshan/ambient_b.vpcf_c differ diff --git a/effect/platinum_roshan/ambient_c.vpcf_c b/effect/platinum_roshan/ambient_c.vpcf_c new file mode 100755 index 0000000..82ec136 Binary files /dev/null and b/effect/platinum_roshan/ambient_c.vpcf_c differ diff --git a/effect/platinum_roshan/ambient_d.vpcf_c b/effect/platinum_roshan/ambient_d.vpcf_c new file mode 100755 index 0000000..89bce62 Binary files /dev/null and b/effect/platinum_roshan/ambient_d.vpcf_c differ diff --git a/effect/platinum_roshan/ambient_e.vpcf_c b/effect/platinum_roshan/ambient_e.vpcf_c new file mode 100755 index 0000000..dca25de Binary files /dev/null and b/effect/platinum_roshan/ambient_e.vpcf_c differ diff --git a/effect/platinum_roshan/ambient_f.vpcf_c b/effect/platinum_roshan/ambient_f.vpcf_c new file mode 100755 index 0000000..c7a5b20 Binary files /dev/null and b/effect/platinum_roshan/ambient_f.vpcf_c differ diff --git a/effect/platinum_roshan/eye.vpcf_c b/effect/platinum_roshan/eye.vpcf_c new file mode 100755 index 0000000..76f6829 Binary files /dev/null and b/effect/platinum_roshan/eye.vpcf_c differ diff --git a/effect/platinum_roshan/eyes.vpcf_c b/effect/platinum_roshan/eyes.vpcf_c new file mode 100755 index 0000000..13d2051 Binary files /dev/null and b/effect/platinum_roshan/eyes.vpcf_c differ diff --git a/effect/platinum_roshan/eyes_b.vpcf_c b/effect/platinum_roshan/eyes_b.vpcf_c new file mode 100755 index 0000000..31f4f83 Binary files /dev/null and b/effect/platinum_roshan/eyes_b.vpcf_c differ diff --git a/effect/platinum_roshan/eyes_c.vpcf_c b/effect/platinum_roshan/eyes_c.vpcf_c new file mode 100755 index 0000000..81c0519 Binary files /dev/null and b/effect/platinum_roshan/eyes_c.vpcf_c differ diff --git a/effect/platinum_roshan/eyes_d.vpcf_c b/effect/platinum_roshan/eyes_d.vpcf_c new file mode 100755 index 0000000..6d7652c Binary files /dev/null and b/effect/platinum_roshan/eyes_d.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow.vpcf_c b/effect/pom_arrow_far/arrow.vpcf_c new file mode 100755 index 0000000..5859684 Binary files /dev/null and b/effect/pom_arrow_far/arrow.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow_b.vpcf_c b/effect/pom_arrow_far/arrow_b.vpcf_c new file mode 100755 index 0000000..c38b539 Binary files /dev/null and b/effect/pom_arrow_far/arrow_b.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow_c.vpcf_c b/effect/pom_arrow_far/arrow_c.vpcf_c new file mode 100755 index 0000000..fc92e3c Binary files /dev/null and b/effect/pom_arrow_far/arrow_c.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow_d.vpcf_c b/effect/pom_arrow_far/arrow_d.vpcf_c new file mode 100755 index 0000000..399d71f Binary files /dev/null and b/effect/pom_arrow_far/arrow_d.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow_e.vpcf_c b/effect/pom_arrow_far/arrow_e.vpcf_c new file mode 100755 index 0000000..798ce55 Binary files /dev/null and b/effect/pom_arrow_far/arrow_e.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow_f.vpcf_c b/effect/pom_arrow_far/arrow_f.vpcf_c new file mode 100755 index 0000000..a9027e2 Binary files /dev/null and b/effect/pom_arrow_far/arrow_f.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow_g.vpcf_c b/effect/pom_arrow_far/arrow_g.vpcf_c new file mode 100755 index 0000000..0c39225 Binary files /dev/null and b/effect/pom_arrow_far/arrow_g.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow_i.vpcf_c b/effect/pom_arrow_far/arrow_i.vpcf_c new file mode 100755 index 0000000..2b86e90 Binary files /dev/null and b/effect/pom_arrow_far/arrow_i.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow_j.vpcf_c b/effect/pom_arrow_far/arrow_j.vpcf_c new file mode 100755 index 0000000..17bc993 Binary files /dev/null and b/effect/pom_arrow_far/arrow_j.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow_k.vpcf_c b/effect/pom_arrow_far/arrow_k.vpcf_c new file mode 100755 index 0000000..8009353 Binary files /dev/null and b/effect/pom_arrow_far/arrow_k.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow_l.vpcf_c b/effect/pom_arrow_far/arrow_l.vpcf_c new file mode 100755 index 0000000..546ec47 Binary files /dev/null and b/effect/pom_arrow_far/arrow_l.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow_m.vpcf_c b/effect/pom_arrow_far/arrow_m.vpcf_c new file mode 100755 index 0000000..3d1593c Binary files /dev/null and b/effect/pom_arrow_far/arrow_m.vpcf_c differ diff --git a/effect/pom_arrow_far/arrow_n.vpcf_c b/effect/pom_arrow_far/arrow_n.vpcf_c new file mode 100755 index 0000000..b040e14 Binary files /dev/null and b/effect/pom_arrow_far/arrow_n.vpcf_c differ diff --git a/effect/priest/shield.vpcf_c b/effect/priest/shield.vpcf_c new file mode 100755 index 0000000..2b5f01c Binary files /dev/null and b/effect/priest/shield.vpcf_c differ diff --git a/effect/priest/shield_b.vpcf_c b/effect/priest/shield_b.vpcf_c new file mode 100755 index 0000000..fc7b166 Binary files /dev/null and b/effect/priest/shield_b.vpcf_c differ diff --git a/effect/priest/shield_c.vpcf_c b/effect/priest/shield_c.vpcf_c new file mode 100755 index 0000000..b90801f Binary files /dev/null and b/effect/priest/shield_c.vpcf_c differ diff --git a/effect/priest/shield_cast.vpcf_c b/effect/priest/shield_cast.vpcf_c new file mode 100755 index 0000000..171b3b9 Binary files /dev/null and b/effect/priest/shield_cast.vpcf_c differ diff --git a/effect/priest/shield_d.vpcf_c b/effect/priest/shield_d.vpcf_c new file mode 100755 index 0000000..aa31bdc Binary files /dev/null and b/effect/priest/shield_d.vpcf_c differ diff --git a/effect/priest/shield_e.vpcf_c b/effect/priest/shield_e.vpcf_c new file mode 100755 index 0000000..06882f9 Binary files /dev/null and b/effect/priest/shield_e.vpcf_c differ diff --git a/effect/priest/shield_end.vpcf_c b/effect/priest/shield_end.vpcf_c new file mode 100755 index 0000000..caee520 Binary files /dev/null and b/effect/priest/shield_end.vpcf_c differ diff --git a/effect/priest/shield_end_b.vpcf_c b/effect/priest/shield_end_b.vpcf_c new file mode 100755 index 0000000..76aff35 Binary files /dev/null and b/effect/priest/shield_end_b.vpcf_c differ diff --git a/effect/priest/shield_shell.vpcf_c b/effect/priest/shield_shell.vpcf_c new file mode 100755 index 0000000..3823e84 Binary files /dev/null and b/effect/priest/shield_shell.vpcf_c differ diff --git a/effect/priest/shield_trace1.vpcf_c b/effect/priest/shield_trace1.vpcf_c new file mode 100755 index 0000000..536bf8d Binary files /dev/null and b/effect/priest/shield_trace1.vpcf_c differ diff --git a/effect/priest/shield_trace1_a.vpcf_c b/effect/priest/shield_trace1_a.vpcf_c new file mode 100755 index 0000000..ae11a47 Binary files /dev/null and b/effect/priest/shield_trace1_a.vpcf_c differ diff --git a/effect/priest/shield_trace2.vpcf_c b/effect/priest/shield_trace2.vpcf_c new file mode 100755 index 0000000..90fc5e9 Binary files /dev/null and b/effect/priest/shield_trace2.vpcf_c differ diff --git a/effect/priest/shield_trace3.vpcf_c b/effect/priest/shield_trace3.vpcf_c new file mode 100755 index 0000000..c387488 Binary files /dev/null and b/effect/priest/shield_trace3.vpcf_c differ diff --git a/effect/puck_xuehua/1.vpcf_c b/effect/puck_xuehua/1.vpcf_c new file mode 100755 index 0000000..cad671a Binary files /dev/null and b/effect/puck_xuehua/1.vpcf_c differ diff --git a/effect/puck_xuehua/1_bits.vpcf_c b/effect/puck_xuehua/1_bits.vpcf_c new file mode 100755 index 0000000..568c9e3 Binary files /dev/null and b/effect/puck_xuehua/1_bits.vpcf_c differ diff --git a/effect/puck_xuehua/1_flare.vpcf_c b/effect/puck_xuehua/1_flare.vpcf_c new file mode 100755 index 0000000..4834742 Binary files /dev/null and b/effect/puck_xuehua/1_flare.vpcf_c differ diff --git a/effect/puck_xuehua/1_flare_bot.vpcf_c b/effect/puck_xuehua/1_flare_bot.vpcf_c new file mode 100755 index 0000000..f99f5ab Binary files /dev/null and b/effect/puck_xuehua/1_flare_bot.vpcf_c differ diff --git a/effect/puck_xuehua/1_flare_topl.vpcf_c b/effect/puck_xuehua/1_flare_topl.vpcf_c new file mode 100755 index 0000000..abb8eec Binary files /dev/null and b/effect/puck_xuehua/1_flare_topl.vpcf_c differ diff --git a/effect/puck_xuehua/1_flare_topr.vpcf_c b/effect/puck_xuehua/1_flare_topr.vpcf_c new file mode 100755 index 0000000..2491a47 Binary files /dev/null and b/effect/puck_xuehua/1_flare_topr.vpcf_c differ diff --git a/effect/puck_xuehua/1_glow.vpcf_c b/effect/puck_xuehua/1_glow.vpcf_c new file mode 100755 index 0000000..6c9c68c Binary files /dev/null and b/effect/puck_xuehua/1_glow.vpcf_c differ diff --git a/effect/puck_xuehua/1_glow_soft.vpcf_c b/effect/puck_xuehua/1_glow_soft.vpcf_c new file mode 100755 index 0000000..45899b3 Binary files /dev/null and b/effect/puck_xuehua/1_glow_soft.vpcf_c differ diff --git a/effect/puck_xuehua/1_magic.vpcf_c b/effect/puck_xuehua/1_magic.vpcf_c new file mode 100755 index 0000000..4b1b55d Binary files /dev/null and b/effect/puck_xuehua/1_magic.vpcf_c differ diff --git a/effect/puck_xuehua/1_snow.vpcf_c b/effect/puck_xuehua/1_snow.vpcf_c new file mode 100755 index 0000000..1f0e055 Binary files /dev/null and b/effect/puck_xuehua/1_snow.vpcf_c differ diff --git a/effect/qiangxi/1.vpcf_c b/effect/qiangxi/1.vpcf_c new file mode 100755 index 0000000..2ff829c Binary files /dev/null and b/effect/qiangxi/1.vpcf_c differ diff --git a/effect/qishi/1.vpcf_c b/effect/qishi/1.vpcf_c new file mode 100755 index 0000000..c278fcc Binary files /dev/null and b/effect/qishi/1.vpcf_c differ diff --git a/effect/qishi/1_glow.vpcf_c b/effect/qishi/1_glow.vpcf_c new file mode 100755 index 0000000..e9ad873 Binary files /dev/null and b/effect/qishi/1_glow.vpcf_c differ diff --git a/effect/roshan_ti9/1.vpcf_c b/effect/roshan_ti9/1.vpcf_c new file mode 100755 index 0000000..a8ad84f Binary files /dev/null and b/effect/roshan_ti9/1.vpcf_c differ diff --git a/effect/roshan_ti9/1_bees.vpcf_c b/effect/roshan_ti9/1_bees.vpcf_c new file mode 100755 index 0000000..8e7ee49 Binary files /dev/null and b/effect/roshan_ti9/1_bees.vpcf_c differ diff --git a/effect/roshan_ti9/1_bees_glow.vpcf_c b/effect/roshan_ti9/1_bees_glow.vpcf_c new file mode 100755 index 0000000..6bc9235 Binary files /dev/null and b/effect/roshan_ti9/1_bees_glow.vpcf_c differ diff --git a/effect/roshan_ti9/1_bees_trail.vpcf_c b/effect/roshan_ti9/1_bees_trail.vpcf_c new file mode 100755 index 0000000..87bac5e Binary files /dev/null and b/effect/roshan_ti9/1_bees_trail.vpcf_c differ diff --git a/effect/roshan_ti9/1_eyes.vpcf_c b/effect/roshan_ti9/1_eyes.vpcf_c new file mode 100755 index 0000000..2df1e25 Binary files /dev/null and b/effect/roshan_ti9/1_eyes.vpcf_c differ diff --git a/effect/roshan_ti9/1_eyes_a.vpcf_c b/effect/roshan_ti9/1_eyes_a.vpcf_c new file mode 100755 index 0000000..0347aff Binary files /dev/null and b/effect/roshan_ti9/1_eyes_a.vpcf_c differ diff --git a/effect/roshan_ti9/1_eyes_embers.vpcf_c b/effect/roshan_ti9/1_eyes_embers.vpcf_c new file mode 100755 index 0000000..5705471 Binary files /dev/null and b/effect/roshan_ti9/1_eyes_embers.vpcf_c differ diff --git a/effect/roshan_ti9/1_eyes_glow.vpcf_c b/effect/roshan_ti9/1_eyes_glow.vpcf_c new file mode 100755 index 0000000..1990a4b Binary files /dev/null and b/effect/roshan_ti9/1_eyes_glow.vpcf_c differ diff --git a/effect/roshan_ti9/1_eyes_streak.vpcf_c b/effect/roshan_ti9/1_eyes_streak.vpcf_c new file mode 100755 index 0000000..64c9294 Binary files /dev/null and b/effect/roshan_ti9/1_eyes_streak.vpcf_c differ diff --git a/effect/roshan_ti9/1_flowers.vpcf_c b/effect/roshan_ti9/1_flowers.vpcf_c new file mode 100755 index 0000000..a3eeac3 Binary files /dev/null and b/effect/roshan_ti9/1_flowers.vpcf_c differ diff --git a/effect/roshan_ti9/1_flowers_glow.vpcf_c b/effect/roshan_ti9/1_flowers_glow.vpcf_c new file mode 100755 index 0000000..4b5ca42 Binary files /dev/null and b/effect/roshan_ti9/1_flowers_glow.vpcf_c differ diff --git a/effect/roshan_ti9/1_flowers_petals.vpcf_c b/effect/roshan_ti9/1_flowers_petals.vpcf_c new file mode 100755 index 0000000..f12e993 Binary files /dev/null and b/effect/roshan_ti9/1_flowers_petals.vpcf_c differ diff --git a/effect/roshan_ti9/1_gem.vpcf_c b/effect/roshan_ti9/1_gem.vpcf_c new file mode 100755 index 0000000..382110b Binary files /dev/null and b/effect/roshan_ti9/1_gem.vpcf_c differ diff --git a/effect/roshan_ti9/1_gem_glow.vpcf_c b/effect/roshan_ti9/1_gem_glow.vpcf_c new file mode 100755 index 0000000..b86be3f Binary files /dev/null and b/effect/roshan_ti9/1_gem_glow.vpcf_c differ diff --git a/effect/roshan_ti9/1_glow.vpcf_c b/effect/roshan_ti9/1_glow.vpcf_c new file mode 100755 index 0000000..14ad18b Binary files /dev/null and b/effect/roshan_ti9/1_glow.vpcf_c differ diff --git a/effect/roshan_ti9/1_honey.vpcf_c b/effect/roshan_ti9/1_honey.vpcf_c new file mode 100755 index 0000000..db98c75 Binary files /dev/null and b/effect/roshan_ti9/1_honey.vpcf_c differ diff --git a/effect/roshan_ti9/1_honey_drip.vpcf_c b/effect/roshan_ti9/1_honey_drip.vpcf_c new file mode 100755 index 0000000..8b35771 Binary files /dev/null and b/effect/roshan_ti9/1_honey_drip.vpcf_c differ diff --git a/effect/roshan_ti9/1_honey_drop.vpcf_c b/effect/roshan_ti9/1_honey_drop.vpcf_c new file mode 100755 index 0000000..d535525 Binary files /dev/null and b/effect/roshan_ti9/1_honey_drop.vpcf_c differ diff --git a/effect/roshan_ti9/1_honey_drop_bounce.vpcf_c b/effect/roshan_ti9/1_honey_drop_bounce.vpcf_c new file mode 100755 index 0000000..1c42a7d Binary files /dev/null and b/effect/roshan_ti9/1_honey_drop_bounce.vpcf_c differ diff --git a/effect/roshan_ti9/1_honey_drop_ground.vpcf_c b/effect/roshan_ti9/1_honey_drop_ground.vpcf_c new file mode 100755 index 0000000..1097a39 Binary files /dev/null and b/effect/roshan_ti9/1_honey_drop_ground.vpcf_c differ diff --git a/effect/roshan_ti9/1_honeypot.vpcf_c b/effect/roshan_ti9/1_honeypot.vpcf_c new file mode 100755 index 0000000..a896399 Binary files /dev/null and b/effect/roshan_ti9/1_honeypot.vpcf_c differ diff --git a/effect/sand_roshan/baby_roshan_desert_sands_ambient.vpcf_c b/effect/sand_roshan/baby_roshan_desert_sands_ambient.vpcf_c new file mode 100755 index 0000000..6a47ae3 Binary files /dev/null and b/effect/sand_roshan/baby_roshan_desert_sands_ambient.vpcf_c differ diff --git a/effect/sand_roshan/baby_roshan_desert_sands_ambient_a.vpcf_c b/effect/sand_roshan/baby_roshan_desert_sands_ambient_a.vpcf_c new file mode 100755 index 0000000..cb18e93 Binary files /dev/null and b/effect/sand_roshan/baby_roshan_desert_sands_ambient_a.vpcf_c differ diff --git a/effect/sand_roshan/baby_roshan_desert_sands_ambient_b.vpcf_c b/effect/sand_roshan/baby_roshan_desert_sands_ambient_b.vpcf_c new file mode 100755 index 0000000..4fb34b1 Binary files /dev/null and b/effect/sand_roshan/baby_roshan_desert_sands_ambient_b.vpcf_c differ diff --git a/effect/sand_roshan/baby_roshan_desert_sands_ambient_b_trail.vpcf_c b/effect/sand_roshan/baby_roshan_desert_sands_ambient_b_trail.vpcf_c new file mode 100755 index 0000000..e57f8ff Binary files /dev/null and b/effect/sand_roshan/baby_roshan_desert_sands_ambient_b_trail.vpcf_c differ diff --git a/effect/sand_roshan/baby_roshan_desert_sands_ambient_c.vpcf_c b/effect/sand_roshan/baby_roshan_desert_sands_ambient_c.vpcf_c new file mode 100755 index 0000000..5c18cb1 Binary files /dev/null and b/effect/sand_roshan/baby_roshan_desert_sands_ambient_c.vpcf_c differ diff --git a/effect/sand_roshan/baby_roshan_desert_sands_ambient_c_trail.vpcf_c b/effect/sand_roshan/baby_roshan_desert_sands_ambient_c_trail.vpcf_c new file mode 100755 index 0000000..b9f88af Binary files /dev/null and b/effect/sand_roshan/baby_roshan_desert_sands_ambient_c_trail.vpcf_c differ diff --git a/effect/sand_roshan/baby_roshan_desert_sands_ambient_d.vpcf_c b/effect/sand_roshan/baby_roshan_desert_sands_ambient_d.vpcf_c new file mode 100755 index 0000000..b251a44 Binary files /dev/null and b/effect/sand_roshan/baby_roshan_desert_sands_ambient_d.vpcf_c differ diff --git a/effect/sand_roshan/baby_roshan_desert_sands_ambient_sand_trail.vpcf_c b/effect/sand_roshan/baby_roshan_desert_sands_ambient_sand_trail.vpcf_c new file mode 100755 index 0000000..338616f Binary files /dev/null and b/effect/sand_roshan/baby_roshan_desert_sands_ambient_sand_trail.vpcf_c differ diff --git a/effect/sand_roshan/baby_roshan_desert_sands_ambient_wings_a.vpcf_c b/effect/sand_roshan/baby_roshan_desert_sands_ambient_wings_a.vpcf_c new file mode 100755 index 0000000..fc4e17d Binary files /dev/null and b/effect/sand_roshan/baby_roshan_desert_sands_ambient_wings_a.vpcf_c differ diff --git a/effect/sand_roshan/baby_roshan_desert_sands_rocks_model.vpcf_c b/effect/sand_roshan/baby_roshan_desert_sands_rocks_model.vpcf_c new file mode 100755 index 0000000..d7853fb Binary files /dev/null and b/effect/sand_roshan/baby_roshan_desert_sands_rocks_model.vpcf_c differ diff --git a/effect/sand_roshan/courier_roshan_desert_sands_eyes.vpcf_c b/effect/sand_roshan/courier_roshan_desert_sands_eyes.vpcf_c new file mode 100755 index 0000000..cd3b388 Binary files /dev/null and b/effect/sand_roshan/courier_roshan_desert_sands_eyes.vpcf_c differ diff --git a/effect/sand_roshan/courier_roshan_desert_sands_eyes_a.vpcf_c b/effect/sand_roshan/courier_roshan_desert_sands_eyes_a.vpcf_c new file mode 100755 index 0000000..b143868 Binary files /dev/null and b/effect/sand_roshan/courier_roshan_desert_sands_eyes_a.vpcf_c differ diff --git a/effect/sand_roshan/courier_roshan_desert_sands_eyes_b.vpcf_c b/effect/sand_roshan/courier_roshan_desert_sands_eyes_b.vpcf_c new file mode 100755 index 0000000..8001fcd Binary files /dev/null and b/effect/sand_roshan/courier_roshan_desert_sands_eyes_b.vpcf_c differ diff --git a/effect/sand_roshan/courier_roshan_desert_sands_eyes_embers.vpcf_c b/effect/sand_roshan/courier_roshan_desert_sands_eyes_embers.vpcf_c new file mode 100755 index 0000000..29a1ec2 Binary files /dev/null and b/effect/sand_roshan/courier_roshan_desert_sands_eyes_embers.vpcf_c differ diff --git a/effect/sand_roshan/courier_roshan_desert_sands_eyes_embers_b.vpcf_c b/effect/sand_roshan/courier_roshan_desert_sands_eyes_embers_b.vpcf_c new file mode 100755 index 0000000..7bbdd7d Binary files /dev/null and b/effect/sand_roshan/courier_roshan_desert_sands_eyes_embers_b.vpcf_c differ diff --git a/effect/satyr/riki_loadout.vpcf_c b/effect/satyr/riki_loadout.vpcf_c new file mode 100755 index 0000000..a7c5f49 Binary files /dev/null and b/effect/satyr/riki_loadout.vpcf_c differ diff --git a/effect/satyr/riki_smokebomb.vpcf_c b/effect/satyr/riki_smokebomb.vpcf_c new file mode 100755 index 0000000..00a55f6 Binary files /dev/null and b/effect/satyr/riki_smokebomb.vpcf_c differ diff --git a/effect/satyr/riki_smokebomb_b.vpcf_c b/effect/satyr/riki_smokebomb_b.vpcf_c new file mode 100755 index 0000000..956c478 Binary files /dev/null and b/effect/satyr/riki_smokebomb_b.vpcf_c differ diff --git a/effect/satyr/riki_smokebomb_smoke.vpcf_c b/effect/satyr/riki_smokebomb_smoke.vpcf_c new file mode 100755 index 0000000..e10a4ad Binary files /dev/null and b/effect/satyr/riki_smokebomb_smoke.vpcf_c differ diff --git a/effect/satyr_3/dust_of_appearance_true_sight.vpcf_c b/effect/satyr_3/dust_of_appearance_true_sight.vpcf_c new file mode 100755 index 0000000..bed7c3c Binary files /dev/null and b/effect/satyr_3/dust_of_appearance_true_sight.vpcf_c differ diff --git a/effect/satyr_fog/smoke_of_deceit_buff.vpcf_c b/effect/satyr_fog/smoke_of_deceit_buff.vpcf_c new file mode 100755 index 0000000..7932e83 Binary files /dev/null and b/effect/satyr_fog/smoke_of_deceit_buff.vpcf_c differ diff --git a/effect/satyr_fog/smoke_of_deceit_buff_b.vpcf_c b/effect/satyr_fog/smoke_of_deceit_buff_b.vpcf_c new file mode 100755 index 0000000..6bbdb30 Binary files /dev/null and b/effect/satyr_fog/smoke_of_deceit_buff_b.vpcf_c differ diff --git a/effect/satyr_fog/smoke_of_deceit_buff_c.vpcf_c b/effect/satyr_fog/smoke_of_deceit_buff_c.vpcf_c new file mode 100755 index 0000000..9d29de6 Binary files /dev/null and b/effect/satyr_fog/smoke_of_deceit_buff_c.vpcf_c differ diff --git a/effect/select_ring/1.vpcf_c b/effect/select_ring/1.vpcf_c new file mode 100755 index 0000000..66b2498 Binary files /dev/null and b/effect/select_ring/1.vpcf_c differ diff --git a/effect/shengjie/shengjie.vpcf_c b/effect/shengjie/shengjie.vpcf_c new file mode 100755 index 0000000..71e72eb Binary files /dev/null and b/effect/shengjie/shengjie.vpcf_c differ diff --git a/effect/shengjie/shengjie_b.vpcf_c b/effect/shengjie/shengjie_b.vpcf_c new file mode 100755 index 0000000..cee393b Binary files /dev/null and b/effect/shengjie/shengjie_b.vpcf_c differ diff --git a/effect/shengjie/shengjie_c.vpcf_c b/effect/shengjie/shengjie_c.vpcf_c new file mode 100755 index 0000000..045bc6f Binary files /dev/null and b/effect/shengjie/shengjie_c.vpcf_c differ diff --git a/effect/shengjie/shengjie_d.vpcf_c b/effect/shengjie/shengjie_d.vpcf_c new file mode 100755 index 0000000..f43a8ee Binary files /dev/null and b/effect/shengjie/shengjie_d.vpcf_c differ diff --git a/effect/shengjie/shengjie_e.vpcf_c b/effect/shengjie/shengjie_e.vpcf_c new file mode 100755 index 0000000..776a950 Binary files /dev/null and b/effect/shengjie/shengjie_e.vpcf_c differ diff --git a/effect/shengjie/shengjie_f.vpcf_c b/effect/shengjie/shengjie_f.vpcf_c new file mode 100755 index 0000000..54d6a86 Binary files /dev/null and b/effect/shengjie/shengjie_f.vpcf_c differ diff --git a/effect/shushi/bloodseeker/warlock_shadow_word_debuff_j.vpcf_c b/effect/shushi/bloodseeker/warlock_shadow_word_debuff_j.vpcf_c new file mode 100755 index 0000000..e10d7e1 Binary files /dev/null and b/effect/shushi/bloodseeker/warlock_shadow_word_debuff_j.vpcf_c differ diff --git a/effect/shushi/warlock/warlock_shadow_word_debuff.vpcf_c b/effect/shushi/warlock/warlock_shadow_word_debuff.vpcf_c new file mode 100755 index 0000000..c16fb45 Binary files /dev/null and b/effect/shushi/warlock/warlock_shadow_word_debuff.vpcf_c differ diff --git a/effect/shushi/warlock/warlock_shadow_word_debuff_core.vpcf_c b/effect/shushi/warlock/warlock_shadow_word_debuff_core.vpcf_c new file mode 100755 index 0000000..294354e Binary files /dev/null and b/effect/shushi/warlock/warlock_shadow_word_debuff_core.vpcf_c differ diff --git a/effect/shushi/warlock/warlock_shadow_word_debuff_e.vpcf_c b/effect/shushi/warlock/warlock_shadow_word_debuff_e.vpcf_c new file mode 100755 index 0000000..1b02a8c Binary files /dev/null and b/effect/shushi/warlock/warlock_shadow_word_debuff_e.vpcf_c differ diff --git a/effect/shushi/warlock/warlock_shadow_word_debuff_f.vpcf_c b/effect/shushi/warlock/warlock_shadow_word_debuff_f.vpcf_c new file mode 100755 index 0000000..05138e6 Binary files /dev/null and b/effect/shushi/warlock/warlock_shadow_word_debuff_f.vpcf_c differ diff --git a/effect/shushi/warlock/warlock_shadow_word_debuff_k.vpcf_c b/effect/shushi/warlock/warlock_shadow_word_debuff_k.vpcf_c new file mode 100755 index 0000000..82f08e9 Binary files /dev/null and b/effect/shushi/warlock/warlock_shadow_word_debuff_k.vpcf_c differ diff --git a/effect/shushi/warlock/warlock_shadow_word_glyph_glow.vpcf_c b/effect/shushi/warlock/warlock_shadow_word_glyph_glow.vpcf_c new file mode 100755 index 0000000..a4b1c70 Binary files /dev/null and b/effect/shushi/warlock/warlock_shadow_word_glyph_glow.vpcf_c differ diff --git a/effect/shushi/warlock/warlock_shadow_word_glyph_sparks.vpcf_c b/effect/shushi/warlock/warlock_shadow_word_glyph_sparks.vpcf_c new file mode 100755 index 0000000..baca124 Binary files /dev/null and b/effect/shushi/warlock/warlock_shadow_word_glyph_sparks.vpcf_c differ diff --git a/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012.vpcf_c b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012.vpcf_c new file mode 100755 index 0000000..c7393cc Binary files /dev/null and b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012.vpcf_c differ diff --git a/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_body.vpcf_c b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_body.vpcf_c new file mode 100755 index 0000000..cb1e93c Binary files /dev/null and b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_body.vpcf_c differ diff --git a/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_body_b.vpcf_c b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_body_b.vpcf_c new file mode 100755 index 0000000..4ad6618 Binary files /dev/null and b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_body_b.vpcf_c differ diff --git a/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_body_c.vpcf_c b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_body_c.vpcf_c new file mode 100755 index 0000000..0605d8e Binary files /dev/null and b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_body_c.vpcf_c differ diff --git a/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_drifts.vpcf_c b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_drifts.vpcf_c new file mode 100755 index 0000000..b01370b Binary files /dev/null and b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_drifts.vpcf_c differ diff --git a/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_snow.vpcf_c b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_snow.vpcf_c new file mode 100755 index 0000000..caaa557 Binary files /dev/null and b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_snow.vpcf_c differ diff --git a/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_snow_b.vpcf_c b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_snow_b.vpcf_c new file mode 100755 index 0000000..1639f40 Binary files /dev/null and b/effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012_snow_b.vpcf_c differ diff --git a/effect/snow2012/1rain_fx/snow_drift_b.vpcf_c b/effect/snow2012/1rain_fx/snow_drift_b.vpcf_c new file mode 100755 index 0000000..6bd5fd1 Binary files /dev/null and b/effect/snow2012/1rain_fx/snow_drift_b.vpcf_c differ diff --git a/effect/snow2012/1rain_fx/snow_fallback.vpcf_c b/effect/snow2012/1rain_fx/snow_fallback.vpcf_c new file mode 100755 index 0000000..db7abe7 Binary files /dev/null and b/effect/snow2012/1rain_fx/snow_fallback.vpcf_c differ diff --git a/effect/snow2012/1rain_fx/snow_fallback_2.vpcf_c b/effect/snow2012/1rain_fx/snow_fallback_2.vpcf_c new file mode 100755 index 0000000..6c3e624 Binary files /dev/null and b/effect/snow2012/1rain_fx/snow_fallback_2.vpcf_c differ diff --git a/effect/ti7_shanguang/ti7.vpcf_c b/effect/ti7_shanguang/ti7.vpcf_c new file mode 100755 index 0000000..2b0d4e9 Binary files /dev/null and b/effect/ti7_shanguang/ti7.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7.vpcf_c b/effect/ti7_shengwu/ti7.vpcf_c new file mode 100755 index 0000000..9aa2b30 Binary files /dev/null and b/effect/ti7_shengwu/ti7.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_aegis_back.vpcf_c b/effect/ti7_shengwu/ti7_aegis_back.vpcf_c new file mode 100755 index 0000000..9dd869d Binary files /dev/null and b/effect/ti7_shengwu/ti7_aegis_back.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_aegis_top.vpcf_c b/effect/ti7_shengwu/ti7_aegis_top.vpcf_c new file mode 100755 index 0000000..cf5a954 Binary files /dev/null and b/effect/ti7_shengwu/ti7_aegis_top.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_caustic.vpcf_c b/effect/ti7_shengwu/ti7_caustic.vpcf_c new file mode 100755 index 0000000..c81cfea Binary files /dev/null and b/effect/ti7_shengwu/ti7_caustic.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_core.vpcf_c b/effect/ti7_shengwu/ti7_core.vpcf_c new file mode 100755 index 0000000..85c9071 Binary files /dev/null and b/effect/ti7_shengwu/ti7_core.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_gem_flare.vpcf_c b/effect/ti7_shengwu/ti7_gem_flare.vpcf_c new file mode 100755 index 0000000..13b5a10 Binary files /dev/null and b/effect/ti7_shengwu/ti7_gem_flare.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_gem_glow.vpcf_c b/effect/ti7_shengwu/ti7_gem_glow.vpcf_c new file mode 100755 index 0000000..bbf7a73 Binary files /dev/null and b/effect/ti7_shengwu/ti7_gem_glow.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_gem_model.vpcf_c b/effect/ti7_shengwu/ti7_gem_model.vpcf_c new file mode 100755 index 0000000..443432c Binary files /dev/null and b/effect/ti7_shengwu/ti7_gem_model.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_gem_ring.vpcf_c b/effect/ti7_shengwu/ti7_gem_ring.vpcf_c new file mode 100755 index 0000000..01ab25c Binary files /dev/null and b/effect/ti7_shengwu/ti7_gem_ring.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_gem_twinkle.vpcf_c b/effect/ti7_shengwu/ti7_gem_twinkle.vpcf_c new file mode 100755 index 0000000..b3d7789 Binary files /dev/null and b/effect/ti7_shengwu/ti7_gem_twinkle.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_gems.vpcf_c b/effect/ti7_shengwu/ti7_gems.vpcf_c new file mode 100755 index 0000000..bf35f74 Binary files /dev/null and b/effect/ti7_shengwu/ti7_gems.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_ground_dark.vpcf_c b/effect/ti7_shengwu/ti7_ground_dark.vpcf_c new file mode 100755 index 0000000..eab9355 Binary files /dev/null and b/effect/ti7_shengwu/ti7_ground_dark.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_ground_detail.vpcf_c b/effect/ti7_shengwu/ti7_ground_detail.vpcf_c new file mode 100755 index 0000000..8fb8e89 Binary files /dev/null and b/effect/ti7_shengwu/ti7_ground_detail.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_light.vpcf_c b/effect/ti7_shengwu/ti7_light.vpcf_c new file mode 100755 index 0000000..24e87fc Binary files /dev/null and b/effect/ti7_shengwu/ti7_light.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_light_aura.vpcf_c b/effect/ti7_shengwu/ti7_light_aura.vpcf_c new file mode 100755 index 0000000..038eb5e Binary files /dev/null and b/effect/ti7_shengwu/ti7_light_aura.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_magic.vpcf_c b/effect/ti7_shengwu/ti7_magic.vpcf_c new file mode 100755 index 0000000..5179342 Binary files /dev/null and b/effect/ti7_shengwu/ti7_magic.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_ring_puddle.vpcf_c b/effect/ti7_shengwu/ti7_ring_puddle.vpcf_c new file mode 100755 index 0000000..c7423b9 Binary files /dev/null and b/effect/ti7_shengwu/ti7_ring_puddle.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_ring_twinkle.vpcf_c b/effect/ti7_shengwu/ti7_ring_twinkle.vpcf_c new file mode 100755 index 0000000..05cddbf Binary files /dev/null and b/effect/ti7_shengwu/ti7_ring_twinkle.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_rings.vpcf_c b/effect/ti7_shengwu/ti7_rings.vpcf_c new file mode 100755 index 0000000..aa03347 Binary files /dev/null and b/effect/ti7_shengwu/ti7_rings.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_smoke.vpcf_c b/effect/ti7_shengwu/ti7_smoke.vpcf_c new file mode 100755 index 0000000..3e7f2b1 Binary files /dev/null and b/effect/ti7_shengwu/ti7_smoke.vpcf_c differ diff --git a/effect/ti7_shengwu/ti7_splash.vpcf_c b/effect/ti7_shengwu/ti7_splash.vpcf_c new file mode 100755 index 0000000..43199f9 Binary files /dev/null and b/effect/ti7_shengwu/ti7_splash.vpcf_c differ diff --git a/effect/ti7donkey/effect.vpcf_c b/effect/ti7donkey/effect.vpcf_c new file mode 100755 index 0000000..3b350ee Binary files /dev/null and b/effect/ti7donkey/effect.vpcf_c differ diff --git a/effect/ti7donkey/effect_angels.vpcf_c b/effect/ti7donkey/effect_angels.vpcf_c new file mode 100755 index 0000000..8416f66 Binary files /dev/null and b/effect/ti7donkey/effect_angels.vpcf_c differ diff --git a/effect/ti7donkey/effect_angels_glow.vpcf_c b/effect/ti7donkey/effect_angels_glow.vpcf_c new file mode 100755 index 0000000..85ed27a Binary files /dev/null and b/effect/ti7donkey/effect_angels_glow.vpcf_c differ diff --git a/effect/ti7donkey/effect_cm.vpcf_c b/effect/ti7donkey/effect_cm.vpcf_c new file mode 100755 index 0000000..a126ff7 Binary files /dev/null and b/effect/ti7donkey/effect_cm.vpcf_c differ diff --git a/effect/ti7donkey/effect_ember.vpcf_c b/effect/ti7donkey/effect_ember.vpcf_c new file mode 100755 index 0000000..5555aa8 Binary files /dev/null and b/effect/ti7donkey/effect_ember.vpcf_c differ diff --git a/effect/ti7donkey/effect_flakes.vpcf_c b/effect/ti7donkey/effect_flakes.vpcf_c new file mode 100755 index 0000000..eac8666 Binary files /dev/null and b/effect/ti7donkey/effect_flakes.vpcf_c differ diff --git a/effect/ti7donkey/effect_flakes_b.vpcf_c b/effect/ti7donkey/effect_flakes_b.vpcf_c new file mode 100755 index 0000000..bbec132 Binary files /dev/null and b/effect/ti7donkey/effect_flakes_b.vpcf_c differ diff --git a/effect/ti7donkey/effect_flare.vpcf_c b/effect/ti7donkey/effect_flare.vpcf_c new file mode 100755 index 0000000..4553f6c Binary files /dev/null and b/effect/ti7donkey/effect_flare.vpcf_c differ diff --git a/effect/ti7donkey/effect_frost.vpcf_c b/effect/ti7donkey/effect_frost.vpcf_c new file mode 100755 index 0000000..3224bcf Binary files /dev/null and b/effect/ti7donkey/effect_frost.vpcf_c differ diff --git a/effect/ti7donkey/effect_glow.vpcf_c b/effect/ti7donkey/effect_glow.vpcf_c new file mode 100755 index 0000000..3758d65 Binary files /dev/null and b/effect/ti7donkey/effect_glow.vpcf_c differ diff --git a/effect/ti7donkey/effect_ground_frost.vpcf_c b/effect/ti7donkey/effect_ground_frost.vpcf_c new file mode 100755 index 0000000..0fc119f Binary files /dev/null and b/effect/ti7donkey/effect_ground_frost.vpcf_c differ diff --git a/effect/ti7donkey/effect_ground_glint.vpcf_c b/effect/ti7donkey/effect_ground_glint.vpcf_c new file mode 100755 index 0000000..ce3fe67 Binary files /dev/null and b/effect/ti7donkey/effect_ground_glint.vpcf_c differ diff --git a/effect/ti7donkey/effect_ground_ice.vpcf_c b/effect/ti7donkey/effect_ground_ice.vpcf_c new file mode 100755 index 0000000..37a4d47 Binary files /dev/null and b/effect/ti7donkey/effect_ground_ice.vpcf_c differ diff --git a/effect/ti7donkey/effect_ground_shard.vpcf_c b/effect/ti7donkey/effect_ground_shard.vpcf_c new file mode 100755 index 0000000..5f06eb5 Binary files /dev/null and b/effect/ti7donkey/effect_ground_shard.vpcf_c differ diff --git a/effect/ti7donkey/effect_halo.vpcf_c b/effect/ti7donkey/effect_halo.vpcf_c new file mode 100755 index 0000000..cbd0981 Binary files /dev/null and b/effect/ti7donkey/effect_halo.vpcf_c differ diff --git a/effect/ti7donkey/effect_poof.vpcf_c b/effect/ti7donkey/effect_poof.vpcf_c new file mode 100755 index 0000000..8aa00c0 Binary files /dev/null and b/effect/ti7donkey/effect_poof.vpcf_c differ diff --git a/effect/ti7donkey/effect_trail.vpcf_c b/effect/ti7donkey/effect_trail.vpcf_c new file mode 100755 index 0000000..23bf73d Binary files /dev/null and b/effect/ti7donkey/effect_trail.vpcf_c differ diff --git a/effect/ti7donkey/effect_trail_b.vpcf_c b/effect/ti7donkey/effect_trail_b.vpcf_c new file mode 100755 index 0000000..fb6e66f Binary files /dev/null and b/effect/ti7donkey/effect_trail_b.vpcf_c differ diff --git a/effect/ti8roshan/1.vpcf_c b/effect/ti8roshan/1.vpcf_c new file mode 100755 index 0000000..b09c4d8 Binary files /dev/null and b/effect/ti8roshan/1.vpcf_c differ diff --git a/effect/ti8roshan/1_ember.vpcf_c b/effect/ti8roshan/1_ember.vpcf_c new file mode 100755 index 0000000..7135a64 Binary files /dev/null and b/effect/ti8roshan/1_ember.vpcf_c differ diff --git a/effect/ti8roshan/1_eyes.vpcf_c b/effect/ti8roshan/1_eyes.vpcf_c new file mode 100755 index 0000000..a362397 Binary files /dev/null and b/effect/ti8roshan/1_eyes.vpcf_c differ diff --git a/effect/ti8roshan/1_eyes_b.vpcf_c b/effect/ti8roshan/1_eyes_b.vpcf_c new file mode 100755 index 0000000..59cd592 Binary files /dev/null and b/effect/ti8roshan/1_eyes_b.vpcf_c differ diff --git a/effect/ti8roshan/1_eyes_c.vpcf_c b/effect/ti8roshan/1_eyes_c.vpcf_c new file mode 100755 index 0000000..8f339d7 Binary files /dev/null and b/effect/ti8roshan/1_eyes_c.vpcf_c differ diff --git a/effect/ti8roshan/1_eyes_d.vpcf_c b/effect/ti8roshan/1_eyes_d.vpcf_c new file mode 100755 index 0000000..63fdf16 Binary files /dev/null and b/effect/ti8roshan/1_eyes_d.vpcf_c differ diff --git a/effect/ti8roshan/1_fire.vpcf_c b/effect/ti8roshan/1_fire.vpcf_c new file mode 100755 index 0000000..a3339a3 Binary files /dev/null and b/effect/ti8roshan/1_fire.vpcf_c differ diff --git a/effect/ti8roshan/1_ground.vpcf_c b/effect/ti8roshan/1_ground.vpcf_c new file mode 100755 index 0000000..8db3223 Binary files /dev/null and b/effect/ti8roshan/1_ground.vpcf_c differ diff --git a/effect/ti8roshan/1_ground_crystal.vpcf_c b/effect/ti8roshan/1_ground_crystal.vpcf_c new file mode 100755 index 0000000..89ea3d2 Binary files /dev/null and b/effect/ti8roshan/1_ground_crystal.vpcf_c differ diff --git a/effect/ti8roshan/1_ground_dark.vpcf_c b/effect/ti8roshan/1_ground_dark.vpcf_c new file mode 100755 index 0000000..dafd73f Binary files /dev/null and b/effect/ti8roshan/1_ground_dark.vpcf_c differ diff --git a/effect/ti8roshan/1_halo.vpcf_c b/effect/ti8roshan/1_halo.vpcf_c new file mode 100755 index 0000000..5db52c8 Binary files /dev/null and b/effect/ti8roshan/1_halo.vpcf_c differ diff --git a/effect/ti8roshan/1_steam.vpcf_c b/effect/ti8roshan/1_steam.vpcf_c new file mode 100755 index 0000000..51e65e6 Binary files /dev/null and b/effect/ti8roshan/1_steam.vpcf_c differ diff --git a/effect/transform/t.vpcf_c b/effect/transform/t.vpcf_c new file mode 100755 index 0000000..a380db7 Binary files /dev/null and b/effect/transform/t.vpcf_c differ diff --git a/effect/transform/t_b.vpcf_c b/effect/transform/t_b.vpcf_c new file mode 100755 index 0000000..cb90227 Binary files /dev/null and b/effect/transform/t_b.vpcf_c differ diff --git a/effect/transform/t_c.vpcf_c b/effect/transform/t_c.vpcf_c new file mode 100755 index 0000000..c55c193 Binary files /dev/null and b/effect/transform/t_c.vpcf_c differ diff --git a/effect/transform/t_d.vpcf_c b/effect/transform/t_d.vpcf_c new file mode 100755 index 0000000..2c4e975 Binary files /dev/null and b/effect/transform/t_d.vpcf_c differ diff --git a/effect/transform/t_e.vpcf_c b/effect/transform/t_e.vpcf_c new file mode 100755 index 0000000..3758f61 Binary files /dev/null and b/effect/transform/t_e.vpcf_c differ diff --git a/effect/u/u1.vpcf_c b/effect/u/u1.vpcf_c new file mode 100755 index 0000000..51efc75 Binary files /dev/null and b/effect/u/u1.vpcf_c differ diff --git a/effect/u/u1_beam.vpcf_c b/effect/u/u1_beam.vpcf_c new file mode 100755 index 0000000..16d381d Binary files /dev/null and b/effect/u/u1_beam.vpcf_c differ diff --git a/effect/u/u1_beam_2b.vpcf_c b/effect/u/u1_beam_2b.vpcf_c new file mode 100755 index 0000000..d4aed32 Binary files /dev/null and b/effect/u/u1_beam_2b.vpcf_c differ diff --git a/effect/u/u1_beam_2c.vpcf_c b/effect/u/u1_beam_2c.vpcf_c new file mode 100755 index 0000000..ff23f1e Binary files /dev/null and b/effect/u/u1_beam_2c.vpcf_c differ diff --git a/effect/u/u1_beam_2d.vpcf_c b/effect/u/u1_beam_2d.vpcf_c new file mode 100755 index 0000000..a84d885 Binary files /dev/null and b/effect/u/u1_beam_2d.vpcf_c differ diff --git a/effect/u/u1_hand.vpcf_c b/effect/u/u1_hand.vpcf_c new file mode 100755 index 0000000..1fdc3cf Binary files /dev/null and b/effect/u/u1_hand.vpcf_c differ diff --git a/effect/u/u1_hand_b.vpcf_c b/effect/u/u1_hand_b.vpcf_c new file mode 100755 index 0000000..af2ab6b Binary files /dev/null and b/effect/u/u1_hand_b.vpcf_c differ diff --git a/effect/u/u1_light.vpcf_c b/effect/u/u1_light.vpcf_c new file mode 100755 index 0000000..4fdef3b Binary files /dev/null and b/effect/u/u1_light.vpcf_c differ diff --git a/effect/u2/2.vpcf_c b/effect/u2/2.vpcf_c new file mode 100755 index 0000000..a8f12ff Binary files /dev/null and b/effect/u2/2.vpcf_c differ diff --git a/effect/u2/2_beam.vpcf_c b/effect/u2/2_beam.vpcf_c new file mode 100755 index 0000000..c818f3d Binary files /dev/null and b/effect/u2/2_beam.vpcf_c differ diff --git a/effect/u2/2_beam_2b.vpcf_c b/effect/u2/2_beam_2b.vpcf_c new file mode 100755 index 0000000..61b08a5 Binary files /dev/null and b/effect/u2/2_beam_2b.vpcf_c differ diff --git a/effect/u2/2_beam_2c.vpcf_c b/effect/u2/2_beam_2c.vpcf_c new file mode 100755 index 0000000..631240f Binary files /dev/null and b/effect/u2/2_beam_2c.vpcf_c differ diff --git a/effect/u2/2_beam_2d.vpcf_c b/effect/u2/2_beam_2d.vpcf_c new file mode 100755 index 0000000..49d68eb Binary files /dev/null and b/effect/u2/2_beam_2d.vpcf_c differ diff --git a/effect/u2/2_hand.vpcf_c b/effect/u2/2_hand.vpcf_c new file mode 100755 index 0000000..847a25f Binary files /dev/null and b/effect/u2/2_hand.vpcf_c differ diff --git a/effect/u2/2_hand_b.vpcf_c b/effect/u2/2_hand_b.vpcf_c new file mode 100755 index 0000000..e41742d Binary files /dev/null and b/effect/u2/2_hand_b.vpcf_c differ diff --git a/effect/u2/2_light.vpcf_c b/effect/u2/2_light.vpcf_c new file mode 100755 index 0000000..4b8db70 Binary files /dev/null and b/effect/u2/2_light.vpcf_c differ diff --git a/effect/wabbit/body_energy.vpcf_c b/effect/wabbit/body_energy.vpcf_c new file mode 100755 index 0000000..3e86054 Binary files /dev/null and b/effect/wabbit/body_energy.vpcf_c differ diff --git a/effect/wabbit/body_lvl3_glow.vpcf_c b/effect/wabbit/body_lvl3_glow.vpcf_c new file mode 100755 index 0000000..cb56335 Binary files /dev/null and b/effect/wabbit/body_lvl3_glow.vpcf_c differ diff --git a/effect/wabbit/body_magic.vpcf_c b/effect/wabbit/body_magic.vpcf_c new file mode 100755 index 0000000..849b36a Binary files /dev/null and b/effect/wabbit/body_magic.vpcf_c differ diff --git a/effect/wabbit/ear_rope.vpcf_c b/effect/wabbit/ear_rope.vpcf_c new file mode 100755 index 0000000..0a8f846 Binary files /dev/null and b/effect/wabbit/ear_rope.vpcf_c differ diff --git a/effect/wabbit/ears.vpcf_c b/effect/wabbit/ears.vpcf_c new file mode 100755 index 0000000..abe09aa Binary files /dev/null and b/effect/wabbit/ears.vpcf_c differ diff --git a/effect/wabbit/lvl3.vpcf_c b/effect/wabbit/lvl3.vpcf_c new file mode 100755 index 0000000..bf51431 Binary files /dev/null and b/effect/wabbit/lvl3.vpcf_c differ diff --git a/effect/wabbit/lvl3_tail_trail.vpcf_c b/effect/wabbit/lvl3_tail_trail.vpcf_c new file mode 100755 index 0000000..afe4985 Binary files /dev/null and b/effect/wabbit/lvl3_tail_trail.vpcf_c differ diff --git a/effect/wabbit/pendant_glow.vpcf_c b/effect/wabbit/pendant_glow.vpcf_c new file mode 100755 index 0000000..7d12657 Binary files /dev/null and b/effect/wabbit/pendant_glow.vpcf_c differ diff --git a/effect/wabbit/pendant_sparkle.vpcf_c b/effect/wabbit/pendant_sparkle.vpcf_c new file mode 100755 index 0000000..25fc773 Binary files /dev/null and b/effect/wabbit/pendant_sparkle.vpcf_c differ diff --git a/effect/wabbit/salve_lvl3_glow.vpcf_c b/effect/wabbit/salve_lvl3_glow.vpcf_c new file mode 100755 index 0000000..2097224 Binary files /dev/null and b/effect/wabbit/salve_lvl3_glow.vpcf_c differ diff --git a/effect/wabbit/salve_lvl3_magic.vpcf_c b/effect/wabbit/salve_lvl3_magic.vpcf_c new file mode 100755 index 0000000..a6d6538 Binary files /dev/null and b/effect/wabbit/salve_lvl3_magic.vpcf_c differ diff --git a/effect/wabbit/salve_lvl3_magic_trail.vpcf_c b/effect/wabbit/salve_lvl3_magic_trail.vpcf_c new file mode 100755 index 0000000..546b8e1 Binary files /dev/null and b/effect/wabbit/salve_lvl3_magic_trail.vpcf_c differ diff --git a/effect/wabbit/salve_lvl3_smoke.vpcf_c b/effect/wabbit/salve_lvl3_smoke.vpcf_c new file mode 100755 index 0000000..ce05478 Binary files /dev/null and b/effect/wabbit/salve_lvl3_smoke.vpcf_c differ diff --git a/effect/wabbit/scroll_lvl3_glow.vpcf_c b/effect/wabbit/scroll_lvl3_glow.vpcf_c new file mode 100755 index 0000000..f62167e Binary files /dev/null and b/effect/wabbit/scroll_lvl3_glow.vpcf_c differ diff --git a/effect/wangyu/1.vpcf_c b/effect/wangyu/1.vpcf_c new file mode 100755 index 0000000..405c31c Binary files /dev/null and b/effect/wangyu/1.vpcf_c differ diff --git a/effect/wuwuwu/1.vpcf_c b/effect/wuwuwu/1.vpcf_c new file mode 100755 index 0000000..aec4e3c Binary files /dev/null and b/effect/wuwuwu/1.vpcf_c differ diff --git a/effect/x.vpcf_c b/effect/x.vpcf_c new file mode 100755 index 0000000..6ab396c Binary files /dev/null and b/effect/x.vpcf_c differ diff --git a/effect/x/econ.vpcf_c b/effect/x/econ.vpcf_c new file mode 100755 index 0000000..dd37c6c Binary files /dev/null and b/effect/x/econ.vpcf_c differ diff --git a/effect/x/line_econ.vpcf_c b/effect/x/line_econ.vpcf_c new file mode 100755 index 0000000..f2de6c0 Binary files /dev/null and b/effect/x/line_econ.vpcf_c differ diff --git a/effect/x/return_econ.vpcf_c b/effect/x/return_econ.vpcf_c new file mode 100755 index 0000000..4e188dc Binary files /dev/null and b/effect/x/return_econ.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff.vpcf_c b/effect/xingguanglanbaoshi/ti7buff.vpcf_c new file mode 100755 index 0000000..117feeb Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_beams.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_beams.vpcf_c new file mode 100755 index 0000000..1e2d10d Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_beams.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_burst.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_burst.vpcf_c new file mode 100755 index 0000000..47977d3 Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_burst.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_burst_b.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_burst_b.vpcf_c new file mode 100755 index 0000000..4374508 Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_burst_b.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_burst_c.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_burst_c.vpcf_c new file mode 100755 index 0000000..c4f4cc7 Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_burst_c.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_flakes.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_flakes.vpcf_c new file mode 100755 index 0000000..3dfcaae Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_flakes.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_flash.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_flash.vpcf_c new file mode 100755 index 0000000..67cca8d Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_flash.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_glint.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_glint.vpcf_c new file mode 100755 index 0000000..f61d467 Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_glint.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_ground.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_ground.vpcf_c new file mode 100755 index 0000000..d77cb5a Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_ground.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_ground_crack.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_ground_crack.vpcf_c new file mode 100755 index 0000000..f5a8e53 Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_ground_crack.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_ground_crack_glow.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_ground_crack_glow.vpcf_c new file mode 100755 index 0000000..8a9cc11 Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_ground_crack_glow.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_ground_darken.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_ground_darken.vpcf_c new file mode 100755 index 0000000..8f62689 Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_ground_darken.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_ground_ice.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_ground_ice.vpcf_c new file mode 100755 index 0000000..4b6edef Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_ground_ice.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_outline.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_outline.vpcf_c new file mode 100755 index 0000000..8778a6d Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_outline.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_smoke.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_smoke.vpcf_c new file mode 100755 index 0000000..38561ec Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_smoke.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7buff_warp.vpcf_c b/effect/xingguanglanbaoshi/ti7buff_warp.vpcf_c new file mode 100755 index 0000000..429f741 Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7buff_warp.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7ground_ice.vpcf_c b/effect/xingguanglanbaoshi/ti7ground_ice.vpcf_c new file mode 100755 index 0000000..24a4ef3 Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7ground_ice.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7icicle.vpcf_c b/effect/xingguanglanbaoshi/ti7icicle.vpcf_c new file mode 100755 index 0000000..5d4129a Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7icicle.vpcf_c differ diff --git a/effect/xingguanglanbaoshi/ti7sphere.vpcf_c b/effect/xingguanglanbaoshi/ti7sphere.vpcf_c new file mode 100755 index 0000000..00bb942 Binary files /dev/null and b/effect/xingguanglanbaoshi/ti7sphere.vpcf_c differ diff --git a/effect/xuehua/xuehua.vpcf_c b/effect/xuehua/xuehua.vpcf_c new file mode 100755 index 0000000..e1b4ef0 Binary files /dev/null and b/effect/xuehua/xuehua.vpcf_c differ diff --git a/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok.vpcf_c b/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok.vpcf_c new file mode 100755 index 0000000..8881b77 Binary files /dev/null and b/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok.vpcf_c differ diff --git a/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc.vpcf_c b/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc.vpcf_c new file mode 100755 index 0000000..183728f Binary files /dev/null and b/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc.vpcf_c differ diff --git a/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc_glow.vpcf_c b/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc_glow.vpcf_c new file mode 100755 index 0000000..a244bc9 Binary files /dev/null and b/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc_glow.vpcf_c differ diff --git a/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_drips.vpcf_c b/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_drips.vpcf_c new file mode 100755 index 0000000..570d72a Binary files /dev/null and b/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_drips.vpcf_c differ diff --git a/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_splatter.vpcf_c b/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_splatter.vpcf_c new file mode 100755 index 0000000..128e6ef Binary files /dev/null and b/effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_splatter.vpcf_c differ diff --git a/effect/xuehuan/xuehuanunits/heroes/hero_bloodseeker/bloodseeker_bloodbath_e_lv.vpcf_c b/effect/xuehuan/xuehuanunits/heroes/hero_bloodseeker/bloodseeker_bloodbath_e_lv.vpcf_c new file mode 100755 index 0000000..37dccc1 Binary files /dev/null and b/effect/xuehuan/xuehuanunits/heroes/hero_bloodseeker/bloodseeker_bloodbath_e_lv.vpcf_c differ diff --git a/effect/xukong/cour_rex_flying.vpcf_c b/effect/xukong/cour_rex_flying.vpcf_c new file mode 100755 index 0000000..e2da1b7 Binary files /dev/null and b/effect/xukong/cour_rex_flying.vpcf_c differ diff --git a/effect/xukong/cour_rex_flying_a.vpcf_c b/effect/xukong/cour_rex_flying_a.vpcf_c new file mode 100755 index 0000000..33614ea Binary files /dev/null and b/effect/xukong/cour_rex_flying_a.vpcf_c differ diff --git a/effect/xukong/cour_rex_flying_b.vpcf_c b/effect/xukong/cour_rex_flying_b.vpcf_c new file mode 100755 index 0000000..f42fe5a Binary files /dev/null and b/effect/xukong/cour_rex_flying_b.vpcf_c differ diff --git a/effect/xukong/cour_rex_flying_e.vpcf_c b/effect/xukong/cour_rex_flying_e.vpcf_c new file mode 100755 index 0000000..85d40a5 Binary files /dev/null and b/effect/xukong/cour_rex_flying_e.vpcf_c differ diff --git a/effect/xukong/cour_rex_flying_f.vpcf_c b/effect/xukong/cour_rex_flying_f.vpcf_c new file mode 100755 index 0000000..b7b2315 Binary files /dev/null and b/effect/xukong/cour_rex_flying_f.vpcf_c differ diff --git a/effect/xuwuzhiyan/blue/1.vpcf_c b/effect/xuwuzhiyan/blue/1.vpcf_c new file mode 100755 index 0000000..23d2942 Binary files /dev/null and b/effect/xuwuzhiyan/blue/1.vpcf_c differ diff --git a/effect/xuwuzhiyan/blue/1b.vpcf_c b/effect/xuwuzhiyan/blue/1b.vpcf_c new file mode 100755 index 0000000..e8fe956 Binary files /dev/null and b/effect/xuwuzhiyan/blue/1b.vpcf_c differ diff --git a/effect/xuwuzhiyan/blue/1c.vpcf_c b/effect/xuwuzhiyan/blue/1c.vpcf_c new file mode 100755 index 0000000..a746385 Binary files /dev/null and b/effect/xuwuzhiyan/blue/1c.vpcf_c differ diff --git a/effect/xuwuzhiyan/blue/1d.vpcf_c b/effect/xuwuzhiyan/blue/1d.vpcf_c new file mode 100755 index 0000000..25c4d9b Binary files /dev/null and b/effect/xuwuzhiyan/blue/1d.vpcf_c differ diff --git a/effect/xuwuzhiyan/cyan/1.vpcf_c b/effect/xuwuzhiyan/cyan/1.vpcf_c new file mode 100755 index 0000000..9a512d9 Binary files /dev/null and b/effect/xuwuzhiyan/cyan/1.vpcf_c differ diff --git a/effect/xuwuzhiyan/cyan/1b.vpcf_c b/effect/xuwuzhiyan/cyan/1b.vpcf_c new file mode 100755 index 0000000..cc532e1 Binary files /dev/null and b/effect/xuwuzhiyan/cyan/1b.vpcf_c differ diff --git a/effect/xuwuzhiyan/cyan/1c.vpcf_c b/effect/xuwuzhiyan/cyan/1c.vpcf_c new file mode 100755 index 0000000..9134bd2 Binary files /dev/null and b/effect/xuwuzhiyan/cyan/1c.vpcf_c differ diff --git a/effect/xuwuzhiyan/cyan/1d.vpcf_c b/effect/xuwuzhiyan/cyan/1d.vpcf_c new file mode 100755 index 0000000..3ffc8ef Binary files /dev/null and b/effect/xuwuzhiyan/cyan/1d.vpcf_c differ diff --git a/effect/xuwuzhiyan/green/1.vpcf_c b/effect/xuwuzhiyan/green/1.vpcf_c new file mode 100755 index 0000000..c1316db Binary files /dev/null and b/effect/xuwuzhiyan/green/1.vpcf_c differ diff --git a/effect/xuwuzhiyan/green/1b.vpcf_c b/effect/xuwuzhiyan/green/1b.vpcf_c new file mode 100755 index 0000000..dcc8ee8 Binary files /dev/null and b/effect/xuwuzhiyan/green/1b.vpcf_c differ diff --git a/effect/xuwuzhiyan/green/1c.vpcf_c b/effect/xuwuzhiyan/green/1c.vpcf_c new file mode 100755 index 0000000..a8a7585 Binary files /dev/null and b/effect/xuwuzhiyan/green/1c.vpcf_c differ diff --git a/effect/xuwuzhiyan/green/1d.vpcf_c b/effect/xuwuzhiyan/green/1d.vpcf_c new file mode 100755 index 0000000..d8a972a Binary files /dev/null and b/effect/xuwuzhiyan/green/1d.vpcf_c differ diff --git a/effect/xuwuzhiyan/orange/1.vpcf_c b/effect/xuwuzhiyan/orange/1.vpcf_c new file mode 100755 index 0000000..4592b66 Binary files /dev/null and b/effect/xuwuzhiyan/orange/1.vpcf_c differ diff --git a/effect/xuwuzhiyan/orange/1b.vpcf_c b/effect/xuwuzhiyan/orange/1b.vpcf_c new file mode 100755 index 0000000..1e97383 Binary files /dev/null and b/effect/xuwuzhiyan/orange/1b.vpcf_c differ diff --git a/effect/xuwuzhiyan/orange/1c.vpcf_c b/effect/xuwuzhiyan/orange/1c.vpcf_c new file mode 100755 index 0000000..f83fc2f Binary files /dev/null and b/effect/xuwuzhiyan/orange/1c.vpcf_c differ diff --git a/effect/xuwuzhiyan/orange/1d.vpcf_c b/effect/xuwuzhiyan/orange/1d.vpcf_c new file mode 100755 index 0000000..62c6c86 Binary files /dev/null and b/effect/xuwuzhiyan/orange/1d.vpcf_c differ diff --git a/effect/xuwuzhiyan/pink/1.vpcf_c b/effect/xuwuzhiyan/pink/1.vpcf_c new file mode 100755 index 0000000..849b1f1 Binary files /dev/null and b/effect/xuwuzhiyan/pink/1.vpcf_c differ diff --git a/effect/xuwuzhiyan/pink/1b.vpcf_c b/effect/xuwuzhiyan/pink/1b.vpcf_c new file mode 100755 index 0000000..829a1bd Binary files /dev/null and b/effect/xuwuzhiyan/pink/1b.vpcf_c differ diff --git a/effect/xuwuzhiyan/pink/1c.vpcf_c b/effect/xuwuzhiyan/pink/1c.vpcf_c new file mode 100755 index 0000000..e18fe35 Binary files /dev/null and b/effect/xuwuzhiyan/pink/1c.vpcf_c differ diff --git a/effect/xuwuzhiyan/pink/1d.vpcf_c b/effect/xuwuzhiyan/pink/1d.vpcf_c new file mode 100755 index 0000000..12e9014 Binary files /dev/null and b/effect/xuwuzhiyan/pink/1d.vpcf_c differ diff --git a/effect/xuwuzhiyan/purple/1.vpcf_c b/effect/xuwuzhiyan/purple/1.vpcf_c new file mode 100755 index 0000000..1b391b3 Binary files /dev/null and b/effect/xuwuzhiyan/purple/1.vpcf_c differ diff --git a/effect/xuwuzhiyan/purple/1b.vpcf_c b/effect/xuwuzhiyan/purple/1b.vpcf_c new file mode 100755 index 0000000..8d5558b Binary files /dev/null and b/effect/xuwuzhiyan/purple/1b.vpcf_c differ diff --git a/effect/xuwuzhiyan/purple/1c.vpcf_c b/effect/xuwuzhiyan/purple/1c.vpcf_c new file mode 100755 index 0000000..b4c486b Binary files /dev/null and b/effect/xuwuzhiyan/purple/1c.vpcf_c differ diff --git a/effect/xuwuzhiyan/purple/1d.vpcf_c b/effect/xuwuzhiyan/purple/1d.vpcf_c new file mode 100755 index 0000000..2cf026a Binary files /dev/null and b/effect/xuwuzhiyan/purple/1d.vpcf_c differ diff --git a/effect/xuwuzhiyan/red/1.vpcf_c b/effect/xuwuzhiyan/red/1.vpcf_c new file mode 100755 index 0000000..ab5edaf Binary files /dev/null and b/effect/xuwuzhiyan/red/1.vpcf_c differ diff --git a/effect/xuwuzhiyan/red/1b.vpcf_c b/effect/xuwuzhiyan/red/1b.vpcf_c new file mode 100755 index 0000000..32d0940 Binary files /dev/null and b/effect/xuwuzhiyan/red/1b.vpcf_c differ diff --git a/effect/xuwuzhiyan/red/1c.vpcf_c b/effect/xuwuzhiyan/red/1c.vpcf_c new file mode 100755 index 0000000..30c790a Binary files /dev/null and b/effect/xuwuzhiyan/red/1c.vpcf_c differ diff --git a/effect/xuwuzhiyan/red/1d.vpcf_c b/effect/xuwuzhiyan/red/1d.vpcf_c new file mode 100755 index 0000000..94aa474 Binary files /dev/null and b/effect/xuwuzhiyan/red/1d.vpcf_c differ diff --git a/effect/xuwuzhiyan/white/1.vpcf_c b/effect/xuwuzhiyan/white/1.vpcf_c new file mode 100755 index 0000000..023ff4f Binary files /dev/null and b/effect/xuwuzhiyan/white/1.vpcf_c differ diff --git a/effect/xuwuzhiyan/white/1b.vpcf_c b/effect/xuwuzhiyan/white/1b.vpcf_c new file mode 100755 index 0000000..79405ec Binary files /dev/null and b/effect/xuwuzhiyan/white/1b.vpcf_c differ diff --git a/effect/xuwuzhiyan/white/1c.vpcf_c b/effect/xuwuzhiyan/white/1c.vpcf_c new file mode 100755 index 0000000..2b4b256 Binary files /dev/null and b/effect/xuwuzhiyan/white/1c.vpcf_c differ diff --git a/effect/xuwuzhiyan/white/1d.vpcf_c b/effect/xuwuzhiyan/white/1d.vpcf_c new file mode 100755 index 0000000..5c0c1d9 Binary files /dev/null and b/effect/xuwuzhiyan/white/1d.vpcf_c differ diff --git a/effect/xuwuzhiyan/yellow/1.vpcf_c b/effect/xuwuzhiyan/yellow/1.vpcf_c new file mode 100755 index 0000000..64a879f Binary files /dev/null and b/effect/xuwuzhiyan/yellow/1.vpcf_c differ diff --git a/effect/xuwuzhiyan/yellow/1b.vpcf_c b/effect/xuwuzhiyan/yellow/1b.vpcf_c new file mode 100755 index 0000000..26d19a5 Binary files /dev/null and b/effect/xuwuzhiyan/yellow/1b.vpcf_c differ diff --git a/effect/xuwuzhiyan/yellow/1c.vpcf_c b/effect/xuwuzhiyan/yellow/1c.vpcf_c new file mode 100755 index 0000000..b7f2a2e Binary files /dev/null and b/effect/xuwuzhiyan/yellow/1c.vpcf_c differ diff --git a/effect/xuwuzhiyan/yellow/1d.vpcf_c b/effect/xuwuzhiyan/yellow/1d.vpcf_c new file mode 100755 index 0000000..32916a7 Binary files /dev/null and b/effect/xuwuzhiyan/yellow/1d.vpcf_c differ diff --git a/effect/yuhuofenshen/1_2.vpcf_c b/effect/yuhuofenshen/1_2.vpcf_c new file mode 100755 index 0000000..4dff403 Binary files /dev/null and b/effect/yuhuofenshen/1_2.vpcf_c differ diff --git a/effect/yuhuofenshen/1_2_embers.vpcf_c b/effect/yuhuofenshen/1_2_embers.vpcf_c new file mode 100755 index 0000000..01e1286 Binary files /dev/null and b/effect/yuhuofenshen/1_2_embers.vpcf_c differ diff --git a/effect/yuhuofenshen/1_2_smallflame.vpcf_c b/effect/yuhuofenshen/1_2_smallflame.vpcf_c new file mode 100755 index 0000000..509d63b Binary files /dev/null and b/effect/yuhuofenshen/1_2_smallflame.vpcf_c differ diff --git a/effect/yuhuofenshen/1_2_tallflame.vpcf_c b/effect/yuhuofenshen/1_2_tallflame.vpcf_c new file mode 100755 index 0000000..820bec7 Binary files /dev/null and b/effect/yuhuofenshen/1_2_tallflame.vpcf_c differ diff --git a/effect/yuhuofenshen/1_2_tallflamedark.vpcf_c b/effect/yuhuofenshen/1_2_tallflamedark.vpcf_c new file mode 100755 index 0000000..ff284c5 Binary files /dev/null and b/effect/yuhuofenshen/1_2_tallflamedark.vpcf_c differ diff --git a/effect/yumao/1.vpcf_c b/effect/yumao/1.vpcf_c new file mode 100755 index 0000000..7c40ecd Binary files /dev/null and b/effect/yumao/1.vpcf_c differ diff --git a/effect/yumao/1_death.vpcf_c b/effect/yumao/1_death.vpcf_c new file mode 100755 index 0000000..24958b2 Binary files /dev/null and b/effect/yumao/1_death.vpcf_c differ diff --git a/effect/yumao/1_death_b.vpcf_c b/effect/yumao/1_death_b.vpcf_c new file mode 100755 index 0000000..631dc68 Binary files /dev/null and b/effect/yumao/1_death_b.vpcf_c differ diff --git a/effect/zeus/victory/victory.vpcf_c b/effect/zeus/victory/victory.vpcf_c new file mode 100755 index 0000000..b9ddb2a Binary files /dev/null and b/effect/zeus/victory/victory.vpcf_c differ diff --git a/effect/zeus/victory/victory_burst.vpcf_c b/effect/zeus/victory/victory_burst.vpcf_c new file mode 100755 index 0000000..e013d0d Binary files /dev/null and b/effect/zeus/victory/victory_burst.vpcf_c differ diff --git a/effect/zeus/victory/victory_text.vpcf_c b/effect/zeus/victory/victory_text.vpcf_c new file mode 100755 index 0000000..4cb6f98 Binary files /dev/null and b/effect/zeus/victory/victory_text.vpcf_c differ diff --git a/effect/zeus/victory/victory_text_glow.vpcf_c b/effect/zeus/victory/victory_text_glow.vpcf_c new file mode 100755 index 0000000..cb67daf Binary files /dev/null and b/effect/zeus/victory/victory_text_glow.vpcf_c differ diff --git a/effect/zeus/victory/winner_magic.vpcf_c b/effect/zeus/victory/winner_magic.vpcf_c new file mode 100755 index 0000000..445d9fc Binary files /dev/null and b/effect/zeus/victory/winner_magic.vpcf_c differ diff --git a/effect/zeus/victory/winner_rays.vpcf_c b/effect/zeus/victory/winner_rays.vpcf_c new file mode 100755 index 0000000..7ecbcf6 Binary files /dev/null and b/effect/zeus/victory/winner_rays.vpcf_c differ diff --git a/effect/zeus/winner/dizuo/1.vpcf_c b/effect/zeus/winner/dizuo/1.vpcf_c new file mode 100755 index 0000000..43c2596 Binary files /dev/null and b/effect/zeus/winner/dizuo/1.vpcf_c differ diff --git a/effect/zeus/winner/victory.vpcf_c b/effect/zeus/winner/victory.vpcf_c new file mode 100755 index 0000000..1144b14 Binary files /dev/null and b/effect/zeus/winner/victory.vpcf_c differ diff --git a/effect/zeus/winner/victory_burst.vpcf_c b/effect/zeus/winner/victory_burst.vpcf_c new file mode 100755 index 0000000..6478a78 Binary files /dev/null and b/effect/zeus/winner/victory_burst.vpcf_c differ diff --git a/effect/zeus/winner/victory_text.vpcf_c b/effect/zeus/winner/victory_text.vpcf_c new file mode 100755 index 0000000..d3e6ad1 Binary files /dev/null and b/effect/zeus/winner/victory_text.vpcf_c differ diff --git a/effect/zeus/winner/victory_text_glow.vpcf_c b/effect/zeus/winner/victory_text_glow.vpcf_c new file mode 100755 index 0000000..faccab4 Binary files /dev/null and b/effect/zeus/winner/victory_text_glow.vpcf_c differ diff --git a/effect/zeus/winner/winner_magic.vpcf_c b/effect/zeus/winner/winner_magic.vpcf_c new file mode 100755 index 0000000..adcb4d7 Binary files /dev/null and b/effect/zeus/winner/winner_magic.vpcf_c differ diff --git a/effect/zeus/winner/winner_rays.vpcf_c b/effect/zeus/winner/winner_rays.vpcf_c new file mode 100755 index 0000000..a2ad721 Binary files /dev/null and b/effect/zeus/winner/winner_rays.vpcf_c differ diff --git a/effect/zeus/winner/zhanshi/1_glow.vpcf_c b/effect/zeus/winner/zhanshi/1_glow.vpcf_c new file mode 100755 index 0000000..4e63d6b Binary files /dev/null and b/effect/zeus/winner/zhanshi/1_glow.vpcf_c differ diff --git a/effect/zhanshi/1.vpcf_c b/effect/zhanshi/1.vpcf_c new file mode 100755 index 0000000..25f8abb Binary files /dev/null and b/effect/zhanshi/1.vpcf_c differ diff --git a/effect/zhanshi/1_glow.vpcf_c b/effect/zhanshi/1_glow.vpcf_c new file mode 100755 index 0000000..0311b5a Binary files /dev/null and b/effect/zhanshi/1_glow.vpcf_c differ diff --git a/effect/zisexingyun_2/ti7glow.vpcf_c b/effect/zisexingyun_2/ti7glow.vpcf_c new file mode 100755 index 0000000..4fdca6d Binary files /dev/null and b/effect/zisexingyun_2/ti7glow.vpcf_c differ diff --git a/effect/zisexingyun_2/ti7rays.vpcf_c b/effect/zisexingyun_2/ti7rays.vpcf_c new file mode 100755 index 0000000..dd38a44 Binary files /dev/null and b/effect/zisexingyun_2/ti7rays.vpcf_c differ diff --git a/effect/zisexingyun_2/ti7secondary.vpcf_c b/effect/zisexingyun_2/ti7secondary.vpcf_c new file mode 100755 index 0000000..4e06e0f Binary files /dev/null and b/effect/zisexingyun_2/ti7secondary.vpcf_c differ diff --git a/effect/zisexingyun_2/ti7secondary_flare.vpcf_c b/effect/zisexingyun_2/ti7secondary_flare.vpcf_c new file mode 100755 index 0000000..a80b94a Binary files /dev/null and b/effect/zisexingyun_2/ti7secondary_flare.vpcf_c differ diff --git a/effect/zisexingyun_2/ti7trail_secondary.vpcf_c b/effect/zisexingyun_2/ti7trail_secondary.vpcf_c new file mode 100755 index 0000000..4782c9f Binary files /dev/null and b/effect/zisexingyun_2/ti7trail_secondary.vpcf_c differ diff --git a/effects/bianpaobig_explosion.vpcf_c b/effects/bianpaobig_explosion.vpcf_c new file mode 100755 index 0000000..21e0f6c Binary files /dev/null and b/effects/bianpaobig_explosion.vpcf_c differ diff --git a/effects/bianpaobig_explosion_trail.vpcf_c b/effects/bianpaobig_explosion_trail.vpcf_c new file mode 100755 index 0000000..ef70404 Binary files /dev/null and b/effects/bianpaobig_explosion_trail.vpcf_c differ diff --git a/effects/bianpaofireworks.vpcf_c b/effects/bianpaofireworks.vpcf_c new file mode 100755 index 0000000..186ccba Binary files /dev/null and b/effects/bianpaofireworks.vpcf_c differ diff --git a/effects/bianpaofireworks_b.vpcf_c b/effects/bianpaofireworks_b.vpcf_c new file mode 100755 index 0000000..527f6fc Binary files /dev/null and b/effects/bianpaofireworks_b.vpcf_c differ diff --git a/effects/bianpaofireworks_explosion_b.vpcf_c b/effects/bianpaofireworks_explosion_b.vpcf_c new file mode 100755 index 0000000..7bbcb10 Binary files /dev/null and b/effects/bianpaofireworks_explosion_b.vpcf_c differ diff --git a/effects/bianpaofireworks_explosion_c.vpcf_c b/effects/bianpaofireworks_explosion_c.vpcf_c new file mode 100755 index 0000000..c8f19c3 Binary files /dev/null and b/effects/bianpaofireworks_explosion_c.vpcf_c differ diff --git a/effects/bianpaofireworks_explosion_d.vpcf_c b/effects/bianpaofireworks_explosion_d.vpcf_c new file mode 100755 index 0000000..b4ddde7 Binary files /dev/null and b/effects/bianpaofireworks_explosion_d.vpcf_c differ diff --git a/effects/bianpaofireworks_fuse_sparks.vpcf_c b/effects/bianpaofireworks_fuse_sparks.vpcf_c new file mode 100755 index 0000000..a874459 Binary files /dev/null and b/effects/bianpaofireworks_fuse_sparks.vpcf_c differ diff --git a/effects/bianpaofireworks_fuse_sparks_b.vpcf_c b/effects/bianpaofireworks_fuse_sparks_b.vpcf_c new file mode 100755 index 0000000..62ae204 Binary files /dev/null and b/effects/bianpaofireworks_fuse_sparks_b.vpcf_c differ diff --git a/effects/bianpaofireworks_fuse_sparks_c.vpcf_c b/effects/bianpaofireworks_fuse_sparks_c.vpcf_c new file mode 100755 index 0000000..a4f576e Binary files /dev/null and b/effects/bianpaofireworks_fuse_sparks_c.vpcf_c differ diff --git a/effects/bianpaofireworks_fuse_sparks_d.vpcf_c b/effects/bianpaofireworks_fuse_sparks_d.vpcf_c new file mode 100755 index 0000000..6fc7d78 Binary files /dev/null and b/effects/bianpaofireworks_fuse_sparks_d.vpcf_c differ diff --git a/effects/bianpaofireworks_special.vpcf_c b/effects/bianpaofireworks_special.vpcf_c new file mode 100755 index 0000000..f40a43f Binary files /dev/null and b/effects/bianpaofireworks_special.vpcf_c differ diff --git a/effects/damage.vpcf_c b/effects/damage.vpcf_c new file mode 100755 index 0000000..ac210b7 Binary files /dev/null and b/effects/damage.vpcf_c differ diff --git a/effects/damage2.vpcf_c b/effects/damage2.vpcf_c new file mode 100755 index 0000000..a06fdf7 Binary files /dev/null and b/effects/damage2.vpcf_c differ diff --git a/effects/damage3.vpcf_c b/effects/damage3.vpcf_c new file mode 100755 index 0000000..e38e980 Binary files /dev/null and b/effects/damage3.vpcf_c differ diff --git a/effects/flag.vpcf_c b/effects/flag.vpcf_c new file mode 100755 index 0000000..4eb85c8 Binary files /dev/null and b/effects/flag.vpcf_c differ diff --git a/effects/hunluan/c.vpcf_c b/effects/hunluan/c.vpcf_c new file mode 100755 index 0000000..4ee4c53 Binary files /dev/null and b/effects/hunluan/c.vpcf_c differ diff --git a/effects/hunluan/old.vpcf_c b/effects/hunluan/old.vpcf_c new file mode 100755 index 0000000..d8386d2 Binary files /dev/null and b/effects/hunluan/old.vpcf_c differ diff --git a/effects/x.vpcf_c b/effects/x.vpcf_c new file mode 100755 index 0000000..71d83a5 Binary files /dev/null and b/effects/x.vpcf_c differ diff --git a/maps/td/attacking_process.vpk b/maps/td/attacking_process.vpk new file mode 100755 index 0000000..076ee94 Binary files /dev/null and b/maps/td/attacking_process.vpk differ diff --git a/maps/td/card.vpk b/maps/td/card.vpk new file mode 100755 index 0000000..da7c61e Binary files /dev/null and b/maps/td/card.vpk differ diff --git a/maps/td/clicked_test.vpk b/maps/td/clicked_test.vpk new file mode 100755 index 0000000..1988783 Binary files /dev/null and b/maps/td/clicked_test.vpk differ diff --git a/maps/td/draw_card.vpk b/maps/td/draw_card.vpk new file mode 100755 index 0000000..9965e1f Binary files /dev/null and b/maps/td/draw_card.vpk differ diff --git a/maps/td/loading.vpk b/maps/td/loading.vpk new file mode 100755 index 0000000..60f2190 Binary files /dev/null and b/maps/td/loading.vpk differ diff --git a/maps/td/selected_card.vpk b/maps/td/selected_card.vpk new file mode 100755 index 0000000..51cfedc Binary files /dev/null and b/maps/td/selected_card.vpk differ diff --git a/maps/touhoutd.vpk b/maps/touhoutd.vpk new file mode 100755 index 0000000..a696a77 Binary files /dev/null and b/maps/touhoutd.vpk differ diff --git a/materials/asset/texture/brick/brick_01/brick_01.vmat_c b/materials/asset/texture/brick/brick_01/brick_01.vmat_c new file mode 100755 index 0000000..c78d45b Binary files /dev/null and b/materials/asset/texture/brick/brick_01/brick_01.vmat_c differ diff --git a/materials/asset/texture/brick/brick_01/brick_01_tga_9c071719.vtex_c b/materials/asset/texture/brick/brick_01/brick_01_tga_9c071719.vtex_c new file mode 100755 index 0000000..2aa9745 Binary files /dev/null and b/materials/asset/texture/brick/brick_01/brick_01_tga_9c071719.vtex_c differ diff --git a/materials/asset/texture/wood/wood_02/wood_02.vmat_c b/materials/asset/texture/wood/wood_02/wood_02.vmat_c new file mode 100755 index 0000000..abd6d3b Binary files /dev/null and b/materials/asset/texture/wood/wood_02/wood_02.vmat_c differ diff --git a/materials/asset/texture/wood/wood_02/wood_02_color_tga_3c43b04.vtex_c b/materials/asset/texture/wood/wood_02/wood_02_color_tga_3c43b04.vtex_c new file mode 100755 index 0000000..30a1c3d Binary files /dev/null and b/materials/asset/texture/wood/wood_02/wood_02_color_tga_3c43b04.vtex_c differ diff --git a/materials/asset/texture/wood/wood_02/wood_02_color_tga_acabbf62.vtex_c b/materials/asset/texture/wood/wood_02/wood_02_color_tga_acabbf62.vtex_c new file mode 100755 index 0000000..f1d8cb9 Binary files /dev/null and b/materials/asset/texture/wood/wood_02/wood_02_color_tga_acabbf62.vtex_c differ diff --git a/materials/default/default_color_tga_41192599.vtex_c b/materials/default/default_color_tga_41192599.vtex_c new file mode 100755 index 0000000..9e3f7c8 Binary files /dev/null and b/materials/default/default_color_tga_41192599.vtex_c differ diff --git a/materials/default/default_colorwarp3d_z000_tga_8805a83f.vtex_c b/materials/default/default_colorwarp3d_z000_tga_8805a83f.vtex_c new file mode 100755 index 0000000..37eadf1 Binary files /dev/null and b/materials/default/default_colorwarp3d_z000_tga_8805a83f.vtex_c differ diff --git a/materials/default/default_detail_tga_d55685d8.vtex_c b/materials/default/default_detail_tga_d55685d8.vtex_c new file mode 100755 index 0000000..9d55667 Binary files /dev/null and b/materials/default/default_detail_tga_d55685d8.vtex_c differ diff --git a/materials/default/default_detailmask_tga_4450da58.vtex_c b/materials/default/default_detailmask_tga_4450da58.vtex_c new file mode 100755 index 0000000..bac7794 Binary files /dev/null and b/materials/default/default_detailmask_tga_4450da58.vtex_c differ diff --git a/materials/default/default_fresnelwarprim_tga_d9279d65.vtex_c b/materials/default/default_fresnelwarprim_tga_d9279d65.vtex_c new file mode 100755 index 0000000..83b1e43 Binary files /dev/null and b/materials/default/default_fresnelwarprim_tga_d9279d65.vtex_c differ diff --git a/materials/default/default_normal_tga_7652cb.vtex_c b/materials/default/default_normal_tga_7652cb.vtex_c new file mode 100755 index 0000000..d9b396a Binary files /dev/null and b/materials/default/default_normal_tga_7652cb.vtex_c differ diff --git a/materials/default/default_refl_tga_c1b9c83e.vtex_c b/materials/default/default_refl_tga_c1b9c83e.vtex_c new file mode 100755 index 0000000..bdd0056 Binary files /dev/null and b/materials/default/default_refl_tga_c1b9c83e.vtex_c differ diff --git a/materials/default/default_specmask_tga_885e1d6b.vtex_c b/materials/default/default_specmask_tga_885e1d6b.vtex_c new file mode 100755 index 0000000..f6017bf Binary files /dev/null and b/materials/default/default_specmask_tga_885e1d6b.vtex_c differ diff --git a/materials/default/default_specwarp_tga_436583b9.vtex_c b/materials/default/default_specwarp_tga_436583b9.vtex_c new file mode 100755 index 0000000..ba1a3af Binary files /dev/null and b/materials/default/default_specwarp_tga_436583b9.vtex_c differ diff --git a/materials/default/default_tga_f335a1f7.vtex_c b/materials/default/default_tga_f335a1f7.vtex_c new file mode 100755 index 0000000..1f4784b Binary files /dev/null and b/materials/default/default_tga_f335a1f7.vtex_c differ diff --git a/materials/heroes/juggernaut/box.vmat_c b/materials/heroes/juggernaut/box.vmat_c new file mode 100755 index 0000000..1fb5a09 Binary files /dev/null and b/materials/heroes/juggernaut/box.vmat_c differ diff --git a/materials/heroes/juggernaut/box_tga_7717c9a9.vtex_c b/materials/heroes/juggernaut/box_tga_7717c9a9.vtex_c new file mode 100755 index 0000000..028a35f Binary files /dev/null and b/materials/heroes/juggernaut/box_tga_7717c9a9.vtex_c differ diff --git a/materials/heroes/juggernaut/hg.vmat_c b/materials/heroes/juggernaut/hg.vmat_c new file mode 100755 index 0000000..049e2c1 Binary files /dev/null and b/materials/heroes/juggernaut/hg.vmat_c differ diff --git a/materials/heroes/juggernaut/hg_tga_5a3a1c0a.vtex_c b/materials/heroes/juggernaut/hg_tga_5a3a1c0a.vtex_c new file mode 100755 index 0000000..d6d715b Binary files /dev/null and b/materials/heroes/juggernaut/hg_tga_5a3a1c0a.vtex_c differ diff --git a/materials/heroes/juggernaut/okita.vmat_c b/materials/heroes/juggernaut/okita.vmat_c new file mode 100755 index 0000000..24962a9 Binary files /dev/null and b/materials/heroes/juggernaut/okita.vmat_c differ diff --git a/materials/heroes/juggernaut/okita_tga_bb36db39.vtex_c b/materials/heroes/juggernaut/okita_tga_bb36db39.vtex_c new file mode 100755 index 0000000..012ce05 Binary files /dev/null and b/materials/heroes/juggernaut/okita_tga_bb36db39.vtex_c differ diff --git a/materials/heroes/juggernaut/okitas.vmat_c b/materials/heroes/juggernaut/okitas.vmat_c new file mode 100755 index 0000000..220ca5b Binary files /dev/null and b/materials/heroes/juggernaut/okitas.vmat_c differ diff --git a/materials/heroes/juggernaut/okitas_tga_ee2bca57.vtex_c b/materials/heroes/juggernaut/okitas_tga_ee2bca57.vtex_c new file mode 100755 index 0000000..63c82cd Binary files /dev/null and b/materials/heroes/juggernaut/okitas_tga_ee2bca57.vtex_c differ diff --git a/materials/heroes/juggernaut/pink.vmat_c b/materials/heroes/juggernaut/pink.vmat_c new file mode 100755 index 0000000..234a4b4 Binary files /dev/null and b/materials/heroes/juggernaut/pink.vmat_c differ diff --git a/materials/heroes/juggernaut/pink_vmat_g_tcolor_4ba2bf51.vtex_c b/materials/heroes/juggernaut/pink_vmat_g_tcolor_4ba2bf51.vtex_c new file mode 100755 index 0000000..0acd1f7 Binary files /dev/null and b/materials/heroes/juggernaut/pink_vmat_g_tcolor_4ba2bf51.vtex_c differ diff --git a/materials/heroes/juggernaut/wings.vmat_c b/materials/heroes/juggernaut/wings.vmat_c new file mode 100755 index 0000000..3142292 Binary files /dev/null and b/materials/heroes/juggernaut/wings.vmat_c differ diff --git a/materials/heroes/juggernaut/wings_tga_3850a93a.vtex_c b/materials/heroes/juggernaut/wings_tga_3850a93a.vtex_c new file mode 100755 index 0000000..f5f16b7 Binary files /dev/null and b/materials/heroes/juggernaut/wings_tga_3850a93a.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01.vmat_c b/materials/imagine_assets/props/chest/chest_01.vmat_c new file mode 100755 index 0000000..0eb4858 Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01.vmat_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_bronze.vmat_c b/materials/imagine_assets/props/chest/chest_01_bronze.vmat_c new file mode 100755 index 0000000..9dcf0d8 Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_bronze.vmat_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_bronze_color_tga_31da0981.vtex_c b/materials/imagine_assets/props/chest/chest_01_bronze_color_tga_31da0981.vtex_c new file mode 100755 index 0000000..d580eaa Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_bronze_color_tga_31da0981.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_bronze_vmat_g_tmasks1_45a958f.vtex_c b/materials/imagine_assets/props/chest/chest_01_bronze_vmat_g_tmasks1_45a958f.vtex_c new file mode 100755 index 0000000..c7434bc Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_bronze_vmat_g_tmasks1_45a958f.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_color_tga_fc14bd8c.vtex_c b/materials/imagine_assets/props/chest/chest_01_color_tga_fc14bd8c.vtex_c new file mode 100755 index 0000000..e54d487 Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_color_tga_fc14bd8c.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_gold.vmat_c b/materials/imagine_assets/props/chest/chest_01_gold.vmat_c new file mode 100755 index 0000000..df381ab Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_gold.vmat_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_gold_color_tga_34becef5.vtex_c b/materials/imagine_assets/props/chest/chest_01_gold_color_tga_34becef5.vtex_c new file mode 100755 index 0000000..23358ac Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_gold_color_tga_34becef5.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_gold_normal_tga_d938e704.vtex_c b/materials/imagine_assets/props/chest/chest_01_gold_normal_tga_d938e704.vtex_c new file mode 100755 index 0000000..4474016 Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_gold_normal_tga_d938e704.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_gold_vmat_g_tmasks1_45a958f.vtex_c b/materials/imagine_assets/props/chest/chest_01_gold_vmat_g_tmasks1_45a958f.vtex_c new file mode 100755 index 0000000..c7434bc Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_gold_vmat_g_tmasks1_45a958f.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_metal_specmask_tga_183eb1a1.vtex_c b/materials/imagine_assets/props/chest/chest_01_metal_specmask_tga_183eb1a1.vtex_c new file mode 100755 index 0000000..682606b Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_metal_specmask_tga_183eb1a1.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_metal_specmask_tga_62c04ebc.vtex_c b/materials/imagine_assets/props/chest/chest_01_metal_specmask_tga_62c04ebc.vtex_c new file mode 100755 index 0000000..aeefb51 Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_metal_specmask_tga_62c04ebc.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_metal_specmask_tga_7e500845.vtex_c b/materials/imagine_assets/props/chest/chest_01_metal_specmask_tga_7e500845.vtex_c new file mode 100755 index 0000000..9619f13 Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_metal_specmask_tga_7e500845.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_metal_specmask_tga_cfe904d7.vtex_c b/materials/imagine_assets/props/chest/chest_01_metal_specmask_tga_cfe904d7.vtex_c new file mode 100755 index 0000000..eca0861 Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_metal_specmask_tga_cfe904d7.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_sliver_vmat_g_tmasks1_45a958f.vtex_c b/materials/imagine_assets/props/chest/chest_01_sliver_vmat_g_tmasks1_45a958f.vtex_c new file mode 100755 index 0000000..c7434bc Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_sliver_vmat_g_tmasks1_45a958f.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_vmat_g_tmasks1_45a958f.vtex_c b/materials/imagine_assets/props/chest/chest_01_vmat_g_tmasks1_45a958f.vtex_c new file mode 100755 index 0000000..c7434bc Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_vmat_g_tmasks1_45a958f.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_01_wood_vmat_g_tmasks1_45a958f.vtex_c b/materials/imagine_assets/props/chest/chest_01_wood_vmat_g_tmasks1_45a958f.vtex_c new file mode 100755 index 0000000..c7434bc Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_01_wood_vmat_g_tmasks1_45a958f.vtex_c differ diff --git a/materials/imagine_assets/props/chest/chest_key_01.vmat_c b/materials/imagine_assets/props/chest/chest_key_01.vmat_c new file mode 100755 index 0000000..b840652 Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_key_01.vmat_c differ diff --git a/materials/imagine_assets/props/chest/chest_key_01_color_tga_2aeff4bf.vtex_c b/materials/imagine_assets/props/chest/chest_key_01_color_tga_2aeff4bf.vtex_c new file mode 100755 index 0000000..4b3d283 Binary files /dev/null and b/materials/imagine_assets/props/chest/chest_key_01_color_tga_2aeff4bf.vtex_c differ diff --git a/materials/masterspark.vmat_c b/materials/masterspark.vmat_c new file mode 100755 index 0000000..7ea50f3 Binary files /dev/null and b/materials/masterspark.vmat_c differ diff --git a/materials/masterspark_tga_17e3888e.vtex_c b/materials/masterspark_tga_17e3888e.vtex_c new file mode 100755 index 0000000..0c3f13f Binary files /dev/null and b/materials/masterspark_tga_17e3888e.vtex_c differ diff --git a/materials/masterspark_tga_5fc9d3e6.vtex_c b/materials/masterspark_tga_5fc9d3e6.vtex_c new file mode 100755 index 0000000..6946b2d Binary files /dev/null and b/materials/masterspark_tga_5fc9d3e6.vtex_c differ diff --git a/materials/masterspark_tga_6e064aa7.vtex_c b/materials/masterspark_tga_6e064aa7.vtex_c new file mode 100755 index 0000000..201bc88 Binary files /dev/null and b/materials/masterspark_tga_6e064aa7.vtex_c differ diff --git a/materials/masterspark_tga_eaa038d1.vtex_c b/materials/masterspark_tga_eaa038d1.vtex_c new file mode 100755 index 0000000..474bd73 Binary files /dev/null and b/materials/masterspark_tga_eaa038d1.vtex_c differ diff --git a/materials/masterspark_tga_f50cfc42.vtex_c b/materials/masterspark_tga_f50cfc42.vtex_c new file mode 100755 index 0000000..da14edd Binary files /dev/null and b/materials/masterspark_tga_f50cfc42.vtex_c differ diff --git a/materials/models/blsss.vmat_c b/materials/models/blsss.vmat_c new file mode 100755 index 0000000..c145c5c Binary files /dev/null and b/materials/models/blsss.vmat_c differ diff --git a/materials/models/blsss_01.vmat_c b/materials/models/blsss_01.vmat_c new file mode 100755 index 0000000..a6c752d Binary files /dev/null and b/materials/models/blsss_01.vmat_c differ diff --git a/materials/models/blsss_tga_314c9efd.vtex_c b/materials/models/blsss_tga_314c9efd.vtex_c new file mode 100755 index 0000000..8cede51 Binary files /dev/null and b/materials/models/blsss_tga_314c9efd.vtex_c differ diff --git a/materials/models/blsss_tga_de8c6b76.vtex_c b/materials/models/blsss_tga_de8c6b76.vtex_c new file mode 100755 index 0000000..d78a721 Binary files /dev/null and b/materials/models/blsss_tga_de8c6b76.vtex_c differ diff --git a/materials/models/cages/cages.vmat_c b/materials/models/cages/cages.vmat_c new file mode 100755 index 0000000..d83d298 Binary files /dev/null and b/materials/models/cages/cages.vmat_c differ diff --git a/materials/models/cages/cages_n_tga_d714a642.vtex_c b/materials/models/cages/cages_n_tga_d714a642.vtex_c new file mode 100755 index 0000000..2a9a824 Binary files /dev/null and b/materials/models/cages/cages_n_tga_d714a642.vtex_c differ diff --git a/materials/models/cages/cages_tga_f28a30e2.vtex_c b/materials/models/cages/cages_tga_f28a30e2.vtex_c new file mode 100755 index 0000000..a8c7b4a Binary files /dev/null and b/materials/models/cages/cages_tga_f28a30e2.vtex_c differ diff --git a/materials/models/cubemaps/crimson_pique_glass_cube_psd_40e56d80.vtex_c b/materials/models/cubemaps/crimson_pique_glass_cube_psd_40e56d80.vtex_c new file mode 100755 index 0000000..b5147fc Binary files /dev/null and b/materials/models/cubemaps/crimson_pique_glass_cube_psd_40e56d80.vtex_c differ diff --git a/materials/models/cubemaps/cube_legion_commander_cube_tga_3cd63b2e.vtex_c b/materials/models/cubemaps/cube_legion_commander_cube_tga_3cd63b2e.vtex_c new file mode 100755 index 0000000..4067f35 Binary files /dev/null and b/materials/models/cubemaps/cube_legion_commander_cube_tga_3cd63b2e.vtex_c differ diff --git a/materials/models/cubemaps/glossy_blue_cube_tga_bee8895f.vtex_c b/materials/models/cubemaps/glossy_blue_cube_tga_bee8895f.vtex_c new file mode 100755 index 0000000..8bba234 Binary files /dev/null and b/materials/models/cubemaps/glossy_blue_cube_tga_bee8895f.vtex_c differ diff --git a/materials/models/cubemaps/glossy_orange_cube_tga_77c22107.vtex_c b/materials/models/cubemaps/glossy_orange_cube_tga_77c22107.vtex_c new file mode 100755 index 0000000..bc9c896 Binary files /dev/null and b/materials/models/cubemaps/glossy_orange_cube_tga_77c22107.vtex_c differ diff --git a/materials/models/drill_tga_56ca9ca9.vtex_c b/materials/models/drill_tga_56ca9ca9.vtex_c new file mode 100755 index 0000000..7c8c150 Binary files /dev/null and b/materials/models/drill_tga_56ca9ca9.vtex_c differ diff --git a/materials/models/heroes/bane/body.vmat_c b/materials/models/heroes/bane/body.vmat_c new file mode 100755 index 0000000..f634f1a Binary files /dev/null and b/materials/models/heroes/bane/body.vmat_c differ diff --git a/materials/models/heroes/bane/body_tga_24e274b4.vtex_c b/materials/models/heroes/bane/body_tga_24e274b4.vtex_c new file mode 100755 index 0000000..6d5115e Binary files /dev/null and b/materials/models/heroes/bane/body_tga_24e274b4.vtex_c differ diff --git a/materials/models/heroes/bane/body_tga_af8b0fa5.vtex_c b/materials/models/heroes/bane/body_tga_af8b0fa5.vtex_c new file mode 100755 index 0000000..2f0349a Binary files /dev/null and b/materials/models/heroes/bane/body_tga_af8b0fa5.vtex_c differ diff --git a/materials/models/heroes/bane/eye.vmat_c b/materials/models/heroes/bane/eye.vmat_c new file mode 100755 index 0000000..08ae92b Binary files /dev/null and b/materials/models/heroes/bane/eye.vmat_c differ diff --git a/materials/models/heroes/bane/eye_tga_3e583d56.vtex_c b/materials/models/heroes/bane/eye_tga_3e583d56.vtex_c new file mode 100755 index 0000000..0ee11d0 Binary files /dev/null and b/materials/models/heroes/bane/eye_tga_3e583d56.vtex_c differ diff --git a/materials/models/heroes/bane/eye_tga_bf02ab48.vtex_c b/materials/models/heroes/bane/eye_tga_bf02ab48.vtex_c new file mode 100755 index 0000000..3fdd1f2 Binary files /dev/null and b/materials/models/heroes/bane/eye_tga_bf02ab48.vtex_c differ diff --git a/materials/models/heroes/bane/face.vmat_c b/materials/models/heroes/bane/face.vmat_c new file mode 100755 index 0000000..4ccaba4 Binary files /dev/null and b/materials/models/heroes/bane/face.vmat_c differ diff --git a/materials/models/heroes/bane/face_tga_a43bddd9.vtex_c b/materials/models/heroes/bane/face_tga_a43bddd9.vtex_c new file mode 100755 index 0000000..65a8ab4 Binary files /dev/null and b/materials/models/heroes/bane/face_tga_a43bddd9.vtex_c differ diff --git a/materials/models/heroes/bane/face_tga_d3376eba.vtex_c b/materials/models/heroes/bane/face_tga_d3376eba.vtex_c new file mode 100755 index 0000000..7f97bf9 Binary files /dev/null and b/materials/models/heroes/bane/face_tga_d3376eba.vtex_c differ diff --git a/materials/models/heroes/bane/hair.vmat_c b/materials/models/heroes/bane/hair.vmat_c new file mode 100755 index 0000000..c8f8795 Binary files /dev/null and b/materials/models/heroes/bane/hair.vmat_c differ diff --git a/materials/models/heroes/bane/hair_tga_d9f07610.vtex_c b/materials/models/heroes/bane/hair_tga_d9f07610.vtex_c new file mode 100755 index 0000000..7b7f696 Binary files /dev/null and b/materials/models/heroes/bane/hair_tga_d9f07610.vtex_c differ diff --git a/materials/models/heroes/bane/hair_tga_f54a1639.vtex_c b/materials/models/heroes/bane/hair_tga_f54a1639.vtex_c new file mode 100755 index 0000000..ebfe94b Binary files /dev/null and b/materials/models/heroes/bane/hair_tga_f54a1639.vtex_c differ diff --git a/materials/models/heroes/bane/mary.vmat_c b/materials/models/heroes/bane/mary.vmat_c new file mode 100755 index 0000000..32b443e Binary files /dev/null and b/materials/models/heroes/bane/mary.vmat_c differ diff --git a/materials/models/heroes/bane/mary_tga_27f95543.vtex_c b/materials/models/heroes/bane/mary_tga_27f95543.vtex_c new file mode 100755 index 0000000..a961421 Binary files /dev/null and b/materials/models/heroes/bane/mary_tga_27f95543.vtex_c differ diff --git a/materials/models/heroes/bane/mary_tga_6b349491.vtex_c b/materials/models/heroes/bane/mary_tga_6b349491.vtex_c new file mode 100755 index 0000000..7282b9b Binary files /dev/null and b/materials/models/heroes/bane/mary_tga_6b349491.vtex_c differ diff --git a/materials/models/heroes/bane/swim.vmat_c b/materials/models/heroes/bane/swim.vmat_c new file mode 100755 index 0000000..d163b23 Binary files /dev/null and b/materials/models/heroes/bane/swim.vmat_c differ diff --git a/materials/models/heroes/bane/swim_tga_146e2248.vtex_c b/materials/models/heroes/bane/swim_tga_146e2248.vtex_c new file mode 100755 index 0000000..ebcd41e Binary files /dev/null and b/materials/models/heroes/bane/swim_tga_146e2248.vtex_c differ diff --git a/materials/models/heroes/bane/swim_tga_e60c2e17.vtex_c b/materials/models/heroes/bane/swim_tga_e60c2e17.vtex_c new file mode 100755 index 0000000..445fd51 Binary files /dev/null and b/materials/models/heroes/bane/swim_tga_e60c2e17.vtex_c differ diff --git a/materials/models/heroes/bane/wear.vmat_c b/materials/models/heroes/bane/wear.vmat_c new file mode 100755 index 0000000..be6c192 Binary files /dev/null and b/materials/models/heroes/bane/wear.vmat_c differ diff --git a/materials/models/heroes/bane/wear_tga_7358175e.vtex_c b/materials/models/heroes/bane/wear_tga_7358175e.vtex_c new file mode 100755 index 0000000..e8b6010 Binary files /dev/null and b/materials/models/heroes/bane/wear_tga_7358175e.vtex_c differ diff --git a/materials/models/heroes/bane/wear_tga_eeac87a7.vtex_c b/materials/models/heroes/bane/wear_tga_eeac87a7.vtex_c new file mode 100755 index 0000000..6af4c70 Binary files /dev/null and b/materials/models/heroes/bane/wear_tga_eeac87a7.vtex_c differ diff --git a/materials/models/heroes/slardar/slardar_fresnelwarprim_tga_b77d0609.vtex_c b/materials/models/heroes/slardar/slardar_fresnelwarprim_tga_b77d0609.vtex_c new file mode 100755 index 0000000..91809d5 Binary files /dev/null and b/materials/models/heroes/slardar/slardar_fresnelwarprim_tga_b77d0609.vtex_c differ diff --git a/materials/models/iku_lightning_drill_1.vmat_c b/materials/models/iku_lightning_drill_1.vmat_c new file mode 100755 index 0000000..321b2e5 Binary files /dev/null and b/materials/models/iku_lightning_drill_1.vmat_c differ diff --git a/materials/models/iku_lightning_drill_1_tga_a1091f6.vtex_c b/materials/models/iku_lightning_drill_1_tga_a1091f6.vtex_c new file mode 100755 index 0000000..eee3e63 Binary files /dev/null and b/materials/models/iku_lightning_drill_1_tga_a1091f6.vtex_c differ diff --git a/materials/models/iku_lightning_drill_1_tga_ebec94e0.vtex_c b/materials/models/iku_lightning_drill_1_tga_ebec94e0.vtex_c new file mode 100755 index 0000000..d809685 Binary files /dev/null and b/materials/models/iku_lightning_drill_1_tga_ebec94e0.vtex_c differ diff --git a/materials/models/iku_lightning_drill_2.vmat_c b/materials/models/iku_lightning_drill_2.vmat_c new file mode 100755 index 0000000..5e31f0f Binary files /dev/null and b/materials/models/iku_lightning_drill_2.vmat_c differ diff --git a/materials/models/iku_lightning_drill_2_tga_d8e532f0.vtex_c b/materials/models/iku_lightning_drill_2_tga_d8e532f0.vtex_c new file mode 100755 index 0000000..a9b6de6 Binary files /dev/null and b/materials/models/iku_lightning_drill_2_tga_d8e532f0.vtex_c differ diff --git a/materials/models/iku_lightning_drill_3.vmat_c b/materials/models/iku_lightning_drill_3.vmat_c new file mode 100755 index 0000000..d81966b Binary files /dev/null and b/materials/models/iku_lightning_drill_3.vmat_c differ diff --git a/materials/models/iku_lightning_drill_4.vmat_c b/materials/models/iku_lightning_drill_4.vmat_c new file mode 100755 index 0000000..90f9ff5 Binary files /dev/null and b/materials/models/iku_lightning_drill_4.vmat_c differ diff --git a/materials/models/komachi/body2ba_k.vmat_c b/materials/models/komachi/body2ba_k.vmat_c new file mode 100755 index 0000000..58e8c35 Binary files /dev/null and b/materials/models/komachi/body2ba_k.vmat_c differ diff --git a/materials/models/komachi/body2ba_k_normal_png_7915fc69.vtex_c b/materials/models/komachi/body2ba_k_normal_png_7915fc69.vtex_c new file mode 100755 index 0000000..c5d4854 Binary files /dev/null and b/materials/models/komachi/body2ba_k_normal_png_7915fc69.vtex_c differ diff --git a/materials/models/komachi/body2ba_k_png_762b37c5.vtex_c b/materials/models/komachi/body2ba_k_png_762b37c5.vtex_c new file mode 100755 index 0000000..063d822 Binary files /dev/null and b/materials/models/komachi/body2ba_k_png_762b37c5.vtex_c differ diff --git a/materials/models/komachi/body2ba_k_vmat_g_tmasks1_7e19ce0.vtex_c b/materials/models/komachi/body2ba_k_vmat_g_tmasks1_7e19ce0.vtex_c new file mode 100755 index 0000000..833c9cd Binary files /dev/null and b/materials/models/komachi/body2ba_k_vmat_g_tmasks1_7e19ce0.vtex_c differ diff --git a/materials/models/komachi/eff.vmat_c b/materials/models/komachi/eff.vmat_c new file mode 100755 index 0000000..e0e7f73 Binary files /dev/null and b/materials/models/komachi/eff.vmat_c differ diff --git a/materials/models/komachi/eff_png_d71be9c6.vtex_c b/materials/models/komachi/eff_png_d71be9c6.vtex_c new file mode 100755 index 0000000..88b047b Binary files /dev/null and b/materials/models/komachi/eff_png_d71be9c6.vtex_c differ diff --git a/materials/models/komachi/eye_k.vmat_c b/materials/models/komachi/eye_k.vmat_c new file mode 100755 index 0000000..c6685a0 Binary files /dev/null and b/materials/models/komachi/eye_k.vmat_c differ diff --git a/materials/models/komachi/eye_k_png_b95b82eb.vtex_c b/materials/models/komachi/eye_k_png_b95b82eb.vtex_c new file mode 100755 index 0000000..40d320b Binary files /dev/null and b/materials/models/komachi/eye_k_png_b95b82eb.vtex_c differ diff --git a/materials/models/komachi/face_k.vmat_c b/materials/models/komachi/face_k.vmat_c new file mode 100755 index 0000000..eb0dc0c Binary files /dev/null and b/materials/models/komachi/face_k.vmat_c differ diff --git a/materials/models/komachi/face_k_normal_png_b56752a8.vtex_c b/materials/models/komachi/face_k_normal_png_b56752a8.vtex_c new file mode 100755 index 0000000..bce18c0 Binary files /dev/null and b/materials/models/komachi/face_k_normal_png_b56752a8.vtex_c differ diff --git a/materials/models/komachi/face_k_png_4ddee4b8.vtex_c b/materials/models/komachi/face_k_png_4ddee4b8.vtex_c new file mode 100755 index 0000000..1430f17 Binary files /dev/null and b/materials/models/komachi/face_k_png_4ddee4b8.vtex_c differ diff --git a/materials/models/komachi/face_k_vmat_g_tmasks1_b254f9a.vtex_c b/materials/models/komachi/face_k_vmat_g_tmasks1_b254f9a.vtex_c new file mode 100755 index 0000000..cba5517 Binary files /dev/null and b/materials/models/komachi/face_k_vmat_g_tmasks1_b254f9a.vtex_c differ diff --git a/materials/models/komachi/hair.vmat_c b/materials/models/komachi/hair.vmat_c new file mode 100755 index 0000000..acb1bb9 Binary files /dev/null and b/materials/models/komachi/hair.vmat_c differ diff --git a/materials/models/komachi/hair_normal_png_2182856a.vtex_c b/materials/models/komachi/hair_normal_png_2182856a.vtex_c new file mode 100755 index 0000000..0ca8711 Binary files /dev/null and b/materials/models/komachi/hair_normal_png_2182856a.vtex_c differ diff --git a/materials/models/komachi/hair_tga_60f9b31a.vtex_c b/materials/models/komachi/hair_tga_60f9b31a.vtex_c new file mode 100755 index 0000000..9afe11e Binary files /dev/null and b/materials/models/komachi/hair_tga_60f9b31a.vtex_c differ diff --git a/materials/models/komachi/hair_vmat_g_tmasks1_b386dc9.vtex_c b/materials/models/komachi/hair_vmat_g_tmasks1_b386dc9.vtex_c new file mode 100755 index 0000000..f66f20d Binary files /dev/null and b/materials/models/komachi/hair_vmat_g_tmasks1_b386dc9.vtex_c differ diff --git a/materials/models/komachi/kama.vmat_c b/materials/models/komachi/kama.vmat_c new file mode 100755 index 0000000..9976c6a Binary files /dev/null and b/materials/models/komachi/kama.vmat_c differ diff --git a/materials/models/komachi/kama_png_e02c2e8e.vtex_c b/materials/models/komachi/kama_png_e02c2e8e.vtex_c new file mode 100755 index 0000000..2c3af48 Binary files /dev/null and b/materials/models/komachi/kama_png_e02c2e8e.vtex_c differ diff --git a/materials/models/komachi/kama_vmat_g_tmasks1_dffd5697.vtex_c b/materials/models/komachi/kama_vmat_g_tmasks1_dffd5697.vtex_c new file mode 100755 index 0000000..3920ad2 Binary files /dev/null and b/materials/models/komachi/kama_vmat_g_tmasks1_dffd5697.vtex_c differ diff --git a/materials/models/komachi/koha.vmat_c b/materials/models/komachi/koha.vmat_c new file mode 100755 index 0000000..0027657 Binary files /dev/null and b/materials/models/komachi/koha.vmat_c differ diff --git a/materials/models/komachi/koha_normal_png_76171701.vtex_c b/materials/models/komachi/koha_normal_png_76171701.vtex_c new file mode 100755 index 0000000..dbed14d Binary files /dev/null and b/materials/models/komachi/koha_normal_png_76171701.vtex_c differ diff --git a/materials/models/komachi/koha_png_c93b2c54.vtex_c b/materials/models/komachi/koha_png_c93b2c54.vtex_c new file mode 100755 index 0000000..dffda5d Binary files /dev/null and b/materials/models/komachi/koha_png_c93b2c54.vtex_c differ diff --git a/materials/models/komachi/koha_vmat_g_tmasks1_a33beb27.vtex_c b/materials/models/komachi/koha_vmat_g_tmasks1_a33beb27.vtex_c new file mode 100755 index 0000000..f14872b Binary files /dev/null and b/materials/models/komachi/koha_vmat_g_tmasks1_a33beb27.vtex_c differ diff --git a/materials/models/komachi/kohu.vmat_c b/materials/models/komachi/kohu.vmat_c new file mode 100755 index 0000000..95a457c Binary files /dev/null and b/materials/models/komachi/kohu.vmat_c differ diff --git a/materials/models/komachi/kohu_normal_png_989c90b6.vtex_c b/materials/models/komachi/kohu_normal_png_989c90b6.vtex_c new file mode 100755 index 0000000..c53a2fa Binary files /dev/null and b/materials/models/komachi/kohu_normal_png_989c90b6.vtex_c differ diff --git a/materials/models/komachi/kohu_png_c112dc6c.vtex_c b/materials/models/komachi/kohu_png_c112dc6c.vtex_c new file mode 100755 index 0000000..0b2e0f2 Binary files /dev/null and b/materials/models/komachi/kohu_png_c112dc6c.vtex_c differ diff --git a/materials/models/komachi/kohu_vmat_g_tmasks1_cee6b86c.vtex_c b/materials/models/komachi/kohu_vmat_g_tmasks1_cee6b86c.vtex_c new file mode 100755 index 0000000..f72f549 Binary files /dev/null and b/materials/models/komachi/kohu_vmat_g_tmasks1_cee6b86c.vtex_c differ diff --git a/materials/models/komachi/kohum.vmat_c b/materials/models/komachi/kohum.vmat_c new file mode 100755 index 0000000..12ded96 Binary files /dev/null and b/materials/models/komachi/kohum.vmat_c differ diff --git a/materials/models/komachi/kohum_normal_png_cc6beaec.vtex_c b/materials/models/komachi/kohum_normal_png_cc6beaec.vtex_c new file mode 100755 index 0000000..db2bc54 Binary files /dev/null and b/materials/models/komachi/kohum_normal_png_cc6beaec.vtex_c differ diff --git a/materials/models/komachi/kohum_png_2f290297.vtex_c b/materials/models/komachi/kohum_png_2f290297.vtex_c new file mode 100755 index 0000000..d8545d6 Binary files /dev/null and b/materials/models/komachi/kohum_png_2f290297.vtex_c differ diff --git a/materials/models/komachi/kohum_vmat_g_tmasks1_f065b829.vtex_c b/materials/models/komachi/kohum_vmat_g_tmasks1_f065b829.vtex_c new file mode 100755 index 0000000..f0430c0 Binary files /dev/null and b/materials/models/komachi/kohum_vmat_g_tmasks1_f065b829.vtex_c differ diff --git a/materials/models/komachi/kosu.vmat_c b/materials/models/komachi/kosu.vmat_c new file mode 100755 index 0000000..fbe7163 Binary files /dev/null and b/materials/models/komachi/kosu.vmat_c differ diff --git a/materials/models/komachi/kosu_normal_png_9f2aab5a.vtex_c b/materials/models/komachi/kosu_normal_png_9f2aab5a.vtex_c new file mode 100755 index 0000000..418c8fe Binary files /dev/null and b/materials/models/komachi/kosu_normal_png_9f2aab5a.vtex_c differ diff --git a/materials/models/komachi/kosu_png_7cbea97c.vtex_c b/materials/models/komachi/kosu_png_7cbea97c.vtex_c new file mode 100755 index 0000000..909645f Binary files /dev/null and b/materials/models/komachi/kosu_png_7cbea97c.vtex_c differ diff --git a/materials/models/komachi/kosu_vmat_g_tmasks1_dae1a518.vtex_c b/materials/models/komachi/kosu_vmat_g_tmasks1_dae1a518.vtex_c new file mode 100755 index 0000000..013df73 Binary files /dev/null and b/materials/models/komachi/kosu_vmat_g_tmasks1_dae1a518.vtex_c differ diff --git a/materials/models/komachi/kosu_vmat_g_tmasks2_a76d9cb6.vtex_c b/materials/models/komachi/kosu_vmat_g_tmasks2_a76d9cb6.vtex_c new file mode 100755 index 0000000..4e727f0 Binary files /dev/null and b/materials/models/komachi/kosu_vmat_g_tmasks2_a76d9cb6.vtex_c differ diff --git a/materials/models/komachi/shadow.vmat_c b/materials/models/komachi/shadow.vmat_c new file mode 100755 index 0000000..94fed00 Binary files /dev/null and b/materials/models/komachi/shadow.vmat_c differ diff --git a/materials/models/komachi/shadow_png_6de619af.vtex_c b/materials/models/komachi/shadow_png_6de619af.vtex_c new file mode 100755 index 0000000..411d89c Binary files /dev/null and b/materials/models/komachi/shadow_png_6de619af.vtex_c differ diff --git a/materials/models/thd2/2df_skill_09_5.vmat_c b/materials/models/thd2/2df_skill_09_5.vmat_c new file mode 100755 index 0000000..7c12f74 Binary files /dev/null and b/materials/models/thd2/2df_skill_09_5.vmat_c differ diff --git a/materials/models/thd2/2df_skill_09_5_tga_cfcccd4f.vtex_c b/materials/models/thd2/2df_skill_09_5_tga_cfcccd4f.vtex_c new file mode 100755 index 0000000..3b8f0e1 Binary files /dev/null and b/materials/models/thd2/2df_skill_09_5_tga_cfcccd4f.vtex_c differ diff --git a/materials/models/thd2/alice/alice/accea1.vmat_c b/materials/models/thd2/alice/alice/accea1.vmat_c new file mode 100755 index 0000000..34acbba Binary files /dev/null and b/materials/models/thd2/alice/alice/accea1.vmat_c differ diff --git a/materials/models/thd2/alice/alice/accea1_normal_png_60250a9f.vtex_c b/materials/models/thd2/alice/alice/accea1_normal_png_60250a9f.vtex_c new file mode 100755 index 0000000..25730af Binary files /dev/null and b/materials/models/thd2/alice/alice/accea1_normal_png_60250a9f.vtex_c differ diff --git a/materials/models/thd2/alice/alice/accea1_png_10953575.vtex_c b/materials/models/thd2/alice/alice/accea1_png_10953575.vtex_c new file mode 100755 index 0000000..7307942 Binary files /dev/null and b/materials/models/thd2/alice/alice/accea1_png_10953575.vtex_c differ diff --git a/materials/models/thd2/alice/alice/accea1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/accea1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/accea1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/blousea1.vmat_c b/materials/models/thd2/alice/alice/blousea1.vmat_c new file mode 100755 index 0000000..d49486f Binary files /dev/null and b/materials/models/thd2/alice/alice/blousea1.vmat_c differ diff --git a/materials/models/thd2/alice/alice/blousea1_normal_png_b148e0da.vtex_c b/materials/models/thd2/alice/alice/blousea1_normal_png_b148e0da.vtex_c new file mode 100755 index 0000000..058bf7d Binary files /dev/null and b/materials/models/thd2/alice/alice/blousea1_normal_png_b148e0da.vtex_c differ diff --git a/materials/models/thd2/alice/alice/blousea1_png_94a4b57b.vtex_c b/materials/models/thd2/alice/alice/blousea1_png_94a4b57b.vtex_c new file mode 100755 index 0000000..50dc4e7 Binary files /dev/null and b/materials/models/thd2/alice/alice/blousea1_png_94a4b57b.vtex_c differ diff --git a/materials/models/thd2/alice/alice/blousea1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/blousea1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/blousea1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/body2b_m.vmat_c b/materials/models/thd2/alice/alice/body2b_m.vmat_c new file mode 100755 index 0000000..b25342d Binary files /dev/null and b/materials/models/thd2/alice/alice/body2b_m.vmat_c differ diff --git a/materials/models/thd2/alice/alice/body2b_m_normal_png_733b90ef.vtex_c b/materials/models/thd2/alice/alice/body2b_m_normal_png_733b90ef.vtex_c new file mode 100755 index 0000000..592bf8c Binary files /dev/null and b/materials/models/thd2/alice/alice/body2b_m_normal_png_733b90ef.vtex_c differ diff --git a/materials/models/thd2/alice/alice/body2b_m_png_10a749aa.vtex_c b/materials/models/thd2/alice/alice/body2b_m_png_10a749aa.vtex_c new file mode 100755 index 0000000..1b31d34 Binary files /dev/null and b/materials/models/thd2/alice/alice/body2b_m_png_10a749aa.vtex_c differ diff --git a/materials/models/thd2/alice/alice/body2b_m_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/body2b_m_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/body2b_m_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/bootsd1.vmat_c b/materials/models/thd2/alice/alice/bootsd1.vmat_c new file mode 100755 index 0000000..610968b Binary files /dev/null and b/materials/models/thd2/alice/alice/bootsd1.vmat_c differ diff --git a/materials/models/thd2/alice/alice/bootsd1_normal_png_aa66563c.vtex_c b/materials/models/thd2/alice/alice/bootsd1_normal_png_aa66563c.vtex_c new file mode 100755 index 0000000..ea731d0 Binary files /dev/null and b/materials/models/thd2/alice/alice/bootsd1_normal_png_aa66563c.vtex_c differ diff --git a/materials/models/thd2/alice/alice/bootsd1_png_f12d59db.vtex_c b/materials/models/thd2/alice/alice/bootsd1_png_f12d59db.vtex_c new file mode 100755 index 0000000..f4a7604 Binary files /dev/null and b/materials/models/thd2/alice/alice/bootsd1_png_f12d59db.vtex_c differ diff --git a/materials/models/thd2/alice/alice/bootsd1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/bootsd1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/bootsd1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/eff.vmat_c b/materials/models/thd2/alice/alice/eff.vmat_c new file mode 100755 index 0000000..0fe6a2f Binary files /dev/null and b/materials/models/thd2/alice/alice/eff.vmat_c differ diff --git a/materials/models/thd2/alice/alice/eff_png_55e7975c.vtex_c b/materials/models/thd2/alice/alice/eff_png_55e7975c.vtex_c new file mode 100755 index 0000000..da1fb6f Binary files /dev/null and b/materials/models/thd2/alice/alice/eff_png_55e7975c.vtex_c differ diff --git a/materials/models/thd2/alice/alice/eff_png_5de22e21.vtex_c b/materials/models/thd2/alice/alice/eff_png_5de22e21.vtex_c new file mode 100755 index 0000000..d19635e Binary files /dev/null and b/materials/models/thd2/alice/alice/eff_png_5de22e21.vtex_c differ diff --git a/materials/models/thd2/alice/alice/eff_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/eff_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/eff_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/eye.vmat_c b/materials/models/thd2/alice/alice/eye.vmat_c new file mode 100755 index 0000000..5ea5118 Binary files /dev/null and b/materials/models/thd2/alice/alice/eye.vmat_c differ diff --git a/materials/models/thd2/alice/alice/eye_png_4a7be721.vtex_c b/materials/models/thd2/alice/alice/eye_png_4a7be721.vtex_c new file mode 100755 index 0000000..0491c80 Binary files /dev/null and b/materials/models/thd2/alice/alice/eye_png_4a7be721.vtex_c differ diff --git a/materials/models/thd2/alice/alice/eye_png_ec4b6ab.vtex_c b/materials/models/thd2/alice/alice/eye_png_ec4b6ab.vtex_c new file mode 100755 index 0000000..dea845c Binary files /dev/null and b/materials/models/thd2/alice/alice/eye_png_ec4b6ab.vtex_c differ diff --git a/materials/models/thd2/alice/alice/eye_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/eye_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/eye_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/face.vmat_c b/materials/models/thd2/alice/alice/face.vmat_c new file mode 100755 index 0000000..0743a39 Binary files /dev/null and b/materials/models/thd2/alice/alice/face.vmat_c differ diff --git a/materials/models/thd2/alice/alice/face_normal_png_366d369e.vtex_c b/materials/models/thd2/alice/alice/face_normal_png_366d369e.vtex_c new file mode 100755 index 0000000..6f6b802 Binary files /dev/null and b/materials/models/thd2/alice/alice/face_normal_png_366d369e.vtex_c differ diff --git a/materials/models/thd2/alice/alice/face_png_986b7f5d.vtex_c b/materials/models/thd2/alice/alice/face_png_986b7f5d.vtex_c new file mode 100755 index 0000000..f749a6e Binary files /dev/null and b/materials/models/thd2/alice/alice/face_png_986b7f5d.vtex_c differ diff --git a/materials/models/thd2/alice/alice/face_png_fc52c9b1.vtex_c b/materials/models/thd2/alice/alice/face_png_fc52c9b1.vtex_c new file mode 100755 index 0000000..40101a3 Binary files /dev/null and b/materials/models/thd2/alice/alice/face_png_fc52c9b1.vtex_c differ diff --git a/materials/models/thd2/alice/alice/face_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/face_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/face_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/frill.vmat_c b/materials/models/thd2/alice/alice/frill.vmat_c new file mode 100755 index 0000000..bcfaa36 Binary files /dev/null and b/materials/models/thd2/alice/alice/frill.vmat_c differ diff --git a/materials/models/thd2/alice/alice/frill_normal_png_3dafce19.vtex_c b/materials/models/thd2/alice/alice/frill_normal_png_3dafce19.vtex_c new file mode 100755 index 0000000..5606b8f Binary files /dev/null and b/materials/models/thd2/alice/alice/frill_normal_png_3dafce19.vtex_c differ diff --git a/materials/models/thd2/alice/alice/frill_png_587e4bb4.vtex_c b/materials/models/thd2/alice/alice/frill_png_587e4bb4.vtex_c new file mode 100755 index 0000000..8ebb203 Binary files /dev/null and b/materials/models/thd2/alice/alice/frill_png_587e4bb4.vtex_c differ diff --git a/materials/models/thd2/alice/alice/frill_png_89b90578.vtex_c b/materials/models/thd2/alice/alice/frill_png_89b90578.vtex_c new file mode 100755 index 0000000..fb9d8af Binary files /dev/null and b/materials/models/thd2/alice/alice/frill_png_89b90578.vtex_c differ diff --git a/materials/models/thd2/alice/alice/frill_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/frill_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/frill_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/hair.vmat_c b/materials/models/thd2/alice/alice/hair.vmat_c new file mode 100755 index 0000000..70cd54d Binary files /dev/null and b/materials/models/thd2/alice/alice/hair.vmat_c differ diff --git a/materials/models/thd2/alice/alice/hair_normal_png_6733150.vtex_c b/materials/models/thd2/alice/alice/hair_normal_png_6733150.vtex_c new file mode 100755 index 0000000..1487af4 Binary files /dev/null and b/materials/models/thd2/alice/alice/hair_normal_png_6733150.vtex_c differ diff --git a/materials/models/thd2/alice/alice/hair_png_76a1ae17.vtex_c b/materials/models/thd2/alice/alice/hair_png_76a1ae17.vtex_c new file mode 100755 index 0000000..ba4d0c6 Binary files /dev/null and b/materials/models/thd2/alice/alice/hair_png_76a1ae17.vtex_c differ diff --git a/materials/models/thd2/alice/alice/hair_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/hair_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/hair_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/headbanda1.vmat_c b/materials/models/thd2/alice/alice/headbanda1.vmat_c new file mode 100755 index 0000000..9c48074 Binary files /dev/null and b/materials/models/thd2/alice/alice/headbanda1.vmat_c differ diff --git a/materials/models/thd2/alice/alice/headbanda1_normal_png_a1e1b66d.vtex_c b/materials/models/thd2/alice/alice/headbanda1_normal_png_a1e1b66d.vtex_c new file mode 100755 index 0000000..5338865 Binary files /dev/null and b/materials/models/thd2/alice/alice/headbanda1_normal_png_a1e1b66d.vtex_c differ diff --git a/materials/models/thd2/alice/alice/headbanda1_png_b9332b4d.vtex_c b/materials/models/thd2/alice/alice/headbanda1_png_b9332b4d.vtex_c new file mode 100755 index 0000000..f1531f2 Binary files /dev/null and b/materials/models/thd2/alice/alice/headbanda1_png_b9332b4d.vtex_c differ diff --git a/materials/models/thd2/alice/alice/headbanda1_png_d287c96a.vtex_c b/materials/models/thd2/alice/alice/headbanda1_png_d287c96a.vtex_c new file mode 100755 index 0000000..078a0a5 Binary files /dev/null and b/materials/models/thd2/alice/alice/headbanda1_png_d287c96a.vtex_c differ diff --git a/materials/models/thd2/alice/alice/headbanda1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/headbanda1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/headbanda1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/pantsc4.vmat_c b/materials/models/thd2/alice/alice/pantsc4.vmat_c new file mode 100755 index 0000000..d4bf80b Binary files /dev/null and b/materials/models/thd2/alice/alice/pantsc4.vmat_c differ diff --git a/materials/models/thd2/alice/alice/pantsc4_normal_png_15774803.vtex_c b/materials/models/thd2/alice/alice/pantsc4_normal_png_15774803.vtex_c new file mode 100755 index 0000000..63f89e2 Binary files /dev/null and b/materials/models/thd2/alice/alice/pantsc4_normal_png_15774803.vtex_c differ diff --git a/materials/models/thd2/alice/alice/pantsc4_png_2071fe0.vtex_c b/materials/models/thd2/alice/alice/pantsc4_png_2071fe0.vtex_c new file mode 100755 index 0000000..d3459e7 Binary files /dev/null and b/materials/models/thd2/alice/alice/pantsc4_png_2071fe0.vtex_c differ diff --git a/materials/models/thd2/alice/alice/pantsc4_png_f450d891.vtex_c b/materials/models/thd2/alice/alice/pantsc4_png_f450d891.vtex_c new file mode 100755 index 0000000..f9bd243 Binary files /dev/null and b/materials/models/thd2/alice/alice/pantsc4_png_f450d891.vtex_c differ diff --git a/materials/models/thd2/alice/alice/pantsc4_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/pantsc4_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/pantsc4_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/shadow.vmat_c b/materials/models/thd2/alice/alice/shadow.vmat_c new file mode 100755 index 0000000..c4a7892 Binary files /dev/null and b/materials/models/thd2/alice/alice/shadow.vmat_c differ diff --git a/materials/models/thd2/alice/alice/shadow_png_24f4dbab.vtex_c b/materials/models/thd2/alice/alice/shadow_png_24f4dbab.vtex_c new file mode 100755 index 0000000..f6d6d06 Binary files /dev/null and b/materials/models/thd2/alice/alice/shadow_png_24f4dbab.vtex_c differ diff --git a/materials/models/thd2/alice/alice/shadow_png_277a5124.vtex_c b/materials/models/thd2/alice/alice/shadow_png_277a5124.vtex_c new file mode 100755 index 0000000..90880b1 Binary files /dev/null and b/materials/models/thd2/alice/alice/shadow_png_277a5124.vtex_c differ diff --git a/materials/models/thd2/alice/alice/shadow_png_4177c597.vtex_c b/materials/models/thd2/alice/alice/shadow_png_4177c597.vtex_c new file mode 100755 index 0000000..04dce2c Binary files /dev/null and b/materials/models/thd2/alice/alice/shadow_png_4177c597.vtex_c differ diff --git a/materials/models/thd2/alice/alice/shadow_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/shadow_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/shadow_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/skirta2.vmat_c b/materials/models/thd2/alice/alice/skirta2.vmat_c new file mode 100755 index 0000000..71515af Binary files /dev/null and b/materials/models/thd2/alice/alice/skirta2.vmat_c differ diff --git a/materials/models/thd2/alice/alice/skirta2_normal_png_dac5b9d6.vtex_c b/materials/models/thd2/alice/alice/skirta2_normal_png_dac5b9d6.vtex_c new file mode 100755 index 0000000..75cb283 Binary files /dev/null and b/materials/models/thd2/alice/alice/skirta2_normal_png_dac5b9d6.vtex_c differ diff --git a/materials/models/thd2/alice/alice/skirta2_png_f4b5d905.vtex_c b/materials/models/thd2/alice/alice/skirta2_png_f4b5d905.vtex_c new file mode 100755 index 0000000..5257a94 Binary files /dev/null and b/materials/models/thd2/alice/alice/skirta2_png_f4b5d905.vtex_c differ diff --git a/materials/models/thd2/alice/alice/skirta2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/skirta2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/skirta2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/alice/skirta3.vmat_c b/materials/models/thd2/alice/alice/skirta3.vmat_c new file mode 100755 index 0000000..0111cb2 Binary files /dev/null and b/materials/models/thd2/alice/alice/skirta3.vmat_c differ diff --git a/materials/models/thd2/alice/alice/skirta3_normal_png_da60f1f6.vtex_c b/materials/models/thd2/alice/alice/skirta3_normal_png_da60f1f6.vtex_c new file mode 100755 index 0000000..b1858b9 Binary files /dev/null and b/materials/models/thd2/alice/alice/skirta3_normal_png_da60f1f6.vtex_c differ diff --git a/materials/models/thd2/alice/alice/skirta3_png_3b106718.vtex_c b/materials/models/thd2/alice/alice/skirta3_png_3b106718.vtex_c new file mode 100755 index 0000000..d80f834 Binary files /dev/null and b/materials/models/thd2/alice/alice/skirta3_png_3b106718.vtex_c differ diff --git a/materials/models/thd2/alice/alice/skirta3_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/alice/alice/skirta3_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/alice/alice/skirta3_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/0.vmat_c b/materials/models/thd2/alice/falanxi/0.vmat_c new file mode 100755 index 0000000..a9d2b49 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/0.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/0_tga_26f51b7f.vtex_c b/materials/models/thd2/alice/falanxi/0_tga_26f51b7f.vtex_c new file mode 100755 index 0000000..eba3f20 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/0_tga_26f51b7f.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/1.vmat_c b/materials/models/thd2/alice/falanxi/1.vmat_c new file mode 100755 index 0000000..72b393f Binary files /dev/null and b/materials/models/thd2/alice/falanxi/1.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/10.vmat_c b/materials/models/thd2/alice/falanxi/10.vmat_c new file mode 100755 index 0000000..56af112 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/10.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/10_tga_1717050f.vtex_c b/materials/models/thd2/alice/falanxi/10_tga_1717050f.vtex_c new file mode 100755 index 0000000..b2ec519 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/10_tga_1717050f.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/11.vmat_c b/materials/models/thd2/alice/falanxi/11.vmat_c new file mode 100755 index 0000000..4a94736 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/11.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/11_tga_42fe9e06.vtex_c b/materials/models/thd2/alice/falanxi/11_tga_42fe9e06.vtex_c new file mode 100755 index 0000000..8ac4b98 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/11_tga_42fe9e06.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/12.vmat_c b/materials/models/thd2/alice/falanxi/12.vmat_c new file mode 100755 index 0000000..0c87c3d Binary files /dev/null and b/materials/models/thd2/alice/falanxi/12.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/13.vmat_c b/materials/models/thd2/alice/falanxi/13.vmat_c new file mode 100755 index 0000000..f8f293b Binary files /dev/null and b/materials/models/thd2/alice/falanxi/13.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/13_tga_1731d44f.vtex_c b/materials/models/thd2/alice/falanxi/13_tga_1731d44f.vtex_c new file mode 100755 index 0000000..c87baf5 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/13_tga_1731d44f.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/13_tga_bab8cb32.vtex_c b/materials/models/thd2/alice/falanxi/13_tga_bab8cb32.vtex_c new file mode 100755 index 0000000..9df58e4 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/13_tga_bab8cb32.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/14.vmat_c b/materials/models/thd2/alice/falanxi/14.vmat_c new file mode 100755 index 0000000..ef1e1d8 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/14.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/14_tga_b483ff2e.vtex_c b/materials/models/thd2/alice/falanxi/14_tga_b483ff2e.vtex_c new file mode 100755 index 0000000..f327b7c Binary files /dev/null and b/materials/models/thd2/alice/falanxi/14_tga_b483ff2e.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/15.vmat_c b/materials/models/thd2/alice/falanxi/15.vmat_c new file mode 100755 index 0000000..d03e2f0 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/15.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/15_tga_781abcf0.vtex_c b/materials/models/thd2/alice/falanxi/15_tga_781abcf0.vtex_c new file mode 100755 index 0000000..c93ed85 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/15_tga_781abcf0.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/16.vmat_c b/materials/models/thd2/alice/falanxi/16.vmat_c new file mode 100755 index 0000000..2d8391f Binary files /dev/null and b/materials/models/thd2/alice/falanxi/16.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/16_tga_d83d5793.vtex_c b/materials/models/thd2/alice/falanxi/16_tga_d83d5793.vtex_c new file mode 100755 index 0000000..abcec31 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/16_tga_d83d5793.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/17.vmat_c b/materials/models/thd2/alice/falanxi/17.vmat_c new file mode 100755 index 0000000..5f9e281 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/17.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/17_tga_6f0e807c.vtex_c b/materials/models/thd2/alice/falanxi/17_tga_6f0e807c.vtex_c new file mode 100755 index 0000000..33ac688 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/17_tga_6f0e807c.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/18.vmat_c b/materials/models/thd2/alice/falanxi/18.vmat_c new file mode 100755 index 0000000..60d6143 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/18.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/18_tga_bdf8d241.vtex_c b/materials/models/thd2/alice/falanxi/18_tga_bdf8d241.vtex_c new file mode 100755 index 0000000..3cec017 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/18_tga_bdf8d241.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/19.vmat_c b/materials/models/thd2/alice/falanxi/19.vmat_c new file mode 100755 index 0000000..e7d4d1f Binary files /dev/null and b/materials/models/thd2/alice/falanxi/19.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/19_tga_cefc78f1.vtex_c b/materials/models/thd2/alice/falanxi/19_tga_cefc78f1.vtex_c new file mode 100755 index 0000000..d36d44c Binary files /dev/null and b/materials/models/thd2/alice/falanxi/19_tga_cefc78f1.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/1_tga_7e50f05d.vtex_c b/materials/models/thd2/alice/falanxi/1_tga_7e50f05d.vtex_c new file mode 100755 index 0000000..69680cf Binary files /dev/null and b/materials/models/thd2/alice/falanxi/1_tga_7e50f05d.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/2.vmat_c b/materials/models/thd2/alice/falanxi/2.vmat_c new file mode 100755 index 0000000..6cf2797 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/2.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/20.vmat_c b/materials/models/thd2/alice/falanxi/20.vmat_c new file mode 100755 index 0000000..8e87100 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/20.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/20_png_79f2b942.vtex_c b/materials/models/thd2/alice/falanxi/20_png_79f2b942.vtex_c new file mode 100755 index 0000000..5e7f4f7 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/20_png_79f2b942.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/21.vmat_c b/materials/models/thd2/alice/falanxi/21.vmat_c new file mode 100755 index 0000000..b292273 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/21.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/21_png_b466af37.vtex_c b/materials/models/thd2/alice/falanxi/21_png_b466af37.vtex_c new file mode 100755 index 0000000..4245da1 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/21_png_b466af37.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/22.vmat_c b/materials/models/thd2/alice/falanxi/22.vmat_c new file mode 100755 index 0000000..2931d63 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/22.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/23.vmat_c b/materials/models/thd2/alice/falanxi/23.vmat_c new file mode 100755 index 0000000..e37d41b Binary files /dev/null and b/materials/models/thd2/alice/falanxi/23.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/23_tga_93bf2c7a.vtex_c b/materials/models/thd2/alice/falanxi/23_tga_93bf2c7a.vtex_c new file mode 100755 index 0000000..b4ec1b1 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/23_tga_93bf2c7a.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/24.vmat_c b/materials/models/thd2/alice/falanxi/24.vmat_c new file mode 100755 index 0000000..f9b196b Binary files /dev/null and b/materials/models/thd2/alice/falanxi/24.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/24_tga_7e13b1a3.vtex_c b/materials/models/thd2/alice/falanxi/24_tga_7e13b1a3.vtex_c new file mode 100755 index 0000000..6a3ab3b Binary files /dev/null and b/materials/models/thd2/alice/falanxi/24_tga_7e13b1a3.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/25.vmat_c b/materials/models/thd2/alice/falanxi/25.vmat_c new file mode 100755 index 0000000..6b8413d Binary files /dev/null and b/materials/models/thd2/alice/falanxi/25.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/25_tga_ceeb04e4.vtex_c b/materials/models/thd2/alice/falanxi/25_tga_ceeb04e4.vtex_c new file mode 100755 index 0000000..097cd1a Binary files /dev/null and b/materials/models/thd2/alice/falanxi/25_tga_ceeb04e4.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/26.vmat_c b/materials/models/thd2/alice/falanxi/26.vmat_c new file mode 100755 index 0000000..91f630f Binary files /dev/null and b/materials/models/thd2/alice/falanxi/26.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/27.vmat_c b/materials/models/thd2/alice/falanxi/27.vmat_c new file mode 100755 index 0000000..7e3a9c5 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/27.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/27_png_2a98a271.vtex_c b/materials/models/thd2/alice/falanxi/27_png_2a98a271.vtex_c new file mode 100755 index 0000000..f6b4282 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/27_png_2a98a271.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/28.vmat_c b/materials/models/thd2/alice/falanxi/28.vmat_c new file mode 100755 index 0000000..bad15b0 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/28.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/29.vmat_c b/materials/models/thd2/alice/falanxi/29.vmat_c new file mode 100755 index 0000000..b644f32 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/29.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/29_tga_c597fd22.vtex_c b/materials/models/thd2/alice/falanxi/29_tga_c597fd22.vtex_c new file mode 100755 index 0000000..9b60f64 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/29_tga_c597fd22.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/2_tga_468f64e0.vtex_c b/materials/models/thd2/alice/falanxi/2_tga_468f64e0.vtex_c new file mode 100755 index 0000000..66b2be5 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/2_tga_468f64e0.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/3.vmat_c b/materials/models/thd2/alice/falanxi/3.vmat_c new file mode 100755 index 0000000..1346eb3 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/3.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/30.vmat_c b/materials/models/thd2/alice/falanxi/30.vmat_c new file mode 100755 index 0000000..5be80b9 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/30.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/30_png_7f4a9ba1.vtex_c b/materials/models/thd2/alice/falanxi/30_png_7f4a9ba1.vtex_c new file mode 100755 index 0000000..795cd67 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/30_png_7f4a9ba1.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/31.vmat_c b/materials/models/thd2/alice/falanxi/31.vmat_c new file mode 100755 index 0000000..dac82f9 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/31.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/32.vmat_c b/materials/models/thd2/alice/falanxi/32.vmat_c new file mode 100755 index 0000000..0cdb093 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/32.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/32_tga_8875fe8b.vtex_c b/materials/models/thd2/alice/falanxi/32_tga_8875fe8b.vtex_c new file mode 100755 index 0000000..c65a998 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/32_tga_8875fe8b.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/33.vmat_c b/materials/models/thd2/alice/falanxi/33.vmat_c new file mode 100755 index 0000000..95764b3 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/33.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/33_tga_137c132b.vtex_c b/materials/models/thd2/alice/falanxi/33_tga_137c132b.vtex_c new file mode 100755 index 0000000..1aabf49 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/33_tga_137c132b.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/34.vmat_c b/materials/models/thd2/alice/falanxi/34.vmat_c new file mode 100755 index 0000000..7a8b1aa Binary files /dev/null and b/materials/models/thd2/alice/falanxi/34.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/35.vmat_c b/materials/models/thd2/alice/falanxi/35.vmat_c new file mode 100755 index 0000000..ed8d85f Binary files /dev/null and b/materials/models/thd2/alice/falanxi/35.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/36.vmat_c b/materials/models/thd2/alice/falanxi/36.vmat_c new file mode 100755 index 0000000..b93b52c Binary files /dev/null and b/materials/models/thd2/alice/falanxi/36.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/37.vmat_c b/materials/models/thd2/alice/falanxi/37.vmat_c new file mode 100755 index 0000000..65739c6 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/37.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/38.vmat_c b/materials/models/thd2/alice/falanxi/38.vmat_c new file mode 100755 index 0000000..b0a3b91 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/38.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/39.vmat_c b/materials/models/thd2/alice/falanxi/39.vmat_c new file mode 100755 index 0000000..4ffb110 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/39.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/3_png_9e7e2eff.vtex_c b/materials/models/thd2/alice/falanxi/3_png_9e7e2eff.vtex_c new file mode 100755 index 0000000..0253180 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/3_png_9e7e2eff.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/4.vmat_c b/materials/models/thd2/alice/falanxi/4.vmat_c new file mode 100755 index 0000000..077c3a2 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/4.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/40.vmat_c b/materials/models/thd2/alice/falanxi/40.vmat_c new file mode 100755 index 0000000..40458e5 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/40.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/41.vmat_c b/materials/models/thd2/alice/falanxi/41.vmat_c new file mode 100755 index 0000000..90bd5ee Binary files /dev/null and b/materials/models/thd2/alice/falanxi/41.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/42.vmat_c b/materials/models/thd2/alice/falanxi/42.vmat_c new file mode 100755 index 0000000..13ec20b Binary files /dev/null and b/materials/models/thd2/alice/falanxi/42.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/43.vmat_c b/materials/models/thd2/alice/falanxi/43.vmat_c new file mode 100755 index 0000000..3b20126 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/43.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/44.vmat_c b/materials/models/thd2/alice/falanxi/44.vmat_c new file mode 100755 index 0000000..a70ed2f Binary files /dev/null and b/materials/models/thd2/alice/falanxi/44.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/44_tga_44e6767d.vtex_c b/materials/models/thd2/alice/falanxi/44_tga_44e6767d.vtex_c new file mode 100755 index 0000000..37890b6 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/44_tga_44e6767d.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/45.vmat_c b/materials/models/thd2/alice/falanxi/45.vmat_c new file mode 100755 index 0000000..546b386 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/45.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/45_tga_71090e84.vtex_c b/materials/models/thd2/alice/falanxi/45_tga_71090e84.vtex_c new file mode 100755 index 0000000..bc18eea Binary files /dev/null and b/materials/models/thd2/alice/falanxi/45_tga_71090e84.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/46.vmat_c b/materials/models/thd2/alice/falanxi/46.vmat_c new file mode 100755 index 0000000..c5ec405 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/46.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/46_tga_86728fc4.vtex_c b/materials/models/thd2/alice/falanxi/46_tga_86728fc4.vtex_c new file mode 100755 index 0000000..b38a33b Binary files /dev/null and b/materials/models/thd2/alice/falanxi/46_tga_86728fc4.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/47.vmat_c b/materials/models/thd2/alice/falanxi/47.vmat_c new file mode 100755 index 0000000..5ec55f0 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/47.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/47_tga_28e81284.vtex_c b/materials/models/thd2/alice/falanxi/47_tga_28e81284.vtex_c new file mode 100755 index 0000000..0f74b8e Binary files /dev/null and b/materials/models/thd2/alice/falanxi/47_tga_28e81284.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/48.vmat_c b/materials/models/thd2/alice/falanxi/48.vmat_c new file mode 100755 index 0000000..89bcfbc Binary files /dev/null and b/materials/models/thd2/alice/falanxi/48.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/48_tga_bce58b87.vtex_c b/materials/models/thd2/alice/falanxi/48_tga_bce58b87.vtex_c new file mode 100755 index 0000000..fed351d Binary files /dev/null and b/materials/models/thd2/alice/falanxi/48_tga_bce58b87.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/49.vmat_c b/materials/models/thd2/alice/falanxi/49.vmat_c new file mode 100755 index 0000000..30e5fb9 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/49.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/49_tga_99319dd4.vtex_c b/materials/models/thd2/alice/falanxi/49_tga_99319dd4.vtex_c new file mode 100755 index 0000000..fb0117f Binary files /dev/null and b/materials/models/thd2/alice/falanxi/49_tga_99319dd4.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/4_tga_d0af0267.vtex_c b/materials/models/thd2/alice/falanxi/4_tga_d0af0267.vtex_c new file mode 100755 index 0000000..0cbc228 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/4_tga_d0af0267.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/5.vmat_c b/materials/models/thd2/alice/falanxi/5.vmat_c new file mode 100755 index 0000000..75cc506 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/5.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/50.vmat_c b/materials/models/thd2/alice/falanxi/50.vmat_c new file mode 100755 index 0000000..636a572 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/50.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/50_tga_93cc73f5.vtex_c b/materials/models/thd2/alice/falanxi/50_tga_93cc73f5.vtex_c new file mode 100755 index 0000000..aff2d64 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/50_tga_93cc73f5.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/51.vmat_c b/materials/models/thd2/alice/falanxi/51.vmat_c new file mode 100755 index 0000000..8d570a3 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/51.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/51_tga_a3d2305d.vtex_c b/materials/models/thd2/alice/falanxi/51_tga_a3d2305d.vtex_c new file mode 100755 index 0000000..1e405d4 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/51_tga_a3d2305d.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/52.vmat_c b/materials/models/thd2/alice/falanxi/52.vmat_c new file mode 100755 index 0000000..0258f9b Binary files /dev/null and b/materials/models/thd2/alice/falanxi/52.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/52_tga_e1162ff3.vtex_c b/materials/models/thd2/alice/falanxi/52_tga_e1162ff3.vtex_c new file mode 100755 index 0000000..cb8b149 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/52_tga_e1162ff3.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/53.vmat_c b/materials/models/thd2/alice/falanxi/53.vmat_c new file mode 100755 index 0000000..a4620b3 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/53.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/54.vmat_c b/materials/models/thd2/alice/falanxi/54.vmat_c new file mode 100755 index 0000000..2458860 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/54.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/54_tga_5c9bf740.vtex_c b/materials/models/thd2/alice/falanxi/54_tga_5c9bf740.vtex_c new file mode 100755 index 0000000..7743f31 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/54_tga_5c9bf740.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/55.vmat_c b/materials/models/thd2/alice/falanxi/55.vmat_c new file mode 100755 index 0000000..688028d Binary files /dev/null and b/materials/models/thd2/alice/falanxi/55.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/56.vmat_c b/materials/models/thd2/alice/falanxi/56.vmat_c new file mode 100755 index 0000000..f1cf38c Binary files /dev/null and b/materials/models/thd2/alice/falanxi/56.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/56_tga_d8ffd0af.vtex_c b/materials/models/thd2/alice/falanxi/56_tga_d8ffd0af.vtex_c new file mode 100755 index 0000000..0758585 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/56_tga_d8ffd0af.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/57.vmat_c b/materials/models/thd2/alice/falanxi/57.vmat_c new file mode 100755 index 0000000..72a78f6 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/57.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/58.vmat_c b/materials/models/thd2/alice/falanxi/58.vmat_c new file mode 100755 index 0000000..fe11a84 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/58.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/58_tga_1bad8ab5.vtex_c b/materials/models/thd2/alice/falanxi/58_tga_1bad8ab5.vtex_c new file mode 100755 index 0000000..9330d59 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/58_tga_1bad8ab5.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/59.vmat_c b/materials/models/thd2/alice/falanxi/59.vmat_c new file mode 100755 index 0000000..bc60aaf Binary files /dev/null and b/materials/models/thd2/alice/falanxi/59.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/59_tga_343a5390.vtex_c b/materials/models/thd2/alice/falanxi/59_tga_343a5390.vtex_c new file mode 100755 index 0000000..5fcaf33 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/59_tga_343a5390.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/6.vmat_c b/materials/models/thd2/alice/falanxi/6.vmat_c new file mode 100755 index 0000000..3e7bda2 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/6.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/60.vmat_c b/materials/models/thd2/alice/falanxi/60.vmat_c new file mode 100755 index 0000000..70875ec Binary files /dev/null and b/materials/models/thd2/alice/falanxi/60.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/61.vmat_c b/materials/models/thd2/alice/falanxi/61.vmat_c new file mode 100755 index 0000000..8e74501 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/61.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/62.vmat_c b/materials/models/thd2/alice/falanxi/62.vmat_c new file mode 100755 index 0000000..1b301be Binary files /dev/null and b/materials/models/thd2/alice/falanxi/62.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/62_tga_b60383f5.vtex_c b/materials/models/thd2/alice/falanxi/62_tga_b60383f5.vtex_c new file mode 100755 index 0000000..12fd52e Binary files /dev/null and b/materials/models/thd2/alice/falanxi/62_tga_b60383f5.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/63.vmat_c b/materials/models/thd2/alice/falanxi/63.vmat_c new file mode 100755 index 0000000..7fefb87 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/63.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/63_tga_ae79875.vtex_c b/materials/models/thd2/alice/falanxi/63_tga_ae79875.vtex_c new file mode 100755 index 0000000..d7701d2 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/63_tga_ae79875.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/64.vmat_c b/materials/models/thd2/alice/falanxi/64.vmat_c new file mode 100755 index 0000000..fdc8425 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/64.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/64_tga_9b70d095.vtex_c b/materials/models/thd2/alice/falanxi/64_tga_9b70d095.vtex_c new file mode 100755 index 0000000..e8d880b Binary files /dev/null and b/materials/models/thd2/alice/falanxi/64_tga_9b70d095.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/65.vmat_c b/materials/models/thd2/alice/falanxi/65.vmat_c new file mode 100755 index 0000000..ca31c5b Binary files /dev/null and b/materials/models/thd2/alice/falanxi/65.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/65_tga_5513e65b.vtex_c b/materials/models/thd2/alice/falanxi/65_tga_5513e65b.vtex_c new file mode 100755 index 0000000..9e5dbb0 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/65_tga_5513e65b.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/66.vmat_c b/materials/models/thd2/alice/falanxi/66.vmat_c new file mode 100755 index 0000000..e754eec Binary files /dev/null and b/materials/models/thd2/alice/falanxi/66.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/66_tga_8c3359d9.vtex_c b/materials/models/thd2/alice/falanxi/66_tga_8c3359d9.vtex_c new file mode 100755 index 0000000..671c426 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/66_tga_8c3359d9.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/67.vmat_c b/materials/models/thd2/alice/falanxi/67.vmat_c new file mode 100755 index 0000000..d823dc2 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/67.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/67_tga_e6e7921c.vtex_c b/materials/models/thd2/alice/falanxi/67_tga_e6e7921c.vtex_c new file mode 100755 index 0000000..ec7d130 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/67_tga_e6e7921c.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/68.vmat_c b/materials/models/thd2/alice/falanxi/68.vmat_c new file mode 100755 index 0000000..b3bfe56 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/68.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/68_tga_86d31a08.vtex_c b/materials/models/thd2/alice/falanxi/68_tga_86d31a08.vtex_c new file mode 100755 index 0000000..5473d04 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/68_tga_86d31a08.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/69.vmat_c b/materials/models/thd2/alice/falanxi/69.vmat_c new file mode 100755 index 0000000..9c4cfe3 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/69.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/69_tga_40fe6347.vtex_c b/materials/models/thd2/alice/falanxi/69_tga_40fe6347.vtex_c new file mode 100755 index 0000000..1a96b74 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/69_tga_40fe6347.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/6_tga_7d92bcce.vtex_c b/materials/models/thd2/alice/falanxi/6_tga_7d92bcce.vtex_c new file mode 100755 index 0000000..8f01393 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/6_tga_7d92bcce.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/7.vmat_c b/materials/models/thd2/alice/falanxi/7.vmat_c new file mode 100755 index 0000000..ad319f0 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/7.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/70.vmat_c b/materials/models/thd2/alice/falanxi/70.vmat_c new file mode 100755 index 0000000..ce4e85e Binary files /dev/null and b/materials/models/thd2/alice/falanxi/70.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/71.vmat_c b/materials/models/thd2/alice/falanxi/71.vmat_c new file mode 100755 index 0000000..1292189 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/71.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/71_tga_c8a1a265.vtex_c b/materials/models/thd2/alice/falanxi/71_tga_c8a1a265.vtex_c new file mode 100755 index 0000000..40ac6c6 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/71_tga_c8a1a265.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/72.vmat_c b/materials/models/thd2/alice/falanxi/72.vmat_c new file mode 100755 index 0000000..9b523a7 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/72.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/72_tga_7e72ca2c.vtex_c b/materials/models/thd2/alice/falanxi/72_tga_7e72ca2c.vtex_c new file mode 100755 index 0000000..24fc2e2 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/72_tga_7e72ca2c.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/73.vmat_c b/materials/models/thd2/alice/falanxi/73.vmat_c new file mode 100755 index 0000000..1cc3603 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/73.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/74.vmat_c b/materials/models/thd2/alice/falanxi/74.vmat_c new file mode 100755 index 0000000..e212955 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/74.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/74_tga_f06dad1a.vtex_c b/materials/models/thd2/alice/falanxi/74_tga_f06dad1a.vtex_c new file mode 100755 index 0000000..11fe487 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/74_tga_f06dad1a.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/75.vmat_c b/materials/models/thd2/alice/falanxi/75.vmat_c new file mode 100755 index 0000000..4f954cb Binary files /dev/null and b/materials/models/thd2/alice/falanxi/75.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/76.vmat_c b/materials/models/thd2/alice/falanxi/76.vmat_c new file mode 100755 index 0000000..ee11dbd Binary files /dev/null and b/materials/models/thd2/alice/falanxi/76.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/76_tga_68f2f2e7.vtex_c b/materials/models/thd2/alice/falanxi/76_tga_68f2f2e7.vtex_c new file mode 100755 index 0000000..84df6ad Binary files /dev/null and b/materials/models/thd2/alice/falanxi/76_tga_68f2f2e7.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/77.vmat_c b/materials/models/thd2/alice/falanxi/77.vmat_c new file mode 100755 index 0000000..321cd39 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/77.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/78.vmat_c b/materials/models/thd2/alice/falanxi/78.vmat_c new file mode 100755 index 0000000..8e7cadc Binary files /dev/null and b/materials/models/thd2/alice/falanxi/78.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/78_tga_cc245f80.vtex_c b/materials/models/thd2/alice/falanxi/78_tga_cc245f80.vtex_c new file mode 100755 index 0000000..351d0ad Binary files /dev/null and b/materials/models/thd2/alice/falanxi/78_tga_cc245f80.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/79.vmat_c b/materials/models/thd2/alice/falanxi/79.vmat_c new file mode 100755 index 0000000..b799d02 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/79.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/79_png_9afa52dc.vtex_c b/materials/models/thd2/alice/falanxi/79_png_9afa52dc.vtex_c new file mode 100755 index 0000000..632472f Binary files /dev/null and b/materials/models/thd2/alice/falanxi/79_png_9afa52dc.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/7_tga_3d5f4721.vtex_c b/materials/models/thd2/alice/falanxi/7_tga_3d5f4721.vtex_c new file mode 100755 index 0000000..0db3387 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/7_tga_3d5f4721.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/8.vmat_c b/materials/models/thd2/alice/falanxi/8.vmat_c new file mode 100755 index 0000000..4f64806 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/8.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/80.vmat_c b/materials/models/thd2/alice/falanxi/80.vmat_c new file mode 100755 index 0000000..c57c972 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/80.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/80_normal_tga_1afc17b7.vtex_c b/materials/models/thd2/alice/falanxi/80_normal_tga_1afc17b7.vtex_c new file mode 100755 index 0000000..b1c6dce Binary files /dev/null and b/materials/models/thd2/alice/falanxi/80_normal_tga_1afc17b7.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/80_normal_tga_9b1ab7af.vtex_c b/materials/models/thd2/alice/falanxi/80_normal_tga_9b1ab7af.vtex_c new file mode 100755 index 0000000..ec45ab3 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/80_normal_tga_9b1ab7af.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/80_png_5a80bda0.vtex_c b/materials/models/thd2/alice/falanxi/80_png_5a80bda0.vtex_c new file mode 100755 index 0000000..6d8ce7d Binary files /dev/null and b/materials/models/thd2/alice/falanxi/80_png_5a80bda0.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/81.vmat_c b/materials/models/thd2/alice/falanxi/81.vmat_c new file mode 100755 index 0000000..feb9eee Binary files /dev/null and b/materials/models/thd2/alice/falanxi/81.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/81_png_4e2c184f.vtex_c b/materials/models/thd2/alice/falanxi/81_png_4e2c184f.vtex_c new file mode 100755 index 0000000..33a6d38 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/81_png_4e2c184f.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/82.vmat_c b/materials/models/thd2/alice/falanxi/82.vmat_c new file mode 100755 index 0000000..9531809 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/82.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/82_png_20f0ba17.vtex_c b/materials/models/thd2/alice/falanxi/82_png_20f0ba17.vtex_c new file mode 100755 index 0000000..0290caf Binary files /dev/null and b/materials/models/thd2/alice/falanxi/82_png_20f0ba17.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/83.vmat_c b/materials/models/thd2/alice/falanxi/83.vmat_c new file mode 100755 index 0000000..80c02e6 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/83.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/83_png_c8ea82c9.vtex_c b/materials/models/thd2/alice/falanxi/83_png_c8ea82c9.vtex_c new file mode 100755 index 0000000..4c44a44 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/83_png_c8ea82c9.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/84.vmat_c b/materials/models/thd2/alice/falanxi/84.vmat_c new file mode 100755 index 0000000..930d5d3 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/84.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/84_alpha.vmat_c b/materials/models/thd2/alice/falanxi/84_alpha.vmat_c new file mode 100755 index 0000000..c113a98 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/84_alpha.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/84_alpha_tga_91386a5b.vtex_c b/materials/models/thd2/alice/falanxi/84_alpha_tga_91386a5b.vtex_c new file mode 100755 index 0000000..0ee87f7 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/84_alpha_tga_91386a5b.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/84_png_a36169b7.vtex_c b/materials/models/thd2/alice/falanxi/84_png_a36169b7.vtex_c new file mode 100755 index 0000000..9cefe9c Binary files /dev/null and b/materials/models/thd2/alice/falanxi/84_png_a36169b7.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/85.vmat_c b/materials/models/thd2/alice/falanxi/85.vmat_c new file mode 100755 index 0000000..8c4a296 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/85.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/85_alpha.vmat_c b/materials/models/thd2/alice/falanxi/85_alpha.vmat_c new file mode 100755 index 0000000..77bcbd1 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/85_alpha.vmat_c differ diff --git a/materials/models/thd2/alice/falanxi/85_alpha_tga_eae88f3.vtex_c b/materials/models/thd2/alice/falanxi/85_alpha_tga_eae88f3.vtex_c new file mode 100755 index 0000000..bf73452 Binary files /dev/null and b/materials/models/thd2/alice/falanxi/85_alpha_tga_eae88f3.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/85_png_ba1d6d2f.vtex_c b/materials/models/thd2/alice/falanxi/85_png_ba1d6d2f.vtex_c new file mode 100755 index 0000000..b7c0a5f Binary files /dev/null and b/materials/models/thd2/alice/falanxi/85_png_ba1d6d2f.vtex_c differ diff --git a/materials/models/thd2/alice/falanxi/9.vmat_c b/materials/models/thd2/alice/falanxi/9.vmat_c new file mode 100755 index 0000000..7d7d6da Binary files /dev/null and b/materials/models/thd2/alice/falanxi/9.vmat_c differ diff --git a/materials/models/thd2/alice/shanghai/10_png_274d65d9.vtex_c b/materials/models/thd2/alice/shanghai/10_png_274d65d9.vtex_c new file mode 100755 index 0000000..c712e8b Binary files /dev/null and b/materials/models/thd2/alice/shanghai/10_png_274d65d9.vtex_c differ diff --git a/materials/models/thd2/alpha/2df_skill_09_5_alpha_tga_f3713299.vtex_c b/materials/models/thd2/alpha/2df_skill_09_5_alpha_tga_f3713299.vtex_c new file mode 100755 index 0000000..a9d454c Binary files /dev/null and b/materials/models/thd2/alpha/2df_skill_09_5_alpha_tga_f3713299.vtex_c differ diff --git a/materials/models/thd2/citystructures_tga_3c1f28f1.vtex_c b/materials/models/thd2/citystructures_tga_3c1f28f1.vtex_c new file mode 100755 index 0000000..49e2ac2 Binary files /dev/null and b/materials/models/thd2/citystructures_tga_3c1f28f1.vtex_c differ diff --git a/materials/models/thd2/citystructures_tga_5fa2f88c.vtex_c b/materials/models/thd2/citystructures_tga_5fa2f88c.vtex_c new file mode 100755 index 0000000..a921f3b Binary files /dev/null and b/materials/models/thd2/citystructures_tga_5fa2f88c.vtex_c differ diff --git a/materials/models/thd2/doodads0_tga_fd5b8edf.vtex_c b/materials/models/thd2/doodads0_tga_fd5b8edf.vtex_c new file mode 100755 index 0000000..5fc5a3f Binary files /dev/null and b/materials/models/thd2/doodads0_tga_fd5b8edf.vtex_c differ diff --git a/materials/models/thd2/firewing.vmat_c b/materials/models/thd2/firewing.vmat_c new file mode 100755 index 0000000..eb3416e Binary files /dev/null and b/materials/models/thd2/firewing.vmat_c differ diff --git a/materials/models/thd2/gate.vmat_c b/materials/models/thd2/gate.vmat_c new file mode 100755 index 0000000..6e31472 Binary files /dev/null and b/materials/models/thd2/gate.vmat_c differ diff --git a/materials/models/thd2/gate_tga_684e0455.vtex_c b/materials/models/thd2/gate_tga_684e0455.vtex_c new file mode 100755 index 0000000..03b244a Binary files /dev/null and b/materials/models/thd2/gate_tga_684e0455.vtex_c differ diff --git a/materials/models/thd2/kaguya/kaguya.vmat_c b/materials/models/thd2/kaguya/kaguya.vmat_c new file mode 100755 index 0000000..b2146c4 Binary files /dev/null and b/materials/models/thd2/kaguya/kaguya.vmat_c differ diff --git a/materials/models/thd2/kaguya/kaguya2.vmat_c b/materials/models/thd2/kaguya/kaguya2.vmat_c new file mode 100755 index 0000000..c522fed Binary files /dev/null and b/materials/models/thd2/kaguya/kaguya2.vmat_c differ diff --git a/materials/models/thd2/kaguya/kaguya_mmd_tga_2db73dfe.vtex_c b/materials/models/thd2/kaguya/kaguya_mmd_tga_2db73dfe.vtex_c new file mode 100755 index 0000000..fd20fdf Binary files /dev/null and b/materials/models/thd2/kaguya/kaguya_mmd_tga_2db73dfe.vtex_c differ diff --git a/materials/models/thd2/kaguya/kaguya_mmd_tga_6954e03d.vtex_c b/materials/models/thd2/kaguya/kaguya_mmd_tga_6954e03d.vtex_c new file mode 100755 index 0000000..b379f62 Binary files /dev/null and b/materials/models/thd2/kaguya/kaguya_mmd_tga_6954e03d.vtex_c differ diff --git a/materials/models/thd2/kaguya/kaguya_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/kaguya/kaguya_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/models/thd2/kaguya/kaguya_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/kanako/kanako_mmd.vmat_c b/materials/models/thd2/kanako/kanako_mmd.vmat_c new file mode 100755 index 0000000..beeee8a Binary files /dev/null and b/materials/models/thd2/kanako/kanako_mmd.vmat_c differ diff --git a/materials/models/thd2/kanako/kanako_mmd_tga_499b0043.vtex_c b/materials/models/thd2/kanako/kanako_mmd_tga_499b0043.vtex_c new file mode 100755 index 0000000..3fa28e8 Binary files /dev/null and b/materials/models/thd2/kanako/kanako_mmd_tga_499b0043.vtex_c differ diff --git a/materials/models/thd2/kanako/kanako_mmd_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/kanako/kanako_mmd_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/models/thd2/kanako/kanako_mmd_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/masterspark.vmat_c b/materials/models/thd2/masterspark.vmat_c new file mode 100755 index 0000000..73389ab Binary files /dev/null and b/materials/models/thd2/masterspark.vmat_c differ diff --git a/materials/models/thd2/medicine/a1.vmat_c b/materials/models/thd2/medicine/a1.vmat_c new file mode 100755 index 0000000..b4ce764 Binary files /dev/null and b/materials/models/thd2/medicine/a1.vmat_c differ diff --git a/materials/models/thd2/medicine/a1_normal_png_e3674d4e.vtex_c b/materials/models/thd2/medicine/a1_normal_png_e3674d4e.vtex_c new file mode 100755 index 0000000..70b4493 Binary files /dev/null and b/materials/models/thd2/medicine/a1_normal_png_e3674d4e.vtex_c differ diff --git a/materials/models/thd2/medicine/a1_png_ff700117.vtex_c b/materials/models/thd2/medicine/a1_png_ff700117.vtex_c new file mode 100755 index 0000000..97382bc Binary files /dev/null and b/materials/models/thd2/medicine/a1_png_ff700117.vtex_c differ diff --git a/materials/models/thd2/medicine/a1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/medicine/a1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/medicine/a1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/medicine/a2.vmat_c b/materials/models/thd2/medicine/a2.vmat_c new file mode 100755 index 0000000..7f1caec Binary files /dev/null and b/materials/models/thd2/medicine/a2.vmat_c differ diff --git a/materials/models/thd2/medicine/a2_normal_png_d7c93554.vtex_c b/materials/models/thd2/medicine/a2_normal_png_d7c93554.vtex_c new file mode 100755 index 0000000..4a881ce Binary files /dev/null and b/materials/models/thd2/medicine/a2_normal_png_d7c93554.vtex_c differ diff --git a/materials/models/thd2/medicine/a2_png_52bec9e3.vtex_c b/materials/models/thd2/medicine/a2_png_52bec9e3.vtex_c new file mode 100755 index 0000000..d770f87 Binary files /dev/null and b/materials/models/thd2/medicine/a2_png_52bec9e3.vtex_c differ diff --git a/materials/models/thd2/medicine/a2_png_8ee75f6.vtex_c b/materials/models/thd2/medicine/a2_png_8ee75f6.vtex_c new file mode 100755 index 0000000..1f4ce5d Binary files /dev/null and b/materials/models/thd2/medicine/a2_png_8ee75f6.vtex_c differ diff --git a/materials/models/thd2/medicine/a2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/medicine/a2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/medicine/a2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/medicine/a3.vmat_c b/materials/models/thd2/medicine/a3.vmat_c new file mode 100755 index 0000000..edf1c0b Binary files /dev/null and b/materials/models/thd2/medicine/a3.vmat_c differ diff --git a/materials/models/thd2/medicine/a3_normal_png_8cc10c36.vtex_c b/materials/models/thd2/medicine/a3_normal_png_8cc10c36.vtex_c new file mode 100755 index 0000000..5680cbd Binary files /dev/null and b/materials/models/thd2/medicine/a3_normal_png_8cc10c36.vtex_c differ diff --git a/materials/models/thd2/medicine/a3_png_b6210c66.vtex_c b/materials/models/thd2/medicine/a3_png_b6210c66.vtex_c new file mode 100755 index 0000000..8fd229b Binary files /dev/null and b/materials/models/thd2/medicine/a3_png_b6210c66.vtex_c differ diff --git a/materials/models/thd2/medicine/a3_png_f41c873f.vtex_c b/materials/models/thd2/medicine/a3_png_f41c873f.vtex_c new file mode 100755 index 0000000..aa97443 Binary files /dev/null and b/materials/models/thd2/medicine/a3_png_f41c873f.vtex_c differ diff --git a/materials/models/thd2/medicine/a3_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/medicine/a3_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/medicine/a3_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/medicine/fa.vmat_c b/materials/models/thd2/medicine/fa.vmat_c new file mode 100755 index 0000000..e05f920 Binary files /dev/null and b/materials/models/thd2/medicine/fa.vmat_c differ diff --git a/materials/models/thd2/medicine/fa_normal_png_b76ae0cc.vtex_c b/materials/models/thd2/medicine/fa_normal_png_b76ae0cc.vtex_c new file mode 100755 index 0000000..5553131 Binary files /dev/null and b/materials/models/thd2/medicine/fa_normal_png_b76ae0cc.vtex_c differ diff --git a/materials/models/thd2/medicine/fa_png_170a849f.vtex_c b/materials/models/thd2/medicine/fa_png_170a849f.vtex_c new file mode 100755 index 0000000..95aca3e Binary files /dev/null and b/materials/models/thd2/medicine/fa_png_170a849f.vtex_c differ diff --git a/materials/models/thd2/medicine/fa_png_b54a489e.vtex_c b/materials/models/thd2/medicine/fa_png_b54a489e.vtex_c new file mode 100755 index 0000000..b92e903 Binary files /dev/null and b/materials/models/thd2/medicine/fa_png_b54a489e.vtex_c differ diff --git a/materials/models/thd2/medicine/fa_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/medicine/fa_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/medicine/fa_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/medicine/fu.vmat_c b/materials/models/thd2/medicine/fu.vmat_c new file mode 100755 index 0000000..856c029 Binary files /dev/null and b/materials/models/thd2/medicine/fu.vmat_c differ diff --git a/materials/models/thd2/medicine/fu_normal_png_a8fd4bbb.vtex_c b/materials/models/thd2/medicine/fu_normal_png_a8fd4bbb.vtex_c new file mode 100755 index 0000000..53a0363 Binary files /dev/null and b/materials/models/thd2/medicine/fu_normal_png_a8fd4bbb.vtex_c differ diff --git a/materials/models/thd2/medicine/fu_png_cf73838.vtex_c b/materials/models/thd2/medicine/fu_png_cf73838.vtex_c new file mode 100755 index 0000000..6a36846 Binary files /dev/null and b/materials/models/thd2/medicine/fu_png_cf73838.vtex_c differ diff --git a/materials/models/thd2/medicine/fu_png_d3f073aa.vtex_c b/materials/models/thd2/medicine/fu_png_d3f073aa.vtex_c new file mode 100755 index 0000000..bff50d9 Binary files /dev/null and b/materials/models/thd2/medicine/fu_png_d3f073aa.vtex_c differ diff --git a/materials/models/thd2/medicine/fu_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/medicine/fu_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/medicine/fu_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/medicine/ji.vmat_c b/materials/models/thd2/medicine/ji.vmat_c new file mode 100755 index 0000000..ae0a86c Binary files /dev/null and b/materials/models/thd2/medicine/ji.vmat_c differ diff --git a/materials/models/thd2/medicine/ji_normal_png_316e7ac9.vtex_c b/materials/models/thd2/medicine/ji_normal_png_316e7ac9.vtex_c new file mode 100755 index 0000000..121cfc9 Binary files /dev/null and b/materials/models/thd2/medicine/ji_normal_png_316e7ac9.vtex_c differ diff --git a/materials/models/thd2/medicine/ji_png_a43c75bb.vtex_c b/materials/models/thd2/medicine/ji_png_a43c75bb.vtex_c new file mode 100755 index 0000000..e348faa Binary files /dev/null and b/materials/models/thd2/medicine/ji_png_a43c75bb.vtex_c differ diff --git a/materials/models/thd2/medicine/ji_png_b871fdd.vtex_c b/materials/models/thd2/medicine/ji_png_b871fdd.vtex_c new file mode 100755 index 0000000..026eaaa Binary files /dev/null and b/materials/models/thd2/medicine/ji_png_b871fdd.vtex_c differ diff --git a/materials/models/thd2/medicine/ji_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/medicine/ji_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/medicine/ji_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/31.vmat_c b/materials/models/thd2/medicine/linglanrenou/31.vmat_c new file mode 100755 index 0000000..33c14e0 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/31.vmat_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/31_vmat_g_tcolor_ca81bb54.vtex_c b/materials/models/thd2/medicine/linglanrenou/31_vmat_g_tcolor_ca81bb54.vtex_c new file mode 100755 index 0000000..d496d8b Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/31_vmat_g_tcolor_ca81bb54.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/31_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/medicine/linglanrenou/31_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/31_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b2.vmat_c b/materials/models/thd2/medicine/linglanrenou/b2.vmat_c new file mode 100755 index 0000000..64467ae Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b2.vmat_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b2_normal_png_f6f42ab0.vtex_c b/materials/models/thd2/medicine/linglanrenou/b2_normal_png_f6f42ab0.vtex_c new file mode 100755 index 0000000..1c04e3e Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b2_normal_png_f6f42ab0.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b2_png_54416b7c.vtex_c b/materials/models/thd2/medicine/linglanrenou/b2_png_54416b7c.vtex_c new file mode 100755 index 0000000..1f14670 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b2_png_54416b7c.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b2_png_c72b61ec.vtex_c b/materials/models/thd2/medicine/linglanrenou/b2_png_c72b61ec.vtex_c new file mode 100755 index 0000000..8f2ea92 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b2_png_c72b61ec.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/medicine/linglanrenou/b2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b3.vmat_c b/materials/models/thd2/medicine/linglanrenou/b3.vmat_c new file mode 100755 index 0000000..f420806 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b3.vmat_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b3_normal_png_5d928bb4.vtex_c b/materials/models/thd2/medicine/linglanrenou/b3_normal_png_5d928bb4.vtex_c new file mode 100755 index 0000000..cc5f240 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b3_normal_png_5d928bb4.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b3_png_17ebf3df.vtex_c b/materials/models/thd2/medicine/linglanrenou/b3_png_17ebf3df.vtex_c new file mode 100755 index 0000000..80865d7 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b3_png_17ebf3df.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b3_png_47d48abc.vtex_c b/materials/models/thd2/medicine/linglanrenou/b3_png_47d48abc.vtex_c new file mode 100755 index 0000000..060f2cd Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b3_png_47d48abc.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b3_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/medicine/linglanrenou/b3_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b3_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b4.vmat_c b/materials/models/thd2/medicine/linglanrenou/b4.vmat_c new file mode 100755 index 0000000..b861dfe Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b4.vmat_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b4_normal_png_69a0b31f.vtex_c b/materials/models/thd2/medicine/linglanrenou/b4_normal_png_69a0b31f.vtex_c new file mode 100755 index 0000000..0903412 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b4_normal_png_69a0b31f.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b4_png_8c815054.vtex_c b/materials/models/thd2/medicine/linglanrenou/b4_png_8c815054.vtex_c new file mode 100755 index 0000000..b4ef7e3 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b4_png_8c815054.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b4_png_c0f631a3.vtex_c b/materials/models/thd2/medicine/linglanrenou/b4_png_c0f631a3.vtex_c new file mode 100755 index 0000000..1ac79c8 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b4_png_c0f631a3.vtex_c differ diff --git a/materials/models/thd2/medicine/linglanrenou/b4_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/medicine/linglanrenou/b4_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/medicine/linglanrenou/b4_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/medicine/mu.vmat_c b/materials/models/thd2/medicine/mu.vmat_c new file mode 100755 index 0000000..42bfe50 Binary files /dev/null and b/materials/models/thd2/medicine/mu.vmat_c differ diff --git a/materials/models/thd2/medicine/mu_png_59d21f6a.vtex_c b/materials/models/thd2/medicine/mu_png_59d21f6a.vtex_c new file mode 100755 index 0000000..9c610d2 Binary files /dev/null and b/materials/models/thd2/medicine/mu_png_59d21f6a.vtex_c differ diff --git a/materials/models/thd2/medicine/mu_png_d1505766.vtex_c b/materials/models/thd2/medicine/mu_png_d1505766.vtex_c new file mode 100755 index 0000000..ffa5c0f Binary files /dev/null and b/materials/models/thd2/medicine/mu_png_d1505766.vtex_c differ diff --git a/materials/models/thd2/medicine/mu_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/medicine/mu_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/medicine/mu_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/medicine/xiazhe.vmat_c b/materials/models/thd2/medicine/xiazhe.vmat_c new file mode 100755 index 0000000..105f36a Binary files /dev/null and b/materials/models/thd2/medicine/xiazhe.vmat_c differ diff --git a/materials/models/thd2/medicine/xiazhe_png_6b4c2663.vtex_c b/materials/models/thd2/medicine/xiazhe_png_6b4c2663.vtex_c new file mode 100755 index 0000000..6f736da Binary files /dev/null and b/materials/models/thd2/medicine/xiazhe_png_6b4c2663.vtex_c differ diff --git a/materials/models/thd2/medicine/xiazhe_png_89bdad7.vtex_c b/materials/models/thd2/medicine/xiazhe_png_89bdad7.vtex_c new file mode 100755 index 0000000..99bba9d Binary files /dev/null and b/materials/models/thd2/medicine/xiazhe_png_89bdad7.vtex_c differ diff --git a/materials/models/thd2/medicine/xiazhe_png_8b10f0ef.vtex_c b/materials/models/thd2/medicine/xiazhe_png_8b10f0ef.vtex_c new file mode 100755 index 0000000..939a31f Binary files /dev/null and b/materials/models/thd2/medicine/xiazhe_png_8b10f0ef.vtex_c differ diff --git a/materials/models/thd2/medicine/xiazhe_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/medicine/xiazhe_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/medicine/xiazhe_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/rangzi/t_skin_tga_47282454.vtex_c b/materials/models/thd2/rangzi/t_skin_tga_47282454.vtex_c new file mode 100755 index 0000000..4cb00b2 Binary files /dev/null and b/materials/models/thd2/rangzi/t_skin_tga_47282454.vtex_c differ diff --git a/materials/models/thd2/reimu/as1_png_4efd5b91.vtex_c b/materials/models/thd2/reimu/as1_png_4efd5b91.vtex_c new file mode 100755 index 0000000..84a5bee Binary files /dev/null and b/materials/models/thd2/reimu/as1_png_4efd5b91.vtex_c differ diff --git a/materials/models/thd2/reimu/rm_wp_light_tga_8f274dba.vtex_c b/materials/models/thd2/reimu/rm_wp_light_tga_8f274dba.vtex_c new file mode 100755 index 0000000..971a462 Binary files /dev/null and b/materials/models/thd2/reimu/rm_wp_light_tga_8f274dba.vtex_c differ diff --git a/materials/models/thd2/remilia/remilia_gungnir.vmat_c b/materials/models/thd2/remilia/remilia_gungnir.vmat_c new file mode 100755 index 0000000..ed6395f Binary files /dev/null and b/materials/models/thd2/remilia/remilia_gungnir.vmat_c differ diff --git a/materials/models/thd2/remilia/remilia_gungnir_tga_d7900e73.vtex_c b/materials/models/thd2/remilia/remilia_gungnir_tga_d7900e73.vtex_c new file mode 100755 index 0000000..bb42227 Binary files /dev/null and b/materials/models/thd2/remilia/remilia_gungnir_tga_d7900e73.vtex_c differ diff --git a/materials/models/thd2/rumia_ex_1.vmat_c b/materials/models/thd2/rumia_ex_1.vmat_c new file mode 100755 index 0000000..d5dfb7e Binary files /dev/null and b/materials/models/thd2/rumia_ex_1.vmat_c differ diff --git a/materials/models/thd2/rumia_ex_1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/rumia_ex_1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/models/thd2/rumia_ex_1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/rumia_ex_2.vmat_c b/materials/models/thd2/rumia_ex_2.vmat_c new file mode 100755 index 0000000..4f3be03 Binary files /dev/null and b/materials/models/thd2/rumia_ex_2.vmat_c differ diff --git a/materials/models/thd2/rumia_ex_3.vmat_c b/materials/models/thd2/rumia_ex_3.vmat_c new file mode 100755 index 0000000..73809d7 Binary files /dev/null and b/materials/models/thd2/rumia_ex_3.vmat_c differ diff --git a/materials/models/thd2/rumia_ex_3_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/rumia_ex_3_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/models/thd2/rumia_ex_3_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/rumia_ex_4.vmat_c b/materials/models/thd2/rumia_ex_4.vmat_c new file mode 100755 index 0000000..930c194 Binary files /dev/null and b/materials/models/thd2/rumia_ex_4.vmat_c differ diff --git a/materials/models/thd2/rumia_ex_5.vmat_c b/materials/models/thd2/rumia_ex_5.vmat_c new file mode 100755 index 0000000..411ed7a Binary files /dev/null and b/materials/models/thd2/rumia_ex_5.vmat_c differ diff --git a/materials/models/thd2/rumia_ex_tga_26604d8d.vtex_c b/materials/models/thd2/rumia_ex_tga_26604d8d.vtex_c new file mode 100755 index 0000000..3819e66 Binary files /dev/null and b/materials/models/thd2/rumia_ex_tga_26604d8d.vtex_c differ diff --git a/materials/models/thd2/rumia_ex_tga_766b4c8.vtex_c b/materials/models/thd2/rumia_ex_tga_766b4c8.vtex_c new file mode 100755 index 0000000..9db529b Binary files /dev/null and b/materials/models/thd2/rumia_ex_tga_766b4c8.vtex_c differ diff --git a/materials/models/thd2/shade_tga_177d4a4f.vtex_c b/materials/models/thd2/shade_tga_177d4a4f.vtex_c new file mode 100755 index 0000000..4dd6c68 Binary files /dev/null and b/materials/models/thd2/shade_tga_177d4a4f.vtex_c differ diff --git a/materials/models/thd2/shikieiki/shiki_mmd_tga_99a41376.vtex_c b/materials/models/thd2/shikieiki/shiki_mmd_tga_99a41376.vtex_c new file mode 100755 index 0000000..2db8548 Binary files /dev/null and b/materials/models/thd2/shikieiki/shiki_mmd_tga_99a41376.vtex_c differ diff --git a/materials/models/thd2/shikieiki/shikieiki_mmd.vmat_c b/materials/models/thd2/shikieiki/shikieiki_mmd.vmat_c new file mode 100755 index 0000000..dddc2a5 Binary files /dev/null and b/materials/models/thd2/shikieiki/shikieiki_mmd.vmat_c differ diff --git a/materials/models/thd2/shikieiki/shikieiki_mmd_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/shikieiki/shikieiki_mmd_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/shikieiki/shikieiki_mmd_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/wriggle/wriggle_mmd_2.vmat_c b/materials/models/thd2/wriggle/wriggle_mmd_2.vmat_c new file mode 100755 index 0000000..e4bde23 Binary files /dev/null and b/materials/models/thd2/wriggle/wriggle_mmd_2.vmat_c differ diff --git a/materials/models/thd2/wriggle/wriggle_mmd_2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/wriggle/wriggle_mmd_2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..21d9065 Binary files /dev/null and b/materials/models/thd2/wriggle/wriggle_mmd_2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/wriggle/wriggle_mmd_tga_1aab12e5.vtex_c b/materials/models/thd2/wriggle/wriggle_mmd_tga_1aab12e5.vtex_c new file mode 100755 index 0000000..41b1a78 Binary files /dev/null and b/materials/models/thd2/wriggle/wriggle_mmd_tga_1aab12e5.vtex_c differ diff --git a/materials/models/thd2/yukari/yukari_mmd_02.vmat_c b/materials/models/thd2/yukari/yukari_mmd_02.vmat_c new file mode 100755 index 0000000..678dba4 Binary files /dev/null and b/materials/models/thd2/yukari/yukari_mmd_02.vmat_c differ diff --git a/materials/models/thd2/yukari/yukari_mmd_02_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/yukari/yukari_mmd_02_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/models/thd2/yukari/yukari_mmd_02_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/yukari/yukari_mmd_2_tga_2f4d2a1a.vtex_c b/materials/models/thd2/yukari/yukari_mmd_2_tga_2f4d2a1a.vtex_c new file mode 100755 index 0000000..4afae8f Binary files /dev/null and b/materials/models/thd2/yukari/yukari_mmd_2_tga_2f4d2a1a.vtex_c differ diff --git a/materials/models/thd2/yukari/yukari_mmd_d.vmat_c b/materials/models/thd2/yukari/yukari_mmd_d.vmat_c new file mode 100755 index 0000000..f0baec1 Binary files /dev/null and b/materials/models/thd2/yukari/yukari_mmd_d.vmat_c differ diff --git a/materials/models/thd2/yukari/yukari_mmd_d_tga_7bc475c9.vtex_c b/materials/models/thd2/yukari/yukari_mmd_d_tga_7bc475c9.vtex_c new file mode 100755 index 0000000..b866f86 Binary files /dev/null and b/materials/models/thd2/yukari/yukari_mmd_d_tga_7bc475c9.vtex_c differ diff --git a/materials/models/thd2/yukari/yukari_mmd_q.vmat_c b/materials/models/thd2/yukari/yukari_mmd_q.vmat_c new file mode 100755 index 0000000..8a7f09d Binary files /dev/null and b/materials/models/thd2/yukari/yukari_mmd_q.vmat_c differ diff --git a/materials/models/thd2/yukari/yukari_mmd_q_tga_6337ffe0.vtex_c b/materials/models/thd2/yukari/yukari_mmd_q_tga_6337ffe0.vtex_c new file mode 100755 index 0000000..2c53e31 Binary files /dev/null and b/materials/models/thd2/yukari/yukari_mmd_q_tga_6337ffe0.vtex_c differ diff --git a/materials/models/thd2/yukkuri.vmat_c b/materials/models/thd2/yukkuri.vmat_c new file mode 100755 index 0000000..7259014 Binary files /dev/null and b/materials/models/thd2/yukkuri.vmat_c differ diff --git a/materials/models/thd2/yukkuri_face.vmat_c b/materials/models/thd2/yukkuri_face.vmat_c new file mode 100755 index 0000000..3c8eef1 Binary files /dev/null and b/materials/models/thd2/yukkuri_face.vmat_c differ diff --git a/materials/models/thd2/yukkuri_face_tga_ae56b93c.vtex_c b/materials/models/thd2/yukkuri_face_tga_ae56b93c.vtex_c new file mode 100755 index 0000000..640f1fc Binary files /dev/null and b/materials/models/thd2/yukkuri_face_tga_ae56b93c.vtex_c differ diff --git a/materials/models/thd2/yukkuri_tga_527d89f.vtex_c b/materials/models/thd2/yukkuri_tga_527d89f.vtex_c new file mode 100755 index 0000000..9e3ed6d Binary files /dev/null and b/materials/models/thd2/yukkuri_tga_527d89f.vtex_c differ diff --git a/materials/models/thd2/yukkuri_tga_c9cc7be4.vtex_c b/materials/models/thd2/yukkuri_tga_c9cc7be4.vtex_c new file mode 100755 index 0000000..169ae48 Binary files /dev/null and b/materials/models/thd2/yukkuri_tga_c9cc7be4.vtex_c differ diff --git a/materials/models/thd2/yukkuri_vmat_g_tmasks1_ce06f645.vtex_c b/materials/models/thd2/yukkuri_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/models/thd2/yukkuri_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/models/thd2/yuukaspark.vmat_c b/materials/models/thd2/yuukaspark.vmat_c new file mode 100755 index 0000000..cf4f879 Binary files /dev/null and b/materials/models/thd2/yuukaspark.vmat_c differ diff --git a/materials/models/thd2/yuyuko_fan.vmat_c b/materials/models/thd2/yuyuko_fan.vmat_c new file mode 100755 index 0000000..1b9777d Binary files /dev/null and b/materials/models/thd2/yuyuko_fan.vmat_c differ diff --git a/materials/models/zap1_red_tga_33d11c98.vtex_c b/materials/models/zap1_red_tga_33d11c98.vtex_c new file mode 100755 index 0000000..181d924 Binary files /dev/null and b/materials/models/zap1_red_tga_33d11c98.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_cloth.vmat_c b/materials/new_touhou_model/aya/aya_cloth.vmat_c new file mode 100755 index 0000000..3ae11de Binary files /dev/null and b/materials/new_touhou_model/aya/aya_cloth.vmat_c differ diff --git a/materials/new_touhou_model/aya/aya_cloth_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/aya/aya_cloth_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/aya/aya_cloth_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/aya/aya_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/aya/aya_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/aya/aya_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_eye.vmat_c b/materials/new_touhou_model/aya/aya_eye.vmat_c new file mode 100755 index 0000000..c7e8447 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_eye.vmat_c differ diff --git a/materials/new_touhou_model/aya/aya_eye_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/aya/aya_eye_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/aya/aya_eye_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_eye_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/aya/aya_eye_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_eye_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_eye_vmat_g_tmasks2_89c92044.vtex_c b/materials/new_touhou_model/aya/aya_eye_vmat_g_tmasks2_89c92044.vtex_c new file mode 100755 index 0000000..6d3545f Binary files /dev/null and b/materials/new_touhou_model/aya/aya_eye_vmat_g_tmasks2_89c92044.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_hair1.vmat_c b/materials/new_touhou_model/aya/aya_hair1.vmat_c new file mode 100755 index 0000000..3799e75 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_hair1.vmat_c differ diff --git a/materials/new_touhou_model/aya/aya_hair1_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/aya/aya_hair1_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_hair1_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/aya/aya_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/aya/aya_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_hair2.vmat_c b/materials/new_touhou_model/aya/aya_hair2.vmat_c new file mode 100755 index 0000000..aa576cc Binary files /dev/null and b/materials/new_touhou_model/aya/aya_hair2.vmat_c differ diff --git a/materials/new_touhou_model/aya/aya_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/aya/aya_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/aya/aya_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/aya/aya_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_leather.vmat_c b/materials/new_touhou_model/aya/aya_leather.vmat_c new file mode 100755 index 0000000..1f2b45f Binary files /dev/null and b/materials/new_touhou_model/aya/aya_leather.vmat_c differ diff --git a/materials/new_touhou_model/aya/aya_leather_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/aya/aya_leather_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_leather_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_leather_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/aya/aya_leather_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/aya/aya_leather_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_met.vmat_c b/materials/new_touhou_model/aya/aya_met.vmat_c new file mode 100755 index 0000000..e738784 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_met.vmat_c differ diff --git a/materials/new_touhou_model/aya/aya_met_normal_png_6be8c3ec.vtex_c b/materials/new_touhou_model/aya/aya_met_normal_png_6be8c3ec.vtex_c new file mode 100755 index 0000000..b73d58a Binary files /dev/null and b/materials/new_touhou_model/aya/aya_met_normal_png_6be8c3ec.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_met_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/aya/aya_met_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_met_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_met_vmat_g_tmasks2_c2816ebb.vtex_c b/materials/new_touhou_model/aya/aya_met_vmat_g_tmasks2_c2816ebb.vtex_c new file mode 100755 index 0000000..e4c233d Binary files /dev/null and b/materials/new_touhou_model/aya/aya_met_vmat_g_tmasks2_c2816ebb.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_met_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/aya/aya_met_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/aya/aya_met_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_plush.vmat_c b/materials/new_touhou_model/aya/aya_plush.vmat_c new file mode 100755 index 0000000..2fe6cf7 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_plush.vmat_c differ diff --git a/materials/new_touhou_model/aya/aya_plush_vmat_g_tmasks1_473f24f9.vtex_c b/materials/new_touhou_model/aya/aya_plush_vmat_g_tmasks1_473f24f9.vtex_c new file mode 100755 index 0000000..763bc12 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_plush_vmat_g_tmasks1_473f24f9.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_plush_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/aya/aya_plush_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_plush_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_plush_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/aya/aya_plush_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/aya/aya_plush_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_skin.vmat_c b/materials/new_touhou_model/aya/aya_skin.vmat_c new file mode 100755 index 0000000..9e20c55 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_skin.vmat_c differ diff --git a/materials/new_touhou_model/aya/aya_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/aya/aya_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/aya/aya_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_skin_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/aya/aya_skin_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/aya/aya_skin_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_skin_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/aya/aya_skin_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/aya/aya_skin_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_tga_659586e2.vtex_c b/materials/new_touhou_model/aya/aya_tga_659586e2.vtex_c new file mode 100755 index 0000000..2c2eb73 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_tga_659586e2.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_wing.vmat_c b/materials/new_touhou_model/aya/aya_wing.vmat_c new file mode 100755 index 0000000..731adab Binary files /dev/null and b/materials/new_touhou_model/aya/aya_wing.vmat_c differ diff --git a/materials/new_touhou_model/aya/aya_wing_normal_png_50903d9d.vtex_c b/materials/new_touhou_model/aya/aya_wing_normal_png_50903d9d.vtex_c new file mode 100755 index 0000000..c2427a8 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_wing_normal_png_50903d9d.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_wing_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/aya/aya_wing_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/aya/aya_wing_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_wing_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/aya/aya_wing_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/aya/aya_wing_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_wood.vmat_c b/materials/new_touhou_model/aya/aya_wood.vmat_c new file mode 100755 index 0000000..607e24d Binary files /dev/null and b/materials/new_touhou_model/aya/aya_wood.vmat_c differ diff --git a/materials/new_touhou_model/aya/aya_wood_vmat_g_tmasks1_a1377df4.vtex_c b/materials/new_touhou_model/aya/aya_wood_vmat_g_tmasks1_a1377df4.vtex_c new file mode 100755 index 0000000..4933e9f Binary files /dev/null and b/materials/new_touhou_model/aya/aya_wood_vmat_g_tmasks1_a1377df4.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_wood_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/aya/aya_wood_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/aya/aya_wood_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/aya/aya_wood_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/aya/aya_wood_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/aya/aya_wood_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_cloth.vmat_c b/materials/new_touhou_model/cirno/cirno_cloth.vmat_c new file mode 100755 index 0000000..afdac45 Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_cloth.vmat_c differ diff --git a/materials/new_touhou_model/cirno/cirno_cloth_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/cirno/cirno_cloth_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_cloth_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/cirno/cirno_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_eye.vmat_c b/materials/new_touhou_model/cirno/cirno_eye.vmat_c new file mode 100755 index 0000000..b49161b Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_eye.vmat_c differ diff --git a/materials/new_touhou_model/cirno/cirno_eye_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/cirno/cirno_eye_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_eye_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_hair1.vmat_c b/materials/new_touhou_model/cirno/cirno_hair1.vmat_c new file mode 100755 index 0000000..919c36d Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_hair1.vmat_c differ diff --git a/materials/new_touhou_model/cirno/cirno_hair1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/cirno/cirno_hair1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_hair1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/cirno/cirno_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_hair2.vmat_c b/materials/new_touhou_model/cirno/cirno_hair2.vmat_c new file mode 100755 index 0000000..134199f Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_hair2.vmat_c differ diff --git a/materials/new_touhou_model/cirno/cirno_hair2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/cirno/cirno_hair2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_hair2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/cirno/cirno_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_leather.vmat_c b/materials/new_touhou_model/cirno/cirno_leather.vmat_c new file mode 100755 index 0000000..5459f27 Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_leather.vmat_c differ diff --git a/materials/new_touhou_model/cirno/cirno_leather_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/cirno/cirno_leather_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_leather_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_leather_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/cirno/cirno_leather_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_leather_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_metal.vmat_c b/materials/new_touhou_model/cirno/cirno_metal.vmat_c new file mode 100755 index 0000000..0c0bb0c Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_metal.vmat_c differ diff --git a/materials/new_touhou_model/cirno/cirno_metal_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/cirno/cirno_metal_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_metal_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_metal_vmat_g_tmasks2_833dba4f.vtex_c b/materials/new_touhou_model/cirno/cirno_metal_vmat_g_tmasks2_833dba4f.vtex_c new file mode 100755 index 0000000..90a219b Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_metal_vmat_g_tmasks2_833dba4f.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_metal_vmat_g_tmasks2_c2816ebb.vtex_c b/materials/new_touhou_model/cirno/cirno_metal_vmat_g_tmasks2_c2816ebb.vtex_c new file mode 100755 index 0000000..e4c233d Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_metal_vmat_g_tmasks2_c2816ebb.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_metal_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/cirno/cirno_metal_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_metal_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_skin.vmat_c b/materials/new_touhou_model/cirno/cirno_skin.vmat_c new file mode 100755 index 0000000..3d06397 Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_skin.vmat_c differ diff --git a/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks1_fa11df49.vtex_c b/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks1_fa11df49.vtex_c new file mode 100755 index 0000000..0fb91ec Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks1_fa11df49.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks2_813a544c.vtex_c b/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks2_813a544c.vtex_c new file mode 100755 index 0000000..02464ea Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks2_813a544c.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks2_c50af51b.vtex_c b/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks2_c50af51b.vtex_c new file mode 100755 index 0000000..5484030 Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks2_c50af51b.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_skin_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/cirno/cirno_tga_d66bdc9.vtex_c b/materials/new_touhou_model/cirno/cirno_tga_d66bdc9.vtex_c new file mode 100755 index 0000000..e641a2e Binary files /dev/null and b/materials/new_touhou_model/cirno/cirno_tga_d66bdc9.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_cloth.vmat_c b/materials/new_touhou_model/clownpiece/clownpiece_cloth.vmat_c new file mode 100755 index 0000000..6ba462c Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_cloth.vmat_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_eye.vmat_c b/materials/new_touhou_model/clownpiece/clownpiece_eye.vmat_c new file mode 100755 index 0000000..cfe5b16 Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_eye.vmat_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_eye_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_eye_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_eye_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_hair1.vmat_c b/materials/new_touhou_model/clownpiece/clownpiece_hair1.vmat_c new file mode 100755 index 0000000..9e2525b Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_hair1.vmat_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_hair1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_hair1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_hair1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_hair2.vmat_c b/materials/new_touhou_model/clownpiece/clownpiece_hair2.vmat_c new file mode 100755 index 0000000..fd902d2 Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_hair2.vmat_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_skin.vmat_c b/materials/new_touhou_model/clownpiece/clownpiece_skin.vmat_c new file mode 100755 index 0000000..58a2cfb Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_skin.vmat_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_skin_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_skin_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_skin_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_tga_654f2558.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_tga_654f2558.vtex_c new file mode 100755 index 0000000..b3f71ed Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_tga_654f2558.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_tga_7d06ad43.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_tga_7d06ad43.vtex_c new file mode 100755 index 0000000..d614556 Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_tga_7d06ad43.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_weapon.vmat_c b/materials/new_touhou_model/clownpiece/clownpiece_weapon.vmat_c new file mode 100755 index 0000000..f7074b8 Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_weapon.vmat_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_weapon_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_weapon_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_weapon_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_weapon_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_weapon_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_weapon_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_wing.vmat_c b/materials/new_touhou_model/clownpiece/clownpiece_wing.vmat_c new file mode 100755 index 0000000..01f0178 Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_wing.vmat_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_wing_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_wing_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_wing_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/clownpiece/clownpiece_wing_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/clownpiece/clownpiece_wing_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/clownpiece/clownpiece_wing_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_cloth.vmat_c b/materials/new_touhou_model/flandre/flandre_cloth.vmat_c new file mode 100755 index 0000000..5c83f06 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_cloth.vmat_c differ diff --git a/materials/new_touhou_model/flandre/flandre_cloth_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/flandre/flandre_cloth_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_cloth_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/flandre/flandre_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/flandre/flandre_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_eye.vmat_c b/materials/new_touhou_model/flandre/flandre_eye.vmat_c new file mode 100755 index 0000000..c347130 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_eye.vmat_c differ diff --git a/materials/new_touhou_model/flandre/flandre_eye_vmat_g_tmasks1_5fca2540.vtex_c b/materials/new_touhou_model/flandre/flandre_eye_vmat_g_tmasks1_5fca2540.vtex_c new file mode 100755 index 0000000..cf5956e Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_eye_vmat_g_tmasks1_5fca2540.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_eye_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/flandre/flandre_eye_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_eye_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_eye_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/flandre/flandre_eye_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_eye_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_hair1.vmat_c b/materials/new_touhou_model/flandre/flandre_hair1.vmat_c new file mode 100755 index 0000000..19e10d1 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_hair1.vmat_c differ diff --git a/materials/new_touhou_model/flandre/flandre_hair1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/flandre/flandre_hair1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_hair1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_hair1_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/flandre/flandre_hair1_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_hair1_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/flandre/flandre_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_hair2.vmat_c b/materials/new_touhou_model/flandre/flandre_hair2.vmat_c new file mode 100755 index 0000000..adcba78 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_hair2.vmat_c differ diff --git a/materials/new_touhou_model/flandre/flandre_hair2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/flandre/flandre_hair2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_hair2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/flandre/flandre_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/flandre/flandre_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_leather.vmat_c b/materials/new_touhou_model/flandre/flandre_leather.vmat_c new file mode 100755 index 0000000..3b4301a Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_leather.vmat_c differ diff --git a/materials/new_touhou_model/flandre/flandre_leather_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/flandre/flandre_leather_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_leather_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_leather_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/flandre/flandre_leather_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_leather_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_leather_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/flandre/flandre_leather_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_leather_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_met_png_c6fcbcac.vtex_c b/materials/new_touhou_model/flandre/flandre_met_png_c6fcbcac.vtex_c new file mode 100755 index 0000000..12fce28 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_met_png_c6fcbcac.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_metal.vmat_c b/materials/new_touhou_model/flandre/flandre_metal.vmat_c new file mode 100755 index 0000000..fdd8714 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_metal.vmat_c differ diff --git a/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks2_c2816ebb.vtex_c b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks2_c2816ebb.vtex_c new file mode 100755 index 0000000..e4c233d Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks2_c2816ebb.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks2_eb28111d.vtex_c b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks2_eb28111d.vtex_c new file mode 100755 index 0000000..496f3bf Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks2_eb28111d.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks2_fd46aca1.vtex_c b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks2_fd46aca1.vtex_c new file mode 100755 index 0000000..46a553c Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tmasks2_fd46aca1.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_metal_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_skin.vmat_c b/materials/new_touhou_model/flandre/flandre_skin.vmat_c new file mode 100755 index 0000000..5ca9b1f Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_skin.vmat_c differ diff --git a/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_a4454a16.vtex_c b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_a4454a16.vtex_c new file mode 100755 index 0000000..5fbb0e0 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_a4454a16.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_bc824215.vtex_c b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_bc824215.vtex_c new file mode 100755 index 0000000..6e0ac5f Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_bc824215.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_fa11df49.vtex_c b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_fa11df49.vtex_c new file mode 100755 index 0000000..0fb91ec Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_fa11df49.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_skin_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_tga_512d33d9.vtex_c b/materials/new_touhou_model/flandre/flandre_tga_512d33d9.vtex_c new file mode 100755 index 0000000..37b315a Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_tga_512d33d9.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_tga_9517a057.vtex_c b/materials/new_touhou_model/flandre/flandre_tga_9517a057.vtex_c new file mode 100755 index 0000000..21d8a26 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_tga_9517a057.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_weapon.vmat_c b/materials/new_touhou_model/flandre/flandre_weapon.vmat_c new file mode 100755 index 0000000..e515e1b Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_weapon.vmat_c differ diff --git a/materials/new_touhou_model/flandre/flandre_weapon_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/flandre/flandre_weapon_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_weapon_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_weapon_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/flandre/flandre_weapon_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_weapon_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_weapon_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/flandre/flandre_weapon_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_weapon_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_weapon_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/flandre/flandre_weapon_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_weapon_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_wing.vmat_c b/materials/new_touhou_model/flandre/flandre_wing.vmat_c new file mode 100755 index 0000000..d88691f Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_wing.vmat_c differ diff --git a/materials/new_touhou_model/flandre/flandre_wing_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/flandre/flandre_wing_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_wing_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/flandre/flandre_wing_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/flandre/flandre_wing_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/flandre/flandre_wing_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball.vmat_c b/materials/new_touhou_model/hecatia/hecatia_ball.vmat_c new file mode 100755 index 0000000..c43047a Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_blue.vmat_c b/materials/new_touhou_model/hecatia/hecatia_ball_blue.vmat_c new file mode 100755 index 0000000..4fa8c79 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_blue.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_blue_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_ball_blue_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_blue_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_blue_vmat_g_tmasks2_c2816ebb.vtex_c b/materials/new_touhou_model/hecatia/hecatia_ball_blue_vmat_g_tmasks2_c2816ebb.vtex_c new file mode 100755 index 0000000..e4c233d Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_blue_vmat_g_tmasks2_c2816ebb.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_blue_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/hecatia/hecatia_ball_blue_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_blue_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_red.vmat_c b/materials/new_touhou_model/hecatia/hecatia_ball_red.vmat_c new file mode 100755 index 0000000..165b6d0 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_red.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_red_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_ball_red_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_red_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_red_vmat_g_tmasks2_c2816ebb.vtex_c b/materials/new_touhou_model/hecatia/hecatia_ball_red_vmat_g_tmasks2_c2816ebb.vtex_c new file mode 100755 index 0000000..e4c233d Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_red_vmat_g_tmasks2_c2816ebb.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_red_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/hecatia/hecatia_ball_red_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_red_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_ball_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_vmat_g_tmasks2_c2816ebb.vtex_c b/materials/new_touhou_model/hecatia/hecatia_ball_vmat_g_tmasks2_c2816ebb.vtex_c new file mode 100755 index 0000000..e4c233d Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_vmat_g_tmasks2_c2816ebb.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/hecatia/hecatia_ball_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_yellow.vmat_c b/materials/new_touhou_model/hecatia/hecatia_ball_yellow.vmat_c new file mode 100755 index 0000000..570c4fb Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_yellow.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_yellow_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_ball_yellow_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_yellow_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_yellow_vmat_g_tmasks2_c2816ebb.vtex_c b/materials/new_touhou_model/hecatia/hecatia_ball_yellow_vmat_g_tmasks2_c2816ebb.vtex_c new file mode 100755 index 0000000..e4c233d Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_yellow_vmat_g_tmasks2_c2816ebb.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_ball_yellow_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/hecatia/hecatia_ball_yellow_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_ball_yellow_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_cloth.vmat_c b/materials/new_touhou_model/hecatia/hecatia_cloth.vmat_c new file mode 100755 index 0000000..ce672e4 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_cloth.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/hecatia/hecatia_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_earth_cloth.vmat_c b/materials/new_touhou_model/hecatia/hecatia_earth_cloth.vmat_c new file mode 100755 index 0000000..cb0c70b Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_earth_cloth.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_earth_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_earth_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_earth_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_earth_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/hecatia/hecatia_earth_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_earth_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_earth_eye.vmat_c b/materials/new_touhou_model/hecatia/hecatia_earth_eye.vmat_c new file mode 100755 index 0000000..37b3521 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_earth_eye.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_earth_eye_vmat_g_tmasks1_5fca2540.vtex_c b/materials/new_touhou_model/hecatia/hecatia_earth_eye_vmat_g_tmasks1_5fca2540.vtex_c new file mode 100755 index 0000000..cf5956e Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_earth_eye_vmat_g_tmasks1_5fca2540.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_earth_hair2.vmat_c b/materials/new_touhou_model/hecatia/hecatia_earth_hair2.vmat_c new file mode 100755 index 0000000..b2da7fd Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_earth_hair2.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_earth_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_earth_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_earth_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_earth_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/hecatia/hecatia_earth_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_earth_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_earth_tga_cd66d6fe.vtex_c b/materials/new_touhou_model/hecatia/hecatia_earth_tga_cd66d6fe.vtex_c new file mode 100755 index 0000000..c9b6003 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_earth_tga_cd66d6fe.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_eye.vmat_c b/materials/new_touhou_model/hecatia/hecatia_eye.vmat_c new file mode 100755 index 0000000..2497371 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_eye.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_eye_vmat_g_tmasks1_5fca2540.vtex_c b/materials/new_touhou_model/hecatia/hecatia_eye_vmat_g_tmasks1_5fca2540.vtex_c new file mode 100755 index 0000000..cf5956e Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_eye_vmat_g_tmasks1_5fca2540.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_hair1.vmat_c b/materials/new_touhou_model/hecatia/hecatia_hair1.vmat_c new file mode 100755 index 0000000..1996e08 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_hair1.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_hair1_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_hair1_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_hair1_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/hecatia/hecatia_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_hair2.vmat_c b/materials/new_touhou_model/hecatia/hecatia_hair2.vmat_c new file mode 100755 index 0000000..6d85aeb Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_hair2.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/hecatia/hecatia_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_leather.vmat_c b/materials/new_touhou_model/hecatia/hecatia_leather.vmat_c new file mode 100755 index 0000000..181de27 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_leather.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_leather_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_leather_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_leather_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_leather_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/hecatia/hecatia_leather_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_leather_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_metal.vmat_c b/materials/new_touhou_model/hecatia/hecatia_metal.vmat_c new file mode 100755 index 0000000..b59d121 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_metal.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_metal_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_metal_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_metal_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_metal_vmat_g_tmasks2_c2816ebb.vtex_c b/materials/new_touhou_model/hecatia/hecatia_metal_vmat_g_tmasks2_c2816ebb.vtex_c new file mode 100755 index 0000000..e4c233d Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_metal_vmat_g_tmasks2_c2816ebb.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_metal_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/hecatia/hecatia_metal_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_metal_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_moon_cloth.vmat_c b/materials/new_touhou_model/hecatia/hecatia_moon_cloth.vmat_c new file mode 100755 index 0000000..c9a4674 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_moon_cloth.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_moon_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_moon_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_moon_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_moon_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/hecatia/hecatia_moon_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_moon_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_moon_eye.vmat_c b/materials/new_touhou_model/hecatia/hecatia_moon_eye.vmat_c new file mode 100755 index 0000000..500ac37 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_moon_eye.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_moon_eye_vmat_g_tmasks1_5fca2540.vtex_c b/materials/new_touhou_model/hecatia/hecatia_moon_eye_vmat_g_tmasks1_5fca2540.vtex_c new file mode 100755 index 0000000..cf5956e Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_moon_eye_vmat_g_tmasks1_5fca2540.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_moon_hair2.vmat_c b/materials/new_touhou_model/hecatia/hecatia_moon_hair2.vmat_c new file mode 100755 index 0000000..b0d0f8e Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_moon_hair2.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_moon_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/hecatia/hecatia_moon_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_moon_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_moon_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/hecatia/hecatia_moon_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_moon_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_moon_tga_14bb1e1c.vtex_c b/materials/new_touhou_model/hecatia/hecatia_moon_tga_14bb1e1c.vtex_c new file mode 100755 index 0000000..69fb021 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_moon_tga_14bb1e1c.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_skin.vmat_c b/materials/new_touhou_model/hecatia/hecatia_skin.vmat_c new file mode 100755 index 0000000..e131718 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_skin.vmat_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/hecatia/hecatia_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_skin_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/hecatia/hecatia_skin_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_skin_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_tga_5854310d.vtex_c b/materials/new_touhou_model/hecatia/hecatia_tga_5854310d.vtex_c new file mode 100755 index 0000000..b47d210 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_tga_5854310d.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_tga_6304a201.vtex_c b/materials/new_touhou_model/hecatia/hecatia_tga_6304a201.vtex_c new file mode 100755 index 0000000..7377318 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_tga_6304a201.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_tga_7c66f6ae.vtex_c b/materials/new_touhou_model/hecatia/hecatia_tga_7c66f6ae.vtex_c new file mode 100755 index 0000000..4362b74 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_tga_7c66f6ae.vtex_c differ diff --git a/materials/new_touhou_model/hecatia/hecatia_tga_c8ace0df.vtex_c b/materials/new_touhou_model/hecatia/hecatia_tga_c8ace0df.vtex_c new file mode 100755 index 0000000..8f36485 Binary files /dev/null and b/materials/new_touhou_model/hecatia/hecatia_tga_c8ace0df.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_cloth.vmat_c b/materials/new_touhou_model/junko/junko_cloth.vmat_c new file mode 100755 index 0000000..f7e3360 Binary files /dev/null and b/materials/new_touhou_model/junko/junko_cloth.vmat_c differ diff --git a/materials/new_touhou_model/junko/junko_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/junko/junko_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/junko/junko_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/junko/junko_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/junko/junko_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_eye.vmat_c b/materials/new_touhou_model/junko/junko_eye.vmat_c new file mode 100755 index 0000000..5148338 Binary files /dev/null and b/materials/new_touhou_model/junko/junko_eye.vmat_c differ diff --git a/materials/new_touhou_model/junko/junko_eye_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/junko/junko_eye_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/junko/junko_eye_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_hair1.vmat_c b/materials/new_touhou_model/junko/junko_hair1.vmat_c new file mode 100755 index 0000000..b311c49 Binary files /dev/null and b/materials/new_touhou_model/junko/junko_hair1.vmat_c differ diff --git a/materials/new_touhou_model/junko/junko_hair1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/junko/junko_hair1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/junko/junko_hair1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/junko/junko_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/junko/junko_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_hair2.vmat_c b/materials/new_touhou_model/junko/junko_hair2.vmat_c new file mode 100755 index 0000000..c722c58 Binary files /dev/null and b/materials/new_touhou_model/junko/junko_hair2.vmat_c differ diff --git a/materials/new_touhou_model/junko/junko_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/junko/junko_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/junko/junko_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/junko/junko_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/junko/junko_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_leather.vmat_c b/materials/new_touhou_model/junko/junko_leather.vmat_c new file mode 100755 index 0000000..ad5fdc3 Binary files /dev/null and b/materials/new_touhou_model/junko/junko_leather.vmat_c differ diff --git a/materials/new_touhou_model/junko/junko_leather_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/junko/junko_leather_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/junko/junko_leather_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_leather_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/junko/junko_leather_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/junko/junko_leather_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_skin.vmat_c b/materials/new_touhou_model/junko/junko_skin.vmat_c new file mode 100755 index 0000000..d53bc51 Binary files /dev/null and b/materials/new_touhou_model/junko/junko_skin.vmat_c differ diff --git a/materials/new_touhou_model/junko/junko_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/junko/junko_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/junko/junko_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_skin_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/junko/junko_skin_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/junko/junko_skin_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_tga_a90f3716.vtex_c b/materials/new_touhou_model/junko/junko_tga_a90f3716.vtex_c new file mode 100755 index 0000000..b96ee9e Binary files /dev/null and b/materials/new_touhou_model/junko/junko_tga_a90f3716.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_wail.vmat_c b/materials/new_touhou_model/junko/junko_wail.vmat_c new file mode 100755 index 0000000..74de581 Binary files /dev/null and b/materials/new_touhou_model/junko/junko_wail.vmat_c differ diff --git a/materials/new_touhou_model/junko/junko_wail_vmat_g_tmasks1_6d020679.vtex_c b/materials/new_touhou_model/junko/junko_wail_vmat_g_tmasks1_6d020679.vtex_c new file mode 100755 index 0000000..0767af6 Binary files /dev/null and b/materials/new_touhou_model/junko/junko_wail_vmat_g_tmasks1_6d020679.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_wail_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/junko/junko_wail_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/junko/junko_wail_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_wail_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/junko/junko_wail_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/junko/junko_wail_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/junko/junko_wail_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/junko/junko_wail_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/junko/junko_wail_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_cloth.vmat_c b/materials/new_touhou_model/marisa/marisa_cloth.vmat_c new file mode 100755 index 0000000..a7e7449 Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_cloth.vmat_c differ diff --git a/materials/new_touhou_model/marisa/marisa_cloth_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/marisa/marisa_cloth_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_cloth_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/marisa/marisa_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/marisa/marisa_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_eye.vmat_c b/materials/new_touhou_model/marisa/marisa_eye.vmat_c new file mode 100755 index 0000000..3e29ede Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_eye.vmat_c differ diff --git a/materials/new_touhou_model/marisa/marisa_eye_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/marisa/marisa_eye_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_eye_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_hair1.vmat_c b/materials/new_touhou_model/marisa/marisa_hair1.vmat_c new file mode 100755 index 0000000..d4c9b98 Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_hair1.vmat_c differ diff --git a/materials/new_touhou_model/marisa/marisa_hair1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/marisa/marisa_hair1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_hair1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/marisa/marisa_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_hair2.vmat_c b/materials/new_touhou_model/marisa/marisa_hair2.vmat_c new file mode 100755 index 0000000..0ce3f9f Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_hair2.vmat_c differ diff --git a/materials/new_touhou_model/marisa/marisa_hair2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/marisa/marisa_hair2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_hair2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/marisa/marisa_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/marisa/marisa_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_leather.vmat_c b/materials/new_touhou_model/marisa/marisa_leather.vmat_c new file mode 100755 index 0000000..6d578f5 Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_leather.vmat_c differ diff --git a/materials/new_touhou_model/marisa/marisa_leather_vmat_g_tmasks1_560eceba.vtex_c b/materials/new_touhou_model/marisa/marisa_leather_vmat_g_tmasks1_560eceba.vtex_c new file mode 100755 index 0000000..2ecb630 Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_leather_vmat_g_tmasks1_560eceba.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_leather_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/marisa/marisa_leather_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_leather_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_leather_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/marisa/marisa_leather_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_leather_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_skin.vmat_c b/materials/new_touhou_model/marisa/marisa_skin.vmat_c new file mode 100755 index 0000000..74d19cc Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_skin.vmat_c differ diff --git a/materials/new_touhou_model/marisa/marisa_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/marisa/marisa_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_skin_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/marisa/marisa_skin_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_skin_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_tga_daf7ac0e.vtex_c b/materials/new_touhou_model/marisa/marisa_tga_daf7ac0e.vtex_c new file mode 100755 index 0000000..d9c667b Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_tga_daf7ac0e.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_wood.vmat_c b/materials/new_touhou_model/marisa/marisa_wood.vmat_c new file mode 100755 index 0000000..3779d89 Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_wood.vmat_c differ diff --git a/materials/new_touhou_model/marisa/marisa_wood_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/marisa/marisa_wood_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_wood_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/marisa/marisa_wood_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/marisa/marisa_wood_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/marisa/marisa_wood_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_cloth.vmat_c b/materials/new_touhou_model/patchouli/patchouli_cloth.vmat_c new file mode 100755 index 0000000..ee4976b Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_cloth.vmat_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/patchouli/patchouli_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/patchouli/patchouli_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_eye.vmat_c b/materials/new_touhou_model/patchouli/patchouli_eye.vmat_c new file mode 100755 index 0000000..66ec91a Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_eye.vmat_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_eye_vmat_g_tmasks1_5fca2540.vtex_c b/materials/new_touhou_model/patchouli/patchouli_eye_vmat_g_tmasks1_5fca2540.vtex_c new file mode 100755 index 0000000..cf5956e Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_eye_vmat_g_tmasks1_5fca2540.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_hair1.vmat_c b/materials/new_touhou_model/patchouli/patchouli_hair1.vmat_c new file mode 100755 index 0000000..4080988 Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_hair1.vmat_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_hair1_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/patchouli/patchouli_hair1_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_hair1_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/patchouli/patchouli_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_hair2.vmat_c b/materials/new_touhou_model/patchouli/patchouli_hair2.vmat_c new file mode 100755 index 0000000..d000c4f Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_hair2.vmat_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/patchouli/patchouli_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/patchouli/patchouli_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_metal.vmat_c b/materials/new_touhou_model/patchouli/patchouli_metal.vmat_c new file mode 100755 index 0000000..81235ab Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_metal.vmat_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_metal2.vmat_c b/materials/new_touhou_model/patchouli/patchouli_metal2.vmat_c new file mode 100755 index 0000000..bedcef7 Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_metal2.vmat_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_metal2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/patchouli/patchouli_metal2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_metal2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_metal2_vmat_g_tmasks2_c2816ebb.vtex_c b/materials/new_touhou_model/patchouli/patchouli_metal2_vmat_g_tmasks2_c2816ebb.vtex_c new file mode 100755 index 0000000..e4c233d Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_metal2_vmat_g_tmasks2_c2816ebb.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_metal2_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/patchouli/patchouli_metal2_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_metal2_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_metal_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/patchouli/patchouli_metal_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_metal_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_metal_vmat_g_tmasks2_c2816ebb.vtex_c b/materials/new_touhou_model/patchouli/patchouli_metal_vmat_g_tmasks2_c2816ebb.vtex_c new file mode 100755 index 0000000..e4c233d Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_metal_vmat_g_tmasks2_c2816ebb.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_metal_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/patchouli/patchouli_metal_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_metal_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_skin.vmat_c b/materials/new_touhou_model/patchouli/patchouli_skin.vmat_c new file mode 100755 index 0000000..ee91e73 Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_skin.vmat_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/patchouli/patchouli_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_skin_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/patchouli/patchouli_skin_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_skin_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_tga_507f131d.vtex_c b/materials/new_touhou_model/patchouli/patchouli_tga_507f131d.vtex_c new file mode 100755 index 0000000..5e62ff3 Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_tga_507f131d.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_tga_fbd5c8cb.vtex_c b/materials/new_touhou_model/patchouli/patchouli_tga_fbd5c8cb.vtex_c new file mode 100755 index 0000000..b674147 Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_tga_fbd5c8cb.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_weapon.vmat_c b/materials/new_touhou_model/patchouli/patchouli_weapon.vmat_c new file mode 100755 index 0000000..326173f Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_weapon.vmat_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_weapon_normal_png_56587567.vtex_c b/materials/new_touhou_model/patchouli/patchouli_weapon_normal_png_56587567.vtex_c new file mode 100755 index 0000000..43a4f6f Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_weapon_normal_png_56587567.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_weapon_vmat_g_tmasks1_473f24f9.vtex_c b/materials/new_touhou_model/patchouli/patchouli_weapon_vmat_g_tmasks1_473f24f9.vtex_c new file mode 100755 index 0000000..763bc12 Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_weapon_vmat_g_tmasks1_473f24f9.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_weapon_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/patchouli/patchouli_weapon_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_weapon_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/patchouli/patchouli_weapon_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/patchouli/patchouli_weapon_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/patchouli/patchouli_weapon_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/reimu/onmyougyoku.vmat_c b/materials/new_touhou_model/reimu/onmyougyoku.vmat_c new file mode 100755 index 0000000..bc218ed Binary files /dev/null and b/materials/new_touhou_model/reimu/onmyougyoku.vmat_c differ diff --git a/materials/new_touhou_model/reimu/onmyougyoku_tga_69ae9798.vtex_c b/materials/new_touhou_model/reimu/onmyougyoku_tga_69ae9798.vtex_c new file mode 100755 index 0000000..e9c42ff Binary files /dev/null and b/materials/new_touhou_model/reimu/onmyougyoku_tga_69ae9798.vtex_c differ diff --git a/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks1_74224468.vtex_c b/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks1_74224468.vtex_c new file mode 100755 index 0000000..b2bfc61 Binary files /dev/null and b/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks1_74224468.vtex_c differ diff --git a/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks2_b7e80b83.vtex_c b/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks2_b7e80b83.vtex_c new file mode 100755 index 0000000..a2efe2f Binary files /dev/null and b/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks2_b7e80b83.vtex_c differ diff --git a/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks2_bb33221d.vtex_c b/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks2_bb33221d.vtex_c new file mode 100755 index 0000000..e97e450 Binary files /dev/null and b/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks2_bb33221d.vtex_c differ diff --git a/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks2_d078c2d0.vtex_c b/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks2_d078c2d0.vtex_c new file mode 100755 index 0000000..ff25158 Binary files /dev/null and b/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tmasks2_d078c2d0.vtex_c differ diff --git a/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/reimu/onmyougyoku_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_cloth.vmat_c b/materials/new_touhou_model/reimu/reimu_cloth.vmat_c new file mode 100755 index 0000000..d2e5091 Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_cloth.vmat_c differ diff --git a/materials/new_touhou_model/reimu/reimu_eye.vmat_c b/materials/new_touhou_model/reimu/reimu_eye.vmat_c new file mode 100755 index 0000000..fd8ec0e Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_eye.vmat_c differ diff --git a/materials/new_touhou_model/reimu/reimu_eye_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/reimu/reimu_eye_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_eye_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_hair1.vmat_c b/materials/new_touhou_model/reimu/reimu_hair1.vmat_c new file mode 100755 index 0000000..10d1d42 Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_hair1.vmat_c differ diff --git a/materials/new_touhou_model/reimu/reimu_hair1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/reimu/reimu_hair1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_hair1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_hair1_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/reimu/reimu_hair1_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_hair1_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_hair2.vmat_c b/materials/new_touhou_model/reimu/reimu_hair2.vmat_c new file mode 100755 index 0000000..12a1ddb Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_hair2.vmat_c differ diff --git a/materials/new_touhou_model/reimu/reimu_hair2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/reimu/reimu_hair2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_hair2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/reimu/reimu_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_matalness_mask_tga_1dc4372b.vtex_c b/materials/new_touhou_model/reimu/reimu_matalness_mask_tga_1dc4372b.vtex_c new file mode 100755 index 0000000..6e3057f Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_matalness_mask_tga_1dc4372b.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_matalness_mask_tga_242d1b9f.vtex_c b/materials/new_touhou_model/reimu/reimu_matalness_mask_tga_242d1b9f.vtex_c new file mode 100755 index 0000000..a78478b Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_matalness_mask_tga_242d1b9f.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_matalness_mask_tga_ddb26711.vtex_c b/materials/new_touhou_model/reimu/reimu_matalness_mask_tga_ddb26711.vtex_c new file mode 100755 index 0000000..9a13711 Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_matalness_mask_tga_ddb26711.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_skin.vmat_c b/materials/new_touhou_model/reimu/reimu_skin.vmat_c new file mode 100755 index 0000000..081a8ca Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_skin.vmat_c differ diff --git a/materials/new_touhou_model/reimu/reimu_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/reimu/reimu_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_specular_mask_tga_173ed025.vtex_c b/materials/new_touhou_model/reimu/reimu_specular_mask_tga_173ed025.vtex_c new file mode 100755 index 0000000..9e716e4 Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_specular_mask_tga_173ed025.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_specular_mask_tga_8f5d6523.vtex_c b/materials/new_touhou_model/reimu/reimu_specular_mask_tga_8f5d6523.vtex_c new file mode 100755 index 0000000..75e8f90 Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_specular_mask_tga_8f5d6523.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_specular_mask_tga_b9f4b6eb.vtex_c b/materials/new_touhou_model/reimu/reimu_specular_mask_tga_b9f4b6eb.vtex_c new file mode 100755 index 0000000..3a3390c Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_specular_mask_tga_b9f4b6eb.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_tga_754ae0f4.vtex_c b/materials/new_touhou_model/reimu/reimu_tga_754ae0f4.vtex_c new file mode 100755 index 0000000..555647e Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_tga_754ae0f4.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_weapon.vmat_c b/materials/new_touhou_model/reimu/reimu_weapon.vmat_c new file mode 100755 index 0000000..920e639 Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_weapon.vmat_c differ diff --git a/materials/new_touhou_model/reimu/reimu_weapon_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/reimu/reimu_weapon_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_weapon_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_weapon_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/reimu/reimu_weapon_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_weapon_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/reimu/reimu_wood.vmat_c b/materials/new_touhou_model/reimu/reimu_wood.vmat_c new file mode 100755 index 0000000..3fe739d Binary files /dev/null and b/materials/new_touhou_model/reimu/reimu_wood.vmat_c differ diff --git a/materials/new_touhou_model/remilia/remilia_cloth.vmat_c b/materials/new_touhou_model/remilia/remilia_cloth.vmat_c new file mode 100755 index 0000000..3b6aae4 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_cloth.vmat_c differ diff --git a/materials/new_touhou_model/remilia/remilia_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/remilia/remilia_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/remilia/remilia_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_eye.vmat_c b/materials/new_touhou_model/remilia/remilia_eye.vmat_c new file mode 100755 index 0000000..b10aadb Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_eye.vmat_c differ diff --git a/materials/new_touhou_model/remilia/remilia_eye_vmat_g_tmasks1_5fca2540.vtex_c b/materials/new_touhou_model/remilia/remilia_eye_vmat_g_tmasks1_5fca2540.vtex_c new file mode 100755 index 0000000..cf5956e Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_eye_vmat_g_tmasks1_5fca2540.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_hair1.vmat_c b/materials/new_touhou_model/remilia/remilia_hair1.vmat_c new file mode 100755 index 0000000..876dca2 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_hair1.vmat_c differ diff --git a/materials/new_touhou_model/remilia/remilia_hair1_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/remilia/remilia_hair1_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_hair1_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/remilia/remilia_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_hair2.vmat_c b/materials/new_touhou_model/remilia/remilia_hair2.vmat_c new file mode 100755 index 0000000..99e10de Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_hair2.vmat_c differ diff --git a/materials/new_touhou_model/remilia/remilia_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/remilia/remilia_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/remilia/remilia_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_metal.vmat_c b/materials/new_touhou_model/remilia/remilia_metal.vmat_c new file mode 100755 index 0000000..7b804c3 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_metal.vmat_c differ diff --git a/materials/new_touhou_model/remilia/remilia_metal_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/remilia/remilia_metal_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_metal_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_metal_vmat_g_tmasks2_c2816ebb.vtex_c b/materials/new_touhou_model/remilia/remilia_metal_vmat_g_tmasks2_c2816ebb.vtex_c new file mode 100755 index 0000000..e4c233d Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_metal_vmat_g_tmasks2_c2816ebb.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_metal_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/remilia/remilia_metal_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_metal_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_skin.vmat_c b/materials/new_touhou_model/remilia/remilia_skin.vmat_c new file mode 100755 index 0000000..e8643c9 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_skin.vmat_c differ diff --git a/materials/new_touhou_model/remilia/remilia_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/remilia/remilia_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_skin_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/remilia/remilia_skin_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_skin_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_tga_823b3730.vtex_c b/materials/new_touhou_model/remilia/remilia_tga_823b3730.vtex_c new file mode 100755 index 0000000..cd68856 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_tga_823b3730.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_weapon.vmat_c b/materials/new_touhou_model/remilia/remilia_weapon.vmat_c new file mode 100755 index 0000000..7c98db2 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_weapon.vmat_c differ diff --git a/materials/new_touhou_model/remilia/remilia_weapon_normal_png_1ce7764e.vtex_c b/materials/new_touhou_model/remilia/remilia_weapon_normal_png_1ce7764e.vtex_c new file mode 100755 index 0000000..8a70032 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_weapon_normal_png_1ce7764e.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_weapon_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/remilia/remilia_weapon_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_weapon_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_weapon_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/remilia/remilia_weapon_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_weapon_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_wing.vmat_c b/materials/new_touhou_model/remilia/remilia_wing.vmat_c new file mode 100755 index 0000000..0c61815 Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_wing.vmat_c differ diff --git a/materials/new_touhou_model/remilia/remilia_wing_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/remilia/remilia_wing_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_wing_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/remilia/remilia_wing_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/remilia/remilia_wing_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/remilia/remilia_wing_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_cloth.vmat_c b/materials/new_touhou_model/sakuya/sakuya_cloth.vmat_c new file mode 100755 index 0000000..9ca6e3d Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_cloth.vmat_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/sakuya/sakuya_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/sakuya/sakuya_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_eye.vmat_c b/materials/new_touhou_model/sakuya/sakuya_eye.vmat_c new file mode 100755 index 0000000..2df54d5 Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_eye.vmat_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_eye_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/sakuya/sakuya_eye_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_eye_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_hair1.vmat_c b/materials/new_touhou_model/sakuya/sakuya_hair1.vmat_c new file mode 100755 index 0000000..75c9dc1 Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_hair1.vmat_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_hair1_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/sakuya/sakuya_hair1_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_hair1_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/sakuya/sakuya_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_hair2.vmat_c b/materials/new_touhou_model/sakuya/sakuya_hair2.vmat_c new file mode 100755 index 0000000..d01af8d Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_hair2.vmat_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/sakuya/sakuya_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_hair2_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/sakuya/sakuya_hair2_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_hair2_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_leather.vmat_c b/materials/new_touhou_model/sakuya/sakuya_leather.vmat_c new file mode 100755 index 0000000..2588a40 Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_leather.vmat_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_leather_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/sakuya/sakuya_leather_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_leather_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_leather_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/sakuya/sakuya_leather_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_leather_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_skin.vmat_c b/materials/new_touhou_model/sakuya/sakuya_skin.vmat_c new file mode 100755 index 0000000..9df893c Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_skin.vmat_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_skin_vmat_g_tmasks1_fa11df49.vtex_c b/materials/new_touhou_model/sakuya/sakuya_skin_vmat_g_tmasks1_fa11df49.vtex_c new file mode 100755 index 0000000..0fb91ec Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_skin_vmat_g_tmasks1_fa11df49.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_skin_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/sakuya/sakuya_skin_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_skin_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_tga_87f9ab44.vtex_c b/materials/new_touhou_model/sakuya/sakuya_tga_87f9ab44.vtex_c new file mode 100755 index 0000000..b39cad2 Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_tga_87f9ab44.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_weapon.vmat_c b/materials/new_touhou_model/sakuya/sakuya_weapon.vmat_c new file mode 100755 index 0000000..d4ff04b Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_weapon.vmat_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_weapon_normal_png_c3cc1fb.vtex_c b/materials/new_touhou_model/sakuya/sakuya_weapon_normal_png_c3cc1fb.vtex_c new file mode 100755 index 0000000..beac308 Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_weapon_normal_png_c3cc1fb.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_weapon_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/sakuya/sakuya_weapon_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_weapon_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/sakuya/sakuya_weapon_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/sakuya/sakuya_weapon_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/sakuya/sakuya_weapon_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/satori/satori_cloth.vmat_c b/materials/new_touhou_model/satori/satori_cloth.vmat_c new file mode 100755 index 0000000..7e4a272 Binary files /dev/null and b/materials/new_touhou_model/satori/satori_cloth.vmat_c differ diff --git a/materials/new_touhou_model/satori/satori_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/satori/satori_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/satori/satori_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/satori/satori_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/satori/satori_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/satori/satori_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/satori/satori_eye.vmat_c b/materials/new_touhou_model/satori/satori_eye.vmat_c new file mode 100755 index 0000000..5166bbb Binary files /dev/null and b/materials/new_touhou_model/satori/satori_eye.vmat_c differ diff --git a/materials/new_touhou_model/satori/satori_eye_vmat_g_tmasks1_5fca2540.vtex_c b/materials/new_touhou_model/satori/satori_eye_vmat_g_tmasks1_5fca2540.vtex_c new file mode 100755 index 0000000..cf5956e Binary files /dev/null and b/materials/new_touhou_model/satori/satori_eye_vmat_g_tmasks1_5fca2540.vtex_c differ diff --git a/materials/new_touhou_model/satori/satori_hair1.vmat_c b/materials/new_touhou_model/satori/satori_hair1.vmat_c new file mode 100755 index 0000000..ea0a0c0 Binary files /dev/null and b/materials/new_touhou_model/satori/satori_hair1.vmat_c differ diff --git a/materials/new_touhou_model/satori/satori_hair1_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/satori/satori_hair1_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/satori/satori_hair1_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/satori/satori_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/satori/satori_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/satori/satori_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/satori/satori_hair2.vmat_c b/materials/new_touhou_model/satori/satori_hair2.vmat_c new file mode 100755 index 0000000..5594040 Binary files /dev/null and b/materials/new_touhou_model/satori/satori_hair2.vmat_c differ diff --git a/materials/new_touhou_model/satori/satori_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/satori/satori_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/satori/satori_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/satori/satori_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/satori/satori_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/satori/satori_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/satori/satori_leather.vmat_c b/materials/new_touhou_model/satori/satori_leather.vmat_c new file mode 100755 index 0000000..a074e32 Binary files /dev/null and b/materials/new_touhou_model/satori/satori_leather.vmat_c differ diff --git a/materials/new_touhou_model/satori/satori_leather_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/satori/satori_leather_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/satori/satori_leather_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/satori/satori_leather_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/satori/satori_leather_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/satori/satori_leather_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/satori/satori_skin.vmat_c b/materials/new_touhou_model/satori/satori_skin.vmat_c new file mode 100755 index 0000000..cd891c9 Binary files /dev/null and b/materials/new_touhou_model/satori/satori_skin.vmat_c differ diff --git a/materials/new_touhou_model/satori/satori_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/satori/satori_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/satori/satori_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/satori/satori_skin_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/satori/satori_skin_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/satori/satori_skin_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/satori/satori_tga_218197ee.vtex_c b/materials/new_touhou_model/satori/satori_tga_218197ee.vtex_c new file mode 100755 index 0000000..f212c07 Binary files /dev/null and b/materials/new_touhou_model/satori/satori_tga_218197ee.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_cloth.vmat_c b/materials/new_touhou_model/tenshi/tenshi_cloth.vmat_c new file mode 100755 index 0000000..31008e1 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_cloth.vmat_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/tenshi/tenshi_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/tenshi/tenshi_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_eye.vmat_c b/materials/new_touhou_model/tenshi/tenshi_eye.vmat_c new file mode 100755 index 0000000..bc1f03e Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_eye.vmat_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_eye_vmat_g_tmasks1_5fca2540.vtex_c b/materials/new_touhou_model/tenshi/tenshi_eye_vmat_g_tmasks1_5fca2540.vtex_c new file mode 100755 index 0000000..cf5956e Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_eye_vmat_g_tmasks1_5fca2540.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_hair1.vmat_c b/materials/new_touhou_model/tenshi/tenshi_hair1.vmat_c new file mode 100755 index 0000000..30a2601 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_hair1.vmat_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_hair1_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/tenshi/tenshi_hair1_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_hair1_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/tenshi/tenshi_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_hair2.vmat_c b/materials/new_touhou_model/tenshi/tenshi_hair2.vmat_c new file mode 100755 index 0000000..54c1ef9 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_hair2.vmat_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/tenshi/tenshi_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/tenshi/tenshi_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_leather.vmat_c b/materials/new_touhou_model/tenshi/tenshi_leather.vmat_c new file mode 100755 index 0000000..c375bad Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_leather.vmat_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_leather_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/tenshi/tenshi_leather_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_leather_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_leather_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/tenshi/tenshi_leather_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_leather_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_metal.vmat_c b/materials/new_touhou_model/tenshi/tenshi_metal.vmat_c new file mode 100755 index 0000000..1396eaf Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_metal.vmat_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_metal_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/tenshi/tenshi_metal_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_metal_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_metal_vmat_g_tmasks2_c2816ebb.vtex_c b/materials/new_touhou_model/tenshi/tenshi_metal_vmat_g_tmasks2_c2816ebb.vtex_c new file mode 100755 index 0000000..e4c233d Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_metal_vmat_g_tmasks2_c2816ebb.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_metal_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/tenshi/tenshi_metal_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_metal_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_shekpik.vmat_c b/materials/new_touhou_model/tenshi/tenshi_shekpik.vmat_c new file mode 100755 index 0000000..e67d2b1 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_shekpik.vmat_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_shekpik_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/tenshi/tenshi_shekpik_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_shekpik_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_shekpik_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/tenshi/tenshi_shekpik_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_shekpik_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_skin.vmat_c b/materials/new_touhou_model/tenshi/tenshi_skin.vmat_c new file mode 100755 index 0000000..e371cf5 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_skin.vmat_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/tenshi/tenshi_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_skin_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/tenshi/tenshi_skin_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_skin_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_tga_b6a99ed9.vtex_c b/materials/new_touhou_model/tenshi/tenshi_tga_b6a99ed9.vtex_c new file mode 100755 index 0000000..f6427c5 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_tga_b6a99ed9.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_weapon.vmat_c b/materials/new_touhou_model/tenshi/tenshi_weapon.vmat_c new file mode 100755 index 0000000..e733c96 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_weapon.vmat_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_weapon2.vmat_c b/materials/new_touhou_model/tenshi/tenshi_weapon2.vmat_c new file mode 100755 index 0000000..007b518 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_weapon2.vmat_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_weapon2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/tenshi/tenshi_weapon2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_weapon2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_weapon2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/tenshi/tenshi_weapon2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_weapon2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_weapon_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/tenshi/tenshi_weapon_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_weapon_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/tenshi/tenshi_weapon_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/tenshi/tenshi_weapon_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/tenshi/tenshi_weapon_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_cloth.vmat_c b/materials/new_touhou_model/youmu/youmu_cloth.vmat_c new file mode 100755 index 0000000..75e14f1 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_cloth.vmat_c differ diff --git a/materials/new_touhou_model/youmu/youmu_cloth_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/youmu/youmu_cloth_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_cloth_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/youmu/youmu_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/youmu/youmu_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_eye.vmat_c b/materials/new_touhou_model/youmu/youmu_eye.vmat_c new file mode 100755 index 0000000..15a9d75 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_eye.vmat_c differ diff --git a/materials/new_touhou_model/youmu/youmu_eye_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/youmu/youmu_eye_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_eye_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_ghost.vmat_c b/materials/new_touhou_model/youmu/youmu_ghost.vmat_c new file mode 100755 index 0000000..b9558e5 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_ghost.vmat_c differ diff --git a/materials/new_touhou_model/youmu/youmu_ghost_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/youmu/youmu_ghost_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_ghost_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_ghost_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/youmu/youmu_ghost_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_ghost_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_ghost_vmat_g_tmasks2_89c92044.vtex_c b/materials/new_touhou_model/youmu/youmu_ghost_vmat_g_tmasks2_89c92044.vtex_c new file mode 100755 index 0000000..6d3545f Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_ghost_vmat_g_tmasks2_89c92044.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_hair1.vmat_c b/materials/new_touhou_model/youmu/youmu_hair1.vmat_c new file mode 100755 index 0000000..541a233 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_hair1.vmat_c differ diff --git a/materials/new_touhou_model/youmu/youmu_hair1_normal_png_f4cd067d.vtex_c b/materials/new_touhou_model/youmu/youmu_hair1_normal_png_f4cd067d.vtex_c new file mode 100755 index 0000000..9dc81e1 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_hair1_normal_png_f4cd067d.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_hair1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/youmu/youmu_hair1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_hair1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_hair1_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/youmu/youmu_hair1_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_hair1_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/youmu/youmu_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_hair2.vmat_c b/materials/new_touhou_model/youmu/youmu_hair2.vmat_c new file mode 100755 index 0000000..b842dbe Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_hair2.vmat_c differ diff --git a/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks2_813a544c.vtex_c b/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks2_813a544c.vtex_c new file mode 100755 index 0000000..02464ea Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks2_813a544c.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_hair2_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_leather.vmat_c b/materials/new_touhou_model/youmu/youmu_leather.vmat_c new file mode 100755 index 0000000..b3d716e Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_leather.vmat_c differ diff --git a/materials/new_touhou_model/youmu/youmu_leather_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/youmu/youmu_leather_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_leather_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_leather_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/youmu/youmu_leather_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_leather_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_leather_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/youmu/youmu_leather_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_leather_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_metal.vmat_c b/materials/new_touhou_model/youmu/youmu_metal.vmat_c new file mode 100755 index 0000000..e6eda83 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_metal.vmat_c differ diff --git a/materials/new_touhou_model/youmu/youmu_metal_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/youmu/youmu_metal_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_metal_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_metal_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/youmu/youmu_metal_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_metal_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_metal_vmat_g_tmasks2_833dba4f.vtex_c b/materials/new_touhou_model/youmu/youmu_metal_vmat_g_tmasks2_833dba4f.vtex_c new file mode 100755 index 0000000..90a219b Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_metal_vmat_g_tmasks2_833dba4f.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_metal_vmat_g_tnormal_5a28bd86.vtex_c b/materials/new_touhou_model/youmu/youmu_metal_vmat_g_tnormal_5a28bd86.vtex_c new file mode 100755 index 0000000..edf75cd Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_metal_vmat_g_tnormal_5a28bd86.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_skin.vmat_c b/materials/new_touhou_model/youmu/youmu_skin.vmat_c new file mode 100755 index 0000000..4ce4ffc Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_skin.vmat_c differ diff --git a/materials/new_touhou_model/youmu/youmu_skin_vmat_g_tmasks1_fa11df49.vtex_c b/materials/new_touhou_model/youmu/youmu_skin_vmat_g_tmasks1_fa11df49.vtex_c new file mode 100755 index 0000000..0fb91ec Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_skin_vmat_g_tmasks1_fa11df49.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_skin_vmat_g_tmasks2_df9a0b9e.vtex_c b/materials/new_touhou_model/youmu/youmu_skin_vmat_g_tmasks2_df9a0b9e.vtex_c new file mode 100755 index 0000000..50523bd Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_skin_vmat_g_tmasks2_df9a0b9e.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_tga_7eea9489.vtex_c b/materials/new_touhou_model/youmu/youmu_tga_7eea9489.vtex_c new file mode 100755 index 0000000..a914363 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_tga_7eea9489.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_tga_f86ff334.vtex_c b/materials/new_touhou_model/youmu/youmu_tga_f86ff334.vtex_c new file mode 100755 index 0000000..39ec6aa Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_tga_f86ff334.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_weapon.vmat_c b/materials/new_touhou_model/youmu/youmu_weapon.vmat_c new file mode 100755 index 0000000..8a5289b Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_weapon.vmat_c differ diff --git a/materials/new_touhou_model/youmu/youmu_weapon_normal_png_be6e81f9.vtex_c b/materials/new_touhou_model/youmu/youmu_weapon_normal_png_be6e81f9.vtex_c new file mode 100755 index 0000000..8950ae5 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_weapon_normal_png_be6e81f9.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_weapon_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/youmu/youmu_weapon_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_weapon_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/youmu/youmu_weapon_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/youmu/youmu_weapon_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/youmu/youmu_weapon_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_cloth.vmat_c b/materials/new_touhou_model/yukari/yukari_cloth.vmat_c new file mode 100755 index 0000000..a1006c1 Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_cloth.vmat_c differ diff --git a/materials/new_touhou_model/yukari/yukari_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/yukari/yukari_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yukari/yukari_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_eye.vmat_c b/materials/new_touhou_model/yukari/yukari_eye.vmat_c new file mode 100755 index 0000000..e446f04 Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_eye.vmat_c differ diff --git a/materials/new_touhou_model/yukari/yukari_eye_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/yukari/yukari_eye_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_eye_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_hair1.vmat_c b/materials/new_touhou_model/yukari/yukari_hair1.vmat_c new file mode 100755 index 0000000..6c30985 Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_hair1.vmat_c differ diff --git a/materials/new_touhou_model/yukari/yukari_hair1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/yukari/yukari_hair1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_hair1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yukari/yukari_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_hair2.vmat_c b/materials/new_touhou_model/yukari/yukari_hair2.vmat_c new file mode 100755 index 0000000..bf94920 Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_hair2.vmat_c differ diff --git a/materials/new_touhou_model/yukari/yukari_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/yukari/yukari_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yukari/yukari_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_leather.vmat_c b/materials/new_touhou_model/yukari/yukari_leather.vmat_c new file mode 100755 index 0000000..6db71d3 Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_leather.vmat_c differ diff --git a/materials/new_touhou_model/yukari/yukari_leather_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/yukari/yukari_leather_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_leather_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_leather_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yukari/yukari_leather_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_leather_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_skin.vmat_c b/materials/new_touhou_model/yukari/yukari_skin.vmat_c new file mode 100755 index 0000000..dd83a4e Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_skin.vmat_c differ diff --git a/materials/new_touhou_model/yukari/yukari_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/yukari/yukari_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_skin_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yukari/yukari_skin_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_skin_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_tga_ba70bb1.vtex_c b/materials/new_touhou_model/yukari/yukari_tga_ba70bb1.vtex_c new file mode 100755 index 0000000..49c9f5a Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_tga_ba70bb1.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_weapon.vmat_c b/materials/new_touhou_model/yukari/yukari_weapon.vmat_c new file mode 100755 index 0000000..4271803 Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_weapon.vmat_c differ diff --git a/materials/new_touhou_model/yukari/yukari_weapon2.vmat_c b/materials/new_touhou_model/yukari/yukari_weapon2.vmat_c new file mode 100755 index 0000000..23fe35c Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_weapon2.vmat_c differ diff --git a/materials/new_touhou_model/yukari/yukari_weapon2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/yukari/yukari_weapon2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_weapon2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_weapon2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yukari/yukari_weapon2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_weapon2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_weapon_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/yukari/yukari_weapon_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_weapon_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/yukari/yukari_weapon_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yukari/yukari_weapon_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yukari/yukari_weapon_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_cloth.vmat_c b/materials/new_touhou_model/yuuka/yuuka_cloth.vmat_c new file mode 100755 index 0000000..be7a1fb Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_cloth.vmat_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_cloth_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/yuuka/yuuka_cloth_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_cloth_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_cloth_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/yuuka/yuuka_cloth_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_cloth_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_cloth_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yuuka/yuuka_cloth_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_cloth_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_eye.vmat_c b/materials/new_touhou_model/yuuka/yuuka_eye.vmat_c new file mode 100755 index 0000000..4e0e1a5 Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_eye.vmat_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_eye_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/yuuka/yuuka_eye_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_eye_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_hair1.vmat_c b/materials/new_touhou_model/yuuka/yuuka_hair1.vmat_c new file mode 100755 index 0000000..f34fb56 Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_hair1.vmat_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_hair1_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/yuuka/yuuka_hair1_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_hair1_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_hair1_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/yuuka/yuuka_hair1_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_hair1_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_hair1_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yuuka/yuuka_hair1_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_hair1_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_hair2.vmat_c b/materials/new_touhou_model/yuuka/yuuka_hair2.vmat_c new file mode 100755 index 0000000..83dac55 Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_hair2.vmat_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_hair2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/yuuka/yuuka_hair2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_hair2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_hair2_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/yuuka/yuuka_hair2_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_hair2_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_hair2_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yuuka/yuuka_hair2_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_hair2_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_leather.vmat_c b/materials/new_touhou_model/yuuka/yuuka_leather.vmat_c new file mode 100755 index 0000000..fb7b1e8 Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_leather.vmat_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_leather_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/yuuka/yuuka_leather_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_leather_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_leather_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yuuka/yuuka_leather_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_leather_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_skin.vmat_c b/materials/new_touhou_model/yuuka/yuuka_skin.vmat_c new file mode 100755 index 0000000..3b81adf Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_skin.vmat_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_skin_vmat_g_tmasks1_5fca2540.vtex_c b/materials/new_touhou_model/yuuka/yuuka_skin_vmat_g_tmasks1_5fca2540.vtex_c new file mode 100755 index 0000000..cf5956e Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_skin_vmat_g_tmasks1_5fca2540.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_skin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/yuuka/yuuka_skin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_skin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_skin_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yuuka/yuuka_skin_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_skin_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_tga_b43ec91c.vtex_c b/materials/new_touhou_model/yuuka/yuuka_tga_b43ec91c.vtex_c new file mode 100755 index 0000000..9d5f6f6 Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_tga_b43ec91c.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_weapon.vmat_c b/materials/new_touhou_model/yuuka/yuuka_weapon.vmat_c new file mode 100755 index 0000000..54f7546 Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_weapon.vmat_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_weapon_vmat_g_tmasks1_5fca2540.vtex_c b/materials/new_touhou_model/yuuka/yuuka_weapon_vmat_g_tmasks1_5fca2540.vtex_c new file mode 100755 index 0000000..cf5956e Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_weapon_vmat_g_tmasks1_5fca2540.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_weapon_vmat_g_tmasks1_ce06f645.vtex_c b/materials/new_touhou_model/yuuka/yuuka_weapon_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_weapon_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_weapon_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/new_touhou_model/yuuka/yuuka_weapon_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_weapon_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/new_touhou_model/yuuka/yuuka_weapon_vmat_g_tmasks2_7f9d387d.vtex_c b/materials/new_touhou_model/yuuka/yuuka_weapon_vmat_g_tmasks2_7f9d387d.vtex_c new file mode 100755 index 0000000..a8bbf6c Binary files /dev/null and b/materials/new_touhou_model/yuuka/yuuka_weapon_vmat_g_tmasks2_7f9d387d.vtex_c differ diff --git a/materials/normal/cloth_png_db9d9165.vtex_c b/materials/normal/cloth_png_db9d9165.vtex_c new file mode 100755 index 0000000..e93a0ae Binary files /dev/null and b/materials/normal/cloth_png_db9d9165.vtex_c differ diff --git a/materials/normal/hair1_png_965f2294.vtex_c b/materials/normal/hair1_png_965f2294.vtex_c new file mode 100755 index 0000000..d5c116c Binary files /dev/null and b/materials/normal/hair1_png_965f2294.vtex_c differ diff --git a/materials/normal/hair2_png_b0ae2332.vtex_c b/materials/normal/hair2_png_b0ae2332.vtex_c new file mode 100755 index 0000000..c291021 Binary files /dev/null and b/materials/normal/hair2_png_b0ae2332.vtex_c differ diff --git a/materials/normal/leather_png_1d787bf2.vtex_c b/materials/normal/leather_png_1d787bf2.vtex_c new file mode 100755 index 0000000..092eb8b Binary files /dev/null and b/materials/normal/leather_png_1d787bf2.vtex_c differ diff --git a/materials/normal/plush_png_e1e7d098.vtex_c b/materials/normal/plush_png_e1e7d098.vtex_c new file mode 100755 index 0000000..ff3a5ec Binary files /dev/null and b/materials/normal/plush_png_e1e7d098.vtex_c differ diff --git a/materials/normal/shekpik1_png_95fd174e.vtex_c b/materials/normal/shekpik1_png_95fd174e.vtex_c new file mode 100755 index 0000000..46018cc Binary files /dev/null and b/materials/normal/shekpik1_png_95fd174e.vtex_c differ diff --git a/materials/normal/shekpik2_png_5beb2492.vtex_c b/materials/normal/shekpik2_png_5beb2492.vtex_c new file mode 100755 index 0000000..977126e Binary files /dev/null and b/materials/normal/shekpik2_png_5beb2492.vtex_c differ diff --git a/materials/normal/shekpik3_png_b391eaf9.vtex_c b/materials/normal/shekpik3_png_b391eaf9.vtex_c new file mode 100755 index 0000000..304fbfd Binary files /dev/null and b/materials/normal/shekpik3_png_b391eaf9.vtex_c differ diff --git a/materials/normal/skin_png_5b520451.vtex_c b/materials/normal/skin_png_5b520451.vtex_c new file mode 100755 index 0000000..efd08bd Binary files /dev/null and b/materials/normal/skin_png_5b520451.vtex_c differ diff --git a/materials/normal/wood_png_5a56d92c.vtex_c b/materials/normal/wood_png_5a56d92c.vtex_c new file mode 100755 index 0000000..cb3c0d5 Binary files /dev/null and b/materials/normal/wood_png_5a56d92c.vtex_c differ diff --git a/materials/other/tram/body_base.vmat_c b/materials/other/tram/body_base.vmat_c new file mode 100755 index 0000000..67e8b9b Binary files /dev/null and b/materials/other/tram/body_base.vmat_c differ diff --git a/materials/other/tram/body_basecolor.tga_png_cd641330.vtex_c b/materials/other/tram/body_basecolor.tga_png_cd641330.vtex_c new file mode 100755 index 0000000..ef8cb89 Binary files /dev/null and b/materials/other/tram/body_basecolor.tga_png_cd641330.vtex_c differ diff --git a/materials/other/tram/body_metalness.tga_png_c6589688.vtex_c b/materials/other/tram/body_metalness.tga_png_c6589688.vtex_c new file mode 100755 index 0000000..a426ed3 Binary files /dev/null and b/materials/other/tram/body_metalness.tga_png_c6589688.vtex_c differ diff --git a/materials/other/tram/metal.vmat_c b/materials/other/tram/metal.vmat_c new file mode 100755 index 0000000..d68feb6 Binary files /dev/null and b/materials/other/tram/metal.vmat_c differ diff --git a/materials/other/tram/metal_color_png_cd475593.vtex_c b/materials/other/tram/metal_color_png_cd475593.vtex_c new file mode 100755 index 0000000..e267158 Binary files /dev/null and b/materials/other/tram/metal_color_png_cd475593.vtex_c differ diff --git a/materials/other/tram/metal_metalness_png_6e10e077.vtex_c b/materials/other/tram/metal_metalness_png_6e10e077.vtex_c new file mode 100755 index 0000000..58e731b Binary files /dev/null and b/materials/other/tram/metal_metalness_png_6e10e077.vtex_c differ diff --git a/materials/other/tram/normal_body_png_37099016.vtex_c b/materials/other/tram/normal_body_png_37099016.vtex_c new file mode 100755 index 0000000..50b2ac7 Binary files /dev/null and b/materials/other/tram/normal_body_png_37099016.vtex_c differ diff --git a/materials/other/tram_1/dianche_normal_tga_ffa559.vtex_c b/materials/other/tram_1/dianche_normal_tga_ffa559.vtex_c new file mode 100755 index 0000000..f8ef58e Binary files /dev/null and b/materials/other/tram_1/dianche_normal_tga_ffa559.vtex_c differ diff --git a/materials/other/tram_1/dianche_tga_ea05377e.vtex_c b/materials/other/tram_1/dianche_tga_ea05377e.vtex_c new file mode 100755 index 0000000..54963c3 Binary files /dev/null and b/materials/other/tram_1/dianche_tga_ea05377e.vtex_c differ diff --git a/materials/other/tram_1/tram_1.vmat_c b/materials/other/tram_1/tram_1.vmat_c new file mode 100755 index 0000000..b555891 Binary files /dev/null and b/materials/other/tram_1/tram_1.vmat_c differ diff --git a/materials/other/tram_1/tram_1_vmat_g_tmasks1_ff8fe395.vtex_c b/materials/other/tram_1/tram_1_vmat_g_tmasks1_ff8fe395.vtex_c new file mode 100755 index 0000000..f1a4e30 Binary files /dev/null and b/materials/other/tram_1/tram_1_vmat_g_tmasks1_ff8fe395.vtex_c differ diff --git a/materials/overviews/touhoutd.vmat_c b/materials/overviews/touhoutd.vmat_c new file mode 100755 index 0000000..7edd2b7 Binary files /dev/null and b/materials/overviews/touhoutd.vmat_c differ diff --git a/materials/overviews/touhoutd_tga_78edcfd8.vtex_c b/materials/overviews/touhoutd_tga_78edcfd8.vtex_c new file mode 100755 index 0000000..775043b Binary files /dev/null and b/materials/overviews/touhoutd_tga_78edcfd8.vtex_c differ diff --git a/materials/particle/ability_000.vtex_c b/materials/particle/ability_000.vtex_c new file mode 100755 index 0000000..13572ad Binary files /dev/null and b/materials/particle/ability_000.vtex_c differ diff --git a/materials/particle/ability_byakuren_04.vtex_c b/materials/particle/ability_byakuren_04.vtex_c new file mode 100755 index 0000000..b3aafd8 Binary files /dev/null and b/materials/particle/ability_byakuren_04.vtex_c differ diff --git a/materials/particle/ability_byakuren_04_b.vtex_c b/materials/particle/ability_byakuren_04_b.vtex_c new file mode 100755 index 0000000..d7bc31c Binary files /dev/null and b/materials/particle/ability_byakuren_04_b.vtex_c differ diff --git a/materials/particle/ability_byakuren_04_c.vtex_c b/materials/particle/ability_byakuren_04_c.vtex_c new file mode 100755 index 0000000..1bd9237 Binary files /dev/null and b/materials/particle/ability_byakuren_04_c.vtex_c differ diff --git a/materials/particle/ability_flandre04.vtex_c b/materials/particle/ability_flandre04.vtex_c new file mode 100755 index 0000000..3adcd7f Binary files /dev/null and b/materials/particle/ability_flandre04.vtex_c differ diff --git a/materials/particle/ability_kaguya_02_texture_a.vtex_c b/materials/particle/ability_kaguya_02_texture_a.vtex_c new file mode 100755 index 0000000..3cbe28d Binary files /dev/null and b/materials/particle/ability_kaguya_02_texture_a.vtex_c differ diff --git a/materials/particle/ability_kaguya_02_texture_b.vtex_c b/materials/particle/ability_kaguya_02_texture_b.vtex_c new file mode 100755 index 0000000..59f1ccd Binary files /dev/null and b/materials/particle/ability_kaguya_02_texture_b.vtex_c differ diff --git a/materials/particle/ability_kaguya_02_texture_c.vtex_c b/materials/particle/ability_kaguya_02_texture_c.vtex_c new file mode 100755 index 0000000..7a62ba1 Binary files /dev/null and b/materials/particle/ability_kaguya_02_texture_c.vtex_c differ diff --git a/materials/particle/ability_kaguya_02_texture_d.vtex_c b/materials/particle/ability_kaguya_02_texture_d.vtex_c new file mode 100755 index 0000000..fb022b0 Binary files /dev/null and b/materials/particle/ability_kaguya_02_texture_d.vtex_c differ diff --git a/materials/particle/ability_lunasa_01.vtex_c b/materials/particle/ability_lunasa_01.vtex_c new file mode 100755 index 0000000..5c6cdca Binary files /dev/null and b/materials/particle/ability_lunasa_01.vtex_c differ diff --git a/materials/particle/ability_lyrica_01.vtex_c b/materials/particle/ability_lyrica_01.vtex_c new file mode 100755 index 0000000..e2f7ef6 Binary files /dev/null and b/materials/particle/ability_lyrica_01.vtex_c differ diff --git a/materials/particle/ability_marisa_02_star.vtex_c b/materials/particle/ability_marisa_02_star.vtex_c new file mode 100755 index 0000000..b1d073a Binary files /dev/null and b/materials/particle/ability_marisa_02_star.vtex_c differ diff --git a/materials/particle/ability_marisa_02_star_b.vtex_c b/materials/particle/ability_marisa_02_star_b.vtex_c new file mode 100755 index 0000000..7955b05 Binary files /dev/null and b/materials/particle/ability_marisa_02_star_b.vtex_c differ diff --git a/materials/particle/ability_marisa_02_star_c.vtex_c b/materials/particle/ability_marisa_02_star_c.vtex_c new file mode 100755 index 0000000..8d2a715 Binary files /dev/null and b/materials/particle/ability_marisa_02_star_c.vtex_c differ diff --git a/materials/particle/ability_marisa_02_star_d.vtex_c b/materials/particle/ability_marisa_02_star_d.vtex_c new file mode 100755 index 0000000..f6c4bab Binary files /dev/null and b/materials/particle/ability_marisa_02_star_d.vtex_c differ diff --git a/materials/particle/ability_marisa_02_star_e.vtex_c b/materials/particle/ability_marisa_02_star_e.vtex_c new file mode 100755 index 0000000..fac0817 Binary files /dev/null and b/materials/particle/ability_marisa_02_star_e.vtex_c differ diff --git a/materials/particle/ability_marisa_02_star_f.vtex_c b/materials/particle/ability_marisa_02_star_f.vtex_c new file mode 100755 index 0000000..77510d4 Binary files /dev/null and b/materials/particle/ability_marisa_02_star_f.vtex_c differ diff --git a/materials/particle/ability_marisa_02_star_g.vtex_c b/materials/particle/ability_marisa_02_star_g.vtex_c new file mode 100755 index 0000000..9ad5702 Binary files /dev/null and b/materials/particle/ability_marisa_02_star_g.vtex_c differ diff --git a/materials/particle/ability_marisa_02_star_h.vtex_c b/materials/particle/ability_marisa_02_star_h.vtex_c new file mode 100755 index 0000000..d3928cc Binary files /dev/null and b/materials/particle/ability_marisa_02_star_h.vtex_c differ diff --git a/materials/particle/ability_marisa_02_star_i.vtex_c b/materials/particle/ability_marisa_02_star_i.vtex_c new file mode 100755 index 0000000..dc8dc1e Binary files /dev/null and b/materials/particle/ability_marisa_02_star_i.vtex_c differ diff --git a/materials/particle/ability_marisa_02_star_j.vtex_c b/materials/particle/ability_marisa_02_star_j.vtex_c new file mode 100755 index 0000000..eb061e6 Binary files /dev/null and b/materials/particle/ability_marisa_02_star_j.vtex_c differ diff --git a/materials/particle/ability_marisa_04_circle.vtex_c b/materials/particle/ability_marisa_04_circle.vtex_c new file mode 100755 index 0000000..459789f Binary files /dev/null and b/materials/particle/ability_marisa_04_circle.vtex_c differ diff --git a/materials/particle/ability_marisa_04_circle_b.vtex_c b/materials/particle/ability_marisa_04_circle_b.vtex_c new file mode 100755 index 0000000..0f5044d Binary files /dev/null and b/materials/particle/ability_marisa_04_circle_b.vtex_c differ diff --git a/materials/particle/ability_merlin_01.vtex_c b/materials/particle/ability_merlin_01.vtex_c new file mode 100755 index 0000000..fcc6ad8 Binary files /dev/null and b/materials/particle/ability_merlin_01.vtex_c differ diff --git a/materials/particle/ability_mokou_01.vtex_c b/materials/particle/ability_mokou_01.vtex_c new file mode 100755 index 0000000..e166fdc Binary files /dev/null and b/materials/particle/ability_mokou_01.vtex_c differ diff --git a/materials/particle/ability_remilia_02.vtex_c b/materials/particle/ability_remilia_02.vtex_c new file mode 100755 index 0000000..dcdbc2f Binary files /dev/null and b/materials/particle/ability_remilia_02.vtex_c differ diff --git a/materials/particle/ability_sanae_04_star.vtex_c b/materials/particle/ability_sanae_04_star.vtex_c new file mode 100755 index 0000000..09b86f9 Binary files /dev/null and b/materials/particle/ability_sanae_04_star.vtex_c differ diff --git a/materials/particle/ability_sanae_04_star_2.vtex_c b/materials/particle/ability_sanae_04_star_2.vtex_c new file mode 100755 index 0000000..bf4d898 Binary files /dev/null and b/materials/particle/ability_sanae_04_star_2.vtex_c differ diff --git a/materials/particle/ability_shikieiki_04.vtex_c b/materials/particle/ability_shikieiki_04.vtex_c new file mode 100755 index 0000000..fc5b080 Binary files /dev/null and b/materials/particle/ability_shikieiki_04.vtex_c differ diff --git a/materials/particle/ability_youmu_04.vtex_c b/materials/particle/ability_youmu_04.vtex_c new file mode 100755 index 0000000..abfe79f Binary files /dev/null and b/materials/particle/ability_youmu_04.vtex_c differ diff --git a/materials/particle/ability_yukari_03.vtex_c b/materials/particle/ability_yukari_03.vtex_c new file mode 100755 index 0000000..3dafc9a Binary files /dev/null and b/materials/particle/ability_yukari_03.vtex_c differ diff --git a/materials/particle/ability_yuuka_02.vtex_c b/materials/particle/ability_yuuka_02.vtex_c new file mode 100755 index 0000000..a35d6c1 Binary files /dev/null and b/materials/particle/ability_yuuka_02.vtex_c differ diff --git a/materials/particle/ability_yuyuko_04.vtex_c b/materials/particle/ability_yuyuko_04.vtex_c new file mode 100755 index 0000000..d3d5dfa Binary files /dev/null and b/materials/particle/ability_yuyuko_04.vtex_c differ diff --git a/materials/particle/ablity_alice_02_light.vtex_c b/materials/particle/ablity_alice_02_light.vtex_c new file mode 100755 index 0000000..f96797a Binary files /dev/null and b/materials/particle/ablity_alice_02_light.vtex_c differ diff --git a/materials/particle/ablity_alice_line.vtex_c b/materials/particle/ablity_alice_line.vtex_c new file mode 100755 index 0000000..5e1e8c1 Binary files /dev/null and b/materials/particle/ablity_alice_line.vtex_c differ diff --git a/materials/particle/ablity_alice_penglai_laser.vtex_c b/materials/particle/ablity_alice_penglai_laser.vtex_c new file mode 100755 index 0000000..6f19d14 Binary files /dev/null and b/materials/particle/ablity_alice_penglai_laser.vtex_c differ diff --git a/materials/particle/ablity_alice_penglai_laser1.vtex_c b/materials/particle/ablity_alice_penglai_laser1.vtex_c new file mode 100755 index 0000000..08553e9 Binary files /dev/null and b/materials/particle/ablity_alice_penglai_laser1.vtex_c differ diff --git a/materials/particle/ablity_ran03_light.vtex_c b/materials/particle/ablity_ran03_light.vtex_c new file mode 100755 index 0000000..8f23969 Binary files /dev/null and b/materials/particle/ablity_ran03_light.vtex_c differ diff --git a/materials/particle/ablity_reisen_bullet.vtex_c b/materials/particle/ablity_reisen_bullet.vtex_c new file mode 100755 index 0000000..693b71a Binary files /dev/null and b/materials/particle/ablity_reisen_bullet.vtex_c differ diff --git a/materials/particle/ablity_reisen_laser.vtex_c b/materials/particle/ablity_reisen_laser.vtex_c new file mode 100755 index 0000000..c93b88e Binary files /dev/null and b/materials/particle/ablity_reisen_laser.vtex_c differ diff --git a/materials/particle/ablity_reisen_laser1.vtex_c b/materials/particle/ablity_reisen_laser1.vtex_c new file mode 100755 index 0000000..71188f8 Binary files /dev/null and b/materials/particle/ablity_reisen_laser1.vtex_c differ diff --git a/materials/particle/ablity_shikieiki_04_light.vtex_c b/materials/particle/ablity_shikieiki_04_light.vtex_c new file mode 100755 index 0000000..08bf240 Binary files /dev/null and b/materials/particle/ablity_shikieiki_04_light.vtex_c differ diff --git a/materials/particle/aircraft_gold.vtex_c b/materials/particle/aircraft_gold.vtex_c new file mode 100755 index 0000000..7b65d6b Binary files /dev/null and b/materials/particle/aircraft_gold.vtex_c differ diff --git a/materials/particle/aircraft_gold_tga_6582e3b9.vtex_c b/materials/particle/aircraft_gold_tga_6582e3b9.vtex_c new file mode 100755 index 0000000..efbe1ff Binary files /dev/null and b/materials/particle/aircraft_gold_tga_6582e3b9.vtex_c differ diff --git a/materials/particle/bagua.vtex_c b/materials/particle/bagua.vtex_c new file mode 100755 index 0000000..5c846a1 Binary files /dev/null and b/materials/particle/bagua.vtex_c differ diff --git a/materials/particle/basic_glow.vtex_c b/materials/particle/basic_glow.vtex_c new file mode 100755 index 0000000..ffa1f90 Binary files /dev/null and b/materials/particle/basic_glow.vtex_c differ diff --git a/materials/particle/basic_rope.vtex_c b/materials/particle/basic_rope.vtex_c new file mode 100755 index 0000000..ee55aec Binary files /dev/null and b/materials/particle/basic_rope.vtex_c differ diff --git a/materials/particle/basic_rope_energy.vtex_c b/materials/particle/basic_rope_energy.vtex_c new file mode 100755 index 0000000..0834833 Binary files /dev/null and b/materials/particle/basic_rope_energy.vtex_c differ diff --git a/materials/particle/basic_smoke.vtex_c b/materials/particle/basic_smoke.vtex_c new file mode 100755 index 0000000..0f73f45 Binary files /dev/null and b/materials/particle/basic_smoke.vtex_c differ diff --git a/materials/particle/basic_trail.vtex_c b/materials/particle/basic_trail.vtex_c new file mode 100755 index 0000000..b940913 Binary files /dev/null and b/materials/particle/basic_trail.vtex_c differ diff --git a/materials/particle/bendibeam2_red.vtex_c b/materials/particle/bendibeam2_red.vtex_c new file mode 100755 index 0000000..1eba01d Binary files /dev/null and b/materials/particle/bendibeam2_red.vtex_c differ diff --git a/materials/particle/bluelaser1_mip0.vtex_c b/materials/particle/bluelaser1_mip0.vtex_c new file mode 100755 index 0000000..e26ae6c Binary files /dev/null and b/materials/particle/bluelaser1_mip0.vtex_c differ diff --git a/materials/particle/emoji/thtd_portraits_hongliange.vtex_c b/materials/particle/emoji/thtd_portraits_hongliange.vtex_c new file mode 100755 index 0000000..e9a6da2 Binary files /dev/null and b/materials/particle/emoji/thtd_portraits_hongliange.vtex_c differ diff --git a/materials/particle/guilty.vtex_c b/materials/particle/guilty.vtex_c new file mode 100755 index 0000000..14d1fe0 Binary files /dev/null and b/materials/particle/guilty.vtex_c differ diff --git a/materials/particle/hiziri_byakuren_gz.vtex_c b/materials/particle/hiziri_byakuren_gz.vtex_c new file mode 100755 index 0000000..af74466 Binary files /dev/null and b/materials/particle/hiziri_byakuren_gz.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_alice.vtex_c b/materials/particle/portraits/thtd_portraits_alice.vtex_c new file mode 100755 index 0000000..b0476b0 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_alice.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_aya.vtex_c b/materials/particle/portraits/thtd_portraits_aya.vtex_c new file mode 100755 index 0000000..c4e9221 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_aya.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_byakuren.vtex_c b/materials/particle/portraits/thtd_portraits_byakuren.vtex_c new file mode 100755 index 0000000..ae0eade Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_byakuren.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_chen.vtex_c b/materials/particle/portraits/thtd_portraits_chen.vtex_c new file mode 100755 index 0000000..ea4fcf4 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_chen.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_cirno.vtex_c b/materials/particle/portraits/thtd_portraits_cirno.vtex_c new file mode 100755 index 0000000..3ad9329 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_cirno.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_clownpiece.vtex_c b/materials/particle/portraits/thtd_portraits_clownpiece.vtex_c new file mode 100755 index 0000000..b6fddb4 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_clownpiece.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_daiyousei.vtex_c b/materials/particle/portraits/thtd_portraits_daiyousei.vtex_c new file mode 100755 index 0000000..9f30b5d Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_daiyousei.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_eirin.vtex_c b/materials/particle/portraits/thtd_portraits_eirin.vtex_c new file mode 100755 index 0000000..4381050 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_eirin.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_elly.vtex_c b/materials/particle/portraits/thtd_portraits_elly.vtex_c new file mode 100755 index 0000000..e64a98b Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_elly.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_flandre.vtex_c b/materials/particle/portraits/thtd_portraits_flandre.vtex_c new file mode 100755 index 0000000..3cca7cb Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_flandre.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_futo.vtex_c b/materials/particle/portraits/thtd_portraits_futo.vtex_c new file mode 100755 index 0000000..ca2d212 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_futo.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_gengetu.vtex_c b/materials/particle/portraits/thtd_portraits_gengetu.vtex_c new file mode 100755 index 0000000..1c26a05 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_gengetu.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_hatate.vtex_c b/materials/particle/portraits/thtd_portraits_hatate.vtex_c new file mode 100755 index 0000000..ff839bf Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_hatate.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_hecatia.vtex_c b/materials/particle/portraits/thtd_portraits_hecatia.vtex_c new file mode 100755 index 0000000..2843990 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_hecatia.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_hina.vtex_c b/materials/particle/portraits/thtd_portraits_hina.vtex_c new file mode 100755 index 0000000..bf74147 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_hina.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_iku.vtex_c b/materials/particle/portraits/thtd_portraits_iku.vtex_c new file mode 100755 index 0000000..3a31317 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_iku.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_inaba.vtex_c b/materials/particle/portraits/thtd_portraits_inaba.vtex_c new file mode 100755 index 0000000..257fc3f Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_inaba.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_junko.vtex_c b/materials/particle/portraits/thtd_portraits_junko.vtex_c new file mode 100755 index 0000000..fd9c758 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_junko.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_kagerou.vtex_c b/materials/particle/portraits/thtd_portraits_kagerou.vtex_c new file mode 100755 index 0000000..f1a77b2 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_kagerou.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_kaguya.vtex_c b/materials/particle/portraits/thtd_portraits_kaguya.vtex_c new file mode 100755 index 0000000..4199de4 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_kaguya.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_kanako.vtex_c b/materials/particle/portraits/thtd_portraits_kanako.vtex_c new file mode 100755 index 0000000..a5a97b6 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_kanako.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_keine.vtex_c b/materials/particle/portraits/thtd_portraits_keine.vtex_c new file mode 100755 index 0000000..7e9c044 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_keine.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_kishin.vtex_c b/materials/particle/portraits/thtd_portraits_kishin.vtex_c new file mode 100755 index 0000000..8a578bb Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_kishin.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_kisume.vtex_c b/materials/particle/portraits/thtd_portraits_kisume.vtex_c new file mode 100755 index 0000000..c3298c4 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_kisume.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_koakuma.vtex_c b/materials/particle/portraits/thtd_portraits_koakuma.vtex_c new file mode 100755 index 0000000..c1e5164 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_koakuma.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_kogasa.vtex_c b/materials/particle/portraits/thtd_portraits_kogasa.vtex_c new file mode 100755 index 0000000..b7b18d6 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_kogasa.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_koishi.vtex_c b/materials/particle/portraits/thtd_portraits_koishi.vtex_c new file mode 100755 index 0000000..c990414 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_koishi.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_kokoro.vtex_c b/materials/particle/portraits/thtd_portraits_kokoro.vtex_c new file mode 100755 index 0000000..8529f13 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_kokoro.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_komachi.vtex_c b/materials/particle/portraits/thtd_portraits_komachi.vtex_c new file mode 100755 index 0000000..e32e4b3 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_komachi.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_kyouko.vtex_c b/materials/particle/portraits/thtd_portraits_kyouko.vtex_c new file mode 100755 index 0000000..837fa97 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_kyouko.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_letty.vtex_c b/materials/particle/portraits/thtd_portraits_letty.vtex_c new file mode 100755 index 0000000..34b445a Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_letty.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_lily.vtex_c b/materials/particle/portraits/thtd_portraits_lily.vtex_c new file mode 100755 index 0000000..01a6528 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_lily.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_luna.vtex_c b/materials/particle/portraits/thtd_portraits_luna.vtex_c new file mode 100755 index 0000000..47938e0 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_luna.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_lunasa.vtex_c b/materials/particle/portraits/thtd_portraits_lunasa.vtex_c new file mode 100755 index 0000000..8ed5490 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_lunasa.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_lyrica.vtex_c b/materials/particle/portraits/thtd_portraits_lyrica.vtex_c new file mode 100755 index 0000000..801f8ea Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_lyrica.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_mamizou.vtex_c b/materials/particle/portraits/thtd_portraits_mamizou.vtex_c new file mode 100755 index 0000000..eb7529b Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_mamizou.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_maribel.vtex_c b/materials/particle/portraits/thtd_portraits_maribel.vtex_c new file mode 100755 index 0000000..9127e78 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_maribel.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_marisa.vtex_c b/materials/particle/portraits/thtd_portraits_marisa.vtex_c new file mode 100755 index 0000000..ffe921f Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_marisa.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_matara.vtex_c b/materials/particle/portraits/thtd_portraits_matara.vtex_c new file mode 100755 index 0000000..dabf28c Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_matara.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_medicine.vtex_c b/materials/particle/portraits/thtd_portraits_medicine.vtex_c new file mode 100755 index 0000000..35e7717 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_medicine.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_meirin.vtex_c b/materials/particle/portraits/thtd_portraits_meirin.vtex_c new file mode 100755 index 0000000..0183298 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_meirin.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_merlin.vtex_c b/materials/particle/portraits/thtd_portraits_merlin.vtex_c new file mode 100755 index 0000000..bffcb23 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_merlin.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_miko.vtex_c b/materials/particle/portraits/thtd_portraits_miko.vtex_c new file mode 100755 index 0000000..cb9d874 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_miko.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_mima.vtex_c b/materials/particle/portraits/thtd_portraits_mima.vtex_c new file mode 100755 index 0000000..7c04ca2 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_mima.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_minamitsu.vtex_c b/materials/particle/portraits/thtd_portraits_minamitsu.vtex_c new file mode 100755 index 0000000..740452d Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_minamitsu.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_minoriko.vtex_c b/materials/particle/portraits/thtd_portraits_minoriko.vtex_c new file mode 100755 index 0000000..a222df3 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_minoriko.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_mokou.vtex_c b/materials/particle/portraits/thtd_portraits_mokou.vtex_c new file mode 100755 index 0000000..1908c4d Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_mokou.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_momiji.vtex_c b/materials/particle/portraits/thtd_portraits_momiji.vtex_c new file mode 100755 index 0000000..8f9ca50 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_momiji.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_mystia.vtex_c b/materials/particle/portraits/thtd_portraits_mystia.vtex_c new file mode 100755 index 0000000..5258e5e Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_mystia.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_nazrin.vtex_c b/materials/particle/portraits/thtd_portraits_nazrin.vtex_c new file mode 100755 index 0000000..377d8f7 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_nazrin.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_nitori.vtex_c b/materials/particle/portraits/thtd_portraits_nitori.vtex_c new file mode 100755 index 0000000..d82f390 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_nitori.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_nue.vtex_c b/materials/particle/portraits/thtd_portraits_nue.vtex_c new file mode 100755 index 0000000..f34cc13 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_nue.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_patchouli.vtex_c b/materials/particle/portraits/thtd_portraits_patchouli.vtex_c new file mode 100755 index 0000000..9455c5e Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_patchouli.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_ran.vtex_c b/materials/particle/portraits/thtd_portraits_ran.vtex_c new file mode 100755 index 0000000..41b794d Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_ran.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_reimu.vtex_c b/materials/particle/portraits/thtd_portraits_reimu.vtex_c new file mode 100755 index 0000000..fdf689e Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_reimu.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_reisen.vtex_c b/materials/particle/portraits/thtd_portraits_reisen.vtex_c new file mode 100755 index 0000000..ea79902 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_reisen.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_remilia.vtex_c b/materials/particle/portraits/thtd_portraits_remilia.vtex_c new file mode 100755 index 0000000..e8bcd07 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_remilia.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_renko.vtex_c b/materials/particle/portraits/thtd_portraits_renko.vtex_c new file mode 100755 index 0000000..716fba2 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_renko.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_rin.vtex_c b/materials/particle/portraits/thtd_portraits_rin.vtex_c new file mode 100755 index 0000000..c4aec6f Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_rin.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_rumia.vtex_c b/materials/particle/portraits/thtd_portraits_rumia.vtex_c new file mode 100755 index 0000000..c41780a Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_rumia.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_sakuya.vtex_c b/materials/particle/portraits/thtd_portraits_sakuya.vtex_c new file mode 100755 index 0000000..6e2f351 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_sakuya.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_sanae.vtex_c b/materials/particle/portraits/thtd_portraits_sanae.vtex_c new file mode 100755 index 0000000..9986dd8 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_sanae.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_sariel.vtex_c b/materials/particle/portraits/thtd_portraits_sariel.vtex_c new file mode 100755 index 0000000..022edca Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_sariel.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_satori.vtex_c b/materials/particle/portraits/thtd_portraits_satori.vtex_c new file mode 100755 index 0000000..90983d2 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_satori.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_seiga.vtex_c b/materials/particle/portraits/thtd_portraits_seiga.vtex_c new file mode 100755 index 0000000..90e3761 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_seiga.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_seija.vtex_c b/materials/particle/portraits/thtd_portraits_seija.vtex_c new file mode 100755 index 0000000..62abb1a Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_seija.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_shikieiki.vtex_c b/materials/particle/portraits/thtd_portraits_shikieiki.vtex_c new file mode 100755 index 0000000..c468e72 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_shikieiki.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_shinki.vtex_c b/materials/particle/portraits/thtd_portraits_shinki.vtex_c new file mode 100755 index 0000000..eea90fa Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_shinki.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_shinmyoumaru.vtex_c b/materials/particle/portraits/thtd_portraits_shinmyoumaru.vtex_c new file mode 100755 index 0000000..f9e5cfd Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_shinmyoumaru.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_sizuha.vtex_c b/materials/particle/portraits/thtd_portraits_sizuha.vtex_c new file mode 100755 index 0000000..525d5a1 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_sizuha.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_soga.vtex_c b/materials/particle/portraits/thtd_portraits_soga.vtex_c new file mode 100755 index 0000000..d979882 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_soga.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_star.vtex_c b/materials/particle/portraits/thtd_portraits_star.vtex_c new file mode 100755 index 0000000..886c74d Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_star.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_suika.vtex_c b/materials/particle/portraits/thtd_portraits_suika.vtex_c new file mode 100755 index 0000000..f0d14c4 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_suika.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_sumireko.vtex_c b/materials/particle/portraits/thtd_portraits_sumireko.vtex_c new file mode 100755 index 0000000..31c7015 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_sumireko.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_sunny.vtex_c b/materials/particle/portraits/thtd_portraits_sunny.vtex_c new file mode 100755 index 0000000..a38157c Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_sunny.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_suwako.vtex_c b/materials/particle/portraits/thtd_portraits_suwako.vtex_c new file mode 100755 index 0000000..8a8fc49 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_suwako.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_tenshi.vtex_c b/materials/particle/portraits/thtd_portraits_tenshi.vtex_c new file mode 100755 index 0000000..6c9891a Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_tenshi.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_toramaru.vtex_c b/materials/particle/portraits/thtd_portraits_toramaru.vtex_c new file mode 100755 index 0000000..4659b93 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_toramaru.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_utsuho.vtex_c b/materials/particle/portraits/thtd_portraits_utsuho.vtex_c new file mode 100755 index 0000000..d085034 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_utsuho.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_wriggle.vtex_c b/materials/particle/portraits/thtd_portraits_wriggle.vtex_c new file mode 100755 index 0000000..a21f249 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_wriggle.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_yoshika.vtex_c b/materials/particle/portraits/thtd_portraits_yoshika.vtex_c new file mode 100755 index 0000000..46e97b3 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_yoshika.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_youmu.vtex_c b/materials/particle/portraits/thtd_portraits_youmu.vtex_c new file mode 100755 index 0000000..7ae3db1 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_youmu.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_yuakri.vtex_c b/materials/particle/portraits/thtd_portraits_yuakri.vtex_c new file mode 100755 index 0000000..aa14192 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_yuakri.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_yukari.vtex_c b/materials/particle/portraits/thtd_portraits_yukari.vtex_c new file mode 100755 index 0000000..c255e3a Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_yukari.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_yumemi.vtex_c b/materials/particle/portraits/thtd_portraits_yumemi.vtex_c new file mode 100755 index 0000000..d32a23a Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_yumemi.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_yuugi.vtex_c b/materials/particle/portraits/thtd_portraits_yuugi.vtex_c new file mode 100755 index 0000000..683915b Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_yuugi.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_yuuka.vtex_c b/materials/particle/portraits/thtd_portraits_yuuka.vtex_c new file mode 100755 index 0000000..1bb6a79 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_yuuka.vtex_c differ diff --git a/materials/particle/portraits/thtd_portraits_yuyuko.vtex_c b/materials/particle/portraits/thtd_portraits_yuyuko.vtex_c new file mode 100755 index 0000000..1dae747 Binary files /dev/null and b/materials/particle/portraits/thtd_portraits_yuyuko.vtex_c differ diff --git a/materials/particle/reimu04_2.vtex_c b/materials/particle/reimu04_2.vtex_c new file mode 100755 index 0000000..add4778 Binary files /dev/null and b/materials/particle/reimu04_2.vtex_c differ diff --git a/materials/particle/remilia/ability_remilia_04.vtex_c b/materials/particle/remilia/ability_remilia_04.vtex_c new file mode 100755 index 0000000..51bbb16 Binary files /dev/null and b/materials/particle/remilia/ability_remilia_04.vtex_c differ diff --git a/materials/particle/thd2/nuclear.vtex_c b/materials/particle/thd2/nuclear.vtex_c new file mode 100755 index 0000000..37786b3 Binary files /dev/null and b/materials/particle/thd2/nuclear.vtex_c differ diff --git a/materials/particle/thd2/youmu.vtex_c b/materials/particle/thd2/youmu.vtex_c new file mode 100755 index 0000000..daf85a5 Binary files /dev/null and b/materials/particle/thd2/youmu.vtex_c differ diff --git a/materials/particle/timeaura.vtex_c b/materials/particle/timeaura.vtex_c new file mode 100755 index 0000000..0e96098 Binary files /dev/null and b/materials/particle/timeaura.vtex_c differ diff --git a/materials/particle/yugi_slam.vtex_c b/materials/particle/yugi_slam.vtex_c new file mode 100755 index 0000000..d121fd2 Binary files /dev/null and b/materials/particle/yugi_slam.vtex_c differ diff --git a/materials/pumpkin.vmdl_c b/materials/pumpkin.vmdl_c new file mode 100755 index 0000000..b47a658 Binary files /dev/null and b/materials/pumpkin.vmdl_c differ diff --git a/materials/pumpkin.vmesh_c b/materials/pumpkin.vmesh_c new file mode 100755 index 0000000..f659f3b Binary files /dev/null and b/materials/pumpkin.vmesh_c differ diff --git a/materials/thd2/fantasy_seal_a1_tga_4f53a520.vtex_c b/materials/thd2/fantasy_seal_a1_tga_4f53a520.vtex_c new file mode 100755 index 0000000..594feac Binary files /dev/null and b/materials/thd2/fantasy_seal_a1_tga_4f53a520.vtex_c differ diff --git a/materials/thd2/fantasy_seal_a2_tga_a8a9082e.vtex_c b/materials/thd2/fantasy_seal_a2_tga_a8a9082e.vtex_c new file mode 100755 index 0000000..62651e5 Binary files /dev/null and b/materials/thd2/fantasy_seal_a2_tga_a8a9082e.vtex_c differ diff --git a/materials/thd2/firewing_tga_d4a4a0c0.vtex_c b/materials/thd2/firewing_tga_d4a4a0c0.vtex_c new file mode 100755 index 0000000..12a3288 Binary files /dev/null and b/materials/thd2/firewing_tga_d4a4a0c0.vtex_c differ diff --git a/materials/thd2/phoenix2_nrm_tga_ef47ef6c.vtex_c b/materials/thd2/phoenix2_nrm_tga_ef47ef6c.vtex_c new file mode 100755 index 0000000..2618d32 Binary files /dev/null and b/materials/thd2/phoenix2_nrm_tga_ef47ef6c.vtex_c differ diff --git a/materials/thd2/yugi_slam_tga_ddfd64bd.vtex_c b/materials/thd2/yugi_slam_tga_ddfd64bd.vtex_c new file mode 100755 index 0000000..6fbcd65 Binary files /dev/null and b/materials/thd2/yugi_slam_tga_ddfd64bd.vtex_c differ diff --git a/materials/thd2/yuyuko_fan_tga_4a59f131.vtex_c b/materials/thd2/yuyuko_fan_tga_4a59f131.vtex_c new file mode 100755 index 0000000..2d650db Binary files /dev/null and b/materials/thd2/yuyuko_fan_tga_4a59f131.vtex_c differ diff --git a/materials/thd_hero/alice/alice.vmat_c b/materials/thd_hero/alice/alice.vmat_c new file mode 100755 index 0000000..7006faa Binary files /dev/null and b/materials/thd_hero/alice/alice.vmat_c differ diff --git a/materials/thd_hero/alice/alice_tga_18584af9.vtex_c b/materials/thd_hero/alice/alice_tga_18584af9.vtex_c new file mode 100755 index 0000000..6cdd762 Binary files /dev/null and b/materials/thd_hero/alice/alice_tga_18584af9.vtex_c differ diff --git a/materials/thd_hero/alice/alice_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/alice/alice_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/alice/alice_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/aya/aya.vmat_c b/materials/thd_hero/aya/aya.vmat_c new file mode 100755 index 0000000..1eb0c24 Binary files /dev/null and b/materials/thd_hero/aya/aya.vmat_c differ diff --git a/materials/thd_hero/aya/aya_tga_fbd5d659.vtex_c b/materials/thd_hero/aya/aya_tga_fbd5d659.vtex_c new file mode 100755 index 0000000..03a4bf8 Binary files /dev/null and b/materials/thd_hero/aya/aya_tga_fbd5d659.vtex_c differ diff --git a/materials/thd_hero/aya/aya_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/aya/aya_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/aya/aya_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/byakuren/byakuren.vmat_c b/materials/thd_hero/byakuren/byakuren.vmat_c new file mode 100755 index 0000000..e246f34 Binary files /dev/null and b/materials/thd_hero/byakuren/byakuren.vmat_c differ diff --git a/materials/thd_hero/byakuren/byakuren_gz.vmat_c b/materials/thd_hero/byakuren/byakuren_gz.vmat_c new file mode 100755 index 0000000..cca1aa7 Binary files /dev/null and b/materials/thd_hero/byakuren/byakuren_gz.vmat_c differ diff --git a/materials/thd_hero/byakuren/byakuren_gz_tga_246f1bba.vtex_c b/materials/thd_hero/byakuren/byakuren_gz_tga_246f1bba.vtex_c new file mode 100755 index 0000000..85da6e6 Binary files /dev/null and b/materials/thd_hero/byakuren/byakuren_gz_tga_246f1bba.vtex_c differ diff --git a/materials/thd_hero/byakuren/byakuren_gz_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/byakuren/byakuren_gz_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/byakuren/byakuren_gz_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/byakuren/byakuren_tga_c289bd85.vtex_c b/materials/thd_hero/byakuren/byakuren_tga_c289bd85.vtex_c new file mode 100755 index 0000000..f4e6f47 Binary files /dev/null and b/materials/thd_hero/byakuren/byakuren_tga_c289bd85.vtex_c differ diff --git a/materials/thd_hero/byakuren/byakuren_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/byakuren/byakuren_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/byakuren/byakuren_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/chen/chen.vmat_c b/materials/thd_hero/chen/chen.vmat_c new file mode 100755 index 0000000..269623c Binary files /dev/null and b/materials/thd_hero/chen/chen.vmat_c differ diff --git a/materials/thd_hero/chen/chen_tga_41e7bc62.vtex_c b/materials/thd_hero/chen/chen_tga_41e7bc62.vtex_c new file mode 100755 index 0000000..19146ea Binary files /dev/null and b/materials/thd_hero/chen/chen_tga_41e7bc62.vtex_c differ diff --git a/materials/thd_hero/chen/chen_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/chen/chen_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/chen/chen_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/daiyousei/daiyousei.vmat_c b/materials/thd_hero/daiyousei/daiyousei.vmat_c new file mode 100755 index 0000000..1fb88e7 Binary files /dev/null and b/materials/thd_hero/daiyousei/daiyousei.vmat_c differ diff --git a/materials/thd_hero/daiyousei/daiyousei2.vmat_c b/materials/thd_hero/daiyousei/daiyousei2.vmat_c new file mode 100755 index 0000000..d62ea7c Binary files /dev/null and b/materials/thd_hero/daiyousei/daiyousei2.vmat_c differ diff --git a/materials/thd_hero/daiyousei/daiyousei2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/daiyousei/daiyousei2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/daiyousei/daiyousei2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/daiyousei/daiyousei_tga_c1256b84.vtex_c b/materials/thd_hero/daiyousei/daiyousei_tga_c1256b84.vtex_c new file mode 100755 index 0000000..7ac5228 Binary files /dev/null and b/materials/thd_hero/daiyousei/daiyousei_tga_c1256b84.vtex_c differ diff --git a/materials/thd_hero/daiyousei/daiyousei_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/daiyousei/daiyousei_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/daiyousei/daiyousei_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/eirin/eirin.vmat_c b/materials/thd_hero/eirin/eirin.vmat_c new file mode 100755 index 0000000..f8927ec Binary files /dev/null and b/materials/thd_hero/eirin/eirin.vmat_c differ diff --git a/materials/thd_hero/eirin/eirin_tga_22662c59.vtex_c b/materials/thd_hero/eirin/eirin_tga_22662c59.vtex_c new file mode 100755 index 0000000..ac1de75 Binary files /dev/null and b/materials/thd_hero/eirin/eirin_tga_22662c59.vtex_c differ diff --git a/materials/thd_hero/eirin/eirin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/eirin/eirin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/eirin/eirin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/futo/blue.vmat_c b/materials/thd_hero/futo/blue.vmat_c new file mode 100755 index 0000000..e711cdd Binary files /dev/null and b/materials/thd_hero/futo/blue.vmat_c differ diff --git a/materials/thd_hero/futo/blue_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/futo/blue_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/futo/blue_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/futo/cyan.vmat_c b/materials/thd_hero/futo/cyan.vmat_c new file mode 100755 index 0000000..cf667c8 Binary files /dev/null and b/materials/thd_hero/futo/cyan.vmat_c differ diff --git a/materials/thd_hero/futo/cyan_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/futo/cyan_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/futo/cyan_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/futo/futo.vmat_c b/materials/thd_hero/futo/futo.vmat_c new file mode 100755 index 0000000..0d95dcb Binary files /dev/null and b/materials/thd_hero/futo/futo.vmat_c differ diff --git a/materials/thd_hero/futo/futo2_tga_258bb3e7.vtex_c b/materials/thd_hero/futo/futo2_tga_258bb3e7.vtex_c new file mode 100755 index 0000000..50053de Binary files /dev/null and b/materials/thd_hero/futo/futo2_tga_258bb3e7.vtex_c differ diff --git a/materials/thd_hero/futo/futo_blue_tga_5fc65f2b.vtex_c b/materials/thd_hero/futo/futo_blue_tga_5fc65f2b.vtex_c new file mode 100755 index 0000000..f58a053 Binary files /dev/null and b/materials/thd_hero/futo/futo_blue_tga_5fc65f2b.vtex_c differ diff --git a/materials/thd_hero/futo/futo_cyan_tga_c6f3a534.vtex_c b/materials/thd_hero/futo/futo_cyan_tga_c6f3a534.vtex_c new file mode 100755 index 0000000..41effa7 Binary files /dev/null and b/materials/thd_hero/futo/futo_cyan_tga_c6f3a534.vtex_c differ diff --git a/materials/thd_hero/futo/futo_green_tga_69eecc3f.vtex_c b/materials/thd_hero/futo/futo_green_tga_69eecc3f.vtex_c new file mode 100755 index 0000000..bf7b4ca Binary files /dev/null and b/materials/thd_hero/futo/futo_green_tga_69eecc3f.vtex_c differ diff --git a/materials/thd_hero/futo/futo_orange_tga_71cfea6b.vtex_c b/materials/thd_hero/futo/futo_orange_tga_71cfea6b.vtex_c new file mode 100755 index 0000000..42b6394 Binary files /dev/null and b/materials/thd_hero/futo/futo_orange_tga_71cfea6b.vtex_c differ diff --git a/materials/thd_hero/futo/futo_red_tga_2a3f02b9.vtex_c b/materials/thd_hero/futo/futo_red_tga_2a3f02b9.vtex_c new file mode 100755 index 0000000..bec3ddf Binary files /dev/null and b/materials/thd_hero/futo/futo_red_tga_2a3f02b9.vtex_c differ diff --git a/materials/thd_hero/futo/futo_tga_1f087d7d.vtex_c b/materials/thd_hero/futo/futo_tga_1f087d7d.vtex_c new file mode 100755 index 0000000..41eeccb Binary files /dev/null and b/materials/thd_hero/futo/futo_tga_1f087d7d.vtex_c differ diff --git a/materials/thd_hero/futo/futo_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/futo/futo_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/futo/futo_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/futo/futo_yellow_tga_9608b88.vtex_c b/materials/thd_hero/futo/futo_yellow_tga_9608b88.vtex_c new file mode 100755 index 0000000..a7acb0b Binary files /dev/null and b/materials/thd_hero/futo/futo_yellow_tga_9608b88.vtex_c differ diff --git a/materials/thd_hero/futo/green.vmat_c b/materials/thd_hero/futo/green.vmat_c new file mode 100755 index 0000000..7e2bf16 Binary files /dev/null and b/materials/thd_hero/futo/green.vmat_c differ diff --git a/materials/thd_hero/futo/green_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/futo/green_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/futo/green_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/futo/orange.vmat_c b/materials/thd_hero/futo/orange.vmat_c new file mode 100755 index 0000000..3063f94 Binary files /dev/null and b/materials/thd_hero/futo/orange.vmat_c differ diff --git a/materials/thd_hero/futo/orange_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/futo/orange_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/futo/orange_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/futo/red.vmat_c b/materials/thd_hero/futo/red.vmat_c new file mode 100755 index 0000000..2c1728b Binary files /dev/null and b/materials/thd_hero/futo/red.vmat_c differ diff --git a/materials/thd_hero/futo/red_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/futo/red_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/futo/red_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/futo/yellow.vmat_c b/materials/thd_hero/futo/yellow.vmat_c new file mode 100755 index 0000000..fee0e92 Binary files /dev/null and b/materials/thd_hero/futo/yellow.vmat_c differ diff --git a/materials/thd_hero/futo/yellow_vmat_g_tdetail_e81d3561.vtex_c b/materials/thd_hero/futo/yellow_vmat_g_tdetail_e81d3561.vtex_c new file mode 100755 index 0000000..9c00ad1 Binary files /dev/null and b/materials/thd_hero/futo/yellow_vmat_g_tdetail_e81d3561.vtex_c differ diff --git a/materials/thd_hero/futo/yellow_vmat_g_tdetail_fb11e019.vtex_c b/materials/thd_hero/futo/yellow_vmat_g_tdetail_fb11e019.vtex_c new file mode 100755 index 0000000..cbbb83a Binary files /dev/null and b/materials/thd_hero/futo/yellow_vmat_g_tdetail_fb11e019.vtex_c differ diff --git a/materials/thd_hero/futo/yellow_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/futo/yellow_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/futo/yellow_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/hanadayousei/hanadayousei.vmat_c b/materials/thd_hero/hanadayousei/hanadayousei.vmat_c new file mode 100755 index 0000000..2f86d55 Binary files /dev/null and b/materials/thd_hero/hanadayousei/hanadayousei.vmat_c differ diff --git a/materials/thd_hero/hanadayousei/hanadayousei2.vmat_c b/materials/thd_hero/hanadayousei/hanadayousei2.vmat_c new file mode 100755 index 0000000..f777531 Binary files /dev/null and b/materials/thd_hero/hanadayousei/hanadayousei2.vmat_c differ diff --git a/materials/thd_hero/hanadayousei/hanadayousei2_vmat_g_tcolor_c677f2a8.vtex_c b/materials/thd_hero/hanadayousei/hanadayousei2_vmat_g_tcolor_c677f2a8.vtex_c new file mode 100755 index 0000000..9fd5dc0 Binary files /dev/null and b/materials/thd_hero/hanadayousei/hanadayousei2_vmat_g_tcolor_c677f2a8.vtex_c differ diff --git a/materials/thd_hero/hanadayousei/hanadayousei2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/hanadayousei/hanadayousei2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/hanadayousei/hanadayousei2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/hanadayousei/hanadayousei_tga_69bd7afa.vtex_c b/materials/thd_hero/hanadayousei/hanadayousei_tga_69bd7afa.vtex_c new file mode 100755 index 0000000..c73ff1f Binary files /dev/null and b/materials/thd_hero/hanadayousei/hanadayousei_tga_69bd7afa.vtex_c differ diff --git a/materials/thd_hero/hanadayousei/hanadayousei_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/hanadayousei/hanadayousei_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/hanadayousei/hanadayousei_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/hatate/hatate.vmat_c b/materials/thd_hero/hatate/hatate.vmat_c new file mode 100755 index 0000000..a041905 Binary files /dev/null and b/materials/thd_hero/hatate/hatate.vmat_c differ diff --git a/materials/thd_hero/hatate/hatate_tga_2f75e4fd.vtex_c b/materials/thd_hero/hatate/hatate_tga_2f75e4fd.vtex_c new file mode 100755 index 0000000..7bfe99c Binary files /dev/null and b/materials/thd_hero/hatate/hatate_tga_2f75e4fd.vtex_c differ diff --git a/materials/thd_hero/hatate/hatate_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/hatate/hatate_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/hatate/hatate_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/hina/hina.vmat_c b/materials/thd_hero/hina/hina.vmat_c new file mode 100755 index 0000000..b3c8309 Binary files /dev/null and b/materials/thd_hero/hina/hina.vmat_c differ diff --git a/materials/thd_hero/hina/hina_tga_6c1ccb56.vtex_c b/materials/thd_hero/hina/hina_tga_6c1ccb56.vtex_c new file mode 100755 index 0000000..1c12ec8 Binary files /dev/null and b/materials/thd_hero/hina/hina_tga_6c1ccb56.vtex_c differ diff --git a/materials/thd_hero/hina/hina_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/hina/hina_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/hina/hina_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/iku/iku.vmat_c b/materials/thd_hero/iku/iku.vmat_c new file mode 100755 index 0000000..8b18f4a Binary files /dev/null and b/materials/thd_hero/iku/iku.vmat_c differ diff --git a/materials/thd_hero/iku/iku_tga_5edcff5f.vtex_c b/materials/thd_hero/iku/iku_tga_5edcff5f.vtex_c new file mode 100755 index 0000000..bd30291 Binary files /dev/null and b/materials/thd_hero/iku/iku_tga_5edcff5f.vtex_c differ diff --git a/materials/thd_hero/iku/iku_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/iku/iku_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/iku/iku_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/kagerou/kagerou.vmat_c b/materials/thd_hero/kagerou/kagerou.vmat_c new file mode 100755 index 0000000..52e2044 Binary files /dev/null and b/materials/thd_hero/kagerou/kagerou.vmat_c differ diff --git a/materials/thd_hero/kagerou/kagerou_tga_74815e20.vtex_c b/materials/thd_hero/kagerou/kagerou_tga_74815e20.vtex_c new file mode 100755 index 0000000..c1bc6e8 Binary files /dev/null and b/materials/thd_hero/kagerou/kagerou_tga_74815e20.vtex_c differ diff --git a/materials/thd_hero/kagerou/kagerou_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/kagerou/kagerou_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/kagerou/kagerou_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/kaguya/kaguya.vmat_c b/materials/thd_hero/kaguya/kaguya.vmat_c new file mode 100755 index 0000000..eca6ce2 Binary files /dev/null and b/materials/thd_hero/kaguya/kaguya.vmat_c differ diff --git a/materials/thd_hero/kaguya/kaguya_tga_e809446d.vtex_c b/materials/thd_hero/kaguya/kaguya_tga_e809446d.vtex_c new file mode 100755 index 0000000..5ca0c3d Binary files /dev/null and b/materials/thd_hero/kaguya/kaguya_tga_e809446d.vtex_c differ diff --git a/materials/thd_hero/kaguya/kaguya_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/kaguya/kaguya_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/kaguya/kaguya_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/kanako/aya.vmat_c b/materials/thd_hero/kanako/aya.vmat_c new file mode 100755 index 0000000..f3ddf63 Binary files /dev/null and b/materials/thd_hero/kanako/aya.vmat_c differ diff --git a/materials/thd_hero/kanako/aya_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/kanako/aya_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/kanako/aya_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/kanako/kanako.vmat_c b/materials/thd_hero/kanako/kanako.vmat_c new file mode 100755 index 0000000..bff9109 Binary files /dev/null and b/materials/thd_hero/kanako/kanako.vmat_c differ diff --git a/materials/thd_hero/kanako/kanako_tga_dc08fb43.vtex_c b/materials/thd_hero/kanako/kanako_tga_dc08fb43.vtex_c new file mode 100755 index 0000000..cfb82ba Binary files /dev/null and b/materials/thd_hero/kanako/kanako_tga_dc08fb43.vtex_c differ diff --git a/materials/thd_hero/kanako/kanako_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/kanako/kanako_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/kanako/kanako_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/keine/keine.vmat_c b/materials/thd_hero/keine/keine.vmat_c new file mode 100755 index 0000000..21fd1de Binary files /dev/null and b/materials/thd_hero/keine/keine.vmat_c differ diff --git a/materials/thd_hero/keine/keine_2.vmat_c b/materials/thd_hero/keine/keine_2.vmat_c new file mode 100755 index 0000000..876dd20 Binary files /dev/null and b/materials/thd_hero/keine/keine_2.vmat_c differ diff --git a/materials/thd_hero/keine/keine_2_tga_19652e5a.vtex_c b/materials/thd_hero/keine/keine_2_tga_19652e5a.vtex_c new file mode 100755 index 0000000..3e32a59 Binary files /dev/null and b/materials/thd_hero/keine/keine_2_tga_19652e5a.vtex_c differ diff --git a/materials/thd_hero/keine/keine_2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/keine/keine_2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/keine/keine_2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/keine/keine_tga_24e10455.vtex_c b/materials/thd_hero/keine/keine_tga_24e10455.vtex_c new file mode 100755 index 0000000..0188b45 Binary files /dev/null and b/materials/thd_hero/keine/keine_tga_24e10455.vtex_c differ diff --git a/materials/thd_hero/keine/keine_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/keine/keine_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/keine/keine_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/kisume/kisume.vmat_c b/materials/thd_hero/kisume/kisume.vmat_c new file mode 100755 index 0000000..c1f5154 Binary files /dev/null and b/materials/thd_hero/kisume/kisume.vmat_c differ diff --git a/materials/thd_hero/kisume/kisume_tga_ff9bd729.vtex_c b/materials/thd_hero/kisume/kisume_tga_ff9bd729.vtex_c new file mode 100755 index 0000000..2e5dd26 Binary files /dev/null and b/materials/thd_hero/kisume/kisume_tga_ff9bd729.vtex_c differ diff --git a/materials/thd_hero/kisume/kisume_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/kisume/kisume_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/kisume/kisume_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/koakuma/koakuma.vmat_c b/materials/thd_hero/koakuma/koakuma.vmat_c new file mode 100755 index 0000000..2d7393f Binary files /dev/null and b/materials/thd_hero/koakuma/koakuma.vmat_c differ diff --git a/materials/thd_hero/koakuma/koakuma_tga_97db6b1e.vtex_c b/materials/thd_hero/koakuma/koakuma_tga_97db6b1e.vtex_c new file mode 100755 index 0000000..a5e1d61 Binary files /dev/null and b/materials/thd_hero/koakuma/koakuma_tga_97db6b1e.vtex_c differ diff --git a/materials/thd_hero/koakuma/koakuma_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/koakuma/koakuma_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/koakuma/koakuma_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/kogasa/kogasa.vmat_c b/materials/thd_hero/kogasa/kogasa.vmat_c new file mode 100755 index 0000000..f3f2ee7 Binary files /dev/null and b/materials/thd_hero/kogasa/kogasa.vmat_c differ diff --git a/materials/thd_hero/kogasa/kogasa_tga_a8591f08.vtex_c b/materials/thd_hero/kogasa/kogasa_tga_a8591f08.vtex_c new file mode 100755 index 0000000..56bf540 Binary files /dev/null and b/materials/thd_hero/kogasa/kogasa_tga_a8591f08.vtex_c differ diff --git a/materials/thd_hero/kogasa/kogasa_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/kogasa/kogasa_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/kogasa/kogasa_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/kumoi/kumoi.vmat_c b/materials/thd_hero/kumoi/kumoi.vmat_c new file mode 100755 index 0000000..c2f22cb Binary files /dev/null and b/materials/thd_hero/kumoi/kumoi.vmat_c differ diff --git a/materials/thd_hero/kumoi/kumoi_tga_45b25c30.vtex_c b/materials/thd_hero/kumoi/kumoi_tga_45b25c30.vtex_c new file mode 100755 index 0000000..135228b Binary files /dev/null and b/materials/thd_hero/kumoi/kumoi_tga_45b25c30.vtex_c differ diff --git a/materials/thd_hero/kumoi/kumoi_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/kumoi/kumoi_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/kumoi/kumoi_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/kyouko/kyouko.vmat_c b/materials/thd_hero/kyouko/kyouko.vmat_c new file mode 100755 index 0000000..c53bb70 Binary files /dev/null and b/materials/thd_hero/kyouko/kyouko.vmat_c differ diff --git a/materials/thd_hero/kyouko/kyouko_tga_5843f0d4.vtex_c b/materials/thd_hero/kyouko/kyouko_tga_5843f0d4.vtex_c new file mode 100755 index 0000000..ffd260f Binary files /dev/null and b/materials/thd_hero/kyouko/kyouko_tga_5843f0d4.vtex_c differ diff --git a/materials/thd_hero/kyouko/kyouko_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/kyouko/kyouko_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/kyouko/kyouko_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/letty/letty.vmat_c b/materials/thd_hero/letty/letty.vmat_c new file mode 100755 index 0000000..4f14d4f Binary files /dev/null and b/materials/thd_hero/letty/letty.vmat_c differ diff --git a/materials/thd_hero/letty/letty_tga_de4a83ee.vtex_c b/materials/thd_hero/letty/letty_tga_de4a83ee.vtex_c new file mode 100755 index 0000000..f86680b Binary files /dev/null and b/materials/thd_hero/letty/letty_tga_de4a83ee.vtex_c differ diff --git a/materials/thd_hero/letty/letty_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/letty/letty_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/letty/letty_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/lily_white/lily_white.vmat_c b/materials/thd_hero/lily_white/lily_white.vmat_c new file mode 100755 index 0000000..5a85325 Binary files /dev/null and b/materials/thd_hero/lily_white/lily_white.vmat_c differ diff --git a/materials/thd_hero/lily_white/lily_white2.vmat_c b/materials/thd_hero/lily_white/lily_white2.vmat_c new file mode 100755 index 0000000..4f17c5d Binary files /dev/null and b/materials/thd_hero/lily_white/lily_white2.vmat_c differ diff --git a/materials/thd_hero/lily_white/lily_white2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/lily_white/lily_white2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/lily_white/lily_white2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/lily_white/lily_white_tga_a989b872.vtex_c b/materials/thd_hero/lily_white/lily_white_tga_a989b872.vtex_c new file mode 100755 index 0000000..327ae48 Binary files /dev/null and b/materials/thd_hero/lily_white/lily_white_tga_a989b872.vtex_c differ diff --git a/materials/thd_hero/lily_white/lily_white_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/lily_white/lily_white_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/lily_white/lily_white_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/luna/luna_tga_46072901.vtex_c b/materials/thd_hero/luna/luna_tga_46072901.vtex_c new file mode 100755 index 0000000..81b6048 Binary files /dev/null and b/materials/thd_hero/luna/luna_tga_46072901.vtex_c differ diff --git a/materials/thd_hero/luna/luna_tga_b816aecc.vtex_c b/materials/thd_hero/luna/luna_tga_b816aecc.vtex_c new file mode 100755 index 0000000..5a35bc4 Binary files /dev/null and b/materials/thd_hero/luna/luna_tga_b816aecc.vtex_c differ diff --git a/materials/thd_hero/luna/lunar.vmat_c b/materials/thd_hero/luna/lunar.vmat_c new file mode 100755 index 0000000..efd7e05 Binary files /dev/null and b/materials/thd_hero/luna/lunar.vmat_c differ diff --git a/materials/thd_hero/luna/lunar2.vmat_c b/materials/thd_hero/luna/lunar2.vmat_c new file mode 100755 index 0000000..53f796c Binary files /dev/null and b/materials/thd_hero/luna/lunar2.vmat_c differ diff --git a/materials/thd_hero/luna/lunar2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/luna/lunar2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/luna/lunar2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/luna/lunar3.vmat_c b/materials/thd_hero/luna/lunar3.vmat_c new file mode 100755 index 0000000..d8c96b2 Binary files /dev/null and b/materials/thd_hero/luna/lunar3.vmat_c differ diff --git a/materials/thd_hero/luna/lunar3_vmat_g_tcolor_e8a2e485.vtex_c b/materials/thd_hero/luna/lunar3_vmat_g_tcolor_e8a2e485.vtex_c new file mode 100755 index 0000000..7fe3fee Binary files /dev/null and b/materials/thd_hero/luna/lunar3_vmat_g_tcolor_e8a2e485.vtex_c differ diff --git a/materials/thd_hero/luna/lunar3_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/luna/lunar3_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/luna/lunar3_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/luna/lunar_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/luna/lunar_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/luna/lunar_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/maidyousei/maidyousei.vmat_c b/materials/thd_hero/maidyousei/maidyousei.vmat_c new file mode 100755 index 0000000..281f0bf Binary files /dev/null and b/materials/thd_hero/maidyousei/maidyousei.vmat_c differ diff --git a/materials/thd_hero/maidyousei/maidyousei2.vmat_c b/materials/thd_hero/maidyousei/maidyousei2.vmat_c new file mode 100755 index 0000000..af06386 Binary files /dev/null and b/materials/thd_hero/maidyousei/maidyousei2.vmat_c differ diff --git a/materials/thd_hero/maidyousei/maidyousei2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/maidyousei/maidyousei2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/maidyousei/maidyousei2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/maidyousei/maidyousei_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/maidyousei/maidyousei_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/maidyousei/maidyousei_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/maidyousei/soldiers_far_red_tga_52f18576.vtex_c b/materials/thd_hero/maidyousei/soldiers_far_red_tga_52f18576.vtex_c new file mode 100755 index 0000000..f20f76c Binary files /dev/null and b/materials/thd_hero/maidyousei/soldiers_far_red_tga_52f18576.vtex_c differ diff --git a/materials/thd_hero/medicine/medicine.vmat_c b/materials/thd_hero/medicine/medicine.vmat_c new file mode 100755 index 0000000..8a1f03b Binary files /dev/null and b/materials/thd_hero/medicine/medicine.vmat_c differ diff --git a/materials/thd_hero/medicine/medicine_tga_aff12530.vtex_c b/materials/thd_hero/medicine/medicine_tga_aff12530.vtex_c new file mode 100755 index 0000000..312512f Binary files /dev/null and b/materials/thd_hero/medicine/medicine_tga_aff12530.vtex_c differ diff --git a/materials/thd_hero/medicine/medicine_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/medicine/medicine_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/medicine/medicine_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/meirin/cloth01/meirin_cloth01.vmat_c b/materials/thd_hero/meirin/cloth01/meirin_cloth01.vmat_c new file mode 100755 index 0000000..ae83b77 Binary files /dev/null and b/materials/thd_hero/meirin/cloth01/meirin_cloth01.vmat_c differ diff --git a/materials/thd_hero/meirin/cloth01/meirin_cloth01_tga_d3654b00.vtex_c b/materials/thd_hero/meirin/cloth01/meirin_cloth01_tga_d3654b00.vtex_c new file mode 100755 index 0000000..f7fd997 Binary files /dev/null and b/materials/thd_hero/meirin/cloth01/meirin_cloth01_tga_d3654b00.vtex_c differ diff --git a/materials/thd_hero/meirin/cloth01/meirin_cloth01_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/meirin/cloth01/meirin_cloth01_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/meirin/cloth01/meirin_cloth01_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/meirin/meirin.vmat_c b/materials/thd_hero/meirin/meirin.vmat_c new file mode 100755 index 0000000..2640be8 Binary files /dev/null and b/materials/thd_hero/meirin/meirin.vmat_c differ diff --git a/materials/thd_hero/meirin/meirin_tga_c947f470.vtex_c b/materials/thd_hero/meirin/meirin_tga_c947f470.vtex_c new file mode 100755 index 0000000..415a957 Binary files /dev/null and b/materials/thd_hero/meirin/meirin_tga_c947f470.vtex_c differ diff --git a/materials/thd_hero/meirin/meirin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/meirin/meirin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/meirin/meirin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/miko/miko.vmat_c b/materials/thd_hero/miko/miko.vmat_c new file mode 100755 index 0000000..f952270 Binary files /dev/null and b/materials/thd_hero/miko/miko.vmat_c differ diff --git a/materials/thd_hero/miko/miko_tga_c40f5acf.vtex_c b/materials/thd_hero/miko/miko_tga_c40f5acf.vtex_c new file mode 100755 index 0000000..e1e2d24 Binary files /dev/null and b/materials/thd_hero/miko/miko_tga_c40f5acf.vtex_c differ diff --git a/materials/thd_hero/miko/miko_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/miko/miko_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/miko/miko_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/minamitsu/minamitsu.vmat_c b/materials/thd_hero/minamitsu/minamitsu.vmat_c new file mode 100755 index 0000000..58cb253 Binary files /dev/null and b/materials/thd_hero/minamitsu/minamitsu.vmat_c differ diff --git a/materials/thd_hero/minamitsu/minamitsu_tga_b41da9bb.vtex_c b/materials/thd_hero/minamitsu/minamitsu_tga_b41da9bb.vtex_c new file mode 100755 index 0000000..bf417b1 Binary files /dev/null and b/materials/thd_hero/minamitsu/minamitsu_tga_b41da9bb.vtex_c differ diff --git a/materials/thd_hero/minamitsu/minamitsu_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/minamitsu/minamitsu_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/minamitsu/minamitsu_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/minoriko/minoriko.vmat_c b/materials/thd_hero/minoriko/minoriko.vmat_c new file mode 100755 index 0000000..a2411be Binary files /dev/null and b/materials/thd_hero/minoriko/minoriko.vmat_c differ diff --git a/materials/thd_hero/minoriko/minoriko_tga_2b09e938.vtex_c b/materials/thd_hero/minoriko/minoriko_tga_2b09e938.vtex_c new file mode 100755 index 0000000..5cbc56c Binary files /dev/null and b/materials/thd_hero/minoriko/minoriko_tga_2b09e938.vtex_c differ diff --git a/materials/thd_hero/minoriko/minoriko_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/minoriko/minoriko_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/minoriko/minoriko_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/mokou/mokou.vmat_c b/materials/thd_hero/mokou/mokou.vmat_c new file mode 100755 index 0000000..1194364 Binary files /dev/null and b/materials/thd_hero/mokou/mokou.vmat_c differ diff --git a/materials/thd_hero/mokou/mokou_tga_1103ab21.vtex_c b/materials/thd_hero/mokou/mokou_tga_1103ab21.vtex_c new file mode 100755 index 0000000..4d178f5 Binary files /dev/null and b/materials/thd_hero/mokou/mokou_tga_1103ab21.vtex_c differ diff --git a/materials/thd_hero/mokou/mokou_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/mokou/mokou_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/mokou/mokou_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/momiji/momiji.vmat_c b/materials/thd_hero/momiji/momiji.vmat_c new file mode 100755 index 0000000..b251355 Binary files /dev/null and b/materials/thd_hero/momiji/momiji.vmat_c differ diff --git a/materials/thd_hero/momiji/momiji_tga_49d2e202.vtex_c b/materials/thd_hero/momiji/momiji_tga_49d2e202.vtex_c new file mode 100755 index 0000000..6f3f6a8 Binary files /dev/null and b/materials/thd_hero/momiji/momiji_tga_49d2e202.vtex_c differ diff --git a/materials/thd_hero/momiji/momiji_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/momiji/momiji_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/momiji/momiji_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/mugiyousei/mugiyousei.vmat_c b/materials/thd_hero/mugiyousei/mugiyousei.vmat_c new file mode 100755 index 0000000..5a91aa1 Binary files /dev/null and b/materials/thd_hero/mugiyousei/mugiyousei.vmat_c differ diff --git a/materials/thd_hero/mugiyousei/mugiyousei2.vmat_c b/materials/thd_hero/mugiyousei/mugiyousei2.vmat_c new file mode 100755 index 0000000..e07c4ee Binary files /dev/null and b/materials/thd_hero/mugiyousei/mugiyousei2.vmat_c differ diff --git a/materials/thd_hero/mugiyousei/mugiyousei2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/mugiyousei/mugiyousei2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/mugiyousei/mugiyousei2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/mugiyousei/mugiyousei_tga_fbdda306.vtex_c b/materials/thd_hero/mugiyousei/mugiyousei_tga_fbdda306.vtex_c new file mode 100755 index 0000000..bc323e1 Binary files /dev/null and b/materials/thd_hero/mugiyousei/mugiyousei_tga_fbdda306.vtex_c differ diff --git a/materials/thd_hero/mugiyousei/mugiyousei_tga_fcd78f6e.vtex_c b/materials/thd_hero/mugiyousei/mugiyousei_tga_fcd78f6e.vtex_c new file mode 100755 index 0000000..0939eee Binary files /dev/null and b/materials/thd_hero/mugiyousei/mugiyousei_tga_fcd78f6e.vtex_c differ diff --git a/materials/thd_hero/mugiyousei/mugiyousei_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/mugiyousei/mugiyousei_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/mugiyousei/mugiyousei_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/mystia/cloth01/mystia_cloth01.vmat_c b/materials/thd_hero/mystia/cloth01/mystia_cloth01.vmat_c new file mode 100755 index 0000000..aeeb396 Binary files /dev/null and b/materials/thd_hero/mystia/cloth01/mystia_cloth01.vmat_c differ diff --git a/materials/thd_hero/mystia/cloth01/mystia_cloth01_tga_4c5334b2.vtex_c b/materials/thd_hero/mystia/cloth01/mystia_cloth01_tga_4c5334b2.vtex_c new file mode 100755 index 0000000..ec6f291 Binary files /dev/null and b/materials/thd_hero/mystia/cloth01/mystia_cloth01_tga_4c5334b2.vtex_c differ diff --git a/materials/thd_hero/mystia/cloth01/mystia_cloth01_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/mystia/cloth01/mystia_cloth01_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/mystia/cloth01/mystia_cloth01_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/mystia/mystia.vmat_c b/materials/thd_hero/mystia/mystia.vmat_c new file mode 100755 index 0000000..ed5f510 Binary files /dev/null and b/materials/thd_hero/mystia/mystia.vmat_c differ diff --git a/materials/thd_hero/mystia/mystia_tga_8ed9869a.vtex_c b/materials/thd_hero/mystia/mystia_tga_8ed9869a.vtex_c new file mode 100755 index 0000000..474e217 Binary files /dev/null and b/materials/thd_hero/mystia/mystia_tga_8ed9869a.vtex_c differ diff --git a/materials/thd_hero/mystia/mystia_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/mystia/mystia_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/mystia/mystia_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/nazrin/nazrin.vmat_c b/materials/thd_hero/nazrin/nazrin.vmat_c new file mode 100755 index 0000000..f8d6dff Binary files /dev/null and b/materials/thd_hero/nazrin/nazrin.vmat_c differ diff --git a/materials/thd_hero/nazrin/nazrin_tga_b4944eca.vtex_c b/materials/thd_hero/nazrin/nazrin_tga_b4944eca.vtex_c new file mode 100755 index 0000000..0d65c24 Binary files /dev/null and b/materials/thd_hero/nazrin/nazrin_tga_b4944eca.vtex_c differ diff --git a/materials/thd_hero/nazrin/nazrin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/nazrin/nazrin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/nazrin/nazrin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/ningyou/axebladebluesteel_tga_2ab353a8.vtex_c b/materials/thd_hero/ningyou/axebladebluesteel_tga_2ab353a8.vtex_c new file mode 100755 index 0000000..4e32162 Binary files /dev/null and b/materials/thd_hero/ningyou/axebladebluesteel_tga_2ab353a8.vtex_c differ diff --git a/materials/thd_hero/ningyou/ningyou.vmat_c b/materials/thd_hero/ningyou/ningyou.vmat_c new file mode 100755 index 0000000..129dac1 Binary files /dev/null and b/materials/thd_hero/ningyou/ningyou.vmat_c differ diff --git a/materials/thd_hero/ningyou/ningyou2.vmat_c b/materials/thd_hero/ningyou/ningyou2.vmat_c new file mode 100755 index 0000000..00998a8 Binary files /dev/null and b/materials/thd_hero/ningyou/ningyou2.vmat_c differ diff --git a/materials/thd_hero/ningyou/ningyou2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/ningyou/ningyou2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/ningyou/ningyou2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/ningyou/ningyou3.vmat_c b/materials/thd_hero/ningyou/ningyou3.vmat_c new file mode 100755 index 0000000..334379b Binary files /dev/null and b/materials/thd_hero/ningyou/ningyou3.vmat_c differ diff --git a/materials/thd_hero/ningyou/ningyou3_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/ningyou/ningyou3_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/ningyou/ningyou3_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/ningyou/ningyou4.vmat_c b/materials/thd_hero/ningyou/ningyou4.vmat_c new file mode 100755 index 0000000..36ae641 Binary files /dev/null and b/materials/thd_hero/ningyou/ningyou4.vmat_c differ diff --git a/materials/thd_hero/ningyou/ningyou4_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/ningyou/ningyou4_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/ningyou/ningyou4_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/ningyou/ningyou_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/ningyou/ningyou_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/ningyou/ningyou_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/ningyou/rifleman_tga_14902bdf.vtex_c b/materials/thd_hero/ningyou/rifleman_tga_14902bdf.vtex_c new file mode 100755 index 0000000..d22d5ce Binary files /dev/null and b/materials/thd_hero/ningyou/rifleman_tga_14902bdf.vtex_c differ diff --git a/materials/thd_hero/ningyou/shanghai_body_tga_4af98f4c.vtex_c b/materials/thd_hero/ningyou/shanghai_body_tga_4af98f4c.vtex_c new file mode 100755 index 0000000..8b17bc1 Binary files /dev/null and b/materials/thd_hero/ningyou/shanghai_body_tga_4af98f4c.vtex_c differ diff --git a/materials/thd_hero/ningyou/shanghai_head_tga_50c8ae1d.vtex_c b/materials/thd_hero/ningyou/shanghai_head_tga_50c8ae1d.vtex_c new file mode 100755 index 0000000..f169a9a Binary files /dev/null and b/materials/thd_hero/ningyou/shanghai_head_tga_50c8ae1d.vtex_c differ diff --git a/materials/thd_hero/nitori/blue_star.vmat_c b/materials/thd_hero/nitori/blue_star.vmat_c new file mode 100755 index 0000000..6af77fa Binary files /dev/null and b/materials/thd_hero/nitori/blue_star.vmat_c differ diff --git a/materials/thd_hero/nitori/blue_star_tga_4f6b881f.vtex_c b/materials/thd_hero/nitori/blue_star_tga_4f6b881f.vtex_c new file mode 100755 index 0000000..ed9991d Binary files /dev/null and b/materials/thd_hero/nitori/blue_star_tga_4f6b881f.vtex_c differ diff --git a/materials/thd_hero/nitori/blue_star_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/nitori/blue_star_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/nitori/blue_star_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/nitori/nitori_n_body.vmat_c b/materials/thd_hero/nitori/nitori_n_body.vmat_c new file mode 100755 index 0000000..a2c1c55 Binary files /dev/null and b/materials/thd_hero/nitori/nitori_n_body.vmat_c differ diff --git a/materials/thd_hero/nitori/nitori_n_body_tga_f8781472.vtex_c b/materials/thd_hero/nitori/nitori_n_body_tga_f8781472.vtex_c new file mode 100755 index 0000000..e586ec9 Binary files /dev/null and b/materials/thd_hero/nitori/nitori_n_body_tga_f8781472.vtex_c differ diff --git a/materials/thd_hero/nitori/nitori_n_body_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/nitori/nitori_n_body_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/nitori/nitori_n_body_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/nitori/nitori_n_head.vmat_c b/materials/thd_hero/nitori/nitori_n_head.vmat_c new file mode 100755 index 0000000..c20955b Binary files /dev/null and b/materials/thd_hero/nitori/nitori_n_head.vmat_c differ diff --git a/materials/thd_hero/nitori/nitori_n_head_tga_22a70d4b.vtex_c b/materials/thd_hero/nitori/nitori_n_head_tga_22a70d4b.vtex_c new file mode 100755 index 0000000..b009a26 Binary files /dev/null and b/materials/thd_hero/nitori/nitori_n_head_tga_22a70d4b.vtex_c differ diff --git a/materials/thd_hero/nitori/nitori_n_head_tga_9b2878d0.vtex_c b/materials/thd_hero/nitori/nitori_n_head_tga_9b2878d0.vtex_c new file mode 100755 index 0000000..e0eee5d Binary files /dev/null and b/materials/thd_hero/nitori/nitori_n_head_tga_9b2878d0.vtex_c differ diff --git a/materials/thd_hero/nitori/nitori_n_head_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/nitori/nitori_n_head_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/nitori/nitori_n_head_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/nitori/red_glow2.vmat_c b/materials/thd_hero/nitori/red_glow2.vmat_c new file mode 100755 index 0000000..204b5ac Binary files /dev/null and b/materials/thd_hero/nitori/red_glow2.vmat_c differ diff --git a/materials/thd_hero/nitori/red_glow2_alpha_tga_4f6eee01.vtex_c b/materials/thd_hero/nitori/red_glow2_alpha_tga_4f6eee01.vtex_c new file mode 100755 index 0000000..6f977a6 Binary files /dev/null and b/materials/thd_hero/nitori/red_glow2_alpha_tga_4f6eee01.vtex_c differ diff --git a/materials/thd_hero/nitori/red_glow2_alpha_tga_5b27b44c.vtex_c b/materials/thd_hero/nitori/red_glow2_alpha_tga_5b27b44c.vtex_c new file mode 100755 index 0000000..9f7678b Binary files /dev/null and b/materials/thd_hero/nitori/red_glow2_alpha_tga_5b27b44c.vtex_c differ diff --git a/materials/thd_hero/nitori/red_glow2_alpha_tga_cc688742.vtex_c b/materials/thd_hero/nitori/red_glow2_alpha_tga_cc688742.vtex_c new file mode 100755 index 0000000..46cad3f Binary files /dev/null and b/materials/thd_hero/nitori/red_glow2_alpha_tga_cc688742.vtex_c differ diff --git a/materials/thd_hero/nitori/red_glow2_alpha_tga_ce664636.vtex_c b/materials/thd_hero/nitori/red_glow2_alpha_tga_ce664636.vtex_c new file mode 100755 index 0000000..c0f4e01 Binary files /dev/null and b/materials/thd_hero/nitori/red_glow2_alpha_tga_ce664636.vtex_c differ diff --git a/materials/thd_hero/nitori/red_glow2_alpha_tga_e2adb10.vtex_c b/materials/thd_hero/nitori/red_glow2_alpha_tga_e2adb10.vtex_c new file mode 100755 index 0000000..6a82035 Binary files /dev/null and b/materials/thd_hero/nitori/red_glow2_alpha_tga_e2adb10.vtex_c differ diff --git a/materials/thd_hero/nitori/red_glow2_alpha_tga_f4002bf6.vtex_c b/materials/thd_hero/nitori/red_glow2_alpha_tga_f4002bf6.vtex_c new file mode 100755 index 0000000..0a114f3 Binary files /dev/null and b/materials/thd_hero/nitori/red_glow2_alpha_tga_f4002bf6.vtex_c differ diff --git a/materials/thd_hero/nitori/red_glow2_alpha_tga_fb52e58e.vtex_c b/materials/thd_hero/nitori/red_glow2_alpha_tga_fb52e58e.vtex_c new file mode 100755 index 0000000..ad3d5ec Binary files /dev/null and b/materials/thd_hero/nitori/red_glow2_alpha_tga_fb52e58e.vtex_c differ diff --git a/materials/thd_hero/nitori/red_glow2_tga_16543498.vtex_c b/materials/thd_hero/nitori/red_glow2_tga_16543498.vtex_c new file mode 100755 index 0000000..707957e Binary files /dev/null and b/materials/thd_hero/nitori/red_glow2_tga_16543498.vtex_c differ diff --git a/materials/thd_hero/nitori/red_glow2_tga_4777de86.vtex_c b/materials/thd_hero/nitori/red_glow2_tga_4777de86.vtex_c new file mode 100755 index 0000000..b200362 Binary files /dev/null and b/materials/thd_hero/nitori/red_glow2_tga_4777de86.vtex_c differ diff --git a/materials/thd_hero/nitori/red_glow2_tga_48998b9c.vtex_c b/materials/thd_hero/nitori/red_glow2_tga_48998b9c.vtex_c new file mode 100755 index 0000000..4705b6e Binary files /dev/null and b/materials/thd_hero/nitori/red_glow2_tga_48998b9c.vtex_c differ diff --git a/materials/thd_hero/nitori/red_glow2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/nitori/red_glow2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/nitori/red_glow2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/nue/nue.vmat_c b/materials/thd_hero/nue/nue.vmat_c new file mode 100755 index 0000000..a8b4fc6 Binary files /dev/null and b/materials/thd_hero/nue/nue.vmat_c differ diff --git a/materials/thd_hero/nue/nue_tga_db90ffce.vtex_c b/materials/thd_hero/nue/nue_tga_db90ffce.vtex_c new file mode 100755 index 0000000..27cf182 Binary files /dev/null and b/materials/thd_hero/nue/nue_tga_db90ffce.vtex_c differ diff --git a/materials/thd_hero/nue/nue_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/nue/nue_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/nue/nue_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/parsee/parsee.vmat_c b/materials/thd_hero/parsee/parsee.vmat_c new file mode 100755 index 0000000..262156e Binary files /dev/null and b/materials/thd_hero/parsee/parsee.vmat_c differ diff --git a/materials/thd_hero/parsee/parsee_tga_4533e2e7.vtex_c b/materials/thd_hero/parsee/parsee_tga_4533e2e7.vtex_c new file mode 100755 index 0000000..c1f7a4a Binary files /dev/null and b/materials/thd_hero/parsee/parsee_tga_4533e2e7.vtex_c differ diff --git a/materials/thd_hero/parsee/parsee_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/parsee/parsee_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/parsee/parsee_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/ran/ran.vmat_c b/materials/thd_hero/ran/ran.vmat_c new file mode 100755 index 0000000..acfc775 Binary files /dev/null and b/materials/thd_hero/ran/ran.vmat_c differ diff --git a/materials/thd_hero/ran/ran_tga_d060fd65.vtex_c b/materials/thd_hero/ran/ran_tga_d060fd65.vtex_c new file mode 100755 index 0000000..753f816 Binary files /dev/null and b/materials/thd_hero/ran/ran_tga_d060fd65.vtex_c differ diff --git a/materials/thd_hero/ran/ran_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/ran/ran_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/ran/ran_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/reisen/cloth01/reisen_cloth01.vmat_c b/materials/thd_hero/reisen/cloth01/reisen_cloth01.vmat_c new file mode 100755 index 0000000..df07f43 Binary files /dev/null and b/materials/thd_hero/reisen/cloth01/reisen_cloth01.vmat_c differ diff --git a/materials/thd_hero/reisen/cloth01/reisen_cloth01_tga_2444ead6.vtex_c b/materials/thd_hero/reisen/cloth01/reisen_cloth01_tga_2444ead6.vtex_c new file mode 100755 index 0000000..7e49a52 Binary files /dev/null and b/materials/thd_hero/reisen/cloth01/reisen_cloth01_tga_2444ead6.vtex_c differ diff --git a/materials/thd_hero/reisen/cloth01/reisen_cloth01_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/reisen/cloth01/reisen_cloth01_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/reisen/cloth01/reisen_cloth01_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/reisen/reisen.vmat_c b/materials/thd_hero/reisen/reisen.vmat_c new file mode 100755 index 0000000..4ef1aed Binary files /dev/null and b/materials/thd_hero/reisen/reisen.vmat_c differ diff --git a/materials/thd_hero/reisen/reisen_tga_cb7cd6fb.vtex_c b/materials/thd_hero/reisen/reisen_tga_cb7cd6fb.vtex_c new file mode 100755 index 0000000..8900fa1 Binary files /dev/null and b/materials/thd_hero/reisen/reisen_tga_cb7cd6fb.vtex_c differ diff --git a/materials/thd_hero/reisen/reisen_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/reisen/reisen_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/reisen/reisen_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/rin/rin.vmat_c b/materials/thd_hero/rin/rin.vmat_c new file mode 100755 index 0000000..edefe3e Binary files /dev/null and b/materials/thd_hero/rin/rin.vmat_c differ diff --git a/materials/thd_hero/rin/rin_tga_1308de50.vtex_c b/materials/thd_hero/rin/rin_tga_1308de50.vtex_c new file mode 100755 index 0000000..2df750a Binary files /dev/null and b/materials/thd_hero/rin/rin_tga_1308de50.vtex_c differ diff --git a/materials/thd_hero/rin/rin_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/rin/rin_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/rin/rin_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/rumia/rumia.vmat_c b/materials/thd_hero/rumia/rumia.vmat_c new file mode 100755 index 0000000..7736864 Binary files /dev/null and b/materials/thd_hero/rumia/rumia.vmat_c differ diff --git a/materials/thd_hero/rumia/rumia_tga_f0528c4d.vtex_c b/materials/thd_hero/rumia/rumia_tga_f0528c4d.vtex_c new file mode 100755 index 0000000..ae5aaf3 Binary files /dev/null and b/materials/thd_hero/rumia/rumia_tga_f0528c4d.vtex_c differ diff --git a/materials/thd_hero/rumia/rumia_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/rumia/rumia_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/rumia/rumia_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/sanae/cloth01/sanae_jk.vmat_c b/materials/thd_hero/sanae/cloth01/sanae_jk.vmat_c new file mode 100755 index 0000000..eef085c Binary files /dev/null and b/materials/thd_hero/sanae/cloth01/sanae_jk.vmat_c differ diff --git a/materials/thd_hero/sanae/cloth01/sanae_jk_tga_f06e0233.vtex_c b/materials/thd_hero/sanae/cloth01/sanae_jk_tga_f06e0233.vtex_c new file mode 100755 index 0000000..0d1a100 Binary files /dev/null and b/materials/thd_hero/sanae/cloth01/sanae_jk_tga_f06e0233.vtex_c differ diff --git a/materials/thd_hero/sanae/cloth01/sanae_jk_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/sanae/cloth01/sanae_jk_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/sanae/cloth01/sanae_jk_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/sanae/sanae.vmat_c b/materials/thd_hero/sanae/sanae.vmat_c new file mode 100755 index 0000000..a0903f6 Binary files /dev/null and b/materials/thd_hero/sanae/sanae.vmat_c differ diff --git a/materials/thd_hero/sanae/sanae_tga_e31c059c.vtex_c b/materials/thd_hero/sanae/sanae_tga_e31c059c.vtex_c new file mode 100755 index 0000000..834dbb8 Binary files /dev/null and b/materials/thd_hero/sanae/sanae_tga_e31c059c.vtex_c differ diff --git a/materials/thd_hero/sanae/sanae_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/sanae/sanae_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/sanae/sanae_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/saoling/saoling.vmat_c b/materials/thd_hero/saoling/saoling.vmat_c new file mode 100755 index 0000000..eca4454 Binary files /dev/null and b/materials/thd_hero/saoling/saoling.vmat_c differ diff --git a/materials/thd_hero/saoling/saoling_tga_130effbf.vtex_c b/materials/thd_hero/saoling/saoling_tga_130effbf.vtex_c new file mode 100755 index 0000000..3511cac Binary files /dev/null and b/materials/thd_hero/saoling/saoling_tga_130effbf.vtex_c differ diff --git a/materials/thd_hero/saoling/saoling_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/saoling/saoling_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/saoling/saoling_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/seiga/seiga.vmat_c b/materials/thd_hero/seiga/seiga.vmat_c new file mode 100755 index 0000000..124ba59 Binary files /dev/null and b/materials/thd_hero/seiga/seiga.vmat_c differ diff --git a/materials/thd_hero/seiga/seiga2.vmat_c b/materials/thd_hero/seiga/seiga2.vmat_c new file mode 100755 index 0000000..e001749 Binary files /dev/null and b/materials/thd_hero/seiga/seiga2.vmat_c differ diff --git a/materials/thd_hero/seiga/seiga2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/seiga/seiga2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/seiga/seiga2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/seiga/seiga_tga_562fc2bb.vtex_c b/materials/thd_hero/seiga/seiga_tga_562fc2bb.vtex_c new file mode 100755 index 0000000..cb65988 Binary files /dev/null and b/materials/thd_hero/seiga/seiga_tga_562fc2bb.vtex_c differ diff --git a/materials/thd_hero/seiga/seiga_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/seiga/seiga_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/seiga/seiga_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/sizuha/sizuha.vmat_c b/materials/thd_hero/sizuha/sizuha.vmat_c new file mode 100755 index 0000000..4d38caa Binary files /dev/null and b/materials/thd_hero/sizuha/sizuha.vmat_c differ diff --git a/materials/thd_hero/sizuha/sizuha_tga_2db82aa4.vtex_c b/materials/thd_hero/sizuha/sizuha_tga_2db82aa4.vtex_c new file mode 100755 index 0000000..b5c71dc Binary files /dev/null and b/materials/thd_hero/sizuha/sizuha_tga_2db82aa4.vtex_c differ diff --git a/materials/thd_hero/sizuha/sizuha_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/sizuha/sizuha_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/sizuha/sizuha_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/soga/soga.vmat_c b/materials/thd_hero/soga/soga.vmat_c new file mode 100755 index 0000000..2e4ecf0 Binary files /dev/null and b/materials/thd_hero/soga/soga.vmat_c differ diff --git a/materials/thd_hero/soga/soga_tga_b946acef.vtex_c b/materials/thd_hero/soga/soga_tga_b946acef.vtex_c new file mode 100755 index 0000000..fe123b3 Binary files /dev/null and b/materials/thd_hero/soga/soga_tga_b946acef.vtex_c differ diff --git a/materials/thd_hero/soga/soga_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/soga/soga_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/soga/soga_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/star/star.vmat_c b/materials/thd_hero/star/star.vmat_c new file mode 100755 index 0000000..6857ccd Binary files /dev/null and b/materials/thd_hero/star/star.vmat_c differ diff --git a/materials/thd_hero/star/star2.vmat_c b/materials/thd_hero/star/star2.vmat_c new file mode 100755 index 0000000..632cb7e Binary files /dev/null and b/materials/thd_hero/star/star2.vmat_c differ diff --git a/materials/thd_hero/star/star2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/star/star2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/star/star2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/star/star_tga_a2fe7928.vtex_c b/materials/thd_hero/star/star_tga_a2fe7928.vtex_c new file mode 100755 index 0000000..bef8f20 Binary files /dev/null and b/materials/thd_hero/star/star_tga_a2fe7928.vtex_c differ diff --git a/materials/thd_hero/star/star_tga_f84ca24a.vtex_c b/materials/thd_hero/star/star_tga_f84ca24a.vtex_c new file mode 100755 index 0000000..11c734f Binary files /dev/null and b/materials/thd_hero/star/star_tga_f84ca24a.vtex_c differ diff --git a/materials/thd_hero/star/star_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/star/star_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/star/star_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/suika/suika.vmat_c b/materials/thd_hero/suika/suika.vmat_c new file mode 100755 index 0000000..75d6863 Binary files /dev/null and b/materials/thd_hero/suika/suika.vmat_c differ diff --git a/materials/thd_hero/suika/suika_tga_4f63ebe.vtex_c b/materials/thd_hero/suika/suika_tga_4f63ebe.vtex_c new file mode 100755 index 0000000..caa1ab4 Binary files /dev/null and b/materials/thd_hero/suika/suika_tga_4f63ebe.vtex_c differ diff --git a/materials/thd_hero/suika/suika_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/suika/suika_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/suika/suika_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/sunny/sunny.vmat_c b/materials/thd_hero/sunny/sunny.vmat_c new file mode 100755 index 0000000..a826aab Binary files /dev/null and b/materials/thd_hero/sunny/sunny.vmat_c differ diff --git a/materials/thd_hero/sunny/sunny2.vmat_c b/materials/thd_hero/sunny/sunny2.vmat_c new file mode 100755 index 0000000..9199ed8 Binary files /dev/null and b/materials/thd_hero/sunny/sunny2.vmat_c differ diff --git a/materials/thd_hero/sunny/sunny2_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/sunny/sunny2_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/sunny/sunny2_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/sunny/sunny_tga_3cdaafce.vtex_c b/materials/thd_hero/sunny/sunny_tga_3cdaafce.vtex_c new file mode 100755 index 0000000..58c0f8f Binary files /dev/null and b/materials/thd_hero/sunny/sunny_tga_3cdaafce.vtex_c differ diff --git a/materials/thd_hero/sunny/sunny_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/sunny/sunny_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/sunny/sunny_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/suwako/cloth01/suwako_cloth01.vmat_c b/materials/thd_hero/suwako/cloth01/suwako_cloth01.vmat_c new file mode 100755 index 0000000..68fa59a Binary files /dev/null and b/materials/thd_hero/suwako/cloth01/suwako_cloth01.vmat_c differ diff --git a/materials/thd_hero/suwako/cloth01/suwako_cloth01_tga_b59062e9.vtex_c b/materials/thd_hero/suwako/cloth01/suwako_cloth01_tga_b59062e9.vtex_c new file mode 100755 index 0000000..78ee980 Binary files /dev/null and b/materials/thd_hero/suwako/cloth01/suwako_cloth01_tga_b59062e9.vtex_c differ diff --git a/materials/thd_hero/suwako/cloth01/suwako_cloth01_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/suwako/cloth01/suwako_cloth01_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/suwako/cloth01/suwako_cloth01_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/suwako/suwako.vmat_c b/materials/thd_hero/suwako/suwako.vmat_c new file mode 100755 index 0000000..c18fe79 Binary files /dev/null and b/materials/thd_hero/suwako/suwako.vmat_c differ diff --git a/materials/thd_hero/suwako/suwako_tga_20d720c2.vtex_c b/materials/thd_hero/suwako/suwako_tga_20d720c2.vtex_c new file mode 100755 index 0000000..75c1d5e Binary files /dev/null and b/materials/thd_hero/suwako/suwako_tga_20d720c2.vtex_c differ diff --git a/materials/thd_hero/suwako/suwako_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/suwako/suwako_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/suwako/suwako_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/toramarushou/toramarushou.vmat_c b/materials/thd_hero/toramarushou/toramarushou.vmat_c new file mode 100755 index 0000000..1ed54c3 Binary files /dev/null and b/materials/thd_hero/toramarushou/toramarushou.vmat_c differ diff --git a/materials/thd_hero/toramarushou/toramarushou_tga_bb3b5af7.vtex_c b/materials/thd_hero/toramarushou/toramarushou_tga_bb3b5af7.vtex_c new file mode 100755 index 0000000..fac9fb0 Binary files /dev/null and b/materials/thd_hero/toramarushou/toramarushou_tga_bb3b5af7.vtex_c differ diff --git a/materials/thd_hero/toramarushou/toramarushou_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/toramarushou/toramarushou_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/toramarushou/toramarushou_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/utsuho/utsuho.vmat_c b/materials/thd_hero/utsuho/utsuho.vmat_c new file mode 100755 index 0000000..6618e19 Binary files /dev/null and b/materials/thd_hero/utsuho/utsuho.vmat_c differ diff --git a/materials/thd_hero/utsuho/utsuho_tga_bf77ec2b.vtex_c b/materials/thd_hero/utsuho/utsuho_tga_bf77ec2b.vtex_c new file mode 100755 index 0000000..10d6b49 Binary files /dev/null and b/materials/thd_hero/utsuho/utsuho_tga_bf77ec2b.vtex_c differ diff --git a/materials/thd_hero/utsuho/utsuho_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/utsuho/utsuho_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/utsuho/utsuho_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/wakasagihime/wakasagihime.vmat_c b/materials/thd_hero/wakasagihime/wakasagihime.vmat_c new file mode 100755 index 0000000..52cc8b3 Binary files /dev/null and b/materials/thd_hero/wakasagihime/wakasagihime.vmat_c differ diff --git a/materials/thd_hero/wakasagihime/wakasagihime_tga_d21c02cd.vtex_c b/materials/thd_hero/wakasagihime/wakasagihime_tga_d21c02cd.vtex_c new file mode 100755 index 0000000..1042dd5 Binary files /dev/null and b/materials/thd_hero/wakasagihime/wakasagihime_tga_d21c02cd.vtex_c differ diff --git a/materials/thd_hero/wakasagihime/wakasagihime_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/wakasagihime/wakasagihime_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/wakasagihime/wakasagihime_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/wiggle/wriggle.vmat_c b/materials/thd_hero/wiggle/wriggle.vmat_c new file mode 100755 index 0000000..ad4b0b2 Binary files /dev/null and b/materials/thd_hero/wiggle/wriggle.vmat_c differ diff --git a/materials/thd_hero/wiggle/wriggle_tga_e6d56bb3.vtex_c b/materials/thd_hero/wiggle/wriggle_tga_e6d56bb3.vtex_c new file mode 100755 index 0000000..86e9518 Binary files /dev/null and b/materials/thd_hero/wiggle/wriggle_tga_e6d56bb3.vtex_c differ diff --git a/materials/thd_hero/wiggle/wriggle_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/wiggle/wriggle_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/wiggle/wriggle_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/yamame/yamame.vmat_c b/materials/thd_hero/yamame/yamame.vmat_c new file mode 100755 index 0000000..4483fa1 Binary files /dev/null and b/materials/thd_hero/yamame/yamame.vmat_c differ diff --git a/materials/thd_hero/yamame/yamame_tga_23c3cca7.vtex_c b/materials/thd_hero/yamame/yamame_tga_23c3cca7.vtex_c new file mode 100755 index 0000000..6f09696 Binary files /dev/null and b/materials/thd_hero/yamame/yamame_tga_23c3cca7.vtex_c differ diff --git a/materials/thd_hero/yamame/yamame_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/yamame/yamame_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/yamame/yamame_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/yoshika/yoshika.vmat_c b/materials/thd_hero/yoshika/yoshika.vmat_c new file mode 100755 index 0000000..2cf9d2f Binary files /dev/null and b/materials/thd_hero/yoshika/yoshika.vmat_c differ diff --git a/materials/thd_hero/yoshika/yoshika_tga_6bc4e7e2.vtex_c b/materials/thd_hero/yoshika/yoshika_tga_6bc4e7e2.vtex_c new file mode 100755 index 0000000..03c44d8 Binary files /dev/null and b/materials/thd_hero/yoshika/yoshika_tga_6bc4e7e2.vtex_c differ diff --git a/materials/thd_hero/yoshika/yoshika_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/yoshika/yoshika_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/yoshika/yoshika_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/yuugi/yuugi.vmat_c b/materials/thd_hero/yuugi/yuugi.vmat_c new file mode 100755 index 0000000..bed9eda Binary files /dev/null and b/materials/thd_hero/yuugi/yuugi.vmat_c differ diff --git a/materials/thd_hero/yuugi/yuugi_tga_ce2c5321.vtex_c b/materials/thd_hero/yuugi/yuugi_tga_ce2c5321.vtex_c new file mode 100755 index 0000000..76cbf2d Binary files /dev/null and b/materials/thd_hero/yuugi/yuugi_tga_ce2c5321.vtex_c differ diff --git a/materials/thd_hero/yuugi/yuugi_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/yuugi/yuugi_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/yuugi/yuugi_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/thd_hero/yuyuko/yuyuko.vmat_c b/materials/thd_hero/yuyuko/yuyuko.vmat_c new file mode 100755 index 0000000..dd51d37 Binary files /dev/null and b/materials/thd_hero/yuyuko/yuyuko.vmat_c differ diff --git a/materials/thd_hero/yuyuko/yuyuko_tga_902d88af.vtex_c b/materials/thd_hero/yuyuko/yuyuko_tga_902d88af.vtex_c new file mode 100755 index 0000000..13b2252 Binary files /dev/null and b/materials/thd_hero/yuyuko/yuyuko_tga_902d88af.vtex_c differ diff --git a/materials/thd_hero/yuyuko/yuyuko_vmat_g_tmasks1_ce06f645.vtex_c b/materials/thd_hero/yuyuko/yuyuko_vmat_g_tmasks1_ce06f645.vtex_c new file mode 100755 index 0000000..22fcb8a Binary files /dev/null and b/materials/thd_hero/yuyuko/yuyuko_vmat_g_tmasks1_ce06f645.vtex_c differ diff --git a/materials/vgui/hud/minimap_hero_sheet.vmat_c b/materials/vgui/hud/minimap_hero_sheet.vmat_c new file mode 100755 index 0000000..8da0652 Binary files /dev/null and b/materials/vgui/hud/minimap_hero_sheet.vmat_c differ diff --git a/materials/vgui/hud/minimap_hero_sheet_origin_psd_ec58bae3.vtex_c b/materials/vgui/hud/minimap_hero_sheet_origin_psd_ec58bae3.vtex_c new file mode 100755 index 0000000..58b307f Binary files /dev/null and b/materials/vgui/hud/minimap_hero_sheet_origin_psd_ec58bae3.vtex_c differ diff --git a/materials/yuukaspark_tga_baba9b75.vtex_c b/materials/yuukaspark_tga_baba9b75.vtex_c new file mode 100755 index 0000000..0e6a51b Binary files /dev/null and b/materials/yuukaspark_tga_baba9b75.vtex_c differ diff --git a/models/alice/0c825569/alice_attack.vanim_c b/models/alice/0c825569/alice_attack.vanim_c new file mode 100755 index 0000000..92b759d Binary files /dev/null and b/models/alice/0c825569/alice_attack.vanim_c differ diff --git a/models/alice/0c825569/alice_attack2.vanim_c b/models/alice/0c825569/alice_attack2.vanim_c new file mode 100755 index 0000000..bef567c Binary files /dev/null and b/models/alice/0c825569/alice_attack2.vanim_c differ diff --git a/models/alice/0c825569/alice_attack3.vanim_c b/models/alice/0c825569/alice_attack3.vanim_c new file mode 100755 index 0000000..e932d66 Binary files /dev/null and b/models/alice/0c825569/alice_attack3.vanim_c differ diff --git a/models/alice/0c825569/alice_attack_2.vanim_c b/models/alice/0c825569/alice_attack_2.vanim_c new file mode 100755 index 0000000..04b1e34 Binary files /dev/null and b/models/alice/0c825569/alice_attack_2.vanim_c differ diff --git a/models/alice/0c825569/alice_attack__2_.vanim_c b/models/alice/0c825569/alice_attack__2_.vanim_c new file mode 100755 index 0000000..86483bd Binary files /dev/null and b/models/alice/0c825569/alice_attack__2_.vanim_c differ diff --git a/models/alice/0c825569/alice_cast.vanim_c b/models/alice/0c825569/alice_cast.vanim_c new file mode 100755 index 0000000..528d1c2 Binary files /dev/null and b/models/alice/0c825569/alice_cast.vanim_c differ diff --git a/models/alice/0c825569/alice_cast1.vanim_c b/models/alice/0c825569/alice_cast1.vanim_c new file mode 100755 index 0000000..fb09af3 Binary files /dev/null and b/models/alice/0c825569/alice_cast1.vanim_c differ diff --git a/models/alice/0c825569/alice_cast2.vanim_c b/models/alice/0c825569/alice_cast2.vanim_c new file mode 100755 index 0000000..e53acad Binary files /dev/null and b/models/alice/0c825569/alice_cast2.vanim_c differ diff --git a/models/alice/0c825569/alice_cast3.vanim_c b/models/alice/0c825569/alice_cast3.vanim_c new file mode 100755 index 0000000..b6209bb Binary files /dev/null and b/models/alice/0c825569/alice_cast3.vanim_c differ diff --git a/models/alice/0c825569/alice_cast4.vanim_c b/models/alice/0c825569/alice_cast4.vanim_c new file mode 100755 index 0000000..ae2b1b7 Binary files /dev/null and b/models/alice/0c825569/alice_cast4.vanim_c differ diff --git a/models/alice/0c825569/alice_cast4_2.vanim_c b/models/alice/0c825569/alice_cast4_2.vanim_c new file mode 100755 index 0000000..da2d899 Binary files /dev/null and b/models/alice/0c825569/alice_cast4_2.vanim_c differ diff --git a/models/alice/0c825569/alice_cast_2.vanim_c b/models/alice/0c825569/alice_cast_2.vanim_c new file mode 100755 index 0000000..b06d544 Binary files /dev/null and b/models/alice/0c825569/alice_cast_2.vanim_c differ diff --git a/models/alice/0c825569/alice_cast_3.vanim_c b/models/alice/0c825569/alice_cast_3.vanim_c new file mode 100755 index 0000000..4346ccd Binary files /dev/null and b/models/alice/0c825569/alice_cast_3.vanim_c differ diff --git a/models/alice/0c825569/alice_cast_4.vanim_c b/models/alice/0c825569/alice_cast_4.vanim_c new file mode 100755 index 0000000..e154a3e Binary files /dev/null and b/models/alice/0c825569/alice_cast_4.vanim_c differ diff --git a/models/alice/0c825569/alice_cast__2_.vanim_c b/models/alice/0c825569/alice_cast__2_.vanim_c new file mode 100755 index 0000000..5a6db34 Binary files /dev/null and b/models/alice/0c825569/alice_cast__2_.vanim_c differ diff --git a/models/alice/0c825569/alice_die.vanim_c b/models/alice/0c825569/alice_die.vanim_c new file mode 100755 index 0000000..00e62d2 Binary files /dev/null and b/models/alice/0c825569/alice_die.vanim_c differ diff --git a/models/alice/0c825569/alice_idle.vanim_c b/models/alice/0c825569/alice_idle.vanim_c new file mode 100755 index 0000000..cd8d909 Binary files /dev/null and b/models/alice/0c825569/alice_idle.vanim_c differ diff --git a/models/alice/0c825569/alice_idle1.vanim_c b/models/alice/0c825569/alice_idle1.vanim_c new file mode 100755 index 0000000..8695cea Binary files /dev/null and b/models/alice/0c825569/alice_idle1.vanim_c differ diff --git a/models/alice/0c825569/alice_idle2.vanim_c b/models/alice/0c825569/alice_idle2.vanim_c new file mode 100755 index 0000000..a76759a Binary files /dev/null and b/models/alice/0c825569/alice_idle2.vanim_c differ diff --git a/models/alice/0c825569/alice_idle__2_.vanim_c b/models/alice/0c825569/alice_idle__2_.vanim_c new file mode 100755 index 0000000..e337f00 Binary files /dev/null and b/models/alice/0c825569/alice_idle__2_.vanim_c differ diff --git a/models/alice/0c825569/alice_por.vanim_c b/models/alice/0c825569/alice_por.vanim_c new file mode 100755 index 0000000..5b566e6 Binary files /dev/null and b/models/alice/0c825569/alice_por.vanim_c differ diff --git a/models/alice/0c825569/alice_run.vanim_c b/models/alice/0c825569/alice_run.vanim_c new file mode 100755 index 0000000..e73bd1c Binary files /dev/null and b/models/alice/0c825569/alice_run.vanim_c differ diff --git a/models/alice/0c825569/alice_run1.vanim_c b/models/alice/0c825569/alice_run1.vanim_c new file mode 100755 index 0000000..a5a29b4 Binary files /dev/null and b/models/alice/0c825569/alice_run1.vanim_c differ diff --git a/models/alice/0c825569/alice_run2.vanim_c b/models/alice/0c825569/alice_run2.vanim_c new file mode 100755 index 0000000..425099a Binary files /dev/null and b/models/alice/0c825569/alice_run2.vanim_c differ diff --git a/models/alice/13ff4685/falanxi_attack.vanim_c b/models/alice/13ff4685/falanxi_attack.vanim_c new file mode 100755 index 0000000..ac9d03d Binary files /dev/null and b/models/alice/13ff4685/falanxi_attack.vanim_c differ diff --git a/models/alice/13ff4685/falanxi_cast.vanim_c b/models/alice/13ff4685/falanxi_cast.vanim_c new file mode 100755 index 0000000..15e6a97 Binary files /dev/null and b/models/alice/13ff4685/falanxi_cast.vanim_c differ diff --git a/models/alice/13ff4685/falanxi_die.vanim_c b/models/alice/13ff4685/falanxi_die.vanim_c new file mode 100755 index 0000000..3e65e24 Binary files /dev/null and b/models/alice/13ff4685/falanxi_die.vanim_c differ diff --git a/models/alice/13ff4685/falanxi_idle.vanim_c b/models/alice/13ff4685/falanxi_idle.vanim_c new file mode 100755 index 0000000..c465e5f Binary files /dev/null and b/models/alice/13ff4685/falanxi_idle.vanim_c differ diff --git a/models/alice/13ff4685/falanxi_run.vanim_c b/models/alice/13ff4685/falanxi_run.vanim_c new file mode 100755 index 0000000..0d8fa4b Binary files /dev/null and b/models/alice/13ff4685/falanxi_run.vanim_c differ diff --git a/models/alice/alice.vmdl_c b/models/alice/alice.vmdl_c new file mode 100755 index 0000000..e426310 Binary files /dev/null and b/models/alice/alice.vmdl_c differ diff --git a/models/alice/alice.vmesh_c b/models/alice/alice.vmesh_c new file mode 100755 index 0000000..bc31949 Binary files /dev/null and b/models/alice/alice.vmesh_c differ diff --git a/models/alice/alice.vmorf_c b/models/alice/alice.vmorf_c new file mode 100755 index 0000000..4934358 Binary files /dev/null and b/models/alice/alice.vmorf_c differ diff --git a/models/alice/alice_0c825569.vagrp_c b/models/alice/alice_0c825569.vagrp_c new file mode 100755 index 0000000..df2e196 Binary files /dev/null and b/models/alice/alice_0c825569.vagrp_c differ diff --git a/models/alice/alice_vmorf.vtex_c b/models/alice/alice_vmorf.vtex_c new file mode 100755 index 0000000..a927610 Binary files /dev/null and b/models/alice/alice_vmorf.vtex_c differ diff --git a/models/alice/falanxi.vmdl_c b/models/alice/falanxi.vmdl_c new file mode 100755 index 0000000..0ab99d8 Binary files /dev/null and b/models/alice/falanxi.vmdl_c differ diff --git a/models/alice/falanxi.vmesh_c b/models/alice/falanxi.vmesh_c new file mode 100755 index 0000000..cd60cd1 Binary files /dev/null and b/models/alice/falanxi.vmesh_c differ diff --git a/models/alice/falanxi.vmorf_c b/models/alice/falanxi.vmorf_c new file mode 100755 index 0000000..493dbe9 Binary files /dev/null and b/models/alice/falanxi.vmorf_c differ diff --git a/models/alice/falanxi_13ff4685.vagrp_c b/models/alice/falanxi_13ff4685.vagrp_c new file mode 100755 index 0000000..6a5db84 Binary files /dev/null and b/models/alice/falanxi_13ff4685.vagrp_c differ diff --git a/models/alice/falanxi_vmorf.vtex_c b/models/alice/falanxi_vmorf.vtex_c new file mode 100755 index 0000000..acf3537 Binary files /dev/null and b/models/alice/falanxi_vmorf.vtex_c differ diff --git a/models/bilibilitv/mask/bilibili.vmat_c b/models/bilibilitv/mask/bilibili.vmat_c new file mode 100755 index 0000000..55fec86 Binary files /dev/null and b/models/bilibilitv/mask/bilibili.vmat_c differ diff --git a/models/bilibilitv/mask/bilibili_color_tga_d325be54.vtex_c b/models/bilibilitv/mask/bilibili_color_tga_d325be54.vtex_c new file mode 100755 index 0000000..de202d2 Binary files /dev/null and b/models/bilibilitv/mask/bilibili_color_tga_d325be54.vtex_c differ diff --git a/models/bilibilitv/mask/bilibili_metalnessmask_tga_5c27c737.vtex_c b/models/bilibilitv/mask/bilibili_metalnessmask_tga_5c27c737.vtex_c new file mode 100755 index 0000000..1a6b920 Binary files /dev/null and b/models/bilibilitv/mask/bilibili_metalnessmask_tga_5c27c737.vtex_c differ diff --git a/models/bilibilitv/mask/bilibili_normal_tga_f2efe42d.vtex_c b/models/bilibilitv/mask/bilibili_normal_tga_f2efe42d.vtex_c new file mode 100755 index 0000000..be2f935 Binary files /dev/null and b/models/bilibilitv/mask/bilibili_normal_tga_f2efe42d.vtex_c differ diff --git a/models/bilibilitv/mask/bilibili_specmask_tga_f14aeca6.vtex_c b/models/bilibilitv/mask/bilibili_specmask_tga_f14aeca6.vtex_c new file mode 100755 index 0000000..3f614f9 Binary files /dev/null and b/models/bilibilitv/mask/bilibili_specmask_tga_f14aeca6.vtex_c differ diff --git a/models/bilibilitv/model/3b1bae87/dead.vanim_c b/models/bilibilitv/model/3b1bae87/dead.vanim_c new file mode 100755 index 0000000..8a35edd Binary files /dev/null and b/models/bilibilitv/model/3b1bae87/dead.vanim_c differ diff --git a/models/bilibilitv/model/3b1bae87/run.vanim_c b/models/bilibilitv/model/3b1bae87/run.vanim_c new file mode 100755 index 0000000..15d5bdd Binary files /dev/null and b/models/bilibilitv/model/3b1bae87/run.vanim_c differ diff --git a/models/bilibilitv/model/3b1bae87/spaw.vanim_c b/models/bilibilitv/model/3b1bae87/spaw.vanim_c new file mode 100755 index 0000000..569a4de Binary files /dev/null and b/models/bilibilitv/model/3b1bae87/spaw.vanim_c differ diff --git a/models/bilibilitv/model/3b1bae87/standby.vanim_c b/models/bilibilitv/model/3b1bae87/standby.vanim_c new file mode 100755 index 0000000..96cac19 Binary files /dev/null and b/models/bilibilitv/model/3b1bae87/standby.vanim_c differ diff --git a/models/bilibilitv/model/c0fe6c19/birth.vanim_c b/models/bilibilitv/model/c0fe6c19/birth.vanim_c new file mode 100755 index 0000000..44f9edc Binary files /dev/null and b/models/bilibilitv/model/c0fe6c19/birth.vanim_c differ diff --git a/models/bilibilitv/model/c0fe6c19/dead.vanim_c b/models/bilibilitv/model/c0fe6c19/dead.vanim_c new file mode 100755 index 0000000..73c6a3d Binary files /dev/null and b/models/bilibilitv/model/c0fe6c19/dead.vanim_c differ diff --git a/models/bilibilitv/model/c0fe6c19/idle.vanim_c b/models/bilibilitv/model/c0fe6c19/idle.vanim_c new file mode 100755 index 0000000..12a8cf9 Binary files /dev/null and b/models/bilibilitv/model/c0fe6c19/idle.vanim_c differ diff --git a/models/bilibilitv/model/c0fe6c19/run.vanim_c b/models/bilibilitv/model/c0fe6c19/run.vanim_c new file mode 100755 index 0000000..8a4efde Binary files /dev/null and b/models/bilibilitv/model/c0fe6c19/run.vanim_c differ diff --git a/models/bilibilitv/model/c0fe6c19/steandby.vanim_c b/models/bilibilitv/model/c0fe6c19/steandby.vanim_c new file mode 100755 index 0000000..a03067f Binary files /dev/null and b/models/bilibilitv/model/c0fe6c19/steandby.vanim_c differ diff --git a/models/bilibilitv/model/tv.vmdl_c b/models/bilibilitv/model/tv.vmdl_c new file mode 100755 index 0000000..acc2818 Binary files /dev/null and b/models/bilibilitv/model/tv.vmdl_c differ diff --git a/models/bilibilitv/model/tv.vmesh_c b/models/bilibilitv/model/tv.vmesh_c new file mode 100755 index 0000000..b92df72 Binary files /dev/null and b/models/bilibilitv/model/tv.vmesh_c differ diff --git a/models/bilibilitv/model/tv_c0fe6c19.vagrp_c b/models/bilibilitv/model/tv_c0fe6c19.vagrp_c new file mode 100755 index 0000000..48307b4 Binary files /dev/null and b/models/bilibilitv/model/tv_c0fe6c19.vagrp_c differ diff --git a/models/bilibilitv/model/tv_flying.vmdl_c b/models/bilibilitv/model/tv_flying.vmdl_c new file mode 100755 index 0000000..79c4de4 Binary files /dev/null and b/models/bilibilitv/model/tv_flying.vmdl_c differ diff --git a/models/bilibilitv/model/tv_flying.vmesh_c b/models/bilibilitv/model/tv_flying.vmesh_c new file mode 100755 index 0000000..154fd9a Binary files /dev/null and b/models/bilibilitv/model/tv_flying.vmesh_c differ diff --git a/models/bilibilitv/model/tv_flying_3b1bae87.vagrp_c b/models/bilibilitv/model/tv_flying_3b1bae87.vagrp_c new file mode 100755 index 0000000..11916db Binary files /dev/null and b/models/bilibilitv/model/tv_flying_3b1bae87.vagrp_c differ diff --git a/models/cages/91a5d900/cages_act_dota_die.vanim_c b/models/cages/91a5d900/cages_act_dota_die.vanim_c new file mode 100755 index 0000000..90ea62f Binary files /dev/null and b/models/cages/91a5d900/cages_act_dota_die.vanim_c differ diff --git a/models/cages/91a5d900/cages_act_dota_idle.vanim_c b/models/cages/91a5d900/cages_act_dota_idle.vanim_c new file mode 100755 index 0000000..01e17ad Binary files /dev/null and b/models/cages/91a5d900/cages_act_dota_idle.vanim_c differ diff --git a/models/cages/91a5d900/cages_act_dota_por.vanim_c b/models/cages/91a5d900/cages_act_dota_por.vanim_c new file mode 100755 index 0000000..250f4d2 Binary files /dev/null and b/models/cages/91a5d900/cages_act_dota_por.vanim_c differ diff --git a/models/cages/91a5d900/cages_act_dota_run.vanim_c b/models/cages/91a5d900/cages_act_dota_run.vanim_c new file mode 100755 index 0000000..e48a1e2 Binary files /dev/null and b/models/cages/91a5d900/cages_act_dota_run.vanim_c differ diff --git a/models/cages/91a5d900/cages_act_dota_spawn.vanim_c b/models/cages/91a5d900/cages_act_dota_spawn.vanim_c new file mode 100755 index 0000000..55c8146 Binary files /dev/null and b/models/cages/91a5d900/cages_act_dota_spawn.vanim_c differ diff --git a/models/cages/cages.vmesh_c b/models/cages/cages.vmesh_c new file mode 100755 index 0000000..4e3ea86 Binary files /dev/null and b/models/cages/cages.vmesh_c differ diff --git a/models/cages/cages_ship.vmdl_c b/models/cages/cages_ship.vmdl_c new file mode 100755 index 0000000..3854fc9 Binary files /dev/null and b/models/cages/cages_ship.vmdl_c differ diff --git a/models/cages/cages_ship_5a8c0ff0.vagrp_c b/models/cages/cages_ship_5a8c0ff0.vagrp_c new file mode 100755 index 0000000..306c195 Binary files /dev/null and b/models/cages/cages_ship_5a8c0ff0.vagrp_c differ diff --git a/models/cages/cages_ship_91a5d900.vagrp_c b/models/cages/cages_ship_91a5d900.vagrp_c new file mode 100755 index 0000000..96bf7cc Binary files /dev/null and b/models/cages/cages_ship_91a5d900.vagrp_c differ diff --git a/models/heroes/bane/3d308b6c/atk.vanim_c b/models/heroes/bane/3d308b6c/atk.vanim_c new file mode 100755 index 0000000..80b954d Binary files /dev/null and b/models/heroes/bane/3d308b6c/atk.vanim_c differ diff --git a/models/heroes/bane/3d308b6c/atk2.vanim_c b/models/heroes/bane/3d308b6c/atk2.vanim_c new file mode 100755 index 0000000..8decf24 Binary files /dev/null and b/models/heroes/bane/3d308b6c/atk2.vanim_c differ diff --git a/models/heroes/bane/3d308b6c/capture.vanim_c b/models/heroes/bane/3d308b6c/capture.vanim_c new file mode 100755 index 0000000..c97994e Binary files /dev/null and b/models/heroes/bane/3d308b6c/capture.vanim_c differ diff --git a/models/heroes/bane/3d308b6c/dazhao.vanim_c b/models/heroes/bane/3d308b6c/dazhao.vanim_c new file mode 100755 index 0000000..32c5089 Binary files /dev/null and b/models/heroes/bane/3d308b6c/dazhao.vanim_c differ diff --git a/models/heroes/bane/3d308b6c/death.vanim_c b/models/heroes/bane/3d308b6c/death.vanim_c new file mode 100755 index 0000000..ebf8779 Binary files /dev/null and b/models/heroes/bane/3d308b6c/death.vanim_c differ diff --git a/models/heroes/bane/3d308b6c/jingzhi.vanim_c b/models/heroes/bane/3d308b6c/jingzhi.vanim_c new file mode 100755 index 0000000..4d43d79 Binary files /dev/null and b/models/heroes/bane/3d308b6c/jingzhi.vanim_c differ diff --git a/models/heroes/bane/3d308b6c/shifag.vanim_c b/models/heroes/bane/3d308b6c/shifag.vanim_c new file mode 100755 index 0000000..fa7d387 Binary files /dev/null and b/models/heroes/bane/3d308b6c/shifag.vanim_c differ diff --git a/models/heroes/bane/3d308b6c/shifag_copy.vanim_c b/models/heroes/bane/3d308b6c/shifag_copy.vanim_c new file mode 100755 index 0000000..26c59ca Binary files /dev/null and b/models/heroes/bane/3d308b6c/shifag_copy.vanim_c differ diff --git a/models/heroes/bane/3d308b6c/shinao.vanim_c b/models/heroes/bane/3d308b6c/shinao.vanim_c new file mode 100755 index 0000000..cc23670 Binary files /dev/null and b/models/heroes/bane/3d308b6c/shinao.vanim_c differ diff --git a/models/heroes/bane/3d308b6c/versus.vanim_c b/models/heroes/bane/3d308b6c/versus.vanim_c new file mode 100755 index 0000000..7d921d6 Binary files /dev/null and b/models/heroes/bane/3d308b6c/versus.vanim_c differ diff --git a/models/heroes/bane/3d308b6c/zoulu.vanim_c b/models/heroes/bane/3d308b6c/zoulu.vanim_c new file mode 100755 index 0000000..b786adc Binary files /dev/null and b/models/heroes/bane/3d308b6c/zoulu.vanim_c differ diff --git a/models/heroes/bane/bane.vmdl_c b/models/heroes/bane/bane.vmdl_c new file mode 100755 index 0000000..ca2bd52 Binary files /dev/null and b/models/heroes/bane/bane.vmdl_c differ diff --git a/models/heroes/bane/bane.vmesh_c b/models/heroes/bane/bane.vmesh_c new file mode 100755 index 0000000..b7c0ccb Binary files /dev/null and b/models/heroes/bane/bane.vmesh_c differ diff --git a/models/heroes/bane/bane_3d308b6c.vagrp_c b/models/heroes/bane/bane_3d308b6c.vagrp_c new file mode 100755 index 0000000..1ecada7 Binary files /dev/null and b/models/heroes/bane/bane_3d308b6c.vagrp_c differ diff --git a/models/heroes/bane/bane_head.vmdl_c b/models/heroes/bane/bane_head.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/bane/bane_head.vmdl_c differ diff --git a/models/heroes/bane/bane_shoulders.vmdl_c b/models/heroes/bane/bane_shoulders.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/bane/bane_shoulders.vmdl_c differ diff --git a/models/heroes/bane/grip.vmdl_c b/models/heroes/bane/grip.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/bane/grip.vmdl_c differ diff --git a/models/heroes/death_prophet/c6722722/wriggle_f_run.vanim_c b/models/heroes/death_prophet/c6722722/wriggle_f_run.vanim_c new file mode 100755 index 0000000..bdc3031 Binary files /dev/null and b/models/heroes/death_prophet/c6722722/wriggle_f_run.vanim_c differ diff --git a/models/heroes/death_prophet/dc567896/wriggle_f_run.vanim_c b/models/heroes/death_prophet/dc567896/wriggle_f_run.vanim_c new file mode 100755 index 0000000..bdc3031 Binary files /dev/null and b/models/heroes/death_prophet/dc567896/wriggle_f_run.vanim_c differ diff --git a/models/heroes/death_prophet/death_prophet_ghost.vmdl_c b/models/heroes/death_prophet/death_prophet_ghost.vmdl_c new file mode 100755 index 0000000..85f5fd6 Binary files /dev/null and b/models/heroes/death_prophet/death_prophet_ghost.vmdl_c differ diff --git a/models/heroes/death_prophet/death_prophet_ghost_c6722722.vagrp_c b/models/heroes/death_prophet/death_prophet_ghost_c6722722.vagrp_c new file mode 100755 index 0000000..d6c917b Binary files /dev/null and b/models/heroes/death_prophet/death_prophet_ghost_c6722722.vagrp_c differ diff --git a/models/heroes/death_prophet/death_prophet_ghost_dc567896.vagrp_c b/models/heroes/death_prophet/death_prophet_ghost_dc567896.vagrp_c new file mode 100755 index 0000000..37d8e4b Binary files /dev/null and b/models/heroes/death_prophet/death_prophet_ghost_dc567896.vagrp_c differ diff --git a/models/heroes/death_prophet/wriggle_f.vmesh_c b/models/heroes/death_prophet/wriggle_f.vmesh_c new file mode 100755 index 0000000..3cc4328 Binary files /dev/null and b/models/heroes/death_prophet/wriggle_f.vmesh_c differ diff --git a/models/heroes/juggernaut/849777fd/hg_death.vanim_c b/models/heroes/juggernaut/849777fd/hg_death.vanim_c new file mode 100755 index 0000000..3f094c3 Binary files /dev/null and b/models/heroes/juggernaut/849777fd/hg_death.vanim_c differ diff --git a/models/heroes/juggernaut/849777fd/hg_idle.vanim_c b/models/heroes/juggernaut/849777fd/hg_idle.vanim_c new file mode 100755 index 0000000..1c82de4 Binary files /dev/null and b/models/heroes/juggernaut/849777fd/hg_idle.vanim_c differ diff --git a/models/heroes/juggernaut/849777fd/hg_run.vanim_c b/models/heroes/juggernaut/849777fd/hg_run.vanim_c new file mode 100755 index 0000000..06dbb18 Binary files /dev/null and b/models/heroes/juggernaut/849777fd/hg_run.vanim_c differ diff --git a/models/heroes/juggernaut/849777fd/hg_spawn.vanim_c b/models/heroes/juggernaut/849777fd/hg_spawn.vanim_c new file mode 100755 index 0000000..446f6b6 Binary files /dev/null and b/models/heroes/juggernaut/849777fd/hg_spawn.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/bindpose.vanim_c b/models/heroes/juggernaut/94e2634b/bindpose.vanim_c new file mode 100755 index 0000000..bc663af Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/bindpose.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_alt.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_alt.vanim_c new file mode 100755 index 0000000..5bb7462 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_alt.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_alt_debut.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_alt_debut.vanim_c new file mode 100755 index 0000000..e507e4e Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_alt_debut.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_alt_favorite_legs.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_alt_favorite_legs.vanim_c new file mode 100755 index 0000000..73d16f2 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_alt_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_alt_frontpage.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_alt_frontpage.vanim_c new file mode 100755 index 0000000..730c019 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_alt_frontpage.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_debut.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_debut.vanim_c new file mode 100755 index 0000000..dc3901c Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_debut.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_frontpage.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_frontpage.vanim_c new file mode 100755 index 0000000..d020e4e Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_frontpage.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_debut.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_debut.vanim_c new file mode 100755 index 0000000..eefdaa9 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_debut.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_frontpage.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_frontpage.vanim_c new file mode 100755 index 0000000..b5b86c1 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_frontpage.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_odachi.vanim_c new file mode 100755 index 0000000..e5bf0e3 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_v2.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_v2.vanim_c new file mode 100755 index 0000000..e396ae9 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_v2.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_v2_favorite_legs.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_v2_favorite_legs.vanim_c new file mode 100755 index 0000000..373db0d Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_spawn_v2_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_v3.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_v3.vanim_c new file mode 100755 index 0000000..1c8f507 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_v3.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_v3_favorite_legs.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_v3_favorite_legs.vanim_c new file mode 100755 index 0000000..7730dae Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_loadout_v3_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_showoff.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_showoff.vanim_c new file mode 100755 index 0000000..1086865 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_showoff.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_spawn.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_spawn.vanim_c new file mode 100755 index 0000000..c351c87 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_spawn.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_arcana_taunt.vanim_c b/models/heroes/juggernaut/94e2634b/okita_arcana_taunt.vanim_c new file mode 100755 index 0000000..2734dbb Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_arcana_taunt.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack.vanim_c new file mode 100755 index 0000000..cee55ef Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack02_versus.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack02_versus.vanim_c new file mode 100755 index 0000000..3cabfc4 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack02_versus.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack1_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack1_anim.vanim_c new file mode 100755 index 0000000..e97d103 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack1_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack1_anim_ti8.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack1_anim_ti8.vanim_c new file mode 100755 index 0000000..f11d231 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack1_anim_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack1_fast.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack1_fast.vanim_c new file mode 100755 index 0000000..f8fbd55 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack1_fast.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack1_fast_ti8.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack1_fast_ti8.vanim_c new file mode 100755 index 0000000..735ce5e Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack1_fast_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack1_faster.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack1_faster.vanim_c new file mode 100755 index 0000000..8873c45 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack1_faster.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack1_faster_ti8.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack1_faster_ti8.vanim_c new file mode 100755 index 0000000..35ca726 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack1_faster_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack1_fastest.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack1_fastest.vanim_c new file mode 100755 index 0000000..008eb1e Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack1_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack1_fastest_ti8.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack1_fastest_ti8.vanim_c new file mode 100755 index 0000000..6349db0 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack1_fastest_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack2.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack2.vanim_c new file mode 100755 index 0000000..5b6d60a Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack2.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack2_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack2_anim.vanim_c new file mode 100755 index 0000000..3a47a28 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack2_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack2_anim_ti8.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack2_anim_ti8.vanim_c new file mode 100755 index 0000000..387372a Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack2_anim_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack2_fast.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack2_fast.vanim_c new file mode 100755 index 0000000..ec808d6 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack2_fast.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack2_fast_ti8.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack2_fast_ti8.vanim_c new file mode 100755 index 0000000..b0cab63 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack2_fast_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack2_faster.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack2_faster.vanim_c new file mode 100755 index 0000000..0a20653 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack2_faster.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack2_faster_ti8.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack2_faster_ti8.vanim_c new file mode 100755 index 0000000..4ef67b3 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack2_faster_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack2_fastest.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack2_fastest.vanim_c new file mode 100755 index 0000000..3ca4053 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack2_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack2_fastest_ti8.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack2_fastest_ti8.vanim_c new file mode 100755 index 0000000..6d42d43 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack2_fastest_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_crit.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_crit.vanim_c new file mode 100755 index 0000000..ee78690 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_crit.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_crit2.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_crit2.vanim_c new file mode 100755 index 0000000..b8c2db1 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_crit2.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_crit_anim_ti8_overtheshoulder.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_crit_anim_ti8_overtheshoulder.vanim_c new file mode 100755 index 0000000..22c8416 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_crit_anim_ti8_overtheshoulder.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_crit_armor_of_the_favorite.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_crit_armor_of_the_favorite.vanim_c new file mode 100755 index 0000000..4408ba4 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_crit_armor_of_the_favorite.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_crit_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_crit_odachi.vanim_c new file mode 100755 index 0000000..ee45355 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_crit_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi1.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi1.vanim_c new file mode 100755 index 0000000..a031a10 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi1.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi1_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi1_anim.vanim_c new file mode 100755 index 0000000..a49eefa Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi1_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi1_fast.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi1_fast.vanim_c new file mode 100755 index 0000000..e0362c6 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi1_fast.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi1_faster.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi1_faster.vanim_c new file mode 100755 index 0000000..1c8e032 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi1_faster.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi1_fastest.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi1_fastest.vanim_c new file mode 100755 index 0000000..53687bf Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi1_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi2.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi2.vanim_c new file mode 100755 index 0000000..4530cf2 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi2.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi2_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi2_anim.vanim_c new file mode 100755 index 0000000..436a3ea Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi2_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi2_fast.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi2_fast.vanim_c new file mode 100755 index 0000000..3b5155b Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi2_fast.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi2_faster.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi2_faster.vanim_c new file mode 100755 index 0000000..103037f Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi2_faster.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi2_fastest.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi2_fastest.vanim_c new file mode 100755 index 0000000..5571cbb Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi2_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi3.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi3.vanim_c new file mode 100755 index 0000000..376a229 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi3.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi3_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi3_anim.vanim_c new file mode 100755 index 0000000..03e9cb0 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi3_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi3_fast.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi3_fast.vanim_c new file mode 100755 index 0000000..cd03f45 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi3_fast.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi3_faster.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi3_faster.vanim_c new file mode 100755 index 0000000..a16502d Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi3_faster.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_odachi3_fastest.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_odachi3_fastest.vanim_c new file mode 100755 index 0000000..ca223e5 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_odachi3_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_omni_cast.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_omni_cast.vanim_c new file mode 100755 index 0000000..e3f6b37 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_omni_cast.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_spin.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_spin.vanim_c new file mode 100755 index 0000000..c25ab0e Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_spin.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_spin_cast.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_spin_cast.vanim_c new file mode 100755 index 0000000..b31661b Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_spin_cast.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_spin_cast_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_spin_cast_odachi.vanim_c new file mode 100755 index 0000000..2455a02 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_spin_cast_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_attack_spin_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_attack_spin_odachi.vanim_c new file mode 100755 index 0000000..db7c119 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_attack_spin_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_crit_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_crit_anim.vanim_c new file mode 100755 index 0000000..b60f73a Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_crit_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death.vanim_c new file mode 100755 index 0000000..5980fc6 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death2.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death2.vanim_c new file mode 100755 index 0000000..75d71bc Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death2.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death2_faes_dup.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death2_faes_dup.vanim_c new file mode 100755 index 0000000..28c771d Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death2_faes_dup.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death2_faes_dup_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death2_faes_dup_red.vanim_c new file mode 100755 index 0000000..49ea5da Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death2_faes_dup_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death2_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death2_red.vanim_c new file mode 100755 index 0000000..0740507 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death2_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death3.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death3.vanim_c new file mode 100755 index 0000000..558c77a Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death3.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death3_faes_dup.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death3_faes_dup.vanim_c new file mode 100755 index 0000000..2de1cfc Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death3_faes_dup.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death3_faes_dup_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death3_faes_dup_red.vanim_c new file mode 100755 index 0000000..c076753 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death3_faes_dup_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death3_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death3_red.vanim_c new file mode 100755 index 0000000..c7ae630 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death3_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01.vanim_c new file mode 100755 index 0000000..3fbc99f Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_1.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_1.vanim_c new file mode 100755 index 0000000..a2ff108 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_1.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_2.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_2.vanim_c new file mode 100755 index 0000000..fd352ec Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_2.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_3.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_3.vanim_c new file mode 100755 index 0000000..c3576dc Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_3.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup.vanim_c new file mode 100755 index 0000000..f387609 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_1.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_1.vanim_c new file mode 100755 index 0000000..63ce9f2 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_1.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_2.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_2.vanim_c new file mode 100755 index 0000000..6684c96 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_2.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_3.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_3.vanim_c new file mode 100755 index 0000000..cea7b56 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_3.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_red.vanim_c new file mode 100755 index 0000000..12f37df Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_red_1.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_red_1.vanim_c new file mode 100755 index 0000000..151fb55 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_red_1.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_red_2.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_red_2.vanim_c new file mode 100755 index 0000000..eb6fd38 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_red_2.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_red_3.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_red_3.vanim_c new file mode 100755 index 0000000..a0ed8a7 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_faes_dup_red_3.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_red.vanim_c new file mode 100755 index 0000000..e1f0aa5 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_red_1.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_red_1.vanim_c new file mode 100755 index 0000000..ee49c42 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_red_1.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_red_2.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_red_2.vanim_c new file mode 100755 index 0000000..4c7f741 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_red_2.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_alt01_red_3.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_alt01_red_3.vanim_c new file mode 100755 index 0000000..08c1cdf Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_alt01_red_3.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_faes_dup.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_faes_dup.vanim_c new file mode 100755 index 0000000..72c8d69 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_faes_dup.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_faes_dup_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_faes_dup_red.vanim_c new file mode 100755 index 0000000..aecd548 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_faes_dup_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_death_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_death_red.vanim_c new file mode 100755 index 0000000..dbf7fea Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_death_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_defeat_arcana.vanim_c b/models/heroes/juggernaut/94e2634b/okita_defeat_arcana.vanim_c new file mode 100755 index 0000000..af5741f Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_defeat_arcana.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_faes_death.vanim_c b/models/heroes/juggernaut/94e2634b/okita_faes_death.vanim_c new file mode 100755 index 0000000..ca1cfac Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_faes_death.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_faes_death2.vanim_c b/models/heroes/juggernaut/94e2634b/okita_faes_death2.vanim_c new file mode 100755 index 0000000..94f66da Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_faes_death2.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_faes_death2_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_faes_death2_red.vanim_c new file mode 100755 index 0000000..f4ed1e0 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_faes_death2_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_faes_death3.vanim_c b/models/heroes/juggernaut/94e2634b/okita_faes_death3.vanim_c new file mode 100755 index 0000000..fcd1df7 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_faes_death3.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_faes_death3_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_faes_death3_red.vanim_c new file mode 100755 index 0000000..093c04d Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_faes_death3_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_faes_death4.vanim_c b/models/heroes/juggernaut/94e2634b/okita_faes_death4.vanim_c new file mode 100755 index 0000000..a0976a9 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_faes_death4.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_faes_death4_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_faes_death4_red.vanim_c new file mode 100755 index 0000000..0f4f71d Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_faes_death4_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_faes_death_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_faes_death_red.vanim_c new file mode 100755 index 0000000..20e2ec7 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_faes_death_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_faes_loadout.vanim_c b/models/heroes/juggernaut/94e2634b/okita_faes_loadout.vanim_c new file mode 100755 index 0000000..46bfb48 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_faes_loadout.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_faes_loadout_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_faes_loadout_anim.vanim_c new file mode 100755 index 0000000..92afc95 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_faes_loadout_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_fail.vanim_c b/models/heroes/juggernaut/94e2634b/okita_fail.vanim_c new file mode 100755 index 0000000..8057eeb Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_fail.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_fail_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_fail_anim.vanim_c new file mode 100755 index 0000000..2bebf45 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_fail_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_forcestaff.vanim_c b/models/heroes/juggernaut/94e2634b/okita_forcestaff.vanim_c new file mode 100755 index 0000000..a9d883a Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_forcestaff.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_forcestaff_end_agg.vanim_c b/models/heroes/juggernaut/94e2634b/okita_forcestaff_end_agg.vanim_c new file mode 100755 index 0000000..39b1fb6 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_forcestaff_end_agg.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_forcestaff_end_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_forcestaff_end_odachi.vanim_c new file mode 100755 index 0000000..0cdfc84 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_forcestaff_end_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_generic_channel.vanim_c b/models/heroes/juggernaut/94e2634b/okita_generic_channel.vanim_c new file mode 100755 index 0000000..4bf2f8a Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_generic_channel.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_healing_ward.vanim_c b/models/heroes/juggernaut/94e2634b/okita_healing_ward.vanim_c new file mode 100755 index 0000000..53166ea Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_healing_ward.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_healing_ward_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_healing_ward_anim.vanim_c new file mode 100755 index 0000000..e40c521 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_healing_ward_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle.vanim_c new file mode 100755 index 0000000..3abab93 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle2.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle2.vanim_c new file mode 100755 index 0000000..57b273e Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle2.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle2_reverse_rare.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle2_reverse_rare.vanim_c new file mode 100755 index 0000000..874779b Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle2_reverse_rare.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle2_reverse_rare_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle2_reverse_rare_red.vanim_c new file mode 100755 index 0000000..1be1adb Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle2_reverse_rare_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_agg_injured.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_agg_injured.vanim_c new file mode 100755 index 0000000..78e3da3 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_agg_injured.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_agg_rare.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_agg_rare.vanim_c new file mode 100755 index 0000000..5896e02 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_agg_rare.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_agg_rare_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_agg_rare_red.vanim_c new file mode 100755 index 0000000..f985616 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_agg_rare_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_agg_spin_sword.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_agg_spin_sword.vanim_c new file mode 100755 index 0000000..992923b Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_agg_spin_sword.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_arcana_4_loop_no_fx.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_arcana_4_loop_no_fx.vanim_c new file mode 100755 index 0000000..060591b Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_arcana_4_loop_no_fx.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_odachi.vanim_c new file mode 100755 index 0000000..b5a56e5 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop.vanim_c new file mode 100755 index 0000000..086c8b4 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_agg.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_agg.vanim_c new file mode 100755 index 0000000..3bf1238 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_agg.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_agg_no_fx.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_agg_no_fx.vanim_c new file mode 100755 index 0000000..05af232 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_agg_no_fx.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_agg_no_fx_copy.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_agg_no_fx_copy.vanim_c new file mode 100755 index 0000000..fda48f6 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_agg_no_fx_copy.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_agg_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_agg_red.vanim_c new file mode 100755 index 0000000..1161b6d Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_agg_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_no_fx.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_no_fx.vanim_c new file mode 100755 index 0000000..b53e80a Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_no_fx.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_no_fx_copy.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_no_fx_copy.vanim_c new file mode 100755 index 0000000..118a3a4 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_no_fx_copy.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_red.vanim_c new file mode 100755 index 0000000..6172b46 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_5_loop_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_odachi_rare.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_rare.vanim_c new file mode 100755 index 0000000..8f58233 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_odachi_rare.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_reverse_arcana_4_loop_no_fx.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_reverse_arcana_4_loop_no_fx.vanim_c new file mode 100755 index 0000000..e1577cb Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_reverse_arcana_4_loop_no_fx.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_reverse_injured.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_reverse_injured.vanim_c new file mode 100755 index 0000000..8664f1f Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_reverse_injured.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_reverse_injured_agg.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_reverse_injured_agg.vanim_c new file mode 100755 index 0000000..4eb3503 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_reverse_injured_agg.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_reverse_injured_agg_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_reverse_injured_agg_odachi.vanim_c new file mode 100755 index 0000000..ce9a1b4 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_reverse_injured_agg_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_reverse_rare.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_reverse_rare.vanim_c new file mode 100755 index 0000000..bb76e98 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_reverse_rare.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_idle_reverse_rare_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_idle_reverse_rare_red.vanim_c new file mode 100755 index 0000000..5f84b47 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_idle_reverse_rare_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_loadout_alt_effigy.vanim_c b/models/heroes/juggernaut/94e2634b/okita_loadout_alt_effigy.vanim_c new file mode 100755 index 0000000..e544fe7 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_loadout_alt_effigy.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_loadout_arcana_spawn_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_loadout_arcana_spawn_red.vanim_c new file mode 100755 index 0000000..4b76a5b Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_loadout_arcana_spawn_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_loadout_arcana_spawn_red_favorite_legs.vanim_c b/models/heroes/juggernaut/94e2634b/okita_loadout_arcana_spawn_red_favorite_legs.vanim_c new file mode 100755 index 0000000..adfda1e Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_loadout_arcana_spawn_red_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_loadout_default.vanim_c b/models/heroes/juggernaut/94e2634b/okita_loadout_default.vanim_c new file mode 100755 index 0000000..61ab2b5 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_loadout_default.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_loadout_default_spawn.vanim_c b/models/heroes/juggernaut/94e2634b/okita_loadout_default_spawn.vanim_c new file mode 100755 index 0000000..b362c97 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_loadout_default_spawn.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_loadout_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_loadout_red.vanim_c new file mode 100755 index 0000000..b564491 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_loadout_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_loadout_red_favorite_legs.vanim_c b/models/heroes/juggernaut/94e2634b/okita_loadout_red_favorite_legs.vanim_c new file mode 100755 index 0000000..4fdc584 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_loadout_red_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_loadout_red_rare.vanim_c b/models/heroes/juggernaut/94e2634b/okita_loadout_red_rare.vanim_c new file mode 100755 index 0000000..c006802 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_loadout_red_rare.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_loadout_red_rare_favorite_legs.vanim_c b/models/heroes/juggernaut/94e2634b/okita_loadout_red_rare_favorite_legs.vanim_c new file mode 100755 index 0000000..73a3a8d Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_loadout_red_rare_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_odachi_run.vanim_c b/models/heroes/juggernaut/94e2634b/okita_odachi_run.vanim_c new file mode 100755 index 0000000..e1de17c Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_odachi_run.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_odachi_walk.vanim_c b/models/heroes/juggernaut/94e2634b/okita_odachi_walk.vanim_c new file mode 100755 index 0000000..4a02e94 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_odachi_walk.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_omni.vanim_c b/models/heroes/juggernaut/94e2634b/okita_omni.vanim_c new file mode 100755 index 0000000..3f54553 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_omni.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_omni_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_omni_anim.vanim_c new file mode 100755 index 0000000..83a94a1 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_omni_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_omni_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_omni_odachi.vanim_c new file mode 100755 index 0000000..0969995 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_omni_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_portrait.vanim_c b/models/heroes/juggernaut/94e2634b/okita_portrait.vanim_c new file mode 100755 index 0000000..da5d818 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_portrait.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_portrait_copy.vanim_c b/models/heroes/juggernaut/94e2634b/okita_portrait_copy.vanim_c new file mode 100755 index 0000000..fe73a91 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_portrait_copy.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_portrait_copy_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_portrait_copy_red.vanim_c new file mode 100755 index 0000000..5efee36 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_portrait_copy_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_portrait_head_turn.vanim_c b/models/heroes/juggernaut/94e2634b/okita_portrait_head_turn.vanim_c new file mode 100755 index 0000000..ed9df36 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_portrait_head_turn.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_portrait_head_turn_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_portrait_head_turn_red.vanim_c new file mode 100755 index 0000000..a0f0daa Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_portrait_head_turn_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_portrait_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_portrait_red.vanim_c new file mode 100755 index 0000000..5655299 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_portrait_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_reverse_run.vanim_c b/models/heroes/juggernaut/94e2634b/okita_reverse_run.vanim_c new file mode 100755 index 0000000..1a604da Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_reverse_run.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_reverse_walk.vanim_c b/models/heroes/juggernaut/94e2634b/okita_reverse_walk.vanim_c new file mode 100755 index 0000000..d663295 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_reverse_walk.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_chase.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_chase.vanim_c new file mode 100755 index 0000000..ab7bc10 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_chase.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_fast_alt.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_fast_alt.vanim_c new file mode 100755 index 0000000..f42d28f Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_fast_alt.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_fast_alt_loadout.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_fast_alt_loadout.vanim_c new file mode 100755 index 0000000..0444167 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_fast_alt_loadout.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_fast_alt_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_fast_alt_odachi.vanim_c new file mode 100755 index 0000000..c91813c Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_fast_alt_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_fast_alt_odachi_loadout.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_fast_alt_odachi_loadout.vanim_c new file mode 100755 index 0000000..95aae41 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_fast_alt_odachi_loadout.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_injured_run.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_injured_run.vanim_c new file mode 100755 index 0000000..3c54ab4 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_injured_run.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_injured_run_agg.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_agg.vanim_c new file mode 100755 index 0000000..a53e8b7 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_agg.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_injured_run_agg_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_agg_odachi.vanim_c new file mode 100755 index 0000000..5f32f95 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_agg_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_injured_run_fast.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_fast.vanim_c new file mode 100755 index 0000000..6222efa Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_fast.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_injured_run_fast_agg.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_fast_agg.vanim_c new file mode 100755 index 0000000..0c3e151 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_fast_agg.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_injured_run_fast_agg_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_fast_agg_odachi.vanim_c new file mode 100755 index 0000000..8da4a41 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_fast_agg_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_injured_run_fast_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_fast_odachi.vanim_c new file mode 100755 index 0000000..ce848e3 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_fast_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_injured_run_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_odachi.vanim_c new file mode 100755 index 0000000..994966c Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_injured_run_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_injured_walk.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_injured_walk.vanim_c new file mode 100755 index 0000000..fb97f67 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_injured_walk.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_injured_walk_agg.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_injured_walk_agg.vanim_c new file mode 100755 index 0000000..c674182 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_injured_walk_agg.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_injured_walk_agg_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_injured_walk_agg_odachi.vanim_c new file mode 100755 index 0000000..66df193 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_injured_walk_agg_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_injured_walk_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_injured_walk_odachi.vanim_c new file mode 100755 index 0000000..88ad0fe Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_injured_walk_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_odachi.vanim_c new file mode 100755 index 0000000..79b3180 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_reverse.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_reverse.vanim_c new file mode 100755 index 0000000..fd6e862 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_reverse.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_reverse_run_fast_alt.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_reverse_run_fast_alt.vanim_c new file mode 100755 index 0000000..d574bba Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_reverse_run_fast_alt.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_run.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_run.vanim_c new file mode 100755 index 0000000..cd26c5b Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_run.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_run_walk.vanim_c b/models/heroes/juggernaut/94e2634b/okita_run_walk.vanim_c new file mode 100755 index 0000000..2c8e90b Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_run_walk.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_spawn01.vanim_c b/models/heroes/juggernaut/94e2634b/okita_spawn01.vanim_c new file mode 100755 index 0000000..dccaf37 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_spawn01.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_spawn_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_spawn_odachi.vanim_c new file mode 100755 index 0000000..00d3b5c Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_spawn_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_spawn_odachi_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_spawn_odachi_anim.vanim_c new file mode 100755 index 0000000..7863d2e Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_spawn_odachi_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_spin_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_spin_anim.vanim_c new file mode 100755 index 0000000..f487592 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_spin_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_stun.vanim_c b/models/heroes/juggernaut/94e2634b/okita_stun.vanim_c new file mode 100755 index 0000000..2cd5082 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_stun.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_stun_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_stun_anim.vanim_c new file mode 100755 index 0000000..666257b Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_stun_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_taunt_face_me.vanim_c b/models/heroes/juggernaut/94e2634b/okita_taunt_face_me.vanim_c new file mode 100755 index 0000000..097b274 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_taunt_face_me.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_taunt_loser.vanim_c b/models/heroes/juggernaut/94e2634b/okita_taunt_loser.vanim_c new file mode 100755 index 0000000..34c092b Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_taunt_loser.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_taunt_loser_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_taunt_loser_anim.vanim_c new file mode 100755 index 0000000..9795a08 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_taunt_loser_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_taunt_masklord_01.vanim_c b/models/heroes/juggernaut/94e2634b/okita_taunt_masklord_01.vanim_c new file mode 100755 index 0000000..9ddc721 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_taunt_masklord_01.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_taunt_odachi_01.vanim_c b/models/heroes/juggernaut/94e2634b/okita_taunt_odachi_01.vanim_c new file mode 100755 index 0000000..8312bc1 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_taunt_odachi_01.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_taunt_sharp_blade.vanim_c b/models/heroes/juggernaut/94e2634b/okita_taunt_sharp_blade.vanim_c new file mode 100755 index 0000000..1faee3c Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_taunt_sharp_blade.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_taunt_sharp_blade_anim.vanim_c b/models/heroes/juggernaut/94e2634b/okita_taunt_sharp_blade_anim.vanim_c new file mode 100755 index 0000000..82918a2 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_taunt_sharp_blade_anim.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_teleport.vanim_c b/models/heroes/juggernaut/94e2634b/okita_teleport.vanim_c new file mode 100755 index 0000000..1c47c5d Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_teleport.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_teleport_effigy.vanim_c b/models/heroes/juggernaut/94e2634b/okita_teleport_effigy.vanim_c new file mode 100755 index 0000000..7501032 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_teleport_effigy.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_teleport_end.vanim_c b/models/heroes/juggernaut/94e2634b/okita_teleport_end.vanim_c new file mode 100755 index 0000000..19790d6 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_teleport_end.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_teleport_end_aggressive.vanim_c b/models/heroes/juggernaut/94e2634b/okita_teleport_end_aggressive.vanim_c new file mode 100755 index 0000000..01c92b9 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_teleport_end_aggressive.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_teleport_end_aggressive_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_teleport_end_aggressive_red.vanim_c new file mode 100755 index 0000000..b4b2510 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_teleport_end_aggressive_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_teleport_end_odachi.vanim_c b/models/heroes/juggernaut/94e2634b/okita_teleport_end_odachi.vanim_c new file mode 100755 index 0000000..3a159b3 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_teleport_end_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_teleport_end_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_teleport_end_red.vanim_c new file mode 100755 index 0000000..486e43c Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_teleport_end_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_teleport_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_teleport_red.vanim_c new file mode 100755 index 0000000..bf65525 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_teleport_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_ti9_arcana_loadout_alt_favorite_legs.vanim_c b/models/heroes/juggernaut/94e2634b/okita_ti9_arcana_loadout_alt_favorite_legs.vanim_c new file mode 100755 index 0000000..380af06 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_ti9_arcana_loadout_alt_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_ti9_arcana_loadout_spawn_v2.vanim_c b/models/heroes/juggernaut/94e2634b/okita_ti9_arcana_loadout_spawn_v2.vanim_c new file mode 100755 index 0000000..02c05c2 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_ti9_arcana_loadout_spawn_v2.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_ti9_arcana_loadout_spawn_v2_favorite_legs.vanim_c b/models/heroes/juggernaut/94e2634b/okita_ti9_arcana_loadout_spawn_v2_favorite_legs.vanim_c new file mode 100755 index 0000000..4791e25 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_ti9_arcana_loadout_spawn_v2_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_ti9_arcana_loadout_v3_favorite_legs.vanim_c b/models/heroes/juggernaut/94e2634b/okita_ti9_arcana_loadout_v3_favorite_legs.vanim_c new file mode 100755 index 0000000..f617ff4 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_ti9_arcana_loadout_v3_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_alt.vanim_c b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_alt.vanim_c new file mode 100755 index 0000000..fbec8dd Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_alt.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_arcana_spawn_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_arcana_spawn_red.vanim_c new file mode 100755 index 0000000..0287e9f Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_arcana_spawn_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_arcana_spawn_red_favorite_legs.vanim_c b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_arcana_spawn_red_favorite_legs.vanim_c new file mode 100755 index 0000000..6e15ade Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_arcana_spawn_red_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_red.vanim_c b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_red.vanim_c new file mode 100755 index 0000000..53122b7 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_red.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_red_favorite_legs.vanim_c b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_red_favorite_legs.vanim_c new file mode 100755 index 0000000..2c82ea4 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_red_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_red_rare.vanim_c b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_red_rare.vanim_c new file mode 100755 index 0000000..531eda0 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_red_rare.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_red_rare_favorite_legs.vanim_c b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_red_rare_favorite_legs.vanim_c new file mode 100755 index 0000000..1ea8615 Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_red_rare_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_v3.vanim_c b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_v3.vanim_c new file mode 100755 index 0000000..414cd6a Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_ti9_loadout_v3.vanim_c differ diff --git a/models/heroes/juggernaut/94e2634b/okita_victory.vanim_c b/models/heroes/juggernaut/94e2634b/okita_victory.vanim_c new file mode 100755 index 0000000..fe9640e Binary files /dev/null and b/models/heroes/juggernaut/94e2634b/okita_victory.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/bindpose.vanim_c b/models/heroes/juggernaut/9cb2f493/bindpose.vanim_c new file mode 100755 index 0000000..bc663af Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/bindpose.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_alt.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_alt.vanim_c new file mode 100755 index 0000000..5bb7462 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_alt.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_alt_debut.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_alt_debut.vanim_c new file mode 100755 index 0000000..e507e4e Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_alt_debut.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_alt_favorite_legs.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_alt_favorite_legs.vanim_c new file mode 100755 index 0000000..73d16f2 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_alt_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_alt_frontpage.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_alt_frontpage.vanim_c new file mode 100755 index 0000000..730c019 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_alt_frontpage.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_debut.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_debut.vanim_c new file mode 100755 index 0000000..dc3901c Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_debut.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_frontpage.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_frontpage.vanim_c new file mode 100755 index 0000000..d020e4e Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_frontpage.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_debut.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_debut.vanim_c new file mode 100755 index 0000000..eefdaa9 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_debut.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_frontpage.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_frontpage.vanim_c new file mode 100755 index 0000000..b5b86c1 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_frontpage.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_odachi.vanim_c new file mode 100755 index 0000000..e5bf0e3 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_v2.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_v2.vanim_c new file mode 100755 index 0000000..e396ae9 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_v2.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_v2_favorite_legs.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_v2_favorite_legs.vanim_c new file mode 100755 index 0000000..373db0d Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_spawn_v2_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_v3.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_v3.vanim_c new file mode 100755 index 0000000..1c8f507 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_v3.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_v3_favorite_legs.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_v3_favorite_legs.vanim_c new file mode 100755 index 0000000..7730dae Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_loadout_v3_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_showoff.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_showoff.vanim_c new file mode 100755 index 0000000..1086865 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_showoff.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_spawn.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_spawn.vanim_c new file mode 100755 index 0000000..c351c87 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_spawn.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_arcana_taunt.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_arcana_taunt.vanim_c new file mode 100755 index 0000000..2734dbb Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_arcana_taunt.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack.vanim_c new file mode 100755 index 0000000..cee55ef Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack02_versus.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack02_versus.vanim_c new file mode 100755 index 0000000..3cabfc4 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack02_versus.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack1_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack1_anim.vanim_c new file mode 100755 index 0000000..e97d103 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack1_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack1_anim_ti8.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack1_anim_ti8.vanim_c new file mode 100755 index 0000000..f11d231 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack1_anim_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack1_fast.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack1_fast.vanim_c new file mode 100755 index 0000000..f8fbd55 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack1_fast.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack1_fast_ti8.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack1_fast_ti8.vanim_c new file mode 100755 index 0000000..735ce5e Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack1_fast_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack1_faster.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack1_faster.vanim_c new file mode 100755 index 0000000..8873c45 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack1_faster.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack1_faster_ti8.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack1_faster_ti8.vanim_c new file mode 100755 index 0000000..35ca726 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack1_faster_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack1_fastest.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack1_fastest.vanim_c new file mode 100755 index 0000000..008eb1e Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack1_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack1_fastest_ti8.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack1_fastest_ti8.vanim_c new file mode 100755 index 0000000..6349db0 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack1_fastest_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack2.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack2.vanim_c new file mode 100755 index 0000000..5b6d60a Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack2.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack2_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack2_anim.vanim_c new file mode 100755 index 0000000..3a47a28 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack2_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack2_anim_ti8.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack2_anim_ti8.vanim_c new file mode 100755 index 0000000..387372a Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack2_anim_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack2_fast.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack2_fast.vanim_c new file mode 100755 index 0000000..ec808d6 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack2_fast.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack2_fast_ti8.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack2_fast_ti8.vanim_c new file mode 100755 index 0000000..b0cab63 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack2_fast_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack2_faster.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack2_faster.vanim_c new file mode 100755 index 0000000..0a20653 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack2_faster.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack2_faster_ti8.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack2_faster_ti8.vanim_c new file mode 100755 index 0000000..4ef67b3 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack2_faster_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack2_fastest.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack2_fastest.vanim_c new file mode 100755 index 0000000..3ca4053 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack2_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack2_fastest_ti8.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack2_fastest_ti8.vanim_c new file mode 100755 index 0000000..6d42d43 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack2_fastest_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_crit.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_crit.vanim_c new file mode 100755 index 0000000..ee78690 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_crit.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_crit2.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_crit2.vanim_c new file mode 100755 index 0000000..b8c2db1 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_crit2.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_crit_anim_ti8_overtheshoulder.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_crit_anim_ti8_overtheshoulder.vanim_c new file mode 100755 index 0000000..22c8416 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_crit_anim_ti8_overtheshoulder.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_crit_armor_of_the_favorite.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_crit_armor_of_the_favorite.vanim_c new file mode 100755 index 0000000..4408ba4 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_crit_armor_of_the_favorite.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_crit_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_crit_odachi.vanim_c new file mode 100755 index 0000000..ee45355 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_crit_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1.vanim_c new file mode 100755 index 0000000..a031a10 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1_anim.vanim_c new file mode 100755 index 0000000..a49eefa Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1_fast.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1_fast.vanim_c new file mode 100755 index 0000000..e0362c6 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1_fast.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1_faster.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1_faster.vanim_c new file mode 100755 index 0000000..1c8e032 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1_faster.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1_fastest.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1_fastest.vanim_c new file mode 100755 index 0000000..53687bf Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi1_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2.vanim_c new file mode 100755 index 0000000..4530cf2 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2_anim.vanim_c new file mode 100755 index 0000000..436a3ea Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2_fast.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2_fast.vanim_c new file mode 100755 index 0000000..3b5155b Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2_fast.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2_faster.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2_faster.vanim_c new file mode 100755 index 0000000..103037f Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2_faster.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2_fastest.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2_fastest.vanim_c new file mode 100755 index 0000000..5571cbb Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi2_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3.vanim_c new file mode 100755 index 0000000..376a229 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3_anim.vanim_c new file mode 100755 index 0000000..03e9cb0 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3_fast.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3_fast.vanim_c new file mode 100755 index 0000000..cd03f45 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3_fast.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3_faster.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3_faster.vanim_c new file mode 100755 index 0000000..a16502d Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3_faster.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3_fastest.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3_fastest.vanim_c new file mode 100755 index 0000000..ca223e5 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_odachi3_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_omni_cast.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_omni_cast.vanim_c new file mode 100755 index 0000000..e3f6b37 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_omni_cast.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_spin.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_spin.vanim_c new file mode 100755 index 0000000..c25ab0e Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_spin.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_spin_cast.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_spin_cast.vanim_c new file mode 100755 index 0000000..b31661b Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_spin_cast.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_spin_cast_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_spin_cast_odachi.vanim_c new file mode 100755 index 0000000..2455a02 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_spin_cast_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_attack_spin_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_attack_spin_odachi.vanim_c new file mode 100755 index 0000000..db7c119 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_attack_spin_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_crit_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_crit_anim.vanim_c new file mode 100755 index 0000000..b60f73a Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_crit_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death.vanim_c new file mode 100755 index 0000000..5980fc6 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death2.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death2.vanim_c new file mode 100755 index 0000000..75d71bc Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death2.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death2_faes_dup.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death2_faes_dup.vanim_c new file mode 100755 index 0000000..28c771d Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death2_faes_dup.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death2_faes_dup_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death2_faes_dup_red.vanim_c new file mode 100755 index 0000000..49ea5da Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death2_faes_dup_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death2_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death2_red.vanim_c new file mode 100755 index 0000000..0740507 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death2_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death3.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death3.vanim_c new file mode 100755 index 0000000..558c77a Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death3.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death3_faes_dup.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death3_faes_dup.vanim_c new file mode 100755 index 0000000..2de1cfc Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death3_faes_dup.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death3_faes_dup_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death3_faes_dup_red.vanim_c new file mode 100755 index 0000000..c076753 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death3_faes_dup_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death3_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death3_red.vanim_c new file mode 100755 index 0000000..c7ae630 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death3_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01.vanim_c new file mode 100755 index 0000000..3fbc99f Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_1.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_1.vanim_c new file mode 100755 index 0000000..a2ff108 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_1.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_2.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_2.vanim_c new file mode 100755 index 0000000..fd352ec Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_2.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_3.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_3.vanim_c new file mode 100755 index 0000000..c3576dc Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_3.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup.vanim_c new file mode 100755 index 0000000..f387609 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_1.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_1.vanim_c new file mode 100755 index 0000000..63ce9f2 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_1.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_2.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_2.vanim_c new file mode 100755 index 0000000..6684c96 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_2.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_3.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_3.vanim_c new file mode 100755 index 0000000..cea7b56 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_3.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_red.vanim_c new file mode 100755 index 0000000..12f37df Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_red_1.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_red_1.vanim_c new file mode 100755 index 0000000..151fb55 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_red_1.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_red_2.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_red_2.vanim_c new file mode 100755 index 0000000..eb6fd38 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_red_2.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_red_3.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_red_3.vanim_c new file mode 100755 index 0000000..a0ed8a7 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_faes_dup_red_3.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_red.vanim_c new file mode 100755 index 0000000..e1f0aa5 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_red_1.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_red_1.vanim_c new file mode 100755 index 0000000..ee49c42 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_red_1.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_red_2.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_red_2.vanim_c new file mode 100755 index 0000000..4c7f741 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_red_2.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_alt01_red_3.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_red_3.vanim_c new file mode 100755 index 0000000..08c1cdf Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_alt01_red_3.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_faes_dup.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_faes_dup.vanim_c new file mode 100755 index 0000000..72c8d69 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_faes_dup.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_faes_dup_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_faes_dup_red.vanim_c new file mode 100755 index 0000000..aecd548 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_faes_dup_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_death_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_death_red.vanim_c new file mode 100755 index 0000000..dbf7fea Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_death_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_defeat_arcana.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_defeat_arcana.vanim_c new file mode 100755 index 0000000..af5741f Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_defeat_arcana.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_faes_death.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_faes_death.vanim_c new file mode 100755 index 0000000..ca1cfac Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_faes_death.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_faes_death2.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_faes_death2.vanim_c new file mode 100755 index 0000000..94f66da Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_faes_death2.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_faes_death2_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_faes_death2_red.vanim_c new file mode 100755 index 0000000..f4ed1e0 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_faes_death2_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_faes_death3.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_faes_death3.vanim_c new file mode 100755 index 0000000..fcd1df7 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_faes_death3.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_faes_death3_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_faes_death3_red.vanim_c new file mode 100755 index 0000000..093c04d Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_faes_death3_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_faes_death4.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_faes_death4.vanim_c new file mode 100755 index 0000000..a0976a9 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_faes_death4.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_faes_death4_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_faes_death4_red.vanim_c new file mode 100755 index 0000000..0f4f71d Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_faes_death4_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_faes_death_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_faes_death_red.vanim_c new file mode 100755 index 0000000..20e2ec7 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_faes_death_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_faes_loadout.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_faes_loadout.vanim_c new file mode 100755 index 0000000..46bfb48 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_faes_loadout.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_faes_loadout_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_faes_loadout_anim.vanim_c new file mode 100755 index 0000000..92afc95 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_faes_loadout_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_fail.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_fail.vanim_c new file mode 100755 index 0000000..8057eeb Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_fail.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_fail_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_fail_anim.vanim_c new file mode 100755 index 0000000..2bebf45 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_fail_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_forcestaff.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_forcestaff.vanim_c new file mode 100755 index 0000000..a9d883a Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_forcestaff.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_forcestaff_end_agg.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_forcestaff_end_agg.vanim_c new file mode 100755 index 0000000..39b1fb6 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_forcestaff_end_agg.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_forcestaff_end_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_forcestaff_end_odachi.vanim_c new file mode 100755 index 0000000..0cdfc84 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_forcestaff_end_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_generic_channel.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_generic_channel.vanim_c new file mode 100755 index 0000000..4bf2f8a Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_generic_channel.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_healing_ward.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_healing_ward.vanim_c new file mode 100755 index 0000000..53166ea Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_healing_ward.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_healing_ward_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_healing_ward_anim.vanim_c new file mode 100755 index 0000000..e40c521 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_healing_ward_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle.vanim_c new file mode 100755 index 0000000..3abab93 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle2.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle2.vanim_c new file mode 100755 index 0000000..57b273e Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle2.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle2_reverse_rare.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle2_reverse_rare.vanim_c new file mode 100755 index 0000000..874779b Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle2_reverse_rare.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle2_reverse_rare_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle2_reverse_rare_red.vanim_c new file mode 100755 index 0000000..1be1adb Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle2_reverse_rare_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_agg_injured.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_agg_injured.vanim_c new file mode 100755 index 0000000..78e3da3 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_agg_injured.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_agg_rare.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_agg_rare.vanim_c new file mode 100755 index 0000000..5896e02 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_agg_rare.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_agg_rare_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_agg_rare_red.vanim_c new file mode 100755 index 0000000..f985616 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_agg_rare_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_agg_spin_sword.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_agg_spin_sword.vanim_c new file mode 100755 index 0000000..992923b Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_agg_spin_sword.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_arcana_4_loop_no_fx.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_arcana_4_loop_no_fx.vanim_c new file mode 100755 index 0000000..060591b Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_arcana_4_loop_no_fx.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi.vanim_c new file mode 100755 index 0000000..b5a56e5 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop.vanim_c new file mode 100755 index 0000000..086c8b4 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_agg.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_agg.vanim_c new file mode 100755 index 0000000..3bf1238 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_agg.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_agg_no_fx.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_agg_no_fx.vanim_c new file mode 100755 index 0000000..05af232 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_agg_no_fx.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_agg_no_fx_copy.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_agg_no_fx_copy.vanim_c new file mode 100755 index 0000000..fda48f6 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_agg_no_fx_copy.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_agg_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_agg_red.vanim_c new file mode 100755 index 0000000..1161b6d Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_agg_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_no_fx.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_no_fx.vanim_c new file mode 100755 index 0000000..b53e80a Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_no_fx.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_no_fx_copy.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_no_fx_copy.vanim_c new file mode 100755 index 0000000..118a3a4 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_no_fx_copy.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_red.vanim_c new file mode 100755 index 0000000..6172b46 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_5_loop_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_rare.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_rare.vanim_c new file mode 100755 index 0000000..8f58233 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_odachi_rare.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_arcana_4_loop_no_fx.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_arcana_4_loop_no_fx.vanim_c new file mode 100755 index 0000000..e1577cb Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_arcana_4_loop_no_fx.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_injured.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_injured.vanim_c new file mode 100755 index 0000000..8664f1f Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_injured.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_injured_agg.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_injured_agg.vanim_c new file mode 100755 index 0000000..4eb3503 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_injured_agg.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_injured_agg_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_injured_agg_odachi.vanim_c new file mode 100755 index 0000000..ce9a1b4 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_injured_agg_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_rare.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_rare.vanim_c new file mode 100755 index 0000000..bb76e98 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_rare.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_rare_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_rare_red.vanim_c new file mode 100755 index 0000000..5f84b47 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_idle_reverse_rare_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_loadout_alt_effigy.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_loadout_alt_effigy.vanim_c new file mode 100755 index 0000000..e544fe7 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_loadout_alt_effigy.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_loadout_arcana_spawn_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_loadout_arcana_spawn_red.vanim_c new file mode 100755 index 0000000..4b76a5b Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_loadout_arcana_spawn_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_loadout_arcana_spawn_red_favorite_legs.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_loadout_arcana_spawn_red_favorite_legs.vanim_c new file mode 100755 index 0000000..adfda1e Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_loadout_arcana_spawn_red_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_loadout_default.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_loadout_default.vanim_c new file mode 100755 index 0000000..61ab2b5 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_loadout_default.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_loadout_default_spawn.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_loadout_default_spawn.vanim_c new file mode 100755 index 0000000..b362c97 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_loadout_default_spawn.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_loadout_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_loadout_red.vanim_c new file mode 100755 index 0000000..b564491 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_loadout_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_loadout_red_favorite_legs.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_loadout_red_favorite_legs.vanim_c new file mode 100755 index 0000000..4fdc584 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_loadout_red_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_loadout_red_rare.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_loadout_red_rare.vanim_c new file mode 100755 index 0000000..c006802 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_loadout_red_rare.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_loadout_red_rare_favorite_legs.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_loadout_red_rare_favorite_legs.vanim_c new file mode 100755 index 0000000..73a3a8d Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_loadout_red_rare_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_odachi_run.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_odachi_run.vanim_c new file mode 100755 index 0000000..e1de17c Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_odachi_run.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_odachi_walk.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_odachi_walk.vanim_c new file mode 100755 index 0000000..4a02e94 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_odachi_walk.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_omni.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_omni.vanim_c new file mode 100755 index 0000000..3f54553 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_omni.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_omni_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_omni_anim.vanim_c new file mode 100755 index 0000000..83a94a1 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_omni_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_omni_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_omni_odachi.vanim_c new file mode 100755 index 0000000..0969995 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_omni_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_portrait.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_portrait.vanim_c new file mode 100755 index 0000000..da5d818 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_portrait.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_portrait_copy.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_portrait_copy.vanim_c new file mode 100755 index 0000000..fe73a91 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_portrait_copy.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_portrait_copy_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_portrait_copy_red.vanim_c new file mode 100755 index 0000000..5efee36 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_portrait_copy_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_portrait_head_turn.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_portrait_head_turn.vanim_c new file mode 100755 index 0000000..ed9df36 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_portrait_head_turn.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_portrait_head_turn_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_portrait_head_turn_red.vanim_c new file mode 100755 index 0000000..a0f0daa Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_portrait_head_turn_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_portrait_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_portrait_red.vanim_c new file mode 100755 index 0000000..5655299 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_portrait_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_reverse_run.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_reverse_run.vanim_c new file mode 100755 index 0000000..1a604da Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_reverse_run.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_reverse_walk.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_reverse_walk.vanim_c new file mode 100755 index 0000000..d663295 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_reverse_walk.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_chase.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_chase.vanim_c new file mode 100755 index 0000000..ab7bc10 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_chase.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_fast_alt.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_fast_alt.vanim_c new file mode 100755 index 0000000..f42d28f Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_fast_alt.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_fast_alt_loadout.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_fast_alt_loadout.vanim_c new file mode 100755 index 0000000..0444167 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_fast_alt_loadout.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_fast_alt_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_fast_alt_odachi.vanim_c new file mode 100755 index 0000000..c91813c Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_fast_alt_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_fast_alt_odachi_loadout.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_fast_alt_odachi_loadout.vanim_c new file mode 100755 index 0000000..95aae41 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_fast_alt_odachi_loadout.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_injured_run.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run.vanim_c new file mode 100755 index 0000000..3c54ab4 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_agg.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_agg.vanim_c new file mode 100755 index 0000000..a53e8b7 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_agg.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_agg_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_agg_odachi.vanim_c new file mode 100755 index 0000000..5f32f95 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_agg_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_fast.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_fast.vanim_c new file mode 100755 index 0000000..6222efa Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_fast.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_fast_agg.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_fast_agg.vanim_c new file mode 100755 index 0000000..0c3e151 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_fast_agg.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_fast_agg_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_fast_agg_odachi.vanim_c new file mode 100755 index 0000000..8da4a41 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_fast_agg_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_fast_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_fast_odachi.vanim_c new file mode 100755 index 0000000..ce848e3 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_fast_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_odachi.vanim_c new file mode 100755 index 0000000..994966c Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_injured_run_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_injured_walk.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_injured_walk.vanim_c new file mode 100755 index 0000000..fb97f67 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_injured_walk.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_injured_walk_agg.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_injured_walk_agg.vanim_c new file mode 100755 index 0000000..c674182 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_injured_walk_agg.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_injured_walk_agg_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_injured_walk_agg_odachi.vanim_c new file mode 100755 index 0000000..66df193 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_injured_walk_agg_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_injured_walk_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_injured_walk_odachi.vanim_c new file mode 100755 index 0000000..88ad0fe Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_injured_walk_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_odachi.vanim_c new file mode 100755 index 0000000..79b3180 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_reverse.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_reverse.vanim_c new file mode 100755 index 0000000..fd6e862 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_reverse.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_reverse_run_fast_alt.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_reverse_run_fast_alt.vanim_c new file mode 100755 index 0000000..d574bba Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_reverse_run_fast_alt.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_run.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_run.vanim_c new file mode 100755 index 0000000..cd26c5b Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_run.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_run_walk.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_run_walk.vanim_c new file mode 100755 index 0000000..2c8e90b Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_run_walk.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_spawn01.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_spawn01.vanim_c new file mode 100755 index 0000000..dccaf37 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_spawn01.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_spawn_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_spawn_odachi.vanim_c new file mode 100755 index 0000000..00d3b5c Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_spawn_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_spawn_odachi_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_spawn_odachi_anim.vanim_c new file mode 100755 index 0000000..7863d2e Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_spawn_odachi_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_spin_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_spin_anim.vanim_c new file mode 100755 index 0000000..f487592 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_spin_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_stun.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_stun.vanim_c new file mode 100755 index 0000000..2cd5082 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_stun.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_stun_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_stun_anim.vanim_c new file mode 100755 index 0000000..666257b Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_stun_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_taunt_face_me.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_taunt_face_me.vanim_c new file mode 100755 index 0000000..097b274 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_taunt_face_me.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_taunt_loser.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_taunt_loser.vanim_c new file mode 100755 index 0000000..34c092b Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_taunt_loser.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_taunt_loser_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_taunt_loser_anim.vanim_c new file mode 100755 index 0000000..9795a08 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_taunt_loser_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_taunt_masklord_01.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_taunt_masklord_01.vanim_c new file mode 100755 index 0000000..9ddc721 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_taunt_masklord_01.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_taunt_odachi_01.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_taunt_odachi_01.vanim_c new file mode 100755 index 0000000..8312bc1 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_taunt_odachi_01.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_taunt_sharp_blade.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_taunt_sharp_blade.vanim_c new file mode 100755 index 0000000..1faee3c Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_taunt_sharp_blade.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_taunt_sharp_blade_anim.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_taunt_sharp_blade_anim.vanim_c new file mode 100755 index 0000000..82918a2 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_taunt_sharp_blade_anim.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_teleport.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_teleport.vanim_c new file mode 100755 index 0000000..1c47c5d Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_teleport.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_teleport_effigy.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_teleport_effigy.vanim_c new file mode 100755 index 0000000..7501032 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_teleport_effigy.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_teleport_end.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_teleport_end.vanim_c new file mode 100755 index 0000000..19790d6 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_teleport_end.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_teleport_end_aggressive.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_teleport_end_aggressive.vanim_c new file mode 100755 index 0000000..01c92b9 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_teleport_end_aggressive.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_teleport_end_aggressive_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_teleport_end_aggressive_red.vanim_c new file mode 100755 index 0000000..b4b2510 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_teleport_end_aggressive_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_teleport_end_odachi.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_teleport_end_odachi.vanim_c new file mode 100755 index 0000000..3a159b3 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_teleport_end_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_teleport_end_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_teleport_end_red.vanim_c new file mode 100755 index 0000000..486e43c Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_teleport_end_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_teleport_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_teleport_red.vanim_c new file mode 100755 index 0000000..bf65525 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_teleport_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_ti9_arcana_loadout_alt_favorite_legs.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_ti9_arcana_loadout_alt_favorite_legs.vanim_c new file mode 100755 index 0000000..380af06 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_ti9_arcana_loadout_alt_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_ti9_arcana_loadout_spawn_v2.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_ti9_arcana_loadout_spawn_v2.vanim_c new file mode 100755 index 0000000..02c05c2 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_ti9_arcana_loadout_spawn_v2.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_ti9_arcana_loadout_spawn_v2_favorite_legs.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_ti9_arcana_loadout_spawn_v2_favorite_legs.vanim_c new file mode 100755 index 0000000..4791e25 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_ti9_arcana_loadout_spawn_v2_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_ti9_arcana_loadout_v3_favorite_legs.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_ti9_arcana_loadout_v3_favorite_legs.vanim_c new file mode 100755 index 0000000..f617ff4 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_ti9_arcana_loadout_v3_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_alt.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_alt.vanim_c new file mode 100755 index 0000000..fbec8dd Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_alt.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_arcana_spawn_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_arcana_spawn_red.vanim_c new file mode 100755 index 0000000..0287e9f Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_arcana_spawn_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_arcana_spawn_red_favorite_legs.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_arcana_spawn_red_favorite_legs.vanim_c new file mode 100755 index 0000000..6e15ade Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_arcana_spawn_red_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_red.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_red.vanim_c new file mode 100755 index 0000000..53122b7 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_red.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_red_favorite_legs.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_red_favorite_legs.vanim_c new file mode 100755 index 0000000..2c82ea4 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_red_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_red_rare.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_red_rare.vanim_c new file mode 100755 index 0000000..531eda0 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_red_rare.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_red_rare_favorite_legs.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_red_rare_favorite_legs.vanim_c new file mode 100755 index 0000000..1ea8615 Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_red_rare_favorite_legs.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_v3.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_v3.vanim_c new file mode 100755 index 0000000..414cd6a Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_ti9_loadout_v3.vanim_c differ diff --git a/models/heroes/juggernaut/9cb2f493/okita_victory.vanim_c b/models/heroes/juggernaut/9cb2f493/okita_victory.vanim_c new file mode 100755 index 0000000..fe9640e Binary files /dev/null and b/models/heroes/juggernaut/9cb2f493/okita_victory.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/bindpose.vanim_c b/models/heroes/juggernaut/cce213bc/bindpose.vanim_c new file mode 100755 index 0000000..bc663af Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/bindpose.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_arcana_teleport_end_codachi.vanim_c b/models/heroes/juggernaut/cce213bc/okita_arcana_teleport_end_codachi.vanim_c new file mode 100755 index 0000000..888cde2 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_arcana_teleport_end_codachi.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack02_versus.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack02_versus.vanim_c new file mode 100755 index 0000000..3cabfc4 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack02_versus.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack1.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack1.vanim_c new file mode 100755 index 0000000..2d837f3 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack1.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack1_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack1_anim.vanim_c new file mode 100755 index 0000000..e97d103 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack1_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack1_anim_ti8.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack1_anim_ti8.vanim_c new file mode 100755 index 0000000..f11d231 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack1_anim_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack1_fast.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack1_fast.vanim_c new file mode 100755 index 0000000..f8fbd55 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack1_fast.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack1_fast_ti8.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack1_fast_ti8.vanim_c new file mode 100755 index 0000000..735ce5e Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack1_fast_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack1_faster.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack1_faster.vanim_c new file mode 100755 index 0000000..8873c45 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack1_faster.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack1_faster_ti8.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack1_faster_ti8.vanim_c new file mode 100755 index 0000000..35ca726 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack1_faster_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack1_fastest.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack1_fastest.vanim_c new file mode 100755 index 0000000..008eb1e Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack1_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack1_fastest_ti8.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack1_fastest_ti8.vanim_c new file mode 100755 index 0000000..6349db0 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack1_fastest_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack2.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack2.vanim_c new file mode 100755 index 0000000..b11e728 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack2.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack2_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack2_anim.vanim_c new file mode 100755 index 0000000..3a47a28 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack2_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack2_anim_ti8.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack2_anim_ti8.vanim_c new file mode 100755 index 0000000..387372a Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack2_anim_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack2_fast.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack2_fast.vanim_c new file mode 100755 index 0000000..ec808d6 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack2_fast.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack2_fast_ti8.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack2_fast_ti8.vanim_c new file mode 100755 index 0000000..b0cab63 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack2_fast_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack2_faster.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack2_faster.vanim_c new file mode 100755 index 0000000..0a20653 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack2_faster.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack2_faster_ti8.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack2_faster_ti8.vanim_c new file mode 100755 index 0000000..4ef67b3 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack2_faster_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack2_fastest.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack2_fastest.vanim_c new file mode 100755 index 0000000..3ca4053 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack2_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack2_fastest_ti8.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack2_fastest_ti8.vanim_c new file mode 100755 index 0000000..6d42d43 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack2_fastest_ti8.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_crit.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_crit.vanim_c new file mode 100755 index 0000000..966f055 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_crit.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_crit_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_crit_anim.vanim_c new file mode 100755 index 0000000..099bf13 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_crit_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_crit_armor_of_the_favorite.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_crit_armor_of_the_favorite.vanim_c new file mode 100755 index 0000000..4408ba4 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_crit_armor_of_the_favorite.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_crit_armor_of_the_favorite_effigy.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_crit_armor_of_the_favorite_effigy.vanim_c new file mode 100755 index 0000000..24e297c Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_crit_armor_of_the_favorite_effigy.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_crit_odachi.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_crit_odachi.vanim_c new file mode 100755 index 0000000..ee45355 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_crit_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_crit_ti8_overtheshoulder.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_crit_ti8_overtheshoulder.vanim_c new file mode 100755 index 0000000..e2e4303 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_crit_ti8_overtheshoulder.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi1.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi1.vanim_c new file mode 100755 index 0000000..df708a0 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi1.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi1_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi1_anim.vanim_c new file mode 100755 index 0000000..a49eefa Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi1_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi1_fast.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi1_fast.vanim_c new file mode 100755 index 0000000..e0362c6 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi1_fast.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi1_faster.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi1_faster.vanim_c new file mode 100755 index 0000000..1c8e032 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi1_faster.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi1_fastest.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi1_fastest.vanim_c new file mode 100755 index 0000000..53687bf Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi1_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi2.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi2.vanim_c new file mode 100755 index 0000000..7ade9fe Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi2.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi2_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi2_anim.vanim_c new file mode 100755 index 0000000..436a3ea Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi2_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi2_fast.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi2_fast.vanim_c new file mode 100755 index 0000000..dc0edf6 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi2_fast.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi2_faster.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi2_faster.vanim_c new file mode 100755 index 0000000..1d76341 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi2_faster.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi2_fastest.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi2_fastest.vanim_c new file mode 100755 index 0000000..02676b9 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi2_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi3.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi3.vanim_c new file mode 100755 index 0000000..462447e Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi3.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi3_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi3_anim.vanim_c new file mode 100755 index 0000000..03e9cb0 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi3_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi3_fast.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi3_fast.vanim_c new file mode 100755 index 0000000..cd03f45 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi3_fast.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi3_faster.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi3_faster.vanim_c new file mode 100755 index 0000000..a16502d Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi3_faster.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_odachi3_fastest.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_odachi3_fastest.vanim_c new file mode 100755 index 0000000..ca223e5 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_odachi3_fastest.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_omni_cast.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_omni_cast.vanim_c new file mode 100755 index 0000000..e3f6b37 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_omni_cast.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_showoff.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_showoff.vanim_c new file mode 100755 index 0000000..cff37f5 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_showoff.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_spin.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_spin.vanim_c new file mode 100755 index 0000000..c25ab0e Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_spin.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_spin_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_spin_anim.vanim_c new file mode 100755 index 0000000..ed65097 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_spin_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_spin_cast.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_spin_cast.vanim_c new file mode 100755 index 0000000..b31661b Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_spin_cast.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_attack_spin_odachi.vanim_c b/models/heroes/juggernaut/cce213bc/okita_attack_spin_odachi.vanim_c new file mode 100755 index 0000000..4fb7349 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_attack_spin_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_death.vanim_c b/models/heroes/juggernaut/cce213bc/okita_death.vanim_c new file mode 100755 index 0000000..d604760 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_death.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_death2.vanim_c b/models/heroes/juggernaut/cce213bc/okita_death2.vanim_c new file mode 100755 index 0000000..ffc6f6b Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_death2.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_death3.vanim_c b/models/heroes/juggernaut/cce213bc/okita_death3.vanim_c new file mode 100755 index 0000000..ee49ae2 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_death3.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_death_alt01.vanim_c b/models/heroes/juggernaut/cce213bc/okita_death_alt01.vanim_c new file mode 100755 index 0000000..deecd18 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_death_alt01.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_death_alt01_1.vanim_c b/models/heroes/juggernaut/cce213bc/okita_death_alt01_1.vanim_c new file mode 100755 index 0000000..a4aa087 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_death_alt01_1.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_death_alt01_2.vanim_c b/models/heroes/juggernaut/cce213bc/okita_death_alt01_2.vanim_c new file mode 100755 index 0000000..bf458ca Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_death_alt01_2.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_death_alt01_3.vanim_c b/models/heroes/juggernaut/cce213bc/okita_death_alt01_3.vanim_c new file mode 100755 index 0000000..9ac4b91 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_death_alt01_3.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_fail.vanim_c b/models/heroes/juggernaut/cce213bc/okita_fail.vanim_c new file mode 100755 index 0000000..6837870 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_fail.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_fail_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_fail_anim.vanim_c new file mode 100755 index 0000000..2bebf45 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_fail_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_death.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_death.vanim_c new file mode 100755 index 0000000..7f568ac Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_death.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_death_1.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_death_1.vanim_c new file mode 100755 index 0000000..3037712 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_death_1.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_death_10.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_death_10.vanim_c new file mode 100755 index 0000000..40a08f5 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_death_10.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_death_2.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_death_2.vanim_c new file mode 100755 index 0000000..f5ef4d6 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_death_2.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_death_3.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_death_3.vanim_c new file mode 100755 index 0000000..180fccb Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_death_3.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_death_4.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_death_4.vanim_c new file mode 100755 index 0000000..f99eda8 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_death_4.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_death_5.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_death_5.vanim_c new file mode 100755 index 0000000..a42aca3 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_death_5.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_death_6.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_death_6.vanim_c new file mode 100755 index 0000000..d00b162 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_death_6.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_death_7.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_death_7.vanim_c new file mode 100755 index 0000000..829f04d Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_death_7.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_death_8.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_death_8.vanim_c new file mode 100755 index 0000000..0ad5a70 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_death_8.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_death_9.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_death_9.vanim_c new file mode 100755 index 0000000..d71811f Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_death_9.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_loadout.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_loadout.vanim_c new file mode 100755 index 0000000..5e5973f Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_loadout.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_feas_loadout_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_feas_loadout_anim.vanim_c new file mode 100755 index 0000000..47c69f4 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_feas_loadout_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_forcestaff.vanim_c b/models/heroes/juggernaut/cce213bc/okita_forcestaff.vanim_c new file mode 100755 index 0000000..a9d883a Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_forcestaff.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_forcestaff_end_agg.vanim_c b/models/heroes/juggernaut/cce213bc/okita_forcestaff_end_agg.vanim_c new file mode 100755 index 0000000..39b1fb6 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_forcestaff_end_agg.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_forcestaff_end_odachi.vanim_c b/models/heroes/juggernaut/cce213bc/okita_forcestaff_end_odachi.vanim_c new file mode 100755 index 0000000..28f115b Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_forcestaff_end_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_generic_channel.vanim_c b/models/heroes/juggernaut/cce213bc/okita_generic_channel.vanim_c new file mode 100755 index 0000000..4bf2f8a Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_generic_channel.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_healing_ward_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_healing_ward_anim.vanim_c new file mode 100755 index 0000000..45c68fb Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_healing_ward_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_idle.vanim_c b/models/heroes/juggernaut/cce213bc/okita_idle.vanim_c new file mode 100755 index 0000000..deae459 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_idle.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_idle2.vanim_c b/models/heroes/juggernaut/cce213bc/okita_idle2.vanim_c new file mode 100755 index 0000000..9e77b31 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_idle2.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_idle2_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_idle2_anim.vanim_c new file mode 100755 index 0000000..6f2629c Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_idle2_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_idle_agg_injured.vanim_c b/models/heroes/juggernaut/cce213bc/okita_idle_agg_injured.vanim_c new file mode 100755 index 0000000..0ec732f Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_idle_agg_injured.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_idle_aggressive.vanim_c b/models/heroes/juggernaut/cce213bc/okita_idle_aggressive.vanim_c new file mode 100755 index 0000000..46a8160 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_idle_aggressive.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_idle_odachi.vanim_c b/models/heroes/juggernaut/cce213bc/okita_idle_odachi.vanim_c new file mode 100755 index 0000000..ccfc251 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_idle_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_idle_odachi_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_idle_odachi_anim.vanim_c new file mode 100755 index 0000000..8812ca5 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_idle_odachi_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_idle_reserve_injured.vanim_c b/models/heroes/juggernaut/cce213bc/okita_idle_reserve_injured.vanim_c new file mode 100755 index 0000000..8339be1 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_idle_reserve_injured.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_idle_reverse.vanim_c b/models/heroes/juggernaut/cce213bc/okita_idle_reverse.vanim_c new file mode 100755 index 0000000..26108c7 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_idle_reverse.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_idle_spin_sword.vanim_c b/models/heroes/juggernaut/cce213bc/okita_idle_spin_sword.vanim_c new file mode 100755 index 0000000..ab8341d Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_idle_spin_sword.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_loadout_default.vanim_c b/models/heroes/juggernaut/cce213bc/okita_loadout_default.vanim_c new file mode 100755 index 0000000..8317fc5 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_loadout_default.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_loadout_default_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_loadout_default_anim.vanim_c new file mode 100755 index 0000000..0fea5bd Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_loadout_default_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_loadout_default_spawn.vanim_c b/models/heroes/juggernaut/cce213bc/okita_loadout_default_spawn.vanim_c new file mode 100755 index 0000000..c3dfdaa Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_loadout_default_spawn.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_loadout_default_spawn_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_loadout_default_spawn_anim.vanim_c new file mode 100755 index 0000000..d03b22d Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_loadout_default_spawn_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_loadout_default_spawn_odachi.vanim_c b/models/heroes/juggernaut/cce213bc/okita_loadout_default_spawn_odachi.vanim_c new file mode 100755 index 0000000..d232283 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_loadout_default_spawn_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_odachi_run.vanim_c b/models/heroes/juggernaut/cce213bc/okita_odachi_run.vanim_c new file mode 100755 index 0000000..199da27 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_odachi_run.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_odachi_run_fast.vanim_c b/models/heroes/juggernaut/cce213bc/okita_odachi_run_fast.vanim_c new file mode 100755 index 0000000..9fad329 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_odachi_run_fast.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_odachi_walk.vanim_c b/models/heroes/juggernaut/cce213bc/okita_odachi_walk.vanim_c new file mode 100755 index 0000000..ffe0f9d Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_odachi_walk.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_omni.vanim_c b/models/heroes/juggernaut/cce213bc/okita_omni.vanim_c new file mode 100755 index 0000000..3f54553 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_omni.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_omni_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_omni_anim.vanim_c new file mode 100755 index 0000000..83a94a1 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_omni_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_omni_odachi.vanim_c b/models/heroes/juggernaut/cce213bc/okita_omni_odachi.vanim_c new file mode 100755 index 0000000..ab9b21d Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_omni_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_portrait.vanim_c b/models/heroes/juggernaut/cce213bc/okita_portrait.vanim_c new file mode 100755 index 0000000..da5d818 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_portrait.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_portrait_head_turn.vanim_c b/models/heroes/juggernaut/cce213bc/okita_portrait_head_turn.vanim_c new file mode 100755 index 0000000..ed9df36 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_portrait_head_turn.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_portrait_movie.vanim_c b/models/heroes/juggernaut/cce213bc/okita_portrait_movie.vanim_c new file mode 100755 index 0000000..b88e282 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_portrait_movie.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_reverse_run.vanim_c b/models/heroes/juggernaut/cce213bc/okita_reverse_run.vanim_c new file mode 100755 index 0000000..000eba6 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_reverse_run.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_reverse_run_fast.vanim_c b/models/heroes/juggernaut/cce213bc/okita_reverse_run_fast.vanim_c new file mode 100755 index 0000000..e3fa590 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_reverse_run_fast.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_reverse_walk.vanim_c b/models/heroes/juggernaut/cce213bc/okita_reverse_walk.vanim_c new file mode 100755 index 0000000..7c8c762 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_reverse_walk.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_chase.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_chase.vanim_c new file mode 100755 index 0000000..0f7fece Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_chase.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_fast_agg.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_fast_agg.vanim_c new file mode 100755 index 0000000..16fe330 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_fast_agg.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_injured_odachi_run.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_injured_odachi_run.vanim_c new file mode 100755 index 0000000..1fbe950 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_injured_odachi_run.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_injured_odachi_run_fast.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_injured_odachi_run_fast.vanim_c new file mode 100755 index 0000000..248fbc3 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_injured_odachi_run_fast.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_injured_odachi_walk.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_injured_odachi_walk.vanim_c new file mode 100755 index 0000000..bc77599 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_injured_odachi_walk.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_injured_run.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_injured_run.vanim_c new file mode 100755 index 0000000..9d9dc8b Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_injured_run.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_injured_run_agg.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_injured_run_agg.vanim_c new file mode 100755 index 0000000..f9cc9c1 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_injured_run_agg.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_injured_run_fast.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_injured_run_fast.vanim_c new file mode 100755 index 0000000..c6d6d90 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_injured_run_fast.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_injured_run_fast_agg.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_injured_run_fast_agg.vanim_c new file mode 100755 index 0000000..b106ab3 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_injured_run_fast_agg.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_injured_walk.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_injured_walk.vanim_c new file mode 100755 index 0000000..cc17549 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_injured_walk.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_injured_walk_agg.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_injured_walk_agg.vanim_c new file mode 100755 index 0000000..03753f1 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_injured_walk_agg.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_odachi.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_odachi.vanim_c new file mode 100755 index 0000000..32c4e79 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_reverse.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_reverse.vanim_c new file mode 100755 index 0000000..476bd3b Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_reverse.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_reverse_run_loadout_versus.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_reverse_run_loadout_versus.vanim_c new file mode 100755 index 0000000..a40bd1d Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_reverse_run_loadout_versus.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_run.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_run.vanim_c new file mode 100755 index 0000000..3ce394e Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_run.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_run_walk.vanim_c b/models/heroes/juggernaut/cce213bc/okita_run_walk.vanim_c new file mode 100755 index 0000000..66f4fab Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_run_walk.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_skill2.vanim_c b/models/heroes/juggernaut/cce213bc/okita_skill2.vanim_c new file mode 100755 index 0000000..b6bd125 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_skill2.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_spawn01.vanim_c b/models/heroes/juggernaut/cce213bc/okita_spawn01.vanim_c new file mode 100755 index 0000000..dccaf37 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_spawn01.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_spawn01_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_spawn01_anim.vanim_c new file mode 100755 index 0000000..f012573 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_spawn01_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_spawn_odachi.vanim_c b/models/heroes/juggernaut/cce213bc/okita_spawn_odachi.vanim_c new file mode 100755 index 0000000..f972be5 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_spawn_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_spawn_odachi_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_spawn_odachi_anim.vanim_c new file mode 100755 index 0000000..7863d2e Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_spawn_odachi_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_spin_cast_odachi.vanim_c b/models/heroes/juggernaut/cce213bc/okita_spin_cast_odachi.vanim_c new file mode 100755 index 0000000..48c88f0 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_spin_cast_odachi.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_stun.vanim_c b/models/heroes/juggernaut/cce213bc/okita_stun.vanim_c new file mode 100755 index 0000000..2c2a656 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_stun.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_stun_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_stun_anim.vanim_c new file mode 100755 index 0000000..953986d Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_stun_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_taunt_face_me.vanim_c b/models/heroes/juggernaut/cce213bc/okita_taunt_face_me.vanim_c new file mode 100755 index 0000000..dcfdad3 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_taunt_face_me.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_taunt_loser.vanim_c b/models/heroes/juggernaut/cce213bc/okita_taunt_loser.vanim_c new file mode 100755 index 0000000..34c092b Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_taunt_loser.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_taunt_loser_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_taunt_loser_anim.vanim_c new file mode 100755 index 0000000..689407d Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_taunt_loser_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_taunt_masklord_01.vanim_c b/models/heroes/juggernaut/cce213bc/okita_taunt_masklord_01.vanim_c new file mode 100755 index 0000000..f17732e Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_taunt_masklord_01.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_taunt_odachi_01.vanim_c b/models/heroes/juggernaut/cce213bc/okita_taunt_odachi_01.vanim_c new file mode 100755 index 0000000..93bf408 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_taunt_odachi_01.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_taunt_sharp_blade.vanim_c b/models/heroes/juggernaut/cce213bc/okita_taunt_sharp_blade.vanim_c new file mode 100755 index 0000000..1faee3c Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_taunt_sharp_blade.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_taunt_sharp_blade_anim.vanim_c b/models/heroes/juggernaut/cce213bc/okita_taunt_sharp_blade_anim.vanim_c new file mode 100755 index 0000000..730b71b Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_taunt_sharp_blade_anim.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_teleport_end.vanim_c b/models/heroes/juggernaut/cce213bc/okita_teleport_end.vanim_c new file mode 100755 index 0000000..0f1305b Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_teleport_end.vanim_c differ diff --git a/models/heroes/juggernaut/cce213bc/okita_victory.vanim_c b/models/heroes/juggernaut/cce213bc/okita_victory.vanim_c new file mode 100755 index 0000000..c356299 Binary files /dev/null and b/models/heroes/juggernaut/cce213bc/okita_victory.vanim_c differ diff --git a/models/heroes/juggernaut/hg_c8351919.vmesh_c b/models/heroes/juggernaut/hg_c8351919.vmesh_c new file mode 100755 index 0000000..9cfbb88 Binary files /dev/null and b/models/heroes/juggernaut/hg_c8351919.vmesh_c differ diff --git a/models/heroes/juggernaut/jugg_bracers.vmdl_c b/models/heroes/juggernaut/jugg_bracers.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/juggernaut/jugg_bracers.vmdl_c differ diff --git a/models/heroes/juggernaut/jugg_cape.vmdl_c b/models/heroes/juggernaut/jugg_cape.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/juggernaut/jugg_cape.vmdl_c differ diff --git a/models/heroes/juggernaut/jugg_healing_ward.vmdl_c b/models/heroes/juggernaut/jugg_healing_ward.vmdl_c new file mode 100755 index 0000000..f3288b3 Binary files /dev/null and b/models/heroes/juggernaut/jugg_healing_ward.vmdl_c differ diff --git a/models/heroes/juggernaut/jugg_healing_ward_849777fd.vagrp_c b/models/heroes/juggernaut/jugg_healing_ward_849777fd.vagrp_c new file mode 100755 index 0000000..6804d0b Binary files /dev/null and b/models/heroes/juggernaut/jugg_healing_ward_849777fd.vagrp_c differ diff --git a/models/heroes/juggernaut/jugg_mask.vmdl_c b/models/heroes/juggernaut/jugg_mask.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/juggernaut/jugg_mask.vmdl_c differ diff --git a/models/heroes/juggernaut/jugg_sword.vmdl_c b/models/heroes/juggernaut/jugg_sword.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/juggernaut/jugg_sword.vmdl_c differ diff --git a/models/heroes/juggernaut/juggernaut.vmdl_c b/models/heroes/juggernaut/juggernaut.vmdl_c new file mode 100755 index 0000000..cb11b70 Binary files /dev/null and b/models/heroes/juggernaut/juggernaut.vmdl_c differ diff --git a/models/heroes/juggernaut/juggernaut_arcana.vmdl_c b/models/heroes/juggernaut/juggernaut_arcana.vmdl_c new file mode 100755 index 0000000..2dc1b41 Binary files /dev/null and b/models/heroes/juggernaut/juggernaut_arcana.vmdl_c differ diff --git a/models/heroes/juggernaut/juggernaut_arcana_9cb2f493.vagrp_c b/models/heroes/juggernaut/juggernaut_arcana_9cb2f493.vagrp_c new file mode 100755 index 0000000..6aefe21 Binary files /dev/null and b/models/heroes/juggernaut/juggernaut_arcana_9cb2f493.vagrp_c differ diff --git a/models/heroes/juggernaut/juggernaut_cce213bc.vagrp_c b/models/heroes/juggernaut/juggernaut_cce213bc.vagrp_c new file mode 100755 index 0000000..6fb5551 Binary files /dev/null and b/models/heroes/juggernaut/juggernaut_cce213bc.vagrp_c differ diff --git a/models/heroes/juggernaut/juggernaut_pants.vmdl_c b/models/heroes/juggernaut/juggernaut_pants.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/juggernaut/juggernaut_pants.vmdl_c differ diff --git a/models/heroes/juggernaut/okita.vmdl_c b/models/heroes/juggernaut/okita.vmdl_c new file mode 100755 index 0000000..9328700 Binary files /dev/null and b/models/heroes/juggernaut/okita.vmdl_c differ diff --git a/models/heroes/juggernaut/okita_2ae260ef.vmesh_c b/models/heroes/juggernaut/okita_2ae260ef.vmesh_c new file mode 100755 index 0000000..fd2d633 Binary files /dev/null and b/models/heroes/juggernaut/okita_2ae260ef.vmesh_c differ diff --git a/models/heroes/juggernaut/okita_5862be93.vmesh_c b/models/heroes/juggernaut/okita_5862be93.vmesh_c new file mode 100755 index 0000000..fd2d633 Binary files /dev/null and b/models/heroes/juggernaut/okita_5862be93.vmesh_c differ diff --git a/models/heroes/juggernaut/okita_94e2634b.vagrp_c b/models/heroes/juggernaut/okita_94e2634b.vagrp_c new file mode 100755 index 0000000..26d65c4 Binary files /dev/null and b/models/heroes/juggernaut/okita_94e2634b.vagrp_c differ diff --git a/models/heroes/juggernaut/okita_d6b356b5.vmesh_c b/models/heroes/juggernaut/okita_d6b356b5.vmesh_c new file mode 100755 index 0000000..fd2d633 Binary files /dev/null and b/models/heroes/juggernaut/okita_d6b356b5.vmesh_c differ diff --git a/models/heroes/lina/dragonslave.vmdl_c b/models/heroes/lina/dragonslave.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/lina/dragonslave.vmdl_c differ diff --git a/models/heroes/lina/lina.vmdl_c b/models/heroes/lina/lina.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/lina/lina.vmdl_c differ diff --git a/models/heroes/lina/lina_arms.vmdl_c b/models/heroes/lina/lina_arms.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/lina/lina_arms.vmdl_c differ diff --git a/models/heroes/lina/lina_belt.vmdl_c b/models/heroes/lina/lina_belt.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/lina/lina_belt.vmdl_c differ diff --git a/models/heroes/lina/lina_head.vmdl_c b/models/heroes/lina/lina_head.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/lina/lina_head.vmdl_c differ diff --git a/models/heroes/lina/lina_neck.vmdl_c b/models/heroes/lina/lina_neck.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/lina/lina_neck.vmdl_c differ diff --git a/models/heroes/lina/lina_teaser.vmdl_c b/models/heroes/lina/lina_teaser.vmdl_c new file mode 100755 index 0000000..0300348 Binary files /dev/null and b/models/heroes/lina/lina_teaser.vmdl_c differ diff --git a/models/hujing_wangyu/1ca13d9b/hujingludfeixing_dea.vanim_c b/models/hujing_wangyu/1ca13d9b/hujingludfeixing_dea.vanim_c new file mode 100755 index 0000000..d379ff1 Binary files /dev/null and b/models/hujing_wangyu/1ca13d9b/hujingludfeixing_dea.vanim_c differ diff --git a/models/hujing_wangyu/1ca13d9b/hujingludfeixing_idle.vanim_c b/models/hujing_wangyu/1ca13d9b/hujingludfeixing_idle.vanim_c new file mode 100755 index 0000000..678ad9b Binary files /dev/null and b/models/hujing_wangyu/1ca13d9b/hujingludfeixing_idle.vanim_c differ diff --git a/models/hujing_wangyu/1ca13d9b/hujingludfeixing_move.vanim_c b/models/hujing_wangyu/1ca13d9b/hujingludfeixing_move.vanim_c new file mode 100755 index 0000000..f4d181a Binary files /dev/null and b/models/hujing_wangyu/1ca13d9b/hujingludfeixing_move.vanim_c differ diff --git a/models/hujing_wangyu/1ca13d9b/hujingludfeixing_s.vanim_c b/models/hujing_wangyu/1ca13d9b/hujingludfeixing_s.vanim_c new file mode 100755 index 0000000..3e69d64 Binary files /dev/null and b/models/hujing_wangyu/1ca13d9b/hujingludfeixing_s.vanim_c differ diff --git a/models/hujing_wangyu/cfefbe74/hujingludfeixing_dea.vanim_c b/models/hujing_wangyu/cfefbe74/hujingludfeixing_dea.vanim_c new file mode 100755 index 0000000..d379ff1 Binary files /dev/null and b/models/hujing_wangyu/cfefbe74/hujingludfeixing_dea.vanim_c differ diff --git a/models/hujing_wangyu/cfefbe74/hujingludfeixing_idle.vanim_c b/models/hujing_wangyu/cfefbe74/hujingludfeixing_idle.vanim_c new file mode 100755 index 0000000..678ad9b Binary files /dev/null and b/models/hujing_wangyu/cfefbe74/hujingludfeixing_idle.vanim_c differ diff --git a/models/hujing_wangyu/cfefbe74/hujingludfeixing_move.vanim_c b/models/hujing_wangyu/cfefbe74/hujingludfeixing_move.vanim_c new file mode 100755 index 0000000..f4d181a Binary files /dev/null and b/models/hujing_wangyu/cfefbe74/hujingludfeixing_move.vanim_c differ diff --git a/models/hujing_wangyu/cfefbe74/hujingludfeixing_s.vanim_c b/models/hujing_wangyu/cfefbe74/hujingludfeixing_s.vanim_c new file mode 100755 index 0000000..3e69d64 Binary files /dev/null and b/models/hujing_wangyu/cfefbe74/hujingludfeixing_s.vanim_c differ diff --git a/models/hujing_wangyu/f8fee260/hujingludfeixing_dea.vanim_c b/models/hujing_wangyu/f8fee260/hujingludfeixing_dea.vanim_c new file mode 100755 index 0000000..d379ff1 Binary files /dev/null and b/models/hujing_wangyu/f8fee260/hujingludfeixing_dea.vanim_c differ diff --git a/models/hujing_wangyu/f8fee260/hujingludfeixing_idle.vanim_c b/models/hujing_wangyu/f8fee260/hujingludfeixing_idle.vanim_c new file mode 100755 index 0000000..678ad9b Binary files /dev/null and b/models/hujing_wangyu/f8fee260/hujingludfeixing_idle.vanim_c differ diff --git a/models/hujing_wangyu/f8fee260/hujingludfeixing_move.vanim_c b/models/hujing_wangyu/f8fee260/hujingludfeixing_move.vanim_c new file mode 100755 index 0000000..f4d181a Binary files /dev/null and b/models/hujing_wangyu/f8fee260/hujingludfeixing_move.vanim_c differ diff --git a/models/hujing_wangyu/f8fee260/hujingludfeixing_s.vanim_c b/models/hujing_wangyu/f8fee260/hujingludfeixing_s.vanim_c new file mode 100755 index 0000000..3e69d64 Binary files /dev/null and b/models/hujing_wangyu/f8fee260/hujingludfeixing_s.vanim_c differ diff --git a/models/hujing_wangyu/hujing.vmat_c b/models/hujing_wangyu/hujing.vmat_c new file mode 100755 index 0000000..ebf1e1a Binary files /dev/null and b/models/hujing_wangyu/hujing.vmat_c differ diff --git a/models/hujing_wangyu/hujing.vmdl_c b/models/hujing_wangyu/hujing.vmdl_c new file mode 100755 index 0000000..bdedaf3 Binary files /dev/null and b/models/hujing_wangyu/hujing.vmdl_c differ diff --git a/models/hujing_wangyu/hujing.vmesh_c b/models/hujing_wangyu/hujing.vmesh_c new file mode 100755 index 0000000..c3dbb78 Binary files /dev/null and b/models/hujing_wangyu/hujing.vmesh_c differ diff --git a/models/hujing_wangyu/hujing_1ca13d9b.vagrp_c b/models/hujing_wangyu/hujing_1ca13d9b.vagrp_c new file mode 100755 index 0000000..8a7fa01 Binary files /dev/null and b/models/hujing_wangyu/hujing_1ca13d9b.vagrp_c differ diff --git a/models/hujing_wangyu/hujing_flying.vmdl_c b/models/hujing_wangyu/hujing_flying.vmdl_c new file mode 100755 index 0000000..ea0cfdc Binary files /dev/null and b/models/hujing_wangyu/hujing_flying.vmdl_c differ diff --git a/models/hujing_wangyu/hujing_flying.vmesh_c b/models/hujing_wangyu/hujing_flying.vmesh_c new file mode 100755 index 0000000..17cb4fa Binary files /dev/null and b/models/hujing_wangyu/hujing_flying.vmesh_c differ diff --git a/models/hujing_wangyu/hujing_flying_f8fee260.vagrp_c b/models/hujing_wangyu/hujing_flying_f8fee260.vagrp_c new file mode 100755 index 0000000..5797ef6 Binary files /dev/null and b/models/hujing_wangyu/hujing_flying_f8fee260.vagrp_c differ diff --git a/models/hujing_wangyu/hujing_psd_e7e07518.vtex_c b/models/hujing_wangyu/hujing_psd_e7e07518.vtex_c new file mode 100755 index 0000000..b41ba0f Binary files /dev/null and b/models/hujing_wangyu/hujing_psd_e7e07518.vtex_c differ diff --git a/models/hujing_wangyu/hujingludfeixin_f.vmdl_c b/models/hujing_wangyu/hujingludfeixin_f.vmdl_c new file mode 100755 index 0000000..e2c6c66 Binary files /dev/null and b/models/hujing_wangyu/hujingludfeixin_f.vmdl_c differ diff --git a/models/hujing_wangyu/hujingludfeixin_f_cfefbe74.vagrp_c b/models/hujing_wangyu/hujingludfeixin_f_cfefbe74.vagrp_c new file mode 100755 index 0000000..8bc3304 Binary files /dev/null and b/models/hujing_wangyu/hujingludfeixin_f_cfefbe74.vagrp_c differ diff --git a/models/hy/2fe0ff88/dead.vanim_c b/models/hy/2fe0ff88/dead.vanim_c new file mode 100755 index 0000000..af6b0b0 Binary files /dev/null and b/models/hy/2fe0ff88/dead.vanim_c differ diff --git a/models/hy/2fe0ff88/run.vanim_c b/models/hy/2fe0ff88/run.vanim_c new file mode 100755 index 0000000..0a5958c Binary files /dev/null and b/models/hy/2fe0ff88/run.vanim_c differ diff --git a/models/hy/2fe0ff88/standby.vanim_c b/models/hy/2fe0ff88/standby.vanim_c new file mode 100755 index 0000000..e1971ff Binary files /dev/null and b/models/hy/2fe0ff88/standby.vanim_c differ diff --git a/models/hy/5cf68cd6/birth.vanim_c b/models/hy/5cf68cd6/birth.vanim_c new file mode 100755 index 0000000..ee8d017 Binary files /dev/null and b/models/hy/5cf68cd6/birth.vanim_c differ diff --git a/models/hy/5cf68cd6/dead.vanim_c b/models/hy/5cf68cd6/dead.vanim_c new file mode 100755 index 0000000..8b4f255 Binary files /dev/null and b/models/hy/5cf68cd6/dead.vanim_c differ diff --git a/models/hy/5cf68cd6/run.vanim_c b/models/hy/5cf68cd6/run.vanim_c new file mode 100755 index 0000000..ce55658 Binary files /dev/null and b/models/hy/5cf68cd6/run.vanim_c differ diff --git a/models/hy/5cf68cd6/standby.vanim_c b/models/hy/5cf68cd6/standby.vanim_c new file mode 100755 index 0000000..730181a Binary files /dev/null and b/models/hy/5cf68cd6/standby.vanim_c differ diff --git a/models/hy/huya.vmdl_c b/models/hy/huya.vmdl_c new file mode 100755 index 0000000..ea0f963 Binary files /dev/null and b/models/hy/huya.vmdl_c differ diff --git a/models/hy/huya.vmesh_c b/models/hy/huya.vmesh_c new file mode 100755 index 0000000..ce922b7 Binary files /dev/null and b/models/hy/huya.vmesh_c differ diff --git a/models/hy/huya0.vmat_c b/models/hy/huya0.vmat_c new file mode 100755 index 0000000..0f56826 Binary files /dev/null and b/models/hy/huya0.vmat_c differ diff --git a/models/hy/huya_5cf68cd6.vagrp_c b/models/hy/huya_5cf68cd6.vagrp_c new file mode 100755 index 0000000..4fc4f5b Binary files /dev/null and b/models/hy/huya_5cf68cd6.vagrp_c differ diff --git a/models/hy/huya_color_tga_db287ca2.vtex_c b/models/hy/huya_color_tga_db287ca2.vtex_c new file mode 100755 index 0000000..916d83c Binary files /dev/null and b/models/hy/huya_color_tga_db287ca2.vtex_c differ diff --git a/models/hy/huya_flying.vmdl_c b/models/hy/huya_flying.vmdl_c new file mode 100755 index 0000000..05ba9c0 Binary files /dev/null and b/models/hy/huya_flying.vmdl_c differ diff --git a/models/hy/huya_flying.vmesh_c b/models/hy/huya_flying.vmesh_c new file mode 100755 index 0000000..deec723 Binary files /dev/null and b/models/hy/huya_flying.vmesh_c differ diff --git a/models/hy/huya_flying_2fe0ff88.vagrp_c b/models/hy/huya_flying_2fe0ff88.vagrp_c new file mode 100755 index 0000000..271988f Binary files /dev/null and b/models/hy/huya_flying_2fe0ff88.vagrp_c differ diff --git a/models/hy/huya_normal_tga_6e1615c1.vtex_c b/models/hy/huya_normal_tga_6e1615c1.vtex_c new file mode 100755 index 0000000..59776be Binary files /dev/null and b/models/hy/huya_normal_tga_6e1615c1.vtex_c differ diff --git a/models/hy/huya_spec_tga_74ceba46.vtex_c b/models/hy/huya_spec_tga_74ceba46.vtex_c new file mode 100755 index 0000000..ca6c5e6 Binary files /dev/null and b/models/hy/huya_spec_tga_74ceba46.vtex_c differ diff --git a/models/hy/test_tga_677a8420.vtex_c b/models/hy/test_tga_677a8420.vtex_c new file mode 100755 index 0000000..e419ce9 Binary files /dev/null and b/models/hy/test_tga_677a8420.vtex_c differ diff --git a/models/imagine_assets/props/chest/0955ba3d/chest_key_01.vanim_c b/models/imagine_assets/props/chest/0955ba3d/chest_key_01.vanim_c new file mode 100755 index 0000000..1ead68f Binary files /dev/null and b/models/imagine_assets/props/chest/0955ba3d/chest_key_01.vanim_c differ diff --git a/models/imagine_assets/props/chest/101ac8c4/chest_key_01.vanim_c b/models/imagine_assets/props/chest/101ac8c4/chest_key_01.vanim_c new file mode 100755 index 0000000..1ead68f Binary files /dev/null and b/models/imagine_assets/props/chest/101ac8c4/chest_key_01.vanim_c differ diff --git a/models/imagine_assets/props/chest/2f036a39/chest_01.vanim_c b/models/imagine_assets/props/chest/2f036a39/chest_01.vanim_c new file mode 100755 index 0000000..59ae845 Binary files /dev/null and b/models/imagine_assets/props/chest/2f036a39/chest_01.vanim_c differ diff --git a/models/imagine_assets/props/chest/3860a290/chest_01.vanim_c b/models/imagine_assets/props/chest/3860a290/chest_01.vanim_c new file mode 100755 index 0000000..59ae845 Binary files /dev/null and b/models/imagine_assets/props/chest/3860a290/chest_01.vanim_c differ diff --git a/models/imagine_assets/props/chest/5ca4d927/chest_key_01.vanim_c b/models/imagine_assets/props/chest/5ca4d927/chest_key_01.vanim_c new file mode 100755 index 0000000..1ead68f Binary files /dev/null and b/models/imagine_assets/props/chest/5ca4d927/chest_key_01.vanim_c differ diff --git a/models/imagine_assets/props/chest/7198ed49/chest_key_01.vanim_c b/models/imagine_assets/props/chest/7198ed49/chest_key_01.vanim_c new file mode 100755 index 0000000..1ead68f Binary files /dev/null and b/models/imagine_assets/props/chest/7198ed49/chest_key_01.vanim_c differ diff --git a/models/imagine_assets/props/chest/83871a17/chest_01.vanim_c b/models/imagine_assets/props/chest/83871a17/chest_01.vanim_c new file mode 100755 index 0000000..59ae845 Binary files /dev/null and b/models/imagine_assets/props/chest/83871a17/chest_01.vanim_c differ diff --git a/models/imagine_assets/props/chest/93a11198/chest_key_01.vanim_c b/models/imagine_assets/props/chest/93a11198/chest_key_01.vanim_c new file mode 100755 index 0000000..1ead68f Binary files /dev/null and b/models/imagine_assets/props/chest/93a11198/chest_key_01.vanim_c differ diff --git a/models/imagine_assets/props/chest/b9d035be/chest_01.vanim_c b/models/imagine_assets/props/chest/b9d035be/chest_01.vanim_c new file mode 100755 index 0000000..59ae845 Binary files /dev/null and b/models/imagine_assets/props/chest/b9d035be/chest_01.vanim_c differ diff --git a/models/imagine_assets/props/chest/chest_01.vmdl_c b/models/imagine_assets/props/chest/chest_01.vmdl_c new file mode 100755 index 0000000..8ad13c3 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01.vmdl_c differ diff --git a/models/imagine_assets/props/chest/chest_01_1e2f7cd3.vmesh_c b/models/imagine_assets/props/chest/chest_01_1e2f7cd3.vmesh_c new file mode 100755 index 0000000..08450f1 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_1e2f7cd3.vmesh_c differ diff --git a/models/imagine_assets/props/chest/chest_01_42d16ff9.vmesh_c b/models/imagine_assets/props/chest/chest_01_42d16ff9.vmesh_c new file mode 100755 index 0000000..0371531 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_42d16ff9.vmesh_c differ diff --git a/models/imagine_assets/props/chest/chest_01_76dabb51.vmesh_c b/models/imagine_assets/props/chest/chest_01_76dabb51.vmesh_c new file mode 100755 index 0000000..ea86da5 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_76dabb51.vmesh_c differ diff --git a/models/imagine_assets/props/chest/chest_01_b1609e72.vmesh_c b/models/imagine_assets/props/chest/chest_01_b1609e72.vmesh_c new file mode 100755 index 0000000..0428436 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_b1609e72.vmesh_c differ diff --git a/models/imagine_assets/props/chest/chest_01_bronze.vmdl_c b/models/imagine_assets/props/chest/chest_01_bronze.vmdl_c new file mode 100755 index 0000000..f5598ba Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_bronze.vmdl_c differ diff --git a/models/imagine_assets/props/chest/chest_01_bronze_3860a290.vagrp_c b/models/imagine_assets/props/chest/chest_01_bronze_3860a290.vagrp_c new file mode 100755 index 0000000..dc3d9cd Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_bronze_3860a290.vagrp_c differ diff --git a/models/imagine_assets/props/chest/chest_01_dd6f19f2.vagrp_c b/models/imagine_assets/props/chest/chest_01_dd6f19f2.vagrp_c new file mode 100755 index 0000000..32dfb8e Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_dd6f19f2.vagrp_c differ diff --git a/models/imagine_assets/props/chest/chest_01_emerald.vmdl_c b/models/imagine_assets/props/chest/chest_01_emerald.vmdl_c new file mode 100755 index 0000000..f377b88 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_emerald.vmdl_c differ diff --git a/models/imagine_assets/props/chest/chest_01_emerald_b9d035be.vagrp_c b/models/imagine_assets/props/chest/chest_01_emerald_b9d035be.vagrp_c new file mode 100755 index 0000000..f8ad23b Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_emerald_b9d035be.vagrp_c differ diff --git a/models/imagine_assets/props/chest/chest_01_f647bdc9.vmesh_c b/models/imagine_assets/props/chest/chest_01_f647bdc9.vmesh_c new file mode 100755 index 0000000..0bfb7ca Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_f647bdc9.vmesh_c differ diff --git a/models/imagine_assets/props/chest/chest_01_gold.vmdl_c b/models/imagine_assets/props/chest/chest_01_gold.vmdl_c new file mode 100755 index 0000000..b5e9a9a Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_gold.vmdl_c differ diff --git a/models/imagine_assets/props/chest/chest_01_gold_83871a17.vagrp_c b/models/imagine_assets/props/chest/chest_01_gold_83871a17.vagrp_c new file mode 100755 index 0000000..e86c2fb Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_gold_83871a17.vagrp_c differ diff --git a/models/imagine_assets/props/chest/chest_01_silver.vmdl_c b/models/imagine_assets/props/chest/chest_01_silver.vmdl_c new file mode 100755 index 0000000..d48de56 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_silver.vmdl_c differ diff --git a/models/imagine_assets/props/chest/chest_01_silver_2f036a39.vagrp_c b/models/imagine_assets/props/chest/chest_01_silver_2f036a39.vagrp_c new file mode 100755 index 0000000..1a96568 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_01_silver_2f036a39.vagrp_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01.vmdl_c b/models/imagine_assets/props/chest/chest_key_01.vmdl_c new file mode 100755 index 0000000..5c69657 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01.vmdl_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01.vmesh_c b/models/imagine_assets/props/chest/chest_key_01.vmesh_c new file mode 100755 index 0000000..4ec537d Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01.vmesh_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_5c1b53ae.vmesh_c b/models/imagine_assets/props/chest/chest_key_01_5c1b53ae.vmesh_c new file mode 100755 index 0000000..3c9dc89 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_5c1b53ae.vmesh_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_7198ed49.vagrp_c b/models/imagine_assets/props/chest/chest_key_01_7198ed49.vagrp_c new file mode 100755 index 0000000..8f57f95 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_7198ed49.vagrp_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_958eb35d.vmesh_c b/models/imagine_assets/props/chest/chest_key_01_958eb35d.vmesh_c new file mode 100755 index 0000000..b81e707 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_958eb35d.vmesh_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_a1bec939.vmesh_c b/models/imagine_assets/props/chest/chest_key_01_a1bec939.vmesh_c new file mode 100755 index 0000000..ea5a785 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_a1bec939.vmesh_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_b1247d95.vmesh_c b/models/imagine_assets/props/chest/chest_key_01_b1247d95.vmesh_c new file mode 100755 index 0000000..55a0c8d Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_b1247d95.vmesh_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_bronze.vmdl_c b/models/imagine_assets/props/chest/chest_key_01_bronze.vmdl_c new file mode 100755 index 0000000..5d012d5 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_bronze.vmdl_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_bronze_5ca4d927.vagrp_c b/models/imagine_assets/props/chest/chest_key_01_bronze_5ca4d927.vagrp_c new file mode 100755 index 0000000..c27be10 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_bronze_5ca4d927.vagrp_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_e20176be.vmesh_c b/models/imagine_assets/props/chest/chest_key_01_e20176be.vmesh_c new file mode 100755 index 0000000..ad5811f Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_e20176be.vmesh_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_emerald.vmdl_c b/models/imagine_assets/props/chest/chest_key_01_emerald.vmdl_c new file mode 100755 index 0000000..9f6d9e8 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_emerald.vmdl_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_emerald_93a11198.vagrp_c b/models/imagine_assets/props/chest/chest_key_01_emerald_93a11198.vagrp_c new file mode 100755 index 0000000..5feb878 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_emerald_93a11198.vagrp_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_gold.vmdl_c b/models/imagine_assets/props/chest/chest_key_01_gold.vmdl_c new file mode 100755 index 0000000..9f79fbb Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_gold.vmdl_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_gold_0955ba3d.vagrp_c b/models/imagine_assets/props/chest/chest_key_01_gold_0955ba3d.vagrp_c new file mode 100755 index 0000000..494a49d Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_gold_0955ba3d.vagrp_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_silver.vmdl_c b/models/imagine_assets/props/chest/chest_key_01_silver.vmdl_c new file mode 100755 index 0000000..a897de8 Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_silver.vmdl_c differ diff --git a/models/imagine_assets/props/chest/chest_key_01_silver_101ac8c4.vagrp_c b/models/imagine_assets/props/chest/chest_key_01_silver_101ac8c4.vagrp_c new file mode 100755 index 0000000..9d197ff Binary files /dev/null and b/models/imagine_assets/props/chest/chest_key_01_silver_101ac8c4.vagrp_c differ diff --git a/models/imagine_assets/props/chest/dd6f19f2/chest_01.vanim_c b/models/imagine_assets/props/chest/dd6f19f2/chest_01.vanim_c new file mode 100755 index 0000000..59ae845 Binary files /dev/null and b/models/imagine_assets/props/chest/dd6f19f2/chest_01.vanim_c differ diff --git a/models/items/juggernaut/5e7c8e71/hg_death.vanim_c b/models/items/juggernaut/5e7c8e71/hg_death.vanim_c new file mode 100755 index 0000000..3f094c3 Binary files /dev/null and b/models/items/juggernaut/5e7c8e71/hg_death.vanim_c differ diff --git a/models/items/juggernaut/5e7c8e71/hg_idle.vanim_c b/models/items/juggernaut/5e7c8e71/hg_idle.vanim_c new file mode 100755 index 0000000..1c82de4 Binary files /dev/null and b/models/items/juggernaut/5e7c8e71/hg_idle.vanim_c differ diff --git a/models/items/juggernaut/5e7c8e71/hg_run.vanim_c b/models/items/juggernaut/5e7c8e71/hg_run.vanim_c new file mode 100755 index 0000000..06dbb18 Binary files /dev/null and b/models/items/juggernaut/5e7c8e71/hg_run.vanim_c differ diff --git a/models/items/juggernaut/5e7c8e71/hg_spawn.vanim_c b/models/items/juggernaut/5e7c8e71/hg_spawn.vanim_c new file mode 100755 index 0000000..446f6b6 Binary files /dev/null and b/models/items/juggernaut/5e7c8e71/hg_spawn.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/_jd_debut_loop.vanim_c b/models/items/juggernaut/arcana/2a73f23d/_jd_debut_loop.vanim_c new file mode 100755 index 0000000..8fcc820 Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/_jd_debut_loop.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/bind_pose.vanim_c b/models/items/juggernaut/arcana/2a73f23d/bind_pose.vanim_c new file mode 100755 index 0000000..00bd713 Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/bind_pose.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_blade_fury.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_blade_fury.vanim_c new file mode 100755 index 0000000..d7e3da8 Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_blade_fury.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_crit.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_crit.vanim_c new file mode 100755 index 0000000..24d1b86 Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_crit.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_crit_tgt.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_crit_tgt.vanim_c new file mode 100755 index 0000000..6110562 Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_crit_tgt.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_death.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_death.vanim_c new file mode 100755 index 0000000..4b93398 Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_death.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_debut.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_debut.vanim_c new file mode 100755 index 0000000..3ff7715 Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_debut.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_debut_end.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_debut_end.vanim_c new file mode 100755 index 0000000..67895b0 Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_debut_end.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_loadout_rare.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_loadout_rare.vanim_c new file mode 100755 index 0000000..4a317ce Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_loadout_rare.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_loadout_spawn.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_loadout_spawn.vanim_c new file mode 100755 index 0000000..0fb99c5 Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_loadout_spawn.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_loadout_spawn_v2.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_loadout_spawn_v2.vanim_c new file mode 100755 index 0000000..002ffe0 Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_loadout_spawn_v2.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_omnislash.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_omnislash.vanim_c new file mode 100755 index 0000000..57277bd Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_omnislash.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_portrait.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_portrait.vanim_c new file mode 100755 index 0000000..49bb8f5 Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_portrait.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_teleport.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_teleport.vanim_c new file mode 100755 index 0000000..8c5a505 Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_teleport.vanim_c differ diff --git a/models/items/juggernaut/arcana/2a73f23d/jd_teleport_end.vanim_c b/models/items/juggernaut/arcana/2a73f23d/jd_teleport_end.vanim_c new file mode 100755 index 0000000..29171dd Binary files /dev/null and b/models/items/juggernaut/arcana/2a73f23d/jd_teleport_end.vanim_c differ diff --git a/models/items/juggernaut/arcana/5b860821/juggernaut_arcana_mask_front_page.vanim_c b/models/items/juggernaut/arcana/5b860821/juggernaut_arcana_mask_front_page.vanim_c new file mode 100755 index 0000000..2a9c1eb Binary files /dev/null and b/models/items/juggernaut/arcana/5b860821/juggernaut_arcana_mask_front_page.vanim_c differ diff --git a/models/items/juggernaut/arcana/5b860821/juggernaut_arcana_mask_idle.vanim_c b/models/items/juggernaut/arcana/5b860821/juggernaut_arcana_mask_idle.vanim_c new file mode 100755 index 0000000..51cde13 Binary files /dev/null and b/models/items/juggernaut/arcana/5b860821/juggernaut_arcana_mask_idle.vanim_c differ diff --git a/models/items/juggernaut/arcana/5b860821/juggernaut_arcana_mask_idle_loadout.vanim_c b/models/items/juggernaut/arcana/5b860821/juggernaut_arcana_mask_idle_loadout.vanim_c new file mode 100755 index 0000000..61cdf39 Binary files /dev/null and b/models/items/juggernaut/arcana/5b860821/juggernaut_arcana_mask_idle_loadout.vanim_c differ diff --git a/models/items/juggernaut/arcana/5b860821/juggernaut_arcana_mask_run.vanim_c b/models/items/juggernaut/arcana/5b860821/juggernaut_arcana_mask_run.vanim_c new file mode 100755 index 0000000..0119b44 Binary files /dev/null and b/models/items/juggernaut/arcana/5b860821/juggernaut_arcana_mask_run.vanim_c differ diff --git a/models/items/juggernaut/arcana/78e7abf3/juggernaut_arcana_mask_idle.vanim_c b/models/items/juggernaut/arcana/78e7abf3/juggernaut_arcana_mask_idle.vanim_c new file mode 100755 index 0000000..51cde13 Binary files /dev/null and b/models/items/juggernaut/arcana/78e7abf3/juggernaut_arcana_mask_idle.vanim_c differ diff --git a/models/items/juggernaut/arcana/78e7abf3/juggernaut_arcana_mask_idle_loadout.vanim_c b/models/items/juggernaut/arcana/78e7abf3/juggernaut_arcana_mask_idle_loadout.vanim_c new file mode 100755 index 0000000..61cdf39 Binary files /dev/null and b/models/items/juggernaut/arcana/78e7abf3/juggernaut_arcana_mask_idle_loadout.vanim_c differ diff --git a/models/items/juggernaut/arcana/78e7abf3/juggernaut_arcana_mask_run.vanim_c b/models/items/juggernaut/arcana/78e7abf3/juggernaut_arcana_mask_run.vanim_c new file mode 100755 index 0000000..0119b44 Binary files /dev/null and b/models/items/juggernaut/arcana/78e7abf3/juggernaut_arcana_mask_run.vanim_c differ diff --git a/models/items/juggernaut/arcana/9561c0f2/bind_pose.vanim_c b/models/items/juggernaut/arcana/9561c0f2/bind_pose.vanim_c new file mode 100755 index 0000000..00bd713 Binary files /dev/null and b/models/items/juggernaut/arcana/9561c0f2/bind_pose.vanim_c differ diff --git a/models/items/juggernaut/arcana/9561c0f2/jd_blade_fury.vanim_c b/models/items/juggernaut/arcana/9561c0f2/jd_blade_fury.vanim_c new file mode 100755 index 0000000..53123d2 Binary files /dev/null and b/models/items/juggernaut/arcana/9561c0f2/jd_blade_fury.vanim_c differ diff --git a/models/items/juggernaut/arcana/9561c0f2/jd_crit.vanim_c b/models/items/juggernaut/arcana/9561c0f2/jd_crit.vanim_c new file mode 100755 index 0000000..24d1b86 Binary files /dev/null and b/models/items/juggernaut/arcana/9561c0f2/jd_crit.vanim_c differ diff --git a/models/items/juggernaut/arcana/9561c0f2/jd_crit_tgt.vanim_c b/models/items/juggernaut/arcana/9561c0f2/jd_crit_tgt.vanim_c new file mode 100755 index 0000000..9f5b6f5 Binary files /dev/null and b/models/items/juggernaut/arcana/9561c0f2/jd_crit_tgt.vanim_c differ diff --git a/models/items/juggernaut/arcana/9561c0f2/jd_death.vanim_c b/models/items/juggernaut/arcana/9561c0f2/jd_death.vanim_c new file mode 100755 index 0000000..4b93398 Binary files /dev/null and b/models/items/juggernaut/arcana/9561c0f2/jd_death.vanim_c differ diff --git a/models/items/juggernaut/arcana/9561c0f2/jd_loadout_spawn.vanim_c b/models/items/juggernaut/arcana/9561c0f2/jd_loadout_spawn.vanim_c new file mode 100755 index 0000000..081e578 Binary files /dev/null and b/models/items/juggernaut/arcana/9561c0f2/jd_loadout_spawn.vanim_c differ diff --git a/models/items/juggernaut/arcana/9561c0f2/jd_omnislash.vanim_c b/models/items/juggernaut/arcana/9561c0f2/jd_omnislash.vanim_c new file mode 100755 index 0000000..57277bd Binary files /dev/null and b/models/items/juggernaut/arcana/9561c0f2/jd_omnislash.vanim_c differ diff --git a/models/items/juggernaut/arcana/9561c0f2/jd_origin.vanim_c b/models/items/juggernaut/arcana/9561c0f2/jd_origin.vanim_c new file mode 100755 index 0000000..59c0d2a Binary files /dev/null and b/models/items/juggernaut/arcana/9561c0f2/jd_origin.vanim_c differ diff --git a/models/items/juggernaut/arcana/9561c0f2/jd_teleport.vanim_c b/models/items/juggernaut/arcana/9561c0f2/jd_teleport.vanim_c new file mode 100755 index 0000000..8c5a505 Binary files /dev/null and b/models/items/juggernaut/arcana/9561c0f2/jd_teleport.vanim_c differ diff --git a/models/items/juggernaut/arcana/9561c0f2/jd_teleport_end.vanim_c b/models/items/juggernaut/arcana/9561c0f2/jd_teleport_end.vanim_c new file mode 100755 index 0000000..29171dd Binary files /dev/null and b/models/items/juggernaut/arcana/9561c0f2/jd_teleport_end.vanim_c differ diff --git a/models/items/juggernaut/arcana/base_2a73f23d.vagrp_c b/models/items/juggernaut/arcana/base_2a73f23d.vagrp_c new file mode 100755 index 0000000..5bbc469 Binary files /dev/null and b/models/items/juggernaut/arcana/base_2a73f23d.vagrp_c differ diff --git a/models/items/juggernaut/arcana/base_9561c0f2.vagrp_c b/models/items/juggernaut/arcana/base_9561c0f2.vagrp_c new file mode 100755 index 0000000..e161897 Binary files /dev/null and b/models/items/juggernaut/arcana/base_9561c0f2.vagrp_c differ diff --git a/models/items/juggernaut/arcana/jugg_dragon.vmdl_c b/models/items/juggernaut/arcana/jugg_dragon.vmdl_c new file mode 100755 index 0000000..a23d157 Binary files /dev/null and b/models/items/juggernaut/arcana/jugg_dragon.vmdl_c differ diff --git a/models/items/juggernaut/arcana/jugg_dragon.vmesh_c b/models/items/juggernaut/arcana/jugg_dragon.vmesh_c new file mode 100755 index 0000000..8454530 Binary files /dev/null and b/models/items/juggernaut/arcana/jugg_dragon.vmesh_c differ diff --git a/models/items/juggernaut/arcana/jugg_dragon_2e0da6fe.vmesh_c b/models/items/juggernaut/arcana/jugg_dragon_2e0da6fe.vmesh_c new file mode 100755 index 0000000..77f79bf Binary files /dev/null and b/models/items/juggernaut/arcana/jugg_dragon_2e0da6fe.vmesh_c differ diff --git a/models/items/juggernaut/arcana/jugg_dragon_574afb98.vagrp_c b/models/items/juggernaut/arcana/jugg_dragon_574afb98.vagrp_c new file mode 100755 index 0000000..d2d1fa4 Binary files /dev/null and b/models/items/juggernaut/arcana/jugg_dragon_574afb98.vagrp_c differ diff --git a/models/items/juggernaut/arcana/jugg_dragon_head.vmdl_c b/models/items/juggernaut/arcana/jugg_dragon_head.vmdl_c new file mode 100755 index 0000000..5c58d00 Binary files /dev/null and b/models/items/juggernaut/arcana/jugg_dragon_head.vmdl_c differ diff --git a/models/items/juggernaut/arcana/jugg_dragon_head_b31822dd.vagrp_c b/models/items/juggernaut/arcana/jugg_dragon_head_b31822dd.vagrp_c new file mode 100755 index 0000000..29f86c3 Binary files /dev/null and b/models/items/juggernaut/arcana/jugg_dragon_head_b31822dd.vagrp_c differ diff --git a/models/items/juggernaut/arcana/jugg_mask_33b517bc.vmesh_c b/models/items/juggernaut/arcana/jugg_mask_33b517bc.vmesh_c new file mode 100755 index 0000000..93980ee Binary files /dev/null and b/models/items/juggernaut/arcana/jugg_mask_33b517bc.vmesh_c differ diff --git a/models/items/juggernaut/arcana/jugg_mask_be306eb5.vmesh_c b/models/items/juggernaut/arcana/jugg_mask_be306eb5.vmesh_c new file mode 100755 index 0000000..f1168ad Binary files /dev/null and b/models/items/juggernaut/arcana/jugg_mask_be306eb5.vmesh_c differ diff --git a/models/items/juggernaut/arcana/juggernaut_arcana_front_page.vmdl_c b/models/items/juggernaut/arcana/juggernaut_arcana_front_page.vmdl_c new file mode 100755 index 0000000..57b94fe Binary files /dev/null and b/models/items/juggernaut/arcana/juggernaut_arcana_front_page.vmdl_c differ diff --git a/models/items/juggernaut/arcana/juggernaut_arcana_front_page_5b860821.vagrp_c b/models/items/juggernaut/arcana/juggernaut_arcana_front_page_5b860821.vagrp_c new file mode 100755 index 0000000..6c84fb0 Binary files /dev/null and b/models/items/juggernaut/arcana/juggernaut_arcana_front_page_5b860821.vagrp_c differ diff --git a/models/items/juggernaut/arcana/juggernaut_arcana_mask.vphys_c b/models/items/juggernaut/arcana/juggernaut_arcana_mask.vphys_c new file mode 100755 index 0000000..4ae40ad Binary files /dev/null and b/models/items/juggernaut/arcana/juggernaut_arcana_mask.vphys_c differ diff --git a/models/items/juggernaut/arcana/juggernaut_arcana_mask_78e7abf3.vagrp_c b/models/items/juggernaut/arcana/juggernaut_arcana_mask_78e7abf3.vagrp_c new file mode 100755 index 0000000..4e3ab91 Binary files /dev/null and b/models/items/juggernaut/arcana/juggernaut_arcana_mask_78e7abf3.vagrp_c differ diff --git a/models/items/juggernaut/arcana/juggernaut_arcana_mask_a.vmdl_c b/models/items/juggernaut/arcana/juggernaut_arcana_mask_a.vmdl_c new file mode 100755 index 0000000..2c428b3 Binary files /dev/null and b/models/items/juggernaut/arcana/juggernaut_arcana_mask_a.vmdl_c differ diff --git a/models/items/juggernaut/arcana/juggernaut_arcana_mask_a.vmesh_c b/models/items/juggernaut/arcana/juggernaut_arcana_mask_a.vmesh_c new file mode 100755 index 0000000..f98c697 Binary files /dev/null and b/models/items/juggernaut/arcana/juggernaut_arcana_mask_a.vmesh_c differ diff --git a/models/items/juggernaut/arcana/juggernaut_arcana_mask_b.vmdl_c b/models/items/juggernaut/arcana/juggernaut_arcana_mask_b.vmdl_c new file mode 100755 index 0000000..f172a44 Binary files /dev/null and b/models/items/juggernaut/arcana/juggernaut_arcana_mask_b.vmdl_c differ diff --git a/models/items/juggernaut/arcana/juggernaut_arcana_mask_b.vmesh_c b/models/items/juggernaut/arcana/juggernaut_arcana_mask_b.vmesh_c new file mode 100755 index 0000000..e7830b8 Binary files /dev/null and b/models/items/juggernaut/arcana/juggernaut_arcana_mask_b.vmesh_c differ diff --git a/models/items/juggernaut/arcana/juggernaut_arcana_mask_c.vmdl_c b/models/items/juggernaut/arcana/juggernaut_arcana_mask_c.vmdl_c new file mode 100755 index 0000000..fd1c78a Binary files /dev/null and b/models/items/juggernaut/arcana/juggernaut_arcana_mask_c.vmdl_c differ diff --git a/models/items/juggernaut/arcana/juggernaut_arcana_mask_c.vmesh_c b/models/items/juggernaut/arcana/juggernaut_arcana_mask_c.vmesh_c new file mode 100755 index 0000000..8f640d6 Binary files /dev/null and b/models/items/juggernaut/arcana/juggernaut_arcana_mask_c.vmesh_c differ diff --git a/models/items/juggernaut/hg_6cda6949.vmesh_c b/models/items/juggernaut/hg_6cda6949.vmesh_c new file mode 100755 index 0000000..9cfbb88 Binary files /dev/null and b/models/items/juggernaut/hg_6cda6949.vmesh_c differ diff --git a/models/items/juggernaut/ward/dc_wardupate/0415277e/hg_death.vanim_c b/models/items/juggernaut/ward/dc_wardupate/0415277e/hg_death.vanim_c new file mode 100755 index 0000000..3f094c3 Binary files /dev/null and b/models/items/juggernaut/ward/dc_wardupate/0415277e/hg_death.vanim_c differ diff --git a/models/items/juggernaut/ward/dc_wardupate/0415277e/hg_idle.vanim_c b/models/items/juggernaut/ward/dc_wardupate/0415277e/hg_idle.vanim_c new file mode 100755 index 0000000..1c82de4 Binary files /dev/null and b/models/items/juggernaut/ward/dc_wardupate/0415277e/hg_idle.vanim_c differ diff --git a/models/items/juggernaut/ward/dc_wardupate/0415277e/hg_run.vanim_c b/models/items/juggernaut/ward/dc_wardupate/0415277e/hg_run.vanim_c new file mode 100755 index 0000000..06dbb18 Binary files /dev/null and b/models/items/juggernaut/ward/dc_wardupate/0415277e/hg_run.vanim_c differ diff --git a/models/items/juggernaut/ward/dc_wardupate/0415277e/hg_spawn.vanim_c b/models/items/juggernaut/ward/dc_wardupate/0415277e/hg_spawn.vanim_c new file mode 100755 index 0000000..446f6b6 Binary files /dev/null and b/models/items/juggernaut/ward/dc_wardupate/0415277e/hg_spawn.vanim_c differ diff --git a/models/items/juggernaut/ward/dc_wardupate/dc_wardupate.vmdl_c b/models/items/juggernaut/ward/dc_wardupate/dc_wardupate.vmdl_c new file mode 100755 index 0000000..7273bf5 Binary files /dev/null and b/models/items/juggernaut/ward/dc_wardupate/dc_wardupate.vmdl_c differ diff --git a/models/items/juggernaut/ward/dc_wardupate/dc_wardupate_0415277e.vagrp_c b/models/items/juggernaut/ward/dc_wardupate/dc_wardupate_0415277e.vagrp_c new file mode 100755 index 0000000..cc4e6a4 Binary files /dev/null and b/models/items/juggernaut/ward/dc_wardupate/dc_wardupate_0415277e.vagrp_c differ diff --git a/models/items/juggernaut/ward/dc_wardupate/hg_8df6ea6c.vmesh_c b/models/items/juggernaut/ward/dc_wardupate/hg_8df6ea6c.vmesh_c new file mode 100755 index 0000000..9cfbb88 Binary files /dev/null and b/models/items/juggernaut/ward/dc_wardupate/hg_8df6ea6c.vmesh_c differ diff --git a/models/items/juggernaut/ward/fortunes_tout/d6908e54/hg_death.vanim_c b/models/items/juggernaut/ward/fortunes_tout/d6908e54/hg_death.vanim_c new file mode 100755 index 0000000..3f094c3 Binary files /dev/null and b/models/items/juggernaut/ward/fortunes_tout/d6908e54/hg_death.vanim_c differ diff --git a/models/items/juggernaut/ward/fortunes_tout/d6908e54/hg_idle.vanim_c b/models/items/juggernaut/ward/fortunes_tout/d6908e54/hg_idle.vanim_c new file mode 100755 index 0000000..1c82de4 Binary files /dev/null and b/models/items/juggernaut/ward/fortunes_tout/d6908e54/hg_idle.vanim_c differ diff --git a/models/items/juggernaut/ward/fortunes_tout/d6908e54/hg_run.vanim_c b/models/items/juggernaut/ward/fortunes_tout/d6908e54/hg_run.vanim_c new file mode 100755 index 0000000..06dbb18 Binary files /dev/null and b/models/items/juggernaut/ward/fortunes_tout/d6908e54/hg_run.vanim_c differ diff --git a/models/items/juggernaut/ward/fortunes_tout/d6908e54/hg_spawn.vanim_c b/models/items/juggernaut/ward/fortunes_tout/d6908e54/hg_spawn.vanim_c new file mode 100755 index 0000000..446f6b6 Binary files /dev/null and b/models/items/juggernaut/ward/fortunes_tout/d6908e54/hg_spawn.vanim_c differ diff --git a/models/items/juggernaut/ward/fortunes_tout/fortunes_tout.vmdl_c b/models/items/juggernaut/ward/fortunes_tout/fortunes_tout.vmdl_c new file mode 100755 index 0000000..ebe72a1 Binary files /dev/null and b/models/items/juggernaut/ward/fortunes_tout/fortunes_tout.vmdl_c differ diff --git a/models/items/juggernaut/ward/fortunes_tout/fortunes_tout_d6908e54.vagrp_c b/models/items/juggernaut/ward/fortunes_tout/fortunes_tout_d6908e54.vagrp_c new file mode 100755 index 0000000..e90bd51 Binary files /dev/null and b/models/items/juggernaut/ward/fortunes_tout/fortunes_tout_d6908e54.vagrp_c differ diff --git a/models/items/juggernaut/ward/fortunes_tout/hg_e55b95f0.vmesh_c b/models/items/juggernaut/ward/fortunes_tout/hg_e55b95f0.vmesh_c new file mode 100755 index 0000000..9cfbb88 Binary files /dev/null and b/models/items/juggernaut/ward/fortunes_tout/hg_e55b95f0.vmesh_c differ diff --git a/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/6418fa2b/hg_death.vanim_c b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/6418fa2b/hg_death.vanim_c new file mode 100755 index 0000000..3f094c3 Binary files /dev/null and b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/6418fa2b/hg_death.vanim_c differ diff --git a/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/6418fa2b/hg_idle.vanim_c b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/6418fa2b/hg_idle.vanim_c new file mode 100755 index 0000000..1c82de4 Binary files /dev/null and b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/6418fa2b/hg_idle.vanim_c differ diff --git a/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/6418fa2b/hg_run.vanim_c b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/6418fa2b/hg_run.vanim_c new file mode 100755 index 0000000..06dbb18 Binary files /dev/null and b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/6418fa2b/hg_run.vanim_c differ diff --git a/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/6418fa2b/hg_spawn.vanim_c b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/6418fa2b/hg_spawn.vanim_c new file mode 100755 index 0000000..446f6b6 Binary files /dev/null and b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/6418fa2b/hg_spawn.vanim_c differ diff --git a/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/frostivus2018_jugg_northern_wanderer_ward.vmdl_c b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/frostivus2018_jugg_northern_wanderer_ward.vmdl_c new file mode 100755 index 0000000..f1ed660 Binary files /dev/null and b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/frostivus2018_jugg_northern_wanderer_ward.vmdl_c differ diff --git a/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/frostivus2018_jugg_northern_wanderer_ward_6418fa2b.vagrp_c b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/frostivus2018_jugg_northern_wanderer_ward_6418fa2b.vagrp_c new file mode 100755 index 0000000..08ff9e4 Binary files /dev/null and b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/frostivus2018_jugg_northern_wanderer_ward_6418fa2b.vagrp_c differ diff --git a/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/hg_9f4305d7.vmesh_c b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/hg_9f4305d7.vmesh_c new file mode 100755 index 0000000..9cfbb88 Binary files /dev/null and b/models/items/juggernaut/ward/frostivus2018_jugg_northern_wanderer_ward/hg_9f4305d7.vmesh_c differ diff --git a/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/cabc212c/hg_death.vanim_c b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/cabc212c/hg_death.vanim_c new file mode 100755 index 0000000..3f094c3 Binary files /dev/null and b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/cabc212c/hg_death.vanim_c differ diff --git a/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/cabc212c/hg_idle.vanim_c b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/cabc212c/hg_idle.vanim_c new file mode 100755 index 0000000..1c82de4 Binary files /dev/null and b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/cabc212c/hg_idle.vanim_c differ diff --git a/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/cabc212c/hg_run.vanim_c b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/cabc212c/hg_run.vanim_c new file mode 100755 index 0000000..06dbb18 Binary files /dev/null and b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/cabc212c/hg_run.vanim_c differ diff --git a/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/cabc212c/hg_spawn.vanim_c b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/cabc212c/hg_spawn.vanim_c new file mode 100755 index 0000000..446f6b6 Binary files /dev/null and b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/cabc212c/hg_spawn.vanim_c differ diff --git a/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/healing_gills_of_the_lost_isles.vmdl_c b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/healing_gills_of_the_lost_isles.vmdl_c new file mode 100755 index 0000000..a4de119 Binary files /dev/null and b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/healing_gills_of_the_lost_isles.vmdl_c differ diff --git a/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/healing_gills_of_the_lost_isles_cabc212c.vagrp_c b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/healing_gills_of_the_lost_isles_cabc212c.vagrp_c new file mode 100755 index 0000000..2948e9d Binary files /dev/null and b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/healing_gills_of_the_lost_isles_cabc212c.vagrp_c differ diff --git a/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/hg_0977293f.vmesh_c b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/hg_0977293f.vmesh_c new file mode 100755 index 0000000..9cfbb88 Binary files /dev/null and b/models/items/juggernaut/ward/healing_gills_of_the_lost_isles/hg_0977293f.vmesh_c differ diff --git a/models/items/juggernaut/ward_foo.vmdl_c b/models/items/juggernaut/ward_foo.vmdl_c new file mode 100755 index 0000000..d4fdb50 Binary files /dev/null and b/models/items/juggernaut/ward_foo.vmdl_c differ diff --git a/models/items/juggernaut/ward_foo_5e7c8e71.vagrp_c b/models/items/juggernaut/ward_foo_5e7c8e71.vagrp_c new file mode 100755 index 0000000..1203512 Binary files /dev/null and b/models/items/juggernaut/ward_foo_5e7c8e71.vagrp_c differ diff --git a/models/kokoro/4f25baf6/attack1.vanim_c b/models/kokoro/4f25baf6/attack1.vanim_c new file mode 100755 index 0000000..37ed873 Binary files /dev/null and b/models/kokoro/4f25baf6/attack1.vanim_c differ diff --git a/models/kokoro/4f25baf6/attack2.vanim_c b/models/kokoro/4f25baf6/attack2.vanim_c new file mode 100755 index 0000000..95e9455 Binary files /dev/null and b/models/kokoro/4f25baf6/attack2.vanim_c differ diff --git a/models/kokoro/4f25baf6/attack3.vanim_c b/models/kokoro/4f25baf6/attack3.vanim_c new file mode 100755 index 0000000..c47bfaf Binary files /dev/null and b/models/kokoro/4f25baf6/attack3.vanim_c differ diff --git a/models/kokoro/4f25baf6/attack4.vanim_c b/models/kokoro/4f25baf6/attack4.vanim_c new file mode 100755 index 0000000..edcf343 Binary files /dev/null and b/models/kokoro/4f25baf6/attack4.vanim_c differ diff --git a/models/kokoro/4f25baf6/attack5.vanim_c b/models/kokoro/4f25baf6/attack5.vanim_c new file mode 100755 index 0000000..1cc15b6 Binary files /dev/null and b/models/kokoro/4f25baf6/attack5.vanim_c differ diff --git a/models/kokoro/4f25baf6/attack6.vanim_c b/models/kokoro/4f25baf6/attack6.vanim_c new file mode 100755 index 0000000..2c8dba6 Binary files /dev/null and b/models/kokoro/4f25baf6/attack6.vanim_c differ diff --git a/models/kokoro/4f25baf6/cast1.vanim_c b/models/kokoro/4f25baf6/cast1.vanim_c new file mode 100755 index 0000000..5ce133f Binary files /dev/null and b/models/kokoro/4f25baf6/cast1.vanim_c differ diff --git a/models/kokoro/4f25baf6/death1.vanim_c b/models/kokoro/4f25baf6/death1.vanim_c new file mode 100755 index 0000000..d61d330 Binary files /dev/null and b/models/kokoro/4f25baf6/death1.vanim_c differ diff --git a/models/kokoro/4f25baf6/fan_attack1.vanim_c b/models/kokoro/4f25baf6/fan_attack1.vanim_c new file mode 100755 index 0000000..e1ca474 Binary files /dev/null and b/models/kokoro/4f25baf6/fan_attack1.vanim_c differ diff --git a/models/kokoro/4f25baf6/flail1.vanim_c b/models/kokoro/4f25baf6/flail1.vanim_c new file mode 100755 index 0000000..f339cc5 Binary files /dev/null and b/models/kokoro/4f25baf6/flail1.vanim_c differ diff --git a/models/kokoro/4f25baf6/idie1.vanim_c b/models/kokoro/4f25baf6/idie1.vanim_c new file mode 100755 index 0000000..07db349 Binary files /dev/null and b/models/kokoro/4f25baf6/idie1.vanim_c differ diff --git a/models/kokoro/4f25baf6/mask_change1.vanim_c b/models/kokoro/4f25baf6/mask_change1.vanim_c new file mode 100755 index 0000000..181f346 Binary files /dev/null and b/models/kokoro/4f25baf6/mask_change1.vanim_c differ diff --git a/models/kokoro/4f25baf6/run1.vanim_c b/models/kokoro/4f25baf6/run1.vanim_c new file mode 100755 index 0000000..3322cd1 Binary files /dev/null and b/models/kokoro/4f25baf6/run1.vanim_c differ diff --git a/models/kokoro/4f25baf6/stun1.vanim_c b/models/kokoro/4f25baf6/stun1.vanim_c new file mode 100755 index 0000000..68b5794 Binary files /dev/null and b/models/kokoro/4f25baf6/stun1.vanim_c differ diff --git a/models/kokoro/4f25baf6/tp1.vanim_c b/models/kokoro/4f25baf6/tp1.vanim_c new file mode 100755 index 0000000..0207644 Binary files /dev/null and b/models/kokoro/4f25baf6/tp1.vanim_c differ diff --git a/models/kokoro/4f25baf6/victory1.vanim_c b/models/kokoro/4f25baf6/victory1.vanim_c new file mode 100755 index 0000000..3641dda Binary files /dev/null and b/models/kokoro/4f25baf6/victory1.vanim_c differ diff --git a/models/kokoro/4f25baf6/wudizhan1.vanim_c b/models/kokoro/4f25baf6/wudizhan1.vanim_c new file mode 100755 index 0000000..cf001e7 Binary files /dev/null and b/models/kokoro/4f25baf6/wudizhan1.vanim_c differ diff --git a/models/kokoro/4f25baf6/wudizhan_begin1.vanim_c b/models/kokoro/4f25baf6/wudizhan_begin1.vanim_c new file mode 100755 index 0000000..c507195 Binary files /dev/null and b/models/kokoro/4f25baf6/wudizhan_begin1.vanim_c differ diff --git a/models/kokoro/kokoro.fbm/bluebow.vmat_c b/models/kokoro/kokoro.fbm/bluebow.vmat_c new file mode 100755 index 0000000..e2c2130 Binary files /dev/null and b/models/kokoro/kokoro.fbm/bluebow.vmat_c differ diff --git a/models/kokoro/kokoro.fbm/bluebow_tga_9958b2c1.vtex_c b/models/kokoro/kokoro.fbm/bluebow_tga_9958b2c1.vtex_c new file mode 100755 index 0000000..fe0b0ae Binary files /dev/null and b/models/kokoro/kokoro.fbm/bluebow_tga_9958b2c1.vtex_c differ diff --git a/models/kokoro/kokoro.fbm/body.vmat_c b/models/kokoro/kokoro.fbm/body.vmat_c new file mode 100755 index 0000000..e9b3f5a Binary files /dev/null and b/models/kokoro/kokoro.fbm/body.vmat_c differ diff --git a/models/kokoro/kokoro.fbm/body_tga_d27ee894.vtex_c b/models/kokoro/kokoro.fbm/body_tga_d27ee894.vtex_c new file mode 100755 index 0000000..1864f39 Binary files /dev/null and b/models/kokoro/kokoro.fbm/body_tga_d27ee894.vtex_c differ diff --git a/models/kokoro/kokoro.fbm/cloth.vmat_c b/models/kokoro/kokoro.fbm/cloth.vmat_c new file mode 100755 index 0000000..aefed65 Binary files /dev/null and b/models/kokoro/kokoro.fbm/cloth.vmat_c differ diff --git a/models/kokoro/kokoro.fbm/cloth_tga_53a5f8ca.vtex_c b/models/kokoro/kokoro.fbm/cloth_tga_53a5f8ca.vtex_c new file mode 100755 index 0000000..4b6e284 Binary files /dev/null and b/models/kokoro/kokoro.fbm/cloth_tga_53a5f8ca.vtex_c differ diff --git a/models/kokoro/kokoro.fbm/face.vmat_c b/models/kokoro/kokoro.fbm/face.vmat_c new file mode 100755 index 0000000..883f404 Binary files /dev/null and b/models/kokoro/kokoro.fbm/face.vmat_c differ diff --git a/models/kokoro/kokoro.fbm/face_tga_d5d47217.vtex_c b/models/kokoro/kokoro.fbm/face_tga_d5d47217.vtex_c new file mode 100755 index 0000000..fc4818a Binary files /dev/null and b/models/kokoro/kokoro.fbm/face_tga_d5d47217.vtex_c differ diff --git a/models/kokoro/kokoro.fbm/hair.vmat_c b/models/kokoro/kokoro.fbm/hair.vmat_c new file mode 100755 index 0000000..bb782e0 Binary files /dev/null and b/models/kokoro/kokoro.fbm/hair.vmat_c differ diff --git a/models/kokoro/kokoro.fbm/hair_tga_d614128e.vtex_c b/models/kokoro/kokoro.fbm/hair_tga_d614128e.vtex_c new file mode 100755 index 0000000..a2396d3 Binary files /dev/null and b/models/kokoro/kokoro.fbm/hair_tga_d614128e.vtex_c differ diff --git a/models/kokoro/kokoro.fbm/naginata.vmat_c b/models/kokoro/kokoro.fbm/naginata.vmat_c new file mode 100755 index 0000000..3323eed Binary files /dev/null and b/models/kokoro/kokoro.fbm/naginata.vmat_c differ diff --git a/models/kokoro/kokoro.fbm/naginata_tga_80de1964.vtex_c b/models/kokoro/kokoro.fbm/naginata_tga_80de1964.vtex_c new file mode 100755 index 0000000..4096628 Binary files /dev/null and b/models/kokoro/kokoro.fbm/naginata_tga_80de1964.vtex_c differ diff --git a/models/kokoro/kokoro.fbm/pinkbow.vmat_c b/models/kokoro/kokoro.fbm/pinkbow.vmat_c new file mode 100755 index 0000000..981d5fe Binary files /dev/null and b/models/kokoro/kokoro.fbm/pinkbow.vmat_c differ diff --git a/models/kokoro/kokoro.fbm/pinkbow_tga_5cc830df.vtex_c b/models/kokoro/kokoro.fbm/pinkbow_tga_5cc830df.vtex_c new file mode 100755 index 0000000..51bc37f Binary files /dev/null and b/models/kokoro/kokoro.fbm/pinkbow_tga_5cc830df.vtex_c differ diff --git a/models/kokoro/kokoro.fbm/underwear.vmat_c b/models/kokoro/kokoro.fbm/underwear.vmat_c new file mode 100755 index 0000000..966b1b3 Binary files /dev/null and b/models/kokoro/kokoro.fbm/underwear.vmat_c differ diff --git a/models/kokoro/kokoro.fbm/underwear_tga_5851bdd3.vtex_c b/models/kokoro/kokoro.fbm/underwear_tga_5851bdd3.vtex_c new file mode 100755 index 0000000..7699479 Binary files /dev/null and b/models/kokoro/kokoro.fbm/underwear_tga_5851bdd3.vtex_c differ diff --git a/models/kokoro/kokoro.vmdl_c b/models/kokoro/kokoro.vmdl_c new file mode 100755 index 0000000..548c7d2 Binary files /dev/null and b/models/kokoro/kokoro.vmdl_c differ diff --git a/models/kokoro/kokoro_3ce293f7.vmesh_c b/models/kokoro/kokoro_3ce293f7.vmesh_c new file mode 100755 index 0000000..b696343 Binary files /dev/null and b/models/kokoro/kokoro_3ce293f7.vmesh_c differ diff --git a/models/kokoro/kokoro_4f25baf6.vagrp_c b/models/kokoro/kokoro_4f25baf6.vagrp_c new file mode 100755 index 0000000..059ed5a Binary files /dev/null and b/models/kokoro/kokoro_4f25baf6.vagrp_c differ diff --git a/models/komachi/7c18e388/komachi_attack.vanim_c b/models/komachi/7c18e388/komachi_attack.vanim_c new file mode 100755 index 0000000..2ac9256 Binary files /dev/null and b/models/komachi/7c18e388/komachi_attack.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_attack1.vanim_c b/models/komachi/7c18e388/komachi_attack1.vanim_c new file mode 100755 index 0000000..99ab4c8 Binary files /dev/null and b/models/komachi/7c18e388/komachi_attack1.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_attack2.vanim_c b/models/komachi/7c18e388/komachi_attack2.vanim_c new file mode 100755 index 0000000..9a50ed2 Binary files /dev/null and b/models/komachi/7c18e388/komachi_attack2.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_cast1.vanim_c b/models/komachi/7c18e388/komachi_cast1.vanim_c new file mode 100755 index 0000000..ef1cfe2 Binary files /dev/null and b/models/komachi/7c18e388/komachi_cast1.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_cast2.vanim_c b/models/komachi/7c18e388/komachi_cast2.vanim_c new file mode 100755 index 0000000..aa457a1 Binary files /dev/null and b/models/komachi/7c18e388/komachi_cast2.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_cast2_copy.vanim_c b/models/komachi/7c18e388/komachi_cast2_copy.vanim_c new file mode 100755 index 0000000..2768c54 Binary files /dev/null and b/models/komachi/7c18e388/komachi_cast2_copy.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_cast3.vanim_c b/models/komachi/7c18e388/komachi_cast3.vanim_c new file mode 100755 index 0000000..67a4dcb Binary files /dev/null and b/models/komachi/7c18e388/komachi_cast3.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_cast4.vanim_c b/models/komachi/7c18e388/komachi_cast4.vanim_c new file mode 100755 index 0000000..3b833f8 Binary files /dev/null and b/models/komachi/7c18e388/komachi_cast4.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_die.vanim_c b/models/komachi/7c18e388/komachi_die.vanim_c new file mode 100755 index 0000000..cbe01e0 Binary files /dev/null and b/models/komachi/7c18e388/komachi_die.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_disabled.vanim_c b/models/komachi/7c18e388/komachi_disabled.vanim_c new file mode 100755 index 0000000..98f93bb Binary files /dev/null and b/models/komachi/7c18e388/komachi_disabled.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_idle.vanim_c b/models/komachi/7c18e388/komachi_idle.vanim_c new file mode 100755 index 0000000..f4da509 Binary files /dev/null and b/models/komachi/7c18e388/komachi_idle.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_por.vanim_c b/models/komachi/7c18e388/komachi_por.vanim_c new file mode 100755 index 0000000..c42349a Binary files /dev/null and b/models/komachi/7c18e388/komachi_por.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_run.vanim_c b/models/komachi/7c18e388/komachi_run.vanim_c new file mode 100755 index 0000000..c307931 Binary files /dev/null and b/models/komachi/7c18e388/komachi_run.vanim_c differ diff --git a/models/komachi/7c18e388/komachi_run2.vanim_c b/models/komachi/7c18e388/komachi_run2.vanim_c new file mode 100755 index 0000000..99c2403 Binary files /dev/null and b/models/komachi/7c18e388/komachi_run2.vanim_c differ diff --git a/models/komachi/komachi.vmdl_c b/models/komachi/komachi.vmdl_c new file mode 100755 index 0000000..ab3e9b0 Binary files /dev/null and b/models/komachi/komachi.vmdl_c differ diff --git a/models/komachi/komachi.vmesh_c b/models/komachi/komachi.vmesh_c new file mode 100755 index 0000000..8c123f4 Binary files /dev/null and b/models/komachi/komachi.vmesh_c differ diff --git a/models/komachi/komachi.vmorf_c b/models/komachi/komachi.vmorf_c new file mode 100755 index 0000000..16891ae Binary files /dev/null and b/models/komachi/komachi.vmorf_c differ diff --git a/models/komachi/komachi_7c18e388.vagrp_c b/models/komachi/komachi_7c18e388.vagrp_c new file mode 100755 index 0000000..860bf16 Binary files /dev/null and b/models/komachi/komachi_7c18e388.vagrp_c differ diff --git a/models/komachi/komachi_vmorf.vtex_c b/models/komachi/komachi_vmorf.vtex_c new file mode 100755 index 0000000..fab8015 Binary files /dev/null and b/models/komachi/komachi_vmorf.vtex_c differ diff --git a/models/medicine/67868622/medicine.vanim_c b/models/medicine/67868622/medicine.vanim_c new file mode 100755 index 0000000..122b6df Binary files /dev/null and b/models/medicine/67868622/medicine.vanim_c differ diff --git a/models/medicine/67868622/medicine_attack1.vanim_c b/models/medicine/67868622/medicine_attack1.vanim_c new file mode 100755 index 0000000..0ff5ce5 Binary files /dev/null and b/models/medicine/67868622/medicine_attack1.vanim_c differ diff --git a/models/medicine/67868622/medicine_attack2.vanim_c b/models/medicine/67868622/medicine_attack2.vanim_c new file mode 100755 index 0000000..42dd5ad Binary files /dev/null and b/models/medicine/67868622/medicine_attack2.vanim_c differ diff --git a/models/medicine/67868622/medicine_cast2.vanim_c b/models/medicine/67868622/medicine_cast2.vanim_c new file mode 100755 index 0000000..e68c51b Binary files /dev/null and b/models/medicine/67868622/medicine_cast2.vanim_c differ diff --git a/models/medicine/67868622/medicine_cast4.vanim_c b/models/medicine/67868622/medicine_cast4.vanim_c new file mode 100755 index 0000000..46de353 Binary files /dev/null and b/models/medicine/67868622/medicine_cast4.vanim_c differ diff --git a/models/medicine/67868622/medicine_die.vanim_c b/models/medicine/67868622/medicine_die.vanim_c new file mode 100755 index 0000000..be73060 Binary files /dev/null and b/models/medicine/67868622/medicine_die.vanim_c differ diff --git a/models/medicine/67868622/medicine_disabled.vanim_c b/models/medicine/67868622/medicine_disabled.vanim_c new file mode 100755 index 0000000..71b203c Binary files /dev/null and b/models/medicine/67868622/medicine_disabled.vanim_c differ diff --git a/models/medicine/67868622/medicine_idle.vanim_c b/models/medicine/67868622/medicine_idle.vanim_c new file mode 100755 index 0000000..04feb42 Binary files /dev/null and b/models/medicine/67868622/medicine_idle.vanim_c differ diff --git a/models/medicine/67868622/medicine_por.vanim_c b/models/medicine/67868622/medicine_por.vanim_c new file mode 100755 index 0000000..45fe45a Binary files /dev/null and b/models/medicine/67868622/medicine_por.vanim_c differ diff --git a/models/medicine/67868622/medicine_run.vanim_c b/models/medicine/67868622/medicine_run.vanim_c new file mode 100755 index 0000000..15d0610 Binary files /dev/null and b/models/medicine/67868622/medicine_run.vanim_c differ diff --git a/models/medicine/904f66ba/linglanrenou.vanim_c b/models/medicine/904f66ba/linglanrenou.vanim_c new file mode 100755 index 0000000..fab20d7 Binary files /dev/null and b/models/medicine/904f66ba/linglanrenou.vanim_c differ diff --git a/models/medicine/904f66ba/linglanrenou_die.vanim_c b/models/medicine/904f66ba/linglanrenou_die.vanim_c new file mode 100755 index 0000000..2ba5daa Binary files /dev/null and b/models/medicine/904f66ba/linglanrenou_die.vanim_c differ diff --git a/models/medicine/904f66ba/linglanrenou_idle.vanim_c b/models/medicine/904f66ba/linglanrenou_idle.vanim_c new file mode 100755 index 0000000..a2f1bc0 Binary files /dev/null and b/models/medicine/904f66ba/linglanrenou_idle.vanim_c differ diff --git a/models/medicine/linglanrenou.vmdl_c b/models/medicine/linglanrenou.vmdl_c new file mode 100755 index 0000000..babd99d Binary files /dev/null and b/models/medicine/linglanrenou.vmdl_c differ diff --git a/models/medicine/linglanrenou.vmesh_c b/models/medicine/linglanrenou.vmesh_c new file mode 100755 index 0000000..5dbcf30 Binary files /dev/null and b/models/medicine/linglanrenou.vmesh_c differ diff --git a/models/medicine/linglanrenou.vmorf_c b/models/medicine/linglanrenou.vmorf_c new file mode 100755 index 0000000..91fdb5b Binary files /dev/null and b/models/medicine/linglanrenou.vmorf_c differ diff --git a/models/medicine/linglanrenou_904f66ba.vagrp_c b/models/medicine/linglanrenou_904f66ba.vagrp_c new file mode 100755 index 0000000..7893888 Binary files /dev/null and b/models/medicine/linglanrenou_904f66ba.vagrp_c differ diff --git a/models/medicine/linglanrenou_vmorf.vtex_c b/models/medicine/linglanrenou_vmorf.vtex_c new file mode 100755 index 0000000..4c9f8c7 Binary files /dev/null and b/models/medicine/linglanrenou_vmorf.vtex_c differ diff --git a/models/medicine/medicine.vmdl_c b/models/medicine/medicine.vmdl_c new file mode 100755 index 0000000..8d6b7b2 Binary files /dev/null and b/models/medicine/medicine.vmdl_c differ diff --git a/models/medicine/medicine.vmesh_c b/models/medicine/medicine.vmesh_c new file mode 100755 index 0000000..c8f4217 Binary files /dev/null and b/models/medicine/medicine.vmesh_c differ diff --git a/models/medicine/medicine.vmorf_c b/models/medicine/medicine.vmorf_c new file mode 100755 index 0000000..30b46b6 Binary files /dev/null and b/models/medicine/medicine.vmorf_c differ diff --git a/models/medicine/medicine_67868622.vagrp_c b/models/medicine/medicine_67868622.vagrp_c new file mode 100755 index 0000000..aa5196e Binary files /dev/null and b/models/medicine/medicine_67868622.vagrp_c differ diff --git a/models/medicine/medicine_vmorf.vtex_c b/models/medicine/medicine_vmorf.vtex_c new file mode 100755 index 0000000..0ea18a2 Binary files /dev/null and b/models/medicine/medicine_vmorf.vtex_c differ diff --git a/models/new_touhou_model/aya/aya.vmdl_c b/models/new_touhou_model/aya/aya.vmdl_c new file mode 100755 index 0000000..a8a997f Binary files /dev/null and b/models/new_touhou_model/aya/aya.vmdl_c differ diff --git a/models/new_touhou_model/aya/aya.vmesh_c b/models/new_touhou_model/aya/aya.vmesh_c new file mode 100755 index 0000000..4d41846 Binary files /dev/null and b/models/new_touhou_model/aya/aya.vmesh_c differ diff --git a/models/new_touhou_model/aya/aya_e61a3819.vagrp_c b/models/new_touhou_model/aya/aya_e61a3819.vagrp_c new file mode 100755 index 0000000..bc4c925 Binary files /dev/null and b/models/new_touhou_model/aya/aya_e61a3819.vagrp_c differ diff --git a/models/new_touhou_model/aya/aya_wing.vmdl_c b/models/new_touhou_model/aya/aya_wing.vmdl_c new file mode 100755 index 0000000..5930bcc Binary files /dev/null and b/models/new_touhou_model/aya/aya_wing.vmdl_c differ diff --git a/models/new_touhou_model/aya/aya_wing.vmesh_c b/models/new_touhou_model/aya/aya_wing.vmesh_c new file mode 100755 index 0000000..58697a1 Binary files /dev/null and b/models/new_touhou_model/aya/aya_wing.vmesh_c differ diff --git a/models/new_touhou_model/aya/e61a3819/aya.vanim_c b/models/new_touhou_model/aya/e61a3819/aya.vanim_c new file mode 100755 index 0000000..e626844 Binary files /dev/null and b/models/new_touhou_model/aya/e61a3819/aya.vanim_c differ diff --git a/models/new_touhou_model/aya/e61a3819/aya_attack1.vanim_c b/models/new_touhou_model/aya/e61a3819/aya_attack1.vanim_c new file mode 100755 index 0000000..f3efa29 Binary files /dev/null and b/models/new_touhou_model/aya/e61a3819/aya_attack1.vanim_c differ diff --git a/models/new_touhou_model/aya/e61a3819/aya_attack2.vanim_c b/models/new_touhou_model/aya/e61a3819/aya_attack2.vanim_c new file mode 100755 index 0000000..2afed09 Binary files /dev/null and b/models/new_touhou_model/aya/e61a3819/aya_attack2.vanim_c differ diff --git a/models/new_touhou_model/aya/e61a3819/aya_cast1.vanim_c b/models/new_touhou_model/aya/e61a3819/aya_cast1.vanim_c new file mode 100755 index 0000000..2efbb8a Binary files /dev/null and b/models/new_touhou_model/aya/e61a3819/aya_cast1.vanim_c differ diff --git a/models/new_touhou_model/aya/e61a3819/aya_cast2.vanim_c b/models/new_touhou_model/aya/e61a3819/aya_cast2.vanim_c new file mode 100755 index 0000000..7633411 Binary files /dev/null and b/models/new_touhou_model/aya/e61a3819/aya_cast2.vanim_c differ diff --git a/models/new_touhou_model/aya/e61a3819/aya_cast3.vanim_c b/models/new_touhou_model/aya/e61a3819/aya_cast3.vanim_c new file mode 100755 index 0000000..e4968a6 Binary files /dev/null and b/models/new_touhou_model/aya/e61a3819/aya_cast3.vanim_c differ diff --git a/models/new_touhou_model/aya/e61a3819/aya_cast4.vanim_c b/models/new_touhou_model/aya/e61a3819/aya_cast4.vanim_c new file mode 100755 index 0000000..c190f4b Binary files /dev/null and b/models/new_touhou_model/aya/e61a3819/aya_cast4.vanim_c differ diff --git a/models/new_touhou_model/aya/e61a3819/aya_idle.vanim_c b/models/new_touhou_model/aya/e61a3819/aya_idle.vanim_c new file mode 100755 index 0000000..01296a1 Binary files /dev/null and b/models/new_touhou_model/aya/e61a3819/aya_idle.vanim_c differ diff --git a/models/new_touhou_model/cirno/cirno.vmdl_c b/models/new_touhou_model/cirno/cirno.vmdl_c new file mode 100755 index 0000000..f90ceec Binary files /dev/null and b/models/new_touhou_model/cirno/cirno.vmdl_c differ diff --git a/models/new_touhou_model/cirno/cirno.vmesh_c b/models/new_touhou_model/cirno/cirno.vmesh_c new file mode 100755 index 0000000..35ae50a Binary files /dev/null and b/models/new_touhou_model/cirno/cirno.vmesh_c differ diff --git a/models/new_touhou_model/cirno/cirno_e22ed6f2.vagrp_c b/models/new_touhou_model/cirno/cirno_e22ed6f2.vagrp_c new file mode 100755 index 0000000..6ea10cc Binary files /dev/null and b/models/new_touhou_model/cirno/cirno_e22ed6f2.vagrp_c differ diff --git a/models/new_touhou_model/cirno/e22ed6f2/cirno.vanim_c b/models/new_touhou_model/cirno/e22ed6f2/cirno.vanim_c new file mode 100755 index 0000000..c5bab33 Binary files /dev/null and b/models/new_touhou_model/cirno/e22ed6f2/cirno.vanim_c differ diff --git a/models/new_touhou_model/cirno/e22ed6f2/cirno_attack1.vanim_c b/models/new_touhou_model/cirno/e22ed6f2/cirno_attack1.vanim_c new file mode 100755 index 0000000..45c6dd9 Binary files /dev/null and b/models/new_touhou_model/cirno/e22ed6f2/cirno_attack1.vanim_c differ diff --git a/models/new_touhou_model/cirno/e22ed6f2/cirno_attack2.vanim_c b/models/new_touhou_model/cirno/e22ed6f2/cirno_attack2.vanim_c new file mode 100755 index 0000000..7a0be74 Binary files /dev/null and b/models/new_touhou_model/cirno/e22ed6f2/cirno_attack2.vanim_c differ diff --git a/models/new_touhou_model/cirno/e22ed6f2/cirno_cast2.vanim_c b/models/new_touhou_model/cirno/e22ed6f2/cirno_cast2.vanim_c new file mode 100755 index 0000000..4f85fcc Binary files /dev/null and b/models/new_touhou_model/cirno/e22ed6f2/cirno_cast2.vanim_c differ diff --git a/models/new_touhou_model/cirno/e22ed6f2/cirno_idle.vanim_c b/models/new_touhou_model/cirno/e22ed6f2/cirno_idle.vanim_c new file mode 100755 index 0000000..f21ac2a Binary files /dev/null and b/models/new_touhou_model/cirno/e22ed6f2/cirno_idle.vanim_c differ diff --git a/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno.vanim_c b/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno.vanim_c new file mode 100755 index 0000000..a9f7f35 Binary files /dev/null and b/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno.vanim_c differ diff --git a/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno_attack1.vanim_c b/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno_attack1.vanim_c new file mode 100755 index 0000000..b931619 Binary files /dev/null and b/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno_attack1.vanim_c differ diff --git a/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno_attack2.vanim_c b/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno_attack2.vanim_c new file mode 100755 index 0000000..c378453 Binary files /dev/null and b/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno_attack2.vanim_c differ diff --git a/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno_cast.vanim_c b/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno_cast.vanim_c new file mode 100755 index 0000000..5ff901e Binary files /dev/null and b/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno_cast.vanim_c differ diff --git a/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno_idle.vanim_c b/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno_idle.vanim_c new file mode 100755 index 0000000..a7034a8 Binary files /dev/null and b/models/new_touhou_model/cirno/ex/163eb7c1/ex_cirno_idle.vanim_c differ diff --git a/models/new_touhou_model/cirno/ex/ex_cirno.vmdl_c b/models/new_touhou_model/cirno/ex/ex_cirno.vmdl_c new file mode 100755 index 0000000..1b17028 Binary files /dev/null and b/models/new_touhou_model/cirno/ex/ex_cirno.vmdl_c differ diff --git a/models/new_touhou_model/cirno/ex/ex_cirno.vmesh_c b/models/new_touhou_model/cirno/ex/ex_cirno.vmesh_c new file mode 100755 index 0000000..18ed5f5 Binary files /dev/null and b/models/new_touhou_model/cirno/ex/ex_cirno.vmesh_c differ diff --git a/models/new_touhou_model/cirno/ex/ex_cirno_163eb7c1.vagrp_c b/models/new_touhou_model/cirno/ex/ex_cirno_163eb7c1.vagrp_c new file mode 100755 index 0000000..ef71727 Binary files /dev/null and b/models/new_touhou_model/cirno/ex/ex_cirno_163eb7c1.vagrp_c differ diff --git a/models/new_touhou_model/clownpiece/34799dea/clownpiece.vanim_c b/models/new_touhou_model/clownpiece/34799dea/clownpiece.vanim_c new file mode 100755 index 0000000..7f6bdbf Binary files /dev/null and b/models/new_touhou_model/clownpiece/34799dea/clownpiece.vanim_c differ diff --git a/models/new_touhou_model/clownpiece/34799dea/clownpiece_attack1.vanim_c b/models/new_touhou_model/clownpiece/34799dea/clownpiece_attack1.vanim_c new file mode 100755 index 0000000..d01ed01 Binary files /dev/null and b/models/new_touhou_model/clownpiece/34799dea/clownpiece_attack1.vanim_c differ diff --git a/models/new_touhou_model/clownpiece/34799dea/clownpiece_attack2.vanim_c b/models/new_touhou_model/clownpiece/34799dea/clownpiece_attack2.vanim_c new file mode 100755 index 0000000..206e7f8 Binary files /dev/null and b/models/new_touhou_model/clownpiece/34799dea/clownpiece_attack2.vanim_c differ diff --git a/models/new_touhou_model/clownpiece/34799dea/clownpiece_cast1.vanim_c b/models/new_touhou_model/clownpiece/34799dea/clownpiece_cast1.vanim_c new file mode 100755 index 0000000..15f5ae9 Binary files /dev/null and b/models/new_touhou_model/clownpiece/34799dea/clownpiece_cast1.vanim_c differ diff --git a/models/new_touhou_model/clownpiece/34799dea/clownpiece_idle.vanim_c b/models/new_touhou_model/clownpiece/34799dea/clownpiece_idle.vanim_c new file mode 100755 index 0000000..d03e0a2 Binary files /dev/null and b/models/new_touhou_model/clownpiece/34799dea/clownpiece_idle.vanim_c differ diff --git a/models/new_touhou_model/clownpiece/clownpiece.vmdl_c b/models/new_touhou_model/clownpiece/clownpiece.vmdl_c new file mode 100755 index 0000000..99e3d35 Binary files /dev/null and b/models/new_touhou_model/clownpiece/clownpiece.vmdl_c differ diff --git a/models/new_touhou_model/clownpiece/clownpiece.vmesh_c b/models/new_touhou_model/clownpiece/clownpiece.vmesh_c new file mode 100755 index 0000000..5ca1922 Binary files /dev/null and b/models/new_touhou_model/clownpiece/clownpiece.vmesh_c differ diff --git a/models/new_touhou_model/clownpiece/clownpiece_34799dea.vagrp_c b/models/new_touhou_model/clownpiece/clownpiece_34799dea.vagrp_c new file mode 100755 index 0000000..d10bfb2 Binary files /dev/null and b/models/new_touhou_model/clownpiece/clownpiece_34799dea.vagrp_c differ diff --git a/models/new_touhou_model/flandre/7b6befc4/flandre.vanim_c b/models/new_touhou_model/flandre/7b6befc4/flandre.vanim_c new file mode 100755 index 0000000..27e5e9a Binary files /dev/null and b/models/new_touhou_model/flandre/7b6befc4/flandre.vanim_c differ diff --git a/models/new_touhou_model/flandre/7b6befc4/flandre_attack1.vanim_c b/models/new_touhou_model/flandre/7b6befc4/flandre_attack1.vanim_c new file mode 100755 index 0000000..1c9ba52 Binary files /dev/null and b/models/new_touhou_model/flandre/7b6befc4/flandre_attack1.vanim_c differ diff --git a/models/new_touhou_model/flandre/7b6befc4/flandre_attack2.vanim_c b/models/new_touhou_model/flandre/7b6befc4/flandre_attack2.vanim_c new file mode 100755 index 0000000..706b357 Binary files /dev/null and b/models/new_touhou_model/flandre/7b6befc4/flandre_attack2.vanim_c differ diff --git a/models/new_touhou_model/flandre/7b6befc4/flandre_cast4.vanim_c b/models/new_touhou_model/flandre/7b6befc4/flandre_cast4.vanim_c new file mode 100755 index 0000000..4d98ec8 Binary files /dev/null and b/models/new_touhou_model/flandre/7b6befc4/flandre_cast4.vanim_c differ diff --git a/models/new_touhou_model/flandre/7b6befc4/flandre_idle.vanim_c b/models/new_touhou_model/flandre/7b6befc4/flandre_idle.vanim_c new file mode 100755 index 0000000..be1b40f Binary files /dev/null and b/models/new_touhou_model/flandre/7b6befc4/flandre_idle.vanim_c differ diff --git a/models/new_touhou_model/flandre/flandre.vmdl_c b/models/new_touhou_model/flandre/flandre.vmdl_c new file mode 100755 index 0000000..0eb2684 Binary files /dev/null and b/models/new_touhou_model/flandre/flandre.vmdl_c differ diff --git a/models/new_touhou_model/flandre/flandre.vmesh_c b/models/new_touhou_model/flandre/flandre.vmesh_c new file mode 100755 index 0000000..5e68f32 Binary files /dev/null and b/models/new_touhou_model/flandre/flandre.vmesh_c differ diff --git a/models/new_touhou_model/flandre/flandre_7b6befc4.vagrp_c b/models/new_touhou_model/flandre/flandre_7b6befc4.vagrp_c new file mode 100755 index 0000000..9831db8 Binary files /dev/null and b/models/new_touhou_model/flandre/flandre_7b6befc4.vagrp_c differ diff --git a/models/new_touhou_model/hecatia/17c03822/hecatia.vanim_c b/models/new_touhou_model/hecatia/17c03822/hecatia.vanim_c new file mode 100755 index 0000000..9edb7af Binary files /dev/null and b/models/new_touhou_model/hecatia/17c03822/hecatia.vanim_c differ diff --git a/models/new_touhou_model/hecatia/17c03822/hecatia_attack1.vanim_c b/models/new_touhou_model/hecatia/17c03822/hecatia_attack1.vanim_c new file mode 100755 index 0000000..ed134d4 Binary files /dev/null and b/models/new_touhou_model/hecatia/17c03822/hecatia_attack1.vanim_c differ diff --git a/models/new_touhou_model/hecatia/17c03822/hecatia_attack2.vanim_c b/models/new_touhou_model/hecatia/17c03822/hecatia_attack2.vanim_c new file mode 100755 index 0000000..9b13455 Binary files /dev/null and b/models/new_touhou_model/hecatia/17c03822/hecatia_attack2.vanim_c differ diff --git a/models/new_touhou_model/hecatia/17c03822/hecatia_cast1.vanim_c b/models/new_touhou_model/hecatia/17c03822/hecatia_cast1.vanim_c new file mode 100755 index 0000000..8ec1baa Binary files /dev/null and b/models/new_touhou_model/hecatia/17c03822/hecatia_cast1.vanim_c differ diff --git a/models/new_touhou_model/hecatia/17c03822/hecatia_idle.vanim_c b/models/new_touhou_model/hecatia/17c03822/hecatia_idle.vanim_c new file mode 100755 index 0000000..82b6a38 Binary files /dev/null and b/models/new_touhou_model/hecatia/17c03822/hecatia_idle.vanim_c differ diff --git a/models/new_touhou_model/hecatia/3dfd9839/hecatia_attack1.vanim_c b/models/new_touhou_model/hecatia/3dfd9839/hecatia_attack1.vanim_c new file mode 100755 index 0000000..876f70b Binary files /dev/null and b/models/new_touhou_model/hecatia/3dfd9839/hecatia_attack1.vanim_c differ diff --git a/models/new_touhou_model/hecatia/3dfd9839/hecatia_attack2.vanim_c b/models/new_touhou_model/hecatia/3dfd9839/hecatia_attack2.vanim_c new file mode 100755 index 0000000..133c521 Binary files /dev/null and b/models/new_touhou_model/hecatia/3dfd9839/hecatia_attack2.vanim_c differ diff --git a/models/new_touhou_model/hecatia/3dfd9839/hecatia_cast1.vanim_c b/models/new_touhou_model/hecatia/3dfd9839/hecatia_cast1.vanim_c new file mode 100755 index 0000000..494eae8 Binary files /dev/null and b/models/new_touhou_model/hecatia/3dfd9839/hecatia_cast1.vanim_c differ diff --git a/models/new_touhou_model/hecatia/3dfd9839/hecatia_idle.vanim_c b/models/new_touhou_model/hecatia/3dfd9839/hecatia_idle.vanim_c new file mode 100755 index 0000000..1dda280 Binary files /dev/null and b/models/new_touhou_model/hecatia/3dfd9839/hecatia_idle.vanim_c differ diff --git a/models/new_touhou_model/hecatia/earth.vmdl_c b/models/new_touhou_model/hecatia/earth.vmdl_c new file mode 100755 index 0000000..aab3764 Binary files /dev/null and b/models/new_touhou_model/hecatia/earth.vmdl_c differ diff --git a/models/new_touhou_model/hecatia/earth.vmesh_c b/models/new_touhou_model/hecatia/earth.vmesh_c new file mode 100755 index 0000000..1836118 Binary files /dev/null and b/models/new_touhou_model/hecatia/earth.vmesh_c differ diff --git a/models/new_touhou_model/hecatia/hecatia.vmdl_c b/models/new_touhou_model/hecatia/hecatia.vmdl_c new file mode 100755 index 0000000..6ffa5be Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia.vmdl_c differ diff --git a/models/new_touhou_model/hecatia/hecatia.vmesh_c b/models/new_touhou_model/hecatia/hecatia.vmesh_c new file mode 100755 index 0000000..376b0ea Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia.vmesh_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_17c03822.vagrp_c b/models/new_touhou_model/hecatia/hecatia_17c03822.vagrp_c new file mode 100755 index 0000000..e953cb3 Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_17c03822.vagrp_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_earth/3dfd9839/hecatia_attack1.vanim_c b/models/new_touhou_model/hecatia/hecatia_earth/3dfd9839/hecatia_attack1.vanim_c new file mode 100755 index 0000000..7956cf2 Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_earth/3dfd9839/hecatia_attack1.vanim_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_earth/3dfd9839/hecatia_attack2.vanim_c b/models/new_touhou_model/hecatia/hecatia_earth/3dfd9839/hecatia_attack2.vanim_c new file mode 100755 index 0000000..ae88b0e Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_earth/3dfd9839/hecatia_attack2.vanim_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_earth/3dfd9839/hecatia_cast1.vanim_c b/models/new_touhou_model/hecatia/hecatia_earth/3dfd9839/hecatia_cast1.vanim_c new file mode 100755 index 0000000..2bc8230 Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_earth/3dfd9839/hecatia_cast1.vanim_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_earth/3dfd9839/hecatia_idle.vanim_c b/models/new_touhou_model/hecatia/hecatia_earth/3dfd9839/hecatia_idle.vanim_c new file mode 100755 index 0000000..c78a9d1 Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_earth/3dfd9839/hecatia_idle.vanim_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_earth/hecatia.vmesh_c b/models/new_touhou_model/hecatia/hecatia_earth/hecatia.vmesh_c new file mode 100755 index 0000000..a02021b Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_earth/hecatia.vmesh_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_earth/hecatia_earth.vmdl_c b/models/new_touhou_model/hecatia/hecatia_earth/hecatia_earth.vmdl_c new file mode 100755 index 0000000..9d92174 Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_earth/hecatia_earth.vmdl_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_earth/hecatia_earth_3dfd9839.vagrp_c b/models/new_touhou_model/hecatia/hecatia_earth/hecatia_earth_3dfd9839.vagrp_c new file mode 100755 index 0000000..bab4789 Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_earth/hecatia_earth_3dfd9839.vagrp_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_moon/dc1804ca/hecatia_attack1.vanim_c b/models/new_touhou_model/hecatia/hecatia_moon/dc1804ca/hecatia_attack1.vanim_c new file mode 100755 index 0000000..83c6b22 Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_moon/dc1804ca/hecatia_attack1.vanim_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_moon/dc1804ca/hecatia_attack2.vanim_c b/models/new_touhou_model/hecatia/hecatia_moon/dc1804ca/hecatia_attack2.vanim_c new file mode 100755 index 0000000..715dceb Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_moon/dc1804ca/hecatia_attack2.vanim_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_moon/dc1804ca/hecatia_cast1.vanim_c b/models/new_touhou_model/hecatia/hecatia_moon/dc1804ca/hecatia_cast1.vanim_c new file mode 100755 index 0000000..21b61b5 Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_moon/dc1804ca/hecatia_cast1.vanim_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_moon/dc1804ca/hecatia_idle.vanim_c b/models/new_touhou_model/hecatia/hecatia_moon/dc1804ca/hecatia_idle.vanim_c new file mode 100755 index 0000000..42ccdc9 Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_moon/dc1804ca/hecatia_idle.vanim_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_moon/hecatia.vmesh_c b/models/new_touhou_model/hecatia/hecatia_moon/hecatia.vmesh_c new file mode 100755 index 0000000..11b4de9 Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_moon/hecatia.vmesh_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_moon/hecatia_moon.vmdl_c b/models/new_touhou_model/hecatia/hecatia_moon/hecatia_moon.vmdl_c new file mode 100755 index 0000000..8c00111 Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_moon/hecatia_moon.vmdl_c differ diff --git a/models/new_touhou_model/hecatia/hecatia_moon/hecatia_moon_dc1804ca.vagrp_c b/models/new_touhou_model/hecatia/hecatia_moon/hecatia_moon_dc1804ca.vagrp_c new file mode 100755 index 0000000..3186154 Binary files /dev/null and b/models/new_touhou_model/hecatia/hecatia_moon/hecatia_moon_dc1804ca.vagrp_c differ diff --git a/models/new_touhou_model/hecatia/item/f40dfb37/hecatia_idle.vanim_c b/models/new_touhou_model/hecatia/item/f40dfb37/hecatia_idle.vanim_c new file mode 100755 index 0000000..33d1f56 Binary files /dev/null and b/models/new_touhou_model/hecatia/item/f40dfb37/hecatia_idle.vanim_c differ diff --git a/models/new_touhou_model/hecatia/item/hecatia.vmesh_c b/models/new_touhou_model/hecatia/item/hecatia.vmesh_c new file mode 100755 index 0000000..d703b0c Binary files /dev/null and b/models/new_touhou_model/hecatia/item/hecatia.vmesh_c differ diff --git a/models/new_touhou_model/hecatia/item/item_hecatia.vmdl_c b/models/new_touhou_model/hecatia/item/item_hecatia.vmdl_c new file mode 100755 index 0000000..8a2f4ca Binary files /dev/null and b/models/new_touhou_model/hecatia/item/item_hecatia.vmdl_c differ diff --git a/models/new_touhou_model/hecatia/item/item_hecatia_f40dfb37.vagrp_c b/models/new_touhou_model/hecatia/item/item_hecatia_f40dfb37.vagrp_c new file mode 100755 index 0000000..da713f1 Binary files /dev/null and b/models/new_touhou_model/hecatia/item/item_hecatia_f40dfb37.vagrp_c differ diff --git a/models/new_touhou_model/hecatia/moon.vmdl_c b/models/new_touhou_model/hecatia/moon.vmdl_c new file mode 100755 index 0000000..e62c43e Binary files /dev/null and b/models/new_touhou_model/hecatia/moon.vmdl_c differ diff --git a/models/new_touhou_model/hecatia/moon.vmesh_c b/models/new_touhou_model/hecatia/moon.vmesh_c new file mode 100755 index 0000000..00de9b8 Binary files /dev/null and b/models/new_touhou_model/hecatia/moon.vmesh_c differ diff --git a/models/new_touhou_model/hecatia/otherworld.vmdl_c b/models/new_touhou_model/hecatia/otherworld.vmdl_c new file mode 100755 index 0000000..0c3fbb4 Binary files /dev/null and b/models/new_touhou_model/hecatia/otherworld.vmdl_c differ diff --git a/models/new_touhou_model/hecatia/otherworld.vmesh_c b/models/new_touhou_model/hecatia/otherworld.vmesh_c new file mode 100755 index 0000000..b5b7d43 Binary files /dev/null and b/models/new_touhou_model/hecatia/otherworld.vmesh_c differ diff --git a/models/new_touhou_model/junko/0a62ecd6/junko.vanim_c b/models/new_touhou_model/junko/0a62ecd6/junko.vanim_c new file mode 100755 index 0000000..a826965 Binary files /dev/null and b/models/new_touhou_model/junko/0a62ecd6/junko.vanim_c differ diff --git a/models/new_touhou_model/junko/0a62ecd6/junko_attack1.vanim_c b/models/new_touhou_model/junko/0a62ecd6/junko_attack1.vanim_c new file mode 100755 index 0000000..ceb9efa Binary files /dev/null and b/models/new_touhou_model/junko/0a62ecd6/junko_attack1.vanim_c differ diff --git a/models/new_touhou_model/junko/0a62ecd6/junko_attack2.vanim_c b/models/new_touhou_model/junko/0a62ecd6/junko_attack2.vanim_c new file mode 100755 index 0000000..34c836c Binary files /dev/null and b/models/new_touhou_model/junko/0a62ecd6/junko_attack2.vanim_c differ diff --git a/models/new_touhou_model/junko/0a62ecd6/junko_cast.vanim_c b/models/new_touhou_model/junko/0a62ecd6/junko_cast.vanim_c new file mode 100755 index 0000000..4936f94 Binary files /dev/null and b/models/new_touhou_model/junko/0a62ecd6/junko_cast.vanim_c differ diff --git a/models/new_touhou_model/junko/0a62ecd6/junko_cast4.vanim_c b/models/new_touhou_model/junko/0a62ecd6/junko_cast4.vanim_c new file mode 100755 index 0000000..8fa4e5e Binary files /dev/null and b/models/new_touhou_model/junko/0a62ecd6/junko_cast4.vanim_c differ diff --git a/models/new_touhou_model/junko/0a62ecd6/junko_idle.vanim_c b/models/new_touhou_model/junko/0a62ecd6/junko_idle.vanim_c new file mode 100755 index 0000000..5687981 Binary files /dev/null and b/models/new_touhou_model/junko/0a62ecd6/junko_idle.vanim_c differ diff --git a/models/new_touhou_model/junko/item/221a59f7/junko_idle.vanim_c b/models/new_touhou_model/junko/item/221a59f7/junko_idle.vanim_c new file mode 100755 index 0000000..acc66d2 Binary files /dev/null and b/models/new_touhou_model/junko/item/221a59f7/junko_idle.vanim_c differ diff --git a/models/new_touhou_model/junko/item/item_junko.vmdl_c b/models/new_touhou_model/junko/item/item_junko.vmdl_c new file mode 100755 index 0000000..e56a803 Binary files /dev/null and b/models/new_touhou_model/junko/item/item_junko.vmdl_c differ diff --git a/models/new_touhou_model/junko/item/item_junko_221a59f7.vagrp_c b/models/new_touhou_model/junko/item/item_junko_221a59f7.vagrp_c new file mode 100755 index 0000000..e8b2408 Binary files /dev/null and b/models/new_touhou_model/junko/item/item_junko_221a59f7.vagrp_c differ diff --git a/models/new_touhou_model/junko/item/junko.vmesh_c b/models/new_touhou_model/junko/item/junko.vmesh_c new file mode 100755 index 0000000..6bdeade Binary files /dev/null and b/models/new_touhou_model/junko/item/junko.vmesh_c differ diff --git a/models/new_touhou_model/junko/junko.vmdl_c b/models/new_touhou_model/junko/junko.vmdl_c new file mode 100755 index 0000000..d4cf33b Binary files /dev/null and b/models/new_touhou_model/junko/junko.vmdl_c differ diff --git a/models/new_touhou_model/junko/junko.vmesh_c b/models/new_touhou_model/junko/junko.vmesh_c new file mode 100755 index 0000000..13aa805 Binary files /dev/null and b/models/new_touhou_model/junko/junko.vmesh_c differ diff --git a/models/new_touhou_model/junko/junko_0a62ecd6.vagrp_c b/models/new_touhou_model/junko/junko_0a62ecd6.vagrp_c new file mode 100755 index 0000000..9d59e7c Binary files /dev/null and b/models/new_touhou_model/junko/junko_0a62ecd6.vagrp_c differ diff --git a/models/new_touhou_model/marisa/f177ccd9/marisa.vanim_c b/models/new_touhou_model/marisa/f177ccd9/marisa.vanim_c new file mode 100755 index 0000000..c270173 Binary files /dev/null and b/models/new_touhou_model/marisa/f177ccd9/marisa.vanim_c differ diff --git a/models/new_touhou_model/marisa/f177ccd9/marisa_attack1.vanim_c b/models/new_touhou_model/marisa/f177ccd9/marisa_attack1.vanim_c new file mode 100755 index 0000000..862275a Binary files /dev/null and b/models/new_touhou_model/marisa/f177ccd9/marisa_attack1.vanim_c differ diff --git a/models/new_touhou_model/marisa/f177ccd9/marisa_attack2.vanim_c b/models/new_touhou_model/marisa/f177ccd9/marisa_attack2.vanim_c new file mode 100755 index 0000000..7b0ae9e Binary files /dev/null and b/models/new_touhou_model/marisa/f177ccd9/marisa_attack2.vanim_c differ diff --git a/models/new_touhou_model/marisa/f177ccd9/marisa_cast1.vanim_c b/models/new_touhou_model/marisa/f177ccd9/marisa_cast1.vanim_c new file mode 100755 index 0000000..4a1e669 Binary files /dev/null and b/models/new_touhou_model/marisa/f177ccd9/marisa_cast1.vanim_c differ diff --git a/models/new_touhou_model/marisa/f177ccd9/marisa_cast2.vanim_c b/models/new_touhou_model/marisa/f177ccd9/marisa_cast2.vanim_c new file mode 100755 index 0000000..6ff5479 Binary files /dev/null and b/models/new_touhou_model/marisa/f177ccd9/marisa_cast2.vanim_c differ diff --git a/models/new_touhou_model/marisa/f177ccd9/marisa_cast4.vanim_c b/models/new_touhou_model/marisa/f177ccd9/marisa_cast4.vanim_c new file mode 100755 index 0000000..a60dec1 Binary files /dev/null and b/models/new_touhou_model/marisa/f177ccd9/marisa_cast4.vanim_c differ diff --git a/models/new_touhou_model/marisa/f177ccd9/marisa_idle.vanim_c b/models/new_touhou_model/marisa/f177ccd9/marisa_idle.vanim_c new file mode 100755 index 0000000..bba2ccd Binary files /dev/null and b/models/new_touhou_model/marisa/f177ccd9/marisa_idle.vanim_c differ diff --git a/models/new_touhou_model/marisa/f177ccd9/marisa_run.vanim_c b/models/new_touhou_model/marisa/f177ccd9/marisa_run.vanim_c new file mode 100755 index 0000000..cc3c81c Binary files /dev/null and b/models/new_touhou_model/marisa/f177ccd9/marisa_run.vanim_c differ diff --git a/models/new_touhou_model/marisa/marisa.vmdl_c b/models/new_touhou_model/marisa/marisa.vmdl_c new file mode 100755 index 0000000..0904f71 Binary files /dev/null and b/models/new_touhou_model/marisa/marisa.vmdl_c differ diff --git a/models/new_touhou_model/marisa/marisa.vmesh_c b/models/new_touhou_model/marisa/marisa.vmesh_c new file mode 100755 index 0000000..57becaa Binary files /dev/null and b/models/new_touhou_model/marisa/marisa.vmesh_c differ diff --git a/models/new_touhou_model/marisa/marisa_f177ccd9.vagrp_c b/models/new_touhou_model/marisa/marisa_f177ccd9.vagrp_c new file mode 100755 index 0000000..b6ebc64 Binary files /dev/null and b/models/new_touhou_model/marisa/marisa_f177ccd9.vagrp_c differ diff --git a/models/new_touhou_model/patchouli/41dfbfc1/patchouli.vanim_c b/models/new_touhou_model/patchouli/41dfbfc1/patchouli.vanim_c new file mode 100755 index 0000000..3edbeda Binary files /dev/null and b/models/new_touhou_model/patchouli/41dfbfc1/patchouli.vanim_c differ diff --git a/models/new_touhou_model/patchouli/41dfbfc1/patchouli_attack1.vanim_c b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_attack1.vanim_c new file mode 100755 index 0000000..fb5ed13 Binary files /dev/null and b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_attack1.vanim_c differ diff --git a/models/new_touhou_model/patchouli/41dfbfc1/patchouli_attack2.vanim_c b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_attack2.vanim_c new file mode 100755 index 0000000..92edc99 Binary files /dev/null and b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_attack2.vanim_c differ diff --git a/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast1.vanim_c b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast1.vanim_c new file mode 100755 index 0000000..0bf8d2d Binary files /dev/null and b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast1.vanim_c differ diff --git a/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast2.vanim_c b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast2.vanim_c new file mode 100755 index 0000000..c795c3e Binary files /dev/null and b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast2.vanim_c differ diff --git a/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast3.vanim_c b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast3.vanim_c new file mode 100755 index 0000000..1788f27 Binary files /dev/null and b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast3.vanim_c differ diff --git a/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast4.vanim_c b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast4.vanim_c new file mode 100755 index 0000000..05aec7c Binary files /dev/null and b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast4.vanim_c differ diff --git a/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast44.vanim_c b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast44.vanim_c new file mode 100755 index 0000000..1e02209 Binary files /dev/null and b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast44.vanim_c differ diff --git a/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast5.vanim_c b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast5.vanim_c new file mode 100755 index 0000000..1845d32 Binary files /dev/null and b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast5.vanim_c differ diff --git a/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast6.vanim_c b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast6.vanim_c new file mode 100755 index 0000000..67f1cbc Binary files /dev/null and b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_cast6.vanim_c differ diff --git a/models/new_touhou_model/patchouli/41dfbfc1/patchouli_idle.vanim_c b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_idle.vanim_c new file mode 100755 index 0000000..8895d69 Binary files /dev/null and b/models/new_touhou_model/patchouli/41dfbfc1/patchouli_idle.vanim_c differ diff --git a/models/new_touhou_model/patchouli/patchouli.vmdl_c b/models/new_touhou_model/patchouli/patchouli.vmdl_c new file mode 100755 index 0000000..b07bfe5 Binary files /dev/null and b/models/new_touhou_model/patchouli/patchouli.vmdl_c differ diff --git a/models/new_touhou_model/patchouli/patchouli.vmesh_c b/models/new_touhou_model/patchouli/patchouli.vmesh_c new file mode 100755 index 0000000..0eb6932 Binary files /dev/null and b/models/new_touhou_model/patchouli/patchouli.vmesh_c differ diff --git a/models/new_touhou_model/patchouli/patchouli_41dfbfc1.vagrp_c b/models/new_touhou_model/patchouli/patchouli_41dfbfc1.vagrp_c new file mode 100755 index 0000000..907af71 Binary files /dev/null and b/models/new_touhou_model/patchouli/patchouli_41dfbfc1.vagrp_c differ diff --git a/models/new_touhou_model/patchouli/philosophers_stone.vmdl_c b/models/new_touhou_model/patchouli/philosophers_stone.vmdl_c new file mode 100755 index 0000000..948ab44 Binary files /dev/null and b/models/new_touhou_model/patchouli/philosophers_stone.vmdl_c differ diff --git a/models/new_touhou_model/patchouli/philosophers_stone.vmesh_c b/models/new_touhou_model/patchouli/philosophers_stone.vmesh_c new file mode 100755 index 0000000..5091de2 Binary files /dev/null and b/models/new_touhou_model/patchouli/philosophers_stone.vmesh_c differ diff --git a/models/new_touhou_model/reimu/b9bb1cbf/reimu_attack1.vanim_c b/models/new_touhou_model/reimu/b9bb1cbf/reimu_attack1.vanim_c new file mode 100755 index 0000000..3a5bed7 Binary files /dev/null and b/models/new_touhou_model/reimu/b9bb1cbf/reimu_attack1.vanim_c differ diff --git a/models/new_touhou_model/reimu/b9bb1cbf/reimu_attack2.vanim_c b/models/new_touhou_model/reimu/b9bb1cbf/reimu_attack2.vanim_c new file mode 100755 index 0000000..ba32a4d Binary files /dev/null and b/models/new_touhou_model/reimu/b9bb1cbf/reimu_attack2.vanim_c differ diff --git a/models/new_touhou_model/reimu/b9bb1cbf/reimu_cast1.vanim_c b/models/new_touhou_model/reimu/b9bb1cbf/reimu_cast1.vanim_c new file mode 100755 index 0000000..0414ee2 Binary files /dev/null and b/models/new_touhou_model/reimu/b9bb1cbf/reimu_cast1.vanim_c differ diff --git a/models/new_touhou_model/reimu/b9bb1cbf/reimu_cast3.vanim_c b/models/new_touhou_model/reimu/b9bb1cbf/reimu_cast3.vanim_c new file mode 100755 index 0000000..3a3a84e Binary files /dev/null and b/models/new_touhou_model/reimu/b9bb1cbf/reimu_cast3.vanim_c differ diff --git a/models/new_touhou_model/reimu/b9bb1cbf/reimu_idle.vanim_c b/models/new_touhou_model/reimu/b9bb1cbf/reimu_idle.vanim_c new file mode 100755 index 0000000..7c4ca1b Binary files /dev/null and b/models/new_touhou_model/reimu/b9bb1cbf/reimu_idle.vanim_c differ diff --git a/models/new_touhou_model/reimu/b9bb1cbf/reimu_run.vanim_c b/models/new_touhou_model/reimu/b9bb1cbf/reimu_run.vanim_c new file mode 100755 index 0000000..2003dcc Binary files /dev/null and b/models/new_touhou_model/reimu/b9bb1cbf/reimu_run.vanim_c differ diff --git a/models/new_touhou_model/reimu/ofuda.vmdl_c b/models/new_touhou_model/reimu/ofuda.vmdl_c new file mode 100755 index 0000000..005b39d Binary files /dev/null and b/models/new_touhou_model/reimu/ofuda.vmdl_c differ diff --git a/models/new_touhou_model/reimu/ofuda.vmesh_c b/models/new_touhou_model/reimu/ofuda.vmesh_c new file mode 100755 index 0000000..e7d1982 Binary files /dev/null and b/models/new_touhou_model/reimu/ofuda.vmesh_c differ diff --git a/models/new_touhou_model/reimu/onmyongyoku/onmyougyoku.vmesh_c b/models/new_touhou_model/reimu/onmyongyoku/onmyougyoku.vmesh_c new file mode 100755 index 0000000..1f6c33b Binary files /dev/null and b/models/new_touhou_model/reimu/onmyongyoku/onmyougyoku.vmesh_c differ diff --git a/models/new_touhou_model/reimu/onmyongyoku/onmyougyoku_max.vmdl_c b/models/new_touhou_model/reimu/onmyongyoku/onmyougyoku_max.vmdl_c new file mode 100755 index 0000000..e77445c Binary files /dev/null and b/models/new_touhou_model/reimu/onmyongyoku/onmyougyoku_max.vmdl_c differ diff --git a/models/new_touhou_model/reimu/onmyougyoku.vmdl_c b/models/new_touhou_model/reimu/onmyougyoku.vmdl_c new file mode 100755 index 0000000..9c28bb7 Binary files /dev/null and b/models/new_touhou_model/reimu/onmyougyoku.vmdl_c differ diff --git a/models/new_touhou_model/reimu/onmyougyoku.vmesh_c b/models/new_touhou_model/reimu/onmyougyoku.vmesh_c new file mode 100755 index 0000000..6b913c4 Binary files /dev/null and b/models/new_touhou_model/reimu/onmyougyoku.vmesh_c differ diff --git a/models/new_touhou_model/reimu/reimu.vmdl_c b/models/new_touhou_model/reimu/reimu.vmdl_c new file mode 100755 index 0000000..f014d51 Binary files /dev/null and b/models/new_touhou_model/reimu/reimu.vmdl_c differ diff --git a/models/new_touhou_model/reimu/reimu.vmesh_c b/models/new_touhou_model/reimu/reimu.vmesh_c new file mode 100755 index 0000000..b0c6604 Binary files /dev/null and b/models/new_touhou_model/reimu/reimu.vmesh_c differ diff --git a/models/new_touhou_model/reimu/reimu_b9bb1cbf.vagrp_c b/models/new_touhou_model/reimu/reimu_b9bb1cbf.vagrp_c new file mode 100755 index 0000000..6f6e399 Binary files /dev/null and b/models/new_touhou_model/reimu/reimu_b9bb1cbf.vagrp_c differ diff --git a/models/new_touhou_model/remilia/ccce6eed/attack1.vanim_c b/models/new_touhou_model/remilia/ccce6eed/attack1.vanim_c new file mode 100755 index 0000000..60b140f Binary files /dev/null and b/models/new_touhou_model/remilia/ccce6eed/attack1.vanim_c differ diff --git a/models/new_touhou_model/remilia/ccce6eed/attack2.vanim_c b/models/new_touhou_model/remilia/ccce6eed/attack2.vanim_c new file mode 100755 index 0000000..0036aa1 Binary files /dev/null and b/models/new_touhou_model/remilia/ccce6eed/attack2.vanim_c differ diff --git a/models/new_touhou_model/remilia/ccce6eed/cast1.vanim_c b/models/new_touhou_model/remilia/ccce6eed/cast1.vanim_c new file mode 100755 index 0000000..16cc1c3 Binary files /dev/null and b/models/new_touhou_model/remilia/ccce6eed/cast1.vanim_c differ diff --git a/models/new_touhou_model/remilia/ccce6eed/cast2.vanim_c b/models/new_touhou_model/remilia/ccce6eed/cast2.vanim_c new file mode 100755 index 0000000..43a3c6d Binary files /dev/null and b/models/new_touhou_model/remilia/ccce6eed/cast2.vanim_c differ diff --git a/models/new_touhou_model/remilia/ccce6eed/cast3.vanim_c b/models/new_touhou_model/remilia/ccce6eed/cast3.vanim_c new file mode 100755 index 0000000..9064bdf Binary files /dev/null and b/models/new_touhou_model/remilia/ccce6eed/cast3.vanim_c differ diff --git a/models/new_touhou_model/remilia/ccce6eed/idle.vanim_c b/models/new_touhou_model/remilia/ccce6eed/idle.vanim_c new file mode 100755 index 0000000..98be203 Binary files /dev/null and b/models/new_touhou_model/remilia/ccce6eed/idle.vanim_c differ diff --git a/models/new_touhou_model/remilia/ccce6eed/remilia.vanim_c b/models/new_touhou_model/remilia/ccce6eed/remilia.vanim_c new file mode 100755 index 0000000..fa8b9d7 Binary files /dev/null and b/models/new_touhou_model/remilia/ccce6eed/remilia.vanim_c differ diff --git a/models/new_touhou_model/remilia/ed516360/gungnir.vanim_c b/models/new_touhou_model/remilia/ed516360/gungnir.vanim_c new file mode 100755 index 0000000..122144d Binary files /dev/null and b/models/new_touhou_model/remilia/ed516360/gungnir.vanim_c differ diff --git a/models/new_touhou_model/remilia/gungnir.vmdl_c b/models/new_touhou_model/remilia/gungnir.vmdl_c new file mode 100755 index 0000000..246e16c Binary files /dev/null and b/models/new_touhou_model/remilia/gungnir.vmdl_c differ diff --git a/models/new_touhou_model/remilia/gungnir.vmesh_c b/models/new_touhou_model/remilia/gungnir.vmesh_c new file mode 100755 index 0000000..f6a3d1d Binary files /dev/null and b/models/new_touhou_model/remilia/gungnir.vmesh_c differ diff --git a/models/new_touhou_model/remilia/gungnir_ed516360.vagrp_c b/models/new_touhou_model/remilia/gungnir_ed516360.vagrp_c new file mode 100755 index 0000000..56f8675 Binary files /dev/null and b/models/new_touhou_model/remilia/gungnir_ed516360.vagrp_c differ diff --git a/models/new_touhou_model/remilia/remilia.vmdl_c b/models/new_touhou_model/remilia/remilia.vmdl_c new file mode 100755 index 0000000..2350f18 Binary files /dev/null and b/models/new_touhou_model/remilia/remilia.vmdl_c differ diff --git a/models/new_touhou_model/remilia/remilia.vmesh_c b/models/new_touhou_model/remilia/remilia.vmesh_c new file mode 100755 index 0000000..e0cc591 Binary files /dev/null and b/models/new_touhou_model/remilia/remilia.vmesh_c differ diff --git a/models/new_touhou_model/remilia/remilia_ccce6eed.vagrp_c b/models/new_touhou_model/remilia/remilia_ccce6eed.vagrp_c new file mode 100755 index 0000000..21ef5d1 Binary files /dev/null and b/models/new_touhou_model/remilia/remilia_ccce6eed.vagrp_c differ diff --git a/models/new_touhou_model/sakuya/0d9644b6/attack1.vanim_c b/models/new_touhou_model/sakuya/0d9644b6/attack1.vanim_c new file mode 100755 index 0000000..53359c6 Binary files /dev/null and b/models/new_touhou_model/sakuya/0d9644b6/attack1.vanim_c differ diff --git a/models/new_touhou_model/sakuya/0d9644b6/attack2.vanim_c b/models/new_touhou_model/sakuya/0d9644b6/attack2.vanim_c new file mode 100755 index 0000000..9c9d22e Binary files /dev/null and b/models/new_touhou_model/sakuya/0d9644b6/attack2.vanim_c differ diff --git a/models/new_touhou_model/sakuya/0d9644b6/cast1.vanim_c b/models/new_touhou_model/sakuya/0d9644b6/cast1.vanim_c new file mode 100755 index 0000000..8c7e2fb Binary files /dev/null and b/models/new_touhou_model/sakuya/0d9644b6/cast1.vanim_c differ diff --git a/models/new_touhou_model/sakuya/0d9644b6/cast1_2.vanim_c b/models/new_touhou_model/sakuya/0d9644b6/cast1_2.vanim_c new file mode 100755 index 0000000..8123b18 Binary files /dev/null and b/models/new_touhou_model/sakuya/0d9644b6/cast1_2.vanim_c differ diff --git a/models/new_touhou_model/sakuya/0d9644b6/cast2.vanim_c b/models/new_touhou_model/sakuya/0d9644b6/cast2.vanim_c new file mode 100755 index 0000000..0f40fca Binary files /dev/null and b/models/new_touhou_model/sakuya/0d9644b6/cast2.vanim_c differ diff --git a/models/new_touhou_model/sakuya/0d9644b6/cast3.vanim_c b/models/new_touhou_model/sakuya/0d9644b6/cast3.vanim_c new file mode 100755 index 0000000..5ce8488 Binary files /dev/null and b/models/new_touhou_model/sakuya/0d9644b6/cast3.vanim_c differ diff --git a/models/new_touhou_model/sakuya/0d9644b6/cast4.vanim_c b/models/new_touhou_model/sakuya/0d9644b6/cast4.vanim_c new file mode 100755 index 0000000..b582fb8 Binary files /dev/null and b/models/new_touhou_model/sakuya/0d9644b6/cast4.vanim_c differ diff --git a/models/new_touhou_model/sakuya/0d9644b6/idle.vanim_c b/models/new_touhou_model/sakuya/0d9644b6/idle.vanim_c new file mode 100755 index 0000000..2eca09d Binary files /dev/null and b/models/new_touhou_model/sakuya/0d9644b6/idle.vanim_c differ diff --git a/models/new_touhou_model/sakuya/sakuya.vmdl_c b/models/new_touhou_model/sakuya/sakuya.vmdl_c new file mode 100755 index 0000000..96d69fc Binary files /dev/null and b/models/new_touhou_model/sakuya/sakuya.vmdl_c differ diff --git a/models/new_touhou_model/sakuya/sakuya.vmesh_c b/models/new_touhou_model/sakuya/sakuya.vmesh_c new file mode 100755 index 0000000..32a026d Binary files /dev/null and b/models/new_touhou_model/sakuya/sakuya.vmesh_c differ diff --git a/models/new_touhou_model/sakuya/sakuya_0d9644b6.vagrp_c b/models/new_touhou_model/sakuya/sakuya_0d9644b6.vagrp_c new file mode 100755 index 0000000..b421eae Binary files /dev/null and b/models/new_touhou_model/sakuya/sakuya_0d9644b6.vagrp_c differ diff --git a/models/new_touhou_model/satori/c283cfd4/satori_attack1.vanim_c b/models/new_touhou_model/satori/c283cfd4/satori_attack1.vanim_c new file mode 100755 index 0000000..52914c3 Binary files /dev/null and b/models/new_touhou_model/satori/c283cfd4/satori_attack1.vanim_c differ diff --git a/models/new_touhou_model/satori/c283cfd4/satori_attack2.vanim_c b/models/new_touhou_model/satori/c283cfd4/satori_attack2.vanim_c new file mode 100755 index 0000000..2c5c106 Binary files /dev/null and b/models/new_touhou_model/satori/c283cfd4/satori_attack2.vanim_c differ diff --git a/models/new_touhou_model/satori/c283cfd4/satori_cast1.vanim_c b/models/new_touhou_model/satori/c283cfd4/satori_cast1.vanim_c new file mode 100755 index 0000000..abd6d9b Binary files /dev/null and b/models/new_touhou_model/satori/c283cfd4/satori_cast1.vanim_c differ diff --git a/models/new_touhou_model/satori/c283cfd4/satori_cast2.vanim_c b/models/new_touhou_model/satori/c283cfd4/satori_cast2.vanim_c new file mode 100755 index 0000000..05c07bb Binary files /dev/null and b/models/new_touhou_model/satori/c283cfd4/satori_cast2.vanim_c differ diff --git a/models/new_touhou_model/satori/c283cfd4/satori_cast3.vanim_c b/models/new_touhou_model/satori/c283cfd4/satori_cast3.vanim_c new file mode 100755 index 0000000..fc8530c Binary files /dev/null and b/models/new_touhou_model/satori/c283cfd4/satori_cast3.vanim_c differ diff --git a/models/new_touhou_model/satori/c283cfd4/satori_cast4.vanim_c b/models/new_touhou_model/satori/c283cfd4/satori_cast4.vanim_c new file mode 100755 index 0000000..a44fa95 Binary files /dev/null and b/models/new_touhou_model/satori/c283cfd4/satori_cast4.vanim_c differ diff --git a/models/new_touhou_model/satori/c283cfd4/satori_cast5.vanim_c b/models/new_touhou_model/satori/c283cfd4/satori_cast5.vanim_c new file mode 100755 index 0000000..1048330 Binary files /dev/null and b/models/new_touhou_model/satori/c283cfd4/satori_cast5.vanim_c differ diff --git a/models/new_touhou_model/satori/c283cfd4/satori_idle.vanim_c b/models/new_touhou_model/satori/c283cfd4/satori_idle.vanim_c new file mode 100755 index 0000000..132a10a Binary files /dev/null and b/models/new_touhou_model/satori/c283cfd4/satori_idle.vanim_c differ diff --git a/models/new_touhou_model/satori/satori.vmdl_c b/models/new_touhou_model/satori/satori.vmdl_c new file mode 100755 index 0000000..2f47770 Binary files /dev/null and b/models/new_touhou_model/satori/satori.vmdl_c differ diff --git a/models/new_touhou_model/satori/satori.vmesh_c b/models/new_touhou_model/satori/satori.vmesh_c new file mode 100755 index 0000000..ea26d52 Binary files /dev/null and b/models/new_touhou_model/satori/satori.vmesh_c differ diff --git a/models/new_touhou_model/satori/satori_c283cfd4.vagrp_c b/models/new_touhou_model/satori/satori_c283cfd4.vagrp_c new file mode 100755 index 0000000..4558c3f Binary files /dev/null and b/models/new_touhou_model/satori/satori_c283cfd4.vagrp_c differ diff --git a/models/new_touhou_model/tenshi/3e07bb2d/tenshi.vanim_c b/models/new_touhou_model/tenshi/3e07bb2d/tenshi.vanim_c new file mode 100755 index 0000000..472b308 Binary files /dev/null and b/models/new_touhou_model/tenshi/3e07bb2d/tenshi.vanim_c differ diff --git a/models/new_touhou_model/tenshi/3e07bb2d/tenshi_attack1.vanim_c b/models/new_touhou_model/tenshi/3e07bb2d/tenshi_attack1.vanim_c new file mode 100755 index 0000000..72690e7 Binary files /dev/null and b/models/new_touhou_model/tenshi/3e07bb2d/tenshi_attack1.vanim_c differ diff --git a/models/new_touhou_model/tenshi/3e07bb2d/tenshi_attack2.vanim_c b/models/new_touhou_model/tenshi/3e07bb2d/tenshi_attack2.vanim_c new file mode 100755 index 0000000..65c4c47 Binary files /dev/null and b/models/new_touhou_model/tenshi/3e07bb2d/tenshi_attack2.vanim_c differ diff --git a/models/new_touhou_model/tenshi/3e07bb2d/tenshi_cast1.vanim_c b/models/new_touhou_model/tenshi/3e07bb2d/tenshi_cast1.vanim_c new file mode 100755 index 0000000..8ac5b4d Binary files /dev/null and b/models/new_touhou_model/tenshi/3e07bb2d/tenshi_cast1.vanim_c differ diff --git a/models/new_touhou_model/tenshi/3e07bb2d/tenshi_cast4.vanim_c b/models/new_touhou_model/tenshi/3e07bb2d/tenshi_cast4.vanim_c new file mode 100755 index 0000000..d7dcfdd Binary files /dev/null and b/models/new_touhou_model/tenshi/3e07bb2d/tenshi_cast4.vanim_c differ diff --git a/models/new_touhou_model/tenshi/3e07bb2d/tenshi_idle.vanim_c b/models/new_touhou_model/tenshi/3e07bb2d/tenshi_idle.vanim_c new file mode 100755 index 0000000..d0f7403 Binary files /dev/null and b/models/new_touhou_model/tenshi/3e07bb2d/tenshi_idle.vanim_c differ diff --git a/models/new_touhou_model/tenshi/tenshi.vmdl_c b/models/new_touhou_model/tenshi/tenshi.vmdl_c new file mode 100755 index 0000000..e84ad03 Binary files /dev/null and b/models/new_touhou_model/tenshi/tenshi.vmdl_c differ diff --git a/models/new_touhou_model/tenshi/tenshi.vmesh_c b/models/new_touhou_model/tenshi/tenshi.vmesh_c new file mode 100755 index 0000000..621f814 Binary files /dev/null and b/models/new_touhou_model/tenshi/tenshi.vmesh_c differ diff --git a/models/new_touhou_model/tenshi/tenshi_3e07bb2d.vagrp_c b/models/new_touhou_model/tenshi/tenshi_3e07bb2d.vagrp_c new file mode 100755 index 0000000..319a5bf Binary files /dev/null and b/models/new_touhou_model/tenshi/tenshi_3e07bb2d.vagrp_c differ diff --git a/models/new_touhou_model/youmu/81fa2138/youmu_ghost_idle.vanim_c b/models/new_touhou_model/youmu/81fa2138/youmu_ghost_idle.vanim_c new file mode 100755 index 0000000..8395366 Binary files /dev/null and b/models/new_touhou_model/youmu/81fa2138/youmu_ghost_idle.vanim_c differ diff --git a/models/new_touhou_model/youmu/987a8d26/youmu.vanim_c b/models/new_touhou_model/youmu/987a8d26/youmu.vanim_c new file mode 100755 index 0000000..a41d4ff Binary files /dev/null and b/models/new_touhou_model/youmu/987a8d26/youmu.vanim_c differ diff --git a/models/new_touhou_model/youmu/987a8d26/youmu_attack1.vanim_c b/models/new_touhou_model/youmu/987a8d26/youmu_attack1.vanim_c new file mode 100755 index 0000000..b04d433 Binary files /dev/null and b/models/new_touhou_model/youmu/987a8d26/youmu_attack1.vanim_c differ diff --git a/models/new_touhou_model/youmu/987a8d26/youmu_attack2.vanim_c b/models/new_touhou_model/youmu/987a8d26/youmu_attack2.vanim_c new file mode 100755 index 0000000..8d9798b Binary files /dev/null and b/models/new_touhou_model/youmu/987a8d26/youmu_attack2.vanim_c differ diff --git a/models/new_touhou_model/youmu/987a8d26/youmu_cast1.vanim_c b/models/new_touhou_model/youmu/987a8d26/youmu_cast1.vanim_c new file mode 100755 index 0000000..5f3781c Binary files /dev/null and b/models/new_touhou_model/youmu/987a8d26/youmu_cast1.vanim_c differ diff --git a/models/new_touhou_model/youmu/987a8d26/youmu_cast4.vanim_c b/models/new_touhou_model/youmu/987a8d26/youmu_cast4.vanim_c new file mode 100755 index 0000000..7de27c8 Binary files /dev/null and b/models/new_touhou_model/youmu/987a8d26/youmu_cast4.vanim_c differ diff --git a/models/new_touhou_model/youmu/987a8d26/youmu_ghost_idle.vanim_c b/models/new_touhou_model/youmu/987a8d26/youmu_ghost_idle.vanim_c new file mode 100755 index 0000000..3a802f0 Binary files /dev/null and b/models/new_touhou_model/youmu/987a8d26/youmu_ghost_idle.vanim_c differ diff --git a/models/new_touhou_model/youmu/987a8d26/youmu_idle.vanim_c b/models/new_touhou_model/youmu/987a8d26/youmu_idle.vanim_c new file mode 100755 index 0000000..6f40f20 Binary files /dev/null and b/models/new_touhou_model/youmu/987a8d26/youmu_idle.vanim_c differ diff --git a/models/new_touhou_model/youmu/youmu.vmdl_c b/models/new_touhou_model/youmu/youmu.vmdl_c new file mode 100755 index 0000000..b3ba51f Binary files /dev/null and b/models/new_touhou_model/youmu/youmu.vmdl_c differ diff --git a/models/new_touhou_model/youmu/youmu.vmesh_c b/models/new_touhou_model/youmu/youmu.vmesh_c new file mode 100755 index 0000000..6c092fd Binary files /dev/null and b/models/new_touhou_model/youmu/youmu.vmesh_c differ diff --git a/models/new_touhou_model/youmu/youmu_987a8d26.vagrp_c b/models/new_touhou_model/youmu/youmu_987a8d26.vagrp_c new file mode 100755 index 0000000..89292a0 Binary files /dev/null and b/models/new_touhou_model/youmu/youmu_987a8d26.vagrp_c differ diff --git a/models/new_touhou_model/youmu/youmu_ghost_idle.vmdl_c b/models/new_touhou_model/youmu/youmu_ghost_idle.vmdl_c new file mode 100755 index 0000000..a37af0b Binary files /dev/null and b/models/new_touhou_model/youmu/youmu_ghost_idle.vmdl_c differ diff --git a/models/new_touhou_model/youmu/youmu_ghost_idle.vmesh_c b/models/new_touhou_model/youmu/youmu_ghost_idle.vmesh_c new file mode 100755 index 0000000..eaf645a Binary files /dev/null and b/models/new_touhou_model/youmu/youmu_ghost_idle.vmesh_c differ diff --git a/models/new_touhou_model/youmu/youmu_ghost_idle_81fa2138.vagrp_c b/models/new_touhou_model/youmu/youmu_ghost_idle_81fa2138.vagrp_c new file mode 100755 index 0000000..7318425 Binary files /dev/null and b/models/new_touhou_model/youmu/youmu_ghost_idle_81fa2138.vagrp_c differ diff --git a/models/new_touhou_model/yukari/d70f67dd/yukari.vanim_c b/models/new_touhou_model/yukari/d70f67dd/yukari.vanim_c new file mode 100755 index 0000000..30fffc4 Binary files /dev/null and b/models/new_touhou_model/yukari/d70f67dd/yukari.vanim_c differ diff --git a/models/new_touhou_model/yukari/d70f67dd/yukari_attack1.vanim_c b/models/new_touhou_model/yukari/d70f67dd/yukari_attack1.vanim_c new file mode 100755 index 0000000..7f42c77 Binary files /dev/null and b/models/new_touhou_model/yukari/d70f67dd/yukari_attack1.vanim_c differ diff --git a/models/new_touhou_model/yukari/d70f67dd/yukari_attack2.vanim_c b/models/new_touhou_model/yukari/d70f67dd/yukari_attack2.vanim_c new file mode 100755 index 0000000..1834571 Binary files /dev/null and b/models/new_touhou_model/yukari/d70f67dd/yukari_attack2.vanim_c differ diff --git a/models/new_touhou_model/yukari/d70f67dd/yukari_cast1.vanim_c b/models/new_touhou_model/yukari/d70f67dd/yukari_cast1.vanim_c new file mode 100755 index 0000000..7dfda1a Binary files /dev/null and b/models/new_touhou_model/yukari/d70f67dd/yukari_cast1.vanim_c differ diff --git a/models/new_touhou_model/yukari/d70f67dd/yukari_cast2.vanim_c b/models/new_touhou_model/yukari/d70f67dd/yukari_cast2.vanim_c new file mode 100755 index 0000000..68b55c1 Binary files /dev/null and b/models/new_touhou_model/yukari/d70f67dd/yukari_cast2.vanim_c differ diff --git a/models/new_touhou_model/yukari/d70f67dd/yukari_cast3.vanim_c b/models/new_touhou_model/yukari/d70f67dd/yukari_cast3.vanim_c new file mode 100755 index 0000000..95a2c14 Binary files /dev/null and b/models/new_touhou_model/yukari/d70f67dd/yukari_cast3.vanim_c differ diff --git a/models/new_touhou_model/yukari/d70f67dd/yukari_cast4.vanim_c b/models/new_touhou_model/yukari/d70f67dd/yukari_cast4.vanim_c new file mode 100755 index 0000000..011d9b6 Binary files /dev/null and b/models/new_touhou_model/yukari/d70f67dd/yukari_cast4.vanim_c differ diff --git a/models/new_touhou_model/yukari/d70f67dd/yukari_idle.vanim_c b/models/new_touhou_model/yukari/d70f67dd/yukari_idle.vanim_c new file mode 100755 index 0000000..f24c7e7 Binary files /dev/null and b/models/new_touhou_model/yukari/d70f67dd/yukari_idle.vanim_c differ diff --git a/models/new_touhou_model/yukari/yukari.vmdl_c b/models/new_touhou_model/yukari/yukari.vmdl_c new file mode 100755 index 0000000..9b85ff3 Binary files /dev/null and b/models/new_touhou_model/yukari/yukari.vmdl_c differ diff --git a/models/new_touhou_model/yukari/yukari.vmesh_c b/models/new_touhou_model/yukari/yukari.vmesh_c new file mode 100755 index 0000000..3418076 Binary files /dev/null and b/models/new_touhou_model/yukari/yukari.vmesh_c differ diff --git a/models/new_touhou_model/yukari/yukari_d70f67dd.vagrp_c b/models/new_touhou_model/yukari/yukari_d70f67dd.vagrp_c new file mode 100755 index 0000000..3f6682d Binary files /dev/null and b/models/new_touhou_model/yukari/yukari_d70f67dd.vagrp_c differ diff --git a/models/new_touhou_model/yuuka/4c48dc12/yuuka.vanim_c b/models/new_touhou_model/yuuka/4c48dc12/yuuka.vanim_c new file mode 100755 index 0000000..b3fafa9 Binary files /dev/null and b/models/new_touhou_model/yuuka/4c48dc12/yuuka.vanim_c differ diff --git a/models/new_touhou_model/yuuka/4c48dc12/yuuka_attack1.vanim_c b/models/new_touhou_model/yuuka/4c48dc12/yuuka_attack1.vanim_c new file mode 100755 index 0000000..9352240 Binary files /dev/null and b/models/new_touhou_model/yuuka/4c48dc12/yuuka_attack1.vanim_c differ diff --git a/models/new_touhou_model/yuuka/4c48dc12/yuuka_attack2.vanim_c b/models/new_touhou_model/yuuka/4c48dc12/yuuka_attack2.vanim_c new file mode 100755 index 0000000..b1d0228 Binary files /dev/null and b/models/new_touhou_model/yuuka/4c48dc12/yuuka_attack2.vanim_c differ diff --git a/models/new_touhou_model/yuuka/4c48dc12/yuuka_cast1.vanim_c b/models/new_touhou_model/yuuka/4c48dc12/yuuka_cast1.vanim_c new file mode 100755 index 0000000..8411584 Binary files /dev/null and b/models/new_touhou_model/yuuka/4c48dc12/yuuka_cast1.vanim_c differ diff --git a/models/new_touhou_model/yuuka/4c48dc12/yuuka_cast3.vanim_c b/models/new_touhou_model/yuuka/4c48dc12/yuuka_cast3.vanim_c new file mode 100755 index 0000000..b082204 Binary files /dev/null and b/models/new_touhou_model/yuuka/4c48dc12/yuuka_cast3.vanim_c differ diff --git a/models/new_touhou_model/yuuka/4c48dc12/yuuka_cast4.vanim_c b/models/new_touhou_model/yuuka/4c48dc12/yuuka_cast4.vanim_c new file mode 100755 index 0000000..e66c01d Binary files /dev/null and b/models/new_touhou_model/yuuka/4c48dc12/yuuka_cast4.vanim_c differ diff --git a/models/new_touhou_model/yuuka/4c48dc12/yuuka_idle.vanim_c b/models/new_touhou_model/yuuka/4c48dc12/yuuka_idle.vanim_c new file mode 100755 index 0000000..a8abf40 Binary files /dev/null and b/models/new_touhou_model/yuuka/4c48dc12/yuuka_idle.vanim_c differ diff --git a/models/new_touhou_model/yuuka/yuuka.vmdl_c b/models/new_touhou_model/yuuka/yuuka.vmdl_c new file mode 100755 index 0000000..b1adddc Binary files /dev/null and b/models/new_touhou_model/yuuka/yuuka.vmdl_c differ diff --git a/models/new_touhou_model/yuuka/yuuka.vmesh_c b/models/new_touhou_model/yuuka/yuuka.vmesh_c new file mode 100755 index 0000000..f49cf3f Binary files /dev/null and b/models/new_touhou_model/yuuka/yuuka.vmesh_c differ diff --git a/models/new_touhou_model/yuuka/yuuka_4c48dc12.vagrp_c b/models/new_touhou_model/yuuka/yuuka_4c48dc12.vagrp_c new file mode 100755 index 0000000..7f634f3 Binary files /dev/null and b/models/new_touhou_model/yuuka/yuuka_4c48dc12.vagrp_c differ diff --git a/models/other/paws/9e17cb5a/1.vanim_c b/models/other/paws/9e17cb5a/1.vanim_c new file mode 100755 index 0000000..649603b Binary files /dev/null and b/models/other/paws/9e17cb5a/1.vanim_c differ diff --git a/models/other/paws/9e17cb5a/paws.vanim_c b/models/other/paws/9e17cb5a/paws.vanim_c new file mode 100755 index 0000000..da3cd54 Binary files /dev/null and b/models/other/paws/9e17cb5a/paws.vanim_c differ diff --git a/models/other/paws/9e17cb5a/paws_idle.vanim_c b/models/other/paws/9e17cb5a/paws_idle.vanim_c new file mode 100755 index 0000000..5053410 Binary files /dev/null and b/models/other/paws/9e17cb5a/paws_idle.vanim_c differ diff --git a/models/other/paws/9e17cb5a/paws_nie.vanim_c b/models/other/paws/9e17cb5a/paws_nie.vanim_c new file mode 100755 index 0000000..d13e340 Binary files /dev/null and b/models/other/paws/9e17cb5a/paws_nie.vanim_c differ diff --git a/models/other/paws/9e17cb5a/paws_niebao.vanim_c b/models/other/paws/9e17cb5a/paws_niebao.vanim_c new file mode 100755 index 0000000..7c618c3 Binary files /dev/null and b/models/other/paws/9e17cb5a/paws_niebao.vanim_c differ diff --git a/models/other/paws/9e17cb5a/paws_zhuaqu.vanim_c b/models/other/paws/9e17cb5a/paws_zhuaqu.vanim_c new file mode 100755 index 0000000..135aa57 Binary files /dev/null and b/models/other/paws/9e17cb5a/paws_zhuaqu.vanim_c differ diff --git a/models/other/paws/paws.vmdl_c b/models/other/paws/paws.vmdl_c new file mode 100755 index 0000000..c591c47 Binary files /dev/null and b/models/other/paws/paws.vmdl_c differ diff --git a/models/other/paws/paws.vmesh_c b/models/other/paws/paws.vmesh_c new file mode 100755 index 0000000..c3a2440 Binary files /dev/null and b/models/other/paws/paws.vmesh_c differ diff --git a/models/other/paws/paws_9e17cb5a.vagrp_c b/models/other/paws/paws_9e17cb5a.vagrp_c new file mode 100755 index 0000000..cbe5757 Binary files /dev/null and b/models/other/paws/paws_9e17cb5a.vagrp_c differ diff --git a/models/other/tram_1/tram_1.vmdl_c b/models/other/tram_1/tram_1.vmdl_c new file mode 100755 index 0000000..f7df6e3 Binary files /dev/null and b/models/other/tram_1/tram_1.vmdl_c differ diff --git a/models/other/tram_1/tram_1.vmesh_c b/models/other/tram_1/tram_1.vmesh_c new file mode 100755 index 0000000..ad6843a Binary files /dev/null and b/models/other/tram_1/tram_1.vmesh_c differ diff --git a/models/qie/color1_jpg_adb56c16.vtex_c b/models/qie/color1_jpg_adb56c16.vtex_c new file mode 100755 index 0000000..08ebc2f Binary files /dev/null and b/models/qie/color1_jpg_adb56c16.vtex_c differ diff --git a/models/qie/color2_jpg_c5093a7.vtex_c b/models/qie/color2_jpg_c5093a7.vtex_c new file mode 100755 index 0000000..8f74d38 Binary files /dev/null and b/models/qie/color2_jpg_c5093a7.vtex_c differ diff --git a/models/qie/color2_jpg_e0427587.vtex_c b/models/qie/color2_jpg_e0427587.vtex_c new file mode 100755 index 0000000..ad4aa2d Binary files /dev/null and b/models/qie/color2_jpg_e0427587.vtex_c differ diff --git a/models/qie/color3_jpg_3200044.vtex_c b/models/qie/color3_jpg_3200044.vtex_c new file mode 100755 index 0000000..ab7f7f5 Binary files /dev/null and b/models/qie/color3_jpg_3200044.vtex_c differ diff --git a/models/qie/color3_jpg_a0263e47.vtex_c b/models/qie/color3_jpg_a0263e47.vtex_c new file mode 100755 index 0000000..3a504f3 Binary files /dev/null and b/models/qie/color3_jpg_a0263e47.vtex_c differ diff --git a/models/qie/color_jpg_6b17d528.vtex_c b/models/qie/color_jpg_6b17d528.vtex_c new file mode 100755 index 0000000..4aa1966 Binary files /dev/null and b/models/qie/color_jpg_6b17d528.vtex_c differ diff --git a/models/qie/color_jpg_b4042fc2.vtex_c b/models/qie/color_jpg_b4042fc2.vtex_c new file mode 100755 index 0000000..0d27a29 Binary files /dev/null and b/models/qie/color_jpg_b4042fc2.vtex_c differ diff --git a/models/qie/color_jpg_ec24fef2.vtex_c b/models/qie/color_jpg_ec24fef2.vtex_c new file mode 100755 index 0000000..9c7d752 Binary files /dev/null and b/models/qie/color_jpg_ec24fef2.vtex_c differ diff --git a/models/qie/dc799c0c/dead.vanim_c b/models/qie/dc799c0c/dead.vanim_c new file mode 100755 index 0000000..85ef161 Binary files /dev/null and b/models/qie/dc799c0c/dead.vanim_c differ diff --git a/models/qie/dc799c0c/idle.vanim_c b/models/qie/dc799c0c/idle.vanim_c new file mode 100755 index 0000000..a648ec0 Binary files /dev/null and b/models/qie/dc799c0c/idle.vanim_c differ diff --git a/models/qie/dc799c0c/run.vanim_c b/models/qie/dc799c0c/run.vanim_c new file mode 100755 index 0000000..624b5eb Binary files /dev/null and b/models/qie/dc799c0c/run.vanim_c differ diff --git a/models/qie/dc799c0c/speaw.vanim_c b/models/qie/dc799c0c/speaw.vanim_c new file mode 100755 index 0000000..055512e Binary files /dev/null and b/models/qie/dc799c0c/speaw.vanim_c differ diff --git a/models/qie/ed945614/dead.vanim_c b/models/qie/ed945614/dead.vanim_c new file mode 100755 index 0000000..5e56ce5 Binary files /dev/null and b/models/qie/ed945614/dead.vanim_c differ diff --git a/models/qie/ed945614/fly.vanim_c b/models/qie/ed945614/fly.vanim_c new file mode 100755 index 0000000..35fa831 Binary files /dev/null and b/models/qie/ed945614/fly.vanim_c differ diff --git a/models/qie/ed945614/idle.vanim_c b/models/qie/ed945614/idle.vanim_c new file mode 100755 index 0000000..55108f7 Binary files /dev/null and b/models/qie/ed945614/idle.vanim_c differ diff --git a/models/qie/ed945614/speaw.vanim_c b/models/qie/ed945614/speaw.vanim_c new file mode 100755 index 0000000..de4d122 Binary files /dev/null and b/models/qie/ed945614/speaw.vanim_c differ diff --git a/models/qie/fly.vmesh_c b/models/qie/fly.vmesh_c new file mode 100755 index 0000000..a628cee Binary files /dev/null and b/models/qie/fly.vmesh_c differ diff --git a/models/qie/idle.vmesh_c b/models/qie/idle.vmesh_c new file mode 100755 index 0000000..c1392a8 Binary files /dev/null and b/models/qie/idle.vmesh_c differ diff --git a/models/qie/qie.vmdl_c b/models/qie/qie.vmdl_c new file mode 100755 index 0000000..f75133a Binary files /dev/null and b/models/qie/qie.vmdl_c differ diff --git a/models/qie/qie_dc799c0c.vagrp_c b/models/qie/qie_dc799c0c.vagrp_c new file mode 100755 index 0000000..ccbcf50 Binary files /dev/null and b/models/qie/qie_dc799c0c.vagrp_c differ diff --git a/models/qie/qie_flying.vmdl_c b/models/qie/qie_flying.vmdl_c new file mode 100755 index 0000000..1db78c1 Binary files /dev/null and b/models/qie/qie_flying.vmdl_c differ diff --git a/models/qie/qie_flying_ed945614.vagrp_c b/models/qie/qie_flying_ed945614.vagrp_c new file mode 100755 index 0000000..b6d3a71 Binary files /dev/null and b/models/qie/qie_flying_ed945614.vagrp_c differ diff --git a/models/qie/shenti.vmat_c b/models/qie/shenti.vmat_c new file mode 100755 index 0000000..cca4614 Binary files /dev/null and b/models/qie/shenti.vmat_c differ diff --git a/models/qie/shenti2.vmat_c b/models/qie/shenti2.vmat_c new file mode 100755 index 0000000..76d869f Binary files /dev/null and b/models/qie/shenti2.vmat_c differ diff --git a/models/qie/shentix.vmat_c b/models/qie/shentix.vmat_c new file mode 100755 index 0000000..4a25d52 Binary files /dev/null and b/models/qie/shentix.vmat_c differ diff --git a/models/qie/shentiy.vmat_c b/models/qie/shentiy.vmat_c new file mode 100755 index 0000000..dabdb57 Binary files /dev/null and b/models/qie/shentiy.vmat_c differ diff --git a/models/qie/shentz.vmat_c b/models/qie/shentz.vmat_c new file mode 100755 index 0000000..4c1bdfd Binary files /dev/null and b/models/qie/shentz.vmat_c differ diff --git a/models/qie/toukui.vmat_c b/models/qie/toukui.vmat_c new file mode 100755 index 0000000..6ce11a6 Binary files /dev/null and b/models/qie/toukui.vmat_c differ diff --git a/models/reimu/onmyougyoku.vmdl_c b/models/reimu/onmyougyoku.vmdl_c new file mode 100755 index 0000000..48c7a2b Binary files /dev/null and b/models/reimu/onmyougyoku.vmdl_c differ diff --git a/models/reimu/onmyougyoku.vmesh_c b/models/reimu/onmyougyoku.vmesh_c new file mode 100755 index 0000000..0722bfb Binary files /dev/null and b/models/reimu/onmyougyoku.vmesh_c differ diff --git a/models/shinki/03ed6df9/attack1.vanim_c b/models/shinki/03ed6df9/attack1.vanim_c new file mode 100755 index 0000000..a0575fc Binary files /dev/null and b/models/shinki/03ed6df9/attack1.vanim_c differ diff --git a/models/shinki/03ed6df9/attack2.vanim_c b/models/shinki/03ed6df9/attack2.vanim_c new file mode 100755 index 0000000..78d9fcb Binary files /dev/null and b/models/shinki/03ed6df9/attack2.vanim_c differ diff --git a/models/shinki/03ed6df9/bingpose.vanim_c b/models/shinki/03ed6df9/bingpose.vanim_c new file mode 100755 index 0000000..c7674ba Binary files /dev/null and b/models/shinki/03ed6df9/bingpose.vanim_c differ diff --git a/models/shinki/03ed6df9/capture.vanim_c b/models/shinki/03ed6df9/capture.vanim_c new file mode 100755 index 0000000..d00bd5d Binary files /dev/null and b/models/shinki/03ed6df9/capture.vanim_c differ diff --git a/models/shinki/03ed6df9/cast1.vanim_c b/models/shinki/03ed6df9/cast1.vanim_c new file mode 100755 index 0000000..1a8914c Binary files /dev/null and b/models/shinki/03ed6df9/cast1.vanim_c differ diff --git a/models/shinki/03ed6df9/cast2.vanim_c b/models/shinki/03ed6df9/cast2.vanim_c new file mode 100755 index 0000000..422d43a Binary files /dev/null and b/models/shinki/03ed6df9/cast2.vanim_c differ diff --git a/models/shinki/03ed6df9/cast3.vanim_c b/models/shinki/03ed6df9/cast3.vanim_c new file mode 100755 index 0000000..a64f22d Binary files /dev/null and b/models/shinki/03ed6df9/cast3.vanim_c differ diff --git a/models/shinki/03ed6df9/cast4.vanim_c b/models/shinki/03ed6df9/cast4.vanim_c new file mode 100755 index 0000000..d6e042f Binary files /dev/null and b/models/shinki/03ed6df9/cast4.vanim_c differ diff --git a/models/shinki/03ed6df9/die.vanim_c b/models/shinki/03ed6df9/die.vanim_c new file mode 100755 index 0000000..2c8ec85 Binary files /dev/null and b/models/shinki/03ed6df9/die.vanim_c differ diff --git a/models/shinki/03ed6df9/disabled.vanim_c b/models/shinki/03ed6df9/disabled.vanim_c new file mode 100755 index 0000000..a4f7b83 Binary files /dev/null and b/models/shinki/03ed6df9/disabled.vanim_c differ diff --git a/models/shinki/03ed6df9/idle.vanim_c b/models/shinki/03ed6df9/idle.vanim_c new file mode 100755 index 0000000..b57cddf Binary files /dev/null and b/models/shinki/03ed6df9/idle.vanim_c differ diff --git a/models/shinki/03ed6df9/run.vanim_c b/models/shinki/03ed6df9/run.vanim_c new file mode 100755 index 0000000..bdbc375 Binary files /dev/null and b/models/shinki/03ed6df9/run.vanim_c differ diff --git a/models/shinki/shinki.vmdl_c b/models/shinki/shinki.vmdl_c new file mode 100755 index 0000000..9261015 Binary files /dev/null and b/models/shinki/shinki.vmdl_c differ diff --git a/models/shinki/shinki.vmesh_c b/models/shinki/shinki.vmesh_c new file mode 100755 index 0000000..ef35227 Binary files /dev/null and b/models/shinki/shinki.vmesh_c differ diff --git a/models/shinki/shinki.vmorf_c b/models/shinki/shinki.vmorf_c new file mode 100755 index 0000000..fd5af87 Binary files /dev/null and b/models/shinki/shinki.vmorf_c differ diff --git a/models/shinki/shinki/blousea1.vmat_c b/models/shinki/shinki/blousea1.vmat_c new file mode 100755 index 0000000..dd98c9f Binary files /dev/null and b/models/shinki/shinki/blousea1.vmat_c differ diff --git a/models/shinki/shinki/blousea1_png_b1aa2b8a.vtex_c b/models/shinki/shinki/blousea1_png_b1aa2b8a.vtex_c new file mode 100755 index 0000000..b7dcd7b Binary files /dev/null and b/models/shinki/shinki/blousea1_png_b1aa2b8a.vtex_c differ diff --git a/models/shinki/shinki/cloth2.vmat_c b/models/shinki/shinki/cloth2.vmat_c new file mode 100755 index 0000000..af741e7 Binary files /dev/null and b/models/shinki/shinki/cloth2.vmat_c differ diff --git a/models/shinki/shinki/cloth2_png_ce24d72.vtex_c b/models/shinki/shinki/cloth2_png_ce24d72.vtex_c new file mode 100755 index 0000000..8db94e3 Binary files /dev/null and b/models/shinki/shinki/cloth2_png_ce24d72.vtex_c differ diff --git a/models/shinki/shinki/dy01.vmat_c b/models/shinki/shinki/dy01.vmat_c new file mode 100755 index 0000000..79bca7b Binary files /dev/null and b/models/shinki/shinki/dy01.vmat_c differ diff --git a/models/shinki/shinki/dy01_png_62b3b2de.vtex_c b/models/shinki/shinki/dy01_png_62b3b2de.vtex_c new file mode 100755 index 0000000..bd3a345 Binary files /dev/null and b/models/shinki/shinki/dy01_png_62b3b2de.vtex_c differ diff --git a/models/shinki/shinki/dy02.vmat_c b/models/shinki/shinki/dy02.vmat_c new file mode 100755 index 0000000..46a047c Binary files /dev/null and b/models/shinki/shinki/dy02.vmat_c differ diff --git a/models/shinki/shinki/dy02_png_b2fb3165.vtex_c b/models/shinki/shinki/dy02_png_b2fb3165.vtex_c new file mode 100755 index 0000000..5c15881 Binary files /dev/null and b/models/shinki/shinki/dy02_png_b2fb3165.vtex_c differ diff --git a/models/shinki/shinki/fub.vmat_c b/models/shinki/shinki/fub.vmat_c new file mode 100755 index 0000000..9b6f780 Binary files /dev/null and b/models/shinki/shinki/fub.vmat_c differ diff --git a/models/shinki/shinki/fub_png_bc3ec2b7.vtex_c b/models/shinki/shinki/fub_png_bc3ec2b7.vtex_c new file mode 100755 index 0000000..49c63a6 Binary files /dev/null and b/models/shinki/shinki/fub_png_bc3ec2b7.vtex_c differ diff --git a/models/shinki/shinki/hair_d.vmat_c b/models/shinki/shinki/hair_d.vmat_c new file mode 100755 index 0000000..de070a1 Binary files /dev/null and b/models/shinki/shinki/hair_d.vmat_c differ diff --git a/models/shinki/shinki/hair_d_png_63bff560.vtex_c b/models/shinki/shinki/hair_d_png_63bff560.vtex_c new file mode 100755 index 0000000..4571526 Binary files /dev/null and b/models/shinki/shinki/hair_d_png_63bff560.vtex_c differ diff --git a/models/shinki/shinki/koishi_face.vmat_c b/models/shinki/shinki/koishi_face.vmat_c new file mode 100755 index 0000000..df66f05 Binary files /dev/null and b/models/shinki/shinki/koishi_face.vmat_c differ diff --git a/models/shinki/shinki/koishi_face_png_e250bdd1.vtex_c b/models/shinki/shinki/koishi_face_png_e250bdd1.vtex_c new file mode 100755 index 0000000..b3f1a00 Binary files /dev/null and b/models/shinki/shinki/koishi_face_png_e250bdd1.vtex_c differ diff --git a/models/shinki/shinki/koishi_face_png_efb01f9e.vtex_c b/models/shinki/shinki/koishi_face_png_efb01f9e.vtex_c new file mode 100755 index 0000000..e265391 Binary files /dev/null and b/models/shinki/shinki/koishi_face_png_efb01f9e.vtex_c differ diff --git a/models/shinki/shinki/mcbn.vmat_c b/models/shinki/shinki/mcbn.vmat_c new file mode 100755 index 0000000..046fb61 Binary files /dev/null and b/models/shinki/shinki/mcbn.vmat_c differ diff --git a/models/shinki/shinki/mcbn_png_6057e8e6.vtex_c b/models/shinki/shinki/mcbn_png_6057e8e6.vtex_c new file mode 100755 index 0000000..5cced96 Binary files /dev/null and b/models/shinki/shinki/mcbn_png_6057e8e6.vtex_c differ diff --git a/models/shinki/shinki/null.vmat_c b/models/shinki/shinki/null.vmat_c new file mode 100755 index 0000000..760ca26 Binary files /dev/null and b/models/shinki/shinki/null.vmat_c differ diff --git a/models/shinki/shinki/skirt.vmat_c b/models/shinki/shinki/skirt.vmat_c new file mode 100755 index 0000000..52e2e69 Binary files /dev/null and b/models/shinki/shinki/skirt.vmat_c differ diff --git a/models/shinki/shinki/skirt_png_687915ec.vtex_c b/models/shinki/shinki/skirt_png_687915ec.vtex_c new file mode 100755 index 0000000..5c15961 Binary files /dev/null and b/models/shinki/shinki/skirt_png_687915ec.vtex_c differ diff --git a/models/shinki/shinki/tex2_w.vmat_c b/models/shinki/shinki/tex2_w.vmat_c new file mode 100755 index 0000000..25c908c Binary files /dev/null and b/models/shinki/shinki/tex2_w.vmat_c differ diff --git a/models/shinki/shinki/tex2_w_png_6aa622f2.vtex_c b/models/shinki/shinki/tex2_w_png_6aa622f2.vtex_c new file mode 100755 index 0000000..c0a1160 Binary files /dev/null and b/models/shinki/shinki/tex2_w_png_6aa622f2.vtex_c differ diff --git a/models/shinki/shinki/texture6.vmat_c b/models/shinki/shinki/texture6.vmat_c new file mode 100755 index 0000000..6609f57 Binary files /dev/null and b/models/shinki/shinki/texture6.vmat_c differ diff --git a/models/shinki/shinki/texture6_png_88ea66d0.vtex_c b/models/shinki/shinki/texture6_png_88ea66d0.vtex_c new file mode 100755 index 0000000..f1f680e Binary files /dev/null and b/models/shinki/shinki/texture6_png_88ea66d0.vtex_c differ diff --git a/models/shinki/shinki/tr03.vmat_c b/models/shinki/shinki/tr03.vmat_c new file mode 100755 index 0000000..02f6bab Binary files /dev/null and b/models/shinki/shinki/tr03.vmat_c differ diff --git a/models/shinki/shinki/tr03_png_8ac4ad9.vtex_c b/models/shinki/shinki/tr03_png_8ac4ad9.vtex_c new file mode 100755 index 0000000..9074cd9 Binary files /dev/null and b/models/shinki/shinki/tr03_png_8ac4ad9.vtex_c differ diff --git a/models/shinki/shinki_03ed6df9.vagrp_c b/models/shinki/shinki_03ed6df9.vagrp_c new file mode 100755 index 0000000..4e720a3 Binary files /dev/null and b/models/shinki/shinki_03ed6df9.vagrp_c differ diff --git a/models/shinki/shinki_vmorf.vtex_c b/models/shinki/shinki_vmorf.vtex_c new file mode 100755 index 0000000..b07ccb3 Binary files /dev/null and b/models/shinki/shinki_vmorf.vtex_c differ diff --git a/models/shudaixiong/mask/jianpan/jianpan_color_tga_b66704e0.vtex_c b/models/shudaixiong/mask/jianpan/jianpan_color_tga_b66704e0.vtex_c new file mode 100755 index 0000000..f079424 Binary files /dev/null and b/models/shudaixiong/mask/jianpan/jianpan_color_tga_b66704e0.vtex_c differ diff --git a/models/shudaixiong/mask/jianpan/jianpan_detailmask_tga_b766f570.vtex_c b/models/shudaixiong/mask/jianpan/jianpan_detailmask_tga_b766f570.vtex_c new file mode 100755 index 0000000..10be404 Binary files /dev/null and b/models/shudaixiong/mask/jianpan/jianpan_detailmask_tga_b766f570.vtex_c differ diff --git a/models/shudaixiong/mask/jianpan/jianpan_normal_tga_be1cf31.vtex_c b/models/shudaixiong/mask/jianpan/jianpan_normal_tga_be1cf31.vtex_c new file mode 100755 index 0000000..da88205 Binary files /dev/null and b/models/shudaixiong/mask/jianpan/jianpan_normal_tga_be1cf31.vtex_c differ diff --git a/models/shudaixiong/mask/jianpan/jianpan_specmask_tga_746f9612.vtex_c b/models/shudaixiong/mask/jianpan/jianpan_specmask_tga_746f9612.vtex_c new file mode 100755 index 0000000..f03114e Binary files /dev/null and b/models/shudaixiong/mask/jianpan/jianpan_specmask_tga_746f9612.vtex_c differ diff --git a/models/shudaixiong/mask/naica/naica.vmat_c b/models/shudaixiong/mask/naica/naica.vmat_c new file mode 100755 index 0000000..8383157 Binary files /dev/null and b/models/shudaixiong/mask/naica/naica.vmat_c differ diff --git a/models/shudaixiong/mask/naica/naica_color_tga_281c7ef3.vtex_c b/models/shudaixiong/mask/naica/naica_color_tga_281c7ef3.vtex_c new file mode 100755 index 0000000..b63ccb0 Binary files /dev/null and b/models/shudaixiong/mask/naica/naica_color_tga_281c7ef3.vtex_c differ diff --git a/models/shudaixiong/mask/naica/naica_detailmask_tga_7ddb99c6.vtex_c b/models/shudaixiong/mask/naica/naica_detailmask_tga_7ddb99c6.vtex_c new file mode 100755 index 0000000..dc03373 Binary files /dev/null and b/models/shudaixiong/mask/naica/naica_detailmask_tga_7ddb99c6.vtex_c differ diff --git a/models/shudaixiong/mask/naica/naica_normal_tga_79f99357.vtex_c b/models/shudaixiong/mask/naica/naica_normal_tga_79f99357.vtex_c new file mode 100755 index 0000000..98f12b8 Binary files /dev/null and b/models/shudaixiong/mask/naica/naica_normal_tga_79f99357.vtex_c differ diff --git a/models/shudaixiong/mask/naica/naica_specmask_tga_34acb5f3.vtex_c b/models/shudaixiong/mask/naica/naica_specmask_tga_34acb5f3.vtex_c new file mode 100755 index 0000000..4aed80b Binary files /dev/null and b/models/shudaixiong/mask/naica/naica_specmask_tga_34acb5f3.vtex_c differ diff --git a/models/shudaixiong/mask/shubiao/shubiao_color_tga_2fea90c8.vtex_c b/models/shudaixiong/mask/shubiao/shubiao_color_tga_2fea90c8.vtex_c new file mode 100755 index 0000000..79d4804 Binary files /dev/null and b/models/shudaixiong/mask/shubiao/shubiao_color_tga_2fea90c8.vtex_c differ diff --git a/models/shudaixiong/mask/shubiao/shubiao_default_mask_png_f7c01ec7.vtex_c b/models/shudaixiong/mask/shubiao/shubiao_default_mask_png_f7c01ec7.vtex_c new file mode 100755 index 0000000..7b9137f Binary files /dev/null and b/models/shudaixiong/mask/shubiao/shubiao_default_mask_png_f7c01ec7.vtex_c differ diff --git a/models/shudaixiong/mask/shubiao/shubiao_detailmask_tga_449f93bd.vtex_c b/models/shudaixiong/mask/shubiao/shubiao_detailmask_tga_449f93bd.vtex_c new file mode 100755 index 0000000..712b73a Binary files /dev/null and b/models/shudaixiong/mask/shubiao/shubiao_detailmask_tga_449f93bd.vtex_c differ diff --git a/models/shudaixiong/mask/shubiao/shubiao_normal_tga_17a936bc.vtex_c b/models/shudaixiong/mask/shubiao/shubiao_normal_tga_17a936bc.vtex_c new file mode 100755 index 0000000..8f84623 Binary files /dev/null and b/models/shudaixiong/mask/shubiao/shubiao_normal_tga_17a936bc.vtex_c differ diff --git a/models/shudaixiong/mask/shubiao/shubiao_specmask_tga_89fdac8d.vtex_c b/models/shudaixiong/mask/shubiao/shubiao_specmask_tga_89fdac8d.vtex_c new file mode 100755 index 0000000..0a04790 Binary files /dev/null and b/models/shudaixiong/mask/shubiao/shubiao_specmask_tga_89fdac8d.vtex_c differ diff --git a/models/shudaixiong/mask/shudaixiong/jianpan.vmat_c b/models/shudaixiong/mask/shudaixiong/jianpan.vmat_c new file mode 100755 index 0000000..7323383 Binary files /dev/null and b/models/shudaixiong/mask/shudaixiong/jianpan.vmat_c differ diff --git a/models/shudaixiong/mask/shudaixiong/shubiao.vmat_c b/models/shudaixiong/mask/shudaixiong/shubiao.vmat_c new file mode 100755 index 0000000..8662491 Binary files /dev/null and b/models/shudaixiong/mask/shudaixiong/shubiao.vmat_c differ diff --git a/models/shudaixiong/mask/shudaixiong/shudaixiong.vmat_c b/models/shudaixiong/mask/shudaixiong/shudaixiong.vmat_c new file mode 100755 index 0000000..f285d11 Binary files /dev/null and b/models/shudaixiong/mask/shudaixiong/shudaixiong.vmat_c differ diff --git a/models/shudaixiong/mask/shudaixiong/shudaixiong_low_color_tga_32cfe540.vtex_c b/models/shudaixiong/mask/shudaixiong/shudaixiong_low_color_tga_32cfe540.vtex_c new file mode 100755 index 0000000..b0b1f2a Binary files /dev/null and b/models/shudaixiong/mask/shudaixiong/shudaixiong_low_color_tga_32cfe540.vtex_c differ diff --git a/models/shudaixiong/mask/shudaixiong/shudaixiong_low_detailmask_tga_fedd85bd.vtex_c b/models/shudaixiong/mask/shudaixiong/shudaixiong_low_detailmask_tga_fedd85bd.vtex_c new file mode 100755 index 0000000..c84e595 Binary files /dev/null and b/models/shudaixiong/mask/shudaixiong/shudaixiong_low_detailmask_tga_fedd85bd.vtex_c differ diff --git a/models/shudaixiong/mask/shudaixiong/shudaixiong_low_normal_tga_6b5f32f2.vtex_c b/models/shudaixiong/mask/shudaixiong/shudaixiong_low_normal_tga_6b5f32f2.vtex_c new file mode 100755 index 0000000..6d01183 Binary files /dev/null and b/models/shudaixiong/mask/shudaixiong/shudaixiong_low_normal_tga_6b5f32f2.vtex_c differ diff --git a/models/shudaixiong/mask/shudaixiong/shudaixiong_low_specmask_tga_2b0557af.vtex_c b/models/shudaixiong/mask/shudaixiong/shudaixiong_low_specmask_tga_2b0557af.vtex_c new file mode 100755 index 0000000..443247c Binary files /dev/null and b/models/shudaixiong/mask/shudaixiong/shudaixiong_low_specmask_tga_2b0557af.vtex_c differ diff --git a/models/shudaixiong/model/shudaixiong/12a4f795/shudaixiiong_death.vanim_c b/models/shudaixiong/model/shudaixiong/12a4f795/shudaixiiong_death.vanim_c new file mode 100755 index 0000000..01d4de0 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/12a4f795/shudaixiiong_death.vanim_c differ diff --git a/models/shudaixiong/model/shudaixiong/12a4f795/shudaixiong_idel.vanim_c b/models/shudaixiong/model/shudaixiong/12a4f795/shudaixiong_idel.vanim_c new file mode 100755 index 0000000..891d489 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/12a4f795/shudaixiong_idel.vanim_c differ diff --git a/models/shudaixiong/model/shudaixiong/12a4f795/shudaixiong_run.vanim_c b/models/shudaixiong/model/shudaixiong/12a4f795/shudaixiong_run.vanim_c new file mode 100755 index 0000000..ada2820 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/12a4f795/shudaixiong_run.vanim_c differ diff --git a/models/shudaixiong/model/shudaixiong/12a4f795/shudaixiong_spawn.vanim_c b/models/shudaixiong/model/shudaixiong/12a4f795/shudaixiong_spawn.vanim_c new file mode 100755 index 0000000..d7a9a0f Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/12a4f795/shudaixiong_spawn.vanim_c differ diff --git a/models/shudaixiong/model/shudaixiong/1b127c58/shudaixiiong_death.vanim_c b/models/shudaixiong/model/shudaixiong/1b127c58/shudaixiiong_death.vanim_c new file mode 100755 index 0000000..01d4de0 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/1b127c58/shudaixiiong_death.vanim_c differ diff --git a/models/shudaixiong/model/shudaixiong/1b127c58/shudaixiong_idel.vanim_c b/models/shudaixiong/model/shudaixiong/1b127c58/shudaixiong_idel.vanim_c new file mode 100755 index 0000000..891d489 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/1b127c58/shudaixiong_idel.vanim_c differ diff --git a/models/shudaixiong/model/shudaixiong/1b127c58/shudaixiong_run.vanim_c b/models/shudaixiong/model/shudaixiong/1b127c58/shudaixiong_run.vanim_c new file mode 100755 index 0000000..ada2820 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/1b127c58/shudaixiong_run.vanim_c differ diff --git a/models/shudaixiong/model/shudaixiong/1b127c58/shudaixiong_spawn.vanim_c b/models/shudaixiong/model/shudaixiong/1b127c58/shudaixiong_spawn.vanim_c new file mode 100755 index 0000000..d7a9a0f Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/1b127c58/shudaixiong_spawn.vanim_c differ diff --git a/models/shudaixiong/model/shudaixiong/shudaixiiong.vmdl_c b/models/shudaixiong/model/shudaixiong/shudaixiiong.vmdl_c new file mode 100755 index 0000000..1cacce3 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/shudaixiiong.vmdl_c differ diff --git a/models/shudaixiong/model/shudaixiong/shudaixiiong_1b127c58.vagrp_c b/models/shudaixiong/model/shudaixiong/shudaixiiong_1b127c58.vagrp_c new file mode 100755 index 0000000..6ee8b36 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/shudaixiiong_1b127c58.vagrp_c differ diff --git a/models/shudaixiong/model/shudaixiong/shudaixiiong_death.vmesh_c b/models/shudaixiong/model/shudaixiong/shudaixiiong_death.vmesh_c new file mode 100755 index 0000000..3b40703 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/shudaixiiong_death.vmesh_c differ diff --git a/models/shudaixiong/model/shudaixiong/shudaixiong.vmdl_c b/models/shudaixiong/model/shudaixiong/shudaixiong.vmdl_c new file mode 100755 index 0000000..a992e22 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/shudaixiong.vmdl_c differ diff --git a/models/shudaixiong/model/shudaixiong/shudaixiong_12a4f795.vagrp_c b/models/shudaixiong/model/shudaixiong/shudaixiong_12a4f795.vagrp_c new file mode 100755 index 0000000..8e46f29 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong/shudaixiong_12a4f795.vagrp_c differ diff --git a/models/shudaixiong/model/shudaixiong_flying/2ceb8555/shudaixiong_fly_death.vanim_c b/models/shudaixiong/model/shudaixiong_flying/2ceb8555/shudaixiong_fly_death.vanim_c new file mode 100755 index 0000000..991f0e6 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong_flying/2ceb8555/shudaixiong_fly_death.vanim_c differ diff --git a/models/shudaixiong/model/shudaixiong_flying/2ceb8555/shudaixiong_fly_idel.vanim_c b/models/shudaixiong/model/shudaixiong_flying/2ceb8555/shudaixiong_fly_idel.vanim_c new file mode 100755 index 0000000..dfadc57 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong_flying/2ceb8555/shudaixiong_fly_idel.vanim_c differ diff --git a/models/shudaixiong/model/shudaixiong_flying/2ceb8555/shudaixiong_fly_run.vanim_c b/models/shudaixiong/model/shudaixiong_flying/2ceb8555/shudaixiong_fly_run.vanim_c new file mode 100755 index 0000000..5062fbb Binary files /dev/null and b/models/shudaixiong/model/shudaixiong_flying/2ceb8555/shudaixiong_fly_run.vanim_c differ diff --git a/models/shudaixiong/model/shudaixiong_flying/2ceb8555/shudaixiong_fly_spanw.vanim_c b/models/shudaixiong/model/shudaixiong_flying/2ceb8555/shudaixiong_fly_spanw.vanim_c new file mode 100755 index 0000000..c182855 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong_flying/2ceb8555/shudaixiong_fly_spanw.vanim_c differ diff --git a/models/shudaixiong/model/shudaixiong_flying/shudaixiong_fly_idel.vmesh_c b/models/shudaixiong/model/shudaixiong_flying/shudaixiong_fly_idel.vmesh_c new file mode 100755 index 0000000..9f421cb Binary files /dev/null and b/models/shudaixiong/model/shudaixiong_flying/shudaixiong_fly_idel.vmesh_c differ diff --git a/models/shudaixiong/model/shudaixiong_flying/shudaixiong_flying.vmdl_c b/models/shudaixiong/model/shudaixiong_flying/shudaixiong_flying.vmdl_c new file mode 100755 index 0000000..e614b97 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong_flying/shudaixiong_flying.vmdl_c differ diff --git a/models/shudaixiong/model/shudaixiong_flying/shudaixiong_flying_2ceb8555.vagrp_c b/models/shudaixiong/model/shudaixiong_flying/shudaixiong_flying_2ceb8555.vagrp_c new file mode 100755 index 0000000..67ca615 Binary files /dev/null and b/models/shudaixiong/model/shudaixiong_flying/shudaixiong_flying_2ceb8555.vagrp_c differ diff --git a/models/tei/body.vmat_c b/models/tei/body.vmat_c new file mode 100755 index 0000000..6d579b8 Binary files /dev/null and b/models/tei/body.vmat_c differ diff --git a/models/tei/body_1.vmat_c b/models/tei/body_1.vmat_c new file mode 100755 index 0000000..928f764 Binary files /dev/null and b/models/tei/body_1.vmat_c differ diff --git a/models/tei/body_png_14dc0524.vtex_c b/models/tei/body_png_14dc0524.vtex_c new file mode 100755 index 0000000..b930a27 Binary files /dev/null and b/models/tei/body_png_14dc0524.vtex_c differ diff --git a/models/tei/cloth.vmat_c b/models/tei/cloth.vmat_c new file mode 100755 index 0000000..b7acfe0 Binary files /dev/null and b/models/tei/cloth.vmat_c differ diff --git a/models/tei/cloth_1.vmat_c b/models/tei/cloth_1.vmat_c new file mode 100755 index 0000000..fd5ca43 Binary files /dev/null and b/models/tei/cloth_1.vmat_c differ diff --git a/models/tei/cloth_2.vmat_c b/models/tei/cloth_2.vmat_c new file mode 100755 index 0000000..bf322cd Binary files /dev/null and b/models/tei/cloth_2.vmat_c differ diff --git a/models/tei/cloth_3.vmat_c b/models/tei/cloth_3.vmat_c new file mode 100755 index 0000000..0242910 Binary files /dev/null and b/models/tei/cloth_3.vmat_c differ diff --git a/models/tei/cloth_4.vmat_c b/models/tei/cloth_4.vmat_c new file mode 100755 index 0000000..35d9895 Binary files /dev/null and b/models/tei/cloth_4.vmat_c differ diff --git a/models/tei/cloth_5.vmat_c b/models/tei/cloth_5.vmat_c new file mode 100755 index 0000000..34ed86b Binary files /dev/null and b/models/tei/cloth_5.vmat_c differ diff --git a/models/tei/cloth_6.vmat_c b/models/tei/cloth_6.vmat_c new file mode 100755 index 0000000..dc8d22c Binary files /dev/null and b/models/tei/cloth_6.vmat_c differ diff --git a/models/tei/cloth_7.vmat_c b/models/tei/cloth_7.vmat_c new file mode 100755 index 0000000..b608766 Binary files /dev/null and b/models/tei/cloth_7.vmat_c differ diff --git a/models/tei/cloth_png_c0f362a4.vtex_c b/models/tei/cloth_png_c0f362a4.vtex_c new file mode 100755 index 0000000..5b2e54c Binary files /dev/null and b/models/tei/cloth_png_c0f362a4.vtex_c differ diff --git a/models/tei/debody.vmat_c b/models/tei/debody.vmat_c new file mode 100755 index 0000000..0a9847d Binary files /dev/null and b/models/tei/debody.vmat_c differ diff --git a/models/tei/debody1.vmat_c b/models/tei/debody1.vmat_c new file mode 100755 index 0000000..21a5e0e Binary files /dev/null and b/models/tei/debody1.vmat_c differ diff --git a/models/tei/debody1_png_5b403c25.vtex_c b/models/tei/debody1_png_5b403c25.vtex_c new file mode 100755 index 0000000..a48e777 Binary files /dev/null and b/models/tei/debody1_png_5b403c25.vtex_c differ diff --git a/models/tei/debody_png_a24cc85.vtex_c b/models/tei/debody_png_a24cc85.vtex_c new file mode 100755 index 0000000..ea8feeb Binary files /dev/null and b/models/tei/debody_png_a24cc85.vtex_c differ diff --git a/models/tei/eye.vmat_c b/models/tei/eye.vmat_c new file mode 100755 index 0000000..b43c655 Binary files /dev/null and b/models/tei/eye.vmat_c differ diff --git a/models/tei/eye_png_80106387.vtex_c b/models/tei/eye_png_80106387.vtex_c new file mode 100755 index 0000000..948d80a Binary files /dev/null and b/models/tei/eye_png_80106387.vtex_c differ diff --git a/models/tei/face.vmat_c b/models/tei/face.vmat_c new file mode 100755 index 0000000..1e693a9 Binary files /dev/null and b/models/tei/face.vmat_c differ diff --git a/models/tei/face_1.vmat_c b/models/tei/face_1.vmat_c new file mode 100755 index 0000000..04c4f2c Binary files /dev/null and b/models/tei/face_1.vmat_c differ diff --git a/models/tei/face_2.vmat_c b/models/tei/face_2.vmat_c new file mode 100755 index 0000000..76d837a Binary files /dev/null and b/models/tei/face_2.vmat_c differ diff --git a/models/tei/face_3.vmat_c b/models/tei/face_3.vmat_c new file mode 100755 index 0000000..2458771 Binary files /dev/null and b/models/tei/face_3.vmat_c differ diff --git a/models/tei/face_png_a2a0ebc5.vtex_c b/models/tei/face_png_a2a0ebc5.vtex_c new file mode 100755 index 0000000..77b30bf Binary files /dev/null and b/models/tei/face_png_a2a0ebc5.vtex_c differ diff --git a/models/tei/fd9cad11/tei_attack.vanim_c b/models/tei/fd9cad11/tei_attack.vanim_c new file mode 100755 index 0000000..b199ae3 Binary files /dev/null and b/models/tei/fd9cad11/tei_attack.vanim_c differ diff --git a/models/tei/fd9cad11/tei_cast1.vanim_c b/models/tei/fd9cad11/tei_cast1.vanim_c new file mode 100755 index 0000000..de6c838 Binary files /dev/null and b/models/tei/fd9cad11/tei_cast1.vanim_c differ diff --git a/models/tei/fd9cad11/tei_cast2.vanim_c b/models/tei/fd9cad11/tei_cast2.vanim_c new file mode 100755 index 0000000..98cb734 Binary files /dev/null and b/models/tei/fd9cad11/tei_cast2.vanim_c differ diff --git a/models/tei/fd9cad11/tei_cast3.vanim_c b/models/tei/fd9cad11/tei_cast3.vanim_c new file mode 100755 index 0000000..ec3b6a3 Binary files /dev/null and b/models/tei/fd9cad11/tei_cast3.vanim_c differ diff --git a/models/tei/fd9cad11/tei_die.vanim_c b/models/tei/fd9cad11/tei_die.vanim_c new file mode 100755 index 0000000..5bdeed9 Binary files /dev/null and b/models/tei/fd9cad11/tei_die.vanim_c differ diff --git a/models/tei/fd9cad11/tei_disabled.vanim_c b/models/tei/fd9cad11/tei_disabled.vanim_c new file mode 100755 index 0000000..4ae38b8 Binary files /dev/null and b/models/tei/fd9cad11/tei_disabled.vanim_c differ diff --git a/models/tei/fd9cad11/tei_idle.vanim_c b/models/tei/fd9cad11/tei_idle.vanim_c new file mode 100755 index 0000000..49fbf22 Binary files /dev/null and b/models/tei/fd9cad11/tei_idle.vanim_c differ diff --git a/models/tei/fd9cad11/tei_run.vanim_c b/models/tei/fd9cad11/tei_run.vanim_c new file mode 100755 index 0000000..175a190 Binary files /dev/null and b/models/tei/fd9cad11/tei_run.vanim_c differ diff --git a/models/tei/hair.vmat_c b/models/tei/hair.vmat_c new file mode 100755 index 0000000..1585d5c Binary files /dev/null and b/models/tei/hair.vmat_c differ diff --git a/models/tei/hair_1.vmat_c b/models/tei/hair_1.vmat_c new file mode 100755 index 0000000..6a3c842 Binary files /dev/null and b/models/tei/hair_1.vmat_c differ diff --git a/models/tei/hair_2.vmat_c b/models/tei/hair_2.vmat_c new file mode 100755 index 0000000..6f9e437 Binary files /dev/null and b/models/tei/hair_2.vmat_c differ diff --git a/models/tei/hair_png_a1c54520.vtex_c b/models/tei/hair_png_a1c54520.vtex_c new file mode 100755 index 0000000..2b903cb Binary files /dev/null and b/models/tei/hair_png_a1c54520.vtex_c differ diff --git a/models/tei/high_light.vmat_c b/models/tei/high_light.vmat_c new file mode 100755 index 0000000..d6d1349 Binary files /dev/null and b/models/tei/high_light.vmat_c differ diff --git a/models/tei/high_light_png_41e1116.vtex_c b/models/tei/high_light_png_41e1116.vtex_c new file mode 100755 index 0000000..5cf17eb Binary files /dev/null and b/models/tei/high_light_png_41e1116.vtex_c differ diff --git a/models/tei/null.vmat_c b/models/tei/null.vmat_c new file mode 100755 index 0000000..7738d52 Binary files /dev/null and b/models/tei/null.vmat_c differ diff --git a/models/tei/null_1.vmat_c b/models/tei/null_1.vmat_c new file mode 100755 index 0000000..f30bd71 Binary files /dev/null and b/models/tei/null_1.vmat_c differ diff --git a/models/tei/null_2.vmat_c b/models/tei/null_2.vmat_c new file mode 100755 index 0000000..86a38cf Binary files /dev/null and b/models/tei/null_2.vmat_c differ diff --git a/models/tei/null_3.vmat_c b/models/tei/null_3.vmat_c new file mode 100755 index 0000000..e58e331 Binary files /dev/null and b/models/tei/null_3.vmat_c differ diff --git a/models/tei/null_r.vmat_c b/models/tei/null_r.vmat_c new file mode 100755 index 0000000..f879b71 Binary files /dev/null and b/models/tei/null_r.vmat_c differ diff --git a/models/tei/null_s.vmat_c b/models/tei/null_s.vmat_c new file mode 100755 index 0000000..3bc6285 Binary files /dev/null and b/models/tei/null_s.vmat_c differ diff --git a/models/tei/null_s_1.vmat_c b/models/tei/null_s_1.vmat_c new file mode 100755 index 0000000..c0dfdd9 Binary files /dev/null and b/models/tei/null_s_1.vmat_c differ diff --git a/models/tei/null_y.vmat_c b/models/tei/null_y.vmat_c new file mode 100755 index 0000000..8a5d48e Binary files /dev/null and b/models/tei/null_y.vmat_c differ diff --git a/models/tei/rif_aug.vmat_c b/models/tei/rif_aug.vmat_c new file mode 100755 index 0000000..aa99579 Binary files /dev/null and b/models/tei/rif_aug.vmat_c differ diff --git a/models/tei/rif_aug_scope.vmat_c b/models/tei/rif_aug_scope.vmat_c new file mode 100755 index 0000000..f938948 Binary files /dev/null and b/models/tei/rif_aug_scope.vmat_c differ diff --git a/models/tei/rif_aug_scope_tga_9cadfbed.vtex_c b/models/tei/rif_aug_scope_tga_9cadfbed.vtex_c new file mode 100755 index 0000000..76cfc8f Binary files /dev/null and b/models/tei/rif_aug_scope_tga_9cadfbed.vtex_c differ diff --git a/models/tei/rif_aug_tga_f711f69f.vtex_c b/models/tei/rif_aug_tga_f711f69f.vtex_c new file mode 100755 index 0000000..6e5be93 Binary files /dev/null and b/models/tei/rif_aug_tga_f711f69f.vtex_c differ diff --git a/models/tei/tei2.vmdl_c b/models/tei/tei2.vmdl_c new file mode 100755 index 0000000..65b9188 Binary files /dev/null and b/models/tei/tei2.vmdl_c differ diff --git a/models/tei/tei2_fd9cad11.vagrp_c b/models/tei/tei2_fd9cad11.vagrp_c new file mode 100755 index 0000000..ffcdd60 Binary files /dev/null and b/models/tei/tei2_fd9cad11.vagrp_c differ diff --git a/models/tei/tei_f49f4904.vmesh_c b/models/tei/tei_f49f4904.vmesh_c new file mode 100755 index 0000000..abfd290 Binary files /dev/null and b/models/tei/tei_f49f4904.vmesh_c differ diff --git a/models/tei/white.vmat_c b/models/tei/white.vmat_c new file mode 100755 index 0000000..f7b9437 Binary files /dev/null and b/models/tei/white.vmat_c differ diff --git a/models/tei/white_png_73005c8f.vtex_c b/models/tei/white_png_73005c8f.vtex_c new file mode 100755 index 0000000..41e0204 Binary files /dev/null and b/models/tei/white_png_73005c8f.vtex_c differ diff --git a/models/thd2/2a7f126c/yuyuko_fan_a.vanim_c b/models/thd2/2a7f126c/yuyuko_fan_a.vanim_c new file mode 100755 index 0000000..5a5c706 Binary files /dev/null and b/models/thd2/2a7f126c/yuyuko_fan_a.vanim_c differ diff --git a/models/thd2/4e31b715/firewing_stand.vanim_c b/models/thd2/4e31b715/firewing_stand.vanim_c new file mode 100755 index 0000000..76786b2 Binary files /dev/null and b/models/thd2/4e31b715/firewing_stand.vanim_c differ diff --git a/models/thd2/ba431f01/blsss_01_death.vanim_c b/models/thd2/ba431f01/blsss_01_death.vanim_c new file mode 100755 index 0000000..d13f399 Binary files /dev/null and b/models/thd2/ba431f01/blsss_01_death.vanim_c differ diff --git a/models/thd2/ba431f01/blsss_01_stand.vanim_c b/models/thd2/ba431f01/blsss_01_stand.vanim_c new file mode 100755 index 0000000..00a432d Binary files /dev/null and b/models/thd2/ba431f01/blsss_01_stand.vanim_c differ diff --git a/models/thd2/blsss.vmdl_c b/models/thd2/blsss.vmdl_c new file mode 100755 index 0000000..425cc52 Binary files /dev/null and b/models/thd2/blsss.vmdl_c differ diff --git a/models/thd2/blsss/0f73a2a1/blsss_02_death.vanim_c b/models/thd2/blsss/0f73a2a1/blsss_02_death.vanim_c new file mode 100755 index 0000000..d53683c Binary files /dev/null and b/models/thd2/blsss/0f73a2a1/blsss_02_death.vanim_c differ diff --git a/models/thd2/blsss/0f73a2a1/blsss_02_stand.vanim_c b/models/thd2/blsss/0f73a2a1/blsss_02_stand.vanim_c new file mode 100755 index 0000000..e87dfc5 Binary files /dev/null and b/models/thd2/blsss/0f73a2a1/blsss_02_stand.vanim_c differ diff --git a/models/thd2/blsss/b667adb4/blsss_03_death.vanim_c b/models/thd2/blsss/b667adb4/blsss_03_death.vanim_c new file mode 100755 index 0000000..300901b Binary files /dev/null and b/models/thd2/blsss/b667adb4/blsss_03_death.vanim_c differ diff --git a/models/thd2/blsss/b667adb4/blsss_03_stand.vanim_c b/models/thd2/blsss/b667adb4/blsss_03_stand.vanim_c new file mode 100755 index 0000000..9d9c1c1 Binary files /dev/null and b/models/thd2/blsss/b667adb4/blsss_03_stand.vanim_c differ diff --git a/models/thd2/blsss/blsss_01.vmesh_c b/models/thd2/blsss/blsss_01.vmesh_c new file mode 100755 index 0000000..6415fd6 Binary files /dev/null and b/models/thd2/blsss/blsss_01.vmesh_c differ diff --git a/models/thd2/blsss/blsss_01_779531b3.vagrp_c b/models/thd2/blsss/blsss_01_779531b3.vagrp_c new file mode 100755 index 0000000..f27848c Binary files /dev/null and b/models/thd2/blsss/blsss_01_779531b3.vagrp_c differ diff --git a/models/thd2/blsss/blsss_02.vmdl_c b/models/thd2/blsss/blsss_02.vmdl_c new file mode 100755 index 0000000..9fe55e0 Binary files /dev/null and b/models/thd2/blsss/blsss_02.vmdl_c differ diff --git a/models/thd2/blsss/blsss_02.vmesh_c b/models/thd2/blsss/blsss_02.vmesh_c new file mode 100755 index 0000000..cc16197 Binary files /dev/null and b/models/thd2/blsss/blsss_02.vmesh_c differ diff --git a/models/thd2/blsss/blsss_02_0f73a2a1.vagrp_c b/models/thd2/blsss/blsss_02_0f73a2a1.vagrp_c new file mode 100755 index 0000000..365ed1a Binary files /dev/null and b/models/thd2/blsss/blsss_02_0f73a2a1.vagrp_c differ diff --git a/models/thd2/blsss/blsss_02_3fc7faa0.vagrp_c b/models/thd2/blsss/blsss_02_3fc7faa0.vagrp_c new file mode 100755 index 0000000..98a7aee Binary files /dev/null and b/models/thd2/blsss/blsss_02_3fc7faa0.vagrp_c differ diff --git a/models/thd2/blsss/blsss_03.vmdl_c b/models/thd2/blsss/blsss_03.vmdl_c new file mode 100755 index 0000000..667743c Binary files /dev/null and b/models/thd2/blsss/blsss_03.vmdl_c differ diff --git a/models/thd2/blsss/blsss_03.vmesh_c b/models/thd2/blsss/blsss_03.vmesh_c new file mode 100755 index 0000000..f188b88 Binary files /dev/null and b/models/thd2/blsss/blsss_03.vmesh_c differ diff --git a/models/thd2/blsss/blsss_03_a99579a0.vagrp_c b/models/thd2/blsss/blsss_03_a99579a0.vagrp_c new file mode 100755 index 0000000..f8d7943 Binary files /dev/null and b/models/thd2/blsss/blsss_03_a99579a0.vagrp_c differ diff --git a/models/thd2/blsss/blsss_03_b667adb4.vagrp_c b/models/thd2/blsss/blsss_03_b667adb4.vagrp_c new file mode 100755 index 0000000..8eb4392 Binary files /dev/null and b/models/thd2/blsss/blsss_03_b667adb4.vagrp_c differ diff --git a/models/thd2/blsss/gate.vmdl_c b/models/thd2/blsss/gate.vmdl_c new file mode 100755 index 0000000..efc84fc Binary files /dev/null and b/models/thd2/blsss/gate.vmdl_c differ diff --git a/models/thd2/blsss/gate.vmesh_c b/models/thd2/blsss/gate.vmesh_c new file mode 100755 index 0000000..671e0bf Binary files /dev/null and b/models/thd2/blsss/gate.vmesh_c differ diff --git a/models/thd2/blsss_01.vmesh_c b/models/thd2/blsss_01.vmesh_c new file mode 100755 index 0000000..25727bc Binary files /dev/null and b/models/thd2/blsss_01.vmesh_c differ diff --git a/models/thd2/blsss_ba431f01.vagrp_c b/models/thd2/blsss_ba431f01.vagrp_c new file mode 100755 index 0000000..d99143f Binary files /dev/null and b/models/thd2/blsss_ba431f01.vagrp_c differ diff --git a/models/thd2/blsss_cbaeaf6f.vagrp_c b/models/thd2/blsss_cbaeaf6f.vagrp_c new file mode 100755 index 0000000..1ad520d Binary files /dev/null and b/models/thd2/blsss_cbaeaf6f.vagrp_c differ diff --git a/models/thd2/firewing.vmdl_c b/models/thd2/firewing.vmdl_c new file mode 100755 index 0000000..970bf6d Binary files /dev/null and b/models/thd2/firewing.vmdl_c differ diff --git a/models/thd2/firewing.vmesh_c b/models/thd2/firewing.vmesh_c new file mode 100755 index 0000000..55e3e3c Binary files /dev/null and b/models/thd2/firewing.vmesh_c differ diff --git a/models/thd2/firewing_4e31b715.vagrp_c b/models/thd2/firewing_4e31b715.vagrp_c new file mode 100755 index 0000000..f6ac144 Binary files /dev/null and b/models/thd2/firewing_4e31b715.vagrp_c differ diff --git a/models/thd2/firewing_85702f93.vagrp_c b/models/thd2/firewing_85702f93.vagrp_c new file mode 100755 index 0000000..08628be Binary files /dev/null and b/models/thd2/firewing_85702f93.vagrp_c differ diff --git a/models/thd2/iku/iku_lightning_drill.vmdl_c b/models/thd2/iku/iku_lightning_drill.vmdl_c new file mode 100755 index 0000000..c8e1479 Binary files /dev/null and b/models/thd2/iku/iku_lightning_drill.vmdl_c differ diff --git a/models/thd2/iku/iku_lightning_drill.vmesh_c b/models/thd2/iku/iku_lightning_drill.vmesh_c new file mode 100755 index 0000000..53b859e Binary files /dev/null and b/models/thd2/iku/iku_lightning_drill.vmesh_c differ diff --git a/models/thd2/kaguya/48cef8c0/kaguya_mmd_kamidakara_3.vanim_c b/models/thd2/kaguya/48cef8c0/kaguya_mmd_kamidakara_3.vanim_c new file mode 100755 index 0000000..d1fbf5c Binary files /dev/null and b/models/thd2/kaguya/48cef8c0/kaguya_mmd_kamidakara_3.vanim_c differ diff --git a/models/thd2/kaguya/48cef8c0/kaguya_mmd_kamidakara_3a.vanim_c b/models/thd2/kaguya/48cef8c0/kaguya_mmd_kamidakara_3a.vanim_c new file mode 100755 index 0000000..55817a6 Binary files /dev/null and b/models/thd2/kaguya/48cef8c0/kaguya_mmd_kamidakara_3a.vanim_c differ diff --git a/models/thd2/kaguya/4dc4e304/kaguya_mmd_kamidakara_1.vanim_c b/models/thd2/kaguya/4dc4e304/kaguya_mmd_kamidakara_1.vanim_c new file mode 100755 index 0000000..c4e4649 Binary files /dev/null and b/models/thd2/kaguya/4dc4e304/kaguya_mmd_kamidakara_1.vanim_c differ diff --git a/models/thd2/kaguya/4dc4e304/kaguya_mmd_kamidakara_1a.vanim_c b/models/thd2/kaguya/4dc4e304/kaguya_mmd_kamidakara_1a.vanim_c new file mode 100755 index 0000000..7440be5 Binary files /dev/null and b/models/thd2/kaguya/4dc4e304/kaguya_mmd_kamidakara_1a.vanim_c differ diff --git a/models/thd2/kaguya/9b8cecbf/kaguya_mmd_kamidakara_4.vanim_c b/models/thd2/kaguya/9b8cecbf/kaguya_mmd_kamidakara_4.vanim_c new file mode 100755 index 0000000..ce9b247 Binary files /dev/null and b/models/thd2/kaguya/9b8cecbf/kaguya_mmd_kamidakara_4.vanim_c differ diff --git a/models/thd2/kaguya/9b8cecbf/kaguya_mmd_kamidakara_4a.vanim_c b/models/thd2/kaguya/9b8cecbf/kaguya_mmd_kamidakara_4a.vanim_c new file mode 100755 index 0000000..2e4fd6a Binary files /dev/null and b/models/thd2/kaguya/9b8cecbf/kaguya_mmd_kamidakara_4a.vanim_c differ diff --git a/models/thd2/kaguya/cb70e8b6/kaguya_mmd_kamidakara_2.vanim_c b/models/thd2/kaguya/cb70e8b6/kaguya_mmd_kamidakara_2.vanim_c new file mode 100755 index 0000000..872a797 Binary files /dev/null and b/models/thd2/kaguya/cb70e8b6/kaguya_mmd_kamidakara_2.vanim_c differ diff --git a/models/thd2/kaguya/cb70e8b6/kaguya_mmd_kamidakara_2a.vanim_c b/models/thd2/kaguya/cb70e8b6/kaguya_mmd_kamidakara_2a.vanim_c new file mode 100755 index 0000000..2f800cf Binary files /dev/null and b/models/thd2/kaguya/cb70e8b6/kaguya_mmd_kamidakara_2a.vanim_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_1.vmdl_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_1.vmdl_c new file mode 100755 index 0000000..bca0272 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_1.vmdl_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_1.vmesh_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_1.vmesh_c new file mode 100755 index 0000000..79585a6 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_1.vmesh_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_1_4dc4e304.vagrp_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_1_4dc4e304.vagrp_c new file mode 100755 index 0000000..c09cc90 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_1_4dc4e304.vagrp_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_1_7eae02c0.vagrp_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_1_7eae02c0.vagrp_c new file mode 100755 index 0000000..0179b80 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_1_7eae02c0.vagrp_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_2.vmdl_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_2.vmdl_c new file mode 100755 index 0000000..acf52f4 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_2.vmdl_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_2.vmesh_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_2.vmesh_c new file mode 100755 index 0000000..6baefed Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_2.vmesh_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_2_cb70e8b6.vagrp_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_2_cb70e8b6.vagrp_c new file mode 100755 index 0000000..5732212 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_2_cb70e8b6.vagrp_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_2_dfeccb44.vagrp_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_2_dfeccb44.vagrp_c new file mode 100755 index 0000000..1ab7548 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_2_dfeccb44.vagrp_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_3.vmdl_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_3.vmdl_c new file mode 100755 index 0000000..5103dee Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_3.vmdl_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_3.vmesh_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_3.vmesh_c new file mode 100755 index 0000000..406c638 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_3.vmesh_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_3_48cef8c0.vagrp_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_3_48cef8c0.vagrp_c new file mode 100755 index 0000000..9ab2546 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_3_48cef8c0.vagrp_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_3_9b812ebc.vagrp_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_3_9b812ebc.vagrp_c new file mode 100755 index 0000000..612f098 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_3_9b812ebc.vagrp_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_4.vmdl_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_4.vmdl_c new file mode 100755 index 0000000..0683a56 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_4.vmdl_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_4.vmesh_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_4.vmesh_c new file mode 100755 index 0000000..972fc86 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_4.vmesh_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_4_96c13d6b.vagrp_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_4_96c13d6b.vagrp_c new file mode 100755 index 0000000..9d5d377 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_4_96c13d6b.vagrp_c differ diff --git a/models/thd2/kaguya/kaguya_mmd_kamidakara_4_9b8cecbf.vagrp_c b/models/thd2/kaguya/kaguya_mmd_kamidakara_4_9b8cecbf.vagrp_c new file mode 100755 index 0000000..b08d525 Binary files /dev/null and b/models/thd2/kaguya/kaguya_mmd_kamidakara_4_9b8cecbf.vagrp_c differ diff --git a/models/thd2/kanako/76758ba0/kanako_mmd_q_act_dota_die.vanim_c b/models/thd2/kanako/76758ba0/kanako_mmd_q_act_dota_die.vanim_c new file mode 100755 index 0000000..06f9685 Binary files /dev/null and b/models/thd2/kanako/76758ba0/kanako_mmd_q_act_dota_die.vanim_c differ diff --git a/models/thd2/kanako/76758ba0/kanako_mmd_q_act_dota_idle.vanim_c b/models/thd2/kanako/76758ba0/kanako_mmd_q_act_dota_idle.vanim_c new file mode 100755 index 0000000..a88cbc2 Binary files /dev/null and b/models/thd2/kanako/76758ba0/kanako_mmd_q_act_dota_idle.vanim_c differ diff --git a/models/thd2/kanako/76758ba0/kanako_mmd_q_act_dota_run.vanim_c b/models/thd2/kanako/76758ba0/kanako_mmd_q_act_dota_run.vanim_c new file mode 100755 index 0000000..6d952ef Binary files /dev/null and b/models/thd2/kanako/76758ba0/kanako_mmd_q_act_dota_run.vanim_c differ diff --git a/models/thd2/kanako/76758ba0/kanako_mmd_rq_act_dota_run.vanim_c b/models/thd2/kanako/76758ba0/kanako_mmd_rq_act_dota_run.vanim_c new file mode 100755 index 0000000..893f6a9 Binary files /dev/null and b/models/thd2/kanako/76758ba0/kanako_mmd_rq_act_dota_run.vanim_c differ diff --git a/models/thd2/kanako/a0a76351/kanako_mmd_q_act_dota_die.vanim_c b/models/thd2/kanako/a0a76351/kanako_mmd_q_act_dota_die.vanim_c new file mode 100755 index 0000000..c596ca5 Binary files /dev/null and b/models/thd2/kanako/a0a76351/kanako_mmd_q_act_dota_die.vanim_c differ diff --git a/models/thd2/kanako/a0a76351/kanako_mmd_q_act_dota_idle.vanim_c b/models/thd2/kanako/a0a76351/kanako_mmd_q_act_dota_idle.vanim_c new file mode 100755 index 0000000..1b3703a Binary files /dev/null and b/models/thd2/kanako/a0a76351/kanako_mmd_q_act_dota_idle.vanim_c differ diff --git a/models/thd2/kanako/a0a76351/kanako_mmd_q_act_dota_run.vanim_c b/models/thd2/kanako/a0a76351/kanako_mmd_q_act_dota_run.vanim_c new file mode 100755 index 0000000..b8d9005 Binary files /dev/null and b/models/thd2/kanako/a0a76351/kanako_mmd_q_act_dota_run.vanim_c differ diff --git a/models/thd2/kanako/ada24887/kanako_mmd_rq_act_dota_die.vanim_c b/models/thd2/kanako/ada24887/kanako_mmd_rq_act_dota_die.vanim_c new file mode 100755 index 0000000..6a05475 Binary files /dev/null and b/models/thd2/kanako/ada24887/kanako_mmd_rq_act_dota_die.vanim_c differ diff --git a/models/thd2/kanako/ada24887/kanako_mmd_rq_act_dota_idle.vanim_c b/models/thd2/kanako/ada24887/kanako_mmd_rq_act_dota_idle.vanim_c new file mode 100755 index 0000000..033e75b Binary files /dev/null and b/models/thd2/kanako/ada24887/kanako_mmd_rq_act_dota_idle.vanim_c differ diff --git a/models/thd2/kanako/ada24887/kanako_mmd_rq_act_dota_run.vanim_c b/models/thd2/kanako/ada24887/kanako_mmd_rq_act_dota_run.vanim_c new file mode 100755 index 0000000..335d4af Binary files /dev/null and b/models/thd2/kanako/ada24887/kanako_mmd_rq_act_dota_run.vanim_c differ diff --git a/models/thd2/kanako/ff9c6473/kanako_mmd_q_act_dota_die.vanim_c b/models/thd2/kanako/ff9c6473/kanako_mmd_q_act_dota_die.vanim_c new file mode 100755 index 0000000..06f9685 Binary files /dev/null and b/models/thd2/kanako/ff9c6473/kanako_mmd_q_act_dota_die.vanim_c differ diff --git a/models/thd2/kanako/ff9c6473/kanako_mmd_q_act_dota_idle.vanim_c b/models/thd2/kanako/ff9c6473/kanako_mmd_q_act_dota_idle.vanim_c new file mode 100755 index 0000000..6e47e9f Binary files /dev/null and b/models/thd2/kanako/ff9c6473/kanako_mmd_q_act_dota_idle.vanim_c differ diff --git a/models/thd2/kanako/ff9c6473/kanako_mmd_q_act_dota_run.vanim_c b/models/thd2/kanako/ff9c6473/kanako_mmd_q_act_dota_run.vanim_c new file mode 100755 index 0000000..b8d9005 Binary files /dev/null and b/models/thd2/kanako/ff9c6473/kanako_mmd_q_act_dota_run.vanim_c differ diff --git a/models/thd2/kanako/kanako_mmd_gojou.vmdl_c b/models/thd2/kanako/kanako_mmd_gojou.vmdl_c new file mode 100755 index 0000000..145628b Binary files /dev/null and b/models/thd2/kanako/kanako_mmd_gojou.vmdl_c differ diff --git a/models/thd2/kanako/kanako_mmd_gojou.vmesh_c b/models/thd2/kanako/kanako_mmd_gojou.vmesh_c new file mode 100755 index 0000000..c424d67 Binary files /dev/null and b/models/thd2/kanako/kanako_mmd_gojou.vmesh_c differ diff --git a/models/thd2/kanako/kanako_mmd_gojou_a0a76351.vagrp_c b/models/thd2/kanako/kanako_mmd_gojou_a0a76351.vagrp_c new file mode 100755 index 0000000..09e9387 Binary files /dev/null and b/models/thd2/kanako/kanako_mmd_gojou_a0a76351.vagrp_c differ diff --git a/models/thd2/kanako/kanako_mmd_q.vmdl_c b/models/thd2/kanako/kanako_mmd_q.vmdl_c new file mode 100755 index 0000000..7734d2a Binary files /dev/null and b/models/thd2/kanako/kanako_mmd_q.vmdl_c differ diff --git a/models/thd2/kanako/kanako_mmd_q.vmesh_c b/models/thd2/kanako/kanako_mmd_q.vmesh_c new file mode 100755 index 0000000..cfc6147 Binary files /dev/null and b/models/thd2/kanako/kanako_mmd_q.vmesh_c differ diff --git a/models/thd2/kanako/kanako_mmd_q_76758ba0.vagrp_c b/models/thd2/kanako/kanako_mmd_q_76758ba0.vagrp_c new file mode 100755 index 0000000..3124f81 Binary files /dev/null and b/models/thd2/kanako/kanako_mmd_q_76758ba0.vagrp_c differ diff --git a/models/thd2/kanako/kanako_mmd_rq.vmdl_c b/models/thd2/kanako/kanako_mmd_rq.vmdl_c new file mode 100755 index 0000000..8681fb7 Binary files /dev/null and b/models/thd2/kanako/kanako_mmd_rq.vmdl_c differ diff --git a/models/thd2/kanako/kanako_mmd_rq.vmesh_c b/models/thd2/kanako/kanako_mmd_rq.vmesh_c new file mode 100755 index 0000000..f240052 Binary files /dev/null and b/models/thd2/kanako/kanako_mmd_rq.vmesh_c differ diff --git a/models/thd2/kanako/kanako_mmd_rq_ada24887.vagrp_c b/models/thd2/kanako/kanako_mmd_rq_ada24887.vagrp_c new file mode 100755 index 0000000..04240cb Binary files /dev/null and b/models/thd2/kanako/kanako_mmd_rq_ada24887.vagrp_c differ diff --git a/models/thd2/masterspark.vmdl_c b/models/thd2/masterspark.vmdl_c new file mode 100755 index 0000000..8e5eaa8 Binary files /dev/null and b/models/thd2/masterspark.vmdl_c differ diff --git a/models/thd2/masterspark.vmesh_c b/models/thd2/masterspark.vmesh_c new file mode 100755 index 0000000..09ce2c4 Binary files /dev/null and b/models/thd2/masterspark.vmesh_c differ diff --git a/models/thd2/masterspark_0416072b.vmesh_c b/models/thd2/masterspark_0416072b.vmesh_c new file mode 100755 index 0000000..ee7d5d2 Binary files /dev/null and b/models/thd2/masterspark_0416072b.vmesh_c differ diff --git a/models/thd2/masterspark_7b5f46f2.vmesh_c b/models/thd2/masterspark_7b5f46f2.vmesh_c new file mode 100755 index 0000000..09ce2c4 Binary files /dev/null and b/models/thd2/masterspark_7b5f46f2.vmesh_c differ diff --git a/models/thd2/minamitsu/37042f0e/minamitsu_mmd_w_act_dota_idle.vanim_c b/models/thd2/minamitsu/37042f0e/minamitsu_mmd_w_act_dota_idle.vanim_c new file mode 100755 index 0000000..6570d3e Binary files /dev/null and b/models/thd2/minamitsu/37042f0e/minamitsu_mmd_w_act_dota_idle.vanim_c differ diff --git a/models/thd2/minamitsu/37042f0e/minamitsu_mmd_w_act_dota_run.vanim_c b/models/thd2/minamitsu/37042f0e/minamitsu_mmd_w_act_dota_run.vanim_c new file mode 100755 index 0000000..09d32b1 Binary files /dev/null and b/models/thd2/minamitsu/37042f0e/minamitsu_mmd_w_act_dota_run.vanim_c differ diff --git a/models/thd2/minamitsu/minamitsu_mmd_w.vmdl_c b/models/thd2/minamitsu/minamitsu_mmd_w.vmdl_c new file mode 100755 index 0000000..9b42521 Binary files /dev/null and b/models/thd2/minamitsu/minamitsu_mmd_w.vmdl_c differ diff --git a/models/thd2/minamitsu/minamitsu_mmd_w.vmesh_c b/models/thd2/minamitsu/minamitsu_mmd_w.vmesh_c new file mode 100755 index 0000000..e9a0e5a Binary files /dev/null and b/models/thd2/minamitsu/minamitsu_mmd_w.vmesh_c differ diff --git a/models/thd2/minamitsu/minamitsu_mmd_w_37042f0e.vagrp_c b/models/thd2/minamitsu/minamitsu_mmd_w_37042f0e.vagrp_c new file mode 100755 index 0000000..4eab79e Binary files /dev/null and b/models/thd2/minamitsu/minamitsu_mmd_w_37042f0e.vagrp_c differ diff --git a/models/thd2/remilia/7a8407a9/remilia_gungnir_1.vanim_c b/models/thd2/remilia/7a8407a9/remilia_gungnir_1.vanim_c new file mode 100755 index 0000000..82a0425 Binary files /dev/null and b/models/thd2/remilia/7a8407a9/remilia_gungnir_1.vanim_c differ diff --git a/models/thd2/remilia/remilia_gungnir.vmdl_c b/models/thd2/remilia/remilia_gungnir.vmdl_c new file mode 100755 index 0000000..507030e Binary files /dev/null and b/models/thd2/remilia/remilia_gungnir.vmdl_c differ diff --git a/models/thd2/remilia/remilia_gungnir.vmesh_c b/models/thd2/remilia/remilia_gungnir.vmesh_c new file mode 100755 index 0000000..7aeb8dc Binary files /dev/null and b/models/thd2/remilia/remilia_gungnir.vmesh_c differ diff --git a/models/thd2/remilia/remilia_gungnir_0258b55f.vagrp_c b/models/thd2/remilia/remilia_gungnir_0258b55f.vagrp_c new file mode 100755 index 0000000..0b24c43 Binary files /dev/null and b/models/thd2/remilia/remilia_gungnir_0258b55f.vagrp_c differ diff --git a/models/thd2/remilia/remilia_gungnir_7a8407a9.vagrp_c b/models/thd2/remilia/remilia_gungnir_7a8407a9.vagrp_c new file mode 100755 index 0000000..9971db1 Binary files /dev/null and b/models/thd2/remilia/remilia_gungnir_7a8407a9.vagrp_c differ diff --git a/models/thd2/rumia_ex/715597a9/rumia_ex_attack_1.vanim_c b/models/thd2/rumia_ex/715597a9/rumia_ex_attack_1.vanim_c new file mode 100755 index 0000000..6c0a772 Binary files /dev/null and b/models/thd2/rumia_ex/715597a9/rumia_ex_attack_1.vanim_c differ diff --git a/models/thd2/rumia_ex/715597a9/rumia_ex_attack_2.vanim_c b/models/thd2/rumia_ex/715597a9/rumia_ex_attack_2.vanim_c new file mode 100755 index 0000000..8c1762b Binary files /dev/null and b/models/thd2/rumia_ex/715597a9/rumia_ex_attack_2.vanim_c differ diff --git a/models/thd2/rumia_ex/715597a9/rumia_ex_attack_3.vanim_c b/models/thd2/rumia_ex/715597a9/rumia_ex_attack_3.vanim_c new file mode 100755 index 0000000..9d97e70 Binary files /dev/null and b/models/thd2/rumia_ex/715597a9/rumia_ex_attack_3.vanim_c differ diff --git a/models/thd2/rumia_ex/715597a9/rumia_ex_attack_5.vanim_c b/models/thd2/rumia_ex/715597a9/rumia_ex_attack_5.vanim_c new file mode 100755 index 0000000..c1ca3fd Binary files /dev/null and b/models/thd2/rumia_ex/715597a9/rumia_ex_attack_5.vanim_c differ diff --git a/models/thd2/rumia_ex/715597a9/rumia_ex_stand.vanim_c b/models/thd2/rumia_ex/715597a9/rumia_ex_stand.vanim_c new file mode 100755 index 0000000..460412a Binary files /dev/null and b/models/thd2/rumia_ex/715597a9/rumia_ex_stand.vanim_c differ diff --git a/models/thd2/rumia_ex/715597a9/rumia_ex_walk.vanim_c b/models/thd2/rumia_ex/715597a9/rumia_ex_walk.vanim_c new file mode 100755 index 0000000..7d62670 Binary files /dev/null and b/models/thd2/rumia_ex/715597a9/rumia_ex_walk.vanim_c differ diff --git a/models/thd2/rumia_ex/rumia_ex.vmdl_c b/models/thd2/rumia_ex/rumia_ex.vmdl_c new file mode 100755 index 0000000..241a296 Binary files /dev/null and b/models/thd2/rumia_ex/rumia_ex.vmdl_c differ diff --git a/models/thd2/rumia_ex/rumia_ex.vmesh_c b/models/thd2/rumia_ex/rumia_ex.vmesh_c new file mode 100755 index 0000000..002d21e Binary files /dev/null and b/models/thd2/rumia_ex/rumia_ex.vmesh_c differ diff --git a/models/thd2/rumia_ex/rumia_ex_562f0a70.vagrp_c b/models/thd2/rumia_ex/rumia_ex_562f0a70.vagrp_c new file mode 100755 index 0000000..a32593f Binary files /dev/null and b/models/thd2/rumia_ex/rumia_ex_562f0a70.vagrp_c differ diff --git a/models/thd2/rumia_ex/rumia_ex_715597a9.vagrp_c b/models/thd2/rumia_ex/rumia_ex_715597a9.vagrp_c new file mode 100755 index 0000000..c340ee0 Binary files /dev/null and b/models/thd2/rumia_ex/rumia_ex_715597a9.vagrp_c differ diff --git a/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_attack.vanim_c b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_attack.vanim_c new file mode 100755 index 0000000..2da7908 Binary files /dev/null and b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_attack.vanim_c differ diff --git a/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_attack2.vanim_c b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_attack2.vanim_c new file mode 100755 index 0000000..8ebdaa5 Binary files /dev/null and b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_attack2.vanim_c differ diff --git a/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_cast_ability_1.vanim_c b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_cast_ability_1.vanim_c new file mode 100755 index 0000000..87a29b6 Binary files /dev/null and b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_cast_ability_1.vanim_c differ diff --git a/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_cast_ability_2.vanim_c b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_cast_ability_2.vanim_c new file mode 100755 index 0000000..0f7513e Binary files /dev/null and b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_cast_ability_2.vanim_c differ diff --git a/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_cast_ability_3.vanim_c b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_cast_ability_3.vanim_c new file mode 100755 index 0000000..7c96fc4 Binary files /dev/null and b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_cast_ability_3.vanim_c differ diff --git a/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_cast_ability_4.vanim_c b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_cast_ability_4.vanim_c new file mode 100755 index 0000000..3a67028 Binary files /dev/null and b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_cast_ability_4.vanim_c differ diff --git a/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_die.vanim_c b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_die.vanim_c new file mode 100755 index 0000000..01d25ec Binary files /dev/null and b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_die.vanim_c differ diff --git a/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_idle.vanim_c b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_idle.vanim_c new file mode 100755 index 0000000..916f206 Binary files /dev/null and b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_idle.vanim_c differ diff --git a/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_por.vanim_c b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_por.vanim_c new file mode 100755 index 0000000..2a0cf54 Binary files /dev/null and b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_por.vanim_c differ diff --git a/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_run.vanim_c b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_run.vanim_c new file mode 100755 index 0000000..4224fb0 Binary files /dev/null and b/models/thd2/shikieiki/1370f3f0/shikieiki_mmd_act_dota_run.vanim_c differ diff --git a/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_attack.vanim_c b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_attack.vanim_c new file mode 100755 index 0000000..4484b09 Binary files /dev/null and b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_attack.vanim_c differ diff --git a/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_attack2.vanim_c b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_attack2.vanim_c new file mode 100755 index 0000000..800588e Binary files /dev/null and b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_attack2.vanim_c differ diff --git a/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_cast_ability_1.vanim_c b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_cast_ability_1.vanim_c new file mode 100755 index 0000000..a505599 Binary files /dev/null and b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_cast_ability_1.vanim_c differ diff --git a/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_cast_ability_2.vanim_c b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_cast_ability_2.vanim_c new file mode 100755 index 0000000..df17101 Binary files /dev/null and b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_cast_ability_2.vanim_c differ diff --git a/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_cast_ability_3.vanim_c b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_cast_ability_3.vanim_c new file mode 100755 index 0000000..8493a25 Binary files /dev/null and b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_cast_ability_3.vanim_c differ diff --git a/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_cast_ability_4.vanim_c b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_cast_ability_4.vanim_c new file mode 100755 index 0000000..b3cc773 Binary files /dev/null and b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_cast_ability_4.vanim_c differ diff --git a/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_die.vanim_c b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_die.vanim_c new file mode 100755 index 0000000..a6552c5 Binary files /dev/null and b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_die.vanim_c differ diff --git a/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_idle.vanim_c b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_idle.vanim_c new file mode 100755 index 0000000..e67b67f Binary files /dev/null and b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_idle.vanim_c differ diff --git a/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_por.vanim_c b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_por.vanim_c new file mode 100755 index 0000000..d809109 Binary files /dev/null and b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_por.vanim_c differ diff --git a/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_run.vanim_c b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_run.vanim_c new file mode 100755 index 0000000..e5b54a3 Binary files /dev/null and b/models/thd2/shikieiki/989bf045/shikieiki_mmd_act_dota_run.vanim_c differ diff --git a/models/thd2/shikieiki/shikieiki_mmd.vmdl_c b/models/thd2/shikieiki/shikieiki_mmd.vmdl_c new file mode 100755 index 0000000..fa11758 Binary files /dev/null and b/models/thd2/shikieiki/shikieiki_mmd.vmdl_c differ diff --git a/models/thd2/shikieiki/shikieiki_mmd.vmesh_c b/models/thd2/shikieiki/shikieiki_mmd.vmesh_c new file mode 100755 index 0000000..666a8a8 Binary files /dev/null and b/models/thd2/shikieiki/shikieiki_mmd.vmesh_c differ diff --git a/models/thd2/shikieiki/shikieiki_mmd_1370f3f0.vagrp_c b/models/thd2/shikieiki/shikieiki_mmd_1370f3f0.vagrp_c new file mode 100755 index 0000000..d9e0400 Binary files /dev/null and b/models/thd2/shikieiki/shikieiki_mmd_1370f3f0.vagrp_c differ diff --git a/models/thd2/shikieiki/shikieiki_mmd_989bf045.vagrp_c b/models/thd2/shikieiki/shikieiki_mmd_989bf045.vagrp_c new file mode 100755 index 0000000..30a7d77 Binary files /dev/null and b/models/thd2/shikieiki/shikieiki_mmd_989bf045.vagrp_c differ diff --git a/models/thd2/yukari/71464bb8/yukari_mmd_q_act_dota_die.vanim_c b/models/thd2/yukari/71464bb8/yukari_mmd_q_act_dota_die.vanim_c new file mode 100755 index 0000000..df0b4ef Binary files /dev/null and b/models/thd2/yukari/71464bb8/yukari_mmd_q_act_dota_die.vanim_c differ diff --git a/models/thd2/yukari/71464bb8/yukari_mmd_q_act_dota_idle.vanim_c b/models/thd2/yukari/71464bb8/yukari_mmd_q_act_dota_idle.vanim_c new file mode 100755 index 0000000..87e2088 Binary files /dev/null and b/models/thd2/yukari/71464bb8/yukari_mmd_q_act_dota_idle.vanim_c differ diff --git a/models/thd2/yukari/71464bb8/yukari_mmd_q_act_dota_spawn.vanim_c b/models/thd2/yukari/71464bb8/yukari_mmd_q_act_dota_spawn.vanim_c new file mode 100755 index 0000000..e402094 Binary files /dev/null and b/models/thd2/yukari/71464bb8/yukari_mmd_q_act_dota_spawn.vanim_c differ diff --git a/models/thd2/yukari/c40826c0/yukari_mmd_w_act_dota_die.vanim_c b/models/thd2/yukari/c40826c0/yukari_mmd_w_act_dota_die.vanim_c new file mode 100755 index 0000000..ccac657 Binary files /dev/null and b/models/thd2/yukari/c40826c0/yukari_mmd_w_act_dota_die.vanim_c differ diff --git a/models/thd2/yukari/c40826c0/yukari_mmd_w_act_dota_idle.vanim_c b/models/thd2/yukari/c40826c0/yukari_mmd_w_act_dota_idle.vanim_c new file mode 100755 index 0000000..ecf3f8e Binary files /dev/null and b/models/thd2/yukari/c40826c0/yukari_mmd_w_act_dota_idle.vanim_c differ diff --git a/models/thd2/yukari/c40826c0/yukari_mmd_w_act_dota_spawn.vanim_c b/models/thd2/yukari/c40826c0/yukari_mmd_w_act_dota_spawn.vanim_c new file mode 100755 index 0000000..b7cdb2e Binary files /dev/null and b/models/thd2/yukari/c40826c0/yukari_mmd_w_act_dota_spawn.vanim_c differ diff --git a/models/thd2/yukari/f9e372b9/yukari_mmd_d_act_dota_die.vanim_c b/models/thd2/yukari/f9e372b9/yukari_mmd_d_act_dota_die.vanim_c new file mode 100755 index 0000000..63fc96d Binary files /dev/null and b/models/thd2/yukari/f9e372b9/yukari_mmd_d_act_dota_die.vanim_c differ diff --git a/models/thd2/yukari/f9e372b9/yukari_mmd_d_act_dota_idle.vanim_c b/models/thd2/yukari/f9e372b9/yukari_mmd_d_act_dota_idle.vanim_c new file mode 100755 index 0000000..55b9b3a Binary files /dev/null and b/models/thd2/yukari/f9e372b9/yukari_mmd_d_act_dota_idle.vanim_c differ diff --git a/models/thd2/yukari/f9e372b9/yukari_mmd_d_act_dota_spawn.vanim_c b/models/thd2/yukari/f9e372b9/yukari_mmd_d_act_dota_spawn.vanim_c new file mode 100755 index 0000000..85effcd Binary files /dev/null and b/models/thd2/yukari/f9e372b9/yukari_mmd_d_act_dota_spawn.vanim_c differ diff --git a/models/thd2/yukari/yukari_mmd_d.vmdl_c b/models/thd2/yukari/yukari_mmd_d.vmdl_c new file mode 100755 index 0000000..62a6add Binary files /dev/null and b/models/thd2/yukari/yukari_mmd_d.vmdl_c differ diff --git a/models/thd2/yukari/yukari_mmd_d.vmesh_c b/models/thd2/yukari/yukari_mmd_d.vmesh_c new file mode 100755 index 0000000..ed35bc0 Binary files /dev/null and b/models/thd2/yukari/yukari_mmd_d.vmesh_c differ diff --git a/models/thd2/yukari/yukari_mmd_d_f9e372b9.vagrp_c b/models/thd2/yukari/yukari_mmd_d_f9e372b9.vagrp_c new file mode 100755 index 0000000..a3c7693 Binary files /dev/null and b/models/thd2/yukari/yukari_mmd_d_f9e372b9.vagrp_c differ diff --git a/models/thd2/yukari/yukari_mmd_q.vmdl_c b/models/thd2/yukari/yukari_mmd_q.vmdl_c new file mode 100755 index 0000000..e46ade2 Binary files /dev/null and b/models/thd2/yukari/yukari_mmd_q.vmdl_c differ diff --git a/models/thd2/yukari/yukari_mmd_q.vmesh_c b/models/thd2/yukari/yukari_mmd_q.vmesh_c new file mode 100755 index 0000000..c06d583 Binary files /dev/null and b/models/thd2/yukari/yukari_mmd_q.vmesh_c differ diff --git a/models/thd2/yukari/yukari_mmd_q_71464bb8.vagrp_c b/models/thd2/yukari/yukari_mmd_q_71464bb8.vagrp_c new file mode 100755 index 0000000..3370d73 Binary files /dev/null and b/models/thd2/yukari/yukari_mmd_q_71464bb8.vagrp_c differ diff --git a/models/thd2/yukari/yukari_mmd_w.vmdl_c b/models/thd2/yukari/yukari_mmd_w.vmdl_c new file mode 100755 index 0000000..26c1629 Binary files /dev/null and b/models/thd2/yukari/yukari_mmd_w.vmdl_c differ diff --git a/models/thd2/yukari/yukari_mmd_w.vmesh_c b/models/thd2/yukari/yukari_mmd_w.vmesh_c new file mode 100755 index 0000000..95f865b Binary files /dev/null and b/models/thd2/yukari/yukari_mmd_w.vmesh_c differ diff --git a/models/thd2/yukari/yukari_mmd_w_c40826c0.vagrp_c b/models/thd2/yukari/yukari_mmd_w_c40826c0.vagrp_c new file mode 100755 index 0000000..f75070e Binary files /dev/null and b/models/thd2/yukari/yukari_mmd_w_c40826c0.vagrp_c differ diff --git a/models/thd2/yukkuri/58f96842/yukkuri_death.vanim_c b/models/thd2/yukkuri/58f96842/yukkuri_death.vanim_c new file mode 100755 index 0000000..932dd4e Binary files /dev/null and b/models/thd2/yukkuri/58f96842/yukkuri_death.vanim_c differ diff --git a/models/thd2/yukkuri/58f96842/yukkuri_stand.vanim_c b/models/thd2/yukkuri/58f96842/yukkuri_stand.vanim_c new file mode 100755 index 0000000..51e424f Binary files /dev/null and b/models/thd2/yukkuri/58f96842/yukkuri_stand.vanim_c differ diff --git a/models/thd2/yukkuri/58f96842/yukkuri_walk.vanim_c b/models/thd2/yukkuri/58f96842/yukkuri_walk.vanim_c new file mode 100755 index 0000000..c40a851 Binary files /dev/null and b/models/thd2/yukkuri/58f96842/yukkuri_walk.vanim_c differ diff --git a/models/thd2/yukkuri/yukkuri.vmdl_c b/models/thd2/yukkuri/yukkuri.vmdl_c new file mode 100755 index 0000000..2797dfb Binary files /dev/null and b/models/thd2/yukkuri/yukkuri.vmdl_c differ diff --git a/models/thd2/yukkuri/yukkuri.vmesh_c b/models/thd2/yukkuri/yukkuri.vmesh_c new file mode 100755 index 0000000..db00d38 Binary files /dev/null and b/models/thd2/yukkuri/yukkuri.vmesh_c differ diff --git a/models/thd2/yukkuri/yukkuri_028944bc.vagrp_c b/models/thd2/yukkuri/yukkuri_028944bc.vagrp_c new file mode 100755 index 0000000..61e0887 Binary files /dev/null and b/models/thd2/yukkuri/yukkuri_028944bc.vagrp_c differ diff --git a/models/thd2/yukkuri/yukkuri_58f96842.vagrp_c b/models/thd2/yukkuri/yukkuri_58f96842.vagrp_c new file mode 100755 index 0000000..969e1e0 Binary files /dev/null and b/models/thd2/yukkuri/yukkuri_58f96842.vagrp_c differ diff --git a/models/thd2/yuukaspark.vmdl_c b/models/thd2/yuukaspark.vmdl_c new file mode 100755 index 0000000..d445186 Binary files /dev/null and b/models/thd2/yuukaspark.vmdl_c differ diff --git a/models/thd2/yuyuko_fan.vmdl_c b/models/thd2/yuyuko_fan.vmdl_c new file mode 100755 index 0000000..96a9459 Binary files /dev/null and b/models/thd2/yuyuko_fan.vmdl_c differ diff --git a/models/thd2/yuyuko_fan.vmesh_c b/models/thd2/yuyuko_fan.vmesh_c new file mode 100755 index 0000000..eb09f4c Binary files /dev/null and b/models/thd2/yuyuko_fan.vmesh_c differ diff --git a/models/thd2/yuyuko_fan_278b62ab.vagrp_c b/models/thd2/yuyuko_fan_278b62ab.vagrp_c new file mode 100755 index 0000000..e49c629 Binary files /dev/null and b/models/thd2/yuyuko_fan_278b62ab.vagrp_c differ diff --git a/models/thd2/yuyuko_fan_2a7f126c.vagrp_c b/models/thd2/yuyuko_fan_2a7f126c.vagrp_c new file mode 100755 index 0000000..a069cb1 Binary files /dev/null and b/models/thd2/yuyuko_fan_2a7f126c.vagrp_c differ diff --git a/models/thd_hero/alice/0c825569/attack1.vanim_c b/models/thd_hero/alice/0c825569/attack1.vanim_c new file mode 100755 index 0000000..ff930f5 Binary files /dev/null and b/models/thd_hero/alice/0c825569/attack1.vanim_c differ diff --git a/models/thd_hero/alice/0c825569/cast1.vanim_c b/models/thd_hero/alice/0c825569/cast1.vanim_c new file mode 100755 index 0000000..e0cb3c4 Binary files /dev/null and b/models/thd_hero/alice/0c825569/cast1.vanim_c differ diff --git a/models/thd_hero/alice/0c825569/cast2.vanim_c b/models/thd_hero/alice/0c825569/cast2.vanim_c new file mode 100755 index 0000000..c206143 Binary files /dev/null and b/models/thd_hero/alice/0c825569/cast2.vanim_c differ diff --git a/models/thd_hero/alice/0c825569/cast3.vanim_c b/models/thd_hero/alice/0c825569/cast3.vanim_c new file mode 100755 index 0000000..a9f2b6a Binary files /dev/null and b/models/thd_hero/alice/0c825569/cast3.vanim_c differ diff --git a/models/thd_hero/alice/0c825569/idle.vanim_c b/models/thd_hero/alice/0c825569/idle.vanim_c new file mode 100755 index 0000000..a8f0708 Binary files /dev/null and b/models/thd_hero/alice/0c825569/idle.vanim_c differ diff --git a/models/thd_hero/alice/0c825569/run.vanim_c b/models/thd_hero/alice/0c825569/run.vanim_c new file mode 100755 index 0000000..8fc1e84 Binary files /dev/null and b/models/thd_hero/alice/0c825569/run.vanim_c differ diff --git a/models/thd_hero/alice/alice.vmdl_c b/models/thd_hero/alice/alice.vmdl_c new file mode 100755 index 0000000..c5236d4 Binary files /dev/null and b/models/thd_hero/alice/alice.vmdl_c differ diff --git a/models/thd_hero/alice/alice.vmesh_c b/models/thd_hero/alice/alice.vmesh_c new file mode 100755 index 0000000..8bb7963 Binary files /dev/null and b/models/thd_hero/alice/alice.vmesh_c differ diff --git a/models/thd_hero/alice/alice_0c825569.vagrp_c b/models/thd_hero/alice/alice_0c825569.vagrp_c new file mode 100755 index 0000000..6585b53 Binary files /dev/null and b/models/thd_hero/alice/alice_0c825569.vagrp_c differ diff --git a/models/thd_hero/alice/item/alice.vmesh_c b/models/thd_hero/alice/item/alice.vmesh_c new file mode 100755 index 0000000..1ec0005 Binary files /dev/null and b/models/thd_hero/alice/item/alice.vmesh_c differ diff --git a/models/thd_hero/alice/item/c1cd94c1/attack1.vanim_c b/models/thd_hero/alice/item/c1cd94c1/attack1.vanim_c new file mode 100755 index 0000000..f5dc084 Binary files /dev/null and b/models/thd_hero/alice/item/c1cd94c1/attack1.vanim_c differ diff --git a/models/thd_hero/alice/item/c1cd94c1/cast1.vanim_c b/models/thd_hero/alice/item/c1cd94c1/cast1.vanim_c new file mode 100755 index 0000000..7075d24 Binary files /dev/null and b/models/thd_hero/alice/item/c1cd94c1/cast1.vanim_c differ diff --git a/models/thd_hero/alice/item/c1cd94c1/cast2.vanim_c b/models/thd_hero/alice/item/c1cd94c1/cast2.vanim_c new file mode 100755 index 0000000..3e00e6c Binary files /dev/null and b/models/thd_hero/alice/item/c1cd94c1/cast2.vanim_c differ diff --git a/models/thd_hero/alice/item/c1cd94c1/cast3.vanim_c b/models/thd_hero/alice/item/c1cd94c1/cast3.vanim_c new file mode 100755 index 0000000..e7df227 Binary files /dev/null and b/models/thd_hero/alice/item/c1cd94c1/cast3.vanim_c differ diff --git a/models/thd_hero/alice/item/c1cd94c1/idle.vanim_c b/models/thd_hero/alice/item/c1cd94c1/idle.vanim_c new file mode 100755 index 0000000..83ed560 Binary files /dev/null and b/models/thd_hero/alice/item/c1cd94c1/idle.vanim_c differ diff --git a/models/thd_hero/alice/item/c1cd94c1/run.vanim_c b/models/thd_hero/alice/item/c1cd94c1/run.vanim_c new file mode 100755 index 0000000..64b0097 Binary files /dev/null and b/models/thd_hero/alice/item/c1cd94c1/run.vanim_c differ diff --git a/models/thd_hero/alice/item/item_alice.vmdl_c b/models/thd_hero/alice/item/item_alice.vmdl_c new file mode 100755 index 0000000..1b8fb2c Binary files /dev/null and b/models/thd_hero/alice/item/item_alice.vmdl_c differ diff --git a/models/thd_hero/alice/item/item_alice_c1cd94c1.vagrp_c b/models/thd_hero/alice/item/item_alice_c1cd94c1.vagrp_c new file mode 100755 index 0000000..f6bf0f1 Binary files /dev/null and b/models/thd_hero/alice/item/item_alice_c1cd94c1.vagrp_c differ diff --git a/models/thd_hero/aya/aya.vmdl_c b/models/thd_hero/aya/aya.vmdl_c new file mode 100755 index 0000000..5472b09 Binary files /dev/null and b/models/thd_hero/aya/aya.vmdl_c differ diff --git a/models/thd_hero/aya/aya.vmesh_c b/models/thd_hero/aya/aya.vmesh_c new file mode 100755 index 0000000..d4153fd Binary files /dev/null and b/models/thd_hero/aya/aya.vmesh_c differ diff --git a/models/thd_hero/aya/aya_e61a3819.vagrp_c b/models/thd_hero/aya/aya_e61a3819.vagrp_c new file mode 100755 index 0000000..ba0cfb8 Binary files /dev/null and b/models/thd_hero/aya/aya_e61a3819.vagrp_c differ diff --git a/models/thd_hero/aya/e61a3819/attack.vanim_c b/models/thd_hero/aya/e61a3819/attack.vanim_c new file mode 100755 index 0000000..8a30538 Binary files /dev/null and b/models/thd_hero/aya/e61a3819/attack.vanim_c differ diff --git a/models/thd_hero/aya/e61a3819/attack2.vanim_c b/models/thd_hero/aya/e61a3819/attack2.vanim_c new file mode 100755 index 0000000..59e8fb1 Binary files /dev/null and b/models/thd_hero/aya/e61a3819/attack2.vanim_c differ diff --git a/models/thd_hero/aya/e61a3819/aya_animation.vanim_c b/models/thd_hero/aya/e61a3819/aya_animation.vanim_c new file mode 100755 index 0000000..3dac8f9 Binary files /dev/null and b/models/thd_hero/aya/e61a3819/aya_animation.vanim_c differ diff --git a/models/thd_hero/aya/e61a3819/cast1.vanim_c b/models/thd_hero/aya/e61a3819/cast1.vanim_c new file mode 100755 index 0000000..cddc78c Binary files /dev/null and b/models/thd_hero/aya/e61a3819/cast1.vanim_c differ diff --git a/models/thd_hero/aya/e61a3819/idle.vanim_c b/models/thd_hero/aya/e61a3819/idle.vanim_c new file mode 100755 index 0000000..47701a9 Binary files /dev/null and b/models/thd_hero/aya/e61a3819/idle.vanim_c differ diff --git a/models/thd_hero/aya/e61a3819/run.vanim_c b/models/thd_hero/aya/e61a3819/run.vanim_c new file mode 100755 index 0000000..de4815a Binary files /dev/null and b/models/thd_hero/aya/e61a3819/run.vanim_c differ diff --git a/models/thd_hero/byakuren/5e9c9fb9/attack1.vanim_c b/models/thd_hero/byakuren/5e9c9fb9/attack1.vanim_c new file mode 100755 index 0000000..b688b08 Binary files /dev/null and b/models/thd_hero/byakuren/5e9c9fb9/attack1.vanim_c differ diff --git a/models/thd_hero/byakuren/5e9c9fb9/byakuren_animation.vanim_c b/models/thd_hero/byakuren/5e9c9fb9/byakuren_animation.vanim_c new file mode 100755 index 0000000..d52b751 Binary files /dev/null and b/models/thd_hero/byakuren/5e9c9fb9/byakuren_animation.vanim_c differ diff --git a/models/thd_hero/byakuren/5e9c9fb9/cast.vanim_c b/models/thd_hero/byakuren/5e9c9fb9/cast.vanim_c new file mode 100755 index 0000000..1036e7f Binary files /dev/null and b/models/thd_hero/byakuren/5e9c9fb9/cast.vanim_c differ diff --git a/models/thd_hero/byakuren/5e9c9fb9/cast2.vanim_c b/models/thd_hero/byakuren/5e9c9fb9/cast2.vanim_c new file mode 100755 index 0000000..c374302 Binary files /dev/null and b/models/thd_hero/byakuren/5e9c9fb9/cast2.vanim_c differ diff --git a/models/thd_hero/byakuren/5e9c9fb9/idle.vanim_c b/models/thd_hero/byakuren/5e9c9fb9/idle.vanim_c new file mode 100755 index 0000000..ffea370 Binary files /dev/null and b/models/thd_hero/byakuren/5e9c9fb9/idle.vanim_c differ diff --git a/models/thd_hero/byakuren/5e9c9fb9/run.vanim_c b/models/thd_hero/byakuren/5e9c9fb9/run.vanim_c new file mode 100755 index 0000000..a4e1d9d Binary files /dev/null and b/models/thd_hero/byakuren/5e9c9fb9/run.vanim_c differ diff --git a/models/thd_hero/byakuren/byakuren.vmdl_c b/models/thd_hero/byakuren/byakuren.vmdl_c new file mode 100755 index 0000000..bf3f697 Binary files /dev/null and b/models/thd_hero/byakuren/byakuren.vmdl_c differ diff --git a/models/thd_hero/byakuren/byakuren.vmesh_c b/models/thd_hero/byakuren/byakuren.vmesh_c new file mode 100755 index 0000000..6276372 Binary files /dev/null and b/models/thd_hero/byakuren/byakuren.vmesh_c differ diff --git a/models/thd_hero/byakuren/byakuren_5e9c9fb9.vagrp_c b/models/thd_hero/byakuren/byakuren_5e9c9fb9.vagrp_c new file mode 100755 index 0000000..d28c414 Binary files /dev/null and b/models/thd_hero/byakuren/byakuren_5e9c9fb9.vagrp_c differ diff --git a/models/thd_hero/byakuren/item/b2d8428d/attack1.vanim_c b/models/thd_hero/byakuren/item/b2d8428d/attack1.vanim_c new file mode 100755 index 0000000..272ed21 Binary files /dev/null and b/models/thd_hero/byakuren/item/b2d8428d/attack1.vanim_c differ diff --git a/models/thd_hero/byakuren/item/b2d8428d/cast.vanim_c b/models/thd_hero/byakuren/item/b2d8428d/cast.vanim_c new file mode 100755 index 0000000..82567ee Binary files /dev/null and b/models/thd_hero/byakuren/item/b2d8428d/cast.vanim_c differ diff --git a/models/thd_hero/byakuren/item/b2d8428d/cast2.vanim_c b/models/thd_hero/byakuren/item/b2d8428d/cast2.vanim_c new file mode 100755 index 0000000..ca059cf Binary files /dev/null and b/models/thd_hero/byakuren/item/b2d8428d/cast2.vanim_c differ diff --git a/models/thd_hero/byakuren/item/b2d8428d/idle.vanim_c b/models/thd_hero/byakuren/item/b2d8428d/idle.vanim_c new file mode 100755 index 0000000..7a765d7 Binary files /dev/null and b/models/thd_hero/byakuren/item/b2d8428d/idle.vanim_c differ diff --git a/models/thd_hero/byakuren/item/b2d8428d/run.vanim_c b/models/thd_hero/byakuren/item/b2d8428d/run.vanim_c new file mode 100755 index 0000000..844ed0e Binary files /dev/null and b/models/thd_hero/byakuren/item/b2d8428d/run.vanim_c differ diff --git a/models/thd_hero/byakuren/item/byakuren.vmesh_c b/models/thd_hero/byakuren/item/byakuren.vmesh_c new file mode 100755 index 0000000..826f39c Binary files /dev/null and b/models/thd_hero/byakuren/item/byakuren.vmesh_c differ diff --git a/models/thd_hero/byakuren/item/item_byakuren.vmdl_c b/models/thd_hero/byakuren/item/item_byakuren.vmdl_c new file mode 100755 index 0000000..f58047b Binary files /dev/null and b/models/thd_hero/byakuren/item/item_byakuren.vmdl_c differ diff --git a/models/thd_hero/byakuren/item/item_byakuren_b2d8428d.vagrp_c b/models/thd_hero/byakuren/item/item_byakuren_b2d8428d.vagrp_c new file mode 100755 index 0000000..32f80c8 Binary files /dev/null and b/models/thd_hero/byakuren/item/item_byakuren_b2d8428d.vagrp_c differ diff --git a/models/thd_hero/chen/379c7b94/attack1.vanim_c b/models/thd_hero/chen/379c7b94/attack1.vanim_c new file mode 100755 index 0000000..beda153 Binary files /dev/null and b/models/thd_hero/chen/379c7b94/attack1.vanim_c differ diff --git a/models/thd_hero/chen/379c7b94/attack2.vanim_c b/models/thd_hero/chen/379c7b94/attack2.vanim_c new file mode 100755 index 0000000..caccc29 Binary files /dev/null and b/models/thd_hero/chen/379c7b94/attack2.vanim_c differ diff --git a/models/thd_hero/chen/379c7b94/cast1.vanim_c b/models/thd_hero/chen/379c7b94/cast1.vanim_c new file mode 100755 index 0000000..03b937a Binary files /dev/null and b/models/thd_hero/chen/379c7b94/cast1.vanim_c differ diff --git a/models/thd_hero/chen/379c7b94/cast2.vanim_c b/models/thd_hero/chen/379c7b94/cast2.vanim_c new file mode 100755 index 0000000..03f4a6f Binary files /dev/null and b/models/thd_hero/chen/379c7b94/cast2.vanim_c differ diff --git a/models/thd_hero/chen/379c7b94/cast3.vanim_c b/models/thd_hero/chen/379c7b94/cast3.vanim_c new file mode 100755 index 0000000..6fa027e Binary files /dev/null and b/models/thd_hero/chen/379c7b94/cast3.vanim_c differ diff --git a/models/thd_hero/chen/379c7b94/cast4.vanim_c b/models/thd_hero/chen/379c7b94/cast4.vanim_c new file mode 100755 index 0000000..a67e7e9 Binary files /dev/null and b/models/thd_hero/chen/379c7b94/cast4.vanim_c differ diff --git a/models/thd_hero/chen/379c7b94/chen_animation.vanim_c b/models/thd_hero/chen/379c7b94/chen_animation.vanim_c new file mode 100755 index 0000000..c876f3d Binary files /dev/null and b/models/thd_hero/chen/379c7b94/chen_animation.vanim_c differ diff --git a/models/thd_hero/chen/379c7b94/idle1.vanim_c b/models/thd_hero/chen/379c7b94/idle1.vanim_c new file mode 100755 index 0000000..36088c0 Binary files /dev/null and b/models/thd_hero/chen/379c7b94/idle1.vanim_c differ diff --git a/models/thd_hero/chen/379c7b94/idle2.vanim_c b/models/thd_hero/chen/379c7b94/idle2.vanim_c new file mode 100755 index 0000000..15000bd Binary files /dev/null and b/models/thd_hero/chen/379c7b94/idle2.vanim_c differ diff --git a/models/thd_hero/chen/379c7b94/idle3.vanim_c b/models/thd_hero/chen/379c7b94/idle3.vanim_c new file mode 100755 index 0000000..f611440 Binary files /dev/null and b/models/thd_hero/chen/379c7b94/idle3.vanim_c differ diff --git a/models/thd_hero/chen/379c7b94/run1.vanim_c b/models/thd_hero/chen/379c7b94/run1.vanim_c new file mode 100755 index 0000000..d4d57f4 Binary files /dev/null and b/models/thd_hero/chen/379c7b94/run1.vanim_c differ diff --git a/models/thd_hero/chen/379c7b94/run2.vanim_c b/models/thd_hero/chen/379c7b94/run2.vanim_c new file mode 100755 index 0000000..adc3b6d Binary files /dev/null and b/models/thd_hero/chen/379c7b94/run2.vanim_c differ diff --git a/models/thd_hero/chen/chen.vmdl_c b/models/thd_hero/chen/chen.vmdl_c new file mode 100755 index 0000000..c3af256 Binary files /dev/null and b/models/thd_hero/chen/chen.vmdl_c differ diff --git a/models/thd_hero/chen/chen.vmesh_c b/models/thd_hero/chen/chen.vmesh_c new file mode 100755 index 0000000..d4bf057 Binary files /dev/null and b/models/thd_hero/chen/chen.vmesh_c differ diff --git a/models/thd_hero/chen/chen_379c7b94.vagrp_c b/models/thd_hero/chen/chen_379c7b94.vagrp_c new file mode 100755 index 0000000..828b5ec Binary files /dev/null and b/models/thd_hero/chen/chen_379c7b94.vagrp_c differ diff --git a/models/thd_hero/chen/item/chen.vmesh_c b/models/thd_hero/chen/item/chen.vmesh_c new file mode 100755 index 0000000..4e7c32b Binary files /dev/null and b/models/thd_hero/chen/item/chen.vmesh_c differ diff --git a/models/thd_hero/chen/item/f52ca8b7/attack1.vanim_c b/models/thd_hero/chen/item/f52ca8b7/attack1.vanim_c new file mode 100755 index 0000000..11b1317 Binary files /dev/null and b/models/thd_hero/chen/item/f52ca8b7/attack1.vanim_c differ diff --git a/models/thd_hero/chen/item/f52ca8b7/attack2.vanim_c b/models/thd_hero/chen/item/f52ca8b7/attack2.vanim_c new file mode 100755 index 0000000..c11218c Binary files /dev/null and b/models/thd_hero/chen/item/f52ca8b7/attack2.vanim_c differ diff --git a/models/thd_hero/chen/item/f52ca8b7/cast1.vanim_c b/models/thd_hero/chen/item/f52ca8b7/cast1.vanim_c new file mode 100755 index 0000000..80e70ae Binary files /dev/null and b/models/thd_hero/chen/item/f52ca8b7/cast1.vanim_c differ diff --git a/models/thd_hero/chen/item/f52ca8b7/cast2.vanim_c b/models/thd_hero/chen/item/f52ca8b7/cast2.vanim_c new file mode 100755 index 0000000..6fa2c75 Binary files /dev/null and b/models/thd_hero/chen/item/f52ca8b7/cast2.vanim_c differ diff --git a/models/thd_hero/chen/item/f52ca8b7/cast3.vanim_c b/models/thd_hero/chen/item/f52ca8b7/cast3.vanim_c new file mode 100755 index 0000000..a8da63f Binary files /dev/null and b/models/thd_hero/chen/item/f52ca8b7/cast3.vanim_c differ diff --git a/models/thd_hero/chen/item/f52ca8b7/cast4.vanim_c b/models/thd_hero/chen/item/f52ca8b7/cast4.vanim_c new file mode 100755 index 0000000..8a0cca7 Binary files /dev/null and b/models/thd_hero/chen/item/f52ca8b7/cast4.vanim_c differ diff --git a/models/thd_hero/chen/item/f52ca8b7/idle1.vanim_c b/models/thd_hero/chen/item/f52ca8b7/idle1.vanim_c new file mode 100755 index 0000000..9d03983 Binary files /dev/null and b/models/thd_hero/chen/item/f52ca8b7/idle1.vanim_c differ diff --git a/models/thd_hero/chen/item/f52ca8b7/idle2.vanim_c b/models/thd_hero/chen/item/f52ca8b7/idle2.vanim_c new file mode 100755 index 0000000..0332161 Binary files /dev/null and b/models/thd_hero/chen/item/f52ca8b7/idle2.vanim_c differ diff --git a/models/thd_hero/chen/item/f52ca8b7/idle3.vanim_c b/models/thd_hero/chen/item/f52ca8b7/idle3.vanim_c new file mode 100755 index 0000000..2840841 Binary files /dev/null and b/models/thd_hero/chen/item/f52ca8b7/idle3.vanim_c differ diff --git a/models/thd_hero/chen/item/f52ca8b7/run1.vanim_c b/models/thd_hero/chen/item/f52ca8b7/run1.vanim_c new file mode 100755 index 0000000..9283329 Binary files /dev/null and b/models/thd_hero/chen/item/f52ca8b7/run1.vanim_c differ diff --git a/models/thd_hero/chen/item/f52ca8b7/run2.vanim_c b/models/thd_hero/chen/item/f52ca8b7/run2.vanim_c new file mode 100755 index 0000000..d4f6841 Binary files /dev/null and b/models/thd_hero/chen/item/f52ca8b7/run2.vanim_c differ diff --git a/models/thd_hero/chen/item/item_chen.vmdl_c b/models/thd_hero/chen/item/item_chen.vmdl_c new file mode 100755 index 0000000..7ac229b Binary files /dev/null and b/models/thd_hero/chen/item/item_chen.vmdl_c differ diff --git a/models/thd_hero/chen/item/item_chen_f52ca8b7.vagrp_c b/models/thd_hero/chen/item/item_chen_f52ca8b7.vagrp_c new file mode 100755 index 0000000..4682d1b Binary files /dev/null and b/models/thd_hero/chen/item/item_chen_f52ca8b7.vagrp_c differ diff --git a/models/thd_hero/daiyousei/80b6ca11/attack1.vanim_c b/models/thd_hero/daiyousei/80b6ca11/attack1.vanim_c new file mode 100755 index 0000000..e0c9429 Binary files /dev/null and b/models/thd_hero/daiyousei/80b6ca11/attack1.vanim_c differ diff --git a/models/thd_hero/daiyousei/80b6ca11/attack2.vanim_c b/models/thd_hero/daiyousei/80b6ca11/attack2.vanim_c new file mode 100755 index 0000000..37c025b Binary files /dev/null and b/models/thd_hero/daiyousei/80b6ca11/attack2.vanim_c differ diff --git a/models/thd_hero/daiyousei/80b6ca11/cast1.vanim_c b/models/thd_hero/daiyousei/80b6ca11/cast1.vanim_c new file mode 100755 index 0000000..f987bf0 Binary files /dev/null and b/models/thd_hero/daiyousei/80b6ca11/cast1.vanim_c differ diff --git a/models/thd_hero/daiyousei/80b6ca11/cast2.vanim_c b/models/thd_hero/daiyousei/80b6ca11/cast2.vanim_c new file mode 100755 index 0000000..ee59d45 Binary files /dev/null and b/models/thd_hero/daiyousei/80b6ca11/cast2.vanim_c differ diff --git a/models/thd_hero/daiyousei/80b6ca11/idle.vanim_c b/models/thd_hero/daiyousei/80b6ca11/idle.vanim_c new file mode 100755 index 0000000..ecf28cc Binary files /dev/null and b/models/thd_hero/daiyousei/80b6ca11/idle.vanim_c differ diff --git a/models/thd_hero/daiyousei/80b6ca11/por.vanim_c b/models/thd_hero/daiyousei/80b6ca11/por.vanim_c new file mode 100755 index 0000000..23e7f4b Binary files /dev/null and b/models/thd_hero/daiyousei/80b6ca11/por.vanim_c differ diff --git a/models/thd_hero/daiyousei/80b6ca11/run.vanim_c b/models/thd_hero/daiyousei/80b6ca11/run.vanim_c new file mode 100755 index 0000000..8f01139 Binary files /dev/null and b/models/thd_hero/daiyousei/80b6ca11/run.vanim_c differ diff --git a/models/thd_hero/daiyousei/daiyousei.vmdl_c b/models/thd_hero/daiyousei/daiyousei.vmdl_c new file mode 100755 index 0000000..e91c449 Binary files /dev/null and b/models/thd_hero/daiyousei/daiyousei.vmdl_c differ diff --git a/models/thd_hero/daiyousei/daiyousei.vmesh_c b/models/thd_hero/daiyousei/daiyousei.vmesh_c new file mode 100755 index 0000000..c293e2a Binary files /dev/null and b/models/thd_hero/daiyousei/daiyousei.vmesh_c differ diff --git a/models/thd_hero/daiyousei/daiyousei_80b6ca11.vagrp_c b/models/thd_hero/daiyousei/daiyousei_80b6ca11.vagrp_c new file mode 100755 index 0000000..9cd2361 Binary files /dev/null and b/models/thd_hero/daiyousei/daiyousei_80b6ca11.vagrp_c differ diff --git a/models/thd_hero/daiyousei/item/20fcef8c/attack1.vanim_c b/models/thd_hero/daiyousei/item/20fcef8c/attack1.vanim_c new file mode 100755 index 0000000..262ce45 Binary files /dev/null and b/models/thd_hero/daiyousei/item/20fcef8c/attack1.vanim_c differ diff --git a/models/thd_hero/daiyousei/item/20fcef8c/attack2.vanim_c b/models/thd_hero/daiyousei/item/20fcef8c/attack2.vanim_c new file mode 100755 index 0000000..441c66c Binary files /dev/null and b/models/thd_hero/daiyousei/item/20fcef8c/attack2.vanim_c differ diff --git a/models/thd_hero/daiyousei/item/20fcef8c/cast1.vanim_c b/models/thd_hero/daiyousei/item/20fcef8c/cast1.vanim_c new file mode 100755 index 0000000..3596878 Binary files /dev/null and b/models/thd_hero/daiyousei/item/20fcef8c/cast1.vanim_c differ diff --git a/models/thd_hero/daiyousei/item/20fcef8c/cast2.vanim_c b/models/thd_hero/daiyousei/item/20fcef8c/cast2.vanim_c new file mode 100755 index 0000000..a99612a Binary files /dev/null and b/models/thd_hero/daiyousei/item/20fcef8c/cast2.vanim_c differ diff --git a/models/thd_hero/daiyousei/item/20fcef8c/idle.vanim_c b/models/thd_hero/daiyousei/item/20fcef8c/idle.vanim_c new file mode 100755 index 0000000..0fdfe3c Binary files /dev/null and b/models/thd_hero/daiyousei/item/20fcef8c/idle.vanim_c differ diff --git a/models/thd_hero/daiyousei/item/20fcef8c/por.vanim_c b/models/thd_hero/daiyousei/item/20fcef8c/por.vanim_c new file mode 100755 index 0000000..cd46046 Binary files /dev/null and b/models/thd_hero/daiyousei/item/20fcef8c/por.vanim_c differ diff --git a/models/thd_hero/daiyousei/item/20fcef8c/run.vanim_c b/models/thd_hero/daiyousei/item/20fcef8c/run.vanim_c new file mode 100755 index 0000000..3c56b8c Binary files /dev/null and b/models/thd_hero/daiyousei/item/20fcef8c/run.vanim_c differ diff --git a/models/thd_hero/daiyousei/item/daiyousei.vmesh_c b/models/thd_hero/daiyousei/item/daiyousei.vmesh_c new file mode 100755 index 0000000..bd85024 Binary files /dev/null and b/models/thd_hero/daiyousei/item/daiyousei.vmesh_c differ diff --git a/models/thd_hero/daiyousei/item/item_daiyousei.vmdl_c b/models/thd_hero/daiyousei/item/item_daiyousei.vmdl_c new file mode 100755 index 0000000..3b9dbde Binary files /dev/null and b/models/thd_hero/daiyousei/item/item_daiyousei.vmdl_c differ diff --git a/models/thd_hero/daiyousei/item/item_daiyousei_20fcef8c.vagrp_c b/models/thd_hero/daiyousei/item/item_daiyousei_20fcef8c.vagrp_c new file mode 100755 index 0000000..1fb8e6d Binary files /dev/null and b/models/thd_hero/daiyousei/item/item_daiyousei_20fcef8c.vagrp_c differ diff --git a/models/thd_hero/eirin/db8a11be/attack.vanim_c b/models/thd_hero/eirin/db8a11be/attack.vanim_c new file mode 100755 index 0000000..e830e1a Binary files /dev/null and b/models/thd_hero/eirin/db8a11be/attack.vanim_c differ diff --git a/models/thd_hero/eirin/db8a11be/cast1.vanim_c b/models/thd_hero/eirin/db8a11be/cast1.vanim_c new file mode 100755 index 0000000..2d4b60e Binary files /dev/null and b/models/thd_hero/eirin/db8a11be/cast1.vanim_c differ diff --git a/models/thd_hero/eirin/db8a11be/cast2.vanim_c b/models/thd_hero/eirin/db8a11be/cast2.vanim_c new file mode 100755 index 0000000..5249ec9 Binary files /dev/null and b/models/thd_hero/eirin/db8a11be/cast2.vanim_c differ diff --git a/models/thd_hero/eirin/db8a11be/cast3.vanim_c b/models/thd_hero/eirin/db8a11be/cast3.vanim_c new file mode 100755 index 0000000..a052e58 Binary files /dev/null and b/models/thd_hero/eirin/db8a11be/cast3.vanim_c differ diff --git a/models/thd_hero/eirin/db8a11be/cast4.vanim_c b/models/thd_hero/eirin/db8a11be/cast4.vanim_c new file mode 100755 index 0000000..b7c399b Binary files /dev/null and b/models/thd_hero/eirin/db8a11be/cast4.vanim_c differ diff --git a/models/thd_hero/eirin/db8a11be/idle.vanim_c b/models/thd_hero/eirin/db8a11be/idle.vanim_c new file mode 100755 index 0000000..c3e4c11 Binary files /dev/null and b/models/thd_hero/eirin/db8a11be/idle.vanim_c differ diff --git a/models/thd_hero/eirin/db8a11be/run.vanim_c b/models/thd_hero/eirin/db8a11be/run.vanim_c new file mode 100755 index 0000000..c5c8b06 Binary files /dev/null and b/models/thd_hero/eirin/db8a11be/run.vanim_c differ diff --git a/models/thd_hero/eirin/eirin.vmdl_c b/models/thd_hero/eirin/eirin.vmdl_c new file mode 100755 index 0000000..6187497 Binary files /dev/null and b/models/thd_hero/eirin/eirin.vmdl_c differ diff --git a/models/thd_hero/eirin/eirin.vmesh_c b/models/thd_hero/eirin/eirin.vmesh_c new file mode 100755 index 0000000..a59d036 Binary files /dev/null and b/models/thd_hero/eirin/eirin.vmesh_c differ diff --git a/models/thd_hero/eirin/eirin_db8a11be.vagrp_c b/models/thd_hero/eirin/eirin_db8a11be.vagrp_c new file mode 100755 index 0000000..e112d90 Binary files /dev/null and b/models/thd_hero/eirin/eirin_db8a11be.vagrp_c differ diff --git a/models/thd_hero/eirin/item/543e10e3/attack.vanim_c b/models/thd_hero/eirin/item/543e10e3/attack.vanim_c new file mode 100755 index 0000000..a73479e Binary files /dev/null and b/models/thd_hero/eirin/item/543e10e3/attack.vanim_c differ diff --git a/models/thd_hero/eirin/item/543e10e3/cast1.vanim_c b/models/thd_hero/eirin/item/543e10e3/cast1.vanim_c new file mode 100755 index 0000000..71d6ed2 Binary files /dev/null and b/models/thd_hero/eirin/item/543e10e3/cast1.vanim_c differ diff --git a/models/thd_hero/eirin/item/543e10e3/cast2.vanim_c b/models/thd_hero/eirin/item/543e10e3/cast2.vanim_c new file mode 100755 index 0000000..6a80222 Binary files /dev/null and b/models/thd_hero/eirin/item/543e10e3/cast2.vanim_c differ diff --git a/models/thd_hero/eirin/item/543e10e3/cast3.vanim_c b/models/thd_hero/eirin/item/543e10e3/cast3.vanim_c new file mode 100755 index 0000000..7ef6e5c Binary files /dev/null and b/models/thd_hero/eirin/item/543e10e3/cast3.vanim_c differ diff --git a/models/thd_hero/eirin/item/543e10e3/cast4.vanim_c b/models/thd_hero/eirin/item/543e10e3/cast4.vanim_c new file mode 100755 index 0000000..380fc04 Binary files /dev/null and b/models/thd_hero/eirin/item/543e10e3/cast4.vanim_c differ diff --git a/models/thd_hero/eirin/item/543e10e3/idle.vanim_c b/models/thd_hero/eirin/item/543e10e3/idle.vanim_c new file mode 100755 index 0000000..29dc5bf Binary files /dev/null and b/models/thd_hero/eirin/item/543e10e3/idle.vanim_c differ diff --git a/models/thd_hero/eirin/item/543e10e3/run.vanim_c b/models/thd_hero/eirin/item/543e10e3/run.vanim_c new file mode 100755 index 0000000..7244e37 Binary files /dev/null and b/models/thd_hero/eirin/item/543e10e3/run.vanim_c differ diff --git a/models/thd_hero/eirin/item/eirin.vmesh_c b/models/thd_hero/eirin/item/eirin.vmesh_c new file mode 100755 index 0000000..5d188f3 Binary files /dev/null and b/models/thd_hero/eirin/item/eirin.vmesh_c differ diff --git a/models/thd_hero/eirin/item/item_eirin.vmdl_c b/models/thd_hero/eirin/item/item_eirin.vmdl_c new file mode 100755 index 0000000..7f4d184 Binary files /dev/null and b/models/thd_hero/eirin/item/item_eirin.vmdl_c differ diff --git a/models/thd_hero/eirin/item/item_eirin_543e10e3.vagrp_c b/models/thd_hero/eirin/item/item_eirin_543e10e3.vagrp_c new file mode 100755 index 0000000..c6116fc Binary files /dev/null and b/models/thd_hero/eirin/item/item_eirin_543e10e3.vagrp_c differ diff --git a/models/thd_hero/futo/ccbb6ec0/1.vanim_c b/models/thd_hero/futo/ccbb6ec0/1.vanim_c new file mode 100755 index 0000000..7deb1f8 Binary files /dev/null and b/models/thd_hero/futo/ccbb6ec0/1.vanim_c differ diff --git a/models/thd_hero/futo/ccbb6ec0/attack.vanim_c b/models/thd_hero/futo/ccbb6ec0/attack.vanim_c new file mode 100755 index 0000000..c5b11e4 Binary files /dev/null and b/models/thd_hero/futo/ccbb6ec0/attack.vanim_c differ diff --git a/models/thd_hero/futo/ccbb6ec0/cast.vanim_c b/models/thd_hero/futo/ccbb6ec0/cast.vanim_c new file mode 100755 index 0000000..190a3a7 Binary files /dev/null and b/models/thd_hero/futo/ccbb6ec0/cast.vanim_c differ diff --git a/models/thd_hero/futo/ccbb6ec0/cast2.vanim_c b/models/thd_hero/futo/ccbb6ec0/cast2.vanim_c new file mode 100755 index 0000000..2fbbe5f Binary files /dev/null and b/models/thd_hero/futo/ccbb6ec0/cast2.vanim_c differ diff --git a/models/thd_hero/futo/ccbb6ec0/cast4.vanim_c b/models/thd_hero/futo/ccbb6ec0/cast4.vanim_c new file mode 100755 index 0000000..9dd6928 Binary files /dev/null and b/models/thd_hero/futo/ccbb6ec0/cast4.vanim_c differ diff --git a/models/thd_hero/futo/ccbb6ec0/futo_animation.vanim_c b/models/thd_hero/futo/ccbb6ec0/futo_animation.vanim_c new file mode 100755 index 0000000..51874a7 Binary files /dev/null and b/models/thd_hero/futo/ccbb6ec0/futo_animation.vanim_c differ diff --git a/models/thd_hero/futo/ccbb6ec0/idle.vanim_c b/models/thd_hero/futo/ccbb6ec0/idle.vanim_c new file mode 100755 index 0000000..8a5ea3a Binary files /dev/null and b/models/thd_hero/futo/ccbb6ec0/idle.vanim_c differ diff --git a/models/thd_hero/futo/ccbb6ec0/run.vanim_c b/models/thd_hero/futo/ccbb6ec0/run.vanim_c new file mode 100755 index 0000000..e8ca9df Binary files /dev/null and b/models/thd_hero/futo/ccbb6ec0/run.vanim_c differ diff --git a/models/thd_hero/futo/futo.vmdl_c b/models/thd_hero/futo/futo.vmdl_c new file mode 100755 index 0000000..52c043c Binary files /dev/null and b/models/thd_hero/futo/futo.vmdl_c differ diff --git a/models/thd_hero/futo/futo.vmesh_c b/models/thd_hero/futo/futo.vmesh_c new file mode 100755 index 0000000..521d7ed Binary files /dev/null and b/models/thd_hero/futo/futo.vmesh_c differ diff --git a/models/thd_hero/futo/futo_ccbb6ec0.vagrp_c b/models/thd_hero/futo/futo_ccbb6ec0.vagrp_c new file mode 100755 index 0000000..cc9480b Binary files /dev/null and b/models/thd_hero/futo/futo_ccbb6ec0.vagrp_c differ diff --git a/models/thd_hero/futo/futo_plate.vmdl_c b/models/thd_hero/futo/futo_plate.vmdl_c new file mode 100755 index 0000000..b26ec72 Binary files /dev/null and b/models/thd_hero/futo/futo_plate.vmdl_c differ diff --git a/models/thd_hero/futo/futo_plate.vmesh_c b/models/thd_hero/futo/futo_plate.vmesh_c new file mode 100755 index 0000000..47b3a8d Binary files /dev/null and b/models/thd_hero/futo/futo_plate.vmesh_c differ diff --git a/models/thd_hero/futo/item/09265e7b/1.vanim_c b/models/thd_hero/futo/item/09265e7b/1.vanim_c new file mode 100755 index 0000000..6c732af Binary files /dev/null and b/models/thd_hero/futo/item/09265e7b/1.vanim_c differ diff --git a/models/thd_hero/futo/item/09265e7b/attack.vanim_c b/models/thd_hero/futo/item/09265e7b/attack.vanim_c new file mode 100755 index 0000000..ac8a6fe Binary files /dev/null and b/models/thd_hero/futo/item/09265e7b/attack.vanim_c differ diff --git a/models/thd_hero/futo/item/09265e7b/cast.vanim_c b/models/thd_hero/futo/item/09265e7b/cast.vanim_c new file mode 100755 index 0000000..2598b3f Binary files /dev/null and b/models/thd_hero/futo/item/09265e7b/cast.vanim_c differ diff --git a/models/thd_hero/futo/item/09265e7b/cast2.vanim_c b/models/thd_hero/futo/item/09265e7b/cast2.vanim_c new file mode 100755 index 0000000..d22eca3 Binary files /dev/null and b/models/thd_hero/futo/item/09265e7b/cast2.vanim_c differ diff --git a/models/thd_hero/futo/item/09265e7b/idle.vanim_c b/models/thd_hero/futo/item/09265e7b/idle.vanim_c new file mode 100755 index 0000000..b02abbc Binary files /dev/null and b/models/thd_hero/futo/item/09265e7b/idle.vanim_c differ diff --git a/models/thd_hero/futo/item/09265e7b/run.vanim_c b/models/thd_hero/futo/item/09265e7b/run.vanim_c new file mode 100755 index 0000000..86b960c Binary files /dev/null and b/models/thd_hero/futo/item/09265e7b/run.vanim_c differ diff --git a/models/thd_hero/futo/item/futo.vmesh_c b/models/thd_hero/futo/item/futo.vmesh_c new file mode 100755 index 0000000..1c3de44 Binary files /dev/null and b/models/thd_hero/futo/item/futo.vmesh_c differ diff --git a/models/thd_hero/futo/item/item_futo.vmdl_c b/models/thd_hero/futo/item/item_futo.vmdl_c new file mode 100755 index 0000000..9e500b6 Binary files /dev/null and b/models/thd_hero/futo/item/item_futo.vmdl_c differ diff --git a/models/thd_hero/futo/item/item_futo_09265e7b.vagrp_c b/models/thd_hero/futo/item/item_futo_09265e7b.vagrp_c new file mode 100755 index 0000000..19a39d7 Binary files /dev/null and b/models/thd_hero/futo/item/item_futo_09265e7b.vagrp_c differ diff --git a/models/thd_hero/hanadayousei/2b4cc7c2/attack.vanim_c b/models/thd_hero/hanadayousei/2b4cc7c2/attack.vanim_c new file mode 100755 index 0000000..22d16b1 Binary files /dev/null and b/models/thd_hero/hanadayousei/2b4cc7c2/attack.vanim_c differ diff --git a/models/thd_hero/hanadayousei/2b4cc7c2/idle.vanim_c b/models/thd_hero/hanadayousei/2b4cc7c2/idle.vanim_c new file mode 100755 index 0000000..9fc3642 Binary files /dev/null and b/models/thd_hero/hanadayousei/2b4cc7c2/idle.vanim_c differ diff --git a/models/thd_hero/hanadayousei/2b4cc7c2/run.vanim_c b/models/thd_hero/hanadayousei/2b4cc7c2/run.vanim_c new file mode 100755 index 0000000..4337938 Binary files /dev/null and b/models/thd_hero/hanadayousei/2b4cc7c2/run.vanim_c differ diff --git a/models/thd_hero/hanadayousei/hanadayousei.vmdl_c b/models/thd_hero/hanadayousei/hanadayousei.vmdl_c new file mode 100755 index 0000000..08b7654 Binary files /dev/null and b/models/thd_hero/hanadayousei/hanadayousei.vmdl_c differ diff --git a/models/thd_hero/hanadayousei/hanadayousei.vmesh_c b/models/thd_hero/hanadayousei/hanadayousei.vmesh_c new file mode 100755 index 0000000..ce0da35 Binary files /dev/null and b/models/thd_hero/hanadayousei/hanadayousei.vmesh_c differ diff --git a/models/thd_hero/hanadayousei/hanadayousei_2b4cc7c2.vagrp_c b/models/thd_hero/hanadayousei/hanadayousei_2b4cc7c2.vagrp_c new file mode 100755 index 0000000..f3ba3f6 Binary files /dev/null and b/models/thd_hero/hanadayousei/hanadayousei_2b4cc7c2.vagrp_c differ diff --git a/models/thd_hero/hanadayousei/item/f6542b68/attack.vanim_c b/models/thd_hero/hanadayousei/item/f6542b68/attack.vanim_c new file mode 100755 index 0000000..f8f1136 Binary files /dev/null and b/models/thd_hero/hanadayousei/item/f6542b68/attack.vanim_c differ diff --git a/models/thd_hero/hanadayousei/item/f6542b68/idle.vanim_c b/models/thd_hero/hanadayousei/item/f6542b68/idle.vanim_c new file mode 100755 index 0000000..5594f76 Binary files /dev/null and b/models/thd_hero/hanadayousei/item/f6542b68/idle.vanim_c differ diff --git a/models/thd_hero/hanadayousei/item/f6542b68/run.vanim_c b/models/thd_hero/hanadayousei/item/f6542b68/run.vanim_c new file mode 100755 index 0000000..a679a9f Binary files /dev/null and b/models/thd_hero/hanadayousei/item/f6542b68/run.vanim_c differ diff --git a/models/thd_hero/hanadayousei/item/hanadayousei.vmesh_c b/models/thd_hero/hanadayousei/item/hanadayousei.vmesh_c new file mode 100755 index 0000000..59544ec Binary files /dev/null and b/models/thd_hero/hanadayousei/item/hanadayousei.vmesh_c differ diff --git a/models/thd_hero/hanadayousei/item/item_hanadayousei.vmdl_c b/models/thd_hero/hanadayousei/item/item_hanadayousei.vmdl_c new file mode 100755 index 0000000..9c1cd1f Binary files /dev/null and b/models/thd_hero/hanadayousei/item/item_hanadayousei.vmdl_c differ diff --git a/models/thd_hero/hanadayousei/item/item_hanadayousei_f6542b68.vagrp_c b/models/thd_hero/hanadayousei/item/item_hanadayousei_f6542b68.vagrp_c new file mode 100755 index 0000000..7a2f036 Binary files /dev/null and b/models/thd_hero/hanadayousei/item/item_hanadayousei_f6542b68.vagrp_c differ diff --git a/models/thd_hero/hatate/10cd2518/attack1.vanim_c b/models/thd_hero/hatate/10cd2518/attack1.vanim_c new file mode 100755 index 0000000..cdf2eb9 Binary files /dev/null and b/models/thd_hero/hatate/10cd2518/attack1.vanim_c differ diff --git a/models/thd_hero/hatate/10cd2518/attack2.vanim_c b/models/thd_hero/hatate/10cd2518/attack2.vanim_c new file mode 100755 index 0000000..6764b3c Binary files /dev/null and b/models/thd_hero/hatate/10cd2518/attack2.vanim_c differ diff --git a/models/thd_hero/hatate/10cd2518/cast1.vanim_c b/models/thd_hero/hatate/10cd2518/cast1.vanim_c new file mode 100755 index 0000000..7954a82 Binary files /dev/null and b/models/thd_hero/hatate/10cd2518/cast1.vanim_c differ diff --git a/models/thd_hero/hatate/10cd2518/cast2.vanim_c b/models/thd_hero/hatate/10cd2518/cast2.vanim_c new file mode 100755 index 0000000..9bff7a0 Binary files /dev/null and b/models/thd_hero/hatate/10cd2518/cast2.vanim_c differ diff --git a/models/thd_hero/hatate/10cd2518/cast3.vanim_c b/models/thd_hero/hatate/10cd2518/cast3.vanim_c new file mode 100755 index 0000000..917bd7c Binary files /dev/null and b/models/thd_hero/hatate/10cd2518/cast3.vanim_c differ diff --git a/models/thd_hero/hatate/10cd2518/cast4.vanim_c b/models/thd_hero/hatate/10cd2518/cast4.vanim_c new file mode 100755 index 0000000..aac9669 Binary files /dev/null and b/models/thd_hero/hatate/10cd2518/cast4.vanim_c differ diff --git a/models/thd_hero/hatate/10cd2518/hatate_animation.vanim_c b/models/thd_hero/hatate/10cd2518/hatate_animation.vanim_c new file mode 100755 index 0000000..ca4a43b Binary files /dev/null and b/models/thd_hero/hatate/10cd2518/hatate_animation.vanim_c differ diff --git a/models/thd_hero/hatate/10cd2518/idle.vanim_c b/models/thd_hero/hatate/10cd2518/idle.vanim_c new file mode 100755 index 0000000..27a6205 Binary files /dev/null and b/models/thd_hero/hatate/10cd2518/idle.vanim_c differ diff --git a/models/thd_hero/hatate/10cd2518/run.vanim_c b/models/thd_hero/hatate/10cd2518/run.vanim_c new file mode 100755 index 0000000..63ea15e Binary files /dev/null and b/models/thd_hero/hatate/10cd2518/run.vanim_c differ diff --git a/models/thd_hero/hatate/hatate.vmdl_c b/models/thd_hero/hatate/hatate.vmdl_c new file mode 100755 index 0000000..9a77f26 Binary files /dev/null and b/models/thd_hero/hatate/hatate.vmdl_c differ diff --git a/models/thd_hero/hatate/hatate.vmesh_c b/models/thd_hero/hatate/hatate.vmesh_c new file mode 100755 index 0000000..935f9bc Binary files /dev/null and b/models/thd_hero/hatate/hatate.vmesh_c differ diff --git a/models/thd_hero/hatate/hatate_10cd2518.vagrp_c b/models/thd_hero/hatate/hatate_10cd2518.vagrp_c new file mode 100755 index 0000000..68d84ea Binary files /dev/null and b/models/thd_hero/hatate/hatate_10cd2518.vagrp_c differ diff --git a/models/thd_hero/hatate/item/0d373159/attack1.vanim_c b/models/thd_hero/hatate/item/0d373159/attack1.vanim_c new file mode 100755 index 0000000..a11a389 Binary files /dev/null and b/models/thd_hero/hatate/item/0d373159/attack1.vanim_c differ diff --git a/models/thd_hero/hatate/item/0d373159/attack2.vanim_c b/models/thd_hero/hatate/item/0d373159/attack2.vanim_c new file mode 100755 index 0000000..3d97cfe Binary files /dev/null and b/models/thd_hero/hatate/item/0d373159/attack2.vanim_c differ diff --git a/models/thd_hero/hatate/item/0d373159/cast1.vanim_c b/models/thd_hero/hatate/item/0d373159/cast1.vanim_c new file mode 100755 index 0000000..267f15b Binary files /dev/null and b/models/thd_hero/hatate/item/0d373159/cast1.vanim_c differ diff --git a/models/thd_hero/hatate/item/0d373159/cast2.vanim_c b/models/thd_hero/hatate/item/0d373159/cast2.vanim_c new file mode 100755 index 0000000..64b9560 Binary files /dev/null and b/models/thd_hero/hatate/item/0d373159/cast2.vanim_c differ diff --git a/models/thd_hero/hatate/item/0d373159/cast3.vanim_c b/models/thd_hero/hatate/item/0d373159/cast3.vanim_c new file mode 100755 index 0000000..ff44ac7 Binary files /dev/null and b/models/thd_hero/hatate/item/0d373159/cast3.vanim_c differ diff --git a/models/thd_hero/hatate/item/0d373159/cast4.vanim_c b/models/thd_hero/hatate/item/0d373159/cast4.vanim_c new file mode 100755 index 0000000..6b1208b Binary files /dev/null and b/models/thd_hero/hatate/item/0d373159/cast4.vanim_c differ diff --git a/models/thd_hero/hatate/item/0d373159/idle.vanim_c b/models/thd_hero/hatate/item/0d373159/idle.vanim_c new file mode 100755 index 0000000..68554e0 Binary files /dev/null and b/models/thd_hero/hatate/item/0d373159/idle.vanim_c differ diff --git a/models/thd_hero/hatate/item/0d373159/run.vanim_c b/models/thd_hero/hatate/item/0d373159/run.vanim_c new file mode 100755 index 0000000..47f37cb Binary files /dev/null and b/models/thd_hero/hatate/item/0d373159/run.vanim_c differ diff --git a/models/thd_hero/hatate/item/hatate.vmesh_c b/models/thd_hero/hatate/item/hatate.vmesh_c new file mode 100755 index 0000000..a7bc262 Binary files /dev/null and b/models/thd_hero/hatate/item/hatate.vmesh_c differ diff --git a/models/thd_hero/hatate/item/item_hatate.vmdl_c b/models/thd_hero/hatate/item/item_hatate.vmdl_c new file mode 100755 index 0000000..515e1f0 Binary files /dev/null and b/models/thd_hero/hatate/item/item_hatate.vmdl_c differ diff --git a/models/thd_hero/hatate/item/item_hatate_0d373159.vagrp_c b/models/thd_hero/hatate/item/item_hatate_0d373159.vagrp_c new file mode 100755 index 0000000..d2e1230 Binary files /dev/null and b/models/thd_hero/hatate/item/item_hatate_0d373159.vagrp_c differ diff --git a/models/thd_hero/hina/b6cfd493/attack.vanim_c b/models/thd_hero/hina/b6cfd493/attack.vanim_c new file mode 100755 index 0000000..413cac3 Binary files /dev/null and b/models/thd_hero/hina/b6cfd493/attack.vanim_c differ diff --git a/models/thd_hero/hina/b6cfd493/cast4.vanim_c b/models/thd_hero/hina/b6cfd493/cast4.vanim_c new file mode 100755 index 0000000..9b3a7b2 Binary files /dev/null and b/models/thd_hero/hina/b6cfd493/cast4.vanim_c differ diff --git a/models/thd_hero/hina/b6cfd493/cast4_2.vanim_c b/models/thd_hero/hina/b6cfd493/cast4_2.vanim_c new file mode 100755 index 0000000..a4a7500 Binary files /dev/null and b/models/thd_hero/hina/b6cfd493/cast4_2.vanim_c differ diff --git a/models/thd_hero/hina/b6cfd493/hina_animation.vanim_c b/models/thd_hero/hina/b6cfd493/hina_animation.vanim_c new file mode 100755 index 0000000..65a160a Binary files /dev/null and b/models/thd_hero/hina/b6cfd493/hina_animation.vanim_c differ diff --git a/models/thd_hero/hina/b6cfd493/idle.vanim_c b/models/thd_hero/hina/b6cfd493/idle.vanim_c new file mode 100755 index 0000000..f45970a Binary files /dev/null and b/models/thd_hero/hina/b6cfd493/idle.vanim_c differ diff --git a/models/thd_hero/hina/b6cfd493/run.vanim_c b/models/thd_hero/hina/b6cfd493/run.vanim_c new file mode 100755 index 0000000..2779f78 Binary files /dev/null and b/models/thd_hero/hina/b6cfd493/run.vanim_c differ diff --git a/models/thd_hero/hina/hina.vmdl_c b/models/thd_hero/hina/hina.vmdl_c new file mode 100755 index 0000000..59df1a9 Binary files /dev/null and b/models/thd_hero/hina/hina.vmdl_c differ diff --git a/models/thd_hero/hina/hina.vmesh_c b/models/thd_hero/hina/hina.vmesh_c new file mode 100755 index 0000000..040f1f5 Binary files /dev/null and b/models/thd_hero/hina/hina.vmesh_c differ diff --git a/models/thd_hero/hina/hina_b6cfd493.vagrp_c b/models/thd_hero/hina/hina_b6cfd493.vagrp_c new file mode 100755 index 0000000..c1106ee Binary files /dev/null and b/models/thd_hero/hina/hina_b6cfd493.vagrp_c differ diff --git a/models/thd_hero/hina/item/67053901/attack.vanim_c b/models/thd_hero/hina/item/67053901/attack.vanim_c new file mode 100755 index 0000000..27c4aab Binary files /dev/null and b/models/thd_hero/hina/item/67053901/attack.vanim_c differ diff --git a/models/thd_hero/hina/item/67053901/cast4.vanim_c b/models/thd_hero/hina/item/67053901/cast4.vanim_c new file mode 100755 index 0000000..ade4e1f Binary files /dev/null and b/models/thd_hero/hina/item/67053901/cast4.vanim_c differ diff --git a/models/thd_hero/hina/item/67053901/cast4_2.vanim_c b/models/thd_hero/hina/item/67053901/cast4_2.vanim_c new file mode 100755 index 0000000..cf58eb2 Binary files /dev/null and b/models/thd_hero/hina/item/67053901/cast4_2.vanim_c differ diff --git a/models/thd_hero/hina/item/67053901/idle.vanim_c b/models/thd_hero/hina/item/67053901/idle.vanim_c new file mode 100755 index 0000000..de065ad Binary files /dev/null and b/models/thd_hero/hina/item/67053901/idle.vanim_c differ diff --git a/models/thd_hero/hina/item/67053901/run.vanim_c b/models/thd_hero/hina/item/67053901/run.vanim_c new file mode 100755 index 0000000..88cc9cc Binary files /dev/null and b/models/thd_hero/hina/item/67053901/run.vanim_c differ diff --git a/models/thd_hero/hina/item/hina.vmesh_c b/models/thd_hero/hina/item/hina.vmesh_c new file mode 100755 index 0000000..3937e2d Binary files /dev/null and b/models/thd_hero/hina/item/hina.vmesh_c differ diff --git a/models/thd_hero/hina/item/item_hina.vmdl_c b/models/thd_hero/hina/item/item_hina.vmdl_c new file mode 100755 index 0000000..8e9e132 Binary files /dev/null and b/models/thd_hero/hina/item/item_hina.vmdl_c differ diff --git a/models/thd_hero/hina/item/item_hina_67053901.vagrp_c b/models/thd_hero/hina/item/item_hina_67053901.vagrp_c new file mode 100755 index 0000000..3d75def Binary files /dev/null and b/models/thd_hero/hina/item/item_hina_67053901.vagrp_c differ diff --git a/models/thd_hero/hourainingyou/45498b0e/hourai_attack.vanim_c b/models/thd_hero/hourainingyou/45498b0e/hourai_attack.vanim_c new file mode 100755 index 0000000..c91ec42 Binary files /dev/null and b/models/thd_hero/hourainingyou/45498b0e/hourai_attack.vanim_c differ diff --git a/models/thd_hero/hourainingyou/45498b0e/hourai_idle.vanim_c b/models/thd_hero/hourainingyou/45498b0e/hourai_idle.vanim_c new file mode 100755 index 0000000..892f3cb Binary files /dev/null and b/models/thd_hero/hourainingyou/45498b0e/hourai_idle.vanim_c differ diff --git a/models/thd_hero/hourainingyou/45498b0e/hourai_run.vanim_c b/models/thd_hero/hourainingyou/45498b0e/hourai_run.vanim_c new file mode 100755 index 0000000..28d663d Binary files /dev/null and b/models/thd_hero/hourainingyou/45498b0e/hourai_run.vanim_c differ diff --git a/models/thd_hero/hourainingyou/hourainingyou.vmdl_c b/models/thd_hero/hourainingyou/hourainingyou.vmdl_c new file mode 100755 index 0000000..aa32835 Binary files /dev/null and b/models/thd_hero/hourainingyou/hourainingyou.vmdl_c differ diff --git a/models/thd_hero/hourainingyou/hourainingyou.vmesh_c b/models/thd_hero/hourainingyou/hourainingyou.vmesh_c new file mode 100755 index 0000000..ae750c1 Binary files /dev/null and b/models/thd_hero/hourainingyou/hourainingyou.vmesh_c differ diff --git a/models/thd_hero/hourainingyou/hourainingyou_45498b0e.vagrp_c b/models/thd_hero/hourainingyou/hourainingyou_45498b0e.vagrp_c new file mode 100755 index 0000000..707ab99 Binary files /dev/null and b/models/thd_hero/hourainingyou/hourainingyou_45498b0e.vagrp_c differ diff --git a/models/thd_hero/hourainingyou/item/e0ced9c9/hourai_attack.vanim_c b/models/thd_hero/hourainingyou/item/e0ced9c9/hourai_attack.vanim_c new file mode 100755 index 0000000..ecf562d Binary files /dev/null and b/models/thd_hero/hourainingyou/item/e0ced9c9/hourai_attack.vanim_c differ diff --git a/models/thd_hero/hourainingyou/item/e0ced9c9/hourai_idle.vanim_c b/models/thd_hero/hourainingyou/item/e0ced9c9/hourai_idle.vanim_c new file mode 100755 index 0000000..fb8135e Binary files /dev/null and b/models/thd_hero/hourainingyou/item/e0ced9c9/hourai_idle.vanim_c differ diff --git a/models/thd_hero/hourainingyou/item/e0ced9c9/hourai_run.vanim_c b/models/thd_hero/hourainingyou/item/e0ced9c9/hourai_run.vanim_c new file mode 100755 index 0000000..1be0a1d Binary files /dev/null and b/models/thd_hero/hourainingyou/item/e0ced9c9/hourai_run.vanim_c differ diff --git a/models/thd_hero/hourainingyou/item/hourainingyou.vmesh_c b/models/thd_hero/hourainingyou/item/hourainingyou.vmesh_c new file mode 100755 index 0000000..0015b10 Binary files /dev/null and b/models/thd_hero/hourainingyou/item/hourainingyou.vmesh_c differ diff --git a/models/thd_hero/hourainingyou/item/item_hourainingyou.vmdl_c b/models/thd_hero/hourainingyou/item/item_hourainingyou.vmdl_c new file mode 100755 index 0000000..c8b62de Binary files /dev/null and b/models/thd_hero/hourainingyou/item/item_hourainingyou.vmdl_c differ diff --git a/models/thd_hero/hourainingyou/item/item_hourainingyou_e0ced9c9.vagrp_c b/models/thd_hero/hourainingyou/item/item_hourainingyou_e0ced9c9.vagrp_c new file mode 100755 index 0000000..2d6a71f Binary files /dev/null and b/models/thd_hero/hourainingyou/item/item_hourainingyou_e0ced9c9.vagrp_c differ diff --git a/models/thd_hero/iku/0e3b27b7/attack.vanim_c b/models/thd_hero/iku/0e3b27b7/attack.vanim_c new file mode 100755 index 0000000..6407613 Binary files /dev/null and b/models/thd_hero/iku/0e3b27b7/attack.vanim_c differ diff --git a/models/thd_hero/iku/0e3b27b7/cast.vanim_c b/models/thd_hero/iku/0e3b27b7/cast.vanim_c new file mode 100755 index 0000000..f4d69b3 Binary files /dev/null and b/models/thd_hero/iku/0e3b27b7/cast.vanim_c differ diff --git a/models/thd_hero/iku/0e3b27b7/idle.vanim_c b/models/thd_hero/iku/0e3b27b7/idle.vanim_c new file mode 100755 index 0000000..a28986f Binary files /dev/null and b/models/thd_hero/iku/0e3b27b7/idle.vanim_c differ diff --git a/models/thd_hero/iku/0e3b27b7/por.vanim_c b/models/thd_hero/iku/0e3b27b7/por.vanim_c new file mode 100755 index 0000000..b6fb07a Binary files /dev/null and b/models/thd_hero/iku/0e3b27b7/por.vanim_c differ diff --git a/models/thd_hero/iku/0e3b27b7/run.vanim_c b/models/thd_hero/iku/0e3b27b7/run.vanim_c new file mode 100755 index 0000000..e73ac49 Binary files /dev/null and b/models/thd_hero/iku/0e3b27b7/run.vanim_c differ diff --git a/models/thd_hero/iku/iku.vmdl_c b/models/thd_hero/iku/iku.vmdl_c new file mode 100755 index 0000000..6fef789 Binary files /dev/null and b/models/thd_hero/iku/iku.vmdl_c differ diff --git a/models/thd_hero/iku/iku.vmesh_c b/models/thd_hero/iku/iku.vmesh_c new file mode 100755 index 0000000..9787304 Binary files /dev/null and b/models/thd_hero/iku/iku.vmesh_c differ diff --git a/models/thd_hero/iku/iku_0e3b27b7.vagrp_c b/models/thd_hero/iku/iku_0e3b27b7.vagrp_c new file mode 100755 index 0000000..525413f Binary files /dev/null and b/models/thd_hero/iku/iku_0e3b27b7.vagrp_c differ diff --git a/models/thd_hero/iku/item/7d8f9427/attack.vanim_c b/models/thd_hero/iku/item/7d8f9427/attack.vanim_c new file mode 100755 index 0000000..7448325 Binary files /dev/null and b/models/thd_hero/iku/item/7d8f9427/attack.vanim_c differ diff --git a/models/thd_hero/iku/item/7d8f9427/cast.vanim_c b/models/thd_hero/iku/item/7d8f9427/cast.vanim_c new file mode 100755 index 0000000..43d22dd Binary files /dev/null and b/models/thd_hero/iku/item/7d8f9427/cast.vanim_c differ diff --git a/models/thd_hero/iku/item/7d8f9427/idle.vanim_c b/models/thd_hero/iku/item/7d8f9427/idle.vanim_c new file mode 100755 index 0000000..5f7ed65 Binary files /dev/null and b/models/thd_hero/iku/item/7d8f9427/idle.vanim_c differ diff --git a/models/thd_hero/iku/item/7d8f9427/por.vanim_c b/models/thd_hero/iku/item/7d8f9427/por.vanim_c new file mode 100755 index 0000000..b605895 Binary files /dev/null and b/models/thd_hero/iku/item/7d8f9427/por.vanim_c differ diff --git a/models/thd_hero/iku/item/7d8f9427/run.vanim_c b/models/thd_hero/iku/item/7d8f9427/run.vanim_c new file mode 100755 index 0000000..445b064 Binary files /dev/null and b/models/thd_hero/iku/item/7d8f9427/run.vanim_c differ diff --git a/models/thd_hero/iku/item/iku.vmesh_c b/models/thd_hero/iku/item/iku.vmesh_c new file mode 100755 index 0000000..09722d3 Binary files /dev/null and b/models/thd_hero/iku/item/iku.vmesh_c differ diff --git a/models/thd_hero/iku/item/item_iku.vmdl_c b/models/thd_hero/iku/item/item_iku.vmdl_c new file mode 100755 index 0000000..b6b11ad Binary files /dev/null and b/models/thd_hero/iku/item/item_iku.vmdl_c differ diff --git a/models/thd_hero/iku/item/item_iku_7d8f9427.vagrp_c b/models/thd_hero/iku/item/item_iku_7d8f9427.vagrp_c new file mode 100755 index 0000000..1808bb1 Binary files /dev/null and b/models/thd_hero/iku/item/item_iku_7d8f9427.vagrp_c differ diff --git a/models/thd_hero/kagerou/c02b613e/attack.vanim_c b/models/thd_hero/kagerou/c02b613e/attack.vanim_c new file mode 100755 index 0000000..1ef7ee9 Binary files /dev/null and b/models/thd_hero/kagerou/c02b613e/attack.vanim_c differ diff --git a/models/thd_hero/kagerou/c02b613e/attack2.vanim_c b/models/thd_hero/kagerou/c02b613e/attack2.vanim_c new file mode 100755 index 0000000..ef3e58c Binary files /dev/null and b/models/thd_hero/kagerou/c02b613e/attack2.vanim_c differ diff --git a/models/thd_hero/kagerou/c02b613e/cast1.vanim_c b/models/thd_hero/kagerou/c02b613e/cast1.vanim_c new file mode 100755 index 0000000..f563a28 Binary files /dev/null and b/models/thd_hero/kagerou/c02b613e/cast1.vanim_c differ diff --git a/models/thd_hero/kagerou/c02b613e/cast2.vanim_c b/models/thd_hero/kagerou/c02b613e/cast2.vanim_c new file mode 100755 index 0000000..e402d90 Binary files /dev/null and b/models/thd_hero/kagerou/c02b613e/cast2.vanim_c differ diff --git a/models/thd_hero/kagerou/c02b613e/idle.vanim_c b/models/thd_hero/kagerou/c02b613e/idle.vanim_c new file mode 100755 index 0000000..98b58d8 Binary files /dev/null and b/models/thd_hero/kagerou/c02b613e/idle.vanim_c differ diff --git a/models/thd_hero/kagerou/c02b613e/kagerou_animation.vanim_c b/models/thd_hero/kagerou/c02b613e/kagerou_animation.vanim_c new file mode 100755 index 0000000..5dfdb4d Binary files /dev/null and b/models/thd_hero/kagerou/c02b613e/kagerou_animation.vanim_c differ diff --git a/models/thd_hero/kagerou/c02b613e/run.vanim_c b/models/thd_hero/kagerou/c02b613e/run.vanim_c new file mode 100755 index 0000000..5c90c6d Binary files /dev/null and b/models/thd_hero/kagerou/c02b613e/run.vanim_c differ diff --git a/models/thd_hero/kagerou/item/ede6c57a/attack.vanim_c b/models/thd_hero/kagerou/item/ede6c57a/attack.vanim_c new file mode 100755 index 0000000..be1169f Binary files /dev/null and b/models/thd_hero/kagerou/item/ede6c57a/attack.vanim_c differ diff --git a/models/thd_hero/kagerou/item/ede6c57a/attack2.vanim_c b/models/thd_hero/kagerou/item/ede6c57a/attack2.vanim_c new file mode 100755 index 0000000..b1ddad0 Binary files /dev/null and b/models/thd_hero/kagerou/item/ede6c57a/attack2.vanim_c differ diff --git a/models/thd_hero/kagerou/item/ede6c57a/cast1.vanim_c b/models/thd_hero/kagerou/item/ede6c57a/cast1.vanim_c new file mode 100755 index 0000000..f743bb0 Binary files /dev/null and b/models/thd_hero/kagerou/item/ede6c57a/cast1.vanim_c differ diff --git a/models/thd_hero/kagerou/item/ede6c57a/cast2.vanim_c b/models/thd_hero/kagerou/item/ede6c57a/cast2.vanim_c new file mode 100755 index 0000000..0bf7dbe Binary files /dev/null and b/models/thd_hero/kagerou/item/ede6c57a/cast2.vanim_c differ diff --git a/models/thd_hero/kagerou/item/ede6c57a/idle.vanim_c b/models/thd_hero/kagerou/item/ede6c57a/idle.vanim_c new file mode 100755 index 0000000..328c719 Binary files /dev/null and b/models/thd_hero/kagerou/item/ede6c57a/idle.vanim_c differ diff --git a/models/thd_hero/kagerou/item/ede6c57a/run.vanim_c b/models/thd_hero/kagerou/item/ede6c57a/run.vanim_c new file mode 100755 index 0000000..38f343c Binary files /dev/null and b/models/thd_hero/kagerou/item/ede6c57a/run.vanim_c differ diff --git a/models/thd_hero/kagerou/item/item_kagerou.vmdl_c b/models/thd_hero/kagerou/item/item_kagerou.vmdl_c new file mode 100755 index 0000000..a08454c Binary files /dev/null and b/models/thd_hero/kagerou/item/item_kagerou.vmdl_c differ diff --git a/models/thd_hero/kagerou/item/item_kagerou_ede6c57a.vagrp_c b/models/thd_hero/kagerou/item/item_kagerou_ede6c57a.vagrp_c new file mode 100755 index 0000000..57fc4bd Binary files /dev/null and b/models/thd_hero/kagerou/item/item_kagerou_ede6c57a.vagrp_c differ diff --git a/models/thd_hero/kagerou/item/kagerou.vmesh_c b/models/thd_hero/kagerou/item/kagerou.vmesh_c new file mode 100755 index 0000000..a9655c4 Binary files /dev/null and b/models/thd_hero/kagerou/item/kagerou.vmesh_c differ diff --git a/models/thd_hero/kagerou/kagerou.vmdl_c b/models/thd_hero/kagerou/kagerou.vmdl_c new file mode 100755 index 0000000..3934823 Binary files /dev/null and b/models/thd_hero/kagerou/kagerou.vmdl_c differ diff --git a/models/thd_hero/kagerou/kagerou.vmesh_c b/models/thd_hero/kagerou/kagerou.vmesh_c new file mode 100755 index 0000000..e21f14f Binary files /dev/null and b/models/thd_hero/kagerou/kagerou.vmesh_c differ diff --git a/models/thd_hero/kagerou/kagerou_c02b613e.vagrp_c b/models/thd_hero/kagerou/kagerou_c02b613e.vagrp_c new file mode 100755 index 0000000..c5e2515 Binary files /dev/null and b/models/thd_hero/kagerou/kagerou_c02b613e.vagrp_c differ diff --git a/models/thd_hero/kaguya/d20d7029/attack.vanim_c b/models/thd_hero/kaguya/d20d7029/attack.vanim_c new file mode 100755 index 0000000..e78e6db Binary files /dev/null and b/models/thd_hero/kaguya/d20d7029/attack.vanim_c differ diff --git a/models/thd_hero/kaguya/d20d7029/cast1.vanim_c b/models/thd_hero/kaguya/d20d7029/cast1.vanim_c new file mode 100755 index 0000000..cc72d1e Binary files /dev/null and b/models/thd_hero/kaguya/d20d7029/cast1.vanim_c differ diff --git a/models/thd_hero/kaguya/d20d7029/cast2.vanim_c b/models/thd_hero/kaguya/d20d7029/cast2.vanim_c new file mode 100755 index 0000000..e269084 Binary files /dev/null and b/models/thd_hero/kaguya/d20d7029/cast2.vanim_c differ diff --git a/models/thd_hero/kaguya/d20d7029/cast3.vanim_c b/models/thd_hero/kaguya/d20d7029/cast3.vanim_c new file mode 100755 index 0000000..25fe3f1 Binary files /dev/null and b/models/thd_hero/kaguya/d20d7029/cast3.vanim_c differ diff --git a/models/thd_hero/kaguya/d20d7029/cast4.vanim_c b/models/thd_hero/kaguya/d20d7029/cast4.vanim_c new file mode 100755 index 0000000..2dc10be Binary files /dev/null and b/models/thd_hero/kaguya/d20d7029/cast4.vanim_c differ diff --git a/models/thd_hero/kaguya/d20d7029/die.vanim_c b/models/thd_hero/kaguya/d20d7029/die.vanim_c new file mode 100755 index 0000000..b88bed3 Binary files /dev/null and b/models/thd_hero/kaguya/d20d7029/die.vanim_c differ diff --git a/models/thd_hero/kaguya/d20d7029/idle.vanim_c b/models/thd_hero/kaguya/d20d7029/idle.vanim_c new file mode 100755 index 0000000..b7a32ee Binary files /dev/null and b/models/thd_hero/kaguya/d20d7029/idle.vanim_c differ diff --git a/models/thd_hero/kaguya/d20d7029/kaguya_animation.vanim_c b/models/thd_hero/kaguya/d20d7029/kaguya_animation.vanim_c new file mode 100755 index 0000000..b4e4479 Binary files /dev/null and b/models/thd_hero/kaguya/d20d7029/kaguya_animation.vanim_c differ diff --git a/models/thd_hero/kaguya/d20d7029/run.vanim_c b/models/thd_hero/kaguya/d20d7029/run.vanim_c new file mode 100755 index 0000000..0b0d821 Binary files /dev/null and b/models/thd_hero/kaguya/d20d7029/run.vanim_c differ diff --git a/models/thd_hero/kaguya/item/db953009/attack.vanim_c b/models/thd_hero/kaguya/item/db953009/attack.vanim_c new file mode 100755 index 0000000..f3b67a0 Binary files /dev/null and b/models/thd_hero/kaguya/item/db953009/attack.vanim_c differ diff --git a/models/thd_hero/kaguya/item/db953009/cast1.vanim_c b/models/thd_hero/kaguya/item/db953009/cast1.vanim_c new file mode 100755 index 0000000..6ff1ec6 Binary files /dev/null and b/models/thd_hero/kaguya/item/db953009/cast1.vanim_c differ diff --git a/models/thd_hero/kaguya/item/db953009/cast2.vanim_c b/models/thd_hero/kaguya/item/db953009/cast2.vanim_c new file mode 100755 index 0000000..a904ebd Binary files /dev/null and b/models/thd_hero/kaguya/item/db953009/cast2.vanim_c differ diff --git a/models/thd_hero/kaguya/item/db953009/cast3.vanim_c b/models/thd_hero/kaguya/item/db953009/cast3.vanim_c new file mode 100755 index 0000000..fa60eb4 Binary files /dev/null and b/models/thd_hero/kaguya/item/db953009/cast3.vanim_c differ diff --git a/models/thd_hero/kaguya/item/db953009/cast4.vanim_c b/models/thd_hero/kaguya/item/db953009/cast4.vanim_c new file mode 100755 index 0000000..7d181ca Binary files /dev/null and b/models/thd_hero/kaguya/item/db953009/cast4.vanim_c differ diff --git a/models/thd_hero/kaguya/item/db953009/idle.vanim_c b/models/thd_hero/kaguya/item/db953009/idle.vanim_c new file mode 100755 index 0000000..4f1ab19 Binary files /dev/null and b/models/thd_hero/kaguya/item/db953009/idle.vanim_c differ diff --git a/models/thd_hero/kaguya/item/db953009/run.vanim_c b/models/thd_hero/kaguya/item/db953009/run.vanim_c new file mode 100755 index 0000000..485b45b Binary files /dev/null and b/models/thd_hero/kaguya/item/db953009/run.vanim_c differ diff --git a/models/thd_hero/kaguya/item/item_kaguya.vmdl_c b/models/thd_hero/kaguya/item/item_kaguya.vmdl_c new file mode 100755 index 0000000..78c9c1b Binary files /dev/null and b/models/thd_hero/kaguya/item/item_kaguya.vmdl_c differ diff --git a/models/thd_hero/kaguya/item/item_kaguya_db953009.vagrp_c b/models/thd_hero/kaguya/item/item_kaguya_db953009.vagrp_c new file mode 100755 index 0000000..a76bb09 Binary files /dev/null and b/models/thd_hero/kaguya/item/item_kaguya_db953009.vagrp_c differ diff --git a/models/thd_hero/kaguya/item/kaguya.vmesh_c b/models/thd_hero/kaguya/item/kaguya.vmesh_c new file mode 100755 index 0000000..764b3dc Binary files /dev/null and b/models/thd_hero/kaguya/item/kaguya.vmesh_c differ diff --git a/models/thd_hero/kaguya/kaguya.vmdl_c b/models/thd_hero/kaguya/kaguya.vmdl_c new file mode 100755 index 0000000..49d5de7 Binary files /dev/null and b/models/thd_hero/kaguya/kaguya.vmdl_c differ diff --git a/models/thd_hero/kaguya/kaguya.vmesh_c b/models/thd_hero/kaguya/kaguya.vmesh_c new file mode 100755 index 0000000..10aa345 Binary files /dev/null and b/models/thd_hero/kaguya/kaguya.vmesh_c differ diff --git a/models/thd_hero/kaguya/kaguya_d20d7029.vagrp_c b/models/thd_hero/kaguya/kaguya_d20d7029.vagrp_c new file mode 100755 index 0000000..675434b Binary files /dev/null and b/models/thd_hero/kaguya/kaguya_d20d7029.vagrp_c differ diff --git a/models/thd_hero/kanako/28c039ae/attack.vanim_c b/models/thd_hero/kanako/28c039ae/attack.vanim_c new file mode 100755 index 0000000..a99ad14 Binary files /dev/null and b/models/thd_hero/kanako/28c039ae/attack.vanim_c differ diff --git a/models/thd_hero/kanako/28c039ae/idle.vanim_c b/models/thd_hero/kanako/28c039ae/idle.vanim_c new file mode 100755 index 0000000..bdbc9de Binary files /dev/null and b/models/thd_hero/kanako/28c039ae/idle.vanim_c differ diff --git a/models/thd_hero/kanako/28c039ae/kanako_animation.vanim_c b/models/thd_hero/kanako/28c039ae/kanako_animation.vanim_c new file mode 100755 index 0000000..8026780 Binary files /dev/null and b/models/thd_hero/kanako/28c039ae/kanako_animation.vanim_c differ diff --git a/models/thd_hero/kanako/28c039ae/run.vanim_c b/models/thd_hero/kanako/28c039ae/run.vanim_c new file mode 100755 index 0000000..2ab28e0 Binary files /dev/null and b/models/thd_hero/kanako/28c039ae/run.vanim_c differ diff --git a/models/thd_hero/kanako/item/e21e90e0/attack.vanim_c b/models/thd_hero/kanako/item/e21e90e0/attack.vanim_c new file mode 100755 index 0000000..ef65079 Binary files /dev/null and b/models/thd_hero/kanako/item/e21e90e0/attack.vanim_c differ diff --git a/models/thd_hero/kanako/item/e21e90e0/idle.vanim_c b/models/thd_hero/kanako/item/e21e90e0/idle.vanim_c new file mode 100755 index 0000000..0f05ae6 Binary files /dev/null and b/models/thd_hero/kanako/item/e21e90e0/idle.vanim_c differ diff --git a/models/thd_hero/kanako/item/e21e90e0/run.vanim_c b/models/thd_hero/kanako/item/e21e90e0/run.vanim_c new file mode 100755 index 0000000..a956437 Binary files /dev/null and b/models/thd_hero/kanako/item/e21e90e0/run.vanim_c differ diff --git a/models/thd_hero/kanako/item/item_kanako.vmdl_c b/models/thd_hero/kanako/item/item_kanako.vmdl_c new file mode 100755 index 0000000..288f6b1 Binary files /dev/null and b/models/thd_hero/kanako/item/item_kanako.vmdl_c differ diff --git a/models/thd_hero/kanako/item/item_kanako_e21e90e0.vagrp_c b/models/thd_hero/kanako/item/item_kanako_e21e90e0.vagrp_c new file mode 100755 index 0000000..a226b9b Binary files /dev/null and b/models/thd_hero/kanako/item/item_kanako_e21e90e0.vagrp_c differ diff --git a/models/thd_hero/kanako/item/kanako.vmesh_c b/models/thd_hero/kanako/item/kanako.vmesh_c new file mode 100755 index 0000000..e3a9aa1 Binary files /dev/null and b/models/thd_hero/kanako/item/kanako.vmesh_c differ diff --git a/models/thd_hero/kanako/kanako.vmdl_c b/models/thd_hero/kanako/kanako.vmdl_c new file mode 100755 index 0000000..c12b805 Binary files /dev/null and b/models/thd_hero/kanako/kanako.vmdl_c differ diff --git a/models/thd_hero/kanako/kanako.vmesh_c b/models/thd_hero/kanako/kanako.vmesh_c new file mode 100755 index 0000000..3f20ac9 Binary files /dev/null and b/models/thd_hero/kanako/kanako.vmesh_c differ diff --git a/models/thd_hero/kanako/kanako_28c039ae.vagrp_c b/models/thd_hero/kanako/kanako_28c039ae.vagrp_c new file mode 100755 index 0000000..5bef340 Binary files /dev/null and b/models/thd_hero/kanako/kanako_28c039ae.vagrp_c differ diff --git a/models/thd_hero/keine/52b654ae/attack1.vanim_c b/models/thd_hero/keine/52b654ae/attack1.vanim_c new file mode 100755 index 0000000..8cc4576 Binary files /dev/null and b/models/thd_hero/keine/52b654ae/attack1.vanim_c differ diff --git a/models/thd_hero/keine/52b654ae/attack2.vanim_c b/models/thd_hero/keine/52b654ae/attack2.vanim_c new file mode 100755 index 0000000..2ab8efc Binary files /dev/null and b/models/thd_hero/keine/52b654ae/attack2.vanim_c differ diff --git a/models/thd_hero/keine/52b654ae/cast1.vanim_c b/models/thd_hero/keine/52b654ae/cast1.vanim_c new file mode 100755 index 0000000..3001295 Binary files /dev/null and b/models/thd_hero/keine/52b654ae/cast1.vanim_c differ diff --git a/models/thd_hero/keine/52b654ae/cast3.vanim_c b/models/thd_hero/keine/52b654ae/cast3.vanim_c new file mode 100755 index 0000000..f0fc1e8 Binary files /dev/null and b/models/thd_hero/keine/52b654ae/cast3.vanim_c differ diff --git a/models/thd_hero/keine/52b654ae/cast4.vanim_c b/models/thd_hero/keine/52b654ae/cast4.vanim_c new file mode 100755 index 0000000..38c0e99 Binary files /dev/null and b/models/thd_hero/keine/52b654ae/cast4.vanim_c differ diff --git a/models/thd_hero/keine/52b654ae/idle.vanim_c b/models/thd_hero/keine/52b654ae/idle.vanim_c new file mode 100755 index 0000000..f96ecc4 Binary files /dev/null and b/models/thd_hero/keine/52b654ae/idle.vanim_c differ diff --git a/models/thd_hero/keine/52b654ae/keine_animation.vanim_c b/models/thd_hero/keine/52b654ae/keine_animation.vanim_c new file mode 100755 index 0000000..29227d9 Binary files /dev/null and b/models/thd_hero/keine/52b654ae/keine_animation.vanim_c differ diff --git a/models/thd_hero/keine/52b654ae/run.vanim_c b/models/thd_hero/keine/52b654ae/run.vanim_c new file mode 100755 index 0000000..499f244 Binary files /dev/null and b/models/thd_hero/keine/52b654ae/run.vanim_c differ diff --git a/models/thd_hero/keine/item/fbc01b08/attack1.vanim_c b/models/thd_hero/keine/item/fbc01b08/attack1.vanim_c new file mode 100755 index 0000000..0ab82ab Binary files /dev/null and b/models/thd_hero/keine/item/fbc01b08/attack1.vanim_c differ diff --git a/models/thd_hero/keine/item/fbc01b08/attack2.vanim_c b/models/thd_hero/keine/item/fbc01b08/attack2.vanim_c new file mode 100755 index 0000000..1cb9284 Binary files /dev/null and b/models/thd_hero/keine/item/fbc01b08/attack2.vanim_c differ diff --git a/models/thd_hero/keine/item/fbc01b08/cast1.vanim_c b/models/thd_hero/keine/item/fbc01b08/cast1.vanim_c new file mode 100755 index 0000000..3f8ba5a Binary files /dev/null and b/models/thd_hero/keine/item/fbc01b08/cast1.vanim_c differ diff --git a/models/thd_hero/keine/item/fbc01b08/cast3.vanim_c b/models/thd_hero/keine/item/fbc01b08/cast3.vanim_c new file mode 100755 index 0000000..71f9e99 Binary files /dev/null and b/models/thd_hero/keine/item/fbc01b08/cast3.vanim_c differ diff --git a/models/thd_hero/keine/item/fbc01b08/cast4.vanim_c b/models/thd_hero/keine/item/fbc01b08/cast4.vanim_c new file mode 100755 index 0000000..530e12f Binary files /dev/null and b/models/thd_hero/keine/item/fbc01b08/cast4.vanim_c differ diff --git a/models/thd_hero/keine/item/fbc01b08/idle.vanim_c b/models/thd_hero/keine/item/fbc01b08/idle.vanim_c new file mode 100755 index 0000000..1a8def8 Binary files /dev/null and b/models/thd_hero/keine/item/fbc01b08/idle.vanim_c differ diff --git a/models/thd_hero/keine/item/fbc01b08/run.vanim_c b/models/thd_hero/keine/item/fbc01b08/run.vanim_c new file mode 100755 index 0000000..e733e0e Binary files /dev/null and b/models/thd_hero/keine/item/fbc01b08/run.vanim_c differ diff --git a/models/thd_hero/keine/item/item_keine.vmdl_c b/models/thd_hero/keine/item/item_keine.vmdl_c new file mode 100755 index 0000000..894aad7 Binary files /dev/null and b/models/thd_hero/keine/item/item_keine.vmdl_c differ diff --git a/models/thd_hero/keine/item/item_keine_fbc01b08.vagrp_c b/models/thd_hero/keine/item/item_keine_fbc01b08.vagrp_c new file mode 100755 index 0000000..a3d60f1 Binary files /dev/null and b/models/thd_hero/keine/item/item_keine_fbc01b08.vagrp_c differ diff --git a/models/thd_hero/keine/item/keine.vmesh_c b/models/thd_hero/keine/item/keine.vmesh_c new file mode 100755 index 0000000..58349ad Binary files /dev/null and b/models/thd_hero/keine/item/keine.vmesh_c differ diff --git a/models/thd_hero/keine/keine.vmdl_c b/models/thd_hero/keine/keine.vmdl_c new file mode 100755 index 0000000..8fc663f Binary files /dev/null and b/models/thd_hero/keine/keine.vmdl_c differ diff --git a/models/thd_hero/keine/keine.vmesh_c b/models/thd_hero/keine/keine.vmesh_c new file mode 100755 index 0000000..ae3ffd9 Binary files /dev/null and b/models/thd_hero/keine/keine.vmesh_c differ diff --git a/models/thd_hero/keine/keine2/0281320c/attack1.vanim_c b/models/thd_hero/keine/keine2/0281320c/attack1.vanim_c new file mode 100755 index 0000000..e64f9e4 Binary files /dev/null and b/models/thd_hero/keine/keine2/0281320c/attack1.vanim_c differ diff --git a/models/thd_hero/keine/keine2/0281320c/attack2.vanim_c b/models/thd_hero/keine/keine2/0281320c/attack2.vanim_c new file mode 100755 index 0000000..b185cb4 Binary files /dev/null and b/models/thd_hero/keine/keine2/0281320c/attack2.vanim_c differ diff --git a/models/thd_hero/keine/keine2/0281320c/cast1.vanim_c b/models/thd_hero/keine/keine2/0281320c/cast1.vanim_c new file mode 100755 index 0000000..1cc18d1 Binary files /dev/null and b/models/thd_hero/keine/keine2/0281320c/cast1.vanim_c differ diff --git a/models/thd_hero/keine/keine2/0281320c/cast3.vanim_c b/models/thd_hero/keine/keine2/0281320c/cast3.vanim_c new file mode 100755 index 0000000..2b8f2e3 Binary files /dev/null and b/models/thd_hero/keine/keine2/0281320c/cast3.vanim_c differ diff --git a/models/thd_hero/keine/keine2/0281320c/cast4.vanim_c b/models/thd_hero/keine/keine2/0281320c/cast4.vanim_c new file mode 100755 index 0000000..0c47f2a Binary files /dev/null and b/models/thd_hero/keine/keine2/0281320c/cast4.vanim_c differ diff --git a/models/thd_hero/keine/keine2/0281320c/idle.vanim_c b/models/thd_hero/keine/keine2/0281320c/idle.vanim_c new file mode 100755 index 0000000..2a88e32 Binary files /dev/null and b/models/thd_hero/keine/keine2/0281320c/idle.vanim_c differ diff --git a/models/thd_hero/keine/keine2/0281320c/run.vanim_c b/models/thd_hero/keine/keine2/0281320c/run.vanim_c new file mode 100755 index 0000000..7eb7c66 Binary files /dev/null and b/models/thd_hero/keine/keine2/0281320c/run.vanim_c differ diff --git a/models/thd_hero/keine/keine2/keine.vmesh_c b/models/thd_hero/keine/keine2/keine.vmesh_c new file mode 100755 index 0000000..c775416 Binary files /dev/null and b/models/thd_hero/keine/keine2/keine.vmesh_c differ diff --git a/models/thd_hero/keine/keine2/keine2.vmdl_c b/models/thd_hero/keine/keine2/keine2.vmdl_c new file mode 100755 index 0000000..d444baa Binary files /dev/null and b/models/thd_hero/keine/keine2/keine2.vmdl_c differ diff --git a/models/thd_hero/keine/keine2/keine2_0281320c.vagrp_c b/models/thd_hero/keine/keine2/keine2_0281320c.vagrp_c new file mode 100755 index 0000000..8c2d311 Binary files /dev/null and b/models/thd_hero/keine/keine2/keine2_0281320c.vagrp_c differ diff --git a/models/thd_hero/keine/keine_52b654ae.vagrp_c b/models/thd_hero/keine/keine_52b654ae.vagrp_c new file mode 100755 index 0000000..19b77b6 Binary files /dev/null and b/models/thd_hero/keine/keine_52b654ae.vagrp_c differ diff --git a/models/thd_hero/kisume/e543191c/attack1.vanim_c b/models/thd_hero/kisume/e543191c/attack1.vanim_c new file mode 100755 index 0000000..32f52ba Binary files /dev/null and b/models/thd_hero/kisume/e543191c/attack1.vanim_c differ diff --git a/models/thd_hero/kisume/e543191c/attack2.vanim_c b/models/thd_hero/kisume/e543191c/attack2.vanim_c new file mode 100755 index 0000000..ad1912b Binary files /dev/null and b/models/thd_hero/kisume/e543191c/attack2.vanim_c differ diff --git a/models/thd_hero/kisume/e543191c/cast1.vanim_c b/models/thd_hero/kisume/e543191c/cast1.vanim_c new file mode 100755 index 0000000..c8bc45f Binary files /dev/null and b/models/thd_hero/kisume/e543191c/cast1.vanim_c differ diff --git a/models/thd_hero/kisume/e543191c/cast2_1.vanim_c b/models/thd_hero/kisume/e543191c/cast2_1.vanim_c new file mode 100755 index 0000000..aa93db1 Binary files /dev/null and b/models/thd_hero/kisume/e543191c/cast2_1.vanim_c differ diff --git a/models/thd_hero/kisume/e543191c/cast2_2.vanim_c b/models/thd_hero/kisume/e543191c/cast2_2.vanim_c new file mode 100755 index 0000000..38dc202 Binary files /dev/null and b/models/thd_hero/kisume/e543191c/cast2_2.vanim_c differ diff --git a/models/thd_hero/kisume/e543191c/idle.vanim_c b/models/thd_hero/kisume/e543191c/idle.vanim_c new file mode 100755 index 0000000..70e29ab Binary files /dev/null and b/models/thd_hero/kisume/e543191c/idle.vanim_c differ diff --git a/models/thd_hero/kisume/e543191c/kisume_animation.vanim_c b/models/thd_hero/kisume/e543191c/kisume_animation.vanim_c new file mode 100755 index 0000000..15604f4 Binary files /dev/null and b/models/thd_hero/kisume/e543191c/kisume_animation.vanim_c differ diff --git a/models/thd_hero/kisume/e543191c/run.vanim_c b/models/thd_hero/kisume/e543191c/run.vanim_c new file mode 100755 index 0000000..2665b84 Binary files /dev/null and b/models/thd_hero/kisume/e543191c/run.vanim_c differ diff --git a/models/thd_hero/kisume/item/fe917d8e/attack1.vanim_c b/models/thd_hero/kisume/item/fe917d8e/attack1.vanim_c new file mode 100755 index 0000000..5a12e89 Binary files /dev/null and b/models/thd_hero/kisume/item/fe917d8e/attack1.vanim_c differ diff --git a/models/thd_hero/kisume/item/fe917d8e/attack2.vanim_c b/models/thd_hero/kisume/item/fe917d8e/attack2.vanim_c new file mode 100755 index 0000000..f3f3160 Binary files /dev/null and b/models/thd_hero/kisume/item/fe917d8e/attack2.vanim_c differ diff --git a/models/thd_hero/kisume/item/fe917d8e/cast1.vanim_c b/models/thd_hero/kisume/item/fe917d8e/cast1.vanim_c new file mode 100755 index 0000000..bb2b56f Binary files /dev/null and b/models/thd_hero/kisume/item/fe917d8e/cast1.vanim_c differ diff --git a/models/thd_hero/kisume/item/fe917d8e/cast2_1.vanim_c b/models/thd_hero/kisume/item/fe917d8e/cast2_1.vanim_c new file mode 100755 index 0000000..0bdb5b1 Binary files /dev/null and b/models/thd_hero/kisume/item/fe917d8e/cast2_1.vanim_c differ diff --git a/models/thd_hero/kisume/item/fe917d8e/cast2_2.vanim_c b/models/thd_hero/kisume/item/fe917d8e/cast2_2.vanim_c new file mode 100755 index 0000000..d3cfc36 Binary files /dev/null and b/models/thd_hero/kisume/item/fe917d8e/cast2_2.vanim_c differ diff --git a/models/thd_hero/kisume/item/fe917d8e/idle.vanim_c b/models/thd_hero/kisume/item/fe917d8e/idle.vanim_c new file mode 100755 index 0000000..5a5ae32 Binary files /dev/null and b/models/thd_hero/kisume/item/fe917d8e/idle.vanim_c differ diff --git a/models/thd_hero/kisume/item/fe917d8e/run.vanim_c b/models/thd_hero/kisume/item/fe917d8e/run.vanim_c new file mode 100755 index 0000000..a368704 Binary files /dev/null and b/models/thd_hero/kisume/item/fe917d8e/run.vanim_c differ diff --git a/models/thd_hero/kisume/item/item_kisume.vmdl_c b/models/thd_hero/kisume/item/item_kisume.vmdl_c new file mode 100755 index 0000000..5cbaafc Binary files /dev/null and b/models/thd_hero/kisume/item/item_kisume.vmdl_c differ diff --git a/models/thd_hero/kisume/item/item_kisume_fe917d8e.vagrp_c b/models/thd_hero/kisume/item/item_kisume_fe917d8e.vagrp_c new file mode 100755 index 0000000..de4c592 Binary files /dev/null and b/models/thd_hero/kisume/item/item_kisume_fe917d8e.vagrp_c differ diff --git a/models/thd_hero/kisume/item/kisume.vmesh_c b/models/thd_hero/kisume/item/kisume.vmesh_c new file mode 100755 index 0000000..871e219 Binary files /dev/null and b/models/thd_hero/kisume/item/kisume.vmesh_c differ diff --git a/models/thd_hero/kisume/kisume.vmdl_c b/models/thd_hero/kisume/kisume.vmdl_c new file mode 100755 index 0000000..8a11158 Binary files /dev/null and b/models/thd_hero/kisume/kisume.vmdl_c differ diff --git a/models/thd_hero/kisume/kisume.vmesh_c b/models/thd_hero/kisume/kisume.vmesh_c new file mode 100755 index 0000000..8cbb054 Binary files /dev/null and b/models/thd_hero/kisume/kisume.vmesh_c differ diff --git a/models/thd_hero/kisume/kisume_e543191c.vagrp_c b/models/thd_hero/kisume/kisume_e543191c.vagrp_c new file mode 100755 index 0000000..f114221 Binary files /dev/null and b/models/thd_hero/kisume/kisume_e543191c.vagrp_c differ diff --git a/models/thd_hero/koakuma/64145d25/_.vanim_c b/models/thd_hero/koakuma/64145d25/_.vanim_c new file mode 100755 index 0000000..219d487 Binary files /dev/null and b/models/thd_hero/koakuma/64145d25/_.vanim_c differ diff --git a/models/thd_hero/koakuma/64145d25/attack.vanim_c b/models/thd_hero/koakuma/64145d25/attack.vanim_c new file mode 100755 index 0000000..1ad0c7f Binary files /dev/null and b/models/thd_hero/koakuma/64145d25/attack.vanim_c differ diff --git a/models/thd_hero/koakuma/64145d25/attack2.vanim_c b/models/thd_hero/koakuma/64145d25/attack2.vanim_c new file mode 100755 index 0000000..74f2d9c Binary files /dev/null and b/models/thd_hero/koakuma/64145d25/attack2.vanim_c differ diff --git a/models/thd_hero/koakuma/64145d25/cast.vanim_c b/models/thd_hero/koakuma/64145d25/cast.vanim_c new file mode 100755 index 0000000..171523f Binary files /dev/null and b/models/thd_hero/koakuma/64145d25/cast.vanim_c differ diff --git a/models/thd_hero/koakuma/64145d25/idle.vanim_c b/models/thd_hero/koakuma/64145d25/idle.vanim_c new file mode 100755 index 0000000..08a8d0b Binary files /dev/null and b/models/thd_hero/koakuma/64145d25/idle.vanim_c differ diff --git a/models/thd_hero/koakuma/64145d25/por.vanim_c b/models/thd_hero/koakuma/64145d25/por.vanim_c new file mode 100755 index 0000000..516fb16 Binary files /dev/null and b/models/thd_hero/koakuma/64145d25/por.vanim_c differ diff --git a/models/thd_hero/koakuma/64145d25/run.vanim_c b/models/thd_hero/koakuma/64145d25/run.vanim_c new file mode 100755 index 0000000..d6fb2d2 Binary files /dev/null and b/models/thd_hero/koakuma/64145d25/run.vanim_c differ diff --git a/models/thd_hero/koakuma/item/408c35ae/_.vanim_c b/models/thd_hero/koakuma/item/408c35ae/_.vanim_c new file mode 100755 index 0000000..474699a Binary files /dev/null and b/models/thd_hero/koakuma/item/408c35ae/_.vanim_c differ diff --git a/models/thd_hero/koakuma/item/408c35ae/attack.vanim_c b/models/thd_hero/koakuma/item/408c35ae/attack.vanim_c new file mode 100755 index 0000000..18ae009 Binary files /dev/null and b/models/thd_hero/koakuma/item/408c35ae/attack.vanim_c differ diff --git a/models/thd_hero/koakuma/item/408c35ae/attack2.vanim_c b/models/thd_hero/koakuma/item/408c35ae/attack2.vanim_c new file mode 100755 index 0000000..f67fd4c Binary files /dev/null and b/models/thd_hero/koakuma/item/408c35ae/attack2.vanim_c differ diff --git a/models/thd_hero/koakuma/item/408c35ae/cast.vanim_c b/models/thd_hero/koakuma/item/408c35ae/cast.vanim_c new file mode 100755 index 0000000..e790cbb Binary files /dev/null and b/models/thd_hero/koakuma/item/408c35ae/cast.vanim_c differ diff --git a/models/thd_hero/koakuma/item/408c35ae/idle.vanim_c b/models/thd_hero/koakuma/item/408c35ae/idle.vanim_c new file mode 100755 index 0000000..81ab790 Binary files /dev/null and b/models/thd_hero/koakuma/item/408c35ae/idle.vanim_c differ diff --git a/models/thd_hero/koakuma/item/408c35ae/por.vanim_c b/models/thd_hero/koakuma/item/408c35ae/por.vanim_c new file mode 100755 index 0000000..7140e6a Binary files /dev/null and b/models/thd_hero/koakuma/item/408c35ae/por.vanim_c differ diff --git a/models/thd_hero/koakuma/item/408c35ae/run.vanim_c b/models/thd_hero/koakuma/item/408c35ae/run.vanim_c new file mode 100755 index 0000000..6487623 Binary files /dev/null and b/models/thd_hero/koakuma/item/408c35ae/run.vanim_c differ diff --git a/models/thd_hero/koakuma/item/item_koakuma.vmdl_c b/models/thd_hero/koakuma/item/item_koakuma.vmdl_c new file mode 100755 index 0000000..1afda00 Binary files /dev/null and b/models/thd_hero/koakuma/item/item_koakuma.vmdl_c differ diff --git a/models/thd_hero/koakuma/item/item_koakuma_408c35ae.vagrp_c b/models/thd_hero/koakuma/item/item_koakuma_408c35ae.vagrp_c new file mode 100755 index 0000000..a7e2e03 Binary files /dev/null and b/models/thd_hero/koakuma/item/item_koakuma_408c35ae.vagrp_c differ diff --git a/models/thd_hero/koakuma/item/koakuma.vmesh_c b/models/thd_hero/koakuma/item/koakuma.vmesh_c new file mode 100755 index 0000000..b63fa93 Binary files /dev/null and b/models/thd_hero/koakuma/item/koakuma.vmesh_c differ diff --git a/models/thd_hero/koakuma/koakuma.vmdl_c b/models/thd_hero/koakuma/koakuma.vmdl_c new file mode 100755 index 0000000..49696bc Binary files /dev/null and b/models/thd_hero/koakuma/koakuma.vmdl_c differ diff --git a/models/thd_hero/koakuma/koakuma.vmesh_c b/models/thd_hero/koakuma/koakuma.vmesh_c new file mode 100755 index 0000000..b91809b Binary files /dev/null and b/models/thd_hero/koakuma/koakuma.vmesh_c differ diff --git a/models/thd_hero/koakuma/koakuma_64145d25.vagrp_c b/models/thd_hero/koakuma/koakuma_64145d25.vagrp_c new file mode 100755 index 0000000..8ba7ead Binary files /dev/null and b/models/thd_hero/koakuma/koakuma_64145d25.vagrp_c differ diff --git a/models/thd_hero/kogasa/be2f9921/attack.vanim_c b/models/thd_hero/kogasa/be2f9921/attack.vanim_c new file mode 100755 index 0000000..c166a0a Binary files /dev/null and b/models/thd_hero/kogasa/be2f9921/attack.vanim_c differ diff --git a/models/thd_hero/kogasa/be2f9921/cast.vanim_c b/models/thd_hero/kogasa/be2f9921/cast.vanim_c new file mode 100755 index 0000000..1ee7116 Binary files /dev/null and b/models/thd_hero/kogasa/be2f9921/cast.vanim_c differ diff --git a/models/thd_hero/kogasa/be2f9921/idle.vanim_c b/models/thd_hero/kogasa/be2f9921/idle.vanim_c new file mode 100755 index 0000000..129ad0c Binary files /dev/null and b/models/thd_hero/kogasa/be2f9921/idle.vanim_c differ diff --git a/models/thd_hero/kogasa/be2f9921/por.vanim_c b/models/thd_hero/kogasa/be2f9921/por.vanim_c new file mode 100755 index 0000000..469dcc1 Binary files /dev/null and b/models/thd_hero/kogasa/be2f9921/por.vanim_c differ diff --git a/models/thd_hero/kogasa/be2f9921/run.vanim_c b/models/thd_hero/kogasa/be2f9921/run.vanim_c new file mode 100755 index 0000000..78a33eb Binary files /dev/null and b/models/thd_hero/kogasa/be2f9921/run.vanim_c differ diff --git a/models/thd_hero/kogasa/item/f4232d51/attack.vanim_c b/models/thd_hero/kogasa/item/f4232d51/attack.vanim_c new file mode 100755 index 0000000..35c5280 Binary files /dev/null and b/models/thd_hero/kogasa/item/f4232d51/attack.vanim_c differ diff --git a/models/thd_hero/kogasa/item/f4232d51/cast.vanim_c b/models/thd_hero/kogasa/item/f4232d51/cast.vanim_c new file mode 100755 index 0000000..4b4e4a0 Binary files /dev/null and b/models/thd_hero/kogasa/item/f4232d51/cast.vanim_c differ diff --git a/models/thd_hero/kogasa/item/f4232d51/idle.vanim_c b/models/thd_hero/kogasa/item/f4232d51/idle.vanim_c new file mode 100755 index 0000000..7a06296 Binary files /dev/null and b/models/thd_hero/kogasa/item/f4232d51/idle.vanim_c differ diff --git a/models/thd_hero/kogasa/item/f4232d51/por.vanim_c b/models/thd_hero/kogasa/item/f4232d51/por.vanim_c new file mode 100755 index 0000000..d9d7665 Binary files /dev/null and b/models/thd_hero/kogasa/item/f4232d51/por.vanim_c differ diff --git a/models/thd_hero/kogasa/item/f4232d51/run.vanim_c b/models/thd_hero/kogasa/item/f4232d51/run.vanim_c new file mode 100755 index 0000000..e473338 Binary files /dev/null and b/models/thd_hero/kogasa/item/f4232d51/run.vanim_c differ diff --git a/models/thd_hero/kogasa/item/item_kogasa.vmdl_c b/models/thd_hero/kogasa/item/item_kogasa.vmdl_c new file mode 100755 index 0000000..8dfb79d Binary files /dev/null and b/models/thd_hero/kogasa/item/item_kogasa.vmdl_c differ diff --git a/models/thd_hero/kogasa/item/item_kogasa_f4232d51.vagrp_c b/models/thd_hero/kogasa/item/item_kogasa_f4232d51.vagrp_c new file mode 100755 index 0000000..7c92f64 Binary files /dev/null and b/models/thd_hero/kogasa/item/item_kogasa_f4232d51.vagrp_c differ diff --git a/models/thd_hero/kogasa/item/kogasa.vmesh_c b/models/thd_hero/kogasa/item/kogasa.vmesh_c new file mode 100755 index 0000000..6855cce Binary files /dev/null and b/models/thd_hero/kogasa/item/kogasa.vmesh_c differ diff --git a/models/thd_hero/kogasa/kogasa.vmdl_c b/models/thd_hero/kogasa/kogasa.vmdl_c new file mode 100755 index 0000000..6205d96 Binary files /dev/null and b/models/thd_hero/kogasa/kogasa.vmdl_c differ diff --git a/models/thd_hero/kogasa/kogasa.vmesh_c b/models/thd_hero/kogasa/kogasa.vmesh_c new file mode 100755 index 0000000..5152868 Binary files /dev/null and b/models/thd_hero/kogasa/kogasa.vmesh_c differ diff --git a/models/thd_hero/kogasa/kogasa_be2f9921.vagrp_c b/models/thd_hero/kogasa/kogasa_be2f9921.vagrp_c new file mode 100755 index 0000000..9a9a5d0 Binary files /dev/null and b/models/thd_hero/kogasa/kogasa_be2f9921.vagrp_c differ diff --git a/models/thd_hero/kumoi/01ee6898/attack1.vanim_c b/models/thd_hero/kumoi/01ee6898/attack1.vanim_c new file mode 100755 index 0000000..4572672 Binary files /dev/null and b/models/thd_hero/kumoi/01ee6898/attack1.vanim_c differ diff --git a/models/thd_hero/kumoi/01ee6898/cast.vanim_c b/models/thd_hero/kumoi/01ee6898/cast.vanim_c new file mode 100755 index 0000000..b9bfe90 Binary files /dev/null and b/models/thd_hero/kumoi/01ee6898/cast.vanim_c differ diff --git a/models/thd_hero/kumoi/01ee6898/idle.vanim_c b/models/thd_hero/kumoi/01ee6898/idle.vanim_c new file mode 100755 index 0000000..aace713 Binary files /dev/null and b/models/thd_hero/kumoi/01ee6898/idle.vanim_c differ diff --git a/models/thd_hero/kumoi/01ee6898/kumoi_animation.vanim_c b/models/thd_hero/kumoi/01ee6898/kumoi_animation.vanim_c new file mode 100755 index 0000000..17b100a Binary files /dev/null and b/models/thd_hero/kumoi/01ee6898/kumoi_animation.vanim_c differ diff --git a/models/thd_hero/kumoi/01ee6898/run.vanim_c b/models/thd_hero/kumoi/01ee6898/run.vanim_c new file mode 100755 index 0000000..e69962a Binary files /dev/null and b/models/thd_hero/kumoi/01ee6898/run.vanim_c differ diff --git a/models/thd_hero/kumoi/kumoi.vmdl_c b/models/thd_hero/kumoi/kumoi.vmdl_c new file mode 100755 index 0000000..1a5d726 Binary files /dev/null and b/models/thd_hero/kumoi/kumoi.vmdl_c differ diff --git a/models/thd_hero/kumoi/kumoi.vmesh_c b/models/thd_hero/kumoi/kumoi.vmesh_c new file mode 100755 index 0000000..c093bc5 Binary files /dev/null and b/models/thd_hero/kumoi/kumoi.vmesh_c differ diff --git a/models/thd_hero/kumoi/kumoi_01ee6898.vagrp_c b/models/thd_hero/kumoi/kumoi_01ee6898.vagrp_c new file mode 100755 index 0000000..368b96b Binary files /dev/null and b/models/thd_hero/kumoi/kumoi_01ee6898.vagrp_c differ diff --git a/models/thd_hero/kyouko/bb32365d/attack.vanim_c b/models/thd_hero/kyouko/bb32365d/attack.vanim_c new file mode 100755 index 0000000..d14b646 Binary files /dev/null and b/models/thd_hero/kyouko/bb32365d/attack.vanim_c differ diff --git a/models/thd_hero/kyouko/bb32365d/idle.vanim_c b/models/thd_hero/kyouko/bb32365d/idle.vanim_c new file mode 100755 index 0000000..3b4d671 Binary files /dev/null and b/models/thd_hero/kyouko/bb32365d/idle.vanim_c differ diff --git a/models/thd_hero/kyouko/bb32365d/kyouko_animation.vanim_c b/models/thd_hero/kyouko/bb32365d/kyouko_animation.vanim_c new file mode 100755 index 0000000..dc758d7 Binary files /dev/null and b/models/thd_hero/kyouko/bb32365d/kyouko_animation.vanim_c differ diff --git a/models/thd_hero/kyouko/bb32365d/run.vanim_c b/models/thd_hero/kyouko/bb32365d/run.vanim_c new file mode 100755 index 0000000..ab3c45b Binary files /dev/null and b/models/thd_hero/kyouko/bb32365d/run.vanim_c differ diff --git a/models/thd_hero/kyouko/item/8d528671/attack.vanim_c b/models/thd_hero/kyouko/item/8d528671/attack.vanim_c new file mode 100755 index 0000000..d6c9da7 Binary files /dev/null and b/models/thd_hero/kyouko/item/8d528671/attack.vanim_c differ diff --git a/models/thd_hero/kyouko/item/8d528671/idle.vanim_c b/models/thd_hero/kyouko/item/8d528671/idle.vanim_c new file mode 100755 index 0000000..2df0109 Binary files /dev/null and b/models/thd_hero/kyouko/item/8d528671/idle.vanim_c differ diff --git a/models/thd_hero/kyouko/item/8d528671/run.vanim_c b/models/thd_hero/kyouko/item/8d528671/run.vanim_c new file mode 100755 index 0000000..0d4f568 Binary files /dev/null and b/models/thd_hero/kyouko/item/8d528671/run.vanim_c differ diff --git a/models/thd_hero/kyouko/item/item_kyouko.vmdl_c b/models/thd_hero/kyouko/item/item_kyouko.vmdl_c new file mode 100755 index 0000000..c8d36b2 Binary files /dev/null and b/models/thd_hero/kyouko/item/item_kyouko.vmdl_c differ diff --git a/models/thd_hero/kyouko/item/item_kyouko_8d528671.vagrp_c b/models/thd_hero/kyouko/item/item_kyouko_8d528671.vagrp_c new file mode 100755 index 0000000..2e7bc88 Binary files /dev/null and b/models/thd_hero/kyouko/item/item_kyouko_8d528671.vagrp_c differ diff --git a/models/thd_hero/kyouko/item/kyouko.vmesh_c b/models/thd_hero/kyouko/item/kyouko.vmesh_c new file mode 100755 index 0000000..34cd9c4 Binary files /dev/null and b/models/thd_hero/kyouko/item/kyouko.vmesh_c differ diff --git a/models/thd_hero/kyouko/kyouko.vmdl_c b/models/thd_hero/kyouko/kyouko.vmdl_c new file mode 100755 index 0000000..e5f573f Binary files /dev/null and b/models/thd_hero/kyouko/kyouko.vmdl_c differ diff --git a/models/thd_hero/kyouko/kyouko.vmesh_c b/models/thd_hero/kyouko/kyouko.vmesh_c new file mode 100755 index 0000000..8b856d7 Binary files /dev/null and b/models/thd_hero/kyouko/kyouko.vmesh_c differ diff --git a/models/thd_hero/kyouko/kyouko_bb32365d.vagrp_c b/models/thd_hero/kyouko/kyouko_bb32365d.vagrp_c new file mode 100755 index 0000000..4645c6d Binary files /dev/null and b/models/thd_hero/kyouko/kyouko_bb32365d.vagrp_c differ diff --git a/models/thd_hero/letty/199a2e08/attack.vanim_c b/models/thd_hero/letty/199a2e08/attack.vanim_c new file mode 100755 index 0000000..3a19ab0 Binary files /dev/null and b/models/thd_hero/letty/199a2e08/attack.vanim_c differ diff --git a/models/thd_hero/letty/199a2e08/cast.vanim_c b/models/thd_hero/letty/199a2e08/cast.vanim_c new file mode 100755 index 0000000..fa53e7e Binary files /dev/null and b/models/thd_hero/letty/199a2e08/cast.vanim_c differ diff --git a/models/thd_hero/letty/199a2e08/idle.vanim_c b/models/thd_hero/letty/199a2e08/idle.vanim_c new file mode 100755 index 0000000..2311815 Binary files /dev/null and b/models/thd_hero/letty/199a2e08/idle.vanim_c differ diff --git a/models/thd_hero/letty/199a2e08/por.vanim_c b/models/thd_hero/letty/199a2e08/por.vanim_c new file mode 100755 index 0000000..b312160 Binary files /dev/null and b/models/thd_hero/letty/199a2e08/por.vanim_c differ diff --git a/models/thd_hero/letty/199a2e08/run.vanim_c b/models/thd_hero/letty/199a2e08/run.vanim_c new file mode 100755 index 0000000..061ecc2 Binary files /dev/null and b/models/thd_hero/letty/199a2e08/run.vanim_c differ diff --git a/models/thd_hero/letty/item/a7a8e685/attack.vanim_c b/models/thd_hero/letty/item/a7a8e685/attack.vanim_c new file mode 100755 index 0000000..c8e225a Binary files /dev/null and b/models/thd_hero/letty/item/a7a8e685/attack.vanim_c differ diff --git a/models/thd_hero/letty/item/a7a8e685/cast.vanim_c b/models/thd_hero/letty/item/a7a8e685/cast.vanim_c new file mode 100755 index 0000000..0d632d0 Binary files /dev/null and b/models/thd_hero/letty/item/a7a8e685/cast.vanim_c differ diff --git a/models/thd_hero/letty/item/a7a8e685/idle.vanim_c b/models/thd_hero/letty/item/a7a8e685/idle.vanim_c new file mode 100755 index 0000000..0de2478 Binary files /dev/null and b/models/thd_hero/letty/item/a7a8e685/idle.vanim_c differ diff --git a/models/thd_hero/letty/item/a7a8e685/por.vanim_c b/models/thd_hero/letty/item/a7a8e685/por.vanim_c new file mode 100755 index 0000000..97ed130 Binary files /dev/null and b/models/thd_hero/letty/item/a7a8e685/por.vanim_c differ diff --git a/models/thd_hero/letty/item/a7a8e685/run.vanim_c b/models/thd_hero/letty/item/a7a8e685/run.vanim_c new file mode 100755 index 0000000..cf1d20b Binary files /dev/null and b/models/thd_hero/letty/item/a7a8e685/run.vanim_c differ diff --git a/models/thd_hero/letty/item/item_letty.vmdl_c b/models/thd_hero/letty/item/item_letty.vmdl_c new file mode 100755 index 0000000..121c5e0 Binary files /dev/null and b/models/thd_hero/letty/item/item_letty.vmdl_c differ diff --git a/models/thd_hero/letty/item/item_letty_a7a8e685.vagrp_c b/models/thd_hero/letty/item/item_letty_a7a8e685.vagrp_c new file mode 100755 index 0000000..0687ac9 Binary files /dev/null and b/models/thd_hero/letty/item/item_letty_a7a8e685.vagrp_c differ diff --git a/models/thd_hero/letty/item/letty.vmesh_c b/models/thd_hero/letty/item/letty.vmesh_c new file mode 100755 index 0000000..b4d7425 Binary files /dev/null and b/models/thd_hero/letty/item/letty.vmesh_c differ diff --git a/models/thd_hero/letty/letty.vmdl_c b/models/thd_hero/letty/letty.vmdl_c new file mode 100755 index 0000000..1458b10 Binary files /dev/null and b/models/thd_hero/letty/letty.vmdl_c differ diff --git a/models/thd_hero/letty/letty.vmesh_c b/models/thd_hero/letty/letty.vmesh_c new file mode 100755 index 0000000..70b39f6 Binary files /dev/null and b/models/thd_hero/letty/letty.vmesh_c differ diff --git a/models/thd_hero/letty/letty_199a2e08.vagrp_c b/models/thd_hero/letty/letty_199a2e08.vagrp_c new file mode 100755 index 0000000..4222873 Binary files /dev/null and b/models/thd_hero/letty/letty_199a2e08.vagrp_c differ diff --git a/models/thd_hero/lily_white/df0791ee/attack.vanim_c b/models/thd_hero/lily_white/df0791ee/attack.vanim_c new file mode 100755 index 0000000..5761ec8 Binary files /dev/null and b/models/thd_hero/lily_white/df0791ee/attack.vanim_c differ diff --git a/models/thd_hero/lily_white/df0791ee/cast.vanim_c b/models/thd_hero/lily_white/df0791ee/cast.vanim_c new file mode 100755 index 0000000..ec386b4 Binary files /dev/null and b/models/thd_hero/lily_white/df0791ee/cast.vanim_c differ diff --git a/models/thd_hero/lily_white/df0791ee/idle.vanim_c b/models/thd_hero/lily_white/df0791ee/idle.vanim_c new file mode 100755 index 0000000..110a57e Binary files /dev/null and b/models/thd_hero/lily_white/df0791ee/idle.vanim_c differ diff --git a/models/thd_hero/lily_white/df0791ee/por.vanim_c b/models/thd_hero/lily_white/df0791ee/por.vanim_c new file mode 100755 index 0000000..1642e63 Binary files /dev/null and b/models/thd_hero/lily_white/df0791ee/por.vanim_c differ diff --git a/models/thd_hero/lily_white/df0791ee/run.vanim_c b/models/thd_hero/lily_white/df0791ee/run.vanim_c new file mode 100755 index 0000000..d349c7f Binary files /dev/null and b/models/thd_hero/lily_white/df0791ee/run.vanim_c differ diff --git a/models/thd_hero/lily_white/item/936a4206/attack.vanim_c b/models/thd_hero/lily_white/item/936a4206/attack.vanim_c new file mode 100755 index 0000000..90c1113 Binary files /dev/null and b/models/thd_hero/lily_white/item/936a4206/attack.vanim_c differ diff --git a/models/thd_hero/lily_white/item/936a4206/cast.vanim_c b/models/thd_hero/lily_white/item/936a4206/cast.vanim_c new file mode 100755 index 0000000..eac16de Binary files /dev/null and b/models/thd_hero/lily_white/item/936a4206/cast.vanim_c differ diff --git a/models/thd_hero/lily_white/item/936a4206/idle.vanim_c b/models/thd_hero/lily_white/item/936a4206/idle.vanim_c new file mode 100755 index 0000000..c902944 Binary files /dev/null and b/models/thd_hero/lily_white/item/936a4206/idle.vanim_c differ diff --git a/models/thd_hero/lily_white/item/936a4206/por.vanim_c b/models/thd_hero/lily_white/item/936a4206/por.vanim_c new file mode 100755 index 0000000..6da7125 Binary files /dev/null and b/models/thd_hero/lily_white/item/936a4206/por.vanim_c differ diff --git a/models/thd_hero/lily_white/item/936a4206/run.vanim_c b/models/thd_hero/lily_white/item/936a4206/run.vanim_c new file mode 100755 index 0000000..a1ed200 Binary files /dev/null and b/models/thd_hero/lily_white/item/936a4206/run.vanim_c differ diff --git a/models/thd_hero/lily_white/item/item_lily_white.vmdl_c b/models/thd_hero/lily_white/item/item_lily_white.vmdl_c new file mode 100755 index 0000000..9e963b4 Binary files /dev/null and b/models/thd_hero/lily_white/item/item_lily_white.vmdl_c differ diff --git a/models/thd_hero/lily_white/item/item_lily_white_936a4206.vagrp_c b/models/thd_hero/lily_white/item/item_lily_white_936a4206.vagrp_c new file mode 100755 index 0000000..85fbac6 Binary files /dev/null and b/models/thd_hero/lily_white/item/item_lily_white_936a4206.vagrp_c differ diff --git a/models/thd_hero/lily_white/item/lily_white.vmesh_c b/models/thd_hero/lily_white/item/lily_white.vmesh_c new file mode 100755 index 0000000..e1089cb Binary files /dev/null and b/models/thd_hero/lily_white/item/lily_white.vmesh_c differ diff --git a/models/thd_hero/lily_white/lily_white.vmdl_c b/models/thd_hero/lily_white/lily_white.vmdl_c new file mode 100755 index 0000000..ff86883 Binary files /dev/null and b/models/thd_hero/lily_white/lily_white.vmdl_c differ diff --git a/models/thd_hero/lily_white/lily_white.vmesh_c b/models/thd_hero/lily_white/lily_white.vmesh_c new file mode 100755 index 0000000..d324773 Binary files /dev/null and b/models/thd_hero/lily_white/lily_white.vmesh_c differ diff --git a/models/thd_hero/lily_white/lily_white_df0791ee.vagrp_c b/models/thd_hero/lily_white/lily_white_df0791ee.vagrp_c new file mode 100755 index 0000000..09adf6e Binary files /dev/null and b/models/thd_hero/lily_white/lily_white_df0791ee.vagrp_c differ diff --git a/models/thd_hero/luna/91193f3e/attack1.vanim_c b/models/thd_hero/luna/91193f3e/attack1.vanim_c new file mode 100755 index 0000000..8fc3a20 Binary files /dev/null and b/models/thd_hero/luna/91193f3e/attack1.vanim_c differ diff --git a/models/thd_hero/luna/91193f3e/cast.vanim_c b/models/thd_hero/luna/91193f3e/cast.vanim_c new file mode 100755 index 0000000..812f2ed Binary files /dev/null and b/models/thd_hero/luna/91193f3e/cast.vanim_c differ diff --git a/models/thd_hero/luna/91193f3e/cast4.vanim_c b/models/thd_hero/luna/91193f3e/cast4.vanim_c new file mode 100755 index 0000000..d809315 Binary files /dev/null and b/models/thd_hero/luna/91193f3e/cast4.vanim_c differ diff --git a/models/thd_hero/luna/91193f3e/idle.vanim_c b/models/thd_hero/luna/91193f3e/idle.vanim_c new file mode 100755 index 0000000..679ac9a Binary files /dev/null and b/models/thd_hero/luna/91193f3e/idle.vanim_c differ diff --git a/models/thd_hero/luna/91193f3e/luna_animation.vanim_c b/models/thd_hero/luna/91193f3e/luna_animation.vanim_c new file mode 100755 index 0000000..a2c1155 Binary files /dev/null and b/models/thd_hero/luna/91193f3e/luna_animation.vanim_c differ diff --git a/models/thd_hero/luna/91193f3e/run.vanim_c b/models/thd_hero/luna/91193f3e/run.vanim_c new file mode 100755 index 0000000..a60921e Binary files /dev/null and b/models/thd_hero/luna/91193f3e/run.vanim_c differ diff --git a/models/thd_hero/luna/item/8a6ab363/attack1.vanim_c b/models/thd_hero/luna/item/8a6ab363/attack1.vanim_c new file mode 100755 index 0000000..6d61cfd Binary files /dev/null and b/models/thd_hero/luna/item/8a6ab363/attack1.vanim_c differ diff --git a/models/thd_hero/luna/item/8a6ab363/cast.vanim_c b/models/thd_hero/luna/item/8a6ab363/cast.vanim_c new file mode 100755 index 0000000..87e5fe4 Binary files /dev/null and b/models/thd_hero/luna/item/8a6ab363/cast.vanim_c differ diff --git a/models/thd_hero/luna/item/8a6ab363/cast4.vanim_c b/models/thd_hero/luna/item/8a6ab363/cast4.vanim_c new file mode 100755 index 0000000..943600c Binary files /dev/null and b/models/thd_hero/luna/item/8a6ab363/cast4.vanim_c differ diff --git a/models/thd_hero/luna/item/8a6ab363/idle.vanim_c b/models/thd_hero/luna/item/8a6ab363/idle.vanim_c new file mode 100755 index 0000000..de2c40f Binary files /dev/null and b/models/thd_hero/luna/item/8a6ab363/idle.vanim_c differ diff --git a/models/thd_hero/luna/item/8a6ab363/run.vanim_c b/models/thd_hero/luna/item/8a6ab363/run.vanim_c new file mode 100755 index 0000000..7d84230 Binary files /dev/null and b/models/thd_hero/luna/item/8a6ab363/run.vanim_c differ diff --git a/models/thd_hero/luna/item/item_luna.vmdl_c b/models/thd_hero/luna/item/item_luna.vmdl_c new file mode 100755 index 0000000..b9b1037 Binary files /dev/null and b/models/thd_hero/luna/item/item_luna.vmdl_c differ diff --git a/models/thd_hero/luna/item/item_luna_8a6ab363.vagrp_c b/models/thd_hero/luna/item/item_luna_8a6ab363.vagrp_c new file mode 100755 index 0000000..85d1df8 Binary files /dev/null and b/models/thd_hero/luna/item/item_luna_8a6ab363.vagrp_c differ diff --git a/models/thd_hero/luna/item/luna.vmesh_c b/models/thd_hero/luna/item/luna.vmesh_c new file mode 100755 index 0000000..f65c91d Binary files /dev/null and b/models/thd_hero/luna/item/luna.vmesh_c differ diff --git a/models/thd_hero/luna/luna.vmdl_c b/models/thd_hero/luna/luna.vmdl_c new file mode 100755 index 0000000..eb0e0c0 Binary files /dev/null and b/models/thd_hero/luna/luna.vmdl_c differ diff --git a/models/thd_hero/luna/luna.vmesh_c b/models/thd_hero/luna/luna.vmesh_c new file mode 100755 index 0000000..ce3f084 Binary files /dev/null and b/models/thd_hero/luna/luna.vmesh_c differ diff --git a/models/thd_hero/luna/luna_91193f3e.vagrp_c b/models/thd_hero/luna/luna_91193f3e.vagrp_c new file mode 100755 index 0000000..272fc19 Binary files /dev/null and b/models/thd_hero/luna/luna_91193f3e.vagrp_c differ diff --git a/models/thd_hero/lunasa_prismriver/30834cef/attack.vanim_c b/models/thd_hero/lunasa_prismriver/30834cef/attack.vanim_c new file mode 100755 index 0000000..23189cd Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/30834cef/attack.vanim_c differ diff --git a/models/thd_hero/lunasa_prismriver/30834cef/attack2.vanim_c b/models/thd_hero/lunasa_prismriver/30834cef/attack2.vanim_c new file mode 100755 index 0000000..a251d13 Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/30834cef/attack2.vanim_c differ diff --git a/models/thd_hero/lunasa_prismriver/30834cef/cast.vanim_c b/models/thd_hero/lunasa_prismriver/30834cef/cast.vanim_c new file mode 100755 index 0000000..c1779aa Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/30834cef/cast.vanim_c differ diff --git a/models/thd_hero/lunasa_prismriver/30834cef/idle.vanim_c b/models/thd_hero/lunasa_prismriver/30834cef/idle.vanim_c new file mode 100755 index 0000000..6603d62 Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/30834cef/idle.vanim_c differ diff --git a/models/thd_hero/lunasa_prismriver/30834cef/por.vanim_c b/models/thd_hero/lunasa_prismriver/30834cef/por.vanim_c new file mode 100755 index 0000000..c524e31 Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/30834cef/por.vanim_c differ diff --git a/models/thd_hero/lunasa_prismriver/30834cef/run.vanim_c b/models/thd_hero/lunasa_prismriver/30834cef/run.vanim_c new file mode 100755 index 0000000..2ef32fd Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/30834cef/run.vanim_c differ diff --git a/models/thd_hero/lunasa_prismriver/item/714e55a4/attack.vanim_c b/models/thd_hero/lunasa_prismriver/item/714e55a4/attack.vanim_c new file mode 100755 index 0000000..3c76b6e Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/item/714e55a4/attack.vanim_c differ diff --git a/models/thd_hero/lunasa_prismriver/item/714e55a4/attack2.vanim_c b/models/thd_hero/lunasa_prismriver/item/714e55a4/attack2.vanim_c new file mode 100755 index 0000000..3c9a8de Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/item/714e55a4/attack2.vanim_c differ diff --git a/models/thd_hero/lunasa_prismriver/item/714e55a4/cast.vanim_c b/models/thd_hero/lunasa_prismriver/item/714e55a4/cast.vanim_c new file mode 100755 index 0000000..346c994 Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/item/714e55a4/cast.vanim_c differ diff --git a/models/thd_hero/lunasa_prismriver/item/714e55a4/idle.vanim_c b/models/thd_hero/lunasa_prismriver/item/714e55a4/idle.vanim_c new file mode 100755 index 0000000..1fac915 Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/item/714e55a4/idle.vanim_c differ diff --git a/models/thd_hero/lunasa_prismriver/item/714e55a4/por.vanim_c b/models/thd_hero/lunasa_prismriver/item/714e55a4/por.vanim_c new file mode 100755 index 0000000..46f98c8 Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/item/714e55a4/por.vanim_c differ diff --git a/models/thd_hero/lunasa_prismriver/item/714e55a4/run.vanim_c b/models/thd_hero/lunasa_prismriver/item/714e55a4/run.vanim_c new file mode 100755 index 0000000..e76fa4f Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/item/714e55a4/run.vanim_c differ diff --git a/models/thd_hero/lunasa_prismriver/item/item_lunasa.vmdl_c b/models/thd_hero/lunasa_prismriver/item/item_lunasa.vmdl_c new file mode 100755 index 0000000..f0a8d4d Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/item/item_lunasa.vmdl_c differ diff --git a/models/thd_hero/lunasa_prismriver/item/item_lunasa_714e55a4.vagrp_c b/models/thd_hero/lunasa_prismriver/item/item_lunasa_714e55a4.vagrp_c new file mode 100755 index 0000000..b471829 Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/item/item_lunasa_714e55a4.vagrp_c differ diff --git a/models/thd_hero/lunasa_prismriver/item/lunasa.vmesh_c b/models/thd_hero/lunasa_prismriver/item/lunasa.vmesh_c new file mode 100755 index 0000000..b8c351a Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/item/lunasa.vmesh_c differ diff --git a/models/thd_hero/lunasa_prismriver/lunasa.vmdl_c b/models/thd_hero/lunasa_prismriver/lunasa.vmdl_c new file mode 100755 index 0000000..2a1c779 Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/lunasa.vmdl_c differ diff --git a/models/thd_hero/lunasa_prismriver/lunasa.vmesh_c b/models/thd_hero/lunasa_prismriver/lunasa.vmesh_c new file mode 100755 index 0000000..21d968d Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/lunasa.vmesh_c differ diff --git a/models/thd_hero/lunasa_prismriver/lunasa_30834cef.vagrp_c b/models/thd_hero/lunasa_prismriver/lunasa_30834cef.vagrp_c new file mode 100755 index 0000000..f7c91ed Binary files /dev/null and b/models/thd_hero/lunasa_prismriver/lunasa_30834cef.vagrp_c differ diff --git a/models/thd_hero/lyrica_prismriver/72c27d16/attack1.vanim_c b/models/thd_hero/lyrica_prismriver/72c27d16/attack1.vanim_c new file mode 100755 index 0000000..14f0b22 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/72c27d16/attack1.vanim_c differ diff --git a/models/thd_hero/lyrica_prismriver/72c27d16/attack2.vanim_c b/models/thd_hero/lyrica_prismriver/72c27d16/attack2.vanim_c new file mode 100755 index 0000000..bde9265 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/72c27d16/attack2.vanim_c differ diff --git a/models/thd_hero/lyrica_prismriver/72c27d16/cast.vanim_c b/models/thd_hero/lyrica_prismriver/72c27d16/cast.vanim_c new file mode 100755 index 0000000..841700f Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/72c27d16/cast.vanim_c differ diff --git a/models/thd_hero/lyrica_prismriver/72c27d16/idle.vanim_c b/models/thd_hero/lyrica_prismriver/72c27d16/idle.vanim_c new file mode 100755 index 0000000..1f24ab8 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/72c27d16/idle.vanim_c differ diff --git a/models/thd_hero/lyrica_prismriver/72c27d16/por.vanim_c b/models/thd_hero/lyrica_prismriver/72c27d16/por.vanim_c new file mode 100755 index 0000000..9c0ff7f Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/72c27d16/por.vanim_c differ diff --git a/models/thd_hero/lyrica_prismriver/72c27d16/run.vanim_c b/models/thd_hero/lyrica_prismriver/72c27d16/run.vanim_c new file mode 100755 index 0000000..cdc0db2 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/72c27d16/run.vanim_c differ diff --git a/models/thd_hero/lyrica_prismriver/item/f67a3eb6/attack1.vanim_c b/models/thd_hero/lyrica_prismriver/item/f67a3eb6/attack1.vanim_c new file mode 100755 index 0000000..6e20934 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/item/f67a3eb6/attack1.vanim_c differ diff --git a/models/thd_hero/lyrica_prismriver/item/f67a3eb6/attack2.vanim_c b/models/thd_hero/lyrica_prismriver/item/f67a3eb6/attack2.vanim_c new file mode 100755 index 0000000..d828912 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/item/f67a3eb6/attack2.vanim_c differ diff --git a/models/thd_hero/lyrica_prismriver/item/f67a3eb6/cast.vanim_c b/models/thd_hero/lyrica_prismriver/item/f67a3eb6/cast.vanim_c new file mode 100755 index 0000000..1060d93 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/item/f67a3eb6/cast.vanim_c differ diff --git a/models/thd_hero/lyrica_prismriver/item/f67a3eb6/idle.vanim_c b/models/thd_hero/lyrica_prismriver/item/f67a3eb6/idle.vanim_c new file mode 100755 index 0000000..b5493b8 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/item/f67a3eb6/idle.vanim_c differ diff --git a/models/thd_hero/lyrica_prismriver/item/f67a3eb6/por.vanim_c b/models/thd_hero/lyrica_prismriver/item/f67a3eb6/por.vanim_c new file mode 100755 index 0000000..308a4ed Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/item/f67a3eb6/por.vanim_c differ diff --git a/models/thd_hero/lyrica_prismriver/item/f67a3eb6/run.vanim_c b/models/thd_hero/lyrica_prismriver/item/f67a3eb6/run.vanim_c new file mode 100755 index 0000000..3768de8 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/item/f67a3eb6/run.vanim_c differ diff --git a/models/thd_hero/lyrica_prismriver/item/item_lyrica.vmdl_c b/models/thd_hero/lyrica_prismriver/item/item_lyrica.vmdl_c new file mode 100755 index 0000000..c129298 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/item/item_lyrica.vmdl_c differ diff --git a/models/thd_hero/lyrica_prismriver/item/item_lyrica_f67a3eb6.vagrp_c b/models/thd_hero/lyrica_prismriver/item/item_lyrica_f67a3eb6.vagrp_c new file mode 100755 index 0000000..dd60f64 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/item/item_lyrica_f67a3eb6.vagrp_c differ diff --git a/models/thd_hero/lyrica_prismriver/item/lyrica.vmesh_c b/models/thd_hero/lyrica_prismriver/item/lyrica.vmesh_c new file mode 100755 index 0000000..555160c Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/item/lyrica.vmesh_c differ diff --git a/models/thd_hero/lyrica_prismriver/lyrica.vmdl_c b/models/thd_hero/lyrica_prismriver/lyrica.vmdl_c new file mode 100755 index 0000000..c4b3e70 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/lyrica.vmdl_c differ diff --git a/models/thd_hero/lyrica_prismriver/lyrica.vmesh_c b/models/thd_hero/lyrica_prismriver/lyrica.vmesh_c new file mode 100755 index 0000000..e61ad0c Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/lyrica.vmesh_c differ diff --git a/models/thd_hero/lyrica_prismriver/lyrica_72c27d16.vagrp_c b/models/thd_hero/lyrica_prismriver/lyrica_72c27d16.vagrp_c new file mode 100755 index 0000000..712a344 Binary files /dev/null and b/models/thd_hero/lyrica_prismriver/lyrica_72c27d16.vagrp_c differ diff --git a/models/thd_hero/maidyousei/2c300868/attack.vanim_c b/models/thd_hero/maidyousei/2c300868/attack.vanim_c new file mode 100755 index 0000000..c39318d Binary files /dev/null and b/models/thd_hero/maidyousei/2c300868/attack.vanim_c differ diff --git a/models/thd_hero/maidyousei/2c300868/attack2.vanim_c b/models/thd_hero/maidyousei/2c300868/attack2.vanim_c new file mode 100755 index 0000000..5382832 Binary files /dev/null and b/models/thd_hero/maidyousei/2c300868/attack2.vanim_c differ diff --git a/models/thd_hero/maidyousei/2c300868/attack3.vanim_c b/models/thd_hero/maidyousei/2c300868/attack3.vanim_c new file mode 100755 index 0000000..f4f98be Binary files /dev/null and b/models/thd_hero/maidyousei/2c300868/attack3.vanim_c differ diff --git a/models/thd_hero/maidyousei/2c300868/die.vanim_c b/models/thd_hero/maidyousei/2c300868/die.vanim_c new file mode 100755 index 0000000..ab31c55 Binary files /dev/null and b/models/thd_hero/maidyousei/2c300868/die.vanim_c differ diff --git a/models/thd_hero/maidyousei/2c300868/idle.vanim_c b/models/thd_hero/maidyousei/2c300868/idle.vanim_c new file mode 100755 index 0000000..89a70ae Binary files /dev/null and b/models/thd_hero/maidyousei/2c300868/idle.vanim_c differ diff --git a/models/thd_hero/maidyousei/2c300868/por.vanim_c b/models/thd_hero/maidyousei/2c300868/por.vanim_c new file mode 100755 index 0000000..51c2f15 Binary files /dev/null and b/models/thd_hero/maidyousei/2c300868/por.vanim_c differ diff --git a/models/thd_hero/maidyousei/2c300868/run.vanim_c b/models/thd_hero/maidyousei/2c300868/run.vanim_c new file mode 100755 index 0000000..e319f25 Binary files /dev/null and b/models/thd_hero/maidyousei/2c300868/run.vanim_c differ diff --git a/models/thd_hero/maidyousei/item/606a8a11/attack.vanim_c b/models/thd_hero/maidyousei/item/606a8a11/attack.vanim_c new file mode 100755 index 0000000..b12c2ef Binary files /dev/null and b/models/thd_hero/maidyousei/item/606a8a11/attack.vanim_c differ diff --git a/models/thd_hero/maidyousei/item/606a8a11/attack2.vanim_c b/models/thd_hero/maidyousei/item/606a8a11/attack2.vanim_c new file mode 100755 index 0000000..f79a9f7 Binary files /dev/null and b/models/thd_hero/maidyousei/item/606a8a11/attack2.vanim_c differ diff --git a/models/thd_hero/maidyousei/item/606a8a11/attack3.vanim_c b/models/thd_hero/maidyousei/item/606a8a11/attack3.vanim_c new file mode 100755 index 0000000..2aa7914 Binary files /dev/null and b/models/thd_hero/maidyousei/item/606a8a11/attack3.vanim_c differ diff --git a/models/thd_hero/maidyousei/item/606a8a11/die.vanim_c b/models/thd_hero/maidyousei/item/606a8a11/die.vanim_c new file mode 100755 index 0000000..b8ecd38 Binary files /dev/null and b/models/thd_hero/maidyousei/item/606a8a11/die.vanim_c differ diff --git a/models/thd_hero/maidyousei/item/606a8a11/idle.vanim_c b/models/thd_hero/maidyousei/item/606a8a11/idle.vanim_c new file mode 100755 index 0000000..258acb4 Binary files /dev/null and b/models/thd_hero/maidyousei/item/606a8a11/idle.vanim_c differ diff --git a/models/thd_hero/maidyousei/item/606a8a11/por.vanim_c b/models/thd_hero/maidyousei/item/606a8a11/por.vanim_c new file mode 100755 index 0000000..3093f7e Binary files /dev/null and b/models/thd_hero/maidyousei/item/606a8a11/por.vanim_c differ diff --git a/models/thd_hero/maidyousei/item/606a8a11/run.vanim_c b/models/thd_hero/maidyousei/item/606a8a11/run.vanim_c new file mode 100755 index 0000000..84cff67 Binary files /dev/null and b/models/thd_hero/maidyousei/item/606a8a11/run.vanim_c differ diff --git a/models/thd_hero/maidyousei/item/item_maidyousei.vmdl_c b/models/thd_hero/maidyousei/item/item_maidyousei.vmdl_c new file mode 100755 index 0000000..f2d8bf5 Binary files /dev/null and b/models/thd_hero/maidyousei/item/item_maidyousei.vmdl_c differ diff --git a/models/thd_hero/maidyousei/item/item_maidyousei_606a8a11.vagrp_c b/models/thd_hero/maidyousei/item/item_maidyousei_606a8a11.vagrp_c new file mode 100755 index 0000000..a2a5c6f Binary files /dev/null and b/models/thd_hero/maidyousei/item/item_maidyousei_606a8a11.vagrp_c differ diff --git a/models/thd_hero/maidyousei/item/maidyousei.vmesh_c b/models/thd_hero/maidyousei/item/maidyousei.vmesh_c new file mode 100755 index 0000000..8d290a3 Binary files /dev/null and b/models/thd_hero/maidyousei/item/maidyousei.vmesh_c differ diff --git a/models/thd_hero/maidyousei/maidyousei.vmdl_c b/models/thd_hero/maidyousei/maidyousei.vmdl_c new file mode 100755 index 0000000..2fb9b94 Binary files /dev/null and b/models/thd_hero/maidyousei/maidyousei.vmdl_c differ diff --git a/models/thd_hero/maidyousei/maidyousei.vmesh_c b/models/thd_hero/maidyousei/maidyousei.vmesh_c new file mode 100755 index 0000000..f4bae22 Binary files /dev/null and b/models/thd_hero/maidyousei/maidyousei.vmesh_c differ diff --git a/models/thd_hero/maidyousei/maidyousei_2c300868.vagrp_c b/models/thd_hero/maidyousei/maidyousei_2c300868.vagrp_c new file mode 100755 index 0000000..ec6cab6 Binary files /dev/null and b/models/thd_hero/maidyousei/maidyousei_2c300868.vagrp_c differ diff --git a/models/thd_hero/medicine/67868622/attack1.vanim_c b/models/thd_hero/medicine/67868622/attack1.vanim_c new file mode 100755 index 0000000..2a685cc Binary files /dev/null and b/models/thd_hero/medicine/67868622/attack1.vanim_c differ diff --git a/models/thd_hero/medicine/67868622/idle.vanim_c b/models/thd_hero/medicine/67868622/idle.vanim_c new file mode 100755 index 0000000..eb136fb Binary files /dev/null and b/models/thd_hero/medicine/67868622/idle.vanim_c differ diff --git a/models/thd_hero/medicine/67868622/medicine_animation.vanim_c b/models/thd_hero/medicine/67868622/medicine_animation.vanim_c new file mode 100755 index 0000000..3c75de0 Binary files /dev/null and b/models/thd_hero/medicine/67868622/medicine_animation.vanim_c differ diff --git a/models/thd_hero/medicine/67868622/run.vanim_c b/models/thd_hero/medicine/67868622/run.vanim_c new file mode 100755 index 0000000..d7432e0 Binary files /dev/null and b/models/thd_hero/medicine/67868622/run.vanim_c differ diff --git a/models/thd_hero/medicine/item/81531353/attack1.vanim_c b/models/thd_hero/medicine/item/81531353/attack1.vanim_c new file mode 100755 index 0000000..0a49502 Binary files /dev/null and b/models/thd_hero/medicine/item/81531353/attack1.vanim_c differ diff --git a/models/thd_hero/medicine/item/81531353/idle.vanim_c b/models/thd_hero/medicine/item/81531353/idle.vanim_c new file mode 100755 index 0000000..d7088ca Binary files /dev/null and b/models/thd_hero/medicine/item/81531353/idle.vanim_c differ diff --git a/models/thd_hero/medicine/item/81531353/run.vanim_c b/models/thd_hero/medicine/item/81531353/run.vanim_c new file mode 100755 index 0000000..8c3fe58 Binary files /dev/null and b/models/thd_hero/medicine/item/81531353/run.vanim_c differ diff --git a/models/thd_hero/medicine/item/item_medicine.vmdl_c b/models/thd_hero/medicine/item/item_medicine.vmdl_c new file mode 100755 index 0000000..efd194e Binary files /dev/null and b/models/thd_hero/medicine/item/item_medicine.vmdl_c differ diff --git a/models/thd_hero/medicine/item/item_medicine_81531353.vagrp_c b/models/thd_hero/medicine/item/item_medicine_81531353.vagrp_c new file mode 100755 index 0000000..c616d5d Binary files /dev/null and b/models/thd_hero/medicine/item/item_medicine_81531353.vagrp_c differ diff --git a/models/thd_hero/medicine/item/medicine.vmesh_c b/models/thd_hero/medicine/item/medicine.vmesh_c new file mode 100755 index 0000000..39df752 Binary files /dev/null and b/models/thd_hero/medicine/item/medicine.vmesh_c differ diff --git a/models/thd_hero/medicine/medicine.vmdl_c b/models/thd_hero/medicine/medicine.vmdl_c new file mode 100755 index 0000000..7d6bdf5 Binary files /dev/null and b/models/thd_hero/medicine/medicine.vmdl_c differ diff --git a/models/thd_hero/medicine/medicine.vmesh_c b/models/thd_hero/medicine/medicine.vmesh_c new file mode 100755 index 0000000..1ed48a0 Binary files /dev/null and b/models/thd_hero/medicine/medicine.vmesh_c differ diff --git a/models/thd_hero/medicine/medicine_67868622.vagrp_c b/models/thd_hero/medicine/medicine_67868622.vagrp_c new file mode 100755 index 0000000..d59efbd Binary files /dev/null and b/models/thd_hero/medicine/medicine_67868622.vagrp_c differ diff --git a/models/thd_hero/meirin/b62c8868/attack1.vanim_c b/models/thd_hero/meirin/b62c8868/attack1.vanim_c new file mode 100755 index 0000000..65af8fb Binary files /dev/null and b/models/thd_hero/meirin/b62c8868/attack1.vanim_c differ diff --git a/models/thd_hero/meirin/b62c8868/attack2.vanim_c b/models/thd_hero/meirin/b62c8868/attack2.vanim_c new file mode 100755 index 0000000..2a4acb4 Binary files /dev/null and b/models/thd_hero/meirin/b62c8868/attack2.vanim_c differ diff --git a/models/thd_hero/meirin/b62c8868/cast1.vanim_c b/models/thd_hero/meirin/b62c8868/cast1.vanim_c new file mode 100755 index 0000000..6b30c82 Binary files /dev/null and b/models/thd_hero/meirin/b62c8868/cast1.vanim_c differ diff --git a/models/thd_hero/meirin/b62c8868/cast3.vanim_c b/models/thd_hero/meirin/b62c8868/cast3.vanim_c new file mode 100755 index 0000000..d869eae Binary files /dev/null and b/models/thd_hero/meirin/b62c8868/cast3.vanim_c differ diff --git a/models/thd_hero/meirin/b62c8868/cast4.vanim_c b/models/thd_hero/meirin/b62c8868/cast4.vanim_c new file mode 100755 index 0000000..6fd03b0 Binary files /dev/null and b/models/thd_hero/meirin/b62c8868/cast4.vanim_c differ diff --git a/models/thd_hero/meirin/b62c8868/cast4_2.vanim_c b/models/thd_hero/meirin/b62c8868/cast4_2.vanim_c new file mode 100755 index 0000000..3a5ac0f Binary files /dev/null and b/models/thd_hero/meirin/b62c8868/cast4_2.vanim_c differ diff --git a/models/thd_hero/meirin/b62c8868/cast4_3.vanim_c b/models/thd_hero/meirin/b62c8868/cast4_3.vanim_c new file mode 100755 index 0000000..42ae11b Binary files /dev/null and b/models/thd_hero/meirin/b62c8868/cast4_3.vanim_c differ diff --git a/models/thd_hero/meirin/b62c8868/idle.vanim_c b/models/thd_hero/meirin/b62c8868/idle.vanim_c new file mode 100755 index 0000000..037185b Binary files /dev/null and b/models/thd_hero/meirin/b62c8868/idle.vanim_c differ diff --git a/models/thd_hero/meirin/b62c8868/meirin_animation.vanim_c b/models/thd_hero/meirin/b62c8868/meirin_animation.vanim_c new file mode 100755 index 0000000..214ba1e Binary files /dev/null and b/models/thd_hero/meirin/b62c8868/meirin_animation.vanim_c differ diff --git a/models/thd_hero/meirin/b62c8868/run.vanim_c b/models/thd_hero/meirin/b62c8868/run.vanim_c new file mode 100755 index 0000000..268127b Binary files /dev/null and b/models/thd_hero/meirin/b62c8868/run.vanim_c differ diff --git a/models/thd_hero/meirin/cloth01/95c78aa6/2.vanim_c b/models/thd_hero/meirin/cloth01/95c78aa6/2.vanim_c new file mode 100755 index 0000000..15caf27 Binary files /dev/null and b/models/thd_hero/meirin/cloth01/95c78aa6/2.vanim_c differ diff --git a/models/thd_hero/meirin/cloth01/95c78aa6/attack1.vanim_c b/models/thd_hero/meirin/cloth01/95c78aa6/attack1.vanim_c new file mode 100755 index 0000000..3c963fd Binary files /dev/null and b/models/thd_hero/meirin/cloth01/95c78aa6/attack1.vanim_c differ diff --git a/models/thd_hero/meirin/cloth01/95c78aa6/attack2.vanim_c b/models/thd_hero/meirin/cloth01/95c78aa6/attack2.vanim_c new file mode 100755 index 0000000..3147a8b Binary files /dev/null and b/models/thd_hero/meirin/cloth01/95c78aa6/attack2.vanim_c differ diff --git a/models/thd_hero/meirin/cloth01/95c78aa6/cast1.vanim_c b/models/thd_hero/meirin/cloth01/95c78aa6/cast1.vanim_c new file mode 100755 index 0000000..02dd1b3 Binary files /dev/null and b/models/thd_hero/meirin/cloth01/95c78aa6/cast1.vanim_c differ diff --git a/models/thd_hero/meirin/cloth01/95c78aa6/cast3.vanim_c b/models/thd_hero/meirin/cloth01/95c78aa6/cast3.vanim_c new file mode 100755 index 0000000..3183dff Binary files /dev/null and b/models/thd_hero/meirin/cloth01/95c78aa6/cast3.vanim_c differ diff --git a/models/thd_hero/meirin/cloth01/95c78aa6/cast4.vanim_c b/models/thd_hero/meirin/cloth01/95c78aa6/cast4.vanim_c new file mode 100755 index 0000000..cf8835f Binary files /dev/null and b/models/thd_hero/meirin/cloth01/95c78aa6/cast4.vanim_c differ diff --git a/models/thd_hero/meirin/cloth01/95c78aa6/cast4_2.vanim_c b/models/thd_hero/meirin/cloth01/95c78aa6/cast4_2.vanim_c new file mode 100755 index 0000000..476ef63 Binary files /dev/null and b/models/thd_hero/meirin/cloth01/95c78aa6/cast4_2.vanim_c differ diff --git a/models/thd_hero/meirin/cloth01/95c78aa6/cast4_3.vanim_c b/models/thd_hero/meirin/cloth01/95c78aa6/cast4_3.vanim_c new file mode 100755 index 0000000..25b7fc6 Binary files /dev/null and b/models/thd_hero/meirin/cloth01/95c78aa6/cast4_3.vanim_c differ diff --git a/models/thd_hero/meirin/cloth01/95c78aa6/idle.vanim_c b/models/thd_hero/meirin/cloth01/95c78aa6/idle.vanim_c new file mode 100755 index 0000000..ed23bdb Binary files /dev/null and b/models/thd_hero/meirin/cloth01/95c78aa6/idle.vanim_c differ diff --git a/models/thd_hero/meirin/cloth01/95c78aa6/meirin_cloth01_animation.vanim_c b/models/thd_hero/meirin/cloth01/95c78aa6/meirin_cloth01_animation.vanim_c new file mode 100755 index 0000000..5068437 Binary files /dev/null and b/models/thd_hero/meirin/cloth01/95c78aa6/meirin_cloth01_animation.vanim_c differ diff --git a/models/thd_hero/meirin/cloth01/95c78aa6/run.vanim_c b/models/thd_hero/meirin/cloth01/95c78aa6/run.vanim_c new file mode 100755 index 0000000..8bedee1 Binary files /dev/null and b/models/thd_hero/meirin/cloth01/95c78aa6/run.vanim_c differ diff --git a/models/thd_hero/meirin/cloth01/meirin_cloth01.vmdl_c b/models/thd_hero/meirin/cloth01/meirin_cloth01.vmdl_c new file mode 100755 index 0000000..60b772d Binary files /dev/null and b/models/thd_hero/meirin/cloth01/meirin_cloth01.vmdl_c differ diff --git a/models/thd_hero/meirin/cloth01/meirin_cloth01.vmesh_c b/models/thd_hero/meirin/cloth01/meirin_cloth01.vmesh_c new file mode 100755 index 0000000..d3cd4b9 Binary files /dev/null and b/models/thd_hero/meirin/cloth01/meirin_cloth01.vmesh_c differ diff --git a/models/thd_hero/meirin/cloth01/meirin_cloth01_95c78aa6.vagrp_c b/models/thd_hero/meirin/cloth01/meirin_cloth01_95c78aa6.vagrp_c new file mode 100755 index 0000000..80f1457 Binary files /dev/null and b/models/thd_hero/meirin/cloth01/meirin_cloth01_95c78aa6.vagrp_c differ diff --git a/models/thd_hero/meirin/item/8987cc8f/attack1.vanim_c b/models/thd_hero/meirin/item/8987cc8f/attack1.vanim_c new file mode 100755 index 0000000..484c1f0 Binary files /dev/null and b/models/thd_hero/meirin/item/8987cc8f/attack1.vanim_c differ diff --git a/models/thd_hero/meirin/item/8987cc8f/attack2.vanim_c b/models/thd_hero/meirin/item/8987cc8f/attack2.vanim_c new file mode 100755 index 0000000..a1c42a2 Binary files /dev/null and b/models/thd_hero/meirin/item/8987cc8f/attack2.vanim_c differ diff --git a/models/thd_hero/meirin/item/8987cc8f/cast1.vanim_c b/models/thd_hero/meirin/item/8987cc8f/cast1.vanim_c new file mode 100755 index 0000000..ff11574 Binary files /dev/null and b/models/thd_hero/meirin/item/8987cc8f/cast1.vanim_c differ diff --git a/models/thd_hero/meirin/item/8987cc8f/cast3.vanim_c b/models/thd_hero/meirin/item/8987cc8f/cast3.vanim_c new file mode 100755 index 0000000..12b7558 Binary files /dev/null and b/models/thd_hero/meirin/item/8987cc8f/cast3.vanim_c differ diff --git a/models/thd_hero/meirin/item/8987cc8f/cast4.vanim_c b/models/thd_hero/meirin/item/8987cc8f/cast4.vanim_c new file mode 100755 index 0000000..3c34eb4 Binary files /dev/null and b/models/thd_hero/meirin/item/8987cc8f/cast4.vanim_c differ diff --git a/models/thd_hero/meirin/item/8987cc8f/cast4_2.vanim_c b/models/thd_hero/meirin/item/8987cc8f/cast4_2.vanim_c new file mode 100755 index 0000000..f31ec25 Binary files /dev/null and b/models/thd_hero/meirin/item/8987cc8f/cast4_2.vanim_c differ diff --git a/models/thd_hero/meirin/item/8987cc8f/cast4_3.vanim_c b/models/thd_hero/meirin/item/8987cc8f/cast4_3.vanim_c new file mode 100755 index 0000000..254503f Binary files /dev/null and b/models/thd_hero/meirin/item/8987cc8f/cast4_3.vanim_c differ diff --git a/models/thd_hero/meirin/item/8987cc8f/idle.vanim_c b/models/thd_hero/meirin/item/8987cc8f/idle.vanim_c new file mode 100755 index 0000000..7c74c48 Binary files /dev/null and b/models/thd_hero/meirin/item/8987cc8f/idle.vanim_c differ diff --git a/models/thd_hero/meirin/item/8987cc8f/run.vanim_c b/models/thd_hero/meirin/item/8987cc8f/run.vanim_c new file mode 100755 index 0000000..c6e04b7 Binary files /dev/null and b/models/thd_hero/meirin/item/8987cc8f/run.vanim_c differ diff --git a/models/thd_hero/meirin/item/item_meirin.vmdl_c b/models/thd_hero/meirin/item/item_meirin.vmdl_c new file mode 100755 index 0000000..5ff3093 Binary files /dev/null and b/models/thd_hero/meirin/item/item_meirin.vmdl_c differ diff --git a/models/thd_hero/meirin/item/item_meirin_8987cc8f.vagrp_c b/models/thd_hero/meirin/item/item_meirin_8987cc8f.vagrp_c new file mode 100755 index 0000000..2c3d6ed Binary files /dev/null and b/models/thd_hero/meirin/item/item_meirin_8987cc8f.vagrp_c differ diff --git a/models/thd_hero/meirin/item/meirin.vmesh_c b/models/thd_hero/meirin/item/meirin.vmesh_c new file mode 100755 index 0000000..6eca3e6 Binary files /dev/null and b/models/thd_hero/meirin/item/meirin.vmesh_c differ diff --git a/models/thd_hero/meirin/meirin.vmdl_c b/models/thd_hero/meirin/meirin.vmdl_c new file mode 100755 index 0000000..cc9801e Binary files /dev/null and b/models/thd_hero/meirin/meirin.vmdl_c differ diff --git a/models/thd_hero/meirin/meirin.vmesh_c b/models/thd_hero/meirin/meirin.vmesh_c new file mode 100755 index 0000000..da4b743 Binary files /dev/null and b/models/thd_hero/meirin/meirin.vmesh_c differ diff --git a/models/thd_hero/meirin/meirin_b62c8868.vagrp_c b/models/thd_hero/meirin/meirin_b62c8868.vagrp_c new file mode 100755 index 0000000..0c20da6 Binary files /dev/null and b/models/thd_hero/meirin/meirin_b62c8868.vagrp_c differ diff --git a/models/thd_hero/merlin_prismriver/ec4560c0/attack.vanim_c b/models/thd_hero/merlin_prismriver/ec4560c0/attack.vanim_c new file mode 100755 index 0000000..c26d74f Binary files /dev/null and b/models/thd_hero/merlin_prismriver/ec4560c0/attack.vanim_c differ diff --git a/models/thd_hero/merlin_prismriver/ec4560c0/attack2.vanim_c b/models/thd_hero/merlin_prismriver/ec4560c0/attack2.vanim_c new file mode 100755 index 0000000..f8568c2 Binary files /dev/null and b/models/thd_hero/merlin_prismriver/ec4560c0/attack2.vanim_c differ diff --git a/models/thd_hero/merlin_prismriver/ec4560c0/cast.vanim_c b/models/thd_hero/merlin_prismriver/ec4560c0/cast.vanim_c new file mode 100755 index 0000000..de6cc3e Binary files /dev/null and b/models/thd_hero/merlin_prismriver/ec4560c0/cast.vanim_c differ diff --git a/models/thd_hero/merlin_prismriver/ec4560c0/idle.vanim_c b/models/thd_hero/merlin_prismriver/ec4560c0/idle.vanim_c new file mode 100755 index 0000000..cc9d1d1 Binary files /dev/null and b/models/thd_hero/merlin_prismriver/ec4560c0/idle.vanim_c differ diff --git a/models/thd_hero/merlin_prismriver/ec4560c0/por.vanim_c b/models/thd_hero/merlin_prismriver/ec4560c0/por.vanim_c new file mode 100755 index 0000000..d2f209c Binary files /dev/null and b/models/thd_hero/merlin_prismriver/ec4560c0/por.vanim_c differ diff --git a/models/thd_hero/merlin_prismriver/ec4560c0/run.vanim_c b/models/thd_hero/merlin_prismriver/ec4560c0/run.vanim_c new file mode 100755 index 0000000..60b8894 Binary files /dev/null and b/models/thd_hero/merlin_prismriver/ec4560c0/run.vanim_c differ diff --git a/models/thd_hero/merlin_prismriver/item/db3d994d/attack.vanim_c b/models/thd_hero/merlin_prismriver/item/db3d994d/attack.vanim_c new file mode 100755 index 0000000..7c10cb6 Binary files /dev/null and b/models/thd_hero/merlin_prismriver/item/db3d994d/attack.vanim_c differ diff --git a/models/thd_hero/merlin_prismriver/item/db3d994d/attack2.vanim_c b/models/thd_hero/merlin_prismriver/item/db3d994d/attack2.vanim_c new file mode 100755 index 0000000..1c42f01 Binary files /dev/null and b/models/thd_hero/merlin_prismriver/item/db3d994d/attack2.vanim_c differ diff --git a/models/thd_hero/merlin_prismriver/item/db3d994d/cast.vanim_c b/models/thd_hero/merlin_prismriver/item/db3d994d/cast.vanim_c new file mode 100755 index 0000000..532e1c5 Binary files /dev/null and b/models/thd_hero/merlin_prismriver/item/db3d994d/cast.vanim_c differ diff --git a/models/thd_hero/merlin_prismriver/item/db3d994d/idle.vanim_c b/models/thd_hero/merlin_prismriver/item/db3d994d/idle.vanim_c new file mode 100755 index 0000000..7602dc2 Binary files /dev/null and b/models/thd_hero/merlin_prismriver/item/db3d994d/idle.vanim_c differ diff --git a/models/thd_hero/merlin_prismriver/item/db3d994d/por.vanim_c b/models/thd_hero/merlin_prismriver/item/db3d994d/por.vanim_c new file mode 100755 index 0000000..a773565 Binary files /dev/null and b/models/thd_hero/merlin_prismriver/item/db3d994d/por.vanim_c differ diff --git a/models/thd_hero/merlin_prismriver/item/db3d994d/run.vanim_c b/models/thd_hero/merlin_prismriver/item/db3d994d/run.vanim_c new file mode 100755 index 0000000..3bb821d Binary files /dev/null and b/models/thd_hero/merlin_prismriver/item/db3d994d/run.vanim_c differ diff --git a/models/thd_hero/merlin_prismriver/item/item_merlin.vmdl_c b/models/thd_hero/merlin_prismriver/item/item_merlin.vmdl_c new file mode 100755 index 0000000..eb7fc65 Binary files /dev/null and b/models/thd_hero/merlin_prismriver/item/item_merlin.vmdl_c differ diff --git a/models/thd_hero/merlin_prismriver/item/item_merlin_db3d994d.vagrp_c b/models/thd_hero/merlin_prismriver/item/item_merlin_db3d994d.vagrp_c new file mode 100755 index 0000000..82e09ae Binary files /dev/null and b/models/thd_hero/merlin_prismriver/item/item_merlin_db3d994d.vagrp_c differ diff --git a/models/thd_hero/merlin_prismriver/item/merlin.vmesh_c b/models/thd_hero/merlin_prismriver/item/merlin.vmesh_c new file mode 100755 index 0000000..04178ef Binary files /dev/null and b/models/thd_hero/merlin_prismriver/item/merlin.vmesh_c differ diff --git a/models/thd_hero/merlin_prismriver/merlin.vmdl_c b/models/thd_hero/merlin_prismriver/merlin.vmdl_c new file mode 100755 index 0000000..f163e83 Binary files /dev/null and b/models/thd_hero/merlin_prismriver/merlin.vmdl_c differ diff --git a/models/thd_hero/merlin_prismriver/merlin.vmesh_c b/models/thd_hero/merlin_prismriver/merlin.vmesh_c new file mode 100755 index 0000000..e40afa6 Binary files /dev/null and b/models/thd_hero/merlin_prismriver/merlin.vmesh_c differ diff --git a/models/thd_hero/merlin_prismriver/merlin_ec4560c0.vagrp_c b/models/thd_hero/merlin_prismriver/merlin_ec4560c0.vagrp_c new file mode 100755 index 0000000..b764311 Binary files /dev/null and b/models/thd_hero/merlin_prismriver/merlin_ec4560c0.vagrp_c differ diff --git a/models/thd_hero/miko/6fbdbd69/attack1.vanim_c b/models/thd_hero/miko/6fbdbd69/attack1.vanim_c new file mode 100755 index 0000000..15bb69c Binary files /dev/null and b/models/thd_hero/miko/6fbdbd69/attack1.vanim_c differ diff --git a/models/thd_hero/miko/6fbdbd69/attack2.vanim_c b/models/thd_hero/miko/6fbdbd69/attack2.vanim_c new file mode 100755 index 0000000..4dc5985 Binary files /dev/null and b/models/thd_hero/miko/6fbdbd69/attack2.vanim_c differ diff --git a/models/thd_hero/miko/6fbdbd69/capture.vanim_c b/models/thd_hero/miko/6fbdbd69/capture.vanim_c new file mode 100755 index 0000000..f5c7bd6 Binary files /dev/null and b/models/thd_hero/miko/6fbdbd69/capture.vanim_c differ diff --git a/models/thd_hero/miko/6fbdbd69/cast1.vanim_c b/models/thd_hero/miko/6fbdbd69/cast1.vanim_c new file mode 100755 index 0000000..dd02a22 Binary files /dev/null and b/models/thd_hero/miko/6fbdbd69/cast1.vanim_c differ diff --git a/models/thd_hero/miko/6fbdbd69/cast1_b.vanim_c b/models/thd_hero/miko/6fbdbd69/cast1_b.vanim_c new file mode 100755 index 0000000..f4f743b Binary files /dev/null and b/models/thd_hero/miko/6fbdbd69/cast1_b.vanim_c differ diff --git a/models/thd_hero/miko/6fbdbd69/cast1_c.vanim_c b/models/thd_hero/miko/6fbdbd69/cast1_c.vanim_c new file mode 100755 index 0000000..f6f00d2 Binary files /dev/null and b/models/thd_hero/miko/6fbdbd69/cast1_c.vanim_c differ diff --git a/models/thd_hero/miko/6fbdbd69/cast2.vanim_c b/models/thd_hero/miko/6fbdbd69/cast2.vanim_c new file mode 100755 index 0000000..264c45d Binary files /dev/null and b/models/thd_hero/miko/6fbdbd69/cast2.vanim_c differ diff --git a/models/thd_hero/miko/6fbdbd69/cast4.vanim_c b/models/thd_hero/miko/6fbdbd69/cast4.vanim_c new file mode 100755 index 0000000..8f12334 Binary files /dev/null and b/models/thd_hero/miko/6fbdbd69/cast4.vanim_c differ diff --git a/models/thd_hero/miko/6fbdbd69/idle.vanim_c b/models/thd_hero/miko/6fbdbd69/idle.vanim_c new file mode 100755 index 0000000..6948d6b Binary files /dev/null and b/models/thd_hero/miko/6fbdbd69/idle.vanim_c differ diff --git a/models/thd_hero/miko/6fbdbd69/miko_animation.vanim_c b/models/thd_hero/miko/6fbdbd69/miko_animation.vanim_c new file mode 100755 index 0000000..0be77a9 Binary files /dev/null and b/models/thd_hero/miko/6fbdbd69/miko_animation.vanim_c differ diff --git a/models/thd_hero/miko/6fbdbd69/run.vanim_c b/models/thd_hero/miko/6fbdbd69/run.vanim_c new file mode 100755 index 0000000..e01d1e6 Binary files /dev/null and b/models/thd_hero/miko/6fbdbd69/run.vanim_c differ diff --git a/models/thd_hero/miko/item/ae849235/attack1.vanim_c b/models/thd_hero/miko/item/ae849235/attack1.vanim_c new file mode 100755 index 0000000..6730009 Binary files /dev/null and b/models/thd_hero/miko/item/ae849235/attack1.vanim_c differ diff --git a/models/thd_hero/miko/item/ae849235/attack2.vanim_c b/models/thd_hero/miko/item/ae849235/attack2.vanim_c new file mode 100755 index 0000000..1f8dabc Binary files /dev/null and b/models/thd_hero/miko/item/ae849235/attack2.vanim_c differ diff --git a/models/thd_hero/miko/item/ae849235/cast1.vanim_c b/models/thd_hero/miko/item/ae849235/cast1.vanim_c new file mode 100755 index 0000000..8e7534a Binary files /dev/null and b/models/thd_hero/miko/item/ae849235/cast1.vanim_c differ diff --git a/models/thd_hero/miko/item/ae849235/cast2.vanim_c b/models/thd_hero/miko/item/ae849235/cast2.vanim_c new file mode 100755 index 0000000..b539549 Binary files /dev/null and b/models/thd_hero/miko/item/ae849235/cast2.vanim_c differ diff --git a/models/thd_hero/miko/item/ae849235/idle.vanim_c b/models/thd_hero/miko/item/ae849235/idle.vanim_c new file mode 100755 index 0000000..074f55a Binary files /dev/null and b/models/thd_hero/miko/item/ae849235/idle.vanim_c differ diff --git a/models/thd_hero/miko/item/ae849235/run.vanim_c b/models/thd_hero/miko/item/ae849235/run.vanim_c new file mode 100755 index 0000000..dd1156e Binary files /dev/null and b/models/thd_hero/miko/item/ae849235/run.vanim_c differ diff --git a/models/thd_hero/miko/item/item_miko.vmdl_c b/models/thd_hero/miko/item/item_miko.vmdl_c new file mode 100755 index 0000000..f3ecc3c Binary files /dev/null and b/models/thd_hero/miko/item/item_miko.vmdl_c differ diff --git a/models/thd_hero/miko/item/item_miko_ae849235.vagrp_c b/models/thd_hero/miko/item/item_miko_ae849235.vagrp_c new file mode 100755 index 0000000..4628ec9 Binary files /dev/null and b/models/thd_hero/miko/item/item_miko_ae849235.vagrp_c differ diff --git a/models/thd_hero/miko/item/miko.vmesh_c b/models/thd_hero/miko/item/miko.vmesh_c new file mode 100755 index 0000000..b975af2 Binary files /dev/null and b/models/thd_hero/miko/item/miko.vmesh_c differ diff --git a/models/thd_hero/miko/miko.vmdl_c b/models/thd_hero/miko/miko.vmdl_c new file mode 100755 index 0000000..19fe78d Binary files /dev/null and b/models/thd_hero/miko/miko.vmdl_c differ diff --git a/models/thd_hero/miko/miko.vmesh_c b/models/thd_hero/miko/miko.vmesh_c new file mode 100755 index 0000000..0fe8696 Binary files /dev/null and b/models/thd_hero/miko/miko.vmesh_c differ diff --git a/models/thd_hero/miko/miko_6fbdbd69.vagrp_c b/models/thd_hero/miko/miko_6fbdbd69.vagrp_c new file mode 100755 index 0000000..4754e3d Binary files /dev/null and b/models/thd_hero/miko/miko_6fbdbd69.vagrp_c differ diff --git a/models/thd_hero/minamitsu/5ce57e51/attack1.vanim_c b/models/thd_hero/minamitsu/5ce57e51/attack1.vanim_c new file mode 100755 index 0000000..94ff15d Binary files /dev/null and b/models/thd_hero/minamitsu/5ce57e51/attack1.vanim_c differ diff --git a/models/thd_hero/minamitsu/5ce57e51/attack2.vanim_c b/models/thd_hero/minamitsu/5ce57e51/attack2.vanim_c new file mode 100755 index 0000000..22b89c7 Binary files /dev/null and b/models/thd_hero/minamitsu/5ce57e51/attack2.vanim_c differ diff --git a/models/thd_hero/minamitsu/5ce57e51/cast.vanim_c b/models/thd_hero/minamitsu/5ce57e51/cast.vanim_c new file mode 100755 index 0000000..374709c Binary files /dev/null and b/models/thd_hero/minamitsu/5ce57e51/cast.vanim_c differ diff --git a/models/thd_hero/minamitsu/5ce57e51/cast_end.vanim_c b/models/thd_hero/minamitsu/5ce57e51/cast_end.vanim_c new file mode 100755 index 0000000..a38b467 Binary files /dev/null and b/models/thd_hero/minamitsu/5ce57e51/cast_end.vanim_c differ diff --git a/models/thd_hero/minamitsu/5ce57e51/idle.vanim_c b/models/thd_hero/minamitsu/5ce57e51/idle.vanim_c new file mode 100755 index 0000000..1e78607 Binary files /dev/null and b/models/thd_hero/minamitsu/5ce57e51/idle.vanim_c differ diff --git a/models/thd_hero/minamitsu/5ce57e51/minamitsu_animation.vanim_c b/models/thd_hero/minamitsu/5ce57e51/minamitsu_animation.vanim_c new file mode 100755 index 0000000..a581895 Binary files /dev/null and b/models/thd_hero/minamitsu/5ce57e51/minamitsu_animation.vanim_c differ diff --git a/models/thd_hero/minamitsu/5ce57e51/run.vanim_c b/models/thd_hero/minamitsu/5ce57e51/run.vanim_c new file mode 100755 index 0000000..fba5e28 Binary files /dev/null and b/models/thd_hero/minamitsu/5ce57e51/run.vanim_c differ diff --git a/models/thd_hero/minamitsu/item/3389a848/attack1.vanim_c b/models/thd_hero/minamitsu/item/3389a848/attack1.vanim_c new file mode 100755 index 0000000..2514c29 Binary files /dev/null and b/models/thd_hero/minamitsu/item/3389a848/attack1.vanim_c differ diff --git a/models/thd_hero/minamitsu/item/3389a848/attack2.vanim_c b/models/thd_hero/minamitsu/item/3389a848/attack2.vanim_c new file mode 100755 index 0000000..e33849f Binary files /dev/null and b/models/thd_hero/minamitsu/item/3389a848/attack2.vanim_c differ diff --git a/models/thd_hero/minamitsu/item/3389a848/cast.vanim_c b/models/thd_hero/minamitsu/item/3389a848/cast.vanim_c new file mode 100755 index 0000000..9beeeef Binary files /dev/null and b/models/thd_hero/minamitsu/item/3389a848/cast.vanim_c differ diff --git a/models/thd_hero/minamitsu/item/3389a848/cast_end.vanim_c b/models/thd_hero/minamitsu/item/3389a848/cast_end.vanim_c new file mode 100755 index 0000000..2db4773 Binary files /dev/null and b/models/thd_hero/minamitsu/item/3389a848/cast_end.vanim_c differ diff --git a/models/thd_hero/minamitsu/item/3389a848/idle.vanim_c b/models/thd_hero/minamitsu/item/3389a848/idle.vanim_c new file mode 100755 index 0000000..79ff28d Binary files /dev/null and b/models/thd_hero/minamitsu/item/3389a848/idle.vanim_c differ diff --git a/models/thd_hero/minamitsu/item/3389a848/run.vanim_c b/models/thd_hero/minamitsu/item/3389a848/run.vanim_c new file mode 100755 index 0000000..268e870 Binary files /dev/null and b/models/thd_hero/minamitsu/item/3389a848/run.vanim_c differ diff --git a/models/thd_hero/minamitsu/item/item_minamitsu.vmdl_c b/models/thd_hero/minamitsu/item/item_minamitsu.vmdl_c new file mode 100755 index 0000000..b9330e1 Binary files /dev/null and b/models/thd_hero/minamitsu/item/item_minamitsu.vmdl_c differ diff --git a/models/thd_hero/minamitsu/item/item_minamitsu_3389a848.vagrp_c b/models/thd_hero/minamitsu/item/item_minamitsu_3389a848.vagrp_c new file mode 100755 index 0000000..ef8ec49 Binary files /dev/null and b/models/thd_hero/minamitsu/item/item_minamitsu_3389a848.vagrp_c differ diff --git a/models/thd_hero/minamitsu/item/minamitsu.vmesh_c b/models/thd_hero/minamitsu/item/minamitsu.vmesh_c new file mode 100755 index 0000000..c96d88a Binary files /dev/null and b/models/thd_hero/minamitsu/item/minamitsu.vmesh_c differ diff --git a/models/thd_hero/minamitsu/minamitsu.vmdl_c b/models/thd_hero/minamitsu/minamitsu.vmdl_c new file mode 100755 index 0000000..ccf7e19 Binary files /dev/null and b/models/thd_hero/minamitsu/minamitsu.vmdl_c differ diff --git a/models/thd_hero/minamitsu/minamitsu.vmesh_c b/models/thd_hero/minamitsu/minamitsu.vmesh_c new file mode 100755 index 0000000..4f660ae Binary files /dev/null and b/models/thd_hero/minamitsu/minamitsu.vmesh_c differ diff --git a/models/thd_hero/minamitsu/minamitsu_5ce57e51.vagrp_c b/models/thd_hero/minamitsu/minamitsu_5ce57e51.vagrp_c new file mode 100755 index 0000000..23f9407 Binary files /dev/null and b/models/thd_hero/minamitsu/minamitsu_5ce57e51.vagrp_c differ diff --git a/models/thd_hero/minoriko/2861a990/attack.vanim_c b/models/thd_hero/minoriko/2861a990/attack.vanim_c new file mode 100755 index 0000000..f190f83 Binary files /dev/null and b/models/thd_hero/minoriko/2861a990/attack.vanim_c differ diff --git a/models/thd_hero/minoriko/2861a990/cast1.vanim_c b/models/thd_hero/minoriko/2861a990/cast1.vanim_c new file mode 100755 index 0000000..f5a0259 Binary files /dev/null and b/models/thd_hero/minoriko/2861a990/cast1.vanim_c differ diff --git a/models/thd_hero/minoriko/2861a990/idle.vanim_c b/models/thd_hero/minoriko/2861a990/idle.vanim_c new file mode 100755 index 0000000..2f5e525 Binary files /dev/null and b/models/thd_hero/minoriko/2861a990/idle.vanim_c differ diff --git a/models/thd_hero/minoriko/2861a990/idle2.vanim_c b/models/thd_hero/minoriko/2861a990/idle2.vanim_c new file mode 100755 index 0000000..9d29715 Binary files /dev/null and b/models/thd_hero/minoriko/2861a990/idle2.vanim_c differ diff --git a/models/thd_hero/minoriko/2861a990/por.vanim_c b/models/thd_hero/minoriko/2861a990/por.vanim_c new file mode 100755 index 0000000..9f5489b Binary files /dev/null and b/models/thd_hero/minoriko/2861a990/por.vanim_c differ diff --git a/models/thd_hero/minoriko/2861a990/run.vanim_c b/models/thd_hero/minoriko/2861a990/run.vanim_c new file mode 100755 index 0000000..3bb6579 Binary files /dev/null and b/models/thd_hero/minoriko/2861a990/run.vanim_c differ diff --git a/models/thd_hero/minoriko/2861a990/start.vanim_c b/models/thd_hero/minoriko/2861a990/start.vanim_c new file mode 100755 index 0000000..ce904e9 Binary files /dev/null and b/models/thd_hero/minoriko/2861a990/start.vanim_c differ diff --git a/models/thd_hero/minoriko/item/4bf31d79/attack.vanim_c b/models/thd_hero/minoriko/item/4bf31d79/attack.vanim_c new file mode 100755 index 0000000..7112292 Binary files /dev/null and b/models/thd_hero/minoriko/item/4bf31d79/attack.vanim_c differ diff --git a/models/thd_hero/minoriko/item/4bf31d79/cast1.vanim_c b/models/thd_hero/minoriko/item/4bf31d79/cast1.vanim_c new file mode 100755 index 0000000..34c81ae Binary files /dev/null and b/models/thd_hero/minoriko/item/4bf31d79/cast1.vanim_c differ diff --git a/models/thd_hero/minoriko/item/4bf31d79/idle.vanim_c b/models/thd_hero/minoriko/item/4bf31d79/idle.vanim_c new file mode 100755 index 0000000..721f3e7 Binary files /dev/null and b/models/thd_hero/minoriko/item/4bf31d79/idle.vanim_c differ diff --git a/models/thd_hero/minoriko/item/4bf31d79/idle2.vanim_c b/models/thd_hero/minoriko/item/4bf31d79/idle2.vanim_c new file mode 100755 index 0000000..0045c37 Binary files /dev/null and b/models/thd_hero/minoriko/item/4bf31d79/idle2.vanim_c differ diff --git a/models/thd_hero/minoriko/item/4bf31d79/por.vanim_c b/models/thd_hero/minoriko/item/4bf31d79/por.vanim_c new file mode 100755 index 0000000..50b92ca Binary files /dev/null and b/models/thd_hero/minoriko/item/4bf31d79/por.vanim_c differ diff --git a/models/thd_hero/minoriko/item/4bf31d79/run.vanim_c b/models/thd_hero/minoriko/item/4bf31d79/run.vanim_c new file mode 100755 index 0000000..b6361fa Binary files /dev/null and b/models/thd_hero/minoriko/item/4bf31d79/run.vanim_c differ diff --git a/models/thd_hero/minoriko/item/4bf31d79/start.vanim_c b/models/thd_hero/minoriko/item/4bf31d79/start.vanim_c new file mode 100755 index 0000000..05d2a7b Binary files /dev/null and b/models/thd_hero/minoriko/item/4bf31d79/start.vanim_c differ diff --git a/models/thd_hero/minoriko/item/item_minoriko.vmdl_c b/models/thd_hero/minoriko/item/item_minoriko.vmdl_c new file mode 100755 index 0000000..9fece31 Binary files /dev/null and b/models/thd_hero/minoriko/item/item_minoriko.vmdl_c differ diff --git a/models/thd_hero/minoriko/item/item_minoriko_4bf31d79.vagrp_c b/models/thd_hero/minoriko/item/item_minoriko_4bf31d79.vagrp_c new file mode 100755 index 0000000..5044e50 Binary files /dev/null and b/models/thd_hero/minoriko/item/item_minoriko_4bf31d79.vagrp_c differ diff --git a/models/thd_hero/minoriko/item/minoriko.vmesh_c b/models/thd_hero/minoriko/item/minoriko.vmesh_c new file mode 100755 index 0000000..ca97f90 Binary files /dev/null and b/models/thd_hero/minoriko/item/minoriko.vmesh_c differ diff --git a/models/thd_hero/minoriko/minoriko.vmdl_c b/models/thd_hero/minoriko/minoriko.vmdl_c new file mode 100755 index 0000000..91480b0 Binary files /dev/null and b/models/thd_hero/minoriko/minoriko.vmdl_c differ diff --git a/models/thd_hero/minoriko/minoriko.vmesh_c b/models/thd_hero/minoriko/minoriko.vmesh_c new file mode 100755 index 0000000..3146421 Binary files /dev/null and b/models/thd_hero/minoriko/minoriko.vmesh_c differ diff --git a/models/thd_hero/minoriko/minoriko_2861a990.vagrp_c b/models/thd_hero/minoriko/minoriko_2861a990.vagrp_c new file mode 100755 index 0000000..6a44319 Binary files /dev/null and b/models/thd_hero/minoriko/minoriko_2861a990.vagrp_c differ diff --git a/models/thd_hero/mokou/92c561d5/attack.vanim_c b/models/thd_hero/mokou/92c561d5/attack.vanim_c new file mode 100755 index 0000000..c36ad09 Binary files /dev/null and b/models/thd_hero/mokou/92c561d5/attack.vanim_c differ diff --git a/models/thd_hero/mokou/92c561d5/attack1.vanim_c b/models/thd_hero/mokou/92c561d5/attack1.vanim_c new file mode 100755 index 0000000..7ffa969 Binary files /dev/null and b/models/thd_hero/mokou/92c561d5/attack1.vanim_c differ diff --git a/models/thd_hero/mokou/92c561d5/attack2.vanim_c b/models/thd_hero/mokou/92c561d5/attack2.vanim_c new file mode 100755 index 0000000..d4a69b0 Binary files /dev/null and b/models/thd_hero/mokou/92c561d5/attack2.vanim_c differ diff --git a/models/thd_hero/mokou/92c561d5/high_run.vanim_c b/models/thd_hero/mokou/92c561d5/high_run.vanim_c new file mode 100755 index 0000000..10071b5 Binary files /dev/null and b/models/thd_hero/mokou/92c561d5/high_run.vanim_c differ diff --git a/models/thd_hero/mokou/92c561d5/idle.vanim_c b/models/thd_hero/mokou/92c561d5/idle.vanim_c new file mode 100755 index 0000000..a5c5f82 Binary files /dev/null and b/models/thd_hero/mokou/92c561d5/idle.vanim_c differ diff --git a/models/thd_hero/mokou/92c561d5/mokou_animation.vanim_c b/models/thd_hero/mokou/92c561d5/mokou_animation.vanim_c new file mode 100755 index 0000000..b3c6834 Binary files /dev/null and b/models/thd_hero/mokou/92c561d5/mokou_animation.vanim_c differ diff --git a/models/thd_hero/mokou/92c561d5/run.vanim_c b/models/thd_hero/mokou/92c561d5/run.vanim_c new file mode 100755 index 0000000..8fb109e Binary files /dev/null and b/models/thd_hero/mokou/92c561d5/run.vanim_c differ diff --git a/models/thd_hero/mokou/item/1ab3c4e0/attack.vanim_c b/models/thd_hero/mokou/item/1ab3c4e0/attack.vanim_c new file mode 100755 index 0000000..8b77ecf Binary files /dev/null and b/models/thd_hero/mokou/item/1ab3c4e0/attack.vanim_c differ diff --git a/models/thd_hero/mokou/item/1ab3c4e0/attack1.vanim_c b/models/thd_hero/mokou/item/1ab3c4e0/attack1.vanim_c new file mode 100755 index 0000000..64e2e9c Binary files /dev/null and b/models/thd_hero/mokou/item/1ab3c4e0/attack1.vanim_c differ diff --git a/models/thd_hero/mokou/item/1ab3c4e0/attack2.vanim_c b/models/thd_hero/mokou/item/1ab3c4e0/attack2.vanim_c new file mode 100755 index 0000000..a52dd9d Binary files /dev/null and b/models/thd_hero/mokou/item/1ab3c4e0/attack2.vanim_c differ diff --git a/models/thd_hero/mokou/item/1ab3c4e0/high_run.vanim_c b/models/thd_hero/mokou/item/1ab3c4e0/high_run.vanim_c new file mode 100755 index 0000000..48a8754 Binary files /dev/null and b/models/thd_hero/mokou/item/1ab3c4e0/high_run.vanim_c differ diff --git a/models/thd_hero/mokou/item/1ab3c4e0/idle.vanim_c b/models/thd_hero/mokou/item/1ab3c4e0/idle.vanim_c new file mode 100755 index 0000000..67656e0 Binary files /dev/null and b/models/thd_hero/mokou/item/1ab3c4e0/idle.vanim_c differ diff --git a/models/thd_hero/mokou/item/1ab3c4e0/run.vanim_c b/models/thd_hero/mokou/item/1ab3c4e0/run.vanim_c new file mode 100755 index 0000000..118a4f5 Binary files /dev/null and b/models/thd_hero/mokou/item/1ab3c4e0/run.vanim_c differ diff --git a/models/thd_hero/mokou/item/item_mokou.vmdl_c b/models/thd_hero/mokou/item/item_mokou.vmdl_c new file mode 100755 index 0000000..e272156 Binary files /dev/null and b/models/thd_hero/mokou/item/item_mokou.vmdl_c differ diff --git a/models/thd_hero/mokou/item/item_mokou_1ab3c4e0.vagrp_c b/models/thd_hero/mokou/item/item_mokou_1ab3c4e0.vagrp_c new file mode 100755 index 0000000..9b7023e Binary files /dev/null and b/models/thd_hero/mokou/item/item_mokou_1ab3c4e0.vagrp_c differ diff --git a/models/thd_hero/mokou/item/mokou.vmesh_c b/models/thd_hero/mokou/item/mokou.vmesh_c new file mode 100755 index 0000000..9f5fea7 Binary files /dev/null and b/models/thd_hero/mokou/item/mokou.vmesh_c differ diff --git a/models/thd_hero/mokou/mokou.vmdl_c b/models/thd_hero/mokou/mokou.vmdl_c new file mode 100755 index 0000000..b72b51d Binary files /dev/null and b/models/thd_hero/mokou/mokou.vmdl_c differ diff --git a/models/thd_hero/mokou/mokou.vmesh_c b/models/thd_hero/mokou/mokou.vmesh_c new file mode 100755 index 0000000..8354c1e Binary files /dev/null and b/models/thd_hero/mokou/mokou.vmesh_c differ diff --git a/models/thd_hero/mokou/mokou_92c561d5.vagrp_c b/models/thd_hero/mokou/mokou_92c561d5.vagrp_c new file mode 100755 index 0000000..31ddb74 Binary files /dev/null and b/models/thd_hero/mokou/mokou_92c561d5.vagrp_c differ diff --git a/models/thd_hero/mokou/moukou.vmesh_c b/models/thd_hero/mokou/moukou.vmesh_c new file mode 100755 index 0000000..07c18f2 Binary files /dev/null and b/models/thd_hero/mokou/moukou.vmesh_c differ diff --git a/models/thd_hero/momiji/7fdbf2eb/attack1.vanim_c b/models/thd_hero/momiji/7fdbf2eb/attack1.vanim_c new file mode 100755 index 0000000..9bcfd0a Binary files /dev/null and b/models/thd_hero/momiji/7fdbf2eb/attack1.vanim_c differ diff --git a/models/thd_hero/momiji/7fdbf2eb/attack2.vanim_c b/models/thd_hero/momiji/7fdbf2eb/attack2.vanim_c new file mode 100755 index 0000000..ef54886 Binary files /dev/null and b/models/thd_hero/momiji/7fdbf2eb/attack2.vanim_c differ diff --git a/models/thd_hero/momiji/7fdbf2eb/cast1.vanim_c b/models/thd_hero/momiji/7fdbf2eb/cast1.vanim_c new file mode 100755 index 0000000..456d7a1 Binary files /dev/null and b/models/thd_hero/momiji/7fdbf2eb/cast1.vanim_c differ diff --git a/models/thd_hero/momiji/7fdbf2eb/cast2.vanim_c b/models/thd_hero/momiji/7fdbf2eb/cast2.vanim_c new file mode 100755 index 0000000..3597b57 Binary files /dev/null and b/models/thd_hero/momiji/7fdbf2eb/cast2.vanim_c differ diff --git a/models/thd_hero/momiji/7fdbf2eb/cast3.vanim_c b/models/thd_hero/momiji/7fdbf2eb/cast3.vanim_c new file mode 100755 index 0000000..fb96b7e Binary files /dev/null and b/models/thd_hero/momiji/7fdbf2eb/cast3.vanim_c differ diff --git a/models/thd_hero/momiji/7fdbf2eb/cast4.vanim_c b/models/thd_hero/momiji/7fdbf2eb/cast4.vanim_c new file mode 100755 index 0000000..6f422bf Binary files /dev/null and b/models/thd_hero/momiji/7fdbf2eb/cast4.vanim_c differ diff --git a/models/thd_hero/momiji/7fdbf2eb/idle.vanim_c b/models/thd_hero/momiji/7fdbf2eb/idle.vanim_c new file mode 100755 index 0000000..9de7c0c Binary files /dev/null and b/models/thd_hero/momiji/7fdbf2eb/idle.vanim_c differ diff --git a/models/thd_hero/momiji/7fdbf2eb/momiji_animation.vanim_c b/models/thd_hero/momiji/7fdbf2eb/momiji_animation.vanim_c new file mode 100755 index 0000000..0b03c83 Binary files /dev/null and b/models/thd_hero/momiji/7fdbf2eb/momiji_animation.vanim_c differ diff --git a/models/thd_hero/momiji/7fdbf2eb/run.vanim_c b/models/thd_hero/momiji/7fdbf2eb/run.vanim_c new file mode 100755 index 0000000..6801884 Binary files /dev/null and b/models/thd_hero/momiji/7fdbf2eb/run.vanim_c differ diff --git a/models/thd_hero/momiji/item/96d96cac/attack1.vanim_c b/models/thd_hero/momiji/item/96d96cac/attack1.vanim_c new file mode 100755 index 0000000..c5dc60f Binary files /dev/null and b/models/thd_hero/momiji/item/96d96cac/attack1.vanim_c differ diff --git a/models/thd_hero/momiji/item/96d96cac/attack2.vanim_c b/models/thd_hero/momiji/item/96d96cac/attack2.vanim_c new file mode 100755 index 0000000..415c321 Binary files /dev/null and b/models/thd_hero/momiji/item/96d96cac/attack2.vanim_c differ diff --git a/models/thd_hero/momiji/item/96d96cac/cast1.vanim_c b/models/thd_hero/momiji/item/96d96cac/cast1.vanim_c new file mode 100755 index 0000000..91d8f9f Binary files /dev/null and b/models/thd_hero/momiji/item/96d96cac/cast1.vanim_c differ diff --git a/models/thd_hero/momiji/item/96d96cac/cast2.vanim_c b/models/thd_hero/momiji/item/96d96cac/cast2.vanim_c new file mode 100755 index 0000000..9d87f39 Binary files /dev/null and b/models/thd_hero/momiji/item/96d96cac/cast2.vanim_c differ diff --git a/models/thd_hero/momiji/item/96d96cac/cast3.vanim_c b/models/thd_hero/momiji/item/96d96cac/cast3.vanim_c new file mode 100755 index 0000000..4910b15 Binary files /dev/null and b/models/thd_hero/momiji/item/96d96cac/cast3.vanim_c differ diff --git a/models/thd_hero/momiji/item/96d96cac/cast4.vanim_c b/models/thd_hero/momiji/item/96d96cac/cast4.vanim_c new file mode 100755 index 0000000..d222dd4 Binary files /dev/null and b/models/thd_hero/momiji/item/96d96cac/cast4.vanim_c differ diff --git a/models/thd_hero/momiji/item/96d96cac/idle.vanim_c b/models/thd_hero/momiji/item/96d96cac/idle.vanim_c new file mode 100755 index 0000000..2e536a1 Binary files /dev/null and b/models/thd_hero/momiji/item/96d96cac/idle.vanim_c differ diff --git a/models/thd_hero/momiji/item/96d96cac/run.vanim_c b/models/thd_hero/momiji/item/96d96cac/run.vanim_c new file mode 100755 index 0000000..9ebe2f5 Binary files /dev/null and b/models/thd_hero/momiji/item/96d96cac/run.vanim_c differ diff --git a/models/thd_hero/momiji/item/item_momiji.vmdl_c b/models/thd_hero/momiji/item/item_momiji.vmdl_c new file mode 100755 index 0000000..bed2743 Binary files /dev/null and b/models/thd_hero/momiji/item/item_momiji.vmdl_c differ diff --git a/models/thd_hero/momiji/item/item_momiji_96d96cac.vagrp_c b/models/thd_hero/momiji/item/item_momiji_96d96cac.vagrp_c new file mode 100755 index 0000000..0a2511a Binary files /dev/null and b/models/thd_hero/momiji/item/item_momiji_96d96cac.vagrp_c differ diff --git a/models/thd_hero/momiji/item/momiji.vmesh_c b/models/thd_hero/momiji/item/momiji.vmesh_c new file mode 100755 index 0000000..605620e Binary files /dev/null and b/models/thd_hero/momiji/item/momiji.vmesh_c differ diff --git a/models/thd_hero/momiji/momiji.vmdl_c b/models/thd_hero/momiji/momiji.vmdl_c new file mode 100755 index 0000000..771a7b1 Binary files /dev/null and b/models/thd_hero/momiji/momiji.vmdl_c differ diff --git a/models/thd_hero/momiji/momiji.vmesh_c b/models/thd_hero/momiji/momiji.vmesh_c new file mode 100755 index 0000000..838a4f6 Binary files /dev/null and b/models/thd_hero/momiji/momiji.vmesh_c differ diff --git a/models/thd_hero/momiji/momiji_7fdbf2eb.vagrp_c b/models/thd_hero/momiji/momiji_7fdbf2eb.vagrp_c new file mode 100755 index 0000000..6bbb781 Binary files /dev/null and b/models/thd_hero/momiji/momiji_7fdbf2eb.vagrp_c differ diff --git a/models/thd_hero/mugiyousei/07581c5b/attack.vanim_c b/models/thd_hero/mugiyousei/07581c5b/attack.vanim_c new file mode 100755 index 0000000..567784d Binary files /dev/null and b/models/thd_hero/mugiyousei/07581c5b/attack.vanim_c differ diff --git a/models/thd_hero/mugiyousei/07581c5b/idle.vanim_c b/models/thd_hero/mugiyousei/07581c5b/idle.vanim_c new file mode 100755 index 0000000..da49c8d Binary files /dev/null and b/models/thd_hero/mugiyousei/07581c5b/idle.vanim_c differ diff --git a/models/thd_hero/mugiyousei/07581c5b/run.vanim_c b/models/thd_hero/mugiyousei/07581c5b/run.vanim_c new file mode 100755 index 0000000..46cc496 Binary files /dev/null and b/models/thd_hero/mugiyousei/07581c5b/run.vanim_c differ diff --git a/models/thd_hero/mugiyousei/item/50928cdf/attack.vanim_c b/models/thd_hero/mugiyousei/item/50928cdf/attack.vanim_c new file mode 100755 index 0000000..a2fcf00 Binary files /dev/null and b/models/thd_hero/mugiyousei/item/50928cdf/attack.vanim_c differ diff --git a/models/thd_hero/mugiyousei/item/50928cdf/idle.vanim_c b/models/thd_hero/mugiyousei/item/50928cdf/idle.vanim_c new file mode 100755 index 0000000..995fc83 Binary files /dev/null and b/models/thd_hero/mugiyousei/item/50928cdf/idle.vanim_c differ diff --git a/models/thd_hero/mugiyousei/item/50928cdf/run.vanim_c b/models/thd_hero/mugiyousei/item/50928cdf/run.vanim_c new file mode 100755 index 0000000..4c23320 Binary files /dev/null and b/models/thd_hero/mugiyousei/item/50928cdf/run.vanim_c differ diff --git a/models/thd_hero/mugiyousei/item/item_mujiyousei.vmdl_c b/models/thd_hero/mugiyousei/item/item_mujiyousei.vmdl_c new file mode 100755 index 0000000..8bacd2c Binary files /dev/null and b/models/thd_hero/mugiyousei/item/item_mujiyousei.vmdl_c differ diff --git a/models/thd_hero/mugiyousei/item/item_mujiyousei_50928cdf.vagrp_c b/models/thd_hero/mugiyousei/item/item_mujiyousei_50928cdf.vagrp_c new file mode 100755 index 0000000..0be0271 Binary files /dev/null and b/models/thd_hero/mugiyousei/item/item_mujiyousei_50928cdf.vagrp_c differ diff --git a/models/thd_hero/mugiyousei/item/mugiyousei.vmesh_c b/models/thd_hero/mugiyousei/item/mugiyousei.vmesh_c new file mode 100755 index 0000000..3451eb0 Binary files /dev/null and b/models/thd_hero/mugiyousei/item/mugiyousei.vmesh_c differ diff --git a/models/thd_hero/mugiyousei/mugiyousei.vmdl_c b/models/thd_hero/mugiyousei/mugiyousei.vmdl_c new file mode 100755 index 0000000..0f3e7bd Binary files /dev/null and b/models/thd_hero/mugiyousei/mugiyousei.vmdl_c differ diff --git a/models/thd_hero/mugiyousei/mugiyousei.vmesh_c b/models/thd_hero/mugiyousei/mugiyousei.vmesh_c new file mode 100755 index 0000000..d296f29 Binary files /dev/null and b/models/thd_hero/mugiyousei/mugiyousei.vmesh_c differ diff --git a/models/thd_hero/mugiyousei/mugiyousei_07581c5b.vagrp_c b/models/thd_hero/mugiyousei/mugiyousei_07581c5b.vagrp_c new file mode 100755 index 0000000..0213ef5 Binary files /dev/null and b/models/thd_hero/mugiyousei/mugiyousei_07581c5b.vagrp_c differ diff --git a/models/thd_hero/mystia/5f6879ca/attack.vanim_c b/models/thd_hero/mystia/5f6879ca/attack.vanim_c new file mode 100755 index 0000000..e4ab261 Binary files /dev/null and b/models/thd_hero/mystia/5f6879ca/attack.vanim_c differ diff --git a/models/thd_hero/mystia/5f6879ca/attack2.vanim_c b/models/thd_hero/mystia/5f6879ca/attack2.vanim_c new file mode 100755 index 0000000..26ba36e Binary files /dev/null and b/models/thd_hero/mystia/5f6879ca/attack2.vanim_c differ diff --git a/models/thd_hero/mystia/5f6879ca/cast.vanim_c b/models/thd_hero/mystia/5f6879ca/cast.vanim_c new file mode 100755 index 0000000..48e96a9 Binary files /dev/null and b/models/thd_hero/mystia/5f6879ca/cast.vanim_c differ diff --git a/models/thd_hero/mystia/5f6879ca/idle.vanim_c b/models/thd_hero/mystia/5f6879ca/idle.vanim_c new file mode 100755 index 0000000..adedc91 Binary files /dev/null and b/models/thd_hero/mystia/5f6879ca/idle.vanim_c differ diff --git a/models/thd_hero/mystia/5f6879ca/por.vanim_c b/models/thd_hero/mystia/5f6879ca/por.vanim_c new file mode 100755 index 0000000..41f6c6c Binary files /dev/null and b/models/thd_hero/mystia/5f6879ca/por.vanim_c differ diff --git a/models/thd_hero/mystia/5f6879ca/run.vanim_c b/models/thd_hero/mystia/5f6879ca/run.vanim_c new file mode 100755 index 0000000..47244ce Binary files /dev/null and b/models/thd_hero/mystia/5f6879ca/run.vanim_c differ diff --git a/models/thd_hero/mystia/cloth01/65ea72fa/attack1.vanim_c b/models/thd_hero/mystia/cloth01/65ea72fa/attack1.vanim_c new file mode 100755 index 0000000..4613329 Binary files /dev/null and b/models/thd_hero/mystia/cloth01/65ea72fa/attack1.vanim_c differ diff --git a/models/thd_hero/mystia/cloth01/65ea72fa/attack2.vanim_c b/models/thd_hero/mystia/cloth01/65ea72fa/attack2.vanim_c new file mode 100755 index 0000000..e44fd54 Binary files /dev/null and b/models/thd_hero/mystia/cloth01/65ea72fa/attack2.vanim_c differ diff --git a/models/thd_hero/mystia/cloth01/65ea72fa/cast.vanim_c b/models/thd_hero/mystia/cloth01/65ea72fa/cast.vanim_c new file mode 100755 index 0000000..09be266 Binary files /dev/null and b/models/thd_hero/mystia/cloth01/65ea72fa/cast.vanim_c differ diff --git a/models/thd_hero/mystia/cloth01/65ea72fa/idle.vanim_c b/models/thd_hero/mystia/cloth01/65ea72fa/idle.vanim_c new file mode 100755 index 0000000..84d5a28 Binary files /dev/null and b/models/thd_hero/mystia/cloth01/65ea72fa/idle.vanim_c differ diff --git a/models/thd_hero/mystia/cloth01/65ea72fa/mystia_cloth01_animation.vanim_c b/models/thd_hero/mystia/cloth01/65ea72fa/mystia_cloth01_animation.vanim_c new file mode 100755 index 0000000..44d5476 Binary files /dev/null and b/models/thd_hero/mystia/cloth01/65ea72fa/mystia_cloth01_animation.vanim_c differ diff --git a/models/thd_hero/mystia/cloth01/65ea72fa/run.vanim_c b/models/thd_hero/mystia/cloth01/65ea72fa/run.vanim_c new file mode 100755 index 0000000..0ac5808 Binary files /dev/null and b/models/thd_hero/mystia/cloth01/65ea72fa/run.vanim_c differ diff --git a/models/thd_hero/mystia/cloth01/mystia_cloth01.vmdl_c b/models/thd_hero/mystia/cloth01/mystia_cloth01.vmdl_c new file mode 100755 index 0000000..c462e74 Binary files /dev/null and b/models/thd_hero/mystia/cloth01/mystia_cloth01.vmdl_c differ diff --git a/models/thd_hero/mystia/cloth01/mystia_cloth01.vmesh_c b/models/thd_hero/mystia/cloth01/mystia_cloth01.vmesh_c new file mode 100755 index 0000000..bb0c654 Binary files /dev/null and b/models/thd_hero/mystia/cloth01/mystia_cloth01.vmesh_c differ diff --git a/models/thd_hero/mystia/cloth01/mystia_cloth01_65ea72fa.vagrp_c b/models/thd_hero/mystia/cloth01/mystia_cloth01_65ea72fa.vagrp_c new file mode 100755 index 0000000..b8d6cc6 Binary files /dev/null and b/models/thd_hero/mystia/cloth01/mystia_cloth01_65ea72fa.vagrp_c differ diff --git a/models/thd_hero/mystia/item/3af1049e/attack.vanim_c b/models/thd_hero/mystia/item/3af1049e/attack.vanim_c new file mode 100755 index 0000000..4845139 Binary files /dev/null and b/models/thd_hero/mystia/item/3af1049e/attack.vanim_c differ diff --git a/models/thd_hero/mystia/item/3af1049e/attack2.vanim_c b/models/thd_hero/mystia/item/3af1049e/attack2.vanim_c new file mode 100755 index 0000000..7b9a469 Binary files /dev/null and b/models/thd_hero/mystia/item/3af1049e/attack2.vanim_c differ diff --git a/models/thd_hero/mystia/item/3af1049e/cast.vanim_c b/models/thd_hero/mystia/item/3af1049e/cast.vanim_c new file mode 100755 index 0000000..a0f1b4d Binary files /dev/null and b/models/thd_hero/mystia/item/3af1049e/cast.vanim_c differ diff --git a/models/thd_hero/mystia/item/3af1049e/idle.vanim_c b/models/thd_hero/mystia/item/3af1049e/idle.vanim_c new file mode 100755 index 0000000..997ae31 Binary files /dev/null and b/models/thd_hero/mystia/item/3af1049e/idle.vanim_c differ diff --git a/models/thd_hero/mystia/item/3af1049e/por.vanim_c b/models/thd_hero/mystia/item/3af1049e/por.vanim_c new file mode 100755 index 0000000..475f955 Binary files /dev/null and b/models/thd_hero/mystia/item/3af1049e/por.vanim_c differ diff --git a/models/thd_hero/mystia/item/3af1049e/run.vanim_c b/models/thd_hero/mystia/item/3af1049e/run.vanim_c new file mode 100755 index 0000000..b9c9b38 Binary files /dev/null and b/models/thd_hero/mystia/item/3af1049e/run.vanim_c differ diff --git a/models/thd_hero/mystia/item/item_mystia.vmdl_c b/models/thd_hero/mystia/item/item_mystia.vmdl_c new file mode 100755 index 0000000..09813e5 Binary files /dev/null and b/models/thd_hero/mystia/item/item_mystia.vmdl_c differ diff --git a/models/thd_hero/mystia/item/item_mystia_3af1049e.vagrp_c b/models/thd_hero/mystia/item/item_mystia_3af1049e.vagrp_c new file mode 100755 index 0000000..c40c83e Binary files /dev/null and b/models/thd_hero/mystia/item/item_mystia_3af1049e.vagrp_c differ diff --git a/models/thd_hero/mystia/item/mystia.vmesh_c b/models/thd_hero/mystia/item/mystia.vmesh_c new file mode 100755 index 0000000..8754525 Binary files /dev/null and b/models/thd_hero/mystia/item/mystia.vmesh_c differ diff --git a/models/thd_hero/mystia/mystia.vmdl_c b/models/thd_hero/mystia/mystia.vmdl_c new file mode 100755 index 0000000..77c9af4 Binary files /dev/null and b/models/thd_hero/mystia/mystia.vmdl_c differ diff --git a/models/thd_hero/mystia/mystia.vmesh_c b/models/thd_hero/mystia/mystia.vmesh_c new file mode 100755 index 0000000..f3fdc78 Binary files /dev/null and b/models/thd_hero/mystia/mystia.vmesh_c differ diff --git a/models/thd_hero/mystia/mystia_5f6879ca.vagrp_c b/models/thd_hero/mystia/mystia_5f6879ca.vagrp_c new file mode 100755 index 0000000..15c6f0d Binary files /dev/null and b/models/thd_hero/mystia/mystia_5f6879ca.vagrp_c differ diff --git a/models/thd_hero/nazrin/c19f0afb/attack1.vanim_c b/models/thd_hero/nazrin/c19f0afb/attack1.vanim_c new file mode 100755 index 0000000..ecc5e10 Binary files /dev/null and b/models/thd_hero/nazrin/c19f0afb/attack1.vanim_c differ diff --git a/models/thd_hero/nazrin/c19f0afb/attack2.vanim_c b/models/thd_hero/nazrin/c19f0afb/attack2.vanim_c new file mode 100755 index 0000000..2389c14 Binary files /dev/null and b/models/thd_hero/nazrin/c19f0afb/attack2.vanim_c differ diff --git a/models/thd_hero/nazrin/c19f0afb/attack3.vanim_c b/models/thd_hero/nazrin/c19f0afb/attack3.vanim_c new file mode 100755 index 0000000..072bf60 Binary files /dev/null and b/models/thd_hero/nazrin/c19f0afb/attack3.vanim_c differ diff --git a/models/thd_hero/nazrin/c19f0afb/cast1.vanim_c b/models/thd_hero/nazrin/c19f0afb/cast1.vanim_c new file mode 100755 index 0000000..39a50c3 Binary files /dev/null and b/models/thd_hero/nazrin/c19f0afb/cast1.vanim_c differ diff --git a/models/thd_hero/nazrin/c19f0afb/cast2.vanim_c b/models/thd_hero/nazrin/c19f0afb/cast2.vanim_c new file mode 100755 index 0000000..d5c9bc6 Binary files /dev/null and b/models/thd_hero/nazrin/c19f0afb/cast2.vanim_c differ diff --git a/models/thd_hero/nazrin/c19f0afb/idle.vanim_c b/models/thd_hero/nazrin/c19f0afb/idle.vanim_c new file mode 100755 index 0000000..8be4b28 Binary files /dev/null and b/models/thd_hero/nazrin/c19f0afb/idle.vanim_c differ diff --git a/models/thd_hero/nazrin/c19f0afb/idle2.vanim_c b/models/thd_hero/nazrin/c19f0afb/idle2.vanim_c new file mode 100755 index 0000000..10a4d63 Binary files /dev/null and b/models/thd_hero/nazrin/c19f0afb/idle2.vanim_c differ diff --git a/models/thd_hero/nazrin/c19f0afb/impatient.vanim_c b/models/thd_hero/nazrin/c19f0afb/impatient.vanim_c new file mode 100755 index 0000000..d658ad0 Binary files /dev/null and b/models/thd_hero/nazrin/c19f0afb/impatient.vanim_c differ diff --git a/models/thd_hero/nazrin/c19f0afb/por.vanim_c b/models/thd_hero/nazrin/c19f0afb/por.vanim_c new file mode 100755 index 0000000..3720bcf Binary files /dev/null and b/models/thd_hero/nazrin/c19f0afb/por.vanim_c differ diff --git a/models/thd_hero/nazrin/c19f0afb/run.vanim_c b/models/thd_hero/nazrin/c19f0afb/run.vanim_c new file mode 100755 index 0000000..902fbdc Binary files /dev/null and b/models/thd_hero/nazrin/c19f0afb/run.vanim_c differ diff --git a/models/thd_hero/nazrin/item/2cc35bc7/attack1.vanim_c b/models/thd_hero/nazrin/item/2cc35bc7/attack1.vanim_c new file mode 100755 index 0000000..a8a34a1 Binary files /dev/null and b/models/thd_hero/nazrin/item/2cc35bc7/attack1.vanim_c differ diff --git a/models/thd_hero/nazrin/item/2cc35bc7/attack2.vanim_c b/models/thd_hero/nazrin/item/2cc35bc7/attack2.vanim_c new file mode 100755 index 0000000..d0e60dd Binary files /dev/null and b/models/thd_hero/nazrin/item/2cc35bc7/attack2.vanim_c differ diff --git a/models/thd_hero/nazrin/item/2cc35bc7/attack3.vanim_c b/models/thd_hero/nazrin/item/2cc35bc7/attack3.vanim_c new file mode 100755 index 0000000..843329a Binary files /dev/null and b/models/thd_hero/nazrin/item/2cc35bc7/attack3.vanim_c differ diff --git a/models/thd_hero/nazrin/item/2cc35bc7/cast1.vanim_c b/models/thd_hero/nazrin/item/2cc35bc7/cast1.vanim_c new file mode 100755 index 0000000..7b86f4f Binary files /dev/null and b/models/thd_hero/nazrin/item/2cc35bc7/cast1.vanim_c differ diff --git a/models/thd_hero/nazrin/item/2cc35bc7/cast2.vanim_c b/models/thd_hero/nazrin/item/2cc35bc7/cast2.vanim_c new file mode 100755 index 0000000..b6bd023 Binary files /dev/null and b/models/thd_hero/nazrin/item/2cc35bc7/cast2.vanim_c differ diff --git a/models/thd_hero/nazrin/item/2cc35bc7/idle.vanim_c b/models/thd_hero/nazrin/item/2cc35bc7/idle.vanim_c new file mode 100755 index 0000000..25790d2 Binary files /dev/null and b/models/thd_hero/nazrin/item/2cc35bc7/idle.vanim_c differ diff --git a/models/thd_hero/nazrin/item/2cc35bc7/idle2.vanim_c b/models/thd_hero/nazrin/item/2cc35bc7/idle2.vanim_c new file mode 100755 index 0000000..0dcc461 Binary files /dev/null and b/models/thd_hero/nazrin/item/2cc35bc7/idle2.vanim_c differ diff --git a/models/thd_hero/nazrin/item/2cc35bc7/impatient.vanim_c b/models/thd_hero/nazrin/item/2cc35bc7/impatient.vanim_c new file mode 100755 index 0000000..0ffb040 Binary files /dev/null and b/models/thd_hero/nazrin/item/2cc35bc7/impatient.vanim_c differ diff --git a/models/thd_hero/nazrin/item/2cc35bc7/por.vanim_c b/models/thd_hero/nazrin/item/2cc35bc7/por.vanim_c new file mode 100755 index 0000000..7064950 Binary files /dev/null and b/models/thd_hero/nazrin/item/2cc35bc7/por.vanim_c differ diff --git a/models/thd_hero/nazrin/item/2cc35bc7/run.vanim_c b/models/thd_hero/nazrin/item/2cc35bc7/run.vanim_c new file mode 100755 index 0000000..1f3cfbb Binary files /dev/null and b/models/thd_hero/nazrin/item/2cc35bc7/run.vanim_c differ diff --git a/models/thd_hero/nazrin/item/item_nazrin.vmdl_c b/models/thd_hero/nazrin/item/item_nazrin.vmdl_c new file mode 100755 index 0000000..e997b97 Binary files /dev/null and b/models/thd_hero/nazrin/item/item_nazrin.vmdl_c differ diff --git a/models/thd_hero/nazrin/item/item_nazrin_2cc35bc7.vagrp_c b/models/thd_hero/nazrin/item/item_nazrin_2cc35bc7.vagrp_c new file mode 100755 index 0000000..718396f Binary files /dev/null and b/models/thd_hero/nazrin/item/item_nazrin_2cc35bc7.vagrp_c differ diff --git a/models/thd_hero/nazrin/item/nazrin.vmesh_c b/models/thd_hero/nazrin/item/nazrin.vmesh_c new file mode 100755 index 0000000..884a487 Binary files /dev/null and b/models/thd_hero/nazrin/item/nazrin.vmesh_c differ diff --git a/models/thd_hero/nazrin/nazrin.vmdl_c b/models/thd_hero/nazrin/nazrin.vmdl_c new file mode 100755 index 0000000..8272889 Binary files /dev/null and b/models/thd_hero/nazrin/nazrin.vmdl_c differ diff --git a/models/thd_hero/nazrin/nazrin.vmesh_c b/models/thd_hero/nazrin/nazrin.vmesh_c new file mode 100755 index 0000000..a7ae12f Binary files /dev/null and b/models/thd_hero/nazrin/nazrin.vmesh_c differ diff --git a/models/thd_hero/nazrin/nazrin_c19f0afb.vagrp_c b/models/thd_hero/nazrin/nazrin_c19f0afb.vagrp_c new file mode 100755 index 0000000..ca436a2 Binary files /dev/null and b/models/thd_hero/nazrin/nazrin_c19f0afb.vagrp_c differ diff --git a/models/thd_hero/nitori/5cad6d1c/attack.vanim_c b/models/thd_hero/nitori/5cad6d1c/attack.vanim_c new file mode 100755 index 0000000..b032e1c Binary files /dev/null and b/models/thd_hero/nitori/5cad6d1c/attack.vanim_c differ diff --git a/models/thd_hero/nitori/5cad6d1c/attack12.vanim_c b/models/thd_hero/nitori/5cad6d1c/attack12.vanim_c new file mode 100755 index 0000000..54818ad Binary files /dev/null and b/models/thd_hero/nitori/5cad6d1c/attack12.vanim_c differ diff --git a/models/thd_hero/nitori/5cad6d1c/attack2.vanim_c b/models/thd_hero/nitori/5cad6d1c/attack2.vanim_c new file mode 100755 index 0000000..70dee2f Binary files /dev/null and b/models/thd_hero/nitori/5cad6d1c/attack2.vanim_c differ diff --git a/models/thd_hero/nitori/5cad6d1c/idle.vanim_c b/models/thd_hero/nitori/5cad6d1c/idle.vanim_c new file mode 100755 index 0000000..0e825c8 Binary files /dev/null and b/models/thd_hero/nitori/5cad6d1c/idle.vanim_c differ diff --git a/models/thd_hero/nitori/5cad6d1c/idle2.vanim_c b/models/thd_hero/nitori/5cad6d1c/idle2.vanim_c new file mode 100755 index 0000000..9b63685 Binary files /dev/null and b/models/thd_hero/nitori/5cad6d1c/idle2.vanim_c differ diff --git a/models/thd_hero/nitori/5cad6d1c/nitori_animation.vanim_c b/models/thd_hero/nitori/5cad6d1c/nitori_animation.vanim_c new file mode 100755 index 0000000..99047c8 Binary files /dev/null and b/models/thd_hero/nitori/5cad6d1c/nitori_animation.vanim_c differ diff --git a/models/thd_hero/nitori/5cad6d1c/run.vanim_c b/models/thd_hero/nitori/5cad6d1c/run.vanim_c new file mode 100755 index 0000000..18d848c Binary files /dev/null and b/models/thd_hero/nitori/5cad6d1c/run.vanim_c differ diff --git a/models/thd_hero/nitori/item/e33bf670/attack.vanim_c b/models/thd_hero/nitori/item/e33bf670/attack.vanim_c new file mode 100755 index 0000000..94436f9 Binary files /dev/null and b/models/thd_hero/nitori/item/e33bf670/attack.vanim_c differ diff --git a/models/thd_hero/nitori/item/e33bf670/attack12.vanim_c b/models/thd_hero/nitori/item/e33bf670/attack12.vanim_c new file mode 100755 index 0000000..7104a5a Binary files /dev/null and b/models/thd_hero/nitori/item/e33bf670/attack12.vanim_c differ diff --git a/models/thd_hero/nitori/item/e33bf670/attack2.vanim_c b/models/thd_hero/nitori/item/e33bf670/attack2.vanim_c new file mode 100755 index 0000000..f83dbd6 Binary files /dev/null and b/models/thd_hero/nitori/item/e33bf670/attack2.vanim_c differ diff --git a/models/thd_hero/nitori/item/e33bf670/idle.vanim_c b/models/thd_hero/nitori/item/e33bf670/idle.vanim_c new file mode 100755 index 0000000..08a401c Binary files /dev/null and b/models/thd_hero/nitori/item/e33bf670/idle.vanim_c differ diff --git a/models/thd_hero/nitori/item/e33bf670/idle2.vanim_c b/models/thd_hero/nitori/item/e33bf670/idle2.vanim_c new file mode 100755 index 0000000..f5cc807 Binary files /dev/null and b/models/thd_hero/nitori/item/e33bf670/idle2.vanim_c differ diff --git a/models/thd_hero/nitori/item/e33bf670/run.vanim_c b/models/thd_hero/nitori/item/e33bf670/run.vanim_c new file mode 100755 index 0000000..e7b11d3 Binary files /dev/null and b/models/thd_hero/nitori/item/e33bf670/run.vanim_c differ diff --git a/models/thd_hero/nitori/item/item_nitori.vmdl_c b/models/thd_hero/nitori/item/item_nitori.vmdl_c new file mode 100755 index 0000000..2a0df2d Binary files /dev/null and b/models/thd_hero/nitori/item/item_nitori.vmdl_c differ diff --git a/models/thd_hero/nitori/item/item_nitori_e33bf670.vagrp_c b/models/thd_hero/nitori/item/item_nitori_e33bf670.vagrp_c new file mode 100755 index 0000000..825815c Binary files /dev/null and b/models/thd_hero/nitori/item/item_nitori_e33bf670.vagrp_c differ diff --git a/models/thd_hero/nitori/item/nitori.vmesh_c b/models/thd_hero/nitori/item/nitori.vmesh_c new file mode 100755 index 0000000..58ca526 Binary files /dev/null and b/models/thd_hero/nitori/item/nitori.vmesh_c differ diff --git a/models/thd_hero/nitori/nitori.vmdl_c b/models/thd_hero/nitori/nitori.vmdl_c new file mode 100755 index 0000000..dbf545a Binary files /dev/null and b/models/thd_hero/nitori/nitori.vmdl_c differ diff --git a/models/thd_hero/nitori/nitori.vmesh_c b/models/thd_hero/nitori/nitori.vmesh_c new file mode 100755 index 0000000..62245c9 Binary files /dev/null and b/models/thd_hero/nitori/nitori.vmesh_c differ diff --git a/models/thd_hero/nitori/nitori_5cad6d1c.vagrp_c b/models/thd_hero/nitori/nitori_5cad6d1c.vagrp_c new file mode 100755 index 0000000..c115bed Binary files /dev/null and b/models/thd_hero/nitori/nitori_5cad6d1c.vagrp_c differ diff --git a/models/thd_hero/nue/510a20a7/attack.vanim_c b/models/thd_hero/nue/510a20a7/attack.vanim_c new file mode 100755 index 0000000..d4054b8 Binary files /dev/null and b/models/thd_hero/nue/510a20a7/attack.vanim_c differ diff --git a/models/thd_hero/nue/510a20a7/cast1.vanim_c b/models/thd_hero/nue/510a20a7/cast1.vanim_c new file mode 100755 index 0000000..ebfa154 Binary files /dev/null and b/models/thd_hero/nue/510a20a7/cast1.vanim_c differ diff --git a/models/thd_hero/nue/510a20a7/cast2.vanim_c b/models/thd_hero/nue/510a20a7/cast2.vanim_c new file mode 100755 index 0000000..2cad2c5 Binary files /dev/null and b/models/thd_hero/nue/510a20a7/cast2.vanim_c differ diff --git a/models/thd_hero/nue/510a20a7/idle.vanim_c b/models/thd_hero/nue/510a20a7/idle.vanim_c new file mode 100755 index 0000000..0ab5d9a Binary files /dev/null and b/models/thd_hero/nue/510a20a7/idle.vanim_c differ diff --git a/models/thd_hero/nue/510a20a7/idle2.vanim_c b/models/thd_hero/nue/510a20a7/idle2.vanim_c new file mode 100755 index 0000000..55c66af Binary files /dev/null and b/models/thd_hero/nue/510a20a7/idle2.vanim_c differ diff --git a/models/thd_hero/nue/510a20a7/nue_animation.vanim_c b/models/thd_hero/nue/510a20a7/nue_animation.vanim_c new file mode 100755 index 0000000..18982a8 Binary files /dev/null and b/models/thd_hero/nue/510a20a7/nue_animation.vanim_c differ diff --git a/models/thd_hero/nue/510a20a7/ready_idle.vanim_c b/models/thd_hero/nue/510a20a7/ready_idle.vanim_c new file mode 100755 index 0000000..554248a Binary files /dev/null and b/models/thd_hero/nue/510a20a7/ready_idle.vanim_c differ diff --git a/models/thd_hero/nue/510a20a7/run.vanim_c b/models/thd_hero/nue/510a20a7/run.vanim_c new file mode 100755 index 0000000..14be55e Binary files /dev/null and b/models/thd_hero/nue/510a20a7/run.vanim_c differ diff --git a/models/thd_hero/nue/item/bdcc2cb1/attack.vanim_c b/models/thd_hero/nue/item/bdcc2cb1/attack.vanim_c new file mode 100755 index 0000000..27a642d Binary files /dev/null and b/models/thd_hero/nue/item/bdcc2cb1/attack.vanim_c differ diff --git a/models/thd_hero/nue/item/bdcc2cb1/cast1.vanim_c b/models/thd_hero/nue/item/bdcc2cb1/cast1.vanim_c new file mode 100755 index 0000000..f605c08 Binary files /dev/null and b/models/thd_hero/nue/item/bdcc2cb1/cast1.vanim_c differ diff --git a/models/thd_hero/nue/item/bdcc2cb1/cast2.vanim_c b/models/thd_hero/nue/item/bdcc2cb1/cast2.vanim_c new file mode 100755 index 0000000..a404da7 Binary files /dev/null and b/models/thd_hero/nue/item/bdcc2cb1/cast2.vanim_c differ diff --git a/models/thd_hero/nue/item/bdcc2cb1/idle.vanim_c b/models/thd_hero/nue/item/bdcc2cb1/idle.vanim_c new file mode 100755 index 0000000..1db175b Binary files /dev/null and b/models/thd_hero/nue/item/bdcc2cb1/idle.vanim_c differ diff --git a/models/thd_hero/nue/item/bdcc2cb1/idle2.vanim_c b/models/thd_hero/nue/item/bdcc2cb1/idle2.vanim_c new file mode 100755 index 0000000..9dd7885 Binary files /dev/null and b/models/thd_hero/nue/item/bdcc2cb1/idle2.vanim_c differ diff --git a/models/thd_hero/nue/item/bdcc2cb1/ready_idle.vanim_c b/models/thd_hero/nue/item/bdcc2cb1/ready_idle.vanim_c new file mode 100755 index 0000000..9e922d2 Binary files /dev/null and b/models/thd_hero/nue/item/bdcc2cb1/ready_idle.vanim_c differ diff --git a/models/thd_hero/nue/item/bdcc2cb1/run.vanim_c b/models/thd_hero/nue/item/bdcc2cb1/run.vanim_c new file mode 100755 index 0000000..5fa5fa8 Binary files /dev/null and b/models/thd_hero/nue/item/bdcc2cb1/run.vanim_c differ diff --git a/models/thd_hero/nue/item/item_nue.vmdl_c b/models/thd_hero/nue/item/item_nue.vmdl_c new file mode 100755 index 0000000..d2b51d4 Binary files /dev/null and b/models/thd_hero/nue/item/item_nue.vmdl_c differ diff --git a/models/thd_hero/nue/item/item_nue_bdcc2cb1.vagrp_c b/models/thd_hero/nue/item/item_nue_bdcc2cb1.vagrp_c new file mode 100755 index 0000000..85a2079 Binary files /dev/null and b/models/thd_hero/nue/item/item_nue_bdcc2cb1.vagrp_c differ diff --git a/models/thd_hero/nue/item/nue.vmesh_c b/models/thd_hero/nue/item/nue.vmesh_c new file mode 100755 index 0000000..478c343 Binary files /dev/null and b/models/thd_hero/nue/item/nue.vmesh_c differ diff --git a/models/thd_hero/nue/nue.vmdl_c b/models/thd_hero/nue/nue.vmdl_c new file mode 100755 index 0000000..7c70caa Binary files /dev/null and b/models/thd_hero/nue/nue.vmdl_c differ diff --git a/models/thd_hero/nue/nue.vmesh_c b/models/thd_hero/nue/nue.vmesh_c new file mode 100755 index 0000000..5a41924 Binary files /dev/null and b/models/thd_hero/nue/nue.vmesh_c differ diff --git a/models/thd_hero/nue/nue_510a20a7.vagrp_c b/models/thd_hero/nue/nue_510a20a7.vagrp_c new file mode 100755 index 0000000..2ce93c0 Binary files /dev/null and b/models/thd_hero/nue/nue_510a20a7.vagrp_c differ diff --git a/models/thd_hero/parsee/e7bb2331/attack1.vanim_c b/models/thd_hero/parsee/e7bb2331/attack1.vanim_c new file mode 100755 index 0000000..5bb97f8 Binary files /dev/null and b/models/thd_hero/parsee/e7bb2331/attack1.vanim_c differ diff --git a/models/thd_hero/parsee/e7bb2331/attack2.vanim_c b/models/thd_hero/parsee/e7bb2331/attack2.vanim_c new file mode 100755 index 0000000..26be598 Binary files /dev/null and b/models/thd_hero/parsee/e7bb2331/attack2.vanim_c differ diff --git a/models/thd_hero/parsee/e7bb2331/cast.vanim_c b/models/thd_hero/parsee/e7bb2331/cast.vanim_c new file mode 100755 index 0000000..5e23447 Binary files /dev/null and b/models/thd_hero/parsee/e7bb2331/cast.vanim_c differ diff --git a/models/thd_hero/parsee/e7bb2331/idle.vanim_c b/models/thd_hero/parsee/e7bb2331/idle.vanim_c new file mode 100755 index 0000000..6ec38c4 Binary files /dev/null and b/models/thd_hero/parsee/e7bb2331/idle.vanim_c differ diff --git a/models/thd_hero/parsee/e7bb2331/parsee_animation.vanim_c b/models/thd_hero/parsee/e7bb2331/parsee_animation.vanim_c new file mode 100755 index 0000000..2f27020 Binary files /dev/null and b/models/thd_hero/parsee/e7bb2331/parsee_animation.vanim_c differ diff --git a/models/thd_hero/parsee/e7bb2331/run.vanim_c b/models/thd_hero/parsee/e7bb2331/run.vanim_c new file mode 100755 index 0000000..016034d Binary files /dev/null and b/models/thd_hero/parsee/e7bb2331/run.vanim_c differ diff --git a/models/thd_hero/parsee/item/90179073/attack1.vanim_c b/models/thd_hero/parsee/item/90179073/attack1.vanim_c new file mode 100755 index 0000000..bbab001 Binary files /dev/null and b/models/thd_hero/parsee/item/90179073/attack1.vanim_c differ diff --git a/models/thd_hero/parsee/item/90179073/attack2.vanim_c b/models/thd_hero/parsee/item/90179073/attack2.vanim_c new file mode 100755 index 0000000..847c49d Binary files /dev/null and b/models/thd_hero/parsee/item/90179073/attack2.vanim_c differ diff --git a/models/thd_hero/parsee/item/90179073/cast.vanim_c b/models/thd_hero/parsee/item/90179073/cast.vanim_c new file mode 100755 index 0000000..2babf8f Binary files /dev/null and b/models/thd_hero/parsee/item/90179073/cast.vanim_c differ diff --git a/models/thd_hero/parsee/item/90179073/idle.vanim_c b/models/thd_hero/parsee/item/90179073/idle.vanim_c new file mode 100755 index 0000000..7a308ee Binary files /dev/null and b/models/thd_hero/parsee/item/90179073/idle.vanim_c differ diff --git a/models/thd_hero/parsee/item/90179073/run.vanim_c b/models/thd_hero/parsee/item/90179073/run.vanim_c new file mode 100755 index 0000000..a7d69ae Binary files /dev/null and b/models/thd_hero/parsee/item/90179073/run.vanim_c differ diff --git a/models/thd_hero/parsee/item/item_parsee.vmdl_c b/models/thd_hero/parsee/item/item_parsee.vmdl_c new file mode 100755 index 0000000..da8a471 Binary files /dev/null and b/models/thd_hero/parsee/item/item_parsee.vmdl_c differ diff --git a/models/thd_hero/parsee/item/item_parsee_90179073.vagrp_c b/models/thd_hero/parsee/item/item_parsee_90179073.vagrp_c new file mode 100755 index 0000000..9ed554b Binary files /dev/null and b/models/thd_hero/parsee/item/item_parsee_90179073.vagrp_c differ diff --git a/models/thd_hero/parsee/item/parsee.vmesh_c b/models/thd_hero/parsee/item/parsee.vmesh_c new file mode 100755 index 0000000..8a9da32 Binary files /dev/null and b/models/thd_hero/parsee/item/parsee.vmesh_c differ diff --git a/models/thd_hero/parsee/parsee.vmdl_c b/models/thd_hero/parsee/parsee.vmdl_c new file mode 100755 index 0000000..9bc1508 Binary files /dev/null and b/models/thd_hero/parsee/parsee.vmdl_c differ diff --git a/models/thd_hero/parsee/parsee.vmesh_c b/models/thd_hero/parsee/parsee.vmesh_c new file mode 100755 index 0000000..c0efe1c Binary files /dev/null and b/models/thd_hero/parsee/parsee.vmesh_c differ diff --git a/models/thd_hero/parsee/parsee_e7bb2331.vagrp_c b/models/thd_hero/parsee/parsee_e7bb2331.vagrp_c new file mode 100755 index 0000000..f779c6e Binary files /dev/null and b/models/thd_hero/parsee/parsee_e7bb2331.vagrp_c differ diff --git a/models/thd_hero/ran/5ab147cc/attack1.vanim_c b/models/thd_hero/ran/5ab147cc/attack1.vanim_c new file mode 100755 index 0000000..e2872a9 Binary files /dev/null and b/models/thd_hero/ran/5ab147cc/attack1.vanim_c differ diff --git a/models/thd_hero/ran/5ab147cc/attack2.vanim_c b/models/thd_hero/ran/5ab147cc/attack2.vanim_c new file mode 100755 index 0000000..88833f0 Binary files /dev/null and b/models/thd_hero/ran/5ab147cc/attack2.vanim_c differ diff --git a/models/thd_hero/ran/5ab147cc/cast.vanim_c b/models/thd_hero/ran/5ab147cc/cast.vanim_c new file mode 100755 index 0000000..fef2f35 Binary files /dev/null and b/models/thd_hero/ran/5ab147cc/cast.vanim_c differ diff --git a/models/thd_hero/ran/5ab147cc/cast1.vanim_c b/models/thd_hero/ran/5ab147cc/cast1.vanim_c new file mode 100755 index 0000000..3510fce Binary files /dev/null and b/models/thd_hero/ran/5ab147cc/cast1.vanim_c differ diff --git a/models/thd_hero/ran/5ab147cc/cast2.vanim_c b/models/thd_hero/ran/5ab147cc/cast2.vanim_c new file mode 100755 index 0000000..752d135 Binary files /dev/null and b/models/thd_hero/ran/5ab147cc/cast2.vanim_c differ diff --git a/models/thd_hero/ran/5ab147cc/cast3.vanim_c b/models/thd_hero/ran/5ab147cc/cast3.vanim_c new file mode 100755 index 0000000..2bdb17b Binary files /dev/null and b/models/thd_hero/ran/5ab147cc/cast3.vanim_c differ diff --git a/models/thd_hero/ran/5ab147cc/cast4.vanim_c b/models/thd_hero/ran/5ab147cc/cast4.vanim_c new file mode 100755 index 0000000..b54b17f Binary files /dev/null and b/models/thd_hero/ran/5ab147cc/cast4.vanim_c differ diff --git a/models/thd_hero/ran/5ab147cc/idle.vanim_c b/models/thd_hero/ran/5ab147cc/idle.vanim_c new file mode 100755 index 0000000..500975f Binary files /dev/null and b/models/thd_hero/ran/5ab147cc/idle.vanim_c differ diff --git a/models/thd_hero/ran/5ab147cc/ran_animation.vanim_c b/models/thd_hero/ran/5ab147cc/ran_animation.vanim_c new file mode 100755 index 0000000..60a6ada Binary files /dev/null and b/models/thd_hero/ran/5ab147cc/ran_animation.vanim_c differ diff --git a/models/thd_hero/ran/5ab147cc/run.vanim_c b/models/thd_hero/ran/5ab147cc/run.vanim_c new file mode 100755 index 0000000..61bedd0 Binary files /dev/null and b/models/thd_hero/ran/5ab147cc/run.vanim_c differ diff --git a/models/thd_hero/ran/item/b2bd1e4f/attack1.vanim_c b/models/thd_hero/ran/item/b2bd1e4f/attack1.vanim_c new file mode 100755 index 0000000..7145c30 Binary files /dev/null and b/models/thd_hero/ran/item/b2bd1e4f/attack1.vanim_c differ diff --git a/models/thd_hero/ran/item/b2bd1e4f/attack2.vanim_c b/models/thd_hero/ran/item/b2bd1e4f/attack2.vanim_c new file mode 100755 index 0000000..2d3f21c Binary files /dev/null and b/models/thd_hero/ran/item/b2bd1e4f/attack2.vanim_c differ diff --git a/models/thd_hero/ran/item/b2bd1e4f/cast1.vanim_c b/models/thd_hero/ran/item/b2bd1e4f/cast1.vanim_c new file mode 100755 index 0000000..a62b89a Binary files /dev/null and b/models/thd_hero/ran/item/b2bd1e4f/cast1.vanim_c differ diff --git a/models/thd_hero/ran/item/b2bd1e4f/cast2.vanim_c b/models/thd_hero/ran/item/b2bd1e4f/cast2.vanim_c new file mode 100755 index 0000000..a0d882b Binary files /dev/null and b/models/thd_hero/ran/item/b2bd1e4f/cast2.vanim_c differ diff --git a/models/thd_hero/ran/item/b2bd1e4f/cast3.vanim_c b/models/thd_hero/ran/item/b2bd1e4f/cast3.vanim_c new file mode 100755 index 0000000..a08dd20 Binary files /dev/null and b/models/thd_hero/ran/item/b2bd1e4f/cast3.vanim_c differ diff --git a/models/thd_hero/ran/item/b2bd1e4f/cast4.vanim_c b/models/thd_hero/ran/item/b2bd1e4f/cast4.vanim_c new file mode 100755 index 0000000..e2dc358 Binary files /dev/null and b/models/thd_hero/ran/item/b2bd1e4f/cast4.vanim_c differ diff --git a/models/thd_hero/ran/item/b2bd1e4f/idle.vanim_c b/models/thd_hero/ran/item/b2bd1e4f/idle.vanim_c new file mode 100755 index 0000000..45d41b5 Binary files /dev/null and b/models/thd_hero/ran/item/b2bd1e4f/idle.vanim_c differ diff --git a/models/thd_hero/ran/item/b2bd1e4f/run.vanim_c b/models/thd_hero/ran/item/b2bd1e4f/run.vanim_c new file mode 100755 index 0000000..3bb78c2 Binary files /dev/null and b/models/thd_hero/ran/item/b2bd1e4f/run.vanim_c differ diff --git a/models/thd_hero/ran/item/item_ran.vmdl_c b/models/thd_hero/ran/item/item_ran.vmdl_c new file mode 100755 index 0000000..ca4a297 Binary files /dev/null and b/models/thd_hero/ran/item/item_ran.vmdl_c differ diff --git a/models/thd_hero/ran/item/item_ran_b2bd1e4f.vagrp_c b/models/thd_hero/ran/item/item_ran_b2bd1e4f.vagrp_c new file mode 100755 index 0000000..a0c64f8 Binary files /dev/null and b/models/thd_hero/ran/item/item_ran_b2bd1e4f.vagrp_c differ diff --git a/models/thd_hero/ran/item/ran.vmesh_c b/models/thd_hero/ran/item/ran.vmesh_c new file mode 100755 index 0000000..dc050c7 Binary files /dev/null and b/models/thd_hero/ran/item/ran.vmesh_c differ diff --git a/models/thd_hero/ran/ran.vmdl_c b/models/thd_hero/ran/ran.vmdl_c new file mode 100755 index 0000000..965c744 Binary files /dev/null and b/models/thd_hero/ran/ran.vmdl_c differ diff --git a/models/thd_hero/ran/ran.vmesh_c b/models/thd_hero/ran/ran.vmesh_c new file mode 100755 index 0000000..1ca12e4 Binary files /dev/null and b/models/thd_hero/ran/ran.vmesh_c differ diff --git a/models/thd_hero/ran/ran_5ab147cc.vagrp_c b/models/thd_hero/ran/ran_5ab147cc.vagrp_c new file mode 100755 index 0000000..2f052e9 Binary files /dev/null and b/models/thd_hero/ran/ran_5ab147cc.vagrp_c differ diff --git a/models/thd_hero/reisen/cloth01/60c74576/attack.vanim_c b/models/thd_hero/reisen/cloth01/60c74576/attack.vanim_c new file mode 100755 index 0000000..b5ddc66 Binary files /dev/null and b/models/thd_hero/reisen/cloth01/60c74576/attack.vanim_c differ diff --git a/models/thd_hero/reisen/cloth01/60c74576/cast1.vanim_c b/models/thd_hero/reisen/cloth01/60c74576/cast1.vanim_c new file mode 100755 index 0000000..f31a0ed Binary files /dev/null and b/models/thd_hero/reisen/cloth01/60c74576/cast1.vanim_c differ diff --git a/models/thd_hero/reisen/cloth01/60c74576/cast3.vanim_c b/models/thd_hero/reisen/cloth01/60c74576/cast3.vanim_c new file mode 100755 index 0000000..0fd114a Binary files /dev/null and b/models/thd_hero/reisen/cloth01/60c74576/cast3.vanim_c differ diff --git a/models/thd_hero/reisen/cloth01/60c74576/cast4.vanim_c b/models/thd_hero/reisen/cloth01/60c74576/cast4.vanim_c new file mode 100755 index 0000000..428a6c3 Binary files /dev/null and b/models/thd_hero/reisen/cloth01/60c74576/cast4.vanim_c differ diff --git a/models/thd_hero/reisen/cloth01/60c74576/idle.vanim_c b/models/thd_hero/reisen/cloth01/60c74576/idle.vanim_c new file mode 100755 index 0000000..596d699 Binary files /dev/null and b/models/thd_hero/reisen/cloth01/60c74576/idle.vanim_c differ diff --git a/models/thd_hero/reisen/cloth01/60c74576/reisen_cloth01_animation.vanim_c b/models/thd_hero/reisen/cloth01/60c74576/reisen_cloth01_animation.vanim_c new file mode 100755 index 0000000..dc10ae2 Binary files /dev/null and b/models/thd_hero/reisen/cloth01/60c74576/reisen_cloth01_animation.vanim_c differ diff --git a/models/thd_hero/reisen/cloth01/60c74576/run.vanim_c b/models/thd_hero/reisen/cloth01/60c74576/run.vanim_c new file mode 100755 index 0000000..7106a61 Binary files /dev/null and b/models/thd_hero/reisen/cloth01/60c74576/run.vanim_c differ diff --git a/models/thd_hero/reisen/cloth01/reisen_cloth01.vmdl_c b/models/thd_hero/reisen/cloth01/reisen_cloth01.vmdl_c new file mode 100755 index 0000000..2177447 Binary files /dev/null and b/models/thd_hero/reisen/cloth01/reisen_cloth01.vmdl_c differ diff --git a/models/thd_hero/reisen/cloth01/reisen_cloth01.vmesh_c b/models/thd_hero/reisen/cloth01/reisen_cloth01.vmesh_c new file mode 100755 index 0000000..6afa80e Binary files /dev/null and b/models/thd_hero/reisen/cloth01/reisen_cloth01.vmesh_c differ diff --git a/models/thd_hero/reisen/cloth01/reisen_cloth01_60c74576.vagrp_c b/models/thd_hero/reisen/cloth01/reisen_cloth01_60c74576.vagrp_c new file mode 100755 index 0000000..839dd31 Binary files /dev/null and b/models/thd_hero/reisen/cloth01/reisen_cloth01_60c74576.vagrp_c differ diff --git a/models/thd_hero/reisen/d4066086/attack.vanim_c b/models/thd_hero/reisen/d4066086/attack.vanim_c new file mode 100755 index 0000000..a2fee3f Binary files /dev/null and b/models/thd_hero/reisen/d4066086/attack.vanim_c differ diff --git a/models/thd_hero/reisen/d4066086/cast1.vanim_c b/models/thd_hero/reisen/d4066086/cast1.vanim_c new file mode 100755 index 0000000..c620582 Binary files /dev/null and b/models/thd_hero/reisen/d4066086/cast1.vanim_c differ diff --git a/models/thd_hero/reisen/d4066086/idle.vanim_c b/models/thd_hero/reisen/d4066086/idle.vanim_c new file mode 100755 index 0000000..270283e Binary files /dev/null and b/models/thd_hero/reisen/d4066086/idle.vanim_c differ diff --git a/models/thd_hero/reisen/d4066086/por.vanim_c b/models/thd_hero/reisen/d4066086/por.vanim_c new file mode 100755 index 0000000..1f341fc Binary files /dev/null and b/models/thd_hero/reisen/d4066086/por.vanim_c differ diff --git a/models/thd_hero/reisen/d4066086/run.vanim_c b/models/thd_hero/reisen/d4066086/run.vanim_c new file mode 100755 index 0000000..2b34036 Binary files /dev/null and b/models/thd_hero/reisen/d4066086/run.vanim_c differ diff --git a/models/thd_hero/reisen/item/61a3e1a4/attack.vanim_c b/models/thd_hero/reisen/item/61a3e1a4/attack.vanim_c new file mode 100755 index 0000000..699c2a9 Binary files /dev/null and b/models/thd_hero/reisen/item/61a3e1a4/attack.vanim_c differ diff --git a/models/thd_hero/reisen/item/61a3e1a4/cast1.vanim_c b/models/thd_hero/reisen/item/61a3e1a4/cast1.vanim_c new file mode 100755 index 0000000..a683db2 Binary files /dev/null and b/models/thd_hero/reisen/item/61a3e1a4/cast1.vanim_c differ diff --git a/models/thd_hero/reisen/item/61a3e1a4/idle.vanim_c b/models/thd_hero/reisen/item/61a3e1a4/idle.vanim_c new file mode 100755 index 0000000..c59fbbd Binary files /dev/null and b/models/thd_hero/reisen/item/61a3e1a4/idle.vanim_c differ diff --git a/models/thd_hero/reisen/item/61a3e1a4/por.vanim_c b/models/thd_hero/reisen/item/61a3e1a4/por.vanim_c new file mode 100755 index 0000000..6469c50 Binary files /dev/null and b/models/thd_hero/reisen/item/61a3e1a4/por.vanim_c differ diff --git a/models/thd_hero/reisen/item/61a3e1a4/run.vanim_c b/models/thd_hero/reisen/item/61a3e1a4/run.vanim_c new file mode 100755 index 0000000..988391e Binary files /dev/null and b/models/thd_hero/reisen/item/61a3e1a4/run.vanim_c differ diff --git a/models/thd_hero/reisen/item/item_reisen.vmdl_c b/models/thd_hero/reisen/item/item_reisen.vmdl_c new file mode 100755 index 0000000..0d958fb Binary files /dev/null and b/models/thd_hero/reisen/item/item_reisen.vmdl_c differ diff --git a/models/thd_hero/reisen/item/item_reisen_61a3e1a4.vagrp_c b/models/thd_hero/reisen/item/item_reisen_61a3e1a4.vagrp_c new file mode 100755 index 0000000..fe7d4ad Binary files /dev/null and b/models/thd_hero/reisen/item/item_reisen_61a3e1a4.vagrp_c differ diff --git a/models/thd_hero/reisen/item/reisen.vmesh_c b/models/thd_hero/reisen/item/reisen.vmesh_c new file mode 100755 index 0000000..3bec96d Binary files /dev/null and b/models/thd_hero/reisen/item/reisen.vmesh_c differ diff --git a/models/thd_hero/reisen/reisen.vmdl_c b/models/thd_hero/reisen/reisen.vmdl_c new file mode 100755 index 0000000..b638f34 Binary files /dev/null and b/models/thd_hero/reisen/reisen.vmdl_c differ diff --git a/models/thd_hero/reisen/reisen.vmesh_c b/models/thd_hero/reisen/reisen.vmesh_c new file mode 100755 index 0000000..0f1f429 Binary files /dev/null and b/models/thd_hero/reisen/reisen.vmesh_c differ diff --git a/models/thd_hero/reisen/reisen_d4066086.vagrp_c b/models/thd_hero/reisen/reisen_d4066086.vagrp_c new file mode 100755 index 0000000..6bf7a35 Binary files /dev/null and b/models/thd_hero/reisen/reisen_d4066086.vagrp_c differ diff --git a/models/thd_hero/rin/71971624/attack.vanim_c b/models/thd_hero/rin/71971624/attack.vanim_c new file mode 100755 index 0000000..bd26f8b Binary files /dev/null and b/models/thd_hero/rin/71971624/attack.vanim_c differ diff --git a/models/thd_hero/rin/71971624/attack2.vanim_c b/models/thd_hero/rin/71971624/attack2.vanim_c new file mode 100755 index 0000000..5f2f327 Binary files /dev/null and b/models/thd_hero/rin/71971624/attack2.vanim_c differ diff --git a/models/thd_hero/rin/71971624/cast1.vanim_c b/models/thd_hero/rin/71971624/cast1.vanim_c new file mode 100755 index 0000000..0606897 Binary files /dev/null and b/models/thd_hero/rin/71971624/cast1.vanim_c differ diff --git a/models/thd_hero/rin/71971624/cast2.vanim_c b/models/thd_hero/rin/71971624/cast2.vanim_c new file mode 100755 index 0000000..7f2781d Binary files /dev/null and b/models/thd_hero/rin/71971624/cast2.vanim_c differ diff --git a/models/thd_hero/rin/71971624/idle.vanim_c b/models/thd_hero/rin/71971624/idle.vanim_c new file mode 100755 index 0000000..8aa1aec Binary files /dev/null and b/models/thd_hero/rin/71971624/idle.vanim_c differ diff --git a/models/thd_hero/rin/71971624/por.vanim_c b/models/thd_hero/rin/71971624/por.vanim_c new file mode 100755 index 0000000..90348a6 Binary files /dev/null and b/models/thd_hero/rin/71971624/por.vanim_c differ diff --git a/models/thd_hero/rin/71971624/run.vanim_c b/models/thd_hero/rin/71971624/run.vanim_c new file mode 100755 index 0000000..cf9553c Binary files /dev/null and b/models/thd_hero/rin/71971624/run.vanim_c differ diff --git a/models/thd_hero/rin/item/6aaefc41/attack.vanim_c b/models/thd_hero/rin/item/6aaefc41/attack.vanim_c new file mode 100755 index 0000000..1d2ecb9 Binary files /dev/null and b/models/thd_hero/rin/item/6aaefc41/attack.vanim_c differ diff --git a/models/thd_hero/rin/item/6aaefc41/attack2.vanim_c b/models/thd_hero/rin/item/6aaefc41/attack2.vanim_c new file mode 100755 index 0000000..36d7475 Binary files /dev/null and b/models/thd_hero/rin/item/6aaefc41/attack2.vanim_c differ diff --git a/models/thd_hero/rin/item/6aaefc41/cast1.vanim_c b/models/thd_hero/rin/item/6aaefc41/cast1.vanim_c new file mode 100755 index 0000000..35eb977 Binary files /dev/null and b/models/thd_hero/rin/item/6aaefc41/cast1.vanim_c differ diff --git a/models/thd_hero/rin/item/6aaefc41/cast2.vanim_c b/models/thd_hero/rin/item/6aaefc41/cast2.vanim_c new file mode 100755 index 0000000..99dc679 Binary files /dev/null and b/models/thd_hero/rin/item/6aaefc41/cast2.vanim_c differ diff --git a/models/thd_hero/rin/item/6aaefc41/idle.vanim_c b/models/thd_hero/rin/item/6aaefc41/idle.vanim_c new file mode 100755 index 0000000..0751b96 Binary files /dev/null and b/models/thd_hero/rin/item/6aaefc41/idle.vanim_c differ diff --git a/models/thd_hero/rin/item/6aaefc41/por.vanim_c b/models/thd_hero/rin/item/6aaefc41/por.vanim_c new file mode 100755 index 0000000..36ee57c Binary files /dev/null and b/models/thd_hero/rin/item/6aaefc41/por.vanim_c differ diff --git a/models/thd_hero/rin/item/6aaefc41/run.vanim_c b/models/thd_hero/rin/item/6aaefc41/run.vanim_c new file mode 100755 index 0000000..039e2dc Binary files /dev/null and b/models/thd_hero/rin/item/6aaefc41/run.vanim_c differ diff --git a/models/thd_hero/rin/item/item_rin.vmdl_c b/models/thd_hero/rin/item/item_rin.vmdl_c new file mode 100755 index 0000000..85bd2c7 Binary files /dev/null and b/models/thd_hero/rin/item/item_rin.vmdl_c differ diff --git a/models/thd_hero/rin/item/item_rin_6aaefc41.vagrp_c b/models/thd_hero/rin/item/item_rin_6aaefc41.vagrp_c new file mode 100755 index 0000000..b759426 Binary files /dev/null and b/models/thd_hero/rin/item/item_rin_6aaefc41.vagrp_c differ diff --git a/models/thd_hero/rin/item/rin.vmesh_c b/models/thd_hero/rin/item/rin.vmesh_c new file mode 100755 index 0000000..882120e Binary files /dev/null and b/models/thd_hero/rin/item/rin.vmesh_c differ diff --git a/models/thd_hero/rin/rin.vmdl_c b/models/thd_hero/rin/rin.vmdl_c new file mode 100755 index 0000000..9640e42 Binary files /dev/null and b/models/thd_hero/rin/rin.vmdl_c differ diff --git a/models/thd_hero/rin/rin.vmesh_c b/models/thd_hero/rin/rin.vmesh_c new file mode 100755 index 0000000..919a2b6 Binary files /dev/null and b/models/thd_hero/rin/rin.vmesh_c differ diff --git a/models/thd_hero/rin/rin_71971624.vagrp_c b/models/thd_hero/rin/rin_71971624.vagrp_c new file mode 100755 index 0000000..32e5a84 Binary files /dev/null and b/models/thd_hero/rin/rin_71971624.vagrp_c differ diff --git a/models/thd_hero/rumia/64c7d6a3/attack.vanim_c b/models/thd_hero/rumia/64c7d6a3/attack.vanim_c new file mode 100755 index 0000000..8b5896b Binary files /dev/null and b/models/thd_hero/rumia/64c7d6a3/attack.vanim_c differ diff --git a/models/thd_hero/rumia/64c7d6a3/cast.vanim_c b/models/thd_hero/rumia/64c7d6a3/cast.vanim_c new file mode 100755 index 0000000..c2d391c Binary files /dev/null and b/models/thd_hero/rumia/64c7d6a3/cast.vanim_c differ diff --git a/models/thd_hero/rumia/64c7d6a3/idle.vanim_c b/models/thd_hero/rumia/64c7d6a3/idle.vanim_c new file mode 100755 index 0000000..9ee70d8 Binary files /dev/null and b/models/thd_hero/rumia/64c7d6a3/idle.vanim_c differ diff --git a/models/thd_hero/rumia/64c7d6a3/por.vanim_c b/models/thd_hero/rumia/64c7d6a3/por.vanim_c new file mode 100755 index 0000000..1315c98 Binary files /dev/null and b/models/thd_hero/rumia/64c7d6a3/por.vanim_c differ diff --git a/models/thd_hero/rumia/64c7d6a3/run.vanim_c b/models/thd_hero/rumia/64c7d6a3/run.vanim_c new file mode 100755 index 0000000..e27f851 Binary files /dev/null and b/models/thd_hero/rumia/64c7d6a3/run.vanim_c differ diff --git a/models/thd_hero/rumia/item/0ddc64ce/attack.vanim_c b/models/thd_hero/rumia/item/0ddc64ce/attack.vanim_c new file mode 100755 index 0000000..edc68fe Binary files /dev/null and b/models/thd_hero/rumia/item/0ddc64ce/attack.vanim_c differ diff --git a/models/thd_hero/rumia/item/0ddc64ce/cast.vanim_c b/models/thd_hero/rumia/item/0ddc64ce/cast.vanim_c new file mode 100755 index 0000000..f9cfb37 Binary files /dev/null and b/models/thd_hero/rumia/item/0ddc64ce/cast.vanim_c differ diff --git a/models/thd_hero/rumia/item/0ddc64ce/idle.vanim_c b/models/thd_hero/rumia/item/0ddc64ce/idle.vanim_c new file mode 100755 index 0000000..79377d5 Binary files /dev/null and b/models/thd_hero/rumia/item/0ddc64ce/idle.vanim_c differ diff --git a/models/thd_hero/rumia/item/0ddc64ce/por.vanim_c b/models/thd_hero/rumia/item/0ddc64ce/por.vanim_c new file mode 100755 index 0000000..257a0de Binary files /dev/null and b/models/thd_hero/rumia/item/0ddc64ce/por.vanim_c differ diff --git a/models/thd_hero/rumia/item/0ddc64ce/run.vanim_c b/models/thd_hero/rumia/item/0ddc64ce/run.vanim_c new file mode 100755 index 0000000..5fa5c3d Binary files /dev/null and b/models/thd_hero/rumia/item/0ddc64ce/run.vanim_c differ diff --git a/models/thd_hero/rumia/item/item_rumia.vmdl_c b/models/thd_hero/rumia/item/item_rumia.vmdl_c new file mode 100755 index 0000000..fbab667 Binary files /dev/null and b/models/thd_hero/rumia/item/item_rumia.vmdl_c differ diff --git a/models/thd_hero/rumia/item/item_rumia_0ddc64ce.vagrp_c b/models/thd_hero/rumia/item/item_rumia_0ddc64ce.vagrp_c new file mode 100755 index 0000000..684159f Binary files /dev/null and b/models/thd_hero/rumia/item/item_rumia_0ddc64ce.vagrp_c differ diff --git a/models/thd_hero/rumia/item/rumia.vmesh_c b/models/thd_hero/rumia/item/rumia.vmesh_c new file mode 100755 index 0000000..8cdcc66 Binary files /dev/null and b/models/thd_hero/rumia/item/rumia.vmesh_c differ diff --git a/models/thd_hero/rumia/rumia.vmdl_c b/models/thd_hero/rumia/rumia.vmdl_c new file mode 100755 index 0000000..97cfaa8 Binary files /dev/null and b/models/thd_hero/rumia/rumia.vmdl_c differ diff --git a/models/thd_hero/rumia/rumia.vmesh_c b/models/thd_hero/rumia/rumia.vmesh_c new file mode 100755 index 0000000..9e4d0a2 Binary files /dev/null and b/models/thd_hero/rumia/rumia.vmesh_c differ diff --git a/models/thd_hero/rumia/rumia_64c7d6a3.vagrp_c b/models/thd_hero/rumia/rumia_64c7d6a3.vagrp_c new file mode 100755 index 0000000..20d0e5f Binary files /dev/null and b/models/thd_hero/rumia/rumia_64c7d6a3.vagrp_c differ diff --git a/models/thd_hero/sanae/5a6c8925/attack.vanim_c b/models/thd_hero/sanae/5a6c8925/attack.vanim_c new file mode 100755 index 0000000..be58a21 Binary files /dev/null and b/models/thd_hero/sanae/5a6c8925/attack.vanim_c differ diff --git a/models/thd_hero/sanae/5a6c8925/cast.vanim_c b/models/thd_hero/sanae/5a6c8925/cast.vanim_c new file mode 100755 index 0000000..6bd1bef Binary files /dev/null and b/models/thd_hero/sanae/5a6c8925/cast.vanim_c differ diff --git a/models/thd_hero/sanae/5a6c8925/cast1.vanim_c b/models/thd_hero/sanae/5a6c8925/cast1.vanim_c new file mode 100755 index 0000000..08917b5 Binary files /dev/null and b/models/thd_hero/sanae/5a6c8925/cast1.vanim_c differ diff --git a/models/thd_hero/sanae/5a6c8925/cast2.vanim_c b/models/thd_hero/sanae/5a6c8925/cast2.vanim_c new file mode 100755 index 0000000..e1a120c Binary files /dev/null and b/models/thd_hero/sanae/5a6c8925/cast2.vanim_c differ diff --git a/models/thd_hero/sanae/5a6c8925/cast3.vanim_c b/models/thd_hero/sanae/5a6c8925/cast3.vanim_c new file mode 100755 index 0000000..f9a300d Binary files /dev/null and b/models/thd_hero/sanae/5a6c8925/cast3.vanim_c differ diff --git a/models/thd_hero/sanae/5a6c8925/cast4.vanim_c b/models/thd_hero/sanae/5a6c8925/cast4.vanim_c new file mode 100755 index 0000000..7bb201b Binary files /dev/null and b/models/thd_hero/sanae/5a6c8925/cast4.vanim_c differ diff --git a/models/thd_hero/sanae/5a6c8925/idle.vanim_c b/models/thd_hero/sanae/5a6c8925/idle.vanim_c new file mode 100755 index 0000000..e417ceb Binary files /dev/null and b/models/thd_hero/sanae/5a6c8925/idle.vanim_c differ diff --git a/models/thd_hero/sanae/5a6c8925/run.vanim_c b/models/thd_hero/sanae/5a6c8925/run.vanim_c new file mode 100755 index 0000000..fde8e40 Binary files /dev/null and b/models/thd_hero/sanae/5a6c8925/run.vanim_c differ diff --git a/models/thd_hero/sanae/5a6c8925/sanae_animation.vanim_c b/models/thd_hero/sanae/5a6c8925/sanae_animation.vanim_c new file mode 100755 index 0000000..8557280 Binary files /dev/null and b/models/thd_hero/sanae/5a6c8925/sanae_animation.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/0d8eabdb/attack1.vanim_c b/models/thd_hero/sanae/cloth01/0d8eabdb/attack1.vanim_c new file mode 100755 index 0000000..f2562af Binary files /dev/null and b/models/thd_hero/sanae/cloth01/0d8eabdb/attack1.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/0d8eabdb/cast.vanim_c b/models/thd_hero/sanae/cloth01/0d8eabdb/cast.vanim_c new file mode 100755 index 0000000..525ab45 Binary files /dev/null and b/models/thd_hero/sanae/cloth01/0d8eabdb/cast.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/0d8eabdb/cast2.vanim_c b/models/thd_hero/sanae/cloth01/0d8eabdb/cast2.vanim_c new file mode 100755 index 0000000..60ed72c Binary files /dev/null and b/models/thd_hero/sanae/cloth01/0d8eabdb/cast2.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/0d8eabdb/cast3.vanim_c b/models/thd_hero/sanae/cloth01/0d8eabdb/cast3.vanim_c new file mode 100755 index 0000000..1bf7c47 Binary files /dev/null and b/models/thd_hero/sanae/cloth01/0d8eabdb/cast3.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/0d8eabdb/cast4.vanim_c b/models/thd_hero/sanae/cloth01/0d8eabdb/cast4.vanim_c new file mode 100755 index 0000000..9e4c96d Binary files /dev/null and b/models/thd_hero/sanae/cloth01/0d8eabdb/cast4.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/0d8eabdb/idle.vanim_c b/models/thd_hero/sanae/cloth01/0d8eabdb/idle.vanim_c new file mode 100755 index 0000000..0596371 Binary files /dev/null and b/models/thd_hero/sanae/cloth01/0d8eabdb/idle.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/0d8eabdb/run.vanim_c b/models/thd_hero/sanae/cloth01/0d8eabdb/run.vanim_c new file mode 100755 index 0000000..2a4431a Binary files /dev/null and b/models/thd_hero/sanae/cloth01/0d8eabdb/run.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/0d8eabdb/sanae_jk_animation.vanim_c b/models/thd_hero/sanae/cloth01/0d8eabdb/sanae_jk_animation.vanim_c new file mode 100755 index 0000000..5d24e69 Binary files /dev/null and b/models/thd_hero/sanae/cloth01/0d8eabdb/sanae_jk_animation.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/item/5ae06ad8/attack1.vanim_c b/models/thd_hero/sanae/cloth01/item/5ae06ad8/attack1.vanim_c new file mode 100755 index 0000000..02dbdf0 Binary files /dev/null and b/models/thd_hero/sanae/cloth01/item/5ae06ad8/attack1.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/item/5ae06ad8/cast.vanim_c b/models/thd_hero/sanae/cloth01/item/5ae06ad8/cast.vanim_c new file mode 100755 index 0000000..1f23ee8 Binary files /dev/null and b/models/thd_hero/sanae/cloth01/item/5ae06ad8/cast.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/item/5ae06ad8/cast2.vanim_c b/models/thd_hero/sanae/cloth01/item/5ae06ad8/cast2.vanim_c new file mode 100755 index 0000000..73ae165 Binary files /dev/null and b/models/thd_hero/sanae/cloth01/item/5ae06ad8/cast2.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/item/5ae06ad8/cast3.vanim_c b/models/thd_hero/sanae/cloth01/item/5ae06ad8/cast3.vanim_c new file mode 100755 index 0000000..081ac0d Binary files /dev/null and b/models/thd_hero/sanae/cloth01/item/5ae06ad8/cast3.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/item/5ae06ad8/cast4.vanim_c b/models/thd_hero/sanae/cloth01/item/5ae06ad8/cast4.vanim_c new file mode 100755 index 0000000..9f19e37 Binary files /dev/null and b/models/thd_hero/sanae/cloth01/item/5ae06ad8/cast4.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/item/5ae06ad8/idle.vanim_c b/models/thd_hero/sanae/cloth01/item/5ae06ad8/idle.vanim_c new file mode 100755 index 0000000..2a745df Binary files /dev/null and b/models/thd_hero/sanae/cloth01/item/5ae06ad8/idle.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/item/5ae06ad8/run.vanim_c b/models/thd_hero/sanae/cloth01/item/5ae06ad8/run.vanim_c new file mode 100755 index 0000000..324b194 Binary files /dev/null and b/models/thd_hero/sanae/cloth01/item/5ae06ad8/run.vanim_c differ diff --git a/models/thd_hero/sanae/cloth01/item/item_sanae_jk.vmdl_c b/models/thd_hero/sanae/cloth01/item/item_sanae_jk.vmdl_c new file mode 100755 index 0000000..916ec8a Binary files /dev/null and b/models/thd_hero/sanae/cloth01/item/item_sanae_jk.vmdl_c differ diff --git a/models/thd_hero/sanae/cloth01/item/item_sanae_jk_5ae06ad8.vagrp_c b/models/thd_hero/sanae/cloth01/item/item_sanae_jk_5ae06ad8.vagrp_c new file mode 100755 index 0000000..692dca9 Binary files /dev/null and b/models/thd_hero/sanae/cloth01/item/item_sanae_jk_5ae06ad8.vagrp_c differ diff --git a/models/thd_hero/sanae/cloth01/item/sanae_jk.vmesh_c b/models/thd_hero/sanae/cloth01/item/sanae_jk.vmesh_c new file mode 100755 index 0000000..cb652b8 Binary files /dev/null and b/models/thd_hero/sanae/cloth01/item/sanae_jk.vmesh_c differ diff --git a/models/thd_hero/sanae/cloth01/sanae_jk.vmdl_c b/models/thd_hero/sanae/cloth01/sanae_jk.vmdl_c new file mode 100755 index 0000000..62a8d9b Binary files /dev/null and b/models/thd_hero/sanae/cloth01/sanae_jk.vmdl_c differ diff --git a/models/thd_hero/sanae/cloth01/sanae_jk.vmesh_c b/models/thd_hero/sanae/cloth01/sanae_jk.vmesh_c new file mode 100755 index 0000000..a9353e7 Binary files /dev/null and b/models/thd_hero/sanae/cloth01/sanae_jk.vmesh_c differ diff --git a/models/thd_hero/sanae/cloth01/sanae_jk_0d8eabdb.vagrp_c b/models/thd_hero/sanae/cloth01/sanae_jk_0d8eabdb.vagrp_c new file mode 100755 index 0000000..458908c Binary files /dev/null and b/models/thd_hero/sanae/cloth01/sanae_jk_0d8eabdb.vagrp_c differ diff --git a/models/thd_hero/sanae/item/b85e7a35/attack.vanim_c b/models/thd_hero/sanae/item/b85e7a35/attack.vanim_c new file mode 100755 index 0000000..9f7013b Binary files /dev/null and b/models/thd_hero/sanae/item/b85e7a35/attack.vanim_c differ diff --git a/models/thd_hero/sanae/item/b85e7a35/cast1.vanim_c b/models/thd_hero/sanae/item/b85e7a35/cast1.vanim_c new file mode 100755 index 0000000..67f9b3f Binary files /dev/null and b/models/thd_hero/sanae/item/b85e7a35/cast1.vanim_c differ diff --git a/models/thd_hero/sanae/item/b85e7a35/cast2.vanim_c b/models/thd_hero/sanae/item/b85e7a35/cast2.vanim_c new file mode 100755 index 0000000..28d6ff9 Binary files /dev/null and b/models/thd_hero/sanae/item/b85e7a35/cast2.vanim_c differ diff --git a/models/thd_hero/sanae/item/b85e7a35/cast3.vanim_c b/models/thd_hero/sanae/item/b85e7a35/cast3.vanim_c new file mode 100755 index 0000000..6bd4b68 Binary files /dev/null and b/models/thd_hero/sanae/item/b85e7a35/cast3.vanim_c differ diff --git a/models/thd_hero/sanae/item/b85e7a35/cast4.vanim_c b/models/thd_hero/sanae/item/b85e7a35/cast4.vanim_c new file mode 100755 index 0000000..fc4a762 Binary files /dev/null and b/models/thd_hero/sanae/item/b85e7a35/cast4.vanim_c differ diff --git a/models/thd_hero/sanae/item/b85e7a35/idle.vanim_c b/models/thd_hero/sanae/item/b85e7a35/idle.vanim_c new file mode 100755 index 0000000..4a094f0 Binary files /dev/null and b/models/thd_hero/sanae/item/b85e7a35/idle.vanim_c differ diff --git a/models/thd_hero/sanae/item/b85e7a35/run.vanim_c b/models/thd_hero/sanae/item/b85e7a35/run.vanim_c new file mode 100755 index 0000000..9dab167 Binary files /dev/null and b/models/thd_hero/sanae/item/b85e7a35/run.vanim_c differ diff --git a/models/thd_hero/sanae/item/item_sanae.vmdl_c b/models/thd_hero/sanae/item/item_sanae.vmdl_c new file mode 100755 index 0000000..24a307c Binary files /dev/null and b/models/thd_hero/sanae/item/item_sanae.vmdl_c differ diff --git a/models/thd_hero/sanae/item/item_sanae_b85e7a35.vagrp_c b/models/thd_hero/sanae/item/item_sanae_b85e7a35.vagrp_c new file mode 100755 index 0000000..3cb261d Binary files /dev/null and b/models/thd_hero/sanae/item/item_sanae_b85e7a35.vagrp_c differ diff --git a/models/thd_hero/sanae/item/sanae.vmesh_c b/models/thd_hero/sanae/item/sanae.vmesh_c new file mode 100755 index 0000000..4210f0c Binary files /dev/null and b/models/thd_hero/sanae/item/sanae.vmesh_c differ diff --git a/models/thd_hero/sanae/sanae.vmdl_c b/models/thd_hero/sanae/sanae.vmdl_c new file mode 100755 index 0000000..e7b7a08 Binary files /dev/null and b/models/thd_hero/sanae/sanae.vmdl_c differ diff --git a/models/thd_hero/sanae/sanae.vmesh_c b/models/thd_hero/sanae/sanae.vmesh_c new file mode 100755 index 0000000..f09aa2d Binary files /dev/null and b/models/thd_hero/sanae/sanae.vmesh_c differ diff --git a/models/thd_hero/sanae/sanae_5a6c8925.vagrp_c b/models/thd_hero/sanae/sanae_5a6c8925.vagrp_c new file mode 100755 index 0000000..c75a937 Binary files /dev/null and b/models/thd_hero/sanae/sanae_5a6c8925.vagrp_c differ diff --git a/models/thd_hero/seiga/7530c0b4/attack.vanim_c b/models/thd_hero/seiga/7530c0b4/attack.vanim_c new file mode 100755 index 0000000..f1e17ce Binary files /dev/null and b/models/thd_hero/seiga/7530c0b4/attack.vanim_c differ diff --git a/models/thd_hero/seiga/7530c0b4/cast.vanim_c b/models/thd_hero/seiga/7530c0b4/cast.vanim_c new file mode 100755 index 0000000..89ef782 Binary files /dev/null and b/models/thd_hero/seiga/7530c0b4/cast.vanim_c differ diff --git a/models/thd_hero/seiga/7530c0b4/cast_4.vanim_c b/models/thd_hero/seiga/7530c0b4/cast_4.vanim_c new file mode 100755 index 0000000..99d2ec9 Binary files /dev/null and b/models/thd_hero/seiga/7530c0b4/cast_4.vanim_c differ diff --git a/models/thd_hero/seiga/7530c0b4/idle.vanim_c b/models/thd_hero/seiga/7530c0b4/idle.vanim_c new file mode 100755 index 0000000..e3c5983 Binary files /dev/null and b/models/thd_hero/seiga/7530c0b4/idle.vanim_c differ diff --git a/models/thd_hero/seiga/7530c0b4/run.vanim_c b/models/thd_hero/seiga/7530c0b4/run.vanim_c new file mode 100755 index 0000000..17fcc5f Binary files /dev/null and b/models/thd_hero/seiga/7530c0b4/run.vanim_c differ diff --git a/models/thd_hero/seiga/7530c0b4/seiga_animation.vanim_c b/models/thd_hero/seiga/7530c0b4/seiga_animation.vanim_c new file mode 100755 index 0000000..c500486 Binary files /dev/null and b/models/thd_hero/seiga/7530c0b4/seiga_animation.vanim_c differ diff --git a/models/thd_hero/seiga/item/ff15f8c4/attack.vanim_c b/models/thd_hero/seiga/item/ff15f8c4/attack.vanim_c new file mode 100755 index 0000000..64493a8 Binary files /dev/null and b/models/thd_hero/seiga/item/ff15f8c4/attack.vanim_c differ diff --git a/models/thd_hero/seiga/item/ff15f8c4/cast.vanim_c b/models/thd_hero/seiga/item/ff15f8c4/cast.vanim_c new file mode 100755 index 0000000..7e54ca7 Binary files /dev/null and b/models/thd_hero/seiga/item/ff15f8c4/cast.vanim_c differ diff --git a/models/thd_hero/seiga/item/ff15f8c4/idle.vanim_c b/models/thd_hero/seiga/item/ff15f8c4/idle.vanim_c new file mode 100755 index 0000000..7374fa0 Binary files /dev/null and b/models/thd_hero/seiga/item/ff15f8c4/idle.vanim_c differ diff --git a/models/thd_hero/seiga/item/ff15f8c4/run.vanim_c b/models/thd_hero/seiga/item/ff15f8c4/run.vanim_c new file mode 100755 index 0000000..07b756b Binary files /dev/null and b/models/thd_hero/seiga/item/ff15f8c4/run.vanim_c differ diff --git a/models/thd_hero/seiga/item/item_seiga.vmdl_c b/models/thd_hero/seiga/item/item_seiga.vmdl_c new file mode 100755 index 0000000..dbd3492 Binary files /dev/null and b/models/thd_hero/seiga/item/item_seiga.vmdl_c differ diff --git a/models/thd_hero/seiga/item/item_seiga_ff15f8c4.vagrp_c b/models/thd_hero/seiga/item/item_seiga_ff15f8c4.vagrp_c new file mode 100755 index 0000000..8046480 Binary files /dev/null and b/models/thd_hero/seiga/item/item_seiga_ff15f8c4.vagrp_c differ diff --git a/models/thd_hero/seiga/item/seiga.vmesh_c b/models/thd_hero/seiga/item/seiga.vmesh_c new file mode 100755 index 0000000..5014598 Binary files /dev/null and b/models/thd_hero/seiga/item/seiga.vmesh_c differ diff --git a/models/thd_hero/seiga/seiga.vmdl_c b/models/thd_hero/seiga/seiga.vmdl_c new file mode 100755 index 0000000..d315935 Binary files /dev/null and b/models/thd_hero/seiga/seiga.vmdl_c differ diff --git a/models/thd_hero/seiga/seiga.vmesh_c b/models/thd_hero/seiga/seiga.vmesh_c new file mode 100755 index 0000000..cd458ce Binary files /dev/null and b/models/thd_hero/seiga/seiga.vmesh_c differ diff --git a/models/thd_hero/seiga/seiga_7530c0b4.vagrp_c b/models/thd_hero/seiga/seiga_7530c0b4.vagrp_c new file mode 100755 index 0000000..61ab704 Binary files /dev/null and b/models/thd_hero/seiga/seiga_7530c0b4.vagrp_c differ diff --git a/models/thd_hero/shanghainingyou/5bfb7966/shanghai_attack.vanim_c b/models/thd_hero/shanghainingyou/5bfb7966/shanghai_attack.vanim_c new file mode 100755 index 0000000..68cd697 Binary files /dev/null and b/models/thd_hero/shanghainingyou/5bfb7966/shanghai_attack.vanim_c differ diff --git a/models/thd_hero/shanghainingyou/5bfb7966/shanghai_attack2.vanim_c b/models/thd_hero/shanghainingyou/5bfb7966/shanghai_attack2.vanim_c new file mode 100755 index 0000000..6200658 Binary files /dev/null and b/models/thd_hero/shanghainingyou/5bfb7966/shanghai_attack2.vanim_c differ diff --git a/models/thd_hero/shanghainingyou/5bfb7966/shanghai_idle.vanim_c b/models/thd_hero/shanghainingyou/5bfb7966/shanghai_idle.vanim_c new file mode 100755 index 0000000..7f57c44 Binary files /dev/null and b/models/thd_hero/shanghainingyou/5bfb7966/shanghai_idle.vanim_c differ diff --git a/models/thd_hero/shanghainingyou/5bfb7966/shanghai_run.vanim_c b/models/thd_hero/shanghainingyou/5bfb7966/shanghai_run.vanim_c new file mode 100755 index 0000000..89e2e40 Binary files /dev/null and b/models/thd_hero/shanghainingyou/5bfb7966/shanghai_run.vanim_c differ diff --git a/models/thd_hero/shanghainingyou/item/bdfafa0f/shanghai_attack.vanim_c b/models/thd_hero/shanghainingyou/item/bdfafa0f/shanghai_attack.vanim_c new file mode 100755 index 0000000..29efbc5 Binary files /dev/null and b/models/thd_hero/shanghainingyou/item/bdfafa0f/shanghai_attack.vanim_c differ diff --git a/models/thd_hero/shanghainingyou/item/bdfafa0f/shanghai_attack2.vanim_c b/models/thd_hero/shanghainingyou/item/bdfafa0f/shanghai_attack2.vanim_c new file mode 100755 index 0000000..81d44be Binary files /dev/null and b/models/thd_hero/shanghainingyou/item/bdfafa0f/shanghai_attack2.vanim_c differ diff --git a/models/thd_hero/shanghainingyou/item/bdfafa0f/shanghai_idle.vanim_c b/models/thd_hero/shanghainingyou/item/bdfafa0f/shanghai_idle.vanim_c new file mode 100755 index 0000000..150e870 Binary files /dev/null and b/models/thd_hero/shanghainingyou/item/bdfafa0f/shanghai_idle.vanim_c differ diff --git a/models/thd_hero/shanghainingyou/item/bdfafa0f/shanghai_run.vanim_c b/models/thd_hero/shanghainingyou/item/bdfafa0f/shanghai_run.vanim_c new file mode 100755 index 0000000..538e791 Binary files /dev/null and b/models/thd_hero/shanghainingyou/item/bdfafa0f/shanghai_run.vanim_c differ diff --git a/models/thd_hero/shanghainingyou/item/item_shanghainingyou.vmdl_c b/models/thd_hero/shanghainingyou/item/item_shanghainingyou.vmdl_c new file mode 100755 index 0000000..7a5b3b0 Binary files /dev/null and b/models/thd_hero/shanghainingyou/item/item_shanghainingyou.vmdl_c differ diff --git a/models/thd_hero/shanghainingyou/item/item_shanghainingyou_bdfafa0f.vagrp_c b/models/thd_hero/shanghainingyou/item/item_shanghainingyou_bdfafa0f.vagrp_c new file mode 100755 index 0000000..9da6472 Binary files /dev/null and b/models/thd_hero/shanghainingyou/item/item_shanghainingyou_bdfafa0f.vagrp_c differ diff --git a/models/thd_hero/shanghainingyou/item/shanghainingyou.vmesh_c b/models/thd_hero/shanghainingyou/item/shanghainingyou.vmesh_c new file mode 100755 index 0000000..3577972 Binary files /dev/null and b/models/thd_hero/shanghainingyou/item/shanghainingyou.vmesh_c differ diff --git a/models/thd_hero/shanghainingyou/shanghainingyou.vmdl_c b/models/thd_hero/shanghainingyou/shanghainingyou.vmdl_c new file mode 100755 index 0000000..d3fd2a0 Binary files /dev/null and b/models/thd_hero/shanghainingyou/shanghainingyou.vmdl_c differ diff --git a/models/thd_hero/shanghainingyou/shanghainingyou.vmesh_c b/models/thd_hero/shanghainingyou/shanghainingyou.vmesh_c new file mode 100755 index 0000000..9cf9772 Binary files /dev/null and b/models/thd_hero/shanghainingyou/shanghainingyou.vmesh_c differ diff --git a/models/thd_hero/shanghainingyou/shanghainingyou_5bfb7966.vagrp_c b/models/thd_hero/shanghainingyou/shanghainingyou_5bfb7966.vagrp_c new file mode 100755 index 0000000..e6d1614 Binary files /dev/null and b/models/thd_hero/shanghainingyou/shanghainingyou_5bfb7966.vagrp_c differ diff --git a/models/thd_hero/sizuha/7fa045fb/attack1.vanim_c b/models/thd_hero/sizuha/7fa045fb/attack1.vanim_c new file mode 100755 index 0000000..5c87c23 Binary files /dev/null and b/models/thd_hero/sizuha/7fa045fb/attack1.vanim_c differ diff --git a/models/thd_hero/sizuha/7fa045fb/cast.vanim_c b/models/thd_hero/sizuha/7fa045fb/cast.vanim_c new file mode 100755 index 0000000..10c7e87 Binary files /dev/null and b/models/thd_hero/sizuha/7fa045fb/cast.vanim_c differ diff --git a/models/thd_hero/sizuha/7fa045fb/idle.vanim_c b/models/thd_hero/sizuha/7fa045fb/idle.vanim_c new file mode 100755 index 0000000..8223829 Binary files /dev/null and b/models/thd_hero/sizuha/7fa045fb/idle.vanim_c differ diff --git a/models/thd_hero/sizuha/7fa045fb/run.vanim_c b/models/thd_hero/sizuha/7fa045fb/run.vanim_c new file mode 100755 index 0000000..75ca251 Binary files /dev/null and b/models/thd_hero/sizuha/7fa045fb/run.vanim_c differ diff --git a/models/thd_hero/sizuha/7fa045fb/sizuha_animation.vanim_c b/models/thd_hero/sizuha/7fa045fb/sizuha_animation.vanim_c new file mode 100755 index 0000000..50b90d0 Binary files /dev/null and b/models/thd_hero/sizuha/7fa045fb/sizuha_animation.vanim_c differ diff --git a/models/thd_hero/sizuha/item/2cf60b98/attack1.vanim_c b/models/thd_hero/sizuha/item/2cf60b98/attack1.vanim_c new file mode 100755 index 0000000..ec03d31 Binary files /dev/null and b/models/thd_hero/sizuha/item/2cf60b98/attack1.vanim_c differ diff --git a/models/thd_hero/sizuha/item/2cf60b98/cast.vanim_c b/models/thd_hero/sizuha/item/2cf60b98/cast.vanim_c new file mode 100755 index 0000000..69f5a1f Binary files /dev/null and b/models/thd_hero/sizuha/item/2cf60b98/cast.vanim_c differ diff --git a/models/thd_hero/sizuha/item/2cf60b98/idle.vanim_c b/models/thd_hero/sizuha/item/2cf60b98/idle.vanim_c new file mode 100755 index 0000000..8dd6312 Binary files /dev/null and b/models/thd_hero/sizuha/item/2cf60b98/idle.vanim_c differ diff --git a/models/thd_hero/sizuha/item/2cf60b98/run.vanim_c b/models/thd_hero/sizuha/item/2cf60b98/run.vanim_c new file mode 100755 index 0000000..7f1a017 Binary files /dev/null and b/models/thd_hero/sizuha/item/2cf60b98/run.vanim_c differ diff --git a/models/thd_hero/sizuha/item/item_sizuha.vmdl_c b/models/thd_hero/sizuha/item/item_sizuha.vmdl_c new file mode 100755 index 0000000..68c2374 Binary files /dev/null and b/models/thd_hero/sizuha/item/item_sizuha.vmdl_c differ diff --git a/models/thd_hero/sizuha/item/item_sizuha_2cf60b98.vagrp_c b/models/thd_hero/sizuha/item/item_sizuha_2cf60b98.vagrp_c new file mode 100755 index 0000000..bd0b08d Binary files /dev/null and b/models/thd_hero/sizuha/item/item_sizuha_2cf60b98.vagrp_c differ diff --git a/models/thd_hero/sizuha/item/sizuha.vmesh_c b/models/thd_hero/sizuha/item/sizuha.vmesh_c new file mode 100755 index 0000000..1e058bc Binary files /dev/null and b/models/thd_hero/sizuha/item/sizuha.vmesh_c differ diff --git a/models/thd_hero/sizuha/sizuha.vmdl_c b/models/thd_hero/sizuha/sizuha.vmdl_c new file mode 100755 index 0000000..d3240cf Binary files /dev/null and b/models/thd_hero/sizuha/sizuha.vmdl_c differ diff --git a/models/thd_hero/sizuha/sizuha.vmesh_c b/models/thd_hero/sizuha/sizuha.vmesh_c new file mode 100755 index 0000000..335f15d Binary files /dev/null and b/models/thd_hero/sizuha/sizuha.vmesh_c differ diff --git a/models/thd_hero/sizuha/sizuha_7fa045fb.vagrp_c b/models/thd_hero/sizuha/sizuha_7fa045fb.vagrp_c new file mode 100755 index 0000000..acee4b1 Binary files /dev/null and b/models/thd_hero/sizuha/sizuha_7fa045fb.vagrp_c differ diff --git a/models/thd_hero/soga/2c74cc4a/attack.vanim_c b/models/thd_hero/soga/2c74cc4a/attack.vanim_c new file mode 100755 index 0000000..4a8faad Binary files /dev/null and b/models/thd_hero/soga/2c74cc4a/attack.vanim_c differ diff --git a/models/thd_hero/soga/2c74cc4a/cast.vanim_c b/models/thd_hero/soga/2c74cc4a/cast.vanim_c new file mode 100755 index 0000000..9b7d564 Binary files /dev/null and b/models/thd_hero/soga/2c74cc4a/cast.vanim_c differ diff --git a/models/thd_hero/soga/2c74cc4a/cast4.vanim_c b/models/thd_hero/soga/2c74cc4a/cast4.vanim_c new file mode 100755 index 0000000..2f714cf Binary files /dev/null and b/models/thd_hero/soga/2c74cc4a/cast4.vanim_c differ diff --git a/models/thd_hero/soga/2c74cc4a/idle.vanim_c b/models/thd_hero/soga/2c74cc4a/idle.vanim_c new file mode 100755 index 0000000..e1de67f Binary files /dev/null and b/models/thd_hero/soga/2c74cc4a/idle.vanim_c differ diff --git a/models/thd_hero/soga/2c74cc4a/run.vanim_c b/models/thd_hero/soga/2c74cc4a/run.vanim_c new file mode 100755 index 0000000..36d4bcf Binary files /dev/null and b/models/thd_hero/soga/2c74cc4a/run.vanim_c differ diff --git a/models/thd_hero/soga/2c74cc4a/soga_animation.vanim_c b/models/thd_hero/soga/2c74cc4a/soga_animation.vanim_c new file mode 100755 index 0000000..04e492a Binary files /dev/null and b/models/thd_hero/soga/2c74cc4a/soga_animation.vanim_c differ diff --git a/models/thd_hero/soga/item/6f9630fe/attack.vanim_c b/models/thd_hero/soga/item/6f9630fe/attack.vanim_c new file mode 100755 index 0000000..e8399d2 Binary files /dev/null and b/models/thd_hero/soga/item/6f9630fe/attack.vanim_c differ diff --git a/models/thd_hero/soga/item/6f9630fe/cast.vanim_c b/models/thd_hero/soga/item/6f9630fe/cast.vanim_c new file mode 100755 index 0000000..550a863 Binary files /dev/null and b/models/thd_hero/soga/item/6f9630fe/cast.vanim_c differ diff --git a/models/thd_hero/soga/item/6f9630fe/idle.vanim_c b/models/thd_hero/soga/item/6f9630fe/idle.vanim_c new file mode 100755 index 0000000..c836a0e Binary files /dev/null and b/models/thd_hero/soga/item/6f9630fe/idle.vanim_c differ diff --git a/models/thd_hero/soga/item/6f9630fe/run.vanim_c b/models/thd_hero/soga/item/6f9630fe/run.vanim_c new file mode 100755 index 0000000..ddae84a Binary files /dev/null and b/models/thd_hero/soga/item/6f9630fe/run.vanim_c differ diff --git a/models/thd_hero/soga/item/item_soga.vmdl_c b/models/thd_hero/soga/item/item_soga.vmdl_c new file mode 100755 index 0000000..19da352 Binary files /dev/null and b/models/thd_hero/soga/item/item_soga.vmdl_c differ diff --git a/models/thd_hero/soga/item/item_soga_6f9630fe.vagrp_c b/models/thd_hero/soga/item/item_soga_6f9630fe.vagrp_c new file mode 100755 index 0000000..297176b Binary files /dev/null and b/models/thd_hero/soga/item/item_soga_6f9630fe.vagrp_c differ diff --git a/models/thd_hero/soga/item/soga.vmesh_c b/models/thd_hero/soga/item/soga.vmesh_c new file mode 100755 index 0000000..9c62932 Binary files /dev/null and b/models/thd_hero/soga/item/soga.vmesh_c differ diff --git a/models/thd_hero/soga/soga.vmdl_c b/models/thd_hero/soga/soga.vmdl_c new file mode 100755 index 0000000..d107954 Binary files /dev/null and b/models/thd_hero/soga/soga.vmdl_c differ diff --git a/models/thd_hero/soga/soga.vmesh_c b/models/thd_hero/soga/soga.vmesh_c new file mode 100755 index 0000000..1592e11 Binary files /dev/null and b/models/thd_hero/soga/soga.vmesh_c differ diff --git a/models/thd_hero/soga/soga_2c74cc4a.vagrp_c b/models/thd_hero/soga/soga_2c74cc4a.vagrp_c new file mode 100755 index 0000000..bd1ad27 Binary files /dev/null and b/models/thd_hero/soga/soga_2c74cc4a.vagrp_c differ diff --git a/models/thd_hero/star/90348ef2/attack.vanim_c b/models/thd_hero/star/90348ef2/attack.vanim_c new file mode 100755 index 0000000..b75a7b2 Binary files /dev/null and b/models/thd_hero/star/90348ef2/attack.vanim_c differ diff --git a/models/thd_hero/star/90348ef2/cast.vanim_c b/models/thd_hero/star/90348ef2/cast.vanim_c new file mode 100755 index 0000000..4ba4189 Binary files /dev/null and b/models/thd_hero/star/90348ef2/cast.vanim_c differ diff --git a/models/thd_hero/star/90348ef2/cast1.vanim_c b/models/thd_hero/star/90348ef2/cast1.vanim_c new file mode 100755 index 0000000..40b1c59 Binary files /dev/null and b/models/thd_hero/star/90348ef2/cast1.vanim_c differ diff --git a/models/thd_hero/star/90348ef2/cast2.vanim_c b/models/thd_hero/star/90348ef2/cast2.vanim_c new file mode 100755 index 0000000..4df3e3e Binary files /dev/null and b/models/thd_hero/star/90348ef2/cast2.vanim_c differ diff --git a/models/thd_hero/star/90348ef2/idle.vanim_c b/models/thd_hero/star/90348ef2/idle.vanim_c new file mode 100755 index 0000000..56e5b65 Binary files /dev/null and b/models/thd_hero/star/90348ef2/idle.vanim_c differ diff --git a/models/thd_hero/star/90348ef2/run.vanim_c b/models/thd_hero/star/90348ef2/run.vanim_c new file mode 100755 index 0000000..65f3699 Binary files /dev/null and b/models/thd_hero/star/90348ef2/run.vanim_c differ diff --git a/models/thd_hero/star/90348ef2/star_animation.vanim_c b/models/thd_hero/star/90348ef2/star_animation.vanim_c new file mode 100755 index 0000000..66fa3e7 Binary files /dev/null and b/models/thd_hero/star/90348ef2/star_animation.vanim_c differ diff --git a/models/thd_hero/star/item/d0190302/attack.vanim_c b/models/thd_hero/star/item/d0190302/attack.vanim_c new file mode 100755 index 0000000..402e784 Binary files /dev/null and b/models/thd_hero/star/item/d0190302/attack.vanim_c differ diff --git a/models/thd_hero/star/item/d0190302/cast1.vanim_c b/models/thd_hero/star/item/d0190302/cast1.vanim_c new file mode 100755 index 0000000..4aa4c9e Binary files /dev/null and b/models/thd_hero/star/item/d0190302/cast1.vanim_c differ diff --git a/models/thd_hero/star/item/d0190302/cast2.vanim_c b/models/thd_hero/star/item/d0190302/cast2.vanim_c new file mode 100755 index 0000000..bb04027 Binary files /dev/null and b/models/thd_hero/star/item/d0190302/cast2.vanim_c differ diff --git a/models/thd_hero/star/item/d0190302/idle.vanim_c b/models/thd_hero/star/item/d0190302/idle.vanim_c new file mode 100755 index 0000000..8c4a511 Binary files /dev/null and b/models/thd_hero/star/item/d0190302/idle.vanim_c differ diff --git a/models/thd_hero/star/item/d0190302/run.vanim_c b/models/thd_hero/star/item/d0190302/run.vanim_c new file mode 100755 index 0000000..e5df0c9 Binary files /dev/null and b/models/thd_hero/star/item/d0190302/run.vanim_c differ diff --git a/models/thd_hero/star/item/item_star.vmdl_c b/models/thd_hero/star/item/item_star.vmdl_c new file mode 100755 index 0000000..42b6db7 Binary files /dev/null and b/models/thd_hero/star/item/item_star.vmdl_c differ diff --git a/models/thd_hero/star/item/item_star_d0190302.vagrp_c b/models/thd_hero/star/item/item_star_d0190302.vagrp_c new file mode 100755 index 0000000..de0d352 Binary files /dev/null and b/models/thd_hero/star/item/item_star_d0190302.vagrp_c differ diff --git a/models/thd_hero/star/item/star.vmesh_c b/models/thd_hero/star/item/star.vmesh_c new file mode 100755 index 0000000..7f2a674 Binary files /dev/null and b/models/thd_hero/star/item/star.vmesh_c differ diff --git a/models/thd_hero/star/star.vmdl_c b/models/thd_hero/star/star.vmdl_c new file mode 100755 index 0000000..0681bce Binary files /dev/null and b/models/thd_hero/star/star.vmdl_c differ diff --git a/models/thd_hero/star/star.vmesh_c b/models/thd_hero/star/star.vmesh_c new file mode 100755 index 0000000..f86158b Binary files /dev/null and b/models/thd_hero/star/star.vmesh_c differ diff --git a/models/thd_hero/star/star_90348ef2.vagrp_c b/models/thd_hero/star/star_90348ef2.vagrp_c new file mode 100755 index 0000000..7682cc0 Binary files /dev/null and b/models/thd_hero/star/star_90348ef2.vagrp_c differ diff --git a/models/thd_hero/suika/72304f25/1.vanim_c b/models/thd_hero/suika/72304f25/1.vanim_c new file mode 100755 index 0000000..5addc31 Binary files /dev/null and b/models/thd_hero/suika/72304f25/1.vanim_c differ diff --git a/models/thd_hero/suika/72304f25/attack.vanim_c b/models/thd_hero/suika/72304f25/attack.vanim_c new file mode 100755 index 0000000..01d10cf Binary files /dev/null and b/models/thd_hero/suika/72304f25/attack.vanim_c differ diff --git a/models/thd_hero/suika/72304f25/cast.vanim_c b/models/thd_hero/suika/72304f25/cast.vanim_c new file mode 100755 index 0000000..7266330 Binary files /dev/null and b/models/thd_hero/suika/72304f25/cast.vanim_c differ diff --git a/models/thd_hero/suika/72304f25/idle.vanim_c b/models/thd_hero/suika/72304f25/idle.vanim_c new file mode 100755 index 0000000..68f7aa8 Binary files /dev/null and b/models/thd_hero/suika/72304f25/idle.vanim_c differ diff --git a/models/thd_hero/suika/72304f25/run.vanim_c b/models/thd_hero/suika/72304f25/run.vanim_c new file mode 100755 index 0000000..34291a8 Binary files /dev/null and b/models/thd_hero/suika/72304f25/run.vanim_c differ diff --git a/models/thd_hero/suika/72304f25/suika_animation.vanim_c b/models/thd_hero/suika/72304f25/suika_animation.vanim_c new file mode 100755 index 0000000..f9b2af5 Binary files /dev/null and b/models/thd_hero/suika/72304f25/suika_animation.vanim_c differ diff --git a/models/thd_hero/suika/item/0467a7b1/1.vanim_c b/models/thd_hero/suika/item/0467a7b1/1.vanim_c new file mode 100755 index 0000000..3b983dd Binary files /dev/null and b/models/thd_hero/suika/item/0467a7b1/1.vanim_c differ diff --git a/models/thd_hero/suika/item/0467a7b1/attack.vanim_c b/models/thd_hero/suika/item/0467a7b1/attack.vanim_c new file mode 100755 index 0000000..d98511c Binary files /dev/null and b/models/thd_hero/suika/item/0467a7b1/attack.vanim_c differ diff --git a/models/thd_hero/suika/item/0467a7b1/cast.vanim_c b/models/thd_hero/suika/item/0467a7b1/cast.vanim_c new file mode 100755 index 0000000..27d3f40 Binary files /dev/null and b/models/thd_hero/suika/item/0467a7b1/cast.vanim_c differ diff --git a/models/thd_hero/suika/item/0467a7b1/idle.vanim_c b/models/thd_hero/suika/item/0467a7b1/idle.vanim_c new file mode 100755 index 0000000..333c1f8 Binary files /dev/null and b/models/thd_hero/suika/item/0467a7b1/idle.vanim_c differ diff --git a/models/thd_hero/suika/item/0467a7b1/run.vanim_c b/models/thd_hero/suika/item/0467a7b1/run.vanim_c new file mode 100755 index 0000000..dc33422 Binary files /dev/null and b/models/thd_hero/suika/item/0467a7b1/run.vanim_c differ diff --git a/models/thd_hero/suika/item/item_suika.vmdl_c b/models/thd_hero/suika/item/item_suika.vmdl_c new file mode 100755 index 0000000..5289bb2 Binary files /dev/null and b/models/thd_hero/suika/item/item_suika.vmdl_c differ diff --git a/models/thd_hero/suika/item/item_suika_0467a7b1.vagrp_c b/models/thd_hero/suika/item/item_suika_0467a7b1.vagrp_c new file mode 100755 index 0000000..f7f43ec Binary files /dev/null and b/models/thd_hero/suika/item/item_suika_0467a7b1.vagrp_c differ diff --git a/models/thd_hero/suika/item/suika.vmesh_c b/models/thd_hero/suika/item/suika.vmesh_c new file mode 100755 index 0000000..b82c286 Binary files /dev/null and b/models/thd_hero/suika/item/suika.vmesh_c differ diff --git a/models/thd_hero/suika/suika.vmdl_c b/models/thd_hero/suika/suika.vmdl_c new file mode 100755 index 0000000..21fea7a Binary files /dev/null and b/models/thd_hero/suika/suika.vmdl_c differ diff --git a/models/thd_hero/suika/suika.vmesh_c b/models/thd_hero/suika/suika.vmesh_c new file mode 100755 index 0000000..b5eca6d Binary files /dev/null and b/models/thd_hero/suika/suika.vmesh_c differ diff --git a/models/thd_hero/suika/suika_72304f25.vagrp_c b/models/thd_hero/suika/suika_72304f25.vagrp_c new file mode 100755 index 0000000..1e44ec8 Binary files /dev/null and b/models/thd_hero/suika/suika_72304f25.vagrp_c differ diff --git a/models/thd_hero/sunny/63e4853b/attack.vanim_c b/models/thd_hero/sunny/63e4853b/attack.vanim_c new file mode 100755 index 0000000..e12c64a Binary files /dev/null and b/models/thd_hero/sunny/63e4853b/attack.vanim_c differ diff --git a/models/thd_hero/sunny/63e4853b/cast.vanim_c b/models/thd_hero/sunny/63e4853b/cast.vanim_c new file mode 100755 index 0000000..cf6a2fd Binary files /dev/null and b/models/thd_hero/sunny/63e4853b/cast.vanim_c differ diff --git a/models/thd_hero/sunny/63e4853b/idle.vanim_c b/models/thd_hero/sunny/63e4853b/idle.vanim_c new file mode 100755 index 0000000..1867258 Binary files /dev/null and b/models/thd_hero/sunny/63e4853b/idle.vanim_c differ diff --git a/models/thd_hero/sunny/63e4853b/run.vanim_c b/models/thd_hero/sunny/63e4853b/run.vanim_c new file mode 100755 index 0000000..bee4f00 Binary files /dev/null and b/models/thd_hero/sunny/63e4853b/run.vanim_c differ diff --git a/models/thd_hero/sunny/63e4853b/sunny_animation.vanim_c b/models/thd_hero/sunny/63e4853b/sunny_animation.vanim_c new file mode 100755 index 0000000..19aa6b2 Binary files /dev/null and b/models/thd_hero/sunny/63e4853b/sunny_animation.vanim_c differ diff --git a/models/thd_hero/sunny/item/f1d06bc1/attack.vanim_c b/models/thd_hero/sunny/item/f1d06bc1/attack.vanim_c new file mode 100755 index 0000000..3ce656c Binary files /dev/null and b/models/thd_hero/sunny/item/f1d06bc1/attack.vanim_c differ diff --git a/models/thd_hero/sunny/item/f1d06bc1/cast.vanim_c b/models/thd_hero/sunny/item/f1d06bc1/cast.vanim_c new file mode 100755 index 0000000..57460ec Binary files /dev/null and b/models/thd_hero/sunny/item/f1d06bc1/cast.vanim_c differ diff --git a/models/thd_hero/sunny/item/f1d06bc1/idle.vanim_c b/models/thd_hero/sunny/item/f1d06bc1/idle.vanim_c new file mode 100755 index 0000000..3e35e8c Binary files /dev/null and b/models/thd_hero/sunny/item/f1d06bc1/idle.vanim_c differ diff --git a/models/thd_hero/sunny/item/f1d06bc1/run.vanim_c b/models/thd_hero/sunny/item/f1d06bc1/run.vanim_c new file mode 100755 index 0000000..88f6cb2 Binary files /dev/null and b/models/thd_hero/sunny/item/f1d06bc1/run.vanim_c differ diff --git a/models/thd_hero/sunny/item/item_sunny.vmdl_c b/models/thd_hero/sunny/item/item_sunny.vmdl_c new file mode 100755 index 0000000..03d2105 Binary files /dev/null and b/models/thd_hero/sunny/item/item_sunny.vmdl_c differ diff --git a/models/thd_hero/sunny/item/item_sunny_f1d06bc1.vagrp_c b/models/thd_hero/sunny/item/item_sunny_f1d06bc1.vagrp_c new file mode 100755 index 0000000..76e29e9 Binary files /dev/null and b/models/thd_hero/sunny/item/item_sunny_f1d06bc1.vagrp_c differ diff --git a/models/thd_hero/sunny/item/sunny.vmesh_c b/models/thd_hero/sunny/item/sunny.vmesh_c new file mode 100755 index 0000000..81cff1b Binary files /dev/null and b/models/thd_hero/sunny/item/sunny.vmesh_c differ diff --git a/models/thd_hero/sunny/sunny.vmdl_c b/models/thd_hero/sunny/sunny.vmdl_c new file mode 100755 index 0000000..bf871b5 Binary files /dev/null and b/models/thd_hero/sunny/sunny.vmdl_c differ diff --git a/models/thd_hero/sunny/sunny.vmesh_c b/models/thd_hero/sunny/sunny.vmesh_c new file mode 100755 index 0000000..d376f6e Binary files /dev/null and b/models/thd_hero/sunny/sunny.vmesh_c differ diff --git a/models/thd_hero/sunny/sunny_63e4853b.vagrp_c b/models/thd_hero/sunny/sunny_63e4853b.vagrp_c new file mode 100755 index 0000000..20d673f Binary files /dev/null and b/models/thd_hero/sunny/sunny_63e4853b.vagrp_c differ diff --git a/models/thd_hero/suwako/0f13e432/attack.vanim_c b/models/thd_hero/suwako/0f13e432/attack.vanim_c new file mode 100755 index 0000000..097fae9 Binary files /dev/null and b/models/thd_hero/suwako/0f13e432/attack.vanim_c differ diff --git a/models/thd_hero/suwako/0f13e432/cast.vanim_c b/models/thd_hero/suwako/0f13e432/cast.vanim_c new file mode 100755 index 0000000..0f55dea Binary files /dev/null and b/models/thd_hero/suwako/0f13e432/cast.vanim_c differ diff --git a/models/thd_hero/suwako/0f13e432/idle.vanim_c b/models/thd_hero/suwako/0f13e432/idle.vanim_c new file mode 100755 index 0000000..c4874c4 Binary files /dev/null and b/models/thd_hero/suwako/0f13e432/idle.vanim_c differ diff --git a/models/thd_hero/suwako/0f13e432/run.vanim_c b/models/thd_hero/suwako/0f13e432/run.vanim_c new file mode 100755 index 0000000..7b0e947 Binary files /dev/null and b/models/thd_hero/suwako/0f13e432/run.vanim_c differ diff --git a/models/thd_hero/suwako/0f13e432/suwako_animation.vanim_c b/models/thd_hero/suwako/0f13e432/suwako_animation.vanim_c new file mode 100755 index 0000000..cdc48fb Binary files /dev/null and b/models/thd_hero/suwako/0f13e432/suwako_animation.vanim_c differ diff --git a/models/thd_hero/suwako/cloth01/a8514d45/attack.vanim_c b/models/thd_hero/suwako/cloth01/a8514d45/attack.vanim_c new file mode 100755 index 0000000..e591aa7 Binary files /dev/null and b/models/thd_hero/suwako/cloth01/a8514d45/attack.vanim_c differ diff --git a/models/thd_hero/suwako/cloth01/a8514d45/cast.vanim_c b/models/thd_hero/suwako/cloth01/a8514d45/cast.vanim_c new file mode 100755 index 0000000..255b308 Binary files /dev/null and b/models/thd_hero/suwako/cloth01/a8514d45/cast.vanim_c differ diff --git a/models/thd_hero/suwako/cloth01/a8514d45/idle.vanim_c b/models/thd_hero/suwako/cloth01/a8514d45/idle.vanim_c new file mode 100755 index 0000000..4a90996 Binary files /dev/null and b/models/thd_hero/suwako/cloth01/a8514d45/idle.vanim_c differ diff --git a/models/thd_hero/suwako/cloth01/a8514d45/run.vanim_c b/models/thd_hero/suwako/cloth01/a8514d45/run.vanim_c new file mode 100755 index 0000000..01acec6 Binary files /dev/null and b/models/thd_hero/suwako/cloth01/a8514d45/run.vanim_c differ diff --git a/models/thd_hero/suwako/cloth01/a8514d45/suwako_cloth01_animation.vanim_c b/models/thd_hero/suwako/cloth01/a8514d45/suwako_cloth01_animation.vanim_c new file mode 100755 index 0000000..7c2dbe9 Binary files /dev/null and b/models/thd_hero/suwako/cloth01/a8514d45/suwako_cloth01_animation.vanim_c differ diff --git a/models/thd_hero/suwako/cloth01/suwako_cloth01.vmdl_c b/models/thd_hero/suwako/cloth01/suwako_cloth01.vmdl_c new file mode 100755 index 0000000..e466d45 Binary files /dev/null and b/models/thd_hero/suwako/cloth01/suwako_cloth01.vmdl_c differ diff --git a/models/thd_hero/suwako/cloth01/suwako_cloth01.vmesh_c b/models/thd_hero/suwako/cloth01/suwako_cloth01.vmesh_c new file mode 100755 index 0000000..83b3d9f Binary files /dev/null and b/models/thd_hero/suwako/cloth01/suwako_cloth01.vmesh_c differ diff --git a/models/thd_hero/suwako/cloth01/suwako_cloth01_a8514d45.vagrp_c b/models/thd_hero/suwako/cloth01/suwako_cloth01_a8514d45.vagrp_c new file mode 100755 index 0000000..6be5d9b Binary files /dev/null and b/models/thd_hero/suwako/cloth01/suwako_cloth01_a8514d45.vagrp_c differ diff --git a/models/thd_hero/suwako/item/c9449a02/attack.vanim_c b/models/thd_hero/suwako/item/c9449a02/attack.vanim_c new file mode 100755 index 0000000..6b7706f Binary files /dev/null and b/models/thd_hero/suwako/item/c9449a02/attack.vanim_c differ diff --git a/models/thd_hero/suwako/item/c9449a02/cast.vanim_c b/models/thd_hero/suwako/item/c9449a02/cast.vanim_c new file mode 100755 index 0000000..35c4598 Binary files /dev/null and b/models/thd_hero/suwako/item/c9449a02/cast.vanim_c differ diff --git a/models/thd_hero/suwako/item/c9449a02/idle.vanim_c b/models/thd_hero/suwako/item/c9449a02/idle.vanim_c new file mode 100755 index 0000000..b1f16d9 Binary files /dev/null and b/models/thd_hero/suwako/item/c9449a02/idle.vanim_c differ diff --git a/models/thd_hero/suwako/item/c9449a02/run.vanim_c b/models/thd_hero/suwako/item/c9449a02/run.vanim_c new file mode 100755 index 0000000..ddda30f Binary files /dev/null and b/models/thd_hero/suwako/item/c9449a02/run.vanim_c differ diff --git a/models/thd_hero/suwako/item/item_suwako.vmdl_c b/models/thd_hero/suwako/item/item_suwako.vmdl_c new file mode 100755 index 0000000..e920723 Binary files /dev/null and b/models/thd_hero/suwako/item/item_suwako.vmdl_c differ diff --git a/models/thd_hero/suwako/item/item_suwako_c9449a02.vagrp_c b/models/thd_hero/suwako/item/item_suwako_c9449a02.vagrp_c new file mode 100755 index 0000000..fea1167 Binary files /dev/null and b/models/thd_hero/suwako/item/item_suwako_c9449a02.vagrp_c differ diff --git a/models/thd_hero/suwako/item/suwako.vmesh_c b/models/thd_hero/suwako/item/suwako.vmesh_c new file mode 100755 index 0000000..15f01d6 Binary files /dev/null and b/models/thd_hero/suwako/item/suwako.vmesh_c differ diff --git a/models/thd_hero/suwako/suwako.vmdl_c b/models/thd_hero/suwako/suwako.vmdl_c new file mode 100755 index 0000000..67ce61b Binary files /dev/null and b/models/thd_hero/suwako/suwako.vmdl_c differ diff --git a/models/thd_hero/suwako/suwako.vmesh_c b/models/thd_hero/suwako/suwako.vmesh_c new file mode 100755 index 0000000..61a6c93 Binary files /dev/null and b/models/thd_hero/suwako/suwako.vmesh_c differ diff --git a/models/thd_hero/suwako/suwako_0f13e432.vagrp_c b/models/thd_hero/suwako/suwako_0f13e432.vagrp_c new file mode 100755 index 0000000..87a79b2 Binary files /dev/null and b/models/thd_hero/suwako/suwako_0f13e432.vagrp_c differ diff --git a/models/thd_hero/toramarushou/18724460/attack1.vanim_c b/models/thd_hero/toramarushou/18724460/attack1.vanim_c new file mode 100755 index 0000000..15f916e Binary files /dev/null and b/models/thd_hero/toramarushou/18724460/attack1.vanim_c differ diff --git a/models/thd_hero/toramarushou/18724460/attack2.vanim_c b/models/thd_hero/toramarushou/18724460/attack2.vanim_c new file mode 100755 index 0000000..4a054a9 Binary files /dev/null and b/models/thd_hero/toramarushou/18724460/attack2.vanim_c differ diff --git a/models/thd_hero/toramarushou/18724460/cast1.vanim_c b/models/thd_hero/toramarushou/18724460/cast1.vanim_c new file mode 100755 index 0000000..a1ea46a Binary files /dev/null and b/models/thd_hero/toramarushou/18724460/cast1.vanim_c differ diff --git a/models/thd_hero/toramarushou/18724460/cast4.vanim_c b/models/thd_hero/toramarushou/18724460/cast4.vanim_c new file mode 100755 index 0000000..efc60c2 Binary files /dev/null and b/models/thd_hero/toramarushou/18724460/cast4.vanim_c differ diff --git a/models/thd_hero/toramarushou/18724460/idle.vanim_c b/models/thd_hero/toramarushou/18724460/idle.vanim_c new file mode 100755 index 0000000..ad9717f Binary files /dev/null and b/models/thd_hero/toramarushou/18724460/idle.vanim_c differ diff --git a/models/thd_hero/toramarushou/18724460/run.vanim_c b/models/thd_hero/toramarushou/18724460/run.vanim_c new file mode 100755 index 0000000..45f1b99 Binary files /dev/null and b/models/thd_hero/toramarushou/18724460/run.vanim_c differ diff --git a/models/thd_hero/toramarushou/item/42cccd21/attack1.vanim_c b/models/thd_hero/toramarushou/item/42cccd21/attack1.vanim_c new file mode 100755 index 0000000..be5ba94 Binary files /dev/null and b/models/thd_hero/toramarushou/item/42cccd21/attack1.vanim_c differ diff --git a/models/thd_hero/toramarushou/item/42cccd21/attack2.vanim_c b/models/thd_hero/toramarushou/item/42cccd21/attack2.vanim_c new file mode 100755 index 0000000..3fbca6a Binary files /dev/null and b/models/thd_hero/toramarushou/item/42cccd21/attack2.vanim_c differ diff --git a/models/thd_hero/toramarushou/item/42cccd21/cast1.vanim_c b/models/thd_hero/toramarushou/item/42cccd21/cast1.vanim_c new file mode 100755 index 0000000..c917676 Binary files /dev/null and b/models/thd_hero/toramarushou/item/42cccd21/cast1.vanim_c differ diff --git a/models/thd_hero/toramarushou/item/42cccd21/cast4.vanim_c b/models/thd_hero/toramarushou/item/42cccd21/cast4.vanim_c new file mode 100755 index 0000000..e633ae1 Binary files /dev/null and b/models/thd_hero/toramarushou/item/42cccd21/cast4.vanim_c differ diff --git a/models/thd_hero/toramarushou/item/42cccd21/idle.vanim_c b/models/thd_hero/toramarushou/item/42cccd21/idle.vanim_c new file mode 100755 index 0000000..2828c8f Binary files /dev/null and b/models/thd_hero/toramarushou/item/42cccd21/idle.vanim_c differ diff --git a/models/thd_hero/toramarushou/item/42cccd21/run.vanim_c b/models/thd_hero/toramarushou/item/42cccd21/run.vanim_c new file mode 100755 index 0000000..5064865 Binary files /dev/null and b/models/thd_hero/toramarushou/item/42cccd21/run.vanim_c differ diff --git a/models/thd_hero/toramarushou/item/item_toramarushou.vmdl_c b/models/thd_hero/toramarushou/item/item_toramarushou.vmdl_c new file mode 100755 index 0000000..00d8258 Binary files /dev/null and b/models/thd_hero/toramarushou/item/item_toramarushou.vmdl_c differ diff --git a/models/thd_hero/toramarushou/item/item_toramarushou_42cccd21.vagrp_c b/models/thd_hero/toramarushou/item/item_toramarushou_42cccd21.vagrp_c new file mode 100755 index 0000000..619d1d2 Binary files /dev/null and b/models/thd_hero/toramarushou/item/item_toramarushou_42cccd21.vagrp_c differ diff --git a/models/thd_hero/toramarushou/item/toramarushou.vmesh_c b/models/thd_hero/toramarushou/item/toramarushou.vmesh_c new file mode 100755 index 0000000..0c67205 Binary files /dev/null and b/models/thd_hero/toramarushou/item/toramarushou.vmesh_c differ diff --git a/models/thd_hero/toramarushou/toramarushou.vmdl_c b/models/thd_hero/toramarushou/toramarushou.vmdl_c new file mode 100755 index 0000000..bd61f67 Binary files /dev/null and b/models/thd_hero/toramarushou/toramarushou.vmdl_c differ diff --git a/models/thd_hero/toramarushou/toramarushou.vmesh_c b/models/thd_hero/toramarushou/toramarushou.vmesh_c new file mode 100755 index 0000000..a110a78 Binary files /dev/null and b/models/thd_hero/toramarushou/toramarushou.vmesh_c differ diff --git a/models/thd_hero/toramarushou/toramarushou_18724460.vagrp_c b/models/thd_hero/toramarushou/toramarushou_18724460.vagrp_c new file mode 100755 index 0000000..7f4d43b Binary files /dev/null and b/models/thd_hero/toramarushou/toramarushou_18724460.vagrp_c differ diff --git a/models/thd_hero/utsuho/10bc5e91/attack.vanim_c b/models/thd_hero/utsuho/10bc5e91/attack.vanim_c new file mode 100755 index 0000000..05356a8 Binary files /dev/null and b/models/thd_hero/utsuho/10bc5e91/attack.vanim_c differ diff --git a/models/thd_hero/utsuho/10bc5e91/cast1.vanim_c b/models/thd_hero/utsuho/10bc5e91/cast1.vanim_c new file mode 100755 index 0000000..889ed4e Binary files /dev/null and b/models/thd_hero/utsuho/10bc5e91/cast1.vanim_c differ diff --git a/models/thd_hero/utsuho/10bc5e91/cast3.vanim_c b/models/thd_hero/utsuho/10bc5e91/cast3.vanim_c new file mode 100755 index 0000000..688bebe Binary files /dev/null and b/models/thd_hero/utsuho/10bc5e91/cast3.vanim_c differ diff --git a/models/thd_hero/utsuho/10bc5e91/cast4.vanim_c b/models/thd_hero/utsuho/10bc5e91/cast4.vanim_c new file mode 100755 index 0000000..93c2937 Binary files /dev/null and b/models/thd_hero/utsuho/10bc5e91/cast4.vanim_c differ diff --git a/models/thd_hero/utsuho/10bc5e91/idle.vanim_c b/models/thd_hero/utsuho/10bc5e91/idle.vanim_c new file mode 100755 index 0000000..7a2acac Binary files /dev/null and b/models/thd_hero/utsuho/10bc5e91/idle.vanim_c differ diff --git a/models/thd_hero/utsuho/10bc5e91/por.vanim_c b/models/thd_hero/utsuho/10bc5e91/por.vanim_c new file mode 100755 index 0000000..80002f6 Binary files /dev/null and b/models/thd_hero/utsuho/10bc5e91/por.vanim_c differ diff --git a/models/thd_hero/utsuho/10bc5e91/run.vanim_c b/models/thd_hero/utsuho/10bc5e91/run.vanim_c new file mode 100755 index 0000000..2fa6c01 Binary files /dev/null and b/models/thd_hero/utsuho/10bc5e91/run.vanim_c differ diff --git a/models/thd_hero/utsuho/item/423c2a71/idle.vanim_c b/models/thd_hero/utsuho/item/423c2a71/idle.vanim_c new file mode 100755 index 0000000..b945c80 Binary files /dev/null and b/models/thd_hero/utsuho/item/423c2a71/idle.vanim_c differ diff --git a/models/thd_hero/utsuho/item/423c2a71/por.vanim_c b/models/thd_hero/utsuho/item/423c2a71/por.vanim_c new file mode 100755 index 0000000..f9b85fb Binary files /dev/null and b/models/thd_hero/utsuho/item/423c2a71/por.vanim_c differ diff --git a/models/thd_hero/utsuho/item/item_utsuho.vmdl_c b/models/thd_hero/utsuho/item/item_utsuho.vmdl_c new file mode 100755 index 0000000..4171041 Binary files /dev/null and b/models/thd_hero/utsuho/item/item_utsuho.vmdl_c differ diff --git a/models/thd_hero/utsuho/item/item_utsuho_423c2a71.vagrp_c b/models/thd_hero/utsuho/item/item_utsuho_423c2a71.vagrp_c new file mode 100755 index 0000000..6bb5a8c Binary files /dev/null and b/models/thd_hero/utsuho/item/item_utsuho_423c2a71.vagrp_c differ diff --git a/models/thd_hero/utsuho/item/utsuho.vmesh_c b/models/thd_hero/utsuho/item/utsuho.vmesh_c new file mode 100755 index 0000000..3f107e4 Binary files /dev/null and b/models/thd_hero/utsuho/item/utsuho.vmesh_c differ diff --git a/models/thd_hero/utsuho/utsuho.vmdl_c b/models/thd_hero/utsuho/utsuho.vmdl_c new file mode 100755 index 0000000..324f293 Binary files /dev/null and b/models/thd_hero/utsuho/utsuho.vmdl_c differ diff --git a/models/thd_hero/utsuho/utsuho.vmesh_c b/models/thd_hero/utsuho/utsuho.vmesh_c new file mode 100755 index 0000000..63ab272 Binary files /dev/null and b/models/thd_hero/utsuho/utsuho.vmesh_c differ diff --git a/models/thd_hero/utsuho/utsuho_10bc5e91.vagrp_c b/models/thd_hero/utsuho/utsuho_10bc5e91.vagrp_c new file mode 100755 index 0000000..485623d Binary files /dev/null and b/models/thd_hero/utsuho/utsuho_10bc5e91.vagrp_c differ diff --git a/models/thd_hero/wakasagihime/e08c99de/attack.vanim_c b/models/thd_hero/wakasagihime/e08c99de/attack.vanim_c new file mode 100755 index 0000000..44068a8 Binary files /dev/null and b/models/thd_hero/wakasagihime/e08c99de/attack.vanim_c differ diff --git a/models/thd_hero/wakasagihime/e08c99de/cast.vanim_c b/models/thd_hero/wakasagihime/e08c99de/cast.vanim_c new file mode 100755 index 0000000..b99ebb0 Binary files /dev/null and b/models/thd_hero/wakasagihime/e08c99de/cast.vanim_c differ diff --git a/models/thd_hero/wakasagihime/e08c99de/idle.vanim_c b/models/thd_hero/wakasagihime/e08c99de/idle.vanim_c new file mode 100755 index 0000000..a7800b9 Binary files /dev/null and b/models/thd_hero/wakasagihime/e08c99de/idle.vanim_c differ diff --git a/models/thd_hero/wakasagihime/e08c99de/run.vanim_c b/models/thd_hero/wakasagihime/e08c99de/run.vanim_c new file mode 100755 index 0000000..665a154 Binary files /dev/null and b/models/thd_hero/wakasagihime/e08c99de/run.vanim_c differ diff --git a/models/thd_hero/wakasagihime/e08c99de/wakasagihime_animation.vanim_c b/models/thd_hero/wakasagihime/e08c99de/wakasagihime_animation.vanim_c new file mode 100755 index 0000000..231ac0f Binary files /dev/null and b/models/thd_hero/wakasagihime/e08c99de/wakasagihime_animation.vanim_c differ diff --git a/models/thd_hero/wakasagihime/item/2a889b2d/attack.vanim_c b/models/thd_hero/wakasagihime/item/2a889b2d/attack.vanim_c new file mode 100755 index 0000000..0a7c38d Binary files /dev/null and b/models/thd_hero/wakasagihime/item/2a889b2d/attack.vanim_c differ diff --git a/models/thd_hero/wakasagihime/item/2a889b2d/cast.vanim_c b/models/thd_hero/wakasagihime/item/2a889b2d/cast.vanim_c new file mode 100755 index 0000000..2f43414 Binary files /dev/null and b/models/thd_hero/wakasagihime/item/2a889b2d/cast.vanim_c differ diff --git a/models/thd_hero/wakasagihime/item/2a889b2d/idle.vanim_c b/models/thd_hero/wakasagihime/item/2a889b2d/idle.vanim_c new file mode 100755 index 0000000..63b9092 Binary files /dev/null and b/models/thd_hero/wakasagihime/item/2a889b2d/idle.vanim_c differ diff --git a/models/thd_hero/wakasagihime/item/2a889b2d/run.vanim_c b/models/thd_hero/wakasagihime/item/2a889b2d/run.vanim_c new file mode 100755 index 0000000..5a6ff1d Binary files /dev/null and b/models/thd_hero/wakasagihime/item/2a889b2d/run.vanim_c differ diff --git a/models/thd_hero/wakasagihime/item/item_wakasagihime.vmdl_c b/models/thd_hero/wakasagihime/item/item_wakasagihime.vmdl_c new file mode 100755 index 0000000..a621547 Binary files /dev/null and b/models/thd_hero/wakasagihime/item/item_wakasagihime.vmdl_c differ diff --git a/models/thd_hero/wakasagihime/item/item_wakasagihime_2a889b2d.vagrp_c b/models/thd_hero/wakasagihime/item/item_wakasagihime_2a889b2d.vagrp_c new file mode 100755 index 0000000..2136b07 Binary files /dev/null and b/models/thd_hero/wakasagihime/item/item_wakasagihime_2a889b2d.vagrp_c differ diff --git a/models/thd_hero/wakasagihime/item/wakasagihime.vmesh_c b/models/thd_hero/wakasagihime/item/wakasagihime.vmesh_c new file mode 100755 index 0000000..997908d Binary files /dev/null and b/models/thd_hero/wakasagihime/item/wakasagihime.vmesh_c differ diff --git a/models/thd_hero/wakasagihime/wakasagihime.vmdl_c b/models/thd_hero/wakasagihime/wakasagihime.vmdl_c new file mode 100755 index 0000000..274e597 Binary files /dev/null and b/models/thd_hero/wakasagihime/wakasagihime.vmdl_c differ diff --git a/models/thd_hero/wakasagihime/wakasagihime.vmesh_c b/models/thd_hero/wakasagihime/wakasagihime.vmesh_c new file mode 100755 index 0000000..c0392a1 Binary files /dev/null and b/models/thd_hero/wakasagihime/wakasagihime.vmesh_c differ diff --git a/models/thd_hero/wakasagihime/wakasagihime_e08c99de.vagrp_c b/models/thd_hero/wakasagihime/wakasagihime_e08c99de.vagrp_c new file mode 100755 index 0000000..910260a Binary files /dev/null and b/models/thd_hero/wakasagihime/wakasagihime_e08c99de.vagrp_c differ diff --git a/models/thd_hero/wiggle/d704dc4f/attack.vanim_c b/models/thd_hero/wiggle/d704dc4f/attack.vanim_c new file mode 100755 index 0000000..9646d4b Binary files /dev/null and b/models/thd_hero/wiggle/d704dc4f/attack.vanim_c differ diff --git a/models/thd_hero/wiggle/d704dc4f/idle.vanim_c b/models/thd_hero/wiggle/d704dc4f/idle.vanim_c new file mode 100755 index 0000000..cade21f Binary files /dev/null and b/models/thd_hero/wiggle/d704dc4f/idle.vanim_c differ diff --git a/models/thd_hero/wiggle/d704dc4f/run.vanim_c b/models/thd_hero/wiggle/d704dc4f/run.vanim_c new file mode 100755 index 0000000..0125eec Binary files /dev/null and b/models/thd_hero/wiggle/d704dc4f/run.vanim_c differ diff --git a/models/thd_hero/wiggle/d704dc4f/wriggle_animation.vanim_c b/models/thd_hero/wiggle/d704dc4f/wriggle_animation.vanim_c new file mode 100755 index 0000000..298acea Binary files /dev/null and b/models/thd_hero/wiggle/d704dc4f/wriggle_animation.vanim_c differ diff --git a/models/thd_hero/wiggle/item/32810c6f/attack.vanim_c b/models/thd_hero/wiggle/item/32810c6f/attack.vanim_c new file mode 100755 index 0000000..51dc200 Binary files /dev/null and b/models/thd_hero/wiggle/item/32810c6f/attack.vanim_c differ diff --git a/models/thd_hero/wiggle/item/32810c6f/idle.vanim_c b/models/thd_hero/wiggle/item/32810c6f/idle.vanim_c new file mode 100755 index 0000000..f5cd79f Binary files /dev/null and b/models/thd_hero/wiggle/item/32810c6f/idle.vanim_c differ diff --git a/models/thd_hero/wiggle/item/32810c6f/run.vanim_c b/models/thd_hero/wiggle/item/32810c6f/run.vanim_c new file mode 100755 index 0000000..89c90e6 Binary files /dev/null and b/models/thd_hero/wiggle/item/32810c6f/run.vanim_c differ diff --git a/models/thd_hero/wiggle/item/item_wiggle.vmdl_c b/models/thd_hero/wiggle/item/item_wiggle.vmdl_c new file mode 100755 index 0000000..42de9dc Binary files /dev/null and b/models/thd_hero/wiggle/item/item_wiggle.vmdl_c differ diff --git a/models/thd_hero/wiggle/item/item_wiggle_32810c6f.vagrp_c b/models/thd_hero/wiggle/item/item_wiggle_32810c6f.vagrp_c new file mode 100755 index 0000000..4a68c33 Binary files /dev/null and b/models/thd_hero/wiggle/item/item_wiggle_32810c6f.vagrp_c differ diff --git a/models/thd_hero/wiggle/item/wriggle.vmesh_c b/models/thd_hero/wiggle/item/wriggle.vmesh_c new file mode 100755 index 0000000..551db54 Binary files /dev/null and b/models/thd_hero/wiggle/item/wriggle.vmesh_c differ diff --git a/models/thd_hero/wiggle/wriggle.vmdl_c b/models/thd_hero/wiggle/wriggle.vmdl_c new file mode 100755 index 0000000..871d78a Binary files /dev/null and b/models/thd_hero/wiggle/wriggle.vmdl_c differ diff --git a/models/thd_hero/wiggle/wriggle.vmesh_c b/models/thd_hero/wiggle/wriggle.vmesh_c new file mode 100755 index 0000000..617b7c3 Binary files /dev/null and b/models/thd_hero/wiggle/wriggle.vmesh_c differ diff --git a/models/thd_hero/wiggle/wriggle_d704dc4f.vagrp_c b/models/thd_hero/wiggle/wriggle_d704dc4f.vagrp_c new file mode 100755 index 0000000..8ec024a Binary files /dev/null and b/models/thd_hero/wiggle/wriggle_d704dc4f.vagrp_c differ diff --git a/models/thd_hero/yamame/58bda2ce/attack.vanim_c b/models/thd_hero/yamame/58bda2ce/attack.vanim_c new file mode 100755 index 0000000..0eb02d2 Binary files /dev/null and b/models/thd_hero/yamame/58bda2ce/attack.vanim_c differ diff --git a/models/thd_hero/yamame/58bda2ce/attack2.vanim_c b/models/thd_hero/yamame/58bda2ce/attack2.vanim_c new file mode 100755 index 0000000..4b1371a Binary files /dev/null and b/models/thd_hero/yamame/58bda2ce/attack2.vanim_c differ diff --git a/models/thd_hero/yamame/58bda2ce/cast.vanim_c b/models/thd_hero/yamame/58bda2ce/cast.vanim_c new file mode 100755 index 0000000..3197e07 Binary files /dev/null and b/models/thd_hero/yamame/58bda2ce/cast.vanim_c differ diff --git a/models/thd_hero/yamame/58bda2ce/idle.vanim_c b/models/thd_hero/yamame/58bda2ce/idle.vanim_c new file mode 100755 index 0000000..e939c21 Binary files /dev/null and b/models/thd_hero/yamame/58bda2ce/idle.vanim_c differ diff --git a/models/thd_hero/yamame/58bda2ce/run.vanim_c b/models/thd_hero/yamame/58bda2ce/run.vanim_c new file mode 100755 index 0000000..595a636 Binary files /dev/null and b/models/thd_hero/yamame/58bda2ce/run.vanim_c differ diff --git a/models/thd_hero/yamame/58bda2ce/yamame_animation.vanim_c b/models/thd_hero/yamame/58bda2ce/yamame_animation.vanim_c new file mode 100755 index 0000000..b38ebad Binary files /dev/null and b/models/thd_hero/yamame/58bda2ce/yamame_animation.vanim_c differ diff --git a/models/thd_hero/yamame/item/d658577f/attack.vanim_c b/models/thd_hero/yamame/item/d658577f/attack.vanim_c new file mode 100755 index 0000000..38afe12 Binary files /dev/null and b/models/thd_hero/yamame/item/d658577f/attack.vanim_c differ diff --git a/models/thd_hero/yamame/item/d658577f/attack2.vanim_c b/models/thd_hero/yamame/item/d658577f/attack2.vanim_c new file mode 100755 index 0000000..ba1c514 Binary files /dev/null and b/models/thd_hero/yamame/item/d658577f/attack2.vanim_c differ diff --git a/models/thd_hero/yamame/item/d658577f/cast.vanim_c b/models/thd_hero/yamame/item/d658577f/cast.vanim_c new file mode 100755 index 0000000..aaddbce Binary files /dev/null and b/models/thd_hero/yamame/item/d658577f/cast.vanim_c differ diff --git a/models/thd_hero/yamame/item/d658577f/idle.vanim_c b/models/thd_hero/yamame/item/d658577f/idle.vanim_c new file mode 100755 index 0000000..d0fbfeb Binary files /dev/null and b/models/thd_hero/yamame/item/d658577f/idle.vanim_c differ diff --git a/models/thd_hero/yamame/item/d658577f/run.vanim_c b/models/thd_hero/yamame/item/d658577f/run.vanim_c new file mode 100755 index 0000000..63dae15 Binary files /dev/null and b/models/thd_hero/yamame/item/d658577f/run.vanim_c differ diff --git a/models/thd_hero/yamame/item/item_yamame.vmdl_c b/models/thd_hero/yamame/item/item_yamame.vmdl_c new file mode 100755 index 0000000..8bc6a90 Binary files /dev/null and b/models/thd_hero/yamame/item/item_yamame.vmdl_c differ diff --git a/models/thd_hero/yamame/item/item_yamame_d658577f.vagrp_c b/models/thd_hero/yamame/item/item_yamame_d658577f.vagrp_c new file mode 100755 index 0000000..cada127 Binary files /dev/null and b/models/thd_hero/yamame/item/item_yamame_d658577f.vagrp_c differ diff --git a/models/thd_hero/yamame/item/yamame.vmesh_c b/models/thd_hero/yamame/item/yamame.vmesh_c new file mode 100755 index 0000000..5947dc8 Binary files /dev/null and b/models/thd_hero/yamame/item/yamame.vmesh_c differ diff --git a/models/thd_hero/yamame/yamame.vmdl_c b/models/thd_hero/yamame/yamame.vmdl_c new file mode 100755 index 0000000..eb438d2 Binary files /dev/null and b/models/thd_hero/yamame/yamame.vmdl_c differ diff --git a/models/thd_hero/yamame/yamame.vmesh_c b/models/thd_hero/yamame/yamame.vmesh_c new file mode 100755 index 0000000..391329d Binary files /dev/null and b/models/thd_hero/yamame/yamame.vmesh_c differ diff --git a/models/thd_hero/yamame/yamame_58bda2ce.vagrp_c b/models/thd_hero/yamame/yamame_58bda2ce.vagrp_c new file mode 100755 index 0000000..1ca5488 Binary files /dev/null and b/models/thd_hero/yamame/yamame_58bda2ce.vagrp_c differ diff --git a/models/thd_hero/yoshika/f6ad9668/attack.vanim_c b/models/thd_hero/yoshika/f6ad9668/attack.vanim_c new file mode 100755 index 0000000..01f07fc Binary files /dev/null and b/models/thd_hero/yoshika/f6ad9668/attack.vanim_c differ diff --git a/models/thd_hero/yoshika/f6ad9668/cast_4.vanim_c b/models/thd_hero/yoshika/f6ad9668/cast_4.vanim_c new file mode 100755 index 0000000..a36c468 Binary files /dev/null and b/models/thd_hero/yoshika/f6ad9668/cast_4.vanim_c differ diff --git a/models/thd_hero/yoshika/f6ad9668/idle.vanim_c b/models/thd_hero/yoshika/f6ad9668/idle.vanim_c new file mode 100755 index 0000000..a05fb6f Binary files /dev/null and b/models/thd_hero/yoshika/f6ad9668/idle.vanim_c differ diff --git a/models/thd_hero/yoshika/f6ad9668/run.vanim_c b/models/thd_hero/yoshika/f6ad9668/run.vanim_c new file mode 100755 index 0000000..fe0cdf2 Binary files /dev/null and b/models/thd_hero/yoshika/f6ad9668/run.vanim_c differ diff --git a/models/thd_hero/yoshika/f6ad9668/yoshika_animation.vanim_c b/models/thd_hero/yoshika/f6ad9668/yoshika_animation.vanim_c new file mode 100755 index 0000000..dc41fbc Binary files /dev/null and b/models/thd_hero/yoshika/f6ad9668/yoshika_animation.vanim_c differ diff --git a/models/thd_hero/yoshika/item/7d9a3c1e/attack.vanim_c b/models/thd_hero/yoshika/item/7d9a3c1e/attack.vanim_c new file mode 100755 index 0000000..b0562cc Binary files /dev/null and b/models/thd_hero/yoshika/item/7d9a3c1e/attack.vanim_c differ diff --git a/models/thd_hero/yoshika/item/7d9a3c1e/idle.vanim_c b/models/thd_hero/yoshika/item/7d9a3c1e/idle.vanim_c new file mode 100755 index 0000000..3b87419 Binary files /dev/null and b/models/thd_hero/yoshika/item/7d9a3c1e/idle.vanim_c differ diff --git a/models/thd_hero/yoshika/item/7d9a3c1e/run.vanim_c b/models/thd_hero/yoshika/item/7d9a3c1e/run.vanim_c new file mode 100755 index 0000000..190bd57 Binary files /dev/null and b/models/thd_hero/yoshika/item/7d9a3c1e/run.vanim_c differ diff --git a/models/thd_hero/yoshika/item/item_yoshika.vmdl_c b/models/thd_hero/yoshika/item/item_yoshika.vmdl_c new file mode 100755 index 0000000..7036e22 Binary files /dev/null and b/models/thd_hero/yoshika/item/item_yoshika.vmdl_c differ diff --git a/models/thd_hero/yoshika/item/item_yoshika_7d9a3c1e.vagrp_c b/models/thd_hero/yoshika/item/item_yoshika_7d9a3c1e.vagrp_c new file mode 100755 index 0000000..2e3361c Binary files /dev/null and b/models/thd_hero/yoshika/item/item_yoshika_7d9a3c1e.vagrp_c differ diff --git a/models/thd_hero/yoshika/item/yoshika.vmesh_c b/models/thd_hero/yoshika/item/yoshika.vmesh_c new file mode 100755 index 0000000..dcd0dfe Binary files /dev/null and b/models/thd_hero/yoshika/item/yoshika.vmesh_c differ diff --git a/models/thd_hero/yoshika/yoshika.vmdl_c b/models/thd_hero/yoshika/yoshika.vmdl_c new file mode 100755 index 0000000..4dca6ed Binary files /dev/null and b/models/thd_hero/yoshika/yoshika.vmdl_c differ diff --git a/models/thd_hero/yoshika/yoshika.vmesh_c b/models/thd_hero/yoshika/yoshika.vmesh_c new file mode 100755 index 0000000..b67d9d0 Binary files /dev/null and b/models/thd_hero/yoshika/yoshika.vmesh_c differ diff --git a/models/thd_hero/yoshika/yoshika_f6ad9668.vagrp_c b/models/thd_hero/yoshika/yoshika_f6ad9668.vagrp_c new file mode 100755 index 0000000..49f5544 Binary files /dev/null and b/models/thd_hero/yoshika/yoshika_f6ad9668.vagrp_c differ diff --git a/models/thd_hero/yuugi/da83a462/attack1.vanim_c b/models/thd_hero/yuugi/da83a462/attack1.vanim_c new file mode 100755 index 0000000..17dd0d0 Binary files /dev/null and b/models/thd_hero/yuugi/da83a462/attack1.vanim_c differ diff --git a/models/thd_hero/yuugi/da83a462/attack2.vanim_c b/models/thd_hero/yuugi/da83a462/attack2.vanim_c new file mode 100755 index 0000000..800da34 Binary files /dev/null and b/models/thd_hero/yuugi/da83a462/attack2.vanim_c differ diff --git a/models/thd_hero/yuugi/da83a462/cast1.vanim_c b/models/thd_hero/yuugi/da83a462/cast1.vanim_c new file mode 100755 index 0000000..99a978c Binary files /dev/null and b/models/thd_hero/yuugi/da83a462/cast1.vanim_c differ diff --git a/models/thd_hero/yuugi/da83a462/cast3.vanim_c b/models/thd_hero/yuugi/da83a462/cast3.vanim_c new file mode 100755 index 0000000..f7efba2 Binary files /dev/null and b/models/thd_hero/yuugi/da83a462/cast3.vanim_c differ diff --git a/models/thd_hero/yuugi/da83a462/idle.vanim_c b/models/thd_hero/yuugi/da83a462/idle.vanim_c new file mode 100755 index 0000000..89ea10c Binary files /dev/null and b/models/thd_hero/yuugi/da83a462/idle.vanim_c differ diff --git a/models/thd_hero/yuugi/da83a462/run.vanim_c b/models/thd_hero/yuugi/da83a462/run.vanim_c new file mode 100755 index 0000000..1a5b954 Binary files /dev/null and b/models/thd_hero/yuugi/da83a462/run.vanim_c differ diff --git a/models/thd_hero/yuugi/da83a462/yuugi_animation.vanim_c b/models/thd_hero/yuugi/da83a462/yuugi_animation.vanim_c new file mode 100755 index 0000000..3568085 Binary files /dev/null and b/models/thd_hero/yuugi/da83a462/yuugi_animation.vanim_c differ diff --git a/models/thd_hero/yuugi/item/193b38a0/attack1.vanim_c b/models/thd_hero/yuugi/item/193b38a0/attack1.vanim_c new file mode 100755 index 0000000..0c87e55 Binary files /dev/null and b/models/thd_hero/yuugi/item/193b38a0/attack1.vanim_c differ diff --git a/models/thd_hero/yuugi/item/193b38a0/attack2.vanim_c b/models/thd_hero/yuugi/item/193b38a0/attack2.vanim_c new file mode 100755 index 0000000..619f0c6 Binary files /dev/null and b/models/thd_hero/yuugi/item/193b38a0/attack2.vanim_c differ diff --git a/models/thd_hero/yuugi/item/193b38a0/cast1.vanim_c b/models/thd_hero/yuugi/item/193b38a0/cast1.vanim_c new file mode 100755 index 0000000..b137924 Binary files /dev/null and b/models/thd_hero/yuugi/item/193b38a0/cast1.vanim_c differ diff --git a/models/thd_hero/yuugi/item/193b38a0/cast3.vanim_c b/models/thd_hero/yuugi/item/193b38a0/cast3.vanim_c new file mode 100755 index 0000000..2285e12 Binary files /dev/null and b/models/thd_hero/yuugi/item/193b38a0/cast3.vanim_c differ diff --git a/models/thd_hero/yuugi/item/193b38a0/idle.vanim_c b/models/thd_hero/yuugi/item/193b38a0/idle.vanim_c new file mode 100755 index 0000000..f7f56cd Binary files /dev/null and b/models/thd_hero/yuugi/item/193b38a0/idle.vanim_c differ diff --git a/models/thd_hero/yuugi/item/193b38a0/run.vanim_c b/models/thd_hero/yuugi/item/193b38a0/run.vanim_c new file mode 100755 index 0000000..d526d2d Binary files /dev/null and b/models/thd_hero/yuugi/item/193b38a0/run.vanim_c differ diff --git a/models/thd_hero/yuugi/item/item_yuugi.vmdl_c b/models/thd_hero/yuugi/item/item_yuugi.vmdl_c new file mode 100755 index 0000000..37f3235 Binary files /dev/null and b/models/thd_hero/yuugi/item/item_yuugi.vmdl_c differ diff --git a/models/thd_hero/yuugi/item/item_yuugi_193b38a0.vagrp_c b/models/thd_hero/yuugi/item/item_yuugi_193b38a0.vagrp_c new file mode 100755 index 0000000..157c58e Binary files /dev/null and b/models/thd_hero/yuugi/item/item_yuugi_193b38a0.vagrp_c differ diff --git a/models/thd_hero/yuugi/item/yuugi.vmesh_c b/models/thd_hero/yuugi/item/yuugi.vmesh_c new file mode 100755 index 0000000..87f91dc Binary files /dev/null and b/models/thd_hero/yuugi/item/yuugi.vmesh_c differ diff --git a/models/thd_hero/yuugi/yuugi.vmdl_c b/models/thd_hero/yuugi/yuugi.vmdl_c new file mode 100755 index 0000000..c66bdc6 Binary files /dev/null and b/models/thd_hero/yuugi/yuugi.vmdl_c differ diff --git a/models/thd_hero/yuugi/yuugi.vmesh_c b/models/thd_hero/yuugi/yuugi.vmesh_c new file mode 100755 index 0000000..c3fa60c Binary files /dev/null and b/models/thd_hero/yuugi/yuugi.vmesh_c differ diff --git a/models/thd_hero/yuugi/yuugi_da83a462.vagrp_c b/models/thd_hero/yuugi/yuugi_da83a462.vagrp_c new file mode 100755 index 0000000..8cd9971 Binary files /dev/null and b/models/thd_hero/yuugi/yuugi_da83a462.vagrp_c differ diff --git a/models/thd_hero/yuyuko/0d01273b/attack.vanim_c b/models/thd_hero/yuyuko/0d01273b/attack.vanim_c new file mode 100755 index 0000000..0527881 Binary files /dev/null and b/models/thd_hero/yuyuko/0d01273b/attack.vanim_c differ diff --git a/models/thd_hero/yuyuko/0d01273b/cast1.vanim_c b/models/thd_hero/yuyuko/0d01273b/cast1.vanim_c new file mode 100755 index 0000000..c3035d1 Binary files /dev/null and b/models/thd_hero/yuyuko/0d01273b/cast1.vanim_c differ diff --git a/models/thd_hero/yuyuko/0d01273b/cast2.vanim_c b/models/thd_hero/yuyuko/0d01273b/cast2.vanim_c new file mode 100755 index 0000000..5721c8e Binary files /dev/null and b/models/thd_hero/yuyuko/0d01273b/cast2.vanim_c differ diff --git a/models/thd_hero/yuyuko/0d01273b/idle.vanim_c b/models/thd_hero/yuyuko/0d01273b/idle.vanim_c new file mode 100755 index 0000000..9428c1b Binary files /dev/null and b/models/thd_hero/yuyuko/0d01273b/idle.vanim_c differ diff --git a/models/thd_hero/yuyuko/0d01273b/por.vanim_c b/models/thd_hero/yuyuko/0d01273b/por.vanim_c new file mode 100755 index 0000000..6de76eb Binary files /dev/null and b/models/thd_hero/yuyuko/0d01273b/por.vanim_c differ diff --git a/models/thd_hero/yuyuko/0d01273b/run.vanim_c b/models/thd_hero/yuyuko/0d01273b/run.vanim_c new file mode 100755 index 0000000..d80f837 Binary files /dev/null and b/models/thd_hero/yuyuko/0d01273b/run.vanim_c differ diff --git a/models/thd_hero/yuyuko/item/785d0770/attack.vanim_c b/models/thd_hero/yuyuko/item/785d0770/attack.vanim_c new file mode 100755 index 0000000..21d0a18 Binary files /dev/null and b/models/thd_hero/yuyuko/item/785d0770/attack.vanim_c differ diff --git a/models/thd_hero/yuyuko/item/785d0770/cast1.vanim_c b/models/thd_hero/yuyuko/item/785d0770/cast1.vanim_c new file mode 100755 index 0000000..d7cbb6d Binary files /dev/null and b/models/thd_hero/yuyuko/item/785d0770/cast1.vanim_c differ diff --git a/models/thd_hero/yuyuko/item/785d0770/cast2.vanim_c b/models/thd_hero/yuyuko/item/785d0770/cast2.vanim_c new file mode 100755 index 0000000..316f55c Binary files /dev/null and b/models/thd_hero/yuyuko/item/785d0770/cast2.vanim_c differ diff --git a/models/thd_hero/yuyuko/item/785d0770/idle.vanim_c b/models/thd_hero/yuyuko/item/785d0770/idle.vanim_c new file mode 100755 index 0000000..b3991ce Binary files /dev/null and b/models/thd_hero/yuyuko/item/785d0770/idle.vanim_c differ diff --git a/models/thd_hero/yuyuko/item/785d0770/por.vanim_c b/models/thd_hero/yuyuko/item/785d0770/por.vanim_c new file mode 100755 index 0000000..d60b647 Binary files /dev/null and b/models/thd_hero/yuyuko/item/785d0770/por.vanim_c differ diff --git a/models/thd_hero/yuyuko/item/785d0770/run.vanim_c b/models/thd_hero/yuyuko/item/785d0770/run.vanim_c new file mode 100755 index 0000000..268f3b0 Binary files /dev/null and b/models/thd_hero/yuyuko/item/785d0770/run.vanim_c differ diff --git a/models/thd_hero/yuyuko/item/item_yuyuko.vmdl_c b/models/thd_hero/yuyuko/item/item_yuyuko.vmdl_c new file mode 100755 index 0000000..0a2cdce Binary files /dev/null and b/models/thd_hero/yuyuko/item/item_yuyuko.vmdl_c differ diff --git a/models/thd_hero/yuyuko/item/item_yuyuko_785d0770.vagrp_c b/models/thd_hero/yuyuko/item/item_yuyuko_785d0770.vagrp_c new file mode 100755 index 0000000..440c0d0 Binary files /dev/null and b/models/thd_hero/yuyuko/item/item_yuyuko_785d0770.vagrp_c differ diff --git a/models/thd_hero/yuyuko/item/yuyuko.vmesh_c b/models/thd_hero/yuyuko/item/yuyuko.vmesh_c new file mode 100755 index 0000000..bb9fc93 Binary files /dev/null and b/models/thd_hero/yuyuko/item/yuyuko.vmesh_c differ diff --git a/models/thd_hero/yuyuko/yuyuko.vmdl_c b/models/thd_hero/yuyuko/yuyuko.vmdl_c new file mode 100755 index 0000000..5346163 Binary files /dev/null and b/models/thd_hero/yuyuko/yuyuko.vmdl_c differ diff --git a/models/thd_hero/yuyuko/yuyuko.vmesh_c b/models/thd_hero/yuyuko/yuyuko.vmesh_c new file mode 100755 index 0000000..007b26b Binary files /dev/null and b/models/thd_hero/yuyuko/yuyuko.vmesh_c differ diff --git a/models/thd_hero/yuyuko/yuyuko_0d01273b.vagrp_c b/models/thd_hero/yuyuko/yuyuko_0d01273b.vagrp_c new file mode 100755 index 0000000..06f67c9 Binary files /dev/null and b/models/thd_hero/yuyuko/yuyuko_0d01273b.vagrp_c differ diff --git a/panorama/images/custom_game/alipay_png.vtex_c b/panorama/images/custom_game/alipay_png.vtex_c new file mode 100755 index 0000000..3ec3680 Binary files /dev/null and b/panorama/images/custom_game/alipay_png.vtex_c differ diff --git a/panorama/images/custom_game/attacking_time_bg_png.vtex_c b/panorama/images/custom_game/attacking_time_bg_png.vtex_c new file mode 100755 index 0000000..1e1ca9f Binary files /dev/null and b/panorama/images/custom_game/attacking_time_bg_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/alice_big_png.vtex_c b/panorama/images/custom_game/cards/alice_big_png.vtex_c new file mode 100755 index 0000000..e84d8c7 Binary files /dev/null and b/panorama/images/custom_game/cards/alice_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/alice_name_png.vtex_c b/panorama/images/custom_game/cards/alice_name_png.vtex_c new file mode 100755 index 0000000..6f922dc Binary files /dev/null and b/panorama/images/custom_game/cards/alice_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/alice_png.vtex_c b/panorama/images/custom_game/cards/alice_png.vtex_c new file mode 100755 index 0000000..f9226c6 Binary files /dev/null and b/panorama/images/custom_game/cards/alice_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/aya_big_png.vtex_c b/panorama/images/custom_game/cards/aya_big_png.vtex_c new file mode 100755 index 0000000..c75f1ce Binary files /dev/null and b/panorama/images/custom_game/cards/aya_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/aya_name_png.vtex_c b/panorama/images/custom_game/cards/aya_name_png.vtex_c new file mode 100755 index 0000000..78260b7 Binary files /dev/null and b/panorama/images/custom_game/cards/aya_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/aya_png.vtex_c b/panorama/images/custom_game/cards/aya_png.vtex_c new file mode 100755 index 0000000..0abd6a5 Binary files /dev/null and b/panorama/images/custom_game/cards/aya_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/byakuren_big_png.vtex_c b/panorama/images/custom_game/cards/byakuren_big_png.vtex_c new file mode 100755 index 0000000..53090a8 Binary files /dev/null and b/panorama/images/custom_game/cards/byakuren_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/byakuren_name_png.vtex_c b/panorama/images/custom_game/cards/byakuren_name_png.vtex_c new file mode 100755 index 0000000..a01aada Binary files /dev/null and b/panorama/images/custom_game/cards/byakuren_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/byakuren_png.vtex_c b/panorama/images/custom_game/cards/byakuren_png.vtex_c new file mode 100755 index 0000000..a3beaae Binary files /dev/null and b/panorama/images/custom_game/cards/byakuren_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/chen_big_png.vtex_c b/panorama/images/custom_game/cards/chen_big_png.vtex_c new file mode 100755 index 0000000..9139f47 Binary files /dev/null and b/panorama/images/custom_game/cards/chen_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/chen_name_png.vtex_c b/panorama/images/custom_game/cards/chen_name_png.vtex_c new file mode 100755 index 0000000..d9ad183 Binary files /dev/null and b/panorama/images/custom_game/cards/chen_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/chen_png.vtex_c b/panorama/images/custom_game/cards/chen_png.vtex_c new file mode 100755 index 0000000..6dddef9 Binary files /dev/null and b/panorama/images/custom_game/cards/chen_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/cirno_big_png.vtex_c b/panorama/images/custom_game/cards/cirno_big_png.vtex_c new file mode 100755 index 0000000..0b7da17 Binary files /dev/null and b/panorama/images/custom_game/cards/cirno_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/cirno_name_png.vtex_c b/panorama/images/custom_game/cards/cirno_name_png.vtex_c new file mode 100755 index 0000000..ad2e63f Binary files /dev/null and b/panorama/images/custom_game/cards/cirno_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/cirno_png.vtex_c b/panorama/images/custom_game/cards/cirno_png.vtex_c new file mode 100755 index 0000000..7e6a2c5 Binary files /dev/null and b/panorama/images/custom_game/cards/cirno_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/clownpiece_big_png.vtex_c b/panorama/images/custom_game/cards/clownpiece_big_png.vtex_c new file mode 100755 index 0000000..271b331 Binary files /dev/null and b/panorama/images/custom_game/cards/clownpiece_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/clownpiece_name_png.vtex_c b/panorama/images/custom_game/cards/clownpiece_name_png.vtex_c new file mode 100755 index 0000000..1829e6e Binary files /dev/null and b/panorama/images/custom_game/cards/clownpiece_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/clownpiece_png.vtex_c b/panorama/images/custom_game/cards/clownpiece_png.vtex_c new file mode 100755 index 0000000..0a92ef4 Binary files /dev/null and b/panorama/images/custom_game/cards/clownpiece_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/daiyousei_big_png.vtex_c b/panorama/images/custom_game/cards/daiyousei_big_png.vtex_c new file mode 100755 index 0000000..e71e63c Binary files /dev/null and b/panorama/images/custom_game/cards/daiyousei_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/daiyousei_name_png.vtex_c b/panorama/images/custom_game/cards/daiyousei_name_png.vtex_c new file mode 100755 index 0000000..34092c6 Binary files /dev/null and b/panorama/images/custom_game/cards/daiyousei_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/daiyousei_png.vtex_c b/panorama/images/custom_game/cards/daiyousei_png.vtex_c new file mode 100755 index 0000000..df115d7 Binary files /dev/null and b/panorama/images/custom_game/cards/daiyousei_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/eirin_big_png.vtex_c b/panorama/images/custom_game/cards/eirin_big_png.vtex_c new file mode 100755 index 0000000..133a2ea Binary files /dev/null and b/panorama/images/custom_game/cards/eirin_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/eirin_name_png.vtex_c b/panorama/images/custom_game/cards/eirin_name_png.vtex_c new file mode 100755 index 0000000..9259e04 Binary files /dev/null and b/panorama/images/custom_game/cards/eirin_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/eirin_png.vtex_c b/panorama/images/custom_game/cards/eirin_png.vtex_c new file mode 100755 index 0000000..3eb6254 Binary files /dev/null and b/panorama/images/custom_game/cards/eirin_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/elly_big_png.vtex_c b/panorama/images/custom_game/cards/elly_big_png.vtex_c new file mode 100755 index 0000000..7df8de2 Binary files /dev/null and b/panorama/images/custom_game/cards/elly_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/elly_name_png.vtex_c b/panorama/images/custom_game/cards/elly_name_png.vtex_c new file mode 100755 index 0000000..3ad71e9 Binary files /dev/null and b/panorama/images/custom_game/cards/elly_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/elly_png.vtex_c b/panorama/images/custom_game/cards/elly_png.vtex_c new file mode 100755 index 0000000..7bc0772 Binary files /dev/null and b/panorama/images/custom_game/cards/elly_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/flandre_big_png.vtex_c b/panorama/images/custom_game/cards/flandre_big_png.vtex_c new file mode 100755 index 0000000..8c98295 Binary files /dev/null and b/panorama/images/custom_game/cards/flandre_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/flandre_name_png.vtex_c b/panorama/images/custom_game/cards/flandre_name_png.vtex_c new file mode 100755 index 0000000..21dbb79 Binary files /dev/null and b/panorama/images/custom_game/cards/flandre_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/flandre_png.vtex_c b/panorama/images/custom_game/cards/flandre_png.vtex_c new file mode 100755 index 0000000..f696486 Binary files /dev/null and b/panorama/images/custom_game/cards/flandre_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/futo_big_png.vtex_c b/panorama/images/custom_game/cards/futo_big_png.vtex_c new file mode 100755 index 0000000..fdddd97 Binary files /dev/null and b/panorama/images/custom_game/cards/futo_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/futo_name_png.vtex_c b/panorama/images/custom_game/cards/futo_name_png.vtex_c new file mode 100755 index 0000000..d4aee68 Binary files /dev/null and b/panorama/images/custom_game/cards/futo_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/futo_png.vtex_c b/panorama/images/custom_game/cards/futo_png.vtex_c new file mode 100755 index 0000000..a195872 Binary files /dev/null and b/panorama/images/custom_game/cards/futo_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/gengetu_big_png.vtex_c b/panorama/images/custom_game/cards/gengetu_big_png.vtex_c new file mode 100755 index 0000000..08d278a Binary files /dev/null and b/panorama/images/custom_game/cards/gengetu_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/gengetu_name_png.vtex_c b/panorama/images/custom_game/cards/gengetu_name_png.vtex_c new file mode 100755 index 0000000..55a013f Binary files /dev/null and b/panorama/images/custom_game/cards/gengetu_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/gengetu_png.vtex_c b/panorama/images/custom_game/cards/gengetu_png.vtex_c new file mode 100755 index 0000000..76af3de Binary files /dev/null and b/panorama/images/custom_game/cards/gengetu_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hanadayousei_big_png.vtex_c b/panorama/images/custom_game/cards/hanadayousei_big_png.vtex_c new file mode 100755 index 0000000..2006724 Binary files /dev/null and b/panorama/images/custom_game/cards/hanadayousei_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hanadayousei_name_png.vtex_c b/panorama/images/custom_game/cards/hanadayousei_name_png.vtex_c new file mode 100755 index 0000000..ebfbad8 Binary files /dev/null and b/panorama/images/custom_game/cards/hanadayousei_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hanadayousei_png.vtex_c b/panorama/images/custom_game/cards/hanadayousei_png.vtex_c new file mode 100755 index 0000000..f240b5a Binary files /dev/null and b/panorama/images/custom_game/cards/hanadayousei_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hatate_big_png.vtex_c b/panorama/images/custom_game/cards/hatate_big_png.vtex_c new file mode 100755 index 0000000..529be56 Binary files /dev/null and b/panorama/images/custom_game/cards/hatate_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hatate_name_png.vtex_c b/panorama/images/custom_game/cards/hatate_name_png.vtex_c new file mode 100755 index 0000000..7ca1114 Binary files /dev/null and b/panorama/images/custom_game/cards/hatate_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hatate_png.vtex_c b/panorama/images/custom_game/cards/hatate_png.vtex_c new file mode 100755 index 0000000..56054df Binary files /dev/null and b/panorama/images/custom_game/cards/hatate_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hecatia_big_png.vtex_c b/panorama/images/custom_game/cards/hecatia_big_png.vtex_c new file mode 100755 index 0000000..2fa67a2 Binary files /dev/null and b/panorama/images/custom_game/cards/hecatia_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hecatia_name_png.vtex_c b/panorama/images/custom_game/cards/hecatia_name_png.vtex_c new file mode 100755 index 0000000..b8156d1 Binary files /dev/null and b/panorama/images/custom_game/cards/hecatia_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hecatia_png.vtex_c b/panorama/images/custom_game/cards/hecatia_png.vtex_c new file mode 100755 index 0000000..f9f03ee Binary files /dev/null and b/panorama/images/custom_game/cards/hecatia_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hina_big_png.vtex_c b/panorama/images/custom_game/cards/hina_big_png.vtex_c new file mode 100755 index 0000000..13d5fb5 Binary files /dev/null and b/panorama/images/custom_game/cards/hina_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hina_name_png.vtex_c b/panorama/images/custom_game/cards/hina_name_png.vtex_c new file mode 100755 index 0000000..6f1fd93 Binary files /dev/null and b/panorama/images/custom_game/cards/hina_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hina_png.vtex_c b/panorama/images/custom_game/cards/hina_png.vtex_c new file mode 100755 index 0000000..1c63f63 Binary files /dev/null and b/panorama/images/custom_game/cards/hina_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hourainingyou_big_png.vtex_c b/panorama/images/custom_game/cards/hourainingyou_big_png.vtex_c new file mode 100755 index 0000000..dea4e84 Binary files /dev/null and b/panorama/images/custom_game/cards/hourainingyou_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hourainingyou_name_png.vtex_c b/panorama/images/custom_game/cards/hourainingyou_name_png.vtex_c new file mode 100755 index 0000000..cc24d1a Binary files /dev/null and b/panorama/images/custom_game/cards/hourainingyou_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/hourainingyou_png.vtex_c b/panorama/images/custom_game/cards/hourainingyou_png.vtex_c new file mode 100755 index 0000000..59f8904 Binary files /dev/null and b/panorama/images/custom_game/cards/hourainingyou_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/iku_big_png.vtex_c b/panorama/images/custom_game/cards/iku_big_png.vtex_c new file mode 100755 index 0000000..1f442ba Binary files /dev/null and b/panorama/images/custom_game/cards/iku_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/iku_name_png.vtex_c b/panorama/images/custom_game/cards/iku_name_png.vtex_c new file mode 100755 index 0000000..27ae2da Binary files /dev/null and b/panorama/images/custom_game/cards/iku_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/iku_png.vtex_c b/panorama/images/custom_game/cards/iku_png.vtex_c new file mode 100755 index 0000000..06b67d4 Binary files /dev/null and b/panorama/images/custom_game/cards/iku_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/inaba_big_png.vtex_c b/panorama/images/custom_game/cards/inaba_big_png.vtex_c new file mode 100755 index 0000000..ae56e3f Binary files /dev/null and b/panorama/images/custom_game/cards/inaba_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/inaba_name_png.vtex_c b/panorama/images/custom_game/cards/inaba_name_png.vtex_c new file mode 100755 index 0000000..6371865 Binary files /dev/null and b/panorama/images/custom_game/cards/inaba_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/inaba_png.vtex_c b/panorama/images/custom_game/cards/inaba_png.vtex_c new file mode 100755 index 0000000..f05df74 Binary files /dev/null and b/panorama/images/custom_game/cards/inaba_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2001_name_png.vtex_c b/panorama/images/custom_game/cards/item_2001_name_png.vtex_c new file mode 100755 index 0000000..f7d0248 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2001_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2001_png.vtex_c b/panorama/images/custom_game/cards/item_2001_png.vtex_c new file mode 100755 index 0000000..e2e78ad Binary files /dev/null and b/panorama/images/custom_game/cards/item_2001_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2002_name_png.vtex_c b/panorama/images/custom_game/cards/item_2002_name_png.vtex_c new file mode 100755 index 0000000..0ccf014 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2002_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2002_png.vtex_c b/panorama/images/custom_game/cards/item_2002_png.vtex_c new file mode 100755 index 0000000..eeb031f Binary files /dev/null and b/panorama/images/custom_game/cards/item_2002_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2003_name_png.vtex_c b/panorama/images/custom_game/cards/item_2003_name_png.vtex_c new file mode 100755 index 0000000..490ab41 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2003_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2003_png.vtex_c b/panorama/images/custom_game/cards/item_2003_png.vtex_c new file mode 100755 index 0000000..8852fa6 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2003_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2004_name_png.vtex_c b/panorama/images/custom_game/cards/item_2004_name_png.vtex_c new file mode 100755 index 0000000..0d9abab Binary files /dev/null and b/panorama/images/custom_game/cards/item_2004_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2004_png.vtex_c b/panorama/images/custom_game/cards/item_2004_png.vtex_c new file mode 100755 index 0000000..6e2b479 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2004_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2005_name_png.vtex_c b/panorama/images/custom_game/cards/item_2005_name_png.vtex_c new file mode 100755 index 0000000..b209702 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2005_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2005_png.vtex_c b/panorama/images/custom_game/cards/item_2005_png.vtex_c new file mode 100755 index 0000000..ed7f386 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2005_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2006_name_png.vtex_c b/panorama/images/custom_game/cards/item_2006_name_png.vtex_c new file mode 100755 index 0000000..ba19418 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2006_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2006_png.vtex_c b/panorama/images/custom_game/cards/item_2006_png.vtex_c new file mode 100755 index 0000000..4b47f16 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2006_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2007_name_png.vtex_c b/panorama/images/custom_game/cards/item_2007_name_png.vtex_c new file mode 100755 index 0000000..1b22f76 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2007_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2007_png.vtex_c b/panorama/images/custom_game/cards/item_2007_png.vtex_c new file mode 100755 index 0000000..cb1233d Binary files /dev/null and b/panorama/images/custom_game/cards/item_2007_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2008_name_png.vtex_c b/panorama/images/custom_game/cards/item_2008_name_png.vtex_c new file mode 100755 index 0000000..259c605 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2008_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2008_png.vtex_c b/panorama/images/custom_game/cards/item_2008_png.vtex_c new file mode 100755 index 0000000..343004a Binary files /dev/null and b/panorama/images/custom_game/cards/item_2008_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2009_name_png.vtex_c b/panorama/images/custom_game/cards/item_2009_name_png.vtex_c new file mode 100755 index 0000000..31e6db1 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2009_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2009_png.vtex_c b/panorama/images/custom_game/cards/item_2009_png.vtex_c new file mode 100755 index 0000000..36b86ce Binary files /dev/null and b/panorama/images/custom_game/cards/item_2009_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2010_name_png.vtex_c b/panorama/images/custom_game/cards/item_2010_name_png.vtex_c new file mode 100755 index 0000000..5cda61a Binary files /dev/null and b/panorama/images/custom_game/cards/item_2010_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2010_png.vtex_c b/panorama/images/custom_game/cards/item_2010_png.vtex_c new file mode 100755 index 0000000..c69626e Binary files /dev/null and b/panorama/images/custom_game/cards/item_2010_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2011_name_png.vtex_c b/panorama/images/custom_game/cards/item_2011_name_png.vtex_c new file mode 100755 index 0000000..d59bccc Binary files /dev/null and b/panorama/images/custom_game/cards/item_2011_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2011_png.vtex_c b/panorama/images/custom_game/cards/item_2011_png.vtex_c new file mode 100755 index 0000000..da413bd Binary files /dev/null and b/panorama/images/custom_game/cards/item_2011_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2012_name_png.vtex_c b/panorama/images/custom_game/cards/item_2012_name_png.vtex_c new file mode 100755 index 0000000..ab74595 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2012_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2012_png.vtex_c b/panorama/images/custom_game/cards/item_2012_png.vtex_c new file mode 100755 index 0000000..fb7b7b4 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2012_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2013_name_png.vtex_c b/panorama/images/custom_game/cards/item_2013_name_png.vtex_c new file mode 100755 index 0000000..4d8d3af Binary files /dev/null and b/panorama/images/custom_game/cards/item_2013_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2013_png.vtex_c b/panorama/images/custom_game/cards/item_2013_png.vtex_c new file mode 100755 index 0000000..2ac110c Binary files /dev/null and b/panorama/images/custom_game/cards/item_2013_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2014_name_png.vtex_c b/panorama/images/custom_game/cards/item_2014_name_png.vtex_c new file mode 100755 index 0000000..2dcba15 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2014_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2014_png.vtex_c b/panorama/images/custom_game/cards/item_2014_png.vtex_c new file mode 100755 index 0000000..0509556 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2014_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2015_name_png.vtex_c b/panorama/images/custom_game/cards/item_2015_name_png.vtex_c new file mode 100755 index 0000000..edde5a9 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2015_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2015_png.vtex_c b/panorama/images/custom_game/cards/item_2015_png.vtex_c new file mode 100755 index 0000000..2f7704c Binary files /dev/null and b/panorama/images/custom_game/cards/item_2015_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2016_name_png.vtex_c b/panorama/images/custom_game/cards/item_2016_name_png.vtex_c new file mode 100755 index 0000000..368a3c1 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2016_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2016_png.vtex_c b/panorama/images/custom_game/cards/item_2016_png.vtex_c new file mode 100755 index 0000000..320b681 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2016_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2017_name_png.vtex_c b/panorama/images/custom_game/cards/item_2017_name_png.vtex_c new file mode 100755 index 0000000..83b96ee Binary files /dev/null and b/panorama/images/custom_game/cards/item_2017_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2017_png.vtex_c b/panorama/images/custom_game/cards/item_2017_png.vtex_c new file mode 100755 index 0000000..2de0586 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2017_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2018_name_png.vtex_c b/panorama/images/custom_game/cards/item_2018_name_png.vtex_c new file mode 100755 index 0000000..4ce1dd5 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2018_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2018_png.vtex_c b/panorama/images/custom_game/cards/item_2018_png.vtex_c new file mode 100755 index 0000000..d4f8d28 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2018_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2019_name_png.vtex_c b/panorama/images/custom_game/cards/item_2019_name_png.vtex_c new file mode 100755 index 0000000..6e24556 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2019_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2019_png.vtex_c b/panorama/images/custom_game/cards/item_2019_png.vtex_c new file mode 100755 index 0000000..c53ae2c Binary files /dev/null and b/panorama/images/custom_game/cards/item_2019_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2020_name_png.vtex_c b/panorama/images/custom_game/cards/item_2020_name_png.vtex_c new file mode 100755 index 0000000..769dce1 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2020_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2020_png.vtex_c b/panorama/images/custom_game/cards/item_2020_png.vtex_c new file mode 100755 index 0000000..ad5cf0e Binary files /dev/null and b/panorama/images/custom_game/cards/item_2020_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2021_name_png.vtex_c b/panorama/images/custom_game/cards/item_2021_name_png.vtex_c new file mode 100755 index 0000000..c04f10f Binary files /dev/null and b/panorama/images/custom_game/cards/item_2021_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2021_png.vtex_c b/panorama/images/custom_game/cards/item_2021_png.vtex_c new file mode 100755 index 0000000..5ead955 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2021_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2022_name_png.vtex_c b/panorama/images/custom_game/cards/item_2022_name_png.vtex_c new file mode 100755 index 0000000..2beb13f Binary files /dev/null and b/panorama/images/custom_game/cards/item_2022_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_2022_png.vtex_c b/panorama/images/custom_game/cards/item_2022_png.vtex_c new file mode 100755 index 0000000..3f82594 Binary files /dev/null and b/panorama/images/custom_game/cards/item_2022_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3011_png.vtex_c b/panorama/images/custom_game/cards/item_3011_png.vtex_c new file mode 100755 index 0000000..8c1aae9 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3011_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3012_png.vtex_c b/panorama/images/custom_game/cards/item_3012_png.vtex_c new file mode 100755 index 0000000..f84ee83 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3012_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3013_png.vtex_c b/panorama/images/custom_game/cards/item_3013_png.vtex_c new file mode 100755 index 0000000..7f9de01 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3013_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3014_png.vtex_c b/panorama/images/custom_game/cards/item_3014_png.vtex_c new file mode 100755 index 0000000..2c94305 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3014_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3015_png.vtex_c b/panorama/images/custom_game/cards/item_3015_png.vtex_c new file mode 100755 index 0000000..d354921 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3015_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3016_png.vtex_c b/panorama/images/custom_game/cards/item_3016_png.vtex_c new file mode 100755 index 0000000..3a66f8c Binary files /dev/null and b/panorama/images/custom_game/cards/item_3016_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3017_png.vtex_c b/panorama/images/custom_game/cards/item_3017_png.vtex_c new file mode 100755 index 0000000..52e6a09 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3017_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3018_png.vtex_c b/panorama/images/custom_game/cards/item_3018_png.vtex_c new file mode 100755 index 0000000..47cac90 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3018_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3019_png.vtex_c b/panorama/images/custom_game/cards/item_3019_png.vtex_c new file mode 100755 index 0000000..226acc2 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3019_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3020_png.vtex_c b/panorama/images/custom_game/cards/item_3020_png.vtex_c new file mode 100755 index 0000000..f2f2ce2 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3020_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3021_png.vtex_c b/panorama/images/custom_game/cards/item_3021_png.vtex_c new file mode 100755 index 0000000..2a9a456 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3021_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3022_png.vtex_c b/panorama/images/custom_game/cards/item_3022_png.vtex_c new file mode 100755 index 0000000..914ced4 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3022_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3023_png.vtex_c b/panorama/images/custom_game/cards/item_3023_png.vtex_c new file mode 100755 index 0000000..475e094 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3023_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3024_png.vtex_c b/panorama/images/custom_game/cards/item_3024_png.vtex_c new file mode 100755 index 0000000..e43ae3d Binary files /dev/null and b/panorama/images/custom_game/cards/item_3024_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3025_png.vtex_c b/panorama/images/custom_game/cards/item_3025_png.vtex_c new file mode 100755 index 0000000..982ace8 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3025_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3026_png.vtex_c b/panorama/images/custom_game/cards/item_3026_png.vtex_c new file mode 100755 index 0000000..20cd07b Binary files /dev/null and b/panorama/images/custom_game/cards/item_3026_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3027_png.vtex_c b/panorama/images/custom_game/cards/item_3027_png.vtex_c new file mode 100755 index 0000000..d63084f Binary files /dev/null and b/panorama/images/custom_game/cards/item_3027_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3028_png.vtex_c b/panorama/images/custom_game/cards/item_3028_png.vtex_c new file mode 100755 index 0000000..628e1c0 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3028_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3029_png.vtex_c b/panorama/images/custom_game/cards/item_3029_png.vtex_c new file mode 100755 index 0000000..0db6961 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3029_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3030_png.vtex_c b/panorama/images/custom_game/cards/item_3030_png.vtex_c new file mode 100755 index 0000000..5a8abf9 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3030_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3031_png.vtex_c b/panorama/images/custom_game/cards/item_3031_png.vtex_c new file mode 100755 index 0000000..211ffaf Binary files /dev/null and b/panorama/images/custom_game/cards/item_3031_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3050_png.vtex_c b/panorama/images/custom_game/cards/item_3050_png.vtex_c new file mode 100755 index 0000000..73933d3 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3050_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3149_png.vtex_c b/panorama/images/custom_game/cards/item_3149_png.vtex_c new file mode 100755 index 0000000..6527f81 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3149_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3150_png.vtex_c b/panorama/images/custom_game/cards/item_3150_png.vtex_c new file mode 100755 index 0000000..35a03f2 Binary files /dev/null and b/panorama/images/custom_game/cards/item_3150_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3151_png.vtex_c b/panorama/images/custom_game/cards/item_3151_png.vtex_c new file mode 100755 index 0000000..f5c7fed Binary files /dev/null and b/panorama/images/custom_game/cards/item_3151_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3152_png.vtex_c b/panorama/images/custom_game/cards/item_3152_png.vtex_c new file mode 100755 index 0000000..b29b80d Binary files /dev/null and b/panorama/images/custom_game/cards/item_3152_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_3153_png.vtex_c b/panorama/images/custom_game/cards/item_3153_png.vtex_c new file mode 100755 index 0000000..2c29cbe Binary files /dev/null and b/panorama/images/custom_game/cards/item_3153_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_n_png.vtex_c b/panorama/images/custom_game/cards/item_n_png.vtex_c new file mode 100755 index 0000000..a217bb7 Binary files /dev/null and b/panorama/images/custom_game/cards/item_n_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_r_png.vtex_c b/panorama/images/custom_game/cards/item_r_png.vtex_c new file mode 100755 index 0000000..92b05d1 Binary files /dev/null and b/panorama/images/custom_game/cards/item_r_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_sr_png.vtex_c b/panorama/images/custom_game/cards/item_sr_png.vtex_c new file mode 100755 index 0000000..6d2c5da Binary files /dev/null and b/panorama/images/custom_game/cards/item_sr_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/item_ssr_png.vtex_c b/panorama/images/custom_game/cards/item_ssr_png.vtex_c new file mode 100755 index 0000000..087783a Binary files /dev/null and b/panorama/images/custom_game/cards/item_ssr_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/junko_big_png.vtex_c b/panorama/images/custom_game/cards/junko_big_png.vtex_c new file mode 100755 index 0000000..800a886 Binary files /dev/null and b/panorama/images/custom_game/cards/junko_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/junko_name_png.vtex_c b/panorama/images/custom_game/cards/junko_name_png.vtex_c new file mode 100755 index 0000000..83da1a3 Binary files /dev/null and b/panorama/images/custom_game/cards/junko_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/junko_png.vtex_c b/panorama/images/custom_game/cards/junko_png.vtex_c new file mode 100755 index 0000000..b9bbb31 Binary files /dev/null and b/panorama/images/custom_game/cards/junko_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kagerou_big_png.vtex_c b/panorama/images/custom_game/cards/kagerou_big_png.vtex_c new file mode 100755 index 0000000..fb7ebf7 Binary files /dev/null and b/panorama/images/custom_game/cards/kagerou_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kagerou_name_png.vtex_c b/panorama/images/custom_game/cards/kagerou_name_png.vtex_c new file mode 100755 index 0000000..9026637 Binary files /dev/null and b/panorama/images/custom_game/cards/kagerou_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kagerou_png.vtex_c b/panorama/images/custom_game/cards/kagerou_png.vtex_c new file mode 100755 index 0000000..615d757 Binary files /dev/null and b/panorama/images/custom_game/cards/kagerou_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kaguya_big_png.vtex_c b/panorama/images/custom_game/cards/kaguya_big_png.vtex_c new file mode 100755 index 0000000..16608a1 Binary files /dev/null and b/panorama/images/custom_game/cards/kaguya_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kaguya_name_png.vtex_c b/panorama/images/custom_game/cards/kaguya_name_png.vtex_c new file mode 100755 index 0000000..48d3be7 Binary files /dev/null and b/panorama/images/custom_game/cards/kaguya_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kaguya_png.vtex_c b/panorama/images/custom_game/cards/kaguya_png.vtex_c new file mode 100755 index 0000000..f3bdbce Binary files /dev/null and b/panorama/images/custom_game/cards/kaguya_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kanako_big_png.vtex_c b/panorama/images/custom_game/cards/kanako_big_png.vtex_c new file mode 100755 index 0000000..3223db7 Binary files /dev/null and b/panorama/images/custom_game/cards/kanako_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kanako_name_png.vtex_c b/panorama/images/custom_game/cards/kanako_name_png.vtex_c new file mode 100755 index 0000000..77d3d2c Binary files /dev/null and b/panorama/images/custom_game/cards/kanako_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kanako_png.vtex_c b/panorama/images/custom_game/cards/kanako_png.vtex_c new file mode 100755 index 0000000..70dd85f Binary files /dev/null and b/panorama/images/custom_game/cards/kanako_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/keine_big_png.vtex_c b/panorama/images/custom_game/cards/keine_big_png.vtex_c new file mode 100755 index 0000000..085fec7 Binary files /dev/null and b/panorama/images/custom_game/cards/keine_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/keine_name_png.vtex_c b/panorama/images/custom_game/cards/keine_name_png.vtex_c new file mode 100755 index 0000000..64ad0ff Binary files /dev/null and b/panorama/images/custom_game/cards/keine_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/keine_png.vtex_c b/panorama/images/custom_game/cards/keine_png.vtex_c new file mode 100755 index 0000000..8e529ee Binary files /dev/null and b/panorama/images/custom_game/cards/keine_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kishin_big_png.vtex_c b/panorama/images/custom_game/cards/kishin_big_png.vtex_c new file mode 100755 index 0000000..4239944 Binary files /dev/null and b/panorama/images/custom_game/cards/kishin_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kishin_name_png.vtex_c b/panorama/images/custom_game/cards/kishin_name_png.vtex_c new file mode 100755 index 0000000..55e8d2b Binary files /dev/null and b/panorama/images/custom_game/cards/kishin_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kishin_png.vtex_c b/panorama/images/custom_game/cards/kishin_png.vtex_c new file mode 100755 index 0000000..aa30df1 Binary files /dev/null and b/panorama/images/custom_game/cards/kishin_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kisume_big_png.vtex_c b/panorama/images/custom_game/cards/kisume_big_png.vtex_c new file mode 100755 index 0000000..35453b9 Binary files /dev/null and b/panorama/images/custom_game/cards/kisume_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kisume_name_png.vtex_c b/panorama/images/custom_game/cards/kisume_name_png.vtex_c new file mode 100755 index 0000000..2dcba15 Binary files /dev/null and b/panorama/images/custom_game/cards/kisume_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kisume_png.vtex_c b/panorama/images/custom_game/cards/kisume_png.vtex_c new file mode 100755 index 0000000..f9b7ad0 Binary files /dev/null and b/panorama/images/custom_game/cards/kisume_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/koakuma_big_png.vtex_c b/panorama/images/custom_game/cards/koakuma_big_png.vtex_c new file mode 100755 index 0000000..3af828c Binary files /dev/null and b/panorama/images/custom_game/cards/koakuma_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/koakuma_name_png.vtex_c b/panorama/images/custom_game/cards/koakuma_name_png.vtex_c new file mode 100755 index 0000000..0a233e8 Binary files /dev/null and b/panorama/images/custom_game/cards/koakuma_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/koakuma_png.vtex_c b/panorama/images/custom_game/cards/koakuma_png.vtex_c new file mode 100755 index 0000000..ce1c097 Binary files /dev/null and b/panorama/images/custom_game/cards/koakuma_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kogasa_big_png.vtex_c b/panorama/images/custom_game/cards/kogasa_big_png.vtex_c new file mode 100755 index 0000000..f5714a9 Binary files /dev/null and b/panorama/images/custom_game/cards/kogasa_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kogasa_name_png.vtex_c b/panorama/images/custom_game/cards/kogasa_name_png.vtex_c new file mode 100755 index 0000000..dd6d882 Binary files /dev/null and b/panorama/images/custom_game/cards/kogasa_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kogasa_png.vtex_c b/panorama/images/custom_game/cards/kogasa_png.vtex_c new file mode 100755 index 0000000..2c9f853 Binary files /dev/null and b/panorama/images/custom_game/cards/kogasa_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/koishi_big_png.vtex_c b/panorama/images/custom_game/cards/koishi_big_png.vtex_c new file mode 100755 index 0000000..5a573c3 Binary files /dev/null and b/panorama/images/custom_game/cards/koishi_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/koishi_name_png.vtex_c b/panorama/images/custom_game/cards/koishi_name_png.vtex_c new file mode 100755 index 0000000..9a4c533 Binary files /dev/null and b/panorama/images/custom_game/cards/koishi_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/koishi_png.vtex_c b/panorama/images/custom_game/cards/koishi_png.vtex_c new file mode 100755 index 0000000..77a4fe3 Binary files /dev/null and b/panorama/images/custom_game/cards/koishi_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kokoro_big_png.vtex_c b/panorama/images/custom_game/cards/kokoro_big_png.vtex_c new file mode 100755 index 0000000..4f533f2 Binary files /dev/null and b/panorama/images/custom_game/cards/kokoro_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kokoro_name_png.vtex_c b/panorama/images/custom_game/cards/kokoro_name_png.vtex_c new file mode 100755 index 0000000..9601cec Binary files /dev/null and b/panorama/images/custom_game/cards/kokoro_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kokoro_png.vtex_c b/panorama/images/custom_game/cards/kokoro_png.vtex_c new file mode 100755 index 0000000..6e37ef5 Binary files /dev/null and b/panorama/images/custom_game/cards/kokoro_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/komachi_big_png.vtex_c b/panorama/images/custom_game/cards/komachi_big_png.vtex_c new file mode 100755 index 0000000..1b13102 Binary files /dev/null and b/panorama/images/custom_game/cards/komachi_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/komachi_name_png.vtex_c b/panorama/images/custom_game/cards/komachi_name_png.vtex_c new file mode 100755 index 0000000..2dcba15 Binary files /dev/null and b/panorama/images/custom_game/cards/komachi_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/komachi_png.vtex_c b/panorama/images/custom_game/cards/komachi_png.vtex_c new file mode 100755 index 0000000..d2470df Binary files /dev/null and b/panorama/images/custom_game/cards/komachi_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kyouko_big_png.vtex_c b/panorama/images/custom_game/cards/kyouko_big_png.vtex_c new file mode 100755 index 0000000..37b6049 Binary files /dev/null and b/panorama/images/custom_game/cards/kyouko_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kyouko_name_png.vtex_c b/panorama/images/custom_game/cards/kyouko_name_png.vtex_c new file mode 100755 index 0000000..6d72211 Binary files /dev/null and b/panorama/images/custom_game/cards/kyouko_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/kyouko_png.vtex_c b/panorama/images/custom_game/cards/kyouko_png.vtex_c new file mode 100755 index 0000000..31c5aa9 Binary files /dev/null and b/panorama/images/custom_game/cards/kyouko_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/letty_big_png.vtex_c b/panorama/images/custom_game/cards/letty_big_png.vtex_c new file mode 100755 index 0000000..85733de Binary files /dev/null and b/panorama/images/custom_game/cards/letty_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/letty_name_png.vtex_c b/panorama/images/custom_game/cards/letty_name_png.vtex_c new file mode 100755 index 0000000..656503f Binary files /dev/null and b/panorama/images/custom_game/cards/letty_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/letty_png.vtex_c b/panorama/images/custom_game/cards/letty_png.vtex_c new file mode 100755 index 0000000..1916d60 Binary files /dev/null and b/panorama/images/custom_game/cards/letty_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/lily_big_png.vtex_c b/panorama/images/custom_game/cards/lily_big_png.vtex_c new file mode 100755 index 0000000..7d8ff08 Binary files /dev/null and b/panorama/images/custom_game/cards/lily_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/lily_name_png.vtex_c b/panorama/images/custom_game/cards/lily_name_png.vtex_c new file mode 100755 index 0000000..9caa0c9 Binary files /dev/null and b/panorama/images/custom_game/cards/lily_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/lily_png.vtex_c b/panorama/images/custom_game/cards/lily_png.vtex_c new file mode 100755 index 0000000..fb53bc0 Binary files /dev/null and b/panorama/images/custom_game/cards/lily_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/luck_png.vtex_c b/panorama/images/custom_game/cards/luck_png.vtex_c new file mode 100755 index 0000000..8879ea1 Binary files /dev/null and b/panorama/images/custom_game/cards/luck_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/luna_big_png.vtex_c b/panorama/images/custom_game/cards/luna_big_png.vtex_c new file mode 100755 index 0000000..323e933 Binary files /dev/null and b/panorama/images/custom_game/cards/luna_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/luna_name_png.vtex_c b/panorama/images/custom_game/cards/luna_name_png.vtex_c new file mode 100755 index 0000000..b4d4f6a Binary files /dev/null and b/panorama/images/custom_game/cards/luna_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/luna_png.vtex_c b/panorama/images/custom_game/cards/luna_png.vtex_c new file mode 100755 index 0000000..63bf997 Binary files /dev/null and b/panorama/images/custom_game/cards/luna_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/lunasa_big_png.vtex_c b/panorama/images/custom_game/cards/lunasa_big_png.vtex_c new file mode 100755 index 0000000..db59a87 Binary files /dev/null and b/panorama/images/custom_game/cards/lunasa_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/lunasa_name_png.vtex_c b/panorama/images/custom_game/cards/lunasa_name_png.vtex_c new file mode 100755 index 0000000..eb59efb Binary files /dev/null and b/panorama/images/custom_game/cards/lunasa_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/lunasa_png.vtex_c b/panorama/images/custom_game/cards/lunasa_png.vtex_c new file mode 100755 index 0000000..286b1a4 Binary files /dev/null and b/panorama/images/custom_game/cards/lunasa_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/lyrica_big_png.vtex_c b/panorama/images/custom_game/cards/lyrica_big_png.vtex_c new file mode 100755 index 0000000..69a39fd Binary files /dev/null and b/panorama/images/custom_game/cards/lyrica_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/lyrica_name_png.vtex_c b/panorama/images/custom_game/cards/lyrica_name_png.vtex_c new file mode 100755 index 0000000..bdec76a Binary files /dev/null and b/panorama/images/custom_game/cards/lyrica_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/lyrica_png.vtex_c b/panorama/images/custom_game/cards/lyrica_png.vtex_c new file mode 100755 index 0000000..1df9aec Binary files /dev/null and b/panorama/images/custom_game/cards/lyrica_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/maidyousei_big_png.vtex_c b/panorama/images/custom_game/cards/maidyousei_big_png.vtex_c new file mode 100755 index 0000000..f9c5df9 Binary files /dev/null and b/panorama/images/custom_game/cards/maidyousei_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/maidyousei_name_png.vtex_c b/panorama/images/custom_game/cards/maidyousei_name_png.vtex_c new file mode 100755 index 0000000..7dd5abe Binary files /dev/null and b/panorama/images/custom_game/cards/maidyousei_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/maidyousei_png.vtex_c b/panorama/images/custom_game/cards/maidyousei_png.vtex_c new file mode 100755 index 0000000..1974280 Binary files /dev/null and b/panorama/images/custom_game/cards/maidyousei_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mamizou_big_png.vtex_c b/panorama/images/custom_game/cards/mamizou_big_png.vtex_c new file mode 100755 index 0000000..d2fa12d Binary files /dev/null and b/panorama/images/custom_game/cards/mamizou_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mamizou_name_png.vtex_c b/panorama/images/custom_game/cards/mamizou_name_png.vtex_c new file mode 100755 index 0000000..b02ea1c Binary files /dev/null and b/panorama/images/custom_game/cards/mamizou_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mamizou_png.vtex_c b/panorama/images/custom_game/cards/mamizou_png.vtex_c new file mode 100755 index 0000000..46da132 Binary files /dev/null and b/panorama/images/custom_game/cards/mamizou_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/maribel_big_png.vtex_c b/panorama/images/custom_game/cards/maribel_big_png.vtex_c new file mode 100755 index 0000000..3a63fbc Binary files /dev/null and b/panorama/images/custom_game/cards/maribel_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/maribel_name_png.vtex_c b/panorama/images/custom_game/cards/maribel_name_png.vtex_c new file mode 100755 index 0000000..d60025b Binary files /dev/null and b/panorama/images/custom_game/cards/maribel_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/maribel_png.vtex_c b/panorama/images/custom_game/cards/maribel_png.vtex_c new file mode 100755 index 0000000..5dd58d6 Binary files /dev/null and b/panorama/images/custom_game/cards/maribel_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/marisa_big_png.vtex_c b/panorama/images/custom_game/cards/marisa_big_png.vtex_c new file mode 100755 index 0000000..c44177f Binary files /dev/null and b/panorama/images/custom_game/cards/marisa_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/marisa_name_png.vtex_c b/panorama/images/custom_game/cards/marisa_name_png.vtex_c new file mode 100755 index 0000000..98fd81a Binary files /dev/null and b/panorama/images/custom_game/cards/marisa_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/marisa_png.vtex_c b/panorama/images/custom_game/cards/marisa_png.vtex_c new file mode 100755 index 0000000..362ad06 Binary files /dev/null and b/panorama/images/custom_game/cards/marisa_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/matara_big_png.vtex_c b/panorama/images/custom_game/cards/matara_big_png.vtex_c new file mode 100755 index 0000000..f7d3764 Binary files /dev/null and b/panorama/images/custom_game/cards/matara_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/matara_name_png.vtex_c b/panorama/images/custom_game/cards/matara_name_png.vtex_c new file mode 100755 index 0000000..c2fd3ea Binary files /dev/null and b/panorama/images/custom_game/cards/matara_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/matara_png.vtex_c b/panorama/images/custom_game/cards/matara_png.vtex_c new file mode 100755 index 0000000..bc52a62 Binary files /dev/null and b/panorama/images/custom_game/cards/matara_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/medicine_big_png.vtex_c b/panorama/images/custom_game/cards/medicine_big_png.vtex_c new file mode 100755 index 0000000..4723301 Binary files /dev/null and b/panorama/images/custom_game/cards/medicine_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/medicine_name_png.vtex_c b/panorama/images/custom_game/cards/medicine_name_png.vtex_c new file mode 100755 index 0000000..8c523b0 Binary files /dev/null and b/panorama/images/custom_game/cards/medicine_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/medicine_png.vtex_c b/panorama/images/custom_game/cards/medicine_png.vtex_c new file mode 100755 index 0000000..d1fe562 Binary files /dev/null and b/panorama/images/custom_game/cards/medicine_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/meirin_big_png.vtex_c b/panorama/images/custom_game/cards/meirin_big_png.vtex_c new file mode 100755 index 0000000..7938748 Binary files /dev/null and b/panorama/images/custom_game/cards/meirin_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/meirin_name_png.vtex_c b/panorama/images/custom_game/cards/meirin_name_png.vtex_c new file mode 100755 index 0000000..ab3a516 Binary files /dev/null and b/panorama/images/custom_game/cards/meirin_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/meirin_png.vtex_c b/panorama/images/custom_game/cards/meirin_png.vtex_c new file mode 100755 index 0000000..ac43150 Binary files /dev/null and b/panorama/images/custom_game/cards/meirin_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/merlin_big_png.vtex_c b/panorama/images/custom_game/cards/merlin_big_png.vtex_c new file mode 100755 index 0000000..5228f6e Binary files /dev/null and b/panorama/images/custom_game/cards/merlin_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/merlin_name_png.vtex_c b/panorama/images/custom_game/cards/merlin_name_png.vtex_c new file mode 100755 index 0000000..8ba3e3b Binary files /dev/null and b/panorama/images/custom_game/cards/merlin_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/merlin_png.vtex_c b/panorama/images/custom_game/cards/merlin_png.vtex_c new file mode 100755 index 0000000..c4a4e7e Binary files /dev/null and b/panorama/images/custom_game/cards/merlin_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/miko_big_png.vtex_c b/panorama/images/custom_game/cards/miko_big_png.vtex_c new file mode 100755 index 0000000..bb840bc Binary files /dev/null and b/panorama/images/custom_game/cards/miko_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/miko_name_png.vtex_c b/panorama/images/custom_game/cards/miko_name_png.vtex_c new file mode 100755 index 0000000..6949f82 Binary files /dev/null and b/panorama/images/custom_game/cards/miko_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/miko_png.vtex_c b/panorama/images/custom_game/cards/miko_png.vtex_c new file mode 100755 index 0000000..1d813a8 Binary files /dev/null and b/panorama/images/custom_game/cards/miko_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mima_big_png.vtex_c b/panorama/images/custom_game/cards/mima_big_png.vtex_c new file mode 100755 index 0000000..df5a52c Binary files /dev/null and b/panorama/images/custom_game/cards/mima_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mima_name_png.vtex_c b/panorama/images/custom_game/cards/mima_name_png.vtex_c new file mode 100755 index 0000000..02d2ca0 Binary files /dev/null and b/panorama/images/custom_game/cards/mima_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mima_png.vtex_c b/panorama/images/custom_game/cards/mima_png.vtex_c new file mode 100755 index 0000000..c2197d6 Binary files /dev/null and b/panorama/images/custom_game/cards/mima_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/minamitsu_big_png.vtex_c b/panorama/images/custom_game/cards/minamitsu_big_png.vtex_c new file mode 100755 index 0000000..4bf6b65 Binary files /dev/null and b/panorama/images/custom_game/cards/minamitsu_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/minamitsu_name_png.vtex_c b/panorama/images/custom_game/cards/minamitsu_name_png.vtex_c new file mode 100755 index 0000000..987291b Binary files /dev/null and b/panorama/images/custom_game/cards/minamitsu_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/minamitsu_png.vtex_c b/panorama/images/custom_game/cards/minamitsu_png.vtex_c new file mode 100755 index 0000000..a7b0f7e Binary files /dev/null and b/panorama/images/custom_game/cards/minamitsu_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/minoriko_big_png.vtex_c b/panorama/images/custom_game/cards/minoriko_big_png.vtex_c new file mode 100755 index 0000000..0cbf429 Binary files /dev/null and b/panorama/images/custom_game/cards/minoriko_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/minoriko_name_png.vtex_c b/panorama/images/custom_game/cards/minoriko_name_png.vtex_c new file mode 100755 index 0000000..ecdac43 Binary files /dev/null and b/panorama/images/custom_game/cards/minoriko_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/minoriko_png.vtex_c b/panorama/images/custom_game/cards/minoriko_png.vtex_c new file mode 100755 index 0000000..e3e2fd6 Binary files /dev/null and b/panorama/images/custom_game/cards/minoriko_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mokou_big_png.vtex_c b/panorama/images/custom_game/cards/mokou_big_png.vtex_c new file mode 100755 index 0000000..0bc2b17 Binary files /dev/null and b/panorama/images/custom_game/cards/mokou_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mokou_name_png.vtex_c b/panorama/images/custom_game/cards/mokou_name_png.vtex_c new file mode 100755 index 0000000..0c6580d Binary files /dev/null and b/panorama/images/custom_game/cards/mokou_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mokou_png.vtex_c b/panorama/images/custom_game/cards/mokou_png.vtex_c new file mode 100755 index 0000000..fb943c1 Binary files /dev/null and b/panorama/images/custom_game/cards/mokou_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/momiji_big_png.vtex_c b/panorama/images/custom_game/cards/momiji_big_png.vtex_c new file mode 100755 index 0000000..6c0dbde Binary files /dev/null and b/panorama/images/custom_game/cards/momiji_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/momiji_name_png.vtex_c b/panorama/images/custom_game/cards/momiji_name_png.vtex_c new file mode 100755 index 0000000..09ffbea Binary files /dev/null and b/panorama/images/custom_game/cards/momiji_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/momiji_png.vtex_c b/panorama/images/custom_game/cards/momiji_png.vtex_c new file mode 100755 index 0000000..1434c44 Binary files /dev/null and b/panorama/images/custom_game/cards/momiji_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mugiyousei_big_png.vtex_c b/panorama/images/custom_game/cards/mugiyousei_big_png.vtex_c new file mode 100755 index 0000000..7f36f08 Binary files /dev/null and b/panorama/images/custom_game/cards/mugiyousei_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mugiyousei_name_png.vtex_c b/panorama/images/custom_game/cards/mugiyousei_name_png.vtex_c new file mode 100755 index 0000000..b56ab5d Binary files /dev/null and b/panorama/images/custom_game/cards/mugiyousei_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mugiyousei_png.vtex_c b/panorama/images/custom_game/cards/mugiyousei_png.vtex_c new file mode 100755 index 0000000..1a6ca99 Binary files /dev/null and b/panorama/images/custom_game/cards/mugiyousei_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mujiyousei_big_png.vtex_c b/panorama/images/custom_game/cards/mujiyousei_big_png.vtex_c new file mode 100755 index 0000000..b1dc684 Binary files /dev/null and b/panorama/images/custom_game/cards/mujiyousei_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mystia_big_png.vtex_c b/panorama/images/custom_game/cards/mystia_big_png.vtex_c new file mode 100755 index 0000000..4d9f196 Binary files /dev/null and b/panorama/images/custom_game/cards/mystia_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mystia_name_png.vtex_c b/panorama/images/custom_game/cards/mystia_name_png.vtex_c new file mode 100755 index 0000000..180080d Binary files /dev/null and b/panorama/images/custom_game/cards/mystia_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/mystia_png.vtex_c b/panorama/images/custom_game/cards/mystia_png.vtex_c new file mode 100755 index 0000000..740a5d3 Binary files /dev/null and b/panorama/images/custom_game/cards/mystia_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/n_bar_png.vtex_c b/panorama/images/custom_game/cards/n_bar_png.vtex_c new file mode 100755 index 0000000..a2b997f Binary files /dev/null and b/panorama/images/custom_game/cards/n_bar_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/n_png.vtex_c b/panorama/images/custom_game/cards/n_png.vtex_c new file mode 100755 index 0000000..2b9a5b6 Binary files /dev/null and b/panorama/images/custom_game/cards/n_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/nazrin_big_png.vtex_c b/panorama/images/custom_game/cards/nazrin_big_png.vtex_c new file mode 100755 index 0000000..c64cbcd Binary files /dev/null and b/panorama/images/custom_game/cards/nazrin_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/nazrin_name_png.vtex_c b/panorama/images/custom_game/cards/nazrin_name_png.vtex_c new file mode 100755 index 0000000..59fb636 Binary files /dev/null and b/panorama/images/custom_game/cards/nazrin_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/nazrin_png.vtex_c b/panorama/images/custom_game/cards/nazrin_png.vtex_c new file mode 100755 index 0000000..55aaabb Binary files /dev/null and b/panorama/images/custom_game/cards/nazrin_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/nitori_big_png.vtex_c b/panorama/images/custom_game/cards/nitori_big_png.vtex_c new file mode 100755 index 0000000..570f4af Binary files /dev/null and b/panorama/images/custom_game/cards/nitori_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/nue_big_png.vtex_c b/panorama/images/custom_game/cards/nue_big_png.vtex_c new file mode 100755 index 0000000..fa2cdc5 Binary files /dev/null and b/panorama/images/custom_game/cards/nue_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/nue_name_png.vtex_c b/panorama/images/custom_game/cards/nue_name_png.vtex_c new file mode 100755 index 0000000..26c97e6 Binary files /dev/null and b/panorama/images/custom_game/cards/nue_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/nue_png.vtex_c b/panorama/images/custom_game/cards/nue_png.vtex_c new file mode 100755 index 0000000..fa49301 Binary files /dev/null and b/panorama/images/custom_game/cards/nue_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/patchouli_big_png.vtex_c b/panorama/images/custom_game/cards/patchouli_big_png.vtex_c new file mode 100755 index 0000000..cc09870 Binary files /dev/null and b/panorama/images/custom_game/cards/patchouli_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/patchouli_name_png.vtex_c b/panorama/images/custom_game/cards/patchouli_name_png.vtex_c new file mode 100755 index 0000000..0642dd8 Binary files /dev/null and b/panorama/images/custom_game/cards/patchouli_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/patchouli_png.vtex_c b/panorama/images/custom_game/cards/patchouli_png.vtex_c new file mode 100755 index 0000000..ecf5590 Binary files /dev/null and b/panorama/images/custom_game/cards/patchouli_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/r_bar_png.vtex_c b/panorama/images/custom_game/cards/r_bar_png.vtex_c new file mode 100755 index 0000000..e2d4bee Binary files /dev/null and b/panorama/images/custom_game/cards/r_bar_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/r_png.vtex_c b/panorama/images/custom_game/cards/r_png.vtex_c new file mode 100755 index 0000000..a012985 Binary files /dev/null and b/panorama/images/custom_game/cards/r_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/ran_big_png.vtex_c b/panorama/images/custom_game/cards/ran_big_png.vtex_c new file mode 100755 index 0000000..26cb1fa Binary files /dev/null and b/panorama/images/custom_game/cards/ran_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/ran_name_png.vtex_c b/panorama/images/custom_game/cards/ran_name_png.vtex_c new file mode 100755 index 0000000..591bbf5 Binary files /dev/null and b/panorama/images/custom_game/cards/ran_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/ran_png.vtex_c b/panorama/images/custom_game/cards/ran_png.vtex_c new file mode 100755 index 0000000..6f80852 Binary files /dev/null and b/panorama/images/custom_game/cards/ran_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/reimu_big_png.vtex_c b/panorama/images/custom_game/cards/reimu_big_png.vtex_c new file mode 100755 index 0000000..0cd0536 Binary files /dev/null and b/panorama/images/custom_game/cards/reimu_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/reimu_name_png.vtex_c b/panorama/images/custom_game/cards/reimu_name_png.vtex_c new file mode 100755 index 0000000..4ab1a24 Binary files /dev/null and b/panorama/images/custom_game/cards/reimu_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/reimu_png.vtex_c b/panorama/images/custom_game/cards/reimu_png.vtex_c new file mode 100755 index 0000000..b9d06ee Binary files /dev/null and b/panorama/images/custom_game/cards/reimu_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/reisen_big_png.vtex_c b/panorama/images/custom_game/cards/reisen_big_png.vtex_c new file mode 100755 index 0000000..ead3732 Binary files /dev/null and b/panorama/images/custom_game/cards/reisen_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/reisen_name_png.vtex_c b/panorama/images/custom_game/cards/reisen_name_png.vtex_c new file mode 100755 index 0000000..469ece2 Binary files /dev/null and b/panorama/images/custom_game/cards/reisen_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/reisen_png.vtex_c b/panorama/images/custom_game/cards/reisen_png.vtex_c new file mode 100755 index 0000000..d0e9272 Binary files /dev/null and b/panorama/images/custom_game/cards/reisen_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/remilia_big_png.vtex_c b/panorama/images/custom_game/cards/remilia_big_png.vtex_c new file mode 100755 index 0000000..bd63fee Binary files /dev/null and b/panorama/images/custom_game/cards/remilia_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/remilia_name_png.vtex_c b/panorama/images/custom_game/cards/remilia_name_png.vtex_c new file mode 100755 index 0000000..d783fc4 Binary files /dev/null and b/panorama/images/custom_game/cards/remilia_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/remilia_png.vtex_c b/panorama/images/custom_game/cards/remilia_png.vtex_c new file mode 100755 index 0000000..618789f Binary files /dev/null and b/panorama/images/custom_game/cards/remilia_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/renko_big_png.vtex_c b/panorama/images/custom_game/cards/renko_big_png.vtex_c new file mode 100755 index 0000000..87bea45 Binary files /dev/null and b/panorama/images/custom_game/cards/renko_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/renko_name_png.vtex_c b/panorama/images/custom_game/cards/renko_name_png.vtex_c new file mode 100755 index 0000000..29169bb Binary files /dev/null and b/panorama/images/custom_game/cards/renko_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/renko_png.vtex_c b/panorama/images/custom_game/cards/renko_png.vtex_c new file mode 100755 index 0000000..1c65100 Binary files /dev/null and b/panorama/images/custom_game/cards/renko_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/rin_big_png.vtex_c b/panorama/images/custom_game/cards/rin_big_png.vtex_c new file mode 100755 index 0000000..63884e1 Binary files /dev/null and b/panorama/images/custom_game/cards/rin_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/rin_name_png.vtex_c b/panorama/images/custom_game/cards/rin_name_png.vtex_c new file mode 100755 index 0000000..ed55046 Binary files /dev/null and b/panorama/images/custom_game/cards/rin_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/rin_png.vtex_c b/panorama/images/custom_game/cards/rin_png.vtex_c new file mode 100755 index 0000000..35afd41 Binary files /dev/null and b/panorama/images/custom_game/cards/rin_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/rumia_big_png.vtex_c b/panorama/images/custom_game/cards/rumia_big_png.vtex_c new file mode 100755 index 0000000..c223d83 Binary files /dev/null and b/panorama/images/custom_game/cards/rumia_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/rumia_name_png.vtex_c b/panorama/images/custom_game/cards/rumia_name_png.vtex_c new file mode 100755 index 0000000..1311e04 Binary files /dev/null and b/panorama/images/custom_game/cards/rumia_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/rumia_png.vtex_c b/panorama/images/custom_game/cards/rumia_png.vtex_c new file mode 100755 index 0000000..4728cfc Binary files /dev/null and b/panorama/images/custom_game/cards/rumia_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sakuya_big_png.vtex_c b/panorama/images/custom_game/cards/sakuya_big_png.vtex_c new file mode 100755 index 0000000..1bee2cf Binary files /dev/null and b/panorama/images/custom_game/cards/sakuya_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sakuya_name_png.vtex_c b/panorama/images/custom_game/cards/sakuya_name_png.vtex_c new file mode 100755 index 0000000..8e94475 Binary files /dev/null and b/panorama/images/custom_game/cards/sakuya_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sakuya_png.vtex_c b/panorama/images/custom_game/cards/sakuya_png.vtex_c new file mode 100755 index 0000000..15d7089 Binary files /dev/null and b/panorama/images/custom_game/cards/sakuya_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sanae_big_png.vtex_c b/panorama/images/custom_game/cards/sanae_big_png.vtex_c new file mode 100755 index 0000000..12e03fb Binary files /dev/null and b/panorama/images/custom_game/cards/sanae_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sanae_name_png.vtex_c b/panorama/images/custom_game/cards/sanae_name_png.vtex_c new file mode 100755 index 0000000..ab35d36 Binary files /dev/null and b/panorama/images/custom_game/cards/sanae_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sanae_png.vtex_c b/panorama/images/custom_game/cards/sanae_png.vtex_c new file mode 100755 index 0000000..7585a12 Binary files /dev/null and b/panorama/images/custom_game/cards/sanae_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sariel_big_png.vtex_c b/panorama/images/custom_game/cards/sariel_big_png.vtex_c new file mode 100755 index 0000000..de6b01f Binary files /dev/null and b/panorama/images/custom_game/cards/sariel_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sariel_name_png.vtex_c b/panorama/images/custom_game/cards/sariel_name_png.vtex_c new file mode 100755 index 0000000..97026e7 Binary files /dev/null and b/panorama/images/custom_game/cards/sariel_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sariel_png.vtex_c b/panorama/images/custom_game/cards/sariel_png.vtex_c new file mode 100755 index 0000000..314fe46 Binary files /dev/null and b/panorama/images/custom_game/cards/sariel_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/satori_big_png.vtex_c b/panorama/images/custom_game/cards/satori_big_png.vtex_c new file mode 100755 index 0000000..010f6a2 Binary files /dev/null and b/panorama/images/custom_game/cards/satori_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/satori_name_png.vtex_c b/panorama/images/custom_game/cards/satori_name_png.vtex_c new file mode 100755 index 0000000..ed238f9 Binary files /dev/null and b/panorama/images/custom_game/cards/satori_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/satori_png.vtex_c b/panorama/images/custom_game/cards/satori_png.vtex_c new file mode 100755 index 0000000..0438c4d Binary files /dev/null and b/panorama/images/custom_game/cards/satori_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/seiga_big_png.vtex_c b/panorama/images/custom_game/cards/seiga_big_png.vtex_c new file mode 100755 index 0000000..1392709 Binary files /dev/null and b/panorama/images/custom_game/cards/seiga_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/seiga_name_png.vtex_c b/panorama/images/custom_game/cards/seiga_name_png.vtex_c new file mode 100755 index 0000000..6908590 Binary files /dev/null and b/panorama/images/custom_game/cards/seiga_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/seiga_png.vtex_c b/panorama/images/custom_game/cards/seiga_png.vtex_c new file mode 100755 index 0000000..c2ef6f0 Binary files /dev/null and b/panorama/images/custom_game/cards/seiga_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/seija_big_png.vtex_c b/panorama/images/custom_game/cards/seija_big_png.vtex_c new file mode 100755 index 0000000..33bd02b Binary files /dev/null and b/panorama/images/custom_game/cards/seija_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/seija_name_png.vtex_c b/panorama/images/custom_game/cards/seija_name_png.vtex_c new file mode 100755 index 0000000..113aa0e Binary files /dev/null and b/panorama/images/custom_game/cards/seija_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/seija_png.vtex_c b/panorama/images/custom_game/cards/seija_png.vtex_c new file mode 100755 index 0000000..72fa1a4 Binary files /dev/null and b/panorama/images/custom_game/cards/seija_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/shanghainingyou_big_png.vtex_c b/panorama/images/custom_game/cards/shanghainingyou_big_png.vtex_c new file mode 100755 index 0000000..2b0bf34 Binary files /dev/null and b/panorama/images/custom_game/cards/shanghainingyou_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/shanghainingyou_name_png.vtex_c b/panorama/images/custom_game/cards/shanghainingyou_name_png.vtex_c new file mode 100755 index 0000000..597728c Binary files /dev/null and b/panorama/images/custom_game/cards/shanghainingyou_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/shanghainingyou_png.vtex_c b/panorama/images/custom_game/cards/shanghainingyou_png.vtex_c new file mode 100755 index 0000000..60bb870 Binary files /dev/null and b/panorama/images/custom_game/cards/shanghainingyou_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/shikieiki_big_png.vtex_c b/panorama/images/custom_game/cards/shikieiki_big_png.vtex_c new file mode 100755 index 0000000..5f61570 Binary files /dev/null and b/panorama/images/custom_game/cards/shikieiki_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/shikieiki_name_png.vtex_c b/panorama/images/custom_game/cards/shikieiki_name_png.vtex_c new file mode 100755 index 0000000..5ec4033 Binary files /dev/null and b/panorama/images/custom_game/cards/shikieiki_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/shikieiki_png.vtex_c b/panorama/images/custom_game/cards/shikieiki_png.vtex_c new file mode 100755 index 0000000..9424cf8 Binary files /dev/null and b/panorama/images/custom_game/cards/shikieiki_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/shinki_big_png.vtex_c b/panorama/images/custom_game/cards/shinki_big_png.vtex_c new file mode 100755 index 0000000..0a691a7 Binary files /dev/null and b/panorama/images/custom_game/cards/shinki_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/shinki_name_png.vtex_c b/panorama/images/custom_game/cards/shinki_name_png.vtex_c new file mode 100755 index 0000000..a4d1233 Binary files /dev/null and b/panorama/images/custom_game/cards/shinki_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/shinki_png.vtex_c b/panorama/images/custom_game/cards/shinki_png.vtex_c new file mode 100755 index 0000000..5c96b0b Binary files /dev/null and b/panorama/images/custom_game/cards/shinki_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/shinmyoumaru_big_png.vtex_c b/panorama/images/custom_game/cards/shinmyoumaru_big_png.vtex_c new file mode 100755 index 0000000..60280fa Binary files /dev/null and b/panorama/images/custom_game/cards/shinmyoumaru_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/shinmyoumaru_name_png.vtex_c b/panorama/images/custom_game/cards/shinmyoumaru_name_png.vtex_c new file mode 100755 index 0000000..3fcfda7 Binary files /dev/null and b/panorama/images/custom_game/cards/shinmyoumaru_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/shinmyoumaru_png.vtex_c b/panorama/images/custom_game/cards/shinmyoumaru_png.vtex_c new file mode 100755 index 0000000..2bfec69 Binary files /dev/null and b/panorama/images/custom_game/cards/shinmyoumaru_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sizuha_big_png.vtex_c b/panorama/images/custom_game/cards/sizuha_big_png.vtex_c new file mode 100755 index 0000000..105f1b7 Binary files /dev/null and b/panorama/images/custom_game/cards/sizuha_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sizuha_name_png.vtex_c b/panorama/images/custom_game/cards/sizuha_name_png.vtex_c new file mode 100755 index 0000000..b69d493 Binary files /dev/null and b/panorama/images/custom_game/cards/sizuha_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sizuha_png.vtex_c b/panorama/images/custom_game/cards/sizuha_png.vtex_c new file mode 100755 index 0000000..3872fc4 Binary files /dev/null and b/panorama/images/custom_game/cards/sizuha_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/soga_big_png.vtex_c b/panorama/images/custom_game/cards/soga_big_png.vtex_c new file mode 100755 index 0000000..0c1efc9 Binary files /dev/null and b/panorama/images/custom_game/cards/soga_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/soga_name_png.vtex_c b/panorama/images/custom_game/cards/soga_name_png.vtex_c new file mode 100755 index 0000000..61deaef Binary files /dev/null and b/panorama/images/custom_game/cards/soga_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/soga_png.vtex_c b/panorama/images/custom_game/cards/soga_png.vtex_c new file mode 100755 index 0000000..782bb58 Binary files /dev/null and b/panorama/images/custom_game/cards/soga_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sr_bar_png.vtex_c b/panorama/images/custom_game/cards/sr_bar_png.vtex_c new file mode 100755 index 0000000..5a99b79 Binary files /dev/null and b/panorama/images/custom_game/cards/sr_bar_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sr_png.vtex_c b/panorama/images/custom_game/cards/sr_png.vtex_c new file mode 100755 index 0000000..57d4f61 Binary files /dev/null and b/panorama/images/custom_game/cards/sr_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/ssr_bar_png.vtex_c b/panorama/images/custom_game/cards/ssr_bar_png.vtex_c new file mode 100755 index 0000000..6973978 Binary files /dev/null and b/panorama/images/custom_game/cards/ssr_bar_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/ssr_png.vtex_c b/panorama/images/custom_game/cards/ssr_png.vtex_c new file mode 100755 index 0000000..0436928 Binary files /dev/null and b/panorama/images/custom_game/cards/ssr_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/star_big_png.vtex_c b/panorama/images/custom_game/cards/star_big_png.vtex_c new file mode 100755 index 0000000..62e5a7c Binary files /dev/null and b/panorama/images/custom_game/cards/star_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/star_name_png.vtex_c b/panorama/images/custom_game/cards/star_name_png.vtex_c new file mode 100755 index 0000000..cce03fe Binary files /dev/null and b/panorama/images/custom_game/cards/star_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/star_png.vtex_c b/panorama/images/custom_game/cards/star_png.vtex_c new file mode 100755 index 0000000..5b3c26e Binary files /dev/null and b/panorama/images/custom_game/cards/star_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/suika_big_png.vtex_c b/panorama/images/custom_game/cards/suika_big_png.vtex_c new file mode 100755 index 0000000..8ae7645 Binary files /dev/null and b/panorama/images/custom_game/cards/suika_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/suika_name_png.vtex_c b/panorama/images/custom_game/cards/suika_name_png.vtex_c new file mode 100755 index 0000000..22c8e02 Binary files /dev/null and b/panorama/images/custom_game/cards/suika_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/suika_png.vtex_c b/panorama/images/custom_game/cards/suika_png.vtex_c new file mode 100755 index 0000000..c2d7712 Binary files /dev/null and b/panorama/images/custom_game/cards/suika_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sumireko_big_png.vtex_c b/panorama/images/custom_game/cards/sumireko_big_png.vtex_c new file mode 100755 index 0000000..e0dc330 Binary files /dev/null and b/panorama/images/custom_game/cards/sumireko_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sumireko_name_png.vtex_c b/panorama/images/custom_game/cards/sumireko_name_png.vtex_c new file mode 100755 index 0000000..f5ca9a0 Binary files /dev/null and b/panorama/images/custom_game/cards/sumireko_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sumireko_png.vtex_c b/panorama/images/custom_game/cards/sumireko_png.vtex_c new file mode 100755 index 0000000..8127d5d Binary files /dev/null and b/panorama/images/custom_game/cards/sumireko_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sunny_big_png.vtex_c b/panorama/images/custom_game/cards/sunny_big_png.vtex_c new file mode 100755 index 0000000..c401a21 Binary files /dev/null and b/panorama/images/custom_game/cards/sunny_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sunny_name_png.vtex_c b/panorama/images/custom_game/cards/sunny_name_png.vtex_c new file mode 100755 index 0000000..0c5c4c3 Binary files /dev/null and b/panorama/images/custom_game/cards/sunny_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/sunny_png.vtex_c b/panorama/images/custom_game/cards/sunny_png.vtex_c new file mode 100755 index 0000000..05a562b Binary files /dev/null and b/panorama/images/custom_game/cards/sunny_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/suwako_big_png.vtex_c b/panorama/images/custom_game/cards/suwako_big_png.vtex_c new file mode 100755 index 0000000..aa2fcce Binary files /dev/null and b/panorama/images/custom_game/cards/suwako_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/suwako_name_png.vtex_c b/panorama/images/custom_game/cards/suwako_name_png.vtex_c new file mode 100755 index 0000000..0a8e1f0 Binary files /dev/null and b/panorama/images/custom_game/cards/suwako_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/suwako_png.vtex_c b/panorama/images/custom_game/cards/suwako_png.vtex_c new file mode 100755 index 0000000..6093ccb Binary files /dev/null and b/panorama/images/custom_game/cards/suwako_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/tenshi_big_png.vtex_c b/panorama/images/custom_game/cards/tenshi_big_png.vtex_c new file mode 100755 index 0000000..3dbfd52 Binary files /dev/null and b/panorama/images/custom_game/cards/tenshi_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/tenshi_name_png.vtex_c b/panorama/images/custom_game/cards/tenshi_name_png.vtex_c new file mode 100755 index 0000000..61df52b Binary files /dev/null and b/panorama/images/custom_game/cards/tenshi_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/tenshi_png.vtex_c b/panorama/images/custom_game/cards/tenshi_png.vtex_c new file mode 100755 index 0000000..f60f97d Binary files /dev/null and b/panorama/images/custom_game/cards/tenshi_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/toramaru_big_png.vtex_c b/panorama/images/custom_game/cards/toramaru_big_png.vtex_c new file mode 100755 index 0000000..94aeac3 Binary files /dev/null and b/panorama/images/custom_game/cards/toramaru_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/toramaru_name_png.vtex_c b/panorama/images/custom_game/cards/toramaru_name_png.vtex_c new file mode 100755 index 0000000..7428c12 Binary files /dev/null and b/panorama/images/custom_game/cards/toramaru_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/toramaru_png.vtex_c b/panorama/images/custom_game/cards/toramaru_png.vtex_c new file mode 100755 index 0000000..7b991f6 Binary files /dev/null and b/panorama/images/custom_game/cards/toramaru_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/utsuho_big_png.vtex_c b/panorama/images/custom_game/cards/utsuho_big_png.vtex_c new file mode 100755 index 0000000..7b56aa2 Binary files /dev/null and b/panorama/images/custom_game/cards/utsuho_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/utsuho_name_png.vtex_c b/panorama/images/custom_game/cards/utsuho_name_png.vtex_c new file mode 100755 index 0000000..52e45cc Binary files /dev/null and b/panorama/images/custom_game/cards/utsuho_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/utsuho_png.vtex_c b/panorama/images/custom_game/cards/utsuho_png.vtex_c new file mode 100755 index 0000000..fa06ee6 Binary files /dev/null and b/panorama/images/custom_game/cards/utsuho_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/wriggle_big_png.vtex_c b/panorama/images/custom_game/cards/wriggle_big_png.vtex_c new file mode 100755 index 0000000..96c25d0 Binary files /dev/null and b/panorama/images/custom_game/cards/wriggle_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/wriggle_name_png.vtex_c b/panorama/images/custom_game/cards/wriggle_name_png.vtex_c new file mode 100755 index 0000000..13d38e6 Binary files /dev/null and b/panorama/images/custom_game/cards/wriggle_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/wriggle_png.vtex_c b/panorama/images/custom_game/cards/wriggle_png.vtex_c new file mode 100755 index 0000000..4b5313f Binary files /dev/null and b/panorama/images/custom_game/cards/wriggle_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yoshika_big_png.vtex_c b/panorama/images/custom_game/cards/yoshika_big_png.vtex_c new file mode 100755 index 0000000..b81c0ea Binary files /dev/null and b/panorama/images/custom_game/cards/yoshika_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yoshika_name_png.vtex_c b/panorama/images/custom_game/cards/yoshika_name_png.vtex_c new file mode 100755 index 0000000..23428b3 Binary files /dev/null and b/panorama/images/custom_game/cards/yoshika_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yoshika_png.vtex_c b/panorama/images/custom_game/cards/yoshika_png.vtex_c new file mode 100755 index 0000000..c28ea28 Binary files /dev/null and b/panorama/images/custom_game/cards/yoshika_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/youmu_big_png.vtex_c b/panorama/images/custom_game/cards/youmu_big_png.vtex_c new file mode 100755 index 0000000..630a8cf Binary files /dev/null and b/panorama/images/custom_game/cards/youmu_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/youmu_name_png.vtex_c b/panorama/images/custom_game/cards/youmu_name_png.vtex_c new file mode 100755 index 0000000..ee8ec0b Binary files /dev/null and b/panorama/images/custom_game/cards/youmu_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/youmu_png.vtex_c b/panorama/images/custom_game/cards/youmu_png.vtex_c new file mode 100755 index 0000000..ab4775f Binary files /dev/null and b/panorama/images/custom_game/cards/youmu_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yukari_big_png.vtex_c b/panorama/images/custom_game/cards/yukari_big_png.vtex_c new file mode 100755 index 0000000..c2de40f Binary files /dev/null and b/panorama/images/custom_game/cards/yukari_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yukari_name_png.vtex_c b/panorama/images/custom_game/cards/yukari_name_png.vtex_c new file mode 100755 index 0000000..433cc50 Binary files /dev/null and b/panorama/images/custom_game/cards/yukari_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yukari_png.vtex_c b/panorama/images/custom_game/cards/yukari_png.vtex_c new file mode 100755 index 0000000..29ecb6b Binary files /dev/null and b/panorama/images/custom_game/cards/yukari_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yumemi_big_png.vtex_c b/panorama/images/custom_game/cards/yumemi_big_png.vtex_c new file mode 100755 index 0000000..59f4029 Binary files /dev/null and b/panorama/images/custom_game/cards/yumemi_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yumemi_name_png.vtex_c b/panorama/images/custom_game/cards/yumemi_name_png.vtex_c new file mode 100755 index 0000000..30a3c0b Binary files /dev/null and b/panorama/images/custom_game/cards/yumemi_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yumemi_png.vtex_c b/panorama/images/custom_game/cards/yumemi_png.vtex_c new file mode 100755 index 0000000..403fc0c Binary files /dev/null and b/panorama/images/custom_game/cards/yumemi_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yuugi_big_png.vtex_c b/panorama/images/custom_game/cards/yuugi_big_png.vtex_c new file mode 100755 index 0000000..b641e08 Binary files /dev/null and b/panorama/images/custom_game/cards/yuugi_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yuugi_name_png.vtex_c b/panorama/images/custom_game/cards/yuugi_name_png.vtex_c new file mode 100755 index 0000000..d4052fe Binary files /dev/null and b/panorama/images/custom_game/cards/yuugi_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yuugi_png.vtex_c b/panorama/images/custom_game/cards/yuugi_png.vtex_c new file mode 100755 index 0000000..e1e4e7c Binary files /dev/null and b/panorama/images/custom_game/cards/yuugi_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yuuka_big_png.vtex_c b/panorama/images/custom_game/cards/yuuka_big_png.vtex_c new file mode 100755 index 0000000..3b46969 Binary files /dev/null and b/panorama/images/custom_game/cards/yuuka_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yuuka_name_png.vtex_c b/panorama/images/custom_game/cards/yuuka_name_png.vtex_c new file mode 100755 index 0000000..6d03328 Binary files /dev/null and b/panorama/images/custom_game/cards/yuuka_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yuuka_png.vtex_c b/panorama/images/custom_game/cards/yuuka_png.vtex_c new file mode 100755 index 0000000..8e1448d Binary files /dev/null and b/panorama/images/custom_game/cards/yuuka_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yuyuko_big_png.vtex_c b/panorama/images/custom_game/cards/yuyuko_big_png.vtex_c new file mode 100755 index 0000000..a8782c0 Binary files /dev/null and b/panorama/images/custom_game/cards/yuyuko_big_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yuyuko_name_png.vtex_c b/panorama/images/custom_game/cards/yuyuko_name_png.vtex_c new file mode 100755 index 0000000..3a0d9cd Binary files /dev/null and b/panorama/images/custom_game/cards/yuyuko_name_png.vtex_c differ diff --git a/panorama/images/custom_game/cards/yuyuko_png.vtex_c b/panorama/images/custom_game/cards/yuyuko_png.vtex_c new file mode 100755 index 0000000..66357e6 Binary files /dev/null and b/panorama/images/custom_game/cards/yuyuko_png.vtex_c differ diff --git a/panorama/images/custom_game/cc_process_bar_bg_png.vtex_c b/panorama/images/custom_game/cc_process_bar_bg_png.vtex_c new file mode 100755 index 0000000..7b7438d Binary files /dev/null and b/panorama/images/custom_game/cc_process_bar_bg_png.vtex_c differ diff --git a/panorama/images/custom_game/cc_process_bar_pct_png.vtex_c b/panorama/images/custom_game/cc_process_bar_pct_png.vtex_c new file mode 100755 index 0000000..f276a65 Binary files /dev/null and b/panorama/images/custom_game/cc_process_bar_pct_png.vtex_c differ diff --git a/panorama/images/custom_game/circle_button_png.vtex_c b/panorama/images/custom_game/circle_button_png.vtex_c new file mode 100755 index 0000000..6653815 Binary files /dev/null and b/panorama/images/custom_game/circle_button_png.vtex_c differ diff --git a/panorama/images/custom_game/disable_png.vtex_c b/panorama/images/custom_game/disable_png.vtex_c new file mode 100755 index 0000000..51cbef0 Binary files /dev/null and b/panorama/images/custom_game/disable_png.vtex_c differ diff --git a/panorama/images/custom_game/dps_bar_png.vtex_c b/panorama/images/custom_game/dps_bar_png.vtex_c new file mode 100755 index 0000000..08174ea Binary files /dev/null and b/panorama/images/custom_game/dps_bar_png.vtex_c differ diff --git a/panorama/images/custom_game/fairy_png.vtex_c b/panorama/images/custom_game/fairy_png.vtex_c new file mode 100755 index 0000000..2d66f15 Binary files /dev/null and b/panorama/images/custom_game/fairy_png.vtex_c differ diff --git a/panorama/images/custom_game/food_count_png.vtex_c b/panorama/images/custom_game/food_count_png.vtex_c new file mode 100755 index 0000000..e3e5e33 Binary files /dev/null and b/panorama/images/custom_game/food_count_png.vtex_c differ diff --git a/panorama/images/custom_game/hook_png.vtex_c b/panorama/images/custom_game/hook_png.vtex_c new file mode 100755 index 0000000..9009ff5 Binary files /dev/null and b/panorama/images/custom_game/hook_png.vtex_c differ diff --git a/panorama/images/custom_game/list_header_closing_png.vtex_c b/panorama/images/custom_game/list_header_closing_png.vtex_c new file mode 100755 index 0000000..9326f52 Binary files /dev/null and b/panorama/images/custom_game/list_header_closing_png.vtex_c differ diff --git a/panorama/images/custom_game/list_header_opening_png.vtex_c b/panorama/images/custom_game/list_header_opening_png.vtex_c new file mode 100755 index 0000000..662ae5a Binary files /dev/null and b/panorama/images/custom_game/list_header_opening_png.vtex_c differ diff --git a/panorama/images/custom_game/loading_ico2_png.vtex_c b/panorama/images/custom_game/loading_ico2_png.vtex_c new file mode 100755 index 0000000..b61f04e Binary files /dev/null and b/panorama/images/custom_game/loading_ico2_png.vtex_c differ diff --git a/panorama/images/custom_game/loading_ico_png.vtex_c b/panorama/images/custom_game/loading_ico_png.vtex_c new file mode 100755 index 0000000..14b70b2 Binary files /dev/null and b/panorama/images/custom_game/loading_ico_png.vtex_c differ diff --git a/panorama/images/custom_game/mask01_png.vtex_c b/panorama/images/custom_game/mask01_png.vtex_c new file mode 100755 index 0000000..d53894d Binary files /dev/null and b/panorama/images/custom_game/mask01_png.vtex_c differ diff --git a/panorama/images/custom_game/note_png.vtex_c b/panorama/images/custom_game/note_png.vtex_c new file mode 100755 index 0000000..03eb097 Binary files /dev/null and b/panorama/images/custom_game/note_png.vtex_c differ diff --git a/panorama/images/custom_game/qr_alipay_png.vtex_c b/panorama/images/custom_game/qr_alipay_png.vtex_c new file mode 100755 index 0000000..c64e5a6 Binary files /dev/null and b/panorama/images/custom_game/qr_alipay_png.vtex_c differ diff --git a/panorama/images/custom_game/qr_wechat_png.vtex_c b/panorama/images/custom_game/qr_wechat_png.vtex_c new file mode 100755 index 0000000..f8d916c Binary files /dev/null and b/panorama/images/custom_game/qr_wechat_png.vtex_c differ diff --git a/panorama/images/custom_game/refresh2_png.vtex_c b/panorama/images/custom_game/refresh2_png.vtex_c new file mode 100755 index 0000000..c0ee0b0 Binary files /dev/null and b/panorama/images/custom_game/refresh2_png.vtex_c differ diff --git a/panorama/images/custom_game/refresh_png.vtex_c b/panorama/images/custom_game/refresh_png.vtex_c new file mode 100755 index 0000000..d2453d1 Binary files /dev/null and b/panorama/images/custom_game/refresh_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/back_btn_disabled_png.vtex_c b/panorama/images/custom_game/setup/back_btn_disabled_png.vtex_c new file mode 100755 index 0000000..f0546a6 Binary files /dev/null and b/panorama/images/custom_game/setup/back_btn_disabled_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/back_btn_hover_png.vtex_c b/panorama/images/custom_game/setup/back_btn_hover_png.vtex_c new file mode 100755 index 0000000..fe5faa4 Binary files /dev/null and b/panorama/images/custom_game/setup/back_btn_hover_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/back_btn_normal_png.vtex_c b/panorama/images/custom_game/setup/back_btn_normal_png.vtex_c new file mode 100755 index 0000000..0991e43 Binary files /dev/null and b/panorama/images/custom_game/setup/back_btn_normal_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/bar01_png.vtex_c b/panorama/images/custom_game/setup/bar01_png.vtex_c new file mode 100755 index 0000000..0a1e947 Binary files /dev/null and b/panorama/images/custom_game/setup/bar01_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/bar02_png.vtex_c b/panorama/images/custom_game/setup/bar02_png.vtex_c new file mode 100755 index 0000000..21de2c9 Binary files /dev/null and b/panorama/images/custom_game/setup/bar02_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/bar03_png.vtex_c b/panorama/images/custom_game/setup/bar03_png.vtex_c new file mode 100755 index 0000000..c2bf71b Binary files /dev/null and b/panorama/images/custom_game/setup/bar03_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/cardinfo_ability_png.vtex_c b/panorama/images/custom_game/setup/cardinfo_ability_png.vtex_c new file mode 100755 index 0000000..c3a42ae Binary files /dev/null and b/panorama/images/custom_game/setup/cardinfo_ability_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/cardinfo_btn_disabled_png.vtex_c b/panorama/images/custom_game/setup/cardinfo_btn_disabled_png.vtex_c new file mode 100755 index 0000000..116d613 Binary files /dev/null and b/panorama/images/custom_game/setup/cardinfo_btn_disabled_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/cardinfo_btn_hover_png.vtex_c b/panorama/images/custom_game/setup/cardinfo_btn_hover_png.vtex_c new file mode 100755 index 0000000..c61457d Binary files /dev/null and b/panorama/images/custom_game/setup/cardinfo_btn_hover_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/cardinfo_btn_png.vtex_c b/panorama/images/custom_game/setup/cardinfo_btn_png.vtex_c new file mode 100755 index 0000000..b3783e9 Binary files /dev/null and b/panorama/images/custom_game/setup/cardinfo_btn_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/continue_btn_disabled_png.vtex_c b/panorama/images/custom_game/setup/continue_btn_disabled_png.vtex_c new file mode 100755 index 0000000..675b4e2 Binary files /dev/null and b/panorama/images/custom_game/setup/continue_btn_disabled_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/continue_btn_hover_png.vtex_c b/panorama/images/custom_game/setup/continue_btn_hover_png.vtex_c new file mode 100755 index 0000000..116e0e0 Binary files /dev/null and b/panorama/images/custom_game/setup/continue_btn_hover_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/continue_btn_normal_png.vtex_c b/panorama/images/custom_game/setup/continue_btn_normal_png.vtex_c new file mode 100755 index 0000000..5c22e41 Binary files /dev/null and b/panorama/images/custom_game/setup/continue_btn_normal_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/n_bar_png.vtex_c b/panorama/images/custom_game/setup/n_bar_png.vtex_c new file mode 100755 index 0000000..6a79176 Binary files /dev/null and b/panorama/images/custom_game/setup/n_bar_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/n_png.vtex_c b/panorama/images/custom_game/setup/n_png.vtex_c new file mode 100755 index 0000000..93db7a3 Binary files /dev/null and b/panorama/images/custom_game/setup/n_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/option_button_hover_left_png.vtex_c b/panorama/images/custom_game/setup/option_button_hover_left_png.vtex_c new file mode 100755 index 0000000..acd797d Binary files /dev/null and b/panorama/images/custom_game/setup/option_button_hover_left_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/option_button_hover_mid_png.vtex_c b/panorama/images/custom_game/setup/option_button_hover_mid_png.vtex_c new file mode 100755 index 0000000..6c6ecc2 Binary files /dev/null and b/panorama/images/custom_game/setup/option_button_hover_mid_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/option_button_hover_right_png.vtex_c b/panorama/images/custom_game/setup/option_button_hover_right_png.vtex_c new file mode 100755 index 0000000..2d97911 Binary files /dev/null and b/panorama/images/custom_game/setup/option_button_hover_right_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/option_button_left_png.vtex_c b/panorama/images/custom_game/setup/option_button_left_png.vtex_c new file mode 100755 index 0000000..40efa61 Binary files /dev/null and b/panorama/images/custom_game/setup/option_button_left_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/option_button_mid_png.vtex_c b/panorama/images/custom_game/setup/option_button_mid_png.vtex_c new file mode 100755 index 0000000..e903492 Binary files /dev/null and b/panorama/images/custom_game/setup/option_button_mid_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/option_button_right_png.vtex_c b/panorama/images/custom_game/setup/option_button_right_png.vtex_c new file mode 100755 index 0000000..4422e06 Binary files /dev/null and b/panorama/images/custom_game/setup/option_button_right_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/option_button_single_hover_png.vtex_c b/panorama/images/custom_game/setup/option_button_single_hover_png.vtex_c new file mode 100755 index 0000000..a80df34 Binary files /dev/null and b/panorama/images/custom_game/setup/option_button_single_hover_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/option_button_single_png.vtex_c b/panorama/images/custom_game/setup/option_button_single_png.vtex_c new file mode 100755 index 0000000..eff15aa Binary files /dev/null and b/panorama/images/custom_game/setup/option_button_single_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/r_bar_png.vtex_c b/panorama/images/custom_game/setup/r_bar_png.vtex_c new file mode 100755 index 0000000..d6dbd16 Binary files /dev/null and b/panorama/images/custom_game/setup/r_bar_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/r_png.vtex_c b/panorama/images/custom_game/setup/r_png.vtex_c new file mode 100755 index 0000000..0abb7e1 Binary files /dev/null and b/panorama/images/custom_game/setup/r_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/sr_bar_png.vtex_c b/panorama/images/custom_game/setup/sr_bar_png.vtex_c new file mode 100755 index 0000000..26bb042 Binary files /dev/null and b/panorama/images/custom_game/setup/sr_bar_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/sr_png.vtex_c b/panorama/images/custom_game/setup/sr_png.vtex_c new file mode 100755 index 0000000..788d71f Binary files /dev/null and b/panorama/images/custom_game/setup/sr_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/ssr_bar_png.vtex_c b/panorama/images/custom_game/setup/ssr_bar_png.vtex_c new file mode 100755 index 0000000..cf9384f Binary files /dev/null and b/panorama/images/custom_game/setup/ssr_bar_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/ssr_png.vtex_c b/panorama/images/custom_game/setup/ssr_png.vtex_c new file mode 100755 index 0000000..0b42eeb Binary files /dev/null and b/panorama/images/custom_game/setup/ssr_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/title_hr_png.vtex_c b/panorama/images/custom_game/setup/title_hr_png.vtex_c new file mode 100755 index 0000000..9c1c607 Binary files /dev/null and b/panorama/images/custom_game/setup/title_hr_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/title_left_png.vtex_c b/panorama/images/custom_game/setup/title_left_png.vtex_c new file mode 100755 index 0000000..38f9c1f Binary files /dev/null and b/panorama/images/custom_game/setup/title_left_png.vtex_c differ diff --git a/panorama/images/custom_game/setup/title_right_png.vtex_c b/panorama/images/custom_game/setup/title_right_png.vtex_c new file mode 100755 index 0000000..bcb381a Binary files /dev/null and b/panorama/images/custom_game/setup/title_right_png.vtex_c differ diff --git a/panorama/images/custom_game/star_png.vtex_c b/panorama/images/custom_game/star_png.vtex_c new file mode 100755 index 0000000..74e8340 Binary files /dev/null and b/panorama/images/custom_game/star_png.vtex_c differ diff --git a/panorama/images/custom_game/wechatpay_png.vtex_c b/panorama/images/custom_game/wechatpay_png.vtex_c new file mode 100755 index 0000000..5d97de6 Binary files /dev/null and b/panorama/images/custom_game/wechatpay_png.vtex_c differ diff --git a/panorama/images/heroes/icons/npc_dota_hero_juggernaut_png.vtex_c b/panorama/images/heroes/icons/npc_dota_hero_juggernaut_png.vtex_c new file mode 100755 index 0000000..eb2322f Binary files /dev/null and b/panorama/images/heroes/icons/npc_dota_hero_juggernaut_png.vtex_c differ diff --git a/panorama/images/heroes/icons/npc_dota_hero_lina_png.vtex_c b/panorama/images/heroes/icons/npc_dota_hero_lina_png.vtex_c new file mode 100755 index 0000000..baaebe7 Binary files /dev/null and b/panorama/images/heroes/icons/npc_dota_hero_lina_png.vtex_c differ diff --git a/panorama/images/heroes/npc_dota_hero_juggernaut_png.vtex_c b/panorama/images/heroes/npc_dota_hero_juggernaut_png.vtex_c new file mode 100755 index 0000000..99f7ab6 Binary files /dev/null and b/panorama/images/heroes/npc_dota_hero_juggernaut_png.vtex_c differ diff --git a/panorama/images/heroes/npc_dota_hero_lina_png.vtex_c b/panorama/images/heroes/npc_dota_hero_lina_png.vtex_c new file mode 100755 index 0000000..99f7ab6 Binary files /dev/null and b/panorama/images/heroes/npc_dota_hero_lina_png.vtex_c differ diff --git a/panorama/images/heroes/selection/npc_dota_hero_lina_png.vtex_c b/panorama/images/heroes/selection/npc_dota_hero_lina_png.vtex_c new file mode 100755 index 0000000..a16b013 Binary files /dev/null and b/panorama/images/heroes/selection/npc_dota_hero_lina_png.vtex_c differ diff --git a/panorama/layout/custom_game/custom_loading_screen.vxml_c b/panorama/layout/custom_game/custom_loading_screen.vxml_c new file mode 100755 index 0000000..c8ac405 Binary files /dev/null and b/panorama/layout/custom_game/custom_loading_screen.vxml_c differ diff --git a/panorama/layout/custom_game/custom_ui_manifest.vxml_c b/panorama/layout/custom_game/custom_ui_manifest.vxml_c new file mode 100755 index 0000000..4f77f3e Binary files /dev/null and b/panorama/layout/custom_game/custom_ui_manifest.vxml_c differ diff --git a/panorama/layout/custom_game/dps_panel.vxml_c b/panorama/layout/custom_game/dps_panel.vxml_c new file mode 100755 index 0000000..84e4f2f Binary files /dev/null and b/panorama/layout/custom_game/dps_panel.vxml_c differ diff --git a/panorama/layout/custom_game/end_screen.vxml_c b/panorama/layout/custom_game/end_screen.vxml_c new file mode 100755 index 0000000..4e76797 Binary files /dev/null and b/panorama/layout/custom_game/end_screen.vxml_c differ diff --git a/panorama/layout/custom_game/frames/cosmetic_abilities/cosmetic_abilities.vcss_c b/panorama/layout/custom_game/frames/cosmetic_abilities/cosmetic_abilities.vcss_c new file mode 100755 index 0000000..46bdbe0 Binary files /dev/null and b/panorama/layout/custom_game/frames/cosmetic_abilities/cosmetic_abilities.vcss_c differ diff --git a/panorama/layout/custom_game/frames/cosmetic_abilities/cosmetic_abilities.vjs_c b/panorama/layout/custom_game/frames/cosmetic_abilities/cosmetic_abilities.vjs_c new file mode 100755 index 0000000..c2261d0 Binary files /dev/null and b/panorama/layout/custom_game/frames/cosmetic_abilities/cosmetic_abilities.vjs_c differ diff --git a/panorama/layout/custom_game/frames/cosmetic_abilities/cosmetic_abilities.vxml_c b/panorama/layout/custom_game/frames/cosmetic_abilities/cosmetic_abilities.vxml_c new file mode 100755 index 0000000..aaff683 Binary files /dev/null and b/panorama/layout/custom_game/frames/cosmetic_abilities/cosmetic_abilities.vxml_c differ diff --git a/panorama/layout/custom_game/frames/cosmetic_abilities/creator.vjs_c b/panorama/layout/custom_game/frames/cosmetic_abilities/creator.vjs_c new file mode 100755 index 0000000..37e6b00 Binary files /dev/null and b/panorama/layout/custom_game/frames/cosmetic_abilities/creator.vjs_c differ diff --git a/panorama/layout/custom_game/frames/message/message.vcss_c b/panorama/layout/custom_game/frames/message/message.vcss_c new file mode 100755 index 0000000..69fdcdd Binary files /dev/null and b/panorama/layout/custom_game/frames/message/message.vcss_c differ diff --git a/panorama/layout/custom_game/frames/message/message.vjs_c b/panorama/layout/custom_game/frames/message/message.vjs_c new file mode 100755 index 0000000..049de68 Binary files /dev/null and b/panorama/layout/custom_game/frames/message/message.vjs_c differ diff --git a/panorama/layout/custom_game/frames/message/message.vxml_c b/panorama/layout/custom_game/frames/message/message.vxml_c new file mode 100755 index 0000000..39b456a Binary files /dev/null and b/panorama/layout/custom_game/frames/message/message.vxml_c differ diff --git a/panorama/layout/custom_game/frames/payment/payment.vcss_c b/panorama/layout/custom_game/frames/payment/payment.vcss_c new file mode 100755 index 0000000..f90acc4 Binary files /dev/null and b/panorama/layout/custom_game/frames/payment/payment.vcss_c differ diff --git a/panorama/layout/custom_game/frames/payment/payment.vjs_c b/panorama/layout/custom_game/frames/payment/payment.vjs_c new file mode 100755 index 0000000..fbc0be5 Binary files /dev/null and b/panorama/layout/custom_game/frames/payment/payment.vjs_c differ diff --git a/panorama/layout/custom_game/frames/payment/payment.vxml_c b/panorama/layout/custom_game/frames/payment/payment.vxml_c new file mode 100755 index 0000000..9cfb8d7 Binary files /dev/null and b/panorama/layout/custom_game/frames/payment/payment.vxml_c differ diff --git a/panorama/layout/custom_game/info.vxml_c b/panorama/layout/custom_game/info.vxml_c new file mode 100755 index 0000000..ada999b Binary files /dev/null and b/panorama/layout/custom_game/info.vxml_c differ diff --git a/panorama/layout/custom_game/shop.vxml_c b/panorama/layout/custom_game/shop.vxml_c new file mode 100755 index 0000000..809f792 Binary files /dev/null and b/panorama/layout/custom_game/shop.vxml_c differ diff --git a/panorama/layout/custom_game/team_select.vxml_c b/panorama/layout/custom_game/team_select.vxml_c new file mode 100755 index 0000000..929f685 Binary files /dev/null and b/panorama/layout/custom_game/team_select.vxml_c differ diff --git a/panorama/localization/addon_english.txt b/panorama/localization/addon_english.txt new file mode 100755 index 0000000..59e15c6 --- /dev/null +++ b/panorama/localization/addon_english.txt @@ -0,0 +1,340 @@ +"addon" +{ + //"DOTA_InventoryMenu_Sell" "Sell In Shop" + "DOTA_InventoryMenu_LockCombine" "Lock" + "DOTA_InventoryMenu_UnlockCombine" "Unlock" + //"DOTA_InventoryMenu_LockCombine" "Sell" + //"DOTA_InventoryMenu_UnlockCombine" "Sell" + "DOTA_InventoryMenu_MoveToStash" "RePlace Items" + "pause_game_btn" "Pause Game Forever" + "td_pawn_count" "PAWN AMOUNT:{d:count} / {d:max_count}" + "td_food_count" "{d:count} / 12" + "td_food_count_text" "FOOD AMOUNT" + "td_creature_kill_count" "POINT:{d:point} PAWN-KILLING AMOUNT:{d:count}" + "td_creature_kill_count_text" "KILLING AMOUNT" + "td_tower_dps_title" "DAMAGE STATS" + "td_attacking_wave" "WAVE {d:wave}" + "td_type" "TYPE:" + "td_auto_save_group" "AUTO SAVE GROUP" + "td_gamepoint_desc" "GAME POINT
CAN BE GAINED BY COMPLETING GAMES. " + "td_card_pool" "CARD DECK" + "td_card_group" "Group" + "td_remove_card" "Remove Card" + "td_show_card_info" "Show Card Info" + "td_select_card" "Select Card" + "td_select_bonus_card" "Select Bonus Card (20 Points)" + "td_select_bonus_card_vip" "Select Bonus Card" + "td_select_battle_bonus_card" "Select Battle Bonus Card" + "td_card_pool_note" "NOTE" + "td_card_pool_note_desc" "Note: Each SSR/SR/R card can only put 5 cards to the card group, and each N card can only put 10 cards to the card group." + "td_clear_all" "CLEAR CARD GROUP" + "td_clear_all_question" "DO YOU SURE CLEAR CARD GROUP?" + "td_rename_group" "RENAME GROUP" + "td_rename_group_text" "Please input new card group name:" + "td_ready_title1" "SETUP CARD GROUP" + "td_ready_title1_desc" "The preparation time is 5 minutes in a multiplayer time and 30 minutes in a single person. Please remember the save card group" + "td_ready_title2" "SELECT DIFFICULTY" + "td_ready_title2_desc" "" + "td_ready_title3" "WAITING" + "td_ready_title3_desc" "Waiting other players complete setup" + "donate" "DONATE" + "difficulty_text_1" "NORMAL" + "difficulty_text_2" "EXTRA" + "difficulty_text_3" "UNLIMITED" + "difficulty_text_4" "RANDOM" + "difficulty_text_5" "CHALLENGE" + "difficulty_text_6" "FUNNY" + "difficulty_text_7" "FUNNY RANK" + "td_select_start_card" "Choose initial card : " + "td_rank_list_100" "Top Rank" + "td_rank_list_100_desc" "TOP 100 RANK LIST" + "td_team_rank_list_100" "Top Rank In Team" + "td_team_rank_list_100_desc" "TOP 100 RANK LIST IN TEAM MODE" + "td_rank_list_100_tip" "The maximum wave number required on the list: at the end of the wave, the number of PAWN AMOUNT was not more than 10, and no boom were used. Difficulty 6 to 9 can be either on-single or on-multiplayer. The maximum number of injuries and card information will be recorded on the list. Click to open the rank." + "td_kick_vote" "KickPlayer" + "kick_player_1" "Kick out left-top player" + "kick_player_2" "Kick out right-top player" + "kick_player_3" "Kick out right-bottom player" + "kick_player_4" "Kick out left-bottom player" + "kick_player_unauth" "only the player in progress game can vote" + "kick_player_ask" "Are you agree?" + "yes" "Yes" + "no" "No" + "th_ai_choose" "Do you want AI to automatically release the following skills : " + "skill" "Skill" + "td_tutorial_video" "Tutorial" + "td_video_tip" "If you want to watch tutorial videos, you can press F9 to pause the game. It is best to pause the game when you are alone. Do not influence your teammates." + "td_strategy_0_left_title" "【Video】" + "td_strategy_0_main_title" "Comprehensive introduction of short films" + "td_strategy_0_sub_title" "6 minutes video how to play games" + "td_strategy_0_url" "http://static.yueyutech.com/bilibili/index.html?u=Ly9wbGF5ZXIuYmlsaWJpbGkuY29tL3BsYXllci5odG1sP2FpZD00ODQ5ODk0NyZjaWQ9Mzc5NzU3NzgmcGFnZT0x" + "td_strategy_0_image" "" + "td_strategy_0_title1" "Card List" + "td_strategy_0_text1" "Update..." + "td_strategy_0_title2" "Operation method" + "td_strategy_0_text2" "" + "td_strategy_0_title3" "Card Group" + "td_strategy_0_text3" "" + "td_strategy_0_title4" "Station position" + "td_strategy_0_text4" "" + "td_strategy_1_left_title" "【Artifice】" + "td_strategy_1_main_title" "No network single player game method" + "td_strategy_1_sub_title" "Introduction to how to conduct single game and permanent suspension without network or Dota2 maintenance." + "td_strategy_1_url" "" + "td_strategy_1_image" "" + "td_strategy_1_title1" "Turn on the Dota2 console" + "td_strategy_1_text1" "At the starter interface, click Settings , set the startup options in the lower right corner, and enter the -console .Or after entering the game, click on the options, click below to go to the advanced options, and check the Enabled Console below the first row on the left." + "td_strategy_1_title2" "Single player game method" + "td_strategy_1_text2" "This mode can be permanently suspended. After entering the game, press the \ key to open the console, copy and paste the following commands, basically zero traffic.
dota_launch_custom_game 1523213505 touhoutd" + "td_strategy_1_title3" "Disable Dota2 initiator update method" + "td_strategy_1_text3" "After opening the starter, click Download - Pause to stop updating, then press Win + R to open and run. After running the following command, enter the game prompt version and turn it off low (C: Game Dota2 is the installation path, there is a space in front of console).
C:\Game\Dota2\steamapps\common\dota 2 beta\game\bin\win64\dota2.exe –console" + "td_strategy_1_title4" "Common path" + "td_strategy_1_text4" "Screenshot : C:\Game\Dota2\steamapps\common\dota 2 beta\game\dota\screenshots

Custom map path : C:\Game\Dota2\steamapps\workshop\content\570\" + "td_strategy_2_left_title" "【Operation】" + "td_strategy_2_main_title" "Novice leisure operation method" + "td_strategy_2_sub_title" "Introduces several sets of operation methods with low operational requirements." + "td_strategy_2_url" "" + "td_strategy_2_image" "" + "td_strategy_2_title1" "" + "td_strategy_2_text1" "" + "td_strategy_2_title2" "" + "td_strategy_2_text2" "" + "td_strategy_2_title3" "" + "td_strategy_2_text3" "" + "td_strategy_2_title4" "" + "td_strategy_2_text4" "" + "td_strategy_3_left_title" "" + "td_strategy_3_main_title" "" + "td_strategy_3_sub_title" "" + "td_strategy_3_url" "" + "td_strategy_3_image" "" + "td_strategy_3_title1" "" + "td_strategy_3_text1" "" + "td_strategy_3_title2" "" + "td_strategy_3_text2" "" + "td_strategy_3_title3" "" + "td_strategy_3_text3" "" + "td_strategy_3_title4" "" + "td_strategy_3_text4" "" + "td_strategy_4_left_title" "" + "td_strategy_4_main_title" "" + "td_strategy_4_sub_title" "" + "td_strategy_4_url" "" + "td_strategy_4_image" "" + "td_strategy_4_title1" "" + "td_strategy_4_text1" "" + "td_strategy_4_title2" "" + "td_strategy_4_text2" "" + "td_strategy_4_title3" "" + "td_strategy_4_text3" "" + "td_strategy_4_title4" "" + "td_strategy_4_text4" "" + "td_strategy_5_left_title" "" + "td_strategy_5_main_title" "" + "td_strategy_5_sub_title" "" + "td_strategy_5_url" "" + "td_strategy_5_image" "" + "td_strategy_5_title1" "" + "td_strategy_5_text1" "" + "td_strategy_5_title2" "" + "td_strategy_5_text2" "" + "td_strategy_5_title3" "" + "td_strategy_5_text3" "" + "td_strategy_5_title4" "" + "td_strategy_5_text4" "" + "td_strategy_6_left_title" "" + "td_strategy_6_main_title" "" + "td_strategy_6_sub_title" "" + "td_strategy_6_url" "" + "td_strategy_6_image" "" + "td_strategy_6_title1" "" + "td_strategy_6_text1" "" + "td_strategy_6_title2" "" + "td_strategy_6_text2" "" + "td_strategy_6_title3" "" + "td_strategy_6_text3" "" + "td_strategy_6_title4" "" + "td_strategy_6_text4" "" + "td_strategy_7_left_title" "" + "td_strategy_7_main_title" "" + "td_strategy_7_sub_title" "" + "td_strategy_7_url" "" + "td_strategy_7_image" "" + "td_strategy_7_title1" "" + "td_strategy_7_text1" "" + "td_strategy_7_title2" "" + "td_strategy_7_text2" "" + "td_strategy_7_title3" "" + "td_strategy_7_text3" "" + "td_strategy_7_title4" "" + "td_strategy_7_text4" "" + "td_strategy_8_left_title" "" + "td_strategy_8_main_title" "" + "td_strategy_8_sub_title" "" + "td_strategy_8_url" "" + "td_strategy_8_image" "" + "td_strategy_8_title1" "" + "td_strategy_8_text1" "" + "td_strategy_8_title2" "" + "td_strategy_8_text2" "" + "td_strategy_8_title3" "" + "td_strategy_8_text3" "" + "td_strategy_8_title4" "" + "td_strategy_8_text4" "" + "td_strategy_9_left_title" "" + "td_strategy_9_main_title" "" + "td_strategy_9_sub_title" "" + "td_strategy_9_url" "" + "td_strategy_9_image" "" + "td_strategy_9_title1" "" + "td_strategy_9_text1" "" + "td_strategy_9_title2" "" + "td_strategy_9_text2" "" + "td_strategy_9_title3" "" + "td_strategy_9_text3" "" + "td_strategy_9_title4" "" + "td_strategy_9_text4" "" + "td_strategy_10_left_title" "" + "td_strategy_10_main_title" "" + "td_strategy_10_sub_title" "" + "td_strategy_10_url" "" + "td_strategy_10_image" "" + "td_strategy_10_title1" "" + "td_strategy_10_text1" "" + "td_strategy_10_title2" "" + "td_strategy_10_text2" "" + "td_strategy_10_title3" "" + "td_strategy_10_text3" "" + "td_strategy_10_title4" "" + "td_strategy_10_text4" "" + "td_strategy_11_left_title" "" + "td_strategy_11_main_title" "" + "td_strategy_11_sub_title" "" + "td_strategy_11_url" "" + "td_strategy_11_image" "" + "td_strategy_11_title1" "" + "td_strategy_11_text1" "" + "td_strategy_11_title2" "" + "td_strategy_11_text2" "" + "td_strategy_11_title3" "" + "td_strategy_11_text3" "" + "td_strategy_11_title4" "" + "td_strategy_11_text4" "" + "td_strategy_12_left_title" "" + "td_strategy_12_main_title" "" + "td_strategy_12_sub_title" "" + "td_strategy_12_url" "" + "td_strategy_12_image" "" + "td_strategy_12_title1" "" + "td_strategy_12_text1" "" + "td_strategy_12_title2" "" + "td_strategy_12_text2" "" + "td_strategy_12_title3" "" + "td_strategy_12_text3" "" + "td_strategy_12_title4" "" + "td_strategy_12_text4" "" + "td_strategy_13_left_title" "" + "td_strategy_13_main_title" "" + "td_strategy_13_sub_title" "" + "td_strategy_13_url" "" + "td_strategy_13_image" "" + "td_strategy_13_title1" "" + "td_strategy_13_text1" "" + "td_strategy_13_title2" "" + "td_strategy_13_text2" "" + "td_strategy_13_title3" "" + "td_strategy_13_text3" "" + "td_strategy_13_title4" "" + "td_strategy_13_text4" "" + "td_strategy_14_left_title" "" + "td_strategy_14_main_title" "" + "td_strategy_14_sub_title" "" + "td_strategy_14_url" "" + "td_strategy_14_image" "" + "td_strategy_14_title1" "" + "td_strategy_14_text1" "" + "td_strategy_14_title2" "" + "td_strategy_14_text2" "" + "td_strategy_14_title3" "" + "td_strategy_14_text3" "" + "td_strategy_14_title4" "" + "td_strategy_14_text4" "" + "td_strategy_15_left_title" "" + "td_strategy_15_main_title" "" + "td_strategy_15_sub_title" "" + "td_strategy_15_url" "" + "td_strategy_15_image" "" + "td_strategy_15_title1" "" + "td_strategy_15_text1" "" + "td_strategy_15_title2" "" + "td_strategy_15_text2" "" + "td_strategy_15_title3" "" + "td_strategy_15_text3" "" + "td_strategy_15_title4" "" + "td_strategy_15_text4" "" + "td_strategy_16_left_title" "" + "td_strategy_16_main_title" "" + "td_strategy_16_sub_title" "" + "td_strategy_16_url" "" + "td_strategy_16_image" "" + "td_strategy_16_title1" "" + "td_strategy_16_text1" "" + "td_strategy_16_title2" "" + "td_strategy_16_text2" "" + "td_strategy_16_title3" "" + "td_strategy_16_text3" "" + "td_strategy_16_title4" "" + "td_strategy_16_text4" "" + "td_strategy_17_left_title" "" + "td_strategy_17_main_title" "" + "td_strategy_17_sub_title" "" + "td_strategy_17_url" "" + "td_strategy_17_image" "" + "td_strategy_17_title1" "" + "td_strategy_17_text1" "" + "td_strategy_17_title2" "" + "td_strategy_17_text2" "" + "td_strategy_17_title3" "" + "td_strategy_17_text3" "" + "td_strategy_17_title4" "" + "td_strategy_17_text4" "" + "td_strategy_18_left_title" "" + "td_strategy_18_main_title" "" + "td_strategy_18_sub_title" "" + "td_strategy_18_url" "" + "td_strategy_18_image" "" + "td_strategy_18_title1" "" + "td_strategy_18_text1" "" + "td_strategy_18_title2" "" + "td_strategy_18_text2" "" + "td_strategy_18_title3" "" + "td_strategy_18_text3" "" + "td_strategy_18_title4" "" + "td_strategy_18_text4" "" + "td_strategy_19_left_title" "" + "td_strategy_19_main_title" "" + "td_strategy_19_sub_title" "" + "td_strategy_19_url" "" + "td_strategy_19_image" "" + "td_strategy_19_title1" "" + "td_strategy_19_text1" "" + "td_strategy_19_title2" "" + "td_strategy_19_text2" "" + "td_strategy_19_title3" "" + "td_strategy_19_text3" "" + "td_strategy_19_title4" "" + "td_strategy_19_text4" "" + "td_strategy_20_left_title" "" + "td_strategy_20_main_title" "" + "td_strategy_20_sub_title" "" + "td_strategy_20_url" "" + "td_strategy_20_image" "" + "td_strategy_20_title1" "" + "td_strategy_20_text1" "" + "td_strategy_20_title2" "" + "td_strategy_20_text2" "" + "td_strategy_20_title3" "" + "td_strategy_20_text3" "" + "td_strategy_20_title4" "" + "td_strategy_20_text4" "" +} diff --git a/panorama/localization/addon_schinese.txt b/panorama/localization/addon_schinese.txt new file mode 100755 index 0000000..1e4d495 --- /dev/null +++ b/panorama/localization/addon_schinese.txt @@ -0,0 +1,355 @@ +"addon" +{ + //"DOTA_InventoryMenu_Sell" "商店出售" + "DOTA_InventoryMenu_LockCombine" "锁定" + "DOTA_InventoryMenu_UnlockCombine" "解锁" + "DOTA_InventoryMenu_MoveToStash" "整理地面物品" + "pause_game_btn" "永久暂停" + "continue" "继续" + "place_item" "整理地面物品" + + "td_pawn_count" "怪物存活数:{d:count} / {d:max_count}" + "td_food_count" "{d:count} / {d:max_count}" + "td_food_count_text" "人口上限" + "td_creature_kill_count" "精华:{d:point};击杀数:{d:count}" + "td_creature_kill_count_text" "击杀数" + "td_tower_dps_title" "伤害统计" + "td_attacking_wave" "第{d:wave}波" + "td_type" "类型:" + "td_random_group" "随机卡组" + "td_gamepoint_desc" "符卡精华

通过每日宝箱任务、排行榜上榜或右上角赞助获得。

可以用于制作魔法钥匙(使用宠物技能),培养卡牌永久提升潜能。

激活潜能后属性和技能效果得到加强。" + "td_card_pool" "卡池" + "td_card_group" "卡组" + "td_load_tips" "本游戏只能在官方服务器运行,请不要本地主机运行,否则无法进入游戏

如果分配到国外服务器无法进入游戏,请自己创建房间选择国内服务器" + + "td_train_card_title" "提升潜能" + "td_train_card_cost" "×{d:amount}" + "td_train_card_question" "永久提升该卡牌潜能,每级需要消耗 符卡精华×{d:amount}

左键点击提升1级,右键点击提升50级

开始游戏后使用主角灵梦的觉醒技能可激活潜能,获得技能增强和属性提升

符卡精华可以通过每日宝箱、排行榜上榜或右上角赞助获得" + "td_refresh_desc" "刷新符卡精华等数据,赞助延迟生效时请点击" + "td_patron_desc" "赞助成为贡献者,获得符卡精华、宠物等级提升和特别奖励时间" + + "td_select_card" "选择卡牌" + "td_select_start_card" "选择初始卡" + "td_select_bonus_card_vip" "选择奖励卡牌" + "td_select_battle_bonus_card" "选择战利品奖励" + "td_card_pool_note" "注意" + "td_card_pool_note_desc" "在多人时准备时间为5分钟,在单人时准备时间为30分钟,请先在单人时配置好卡组。

每张SSR/SR/R卡最多只能放5张到卡组
每张N卡最多只能放10张到卡组
物品最多4张

非随机模式,同名卡上场有数量限制:
SSR相同卡2张,SR相同卡4张,R相同卡6张,N卡不限。

组卡操作方法:鼠标左键或右键点击。" + "td_clear_all" "清空卡组" + "td_clear_all_question" "你确定清空卡组?" + "td_rename_group" "重命名卡组" + "td_rename_group_text" "请输入卡组名称:" + + "td_ready_title1" "配置卡组" + "td_ready_title1_desc" "在多人时准备时间为5分钟,在单人时准备时间为30分钟,请记得保存卡组" + "td_ready_title2" "选择难度" + "td_ready_title2_desc" "相同人数选择则以较低难度为主" + "td_ready_title3" "等待" + "td_ready_title3_desc" "等待其他玩家完成配置" + + "donate" "赞助(成为贡献者)" + "sponsor_note" "注意:输入的金额必须是 {s:Amount},否则自动处理失败,剩余{s:LeftTime}" + "pay_complete" "已完成支付" + "pay_back_button" "返回({d:timeout})" + "pay_tip_mode1" "可以用来培养卡牌永久提升潜能和制作宝箱钥匙(使用宠物技能)" + "pay_tip_mode2" "永久提升宠物等级,可以增加宝箱钥匙数量,漏怪超标自动爆弹,增加宠物外貌和特效,获得额外战利品选择等。

并获得持续时间内的特别奖励,包括随时使用20个卡组位和娱乐模式,查看排行榜阵容明细,卡牌皮肤,新卡内测等。" + + "td_cosmetic" "玩具" + + "difficulty_text_1" "普通模式" + "difficulty_text_2" "EXTRA模式" + "difficulty_text_3" "无尽模式" + "difficulty_text_4" "随机模式" + "difficulty_text_5" "挑战模式" + "difficulty_text_6" "娱乐模式" + "difficulty_text_7" "原始榜娱乐" + + "td_rank_list_100" "原始榜" + "td_rank_list_100_desc" "原始排行榜" + "td_team_rank_list_100" "巅峰榜" + "td_team_rank_list_100_desc" "巅峰排行榜" + "td_rank_list_100_tip" "上榜要求:
最大有效波数超过排行榜最后一名(最低55波,任意模式)。相同阵容只取最高者上榜。相同阵容指输出第1名相同且伤害占比达到60%以上,或者合计伤害输出占比达到80%以上的卡相同。

原始榜仅单人且无任何加成,巅峰榜为普通组队、激活潜能、使用传说武器时的榜单。

点击打开排行榜。" + + "td_kick_vote" "投票踢人" + "kick_player_1" "将左上角玩家踢出游戏" + "kick_player_2" "将右上角玩家踢出游戏" + "kick_player_3" "将右下角玩家踢出游戏" + "kick_player_4" "将左下角玩家踢出游戏" + "kick_player_unauth" "只有还在游戏中的玩家才能发起投票" + "kick_player_ask" "是否同意?" + "yes" "是" + "no" "否" + "th_ai_choose" "是否让AI自动释放以下技能:
" + "skill" "技能" + + "td_tutorial_video" "攻略" + "td_video_tip" "如果你想看教学视频可以按F9暂停游戏,最好是一个人的时候暂停游戏,攻略投稿请进群76163954" + + "td_strategy_0_left_title" "【答疑】" + "td_strategy_0_main_title" "娱乐模式开放日、排行榜及交流群" + "td_strategy_0_sub_title" "对娱乐模式开放日、排行榜阵容明细等进行相关说明。" + "td_strategy_0_url" "" + "td_strategy_0_image" "" + "td_strategy_0_title1" "娱乐模式开放日" + "td_strategy_0_text1" "部分玩家反馈娱乐模式剥夺了运营的游戏乐趣,而如果能选娱乐而不选又觉得亏,故参考其它游戏的特别模式改为指定日期开放娱乐模式,称之为开放日。
选卡完成进入游戏后,可以在聊天栏输入:-date 显示每月开放日以及当前时间。" + "td_strategy_0_title2" "排行榜阵容明细" + "td_strategy_0_text2" "避免无门槛无脑抄阵容,阵容明细不全面开放,可以进群交流,大佬们会在群相册里公开自己的阵容明细和心得。" + "td_strategy_0_title3" "卡牌成长模式" + "td_strategy_0_text3" "可以使用符卡精华(每日宝箱和排行榜上榜奖励获取)在选卡界面培养卡牌永久提升潜能等级,然后进入游戏使得灵梦的觉醒技能激活潜能。打开宝箱有概率获取提升潜能等级的物品。

在无限潜力活动日开局可选满潜能,并附送3个500波跳关卷轴。

正常玩普通模式即可,排行榜上榜进原始榜,成长模式满足喜欢IMBA模式的玩家,潜能激活后进入巅峰排行榜。

应要求加入贡献者模式,自愿赞助,在选卡界面右上角,体现贡献反馈而设置了各奖励。" + "td_strategy_0_title4" "游戏群和永久暂停" + "td_strategy_0_text4" "一群:76163954,二群:789182175,三群:893289514。有关更新讨论、内部代码、宠物小灵 + 战利品等相关信息可在群里详细了解,以及交流开黑等。

创建房间输入密码开黑,可以永久暂停。本地图掉线或直接关闭游戏将自动永久暂停。小地图上方有永久暂停按钮。

截图路径:C:\Game\Dota2\steamapps\common\dota 2 beta\game\dota\screenshots
截图快捷键在设置里改,默认F6。

steam启动国服,在库Dota2右键属性,点设置启动选项,输入 -perfectworld " + + "td_strategy_1_left_title" "【机制】" + "td_strategy_1_main_title" "减速及伤害机制详解" + "td_strategy_1_sub_title" "本地图专用的机制" + "td_strategy_1_url" "" + "td_strategy_1_image" "" + "td_strategy_1_title1" "减速机制" + "td_strategy_1_text1" "和Dota2本身不同,本图绝大部分减速不叠加,速度下限为100。
装备4人形提供的减速效果能叠加。
以下减速效果不叠加,以先生效的为准。
琪露诺:霜符「冰袭方阵」
梅露兰:管灵「日野幻想」
古明地觉:回忆「恐怖的回忆」
八云蓝:式弹「最后的佛徒」
东风谷早苗:大奇迹「八坂之神风」
村纱水蜜:港符「幽灵船之泊」
宫古芳香:毒爪「不死杀人鬼」
梅蒂欣:毒符「猛毒气息」
斯塔:流星「小型彗星」
萃香:鬼符「大江山悉皆杀」
键山雏:创符「痛苦之流」
神绮大魔王:震荡波" + "td_strategy_1_title2" "伤害机制" + "td_strategy_1_text2" "首先计算基础伤害,包括普通攻击,技能伤害,秒杀伤害,然后计算税后伤害。
召唤物继承主人的装备和buff效果
内圈(第一个方形圈内)只承受自己的卡牌伤害,队友卡牌输出无效,外圈无此限制。" + "td_strategy_1_title3" "计算基础伤害" + "td_strategy_1_text3" "1.普通攻击伤害为攻击力。
2.技能伤害按技能描述计算。
3.秒杀伤害为攻击者的星级*能量*100。" + "td_strategy_1_title4" "计算税后伤害" + "td_strategy_1_text4" "1.进行伤害类型转换,同时存在多个转换buff则优先级高的生效。优先级为:纯狐纯粹的狂气 > 大妖精连接 > 犬走椛守护之盾 > 桑尼圈。
2.计算附加星能伤害(如相机四件套、BOSS键山雏)。
3.针对物理/魔法伤害则计算物理/魔法抗性减免,将伤害 * (1 - 抗性[小数化])。
4.计算血量满足条件时装备4件套割夺真实之刃和死神大镰刀效果。
5.计算暴击,如果按暴击概率Roll成功,则将伤害 *(1 + 暴击伤害/100)。
6.计算攻击者增伤,按类型对应,将伤害 *(1 + buff层数/100)。
7.计算被攻击目标的伤害加深debuff,按类型对应,将伤害 *(1 + debuff层数/100)。
8.计算被攻击目标的伤害抵挡或附加(负值)效果,按类型对应,将伤害 - 抵挡值。
9.计算少女之抵抗的伤害吸收效果(吸收部分不对目标造成伤害)。
10.所有计算完成,计入伤害统计(含最后的吸收伤害)。" + + "td_strategy_2_left_title" "【视频】" + "td_strategy_2_main_title" "新手必看,最全整理合集" + "td_strategy_2_sub_title" "P1:游戏下载及双白太太运营(视频中是n1 1500开局,ex及之后4500开局只会更容易)" + //http://player.bilibili.com/player.html?aid=48498947&cid=37975778&page=1 + "td_strategy_2_url" "http://static.yueyutech.com/bilibili/index.html?u=Ly9wbGF5ZXIuYmlsaWJpbGkuY29tL3BsYXllci5odG1sP2FpZD00ODQ5ODk0NyZjaWQ9Mzc5NzU3NzgmcGFnZT0x" + "td_strategy_2_image" "" + "td_strategy_2_title1" "阵容构成" + "td_strategy_2_text1" "更新中..." + "td_strategy_2_title2" "运营方法" + "td_strategy_2_text2" "" + "td_strategy_2_title3" "卡组清单" + "td_strategy_2_text3" "" + "td_strategy_2_title4" "站位图" + "td_strategy_2_text4" "" + + "td_strategy_3_left_title" "【视频】" + "td_strategy_3_main_title" "新手必看,最全整理合集" + "td_strategy_3_sub_title" "P2:秋静叶开局运营(相对双白要轻松许多,没有什么严格要求,懒人必备)" + "td_strategy_3_url" "http://static.yueyutech.com/bilibili/index.html?u=Ly9wbGF5ZXIuYmlsaWJpbGkuY29tL3BsYXllci5odG1sP2FpZD00ODQ5ODk0NyZjaWQ9Mzc5NzU3NzgmcGFnZT0y" + "td_strategy_3_image" "" + "td_strategy_3_title1" "阵容构成" + "td_strategy_3_text1" "更新中..." + "td_strategy_3_title2" "运营方法" + "td_strategy_3_text2" "" + "td_strategy_3_title3" "卡组清单" + "td_strategy_3_text3" "" + "td_strategy_3_title4" "站位图" + "td_strategy_3_text4" "" + + "td_strategy_4_left_title" "【视频】" + "td_strategy_4_main_title" "新手必看,最全整理合集" + "td_strategy_4_sub_title" "P3:卡组搭配(简单来说就是多看,多想,每个卡都有什么作用)" + "td_strategy_4_url" "http://static.yueyutech.com/bilibili/index.html?u=Ly9wbGF5ZXIuYmlsaWJpbGkuY29tL3BsYXllci5odG1sP2FpZD00ODQ5ODk0NyZjaWQ9Mzc5NzU3NzgmcGFnZT0z" + "td_strategy_4_image" "" + "td_strategy_4_title1" "阵容构成" + "td_strategy_4_text1" "更新中..." + "td_strategy_4_title2" "运营方法" + "td_strategy_4_text2" "" + "td_strategy_4_title3" "卡组清单" + "td_strategy_4_text3" "" + "td_strategy_4_title4" "站位图" + "td_strategy_4_text4" "" + + "td_strategy_5_left_title" "【视频】" + "td_strategy_5_main_title" "新手必看,最全整理合集" + "td_strategy_5_sub_title" "P4:娱乐模式运营-摆位(希望每个人都有自己的思路,不要一味模仿)" + "td_strategy_5_url" "http://static.yueyutech.com/bilibili/index.html?u=Ly9wbGF5ZXIuYmlsaWJpbGkuY29tL3BsYXllci5odG1sP2FpZD00ODQ5ODk0NyZjaWQ9Mzc5NzU3NzgmcGFnZT00" + "td_strategy_5_image" "" + "td_strategy_5_title1" "阵容构成" + "td_strategy_5_text1" "更新中..." + "td_strategy_5_title2" "运营方法" + "td_strategy_5_text2" "" + "td_strategy_5_title3" "卡组清单" + "td_strategy_5_text3" "" + "td_strategy_5_title4" "站位图" + "td_strategy_5_text4" "" + + "td_strategy_6_left_title" "【运营】" + "td_strategy_6_main_title" "新手休闲运营方法" + "td_strategy_6_sub_title" "介绍几套对操作要求低的运营方法" + "td_strategy_6_url" "" + "td_strategy_6_image" "" + "td_strategy_6_title1" "秋二鼠大妖精" + "td_strategy_6_text1" "卡组建议1大妖精5静叶4币3露娜2伞2觉(或其他减速)。

守家20 30 40波后分别是3星露娜3星小伞,4星满培露娜3星小伞,5星露娜4星满培小伞(或双4星露娜带装备,或4星露娜5星帕秋莉)。

开局秋瓤子,开抽两秋静叶并满培,11波前只留露娜和老鼠,其他全卖。场上妖精最小化保证守家要求即可,抽卖卖抽。11波后拔下三星瓤子换鼠(如有),减速如觉上场。 双秋满培后,R卡不买,开始抽干卡池,一二星狗粮升级只买药。25到30波第一秋一收给老鼠,28到33波第二秋一收给另一个老鼠再升个三星和二星变二星狗粮,秋二鼠成型。

2500开抽继续抽干卡池,秋二收后换大妖精上场,秒升级到4星,此时场上只有3收益卡 露娜小伞 减速,6个妖精位,根据阵容需要算好妖精数量如21个,17个(零头妖精要和无尽后不需要的4星卡刚好成4个),剩余妖精养到3星,此后不再上妖精,上阵容卡升级。

保底五星算法:露娜大妖精双鼠4个五星,21个狗粮5个,多出1个妖精加小伞,秋换后的两个阵容4星卡,刚好10个五星。" + "td_strategy_6_title2" "秋二鼠懒人运营" + "td_strategy_6_text2" "第一秋二收后不下,直接三收即可,场上一秋二鼠到底,保底7五星。" + "td_strategy_6_title3" "神虎娘主流运营" + "td_strategy_6_text3" "开局白或秋,速度升级五星给青娥,然后五星神绮,五星寅丸星,可以做到12五星左右。注意神绮关AI收大魔王,寅丸星稍靠后打钱,让怪先吃到青娥光环。" + "td_strategy_6_title4" "秒升级技巧" + "td_strategy_6_text4" "各星级秒升级由1到10级的方法:一星用1个一星药,二星用妖精和一星药各1个或1个二星药,三星用妖精一星药二星药各一个,4星5星用博丽护身符。" + + "td_strategy_7_left_title" "【阵容】" + "td_strategy_7_main_title" "三月精队" + "td_strategy_7_sub_title" "最低5个五星的挂机流过Extra的阵容" + "td_strategy_7_url" "" + "td_strategy_7_image" "" + "td_strategy_7_title1" "阵容构成" + "td_strategy_7_text1" "5星:满培露娜,满培觉,满培斯塔,红美铃,桑尼。

可选5星:觉醒露米娅,满培火焰猫,满培八云紫。

其他:4星十六夜,3星梅蒂欣2个,1星满培慧音。

如果5星不足,可觉醒露米娅后用秋瓤子把她五星再换到别人。

装备:露娜4神枪2船勾或玉,斯塔4相机2玉,觉4桨2勾,一梅蒂欣4核棒,露米娅4狗牙。" + "td_strategy_7_title2" "运营方法" + "td_strategy_7_text2" "随意。" + "td_strategy_7_title3" "卡组清单" + "td_strategy_7_text3" "SSR卡:2八云紫,4神枪,4相机。

SR卡:2上白泽慧音,2火焰猫,十六夜,4船勾,4核棒,4狗牙,4炸弹,博丽护身符,4其它如晕刀。

R卡:5秋静叶,3纳兹林,3露娜,2斯塔,桑尼,2古明地觉,2梅蒂欣,红美铃,露米娅,4玉,4月耀,4人形,4御币,4船浆。" + "td_strategy_7_title4" "" + "td_strategy_7_text4" "" + + "td_strategy_8_left_title" "【阵容】" + "td_strategy_8_main_title" "魔理沙队" + "td_strategy_8_sub_title" "最低6个五星的挂机流过Extra的阵容" + "td_strategy_8_url" "" + "td_strategy_8_image" "" + "td_strategy_8_title1" "阵容构成" + "td_strategy_8_text1" "五星:满培魔理沙,随缘培大妖精,两个满培帕秋莉,满培小恶魔,满培蕾蒂。

可选五星:满培琪露诺,随缘培八云紫。

其他:三星灵梦,2个三星梅蒂欣,一星玲仙。

湖葬帕秋莉放琪露诺旁(必须把湖葬帕秋莉放最前面),带4核棒。魔理沙4相机2玉。" + "td_strategy_8_title2" "运营方法" + "td_strategy_8_text2" "随意。" + "td_strategy_8_title3" "卡组清单" + "td_strategy_8_text3" "SSR卡:2个大妖精,2个八云紫,神琦,灵梦,4个相机。

SR卡: 3个帕秋莉,2个魔理沙,玲仙,4船勾,4核棒,4炸弹,博丽护身符。

R卡:5秋静叶,4御币,3老鼠,4露娜,2琪露诺,2小恶魔,2雷帝,2梅蒂欣,4玉,4月耀,4人形,4船桨。" + "td_strategy_8_title4" "" + "td_strategy_8_text4" "" + + "td_strategy_9_left_title" "【阵容】" + "td_strategy_9_main_title" "幽幽子队" + "td_strategy_9_sub_title" "最低5个五星的挂机流过Extra的阵容" + "td_strategy_9_url" "" + "td_strategy_9_image" "" + "td_strategy_9_title1" "阵容构成" + "td_strategy_9_text1" "五星:4个满培幽幽子,红美铃。

可选五星:八云蓝,满培八云紫。

其他:一星挂件妖梦和橙,三星梅蒂欣,一星玲仙或4星十六夜,一星满培慧音切白泽关ai。

装备:4相机、4玉、4月弩、4晕刀全部拆成两件套给幽幽子,4核棒给八云蓝。" + "td_strategy_9_title2" "运营方法" + "td_strategy_9_text2" "随意。前期减速琪露诺带4人形,后换4星八云蓝带核棒。" + "td_strategy_9_title3" "卡组清单" + "td_strategy_9_text3" "SSR卡:2八云紫,大妖精,御币,4相机。

SR卡:2慧音,5幽幽子,八云蓝,魂魄妖梦,玲仙或十六夜,博丽护身符,4核棒,4晕刀,3炸弹。

R卡:5秋静叶,4纳兹林,红美铃,橙,梅蒂欣,5露娜,2小伞,琪露诺, 4御币,4玉,4月弩,4月耀,4人形。" + "td_strategy_9_title4" "" + "td_strategy_9_text4" "" + + "td_strategy_10_left_title" "【阵容】" + "td_strategy_10_main_title" "传统神灵庙队" + "td_strategy_10_sub_title" "最低5个五星的轻松过Extra的阵容" + "td_strategy_10_url" "" + "td_strategy_10_image" "" + "td_strategy_10_title1" "阵容构成" + "td_strategy_10_text1" "五星:满培神子,满培青娥,满培减抗三人组帕秋莉小恶魔雷帝。

可选五星:2个满培苏我,2个满培僵尸。

其他:四星满培琪露诺,另一个四星苏我,一星布都。

装备:神子4相机2玉,青娥4船桨2船勾,帕秋莉4核棒,一个僵尸4狗牙,一个僵尸青娥技能。" + "td_strategy_10_title2" "运营方法" + "td_strategy_10_text2" "秋二鼠大妖精。" + "td_strategy_10_title3" "卡组清单" + "td_strategy_10_text3" "SSR卡:2神子,大妖精,御币,4机机,2八卦。

SR卡:2霍青娥,2帕秋莉,3苏我,物理布都,4狗牙,4核棒,3炸弹,2船勾,博丽护身符。

R卡:3 纳兹林,2雷蒂,2琪露诺,3露娜,2小恶魔,5秋静叶,3宫古芳香,4玉,4船浆,4月耀,4人形,4御币。" + "td_strategy_10_title4" "站位图" + "td_strategy_10_text4" "只有高波文文会漏,要备炸弹。" + + "td_strategy_11_left_title" "【阵容】" + "td_strategy_11_main_title" "纯粹神灵庙队" + "td_strategy_11_sub_title" "7个五星的挂机流过Extra的阵容" + "td_strategy_11_url" "" + "td_strategy_11_image" "" + "td_strategy_11_title1" "阵容构成" + "td_strategy_11_text1" "五星:满培神子,满培青娥,桑尼,辉夜(不卡科技),满培觉,满培紫,红美铃。

其它:2个四星宫古芳香,2个三星梅蒂欣,一星满培上白泽慧音。

装备:神子4相机2玉,青娥4船桨2船勾,桑尼4核棒,一个僵尸4狗牙,一个僵尸青娥技能。" + "td_strategy_11_title2" "运营方法" + "td_strategy_11_text2" "随意。" + "td_strategy_11_title3" "卡组清单" + "td_strategy_11_text3" "SSR卡:2神子,2八云紫,神绮,御币或大妖精,4相机。

SR卡:2霍青娥,2上白泽慧音,辉夜,4狗牙,4核棒,4炸弹,4船勾,博丽护身符。

R卡:3 纳兹林,桑尼,2古明地觉,2梅蒂欣,红美铃,3露娜,3宫古芳香,5秋静叶,4玉,4船浆,4月耀,4人形,4御币。" + "td_strategy_11_title4" "" + "td_strategy_11_text4" "" + + "td_strategy_12_left_title" "【阵容】" + "td_strategy_12_main_title" "物理妹红或布都队" + "td_strategy_12_sub_title" "最低8个五星的挂机流过Extra的阵容" + "td_strategy_12_url" "" + "td_strategy_12_image" "" + "td_strategy_12_title1" "阵容构成" + "td_strategy_12_text1" "妹红只要攻击力和攻速,能量不需要,因为培养加攻速,可以不用再加,需要恋恋的加1000能量技能还加攻击,妹红不吃十六夜的刷新。

布都比妹红伤害要高且稳定,两阵容一样。

五星:满培腾原妹红,满培小伞关ai,满培帕秋莉,米斯蒂亚,犬走桦,上白泽慧音,满培古明地觉,古明地恋,辉夜。

可选五星:满培八云紫(最好五星,帕秋莉也可以四星)。

其他:2个三量梅蒂欣。

用布都时,将妹红、慧音换成布都、青娥(给攻速buff即可),布都伤害高,攻击力不需要拉满,要攻速。

装备:妹红4太阳伞2月兔晕刀,觉4船浆2莱瓦丁,八云紫4月耀,一个梅蒂欣4核棒,其它随意。" + "td_strategy_12_title2" "运营方法" + "td_strategy_12_text2" "秋二鼠大妖精。" + "td_strategy_12_title3" "卡组清单" + "td_strategy_12_text3" "SSR卡:2古明地恋,大妖精,3八云紫,2御币,2莱瓦丁。(抽干即满培紫)

SR卡:辉夜,上白泽慧音,2帕秋莉,玲仙,2妹红,4核棒,4炸弹,2月兔,博丽护身符。

R卡:3 纳兹林,2梅蒂欣,犬走桦,4露娜,米斯蒂娅,2多多良小伞,5秋静叶,2古明地觉,4船浆,4月耀,4人形,4御币,4太阳伞。" + "td_strategy_12_title4" "" + "td_strategy_12_text4" "" + + "td_strategy_13_left_title" "【阵容】" + "td_strategy_13_main_title" "纯狐妹红或布都队" + "td_strategy_13_sub_title" "最低6个五星的挂机流过Extra的阵容" + "td_strategy_13_url" "" + "td_strategy_13_image" "" + "td_strategy_13_title1" "阵容构成" + "td_strategy_13_text1" "纯狐一技能buff之后,直接按技能伤害造成纯粹伤害。

五星:满培腾原妹红或物部布都,米斯蒂亚,上白泽慧音,古明地恋,霍青娥,满培八云紫,满培古明地觉(可选)。

其他:2个三量梅蒂欣,一星2培八云紫,一星满培上白泽慧音,纯狐。

装备:妹红/布都4太阳伞2月兔,五星八云紫4月耀,一星慧音4狗牙切白泽关AI,一个梅蒂欣4核棒,觉4人形。

所有buff给妹红/布都,恋恋的能量,纯狐一技能,五星慧音人形态1技能(开AI),霍青娥的攻速。辉夜给刷个攻击力和攻速buff。" + "td_strategy_13_title2" "运营方法" + "td_strategy_13_text2" "秋二鼠转霍青娥。" + "td_strategy_13_title3" "卡组清单" + "td_strategy_13_text3" "SSR卡:纯狐,古明地恋,4八云紫,4御币。(抽干即满培和二培就够了)

SR卡:2妹红或物部布都,霍青娥,2辉夜,2上白泽慧音,4核棒,4狗牙,4炸弹,2月兔,博丽护身符。

R卡:5 纳兹林,2梅蒂欣,5露娜,米斯蒂娅,多多良小伞,5秋静叶,5古明地觉,4月耀,4人形,4御币,4太阳伞。" + "td_strategy_13_title4" "" + "td_strategy_13_text4" "" + + "td_strategy_14_left_title" "【阵容】" + "td_strategy_14_main_title" "风见花香队" + "td_strategy_14_sub_title" "最低6个五星的挂机流过Extra的阵容" + "td_strategy_14_url" "" + "td_strategy_14_image" "" + "td_strategy_14_title1" "阵容构成" + "td_strategy_14_text1" "五星:满培风见花香,满培火焰猫磷,桑尼,红美铃,满培古明地觉,古明地恋。

可选五星:满培八云紫,觉醒露米娅(五星觉醒后和四星换)。

其他:四星十六夜,四星路空,三量梅蒂欣,一星满培上白泽慧音。

十六夜刷新路空,慧音切白泽关AI,风见花香幻像放对面觉旁边。

古明地恋换成三星梅蒂欣可加强对文文控制,但60波后辉夜会挤爆GG。

装备:风见花香4相机2玉,觉4人形2船勾,八云紫4月耀,一个梅蒂欣4核棒,火焰猫磷4船浆2船勾,露米娅2狗牙。" + "td_strategy_14_title2" "运营方法" + "td_strategy_14_text2" "随意。" + "td_strategy_14_title3" "卡组清单" + "td_strategy_14_text3" "SSR卡:2风见花香,2八云紫,神琦,古明地恋,4相机。

SR卡:辉夜,2上白泽慧音,2火焰猫磷,路空,十六夜,4核棒,2狗牙,4船勾,4炸弹,博丽护身符。

R卡:3 纳兹林,2梅蒂欣,4露娜,多多良小伞,5秋静叶,2古明地觉,桑尼,红美铃,露米娅,4玉,4船浆,4月耀,4人形,4御币。" + "td_strategy_14_title4" "" + "td_strategy_14_text4" "" + + "td_strategy_15_left_title" "【阵容】" + "td_strategy_15_main_title" "二小组队" + "td_strategy_15_sub_title" "最低8个五星的轻松过Extra的阵容" + "td_strategy_15_url" "" + "td_strategy_15_image" "" + "td_strategy_15_title1" "阵容构成" + "td_strategy_15_text1" "五星:满培二小组(芙兰朵露),满培妹红,满培古明地觉,古明地恋,满培小伞,犬走桦,米斯蒂娅,满培帕秋莉,满培八云紫(可选)。

其他:四星十六夜,2个三量梅蒂欣。

十六夜刷新二小姐,恋恋给buff妹红。

装备:二小组4镰刀2莱瓦汀,妹红4太阳伞2月兔,觉4船浆,恋4人形,紫4月耀,一梅蒂欣4核棒。辉夜刷个加伤buff。" + "td_strategy_15_title2" "运营方法" + "td_strategy_15_text2" "秋二鼠大妖精。" + "td_strategy_15_title3" "卡组清单" + "td_strategy_15_text3" "SSR卡:2芙兰朵露,2八云紫,大妖精,古明地恋,2莱瓦汀,2博丽御币。

SR卡:辉夜,2帕秋莉,2腾原妹红,十六夜,风祝御币,4核棒,4镰刀,2月兔,4炸弹,博丽护身符。

R卡:3 纳兹林,2梅蒂欣,4露娜,犬走桦,米斯蒂娅,2多多良小伞,5秋静叶,2古明地觉,4太阳伞,4船浆,4月耀,4人形,4御币。" + "td_strategy_15_title4" "站位图" + "td_strategy_15_text4" "不能完全挂机,怕60波后辉夜(必炸、上白泽慧音(起手电一个)、文文(炸或电)。" + + "td_strategy_16_left_title" "【阵容】" + "td_strategy_16_main_title" "大小姐队" + "td_strategy_16_sub_title" "最低7个五星的挂机流过Extra的阵容" + "td_strategy_16_url" "" + "td_strategy_16_image" "" + "td_strategy_16_title1" "阵容构成" + "td_strategy_16_text1" "五星:满培大小姐(蕾米莉亚),大妖精(连大小姐),满培帕秋莉切水银,满培帕秋莉切湖葬,满培小恶魔,满培雷蒂,满培八云紫。

其他:四星十六夜刷新大小姐,四星觉醒露米娅(五星觉醒用秋换成四星),2个三量梅蒂欣,四星满培琪露诺。

装备:大小组4相机2玉,湖葬帕秋莉4核棒2玉,露米娅4狗牙,紫4月耀,琪露诺4人形。" + "td_strategy_16_title2" "运营方法" + "td_strategy_16_text2" "秋二鼠大妖精。" + "td_strategy_16_title3" "卡组清单" + "td_strategy_16_text3" "SSR卡:2蕾米莉亚,2八云紫,大妖精,神琦,4相机。

SR卡:辉夜,3帕秋莉,十六夜,4核棒,4狗牙,4炸弹,博丽护身符。

R卡:3 纳兹林,2梅蒂欣,3露娜,2蕾蒂,2小恶魔,2琪露诺,5秋静叶,露米娅,4玉,4船浆,4月耀,4人形,4御币。" + "td_strategy_16_title4" "站位图" + "td_strategy_16_text4" "60波后文文没事,辉夜打了几把没事,保险的话炸一下。" + + "td_strategy_17_left_title" "【阵容】" + "td_strategy_17_main_title" "帕秋莉队" + "td_strategy_17_sub_title" "7个五星的挂机流过Extra的阵容" + "td_strategy_17_url" "" + "td_strategy_17_image" "" + "td_strategy_17_title1" "阵容构成" + "td_strategy_17_text1" "五星:3个满培帕秋莉,大妖精,满培小恶魔,满培雷蒂,满培八云紫。

其他:2个三量梅蒂欣,四星满培琪露诺,一星满培上白泽慧音,四星觉醒露米娅(五星觉醒用秋换成四星)。

装备:能量最高的湖葬帕秋莉4相机2玉且大妖精连,次之湖葬帕秋莉4核棒2玉,水银帕秋莉2八卦,小恶魔4船浆2船沟,紫4月耀,琪露诺4人形。

辉夜给输出刷个加伤buff,给露米娅和上白泽慧音攻速buff。" + "td_strategy_17_title2" "运营方法" + "td_strategy_17_text2" "秋二鼠大妖精。" + "td_strategy_17_title3" "卡组清单" + "td_strategy_17_text3" "SSR卡:2八云紫,大妖精,神琦,4相机,2八卦。

SR卡:辉夜,4帕秋莉,2上白泽慧音,4核棒,2船勾,4炸弹,博丽护身符。

R卡:3 纳兹林,2梅蒂欣,3露娜,2蕾蒂,2小恶魔,2琪露诺,5秋静叶,露米娅,4玉,4船浆,4月耀,4人形,4御币。" + "td_strategy_17_title4" "站位图" + "td_strategy_17_text4" "70波文文不漏,高波辉夜交炸防脸黑。" + + "td_strategy_18_left_title" "【阵容】" + "td_strategy_18_main_title" "辉夜队" + "td_strategy_18_sub_title" "7个五星的挂机流过Extra的阵容" + "td_strategy_18_url" "" + "td_strategy_18_image" "" + "td_strategy_18_title1" "阵容构成" + "td_strategy_18_text1" "五星:2个满培辉夜,桑尼,古明地恋,满培古明地觉,满培八云紫,满培火焰猫磷。

其他:2个三星梅蒂欣,一星满培上白泽慧音,一星八云紫,一星满培帕秋莉。

装备:主辉夜4相机2玉,火焰猫磷2船勾2神枪,觉4船浆2船勾,月耀和人形给两个紫,最前面的梅蒂欣4核棒。

将辉夜摆好位置后,再刷辉夜科技,给辉夜和古明地觉、火焰猫磷刷个加伤buff。恋恋给辉夜加能量buff。帕秋莉切湖葬。另外两个紫只需一个5星,多个会火车会重合放。" + "td_strategy_18_title2" "运营方法" + "td_strategy_18_text2" "随意。" + "td_strategy_18_title3" "卡组清单" + "td_strategy_18_text3" "SSR卡:2八云紫,神琦,古明地恋,4相机,2神枪。

SR卡:3辉夜,2上白泽慧音,2火焰猫磷,2帕秋莉,4核棒,4船勾,4炸弹,博丽护身符。

R卡:5 纳兹林,2梅蒂欣,桑尼,5露娜,2古明地觉,5秋静叶,4玉,4船浆,4月耀,4人形,4御币。" + "td_strategy_18_title4" "站位图" + "td_strategy_18_text4" "全程挂机。" + +} \ No newline at end of file diff --git a/panorama/scripts/custom_game/custom_loading_screen.vjs_c b/panorama/scripts/custom_game/custom_loading_screen.vjs_c new file mode 100755 index 0000000..bbece37 Binary files /dev/null and b/panorama/scripts/custom_game/custom_loading_screen.vjs_c differ diff --git a/panorama/scripts/custom_game/display_error.vjs_c b/panorama/scripts/custom_game/display_error.vjs_c new file mode 100755 index 0000000..6424742 Binary files /dev/null and b/panorama/scripts/custom_game/display_error.vjs_c differ diff --git a/panorama/scripts/custom_game/dps_panel.vjs_c b/panorama/scripts/custom_game/dps_panel.vjs_c new file mode 100755 index 0000000..850b7e5 Binary files /dev/null and b/panorama/scripts/custom_game/dps_panel.vjs_c differ diff --git a/panorama/scripts/custom_game/end_screen.vjs_c b/panorama/scripts/custom_game/end_screen.vjs_c new file mode 100755 index 0000000..6658fbb Binary files /dev/null and b/panorama/scripts/custom_game/end_screen.vjs_c differ diff --git a/panorama/scripts/custom_game/info.vjs_c b/panorama/scripts/custom_game/info.vjs_c new file mode 100755 index 0000000..32c51cc Binary files /dev/null and b/panorama/scripts/custom_game/info.vjs_c differ diff --git a/panorama/scripts/custom_game/power.vjs_c b/panorama/scripts/custom_game/power.vjs_c new file mode 100755 index 0000000..d07be24 Binary files /dev/null and b/panorama/scripts/custom_game/power.vjs_c differ diff --git a/panorama/scripts/custom_game/shop.vjs_c b/panorama/scripts/custom_game/shop.vjs_c new file mode 100755 index 0000000..5fe5078 Binary files /dev/null and b/panorama/scripts/custom_game/shop.vjs_c differ diff --git a/panorama/scripts/custom_game/team_select.vjs_c b/panorama/scripts/custom_game/team_select.vjs_c new file mode 100755 index 0000000..4128df5 Binary files /dev/null and b/panorama/scripts/custom_game/team_select.vjs_c differ diff --git a/panorama/scripts/custom_game/team_select_card.vjs_c b/panorama/scripts/custom_game/team_select_card.vjs_c new file mode 100755 index 0000000..55124c0 Binary files /dev/null and b/panorama/scripts/custom_game/team_select_card.vjs_c differ diff --git a/panorama/scripts/custom_game/util.vjs_c b/panorama/scripts/custom_game/util.vjs_c new file mode 100755 index 0000000..007060f Binary files /dev/null and b/panorama/scripts/custom_game/util.vjs_c differ diff --git a/panorama/styles/custom_game/custom_loading_screen.vcss_c b/panorama/styles/custom_game/custom_loading_screen.vcss_c new file mode 100755 index 0000000..2366f09 Binary files /dev/null and b/panorama/styles/custom_game/custom_loading_screen.vcss_c differ diff --git a/panorama/styles/custom_game/dps_panel.vcss_c b/panorama/styles/custom_game/dps_panel.vcss_c new file mode 100755 index 0000000..7c7ea20 Binary files /dev/null and b/panorama/styles/custom_game/dps_panel.vcss_c differ diff --git a/panorama/styles/custom_game/end_screen.vcss_c b/panorama/styles/custom_game/end_screen.vcss_c new file mode 100755 index 0000000..d22aa9f Binary files /dev/null and b/panorama/styles/custom_game/end_screen.vcss_c differ diff --git a/panorama/styles/custom_game/info.vcss_c b/panorama/styles/custom_game/info.vcss_c new file mode 100755 index 0000000..634d79c Binary files /dev/null and b/panorama/styles/custom_game/info.vcss_c differ diff --git a/panorama/styles/custom_game/movie.vcss_c b/panorama/styles/custom_game/movie.vcss_c new file mode 100755 index 0000000..51173a1 Binary files /dev/null and b/panorama/styles/custom_game/movie.vcss_c differ diff --git a/panorama/styles/custom_game/shop.vcss_c b/panorama/styles/custom_game/shop.vcss_c new file mode 100755 index 0000000..e21eeb3 Binary files /dev/null and b/panorama/styles/custom_game/shop.vcss_c differ diff --git a/panorama/styles/custom_game/team_select.vcss_c b/panorama/styles/custom_game/team_select.vcss_c new file mode 100755 index 0000000..c1ec3aa Binary files /dev/null and b/panorama/styles/custom_game/team_select.vcss_c differ diff --git a/panorama/videos/heroes/npc_dota_hero_juggernaut.webm b/panorama/videos/heroes/npc_dota_hero_juggernaut.webm new file mode 100755 index 0000000..d8161d8 Binary files /dev/null and b/panorama/videos/heroes/npc_dota_hero_juggernaut.webm differ diff --git a/panorama/videos/heroes/npc_dota_hero_lina.webm b/panorama/videos/heroes/npc_dota_hero_lina.webm new file mode 100755 index 0000000..d8161d8 Binary files /dev/null and b/panorama/videos/heroes/npc_dota_hero_lina.webm differ diff --git a/particles/base_attacks/fountain_attack_attack_glow.vpcf_c b/particles/base_attacks/fountain_attack_attack_glow.vpcf_c new file mode 100755 index 0000000..d67f980 Binary files /dev/null and b/particles/base_attacks/fountain_attack_attack_glow.vpcf_c differ diff --git a/particles/base_attacks/ranged_siege_good_highlight.vpcf_c b/particles/base_attacks/ranged_siege_good_highlight.vpcf_c new file mode 100755 index 0000000..f6fe229 Binary files /dev/null and b/particles/base_attacks/ranged_siege_good_highlight.vpcf_c differ diff --git a/particles/base_attacks/ranged_siege_good_trail.vpcf_c b/particles/base_attacks/ranged_siege_good_trail.vpcf_c new file mode 100755 index 0000000..94c8bb7 Binary files /dev/null and b/particles/base_attacks/ranged_siege_good_trail.vpcf_c differ diff --git a/particles/base_attacks/ranged_tower_good_launch.vpcf_c b/particles/base_attacks/ranged_tower_good_launch.vpcf_c new file mode 100755 index 0000000..39f5086 Binary files /dev/null and b/particles/base_attacks/ranged_tower_good_launch.vpcf_c differ diff --git a/particles/basic_ambient/basic_ambient.vpcf_c b/particles/basic_ambient/basic_ambient.vpcf_c new file mode 100755 index 0000000..eb31a44 Binary files /dev/null and b/particles/basic_ambient/basic_ambient.vpcf_c differ diff --git a/particles/basic_explosion/basic_explosion.vpcf_c b/particles/basic_explosion/basic_explosion.vpcf_c new file mode 100755 index 0000000..1bdcb66 Binary files /dev/null and b/particles/basic_explosion/basic_explosion.vpcf_c differ diff --git a/particles/basic_explosion/basic_explosion_bits.vpcf_c b/particles/basic_explosion/basic_explosion_bits.vpcf_c new file mode 100755 index 0000000..c8319d6 Binary files /dev/null and b/particles/basic_explosion/basic_explosion_bits.vpcf_c differ diff --git a/particles/basic_explosion/basic_explosion_burst.vpcf_c b/particles/basic_explosion/basic_explosion_burst.vpcf_c new file mode 100755 index 0000000..d9a81cd Binary files /dev/null and b/particles/basic_explosion/basic_explosion_burst.vpcf_c differ diff --git a/particles/basic_explosion/basic_explosion_flash.vpcf_c b/particles/basic_explosion/basic_explosion_flash.vpcf_c new file mode 100755 index 0000000..a613a69 Binary files /dev/null and b/particles/basic_explosion/basic_explosion_flash.vpcf_c differ diff --git a/particles/basic_projectile/basic_projectile.vpcf_c b/particles/basic_projectile/basic_projectile.vpcf_c new file mode 100755 index 0000000..06bbe29 Binary files /dev/null and b/particles/basic_projectile/basic_projectile.vpcf_c differ diff --git a/particles/basic_projectile/basic_projectile_explosion.vpcf_c b/particles/basic_projectile/basic_projectile_explosion.vpcf_c new file mode 100755 index 0000000..aac819f Binary files /dev/null and b/particles/basic_projectile/basic_projectile_explosion.vpcf_c differ diff --git a/particles/basic_projectile/basic_projectile_explosion_flash.vpcf_c b/particles/basic_projectile/basic_projectile_explosion_flash.vpcf_c new file mode 100755 index 0000000..1470bc5 Binary files /dev/null and b/particles/basic_projectile/basic_projectile_explosion_flash.vpcf_c differ diff --git a/particles/basic_projectile/basic_projectile_launch.vpcf_c b/particles/basic_projectile/basic_projectile_launch.vpcf_c new file mode 100755 index 0000000..ddcb379 Binary files /dev/null and b/particles/basic_projectile/basic_projectile_launch.vpcf_c differ diff --git a/particles/basic_projectile/basic_projectile_trail.vpcf_c b/particles/basic_projectile/basic_projectile_trail.vpcf_c new file mode 100755 index 0000000..22dddeb Binary files /dev/null and b/particles/basic_projectile/basic_projectile_trail.vpcf_c differ diff --git a/particles/basic_rope/basic_rope.vpcf_c b/particles/basic_rope/basic_rope.vpcf_c new file mode 100755 index 0000000..d15acae Binary files /dev/null and b/particles/basic_rope/basic_rope.vpcf_c differ diff --git a/particles/basic_trail/basic_trail.vpcf_c b/particles/basic_trail/basic_trail.vpcf_c new file mode 100755 index 0000000..b4ac7cc Binary files /dev/null and b/particles/basic_trail/basic_trail.vpcf_c differ diff --git a/particles/bosses/thtd_keine/ability_bosses_keine.vpcf_c b/particles/bosses/thtd_keine/ability_bosses_keine.vpcf_c new file mode 100755 index 0000000..b5a84c2 Binary files /dev/null and b/particles/bosses/thtd_keine/ability_bosses_keine.vpcf_c differ diff --git a/particles/bosses/thtd_keine/ability_bosses_keine_a.vpcf_c b/particles/bosses/thtd_keine/ability_bosses_keine_a.vpcf_c new file mode 100755 index 0000000..5f5bda0 Binary files /dev/null and b/particles/bosses/thtd_keine/ability_bosses_keine_a.vpcf_c differ diff --git a/particles/bosses/thtd_keine/ability_bosses_keine_a0.vpcf_c b/particles/bosses/thtd_keine/ability_bosses_keine_a0.vpcf_c new file mode 100755 index 0000000..1bc3c0a Binary files /dev/null and b/particles/bosses/thtd_keine/ability_bosses_keine_a0.vpcf_c differ diff --git a/particles/bosses/thtd_keine/ability_bosses_keine_a1.vpcf_c b/particles/bosses/thtd_keine/ability_bosses_keine_a1.vpcf_c new file mode 100755 index 0000000..9679bc5 Binary files /dev/null and b/particles/bosses/thtd_keine/ability_bosses_keine_a1.vpcf_c differ diff --git a/particles/bosses/thtd_keine/ability_bosses_keine_b.vpcf_c b/particles/bosses/thtd_keine/ability_bosses_keine_b.vpcf_c new file mode 100755 index 0000000..046d7af Binary files /dev/null and b/particles/bosses/thtd_keine/ability_bosses_keine_b.vpcf_c differ diff --git a/particles/bosses/thtd_keine/ability_bosses_keine_c.vpcf_c b/particles/bosses/thtd_keine/ability_bosses_keine_c.vpcf_c new file mode 100755 index 0000000..8e4d296 Binary files /dev/null and b/particles/bosses/thtd_keine/ability_bosses_keine_c.vpcf_c differ diff --git a/particles/common/thtd_food_msg.vpcf_c b/particles/common/thtd_food_msg.vpcf_c new file mode 100755 index 0000000..41c80d3 Binary files /dev/null and b/particles/common/thtd_food_msg.vpcf_c differ diff --git a/particles/custom/_dc_saber_omni_slash_tgt.vpcf_c b/particles/custom/_dc_saber_omni_slash_tgt.vpcf_c new file mode 100755 index 0000000..0eb39cc Binary files /dev/null and b/particles/custom/_dc_saber_omni_slash_tgt.vpcf_c differ diff --git a/particles/custom/_dc_saber_omni_slash_trail.vpcf_c b/particles/custom/_dc_saber_omni_slash_trail.vpcf_c new file mode 100755 index 0000000..f05a556 Binary files /dev/null and b/particles/custom/_dc_saber_omni_slash_trail.vpcf_c differ diff --git a/particles/custom/dc_saber_omni_slash_flash.vpcf_c b/particles/custom/dc_saber_omni_slash_flash.vpcf_c new file mode 100755 index 0000000..6548cb0 Binary files /dev/null and b/particles/custom/dc_saber_omni_slash_flash.vpcf_c differ diff --git a/particles/custom/dc_saber_omni_slash_rope.vpcf_c b/particles/custom/dc_saber_omni_slash_rope.vpcf_c new file mode 100755 index 0000000..7ef4768 Binary files /dev/null and b/particles/custom/dc_saber_omni_slash_rope.vpcf_c differ diff --git a/particles/custom/dc_saber_omni_slash_trail_blur.vpcf_c b/particles/custom/dc_saber_omni_slash_trail_blur.vpcf_c new file mode 100755 index 0000000..9c7a599 Binary files /dev/null and b/particles/custom/dc_saber_omni_slash_trail_blur.vpcf_c differ diff --git a/particles/custom/dc_saber_omni_slash_trail_glow.vpcf_c b/particles/custom/dc_saber_omni_slash_trail_glow.vpcf_c new file mode 100755 index 0000000..19fcc06 Binary files /dev/null and b/particles/custom/dc_saber_omni_slash_trail_glow.vpcf_c differ diff --git a/particles/custom/dc_saber_omni_slash_trail_glow_b.vpcf_c b/particles/custom/dc_saber_omni_slash_trail_glow_b.vpcf_c new file mode 100755 index 0000000..97d2f86 Binary files /dev/null and b/particles/custom/dc_saber_omni_slash_trail_glow_b.vpcf_c differ diff --git a/particles/custom/saber_blade_fury.vpcf_c b/particles/custom/saber_blade_fury.vpcf_c new file mode 100755 index 0000000..9eac1ee Binary files /dev/null and b/particles/custom/saber_blade_fury.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_abyssal_core_sakura.vpcf_c b/particles/custom/saber_blade_fury_abyssal_core_sakura.vpcf_c new file mode 100755 index 0000000..3ff61f0 Binary files /dev/null and b/particles/custom/saber_blade_fury_abyssal_core_sakura.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_abyssal_cyclone_flowers_sakura.vpcf_c b/particles/custom/saber_blade_fury_abyssal_cyclone_flowers_sakura.vpcf_c new file mode 100755 index 0000000..8ad9804 Binary files /dev/null and b/particles/custom/saber_blade_fury_abyssal_cyclone_flowers_sakura.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_abyssal_flash_sakura.vpcf_c b/particles/custom/saber_blade_fury_abyssal_flash_sakura.vpcf_c new file mode 100755 index 0000000..fa0011c Binary files /dev/null and b/particles/custom/saber_blade_fury_abyssal_flash_sakura.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_abyssal_hotspot_sakura.vpcf_c b/particles/custom/saber_blade_fury_abyssal_hotspot_sakura.vpcf_c new file mode 100755 index 0000000..9a8b482 Binary files /dev/null and b/particles/custom/saber_blade_fury_abyssal_hotspot_sakura.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_abyssal_light_sakura.vpcf_c b/particles/custom/saber_blade_fury_abyssal_light_sakura.vpcf_c new file mode 100755 index 0000000..3c0651f Binary files /dev/null and b/particles/custom/saber_blade_fury_abyssal_light_sakura.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_abyssal_sakura_smoke.vpcf_c b/particles/custom/saber_blade_fury_abyssal_sakura_smoke.vpcf_c new file mode 100755 index 0000000..c9e389e Binary files /dev/null and b/particles/custom/saber_blade_fury_abyssal_sakura_smoke.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_abyssal_sparks_sakura.vpcf_c b/particles/custom/saber_blade_fury_abyssal_sparks_sakura.vpcf_c new file mode 100755 index 0000000..38cafae Binary files /dev/null and b/particles/custom/saber_blade_fury_abyssal_sparks_sakura.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_abyssal_streaks_sakura.vpcf_c b/particles/custom/saber_blade_fury_abyssal_streaks_sakura.vpcf_c new file mode 100755 index 0000000..c79b311 Binary files /dev/null and b/particles/custom/saber_blade_fury_abyssal_streaks_sakura.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_abyssal_trail_b_sakura.vpcf_c b/particles/custom/saber_blade_fury_abyssal_trail_b_sakura.vpcf_c new file mode 100755 index 0000000..0ea180b Binary files /dev/null and b/particles/custom/saber_blade_fury_abyssal_trail_b_sakura.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_abyssal_trail_sakura.vpcf_c b/particles/custom/saber_blade_fury_abyssal_trail_sakura.vpcf_c new file mode 100755 index 0000000..e37ce1f Binary files /dev/null and b/particles/custom/saber_blade_fury_abyssal_trail_sakura.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_disk.vpcf_c b/particles/custom/saber_blade_fury_disk.vpcf_c new file mode 100755 index 0000000..18a7587 Binary files /dev/null and b/particles/custom/saber_blade_fury_disk.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_dragon.vpcf_c b/particles/custom/saber_blade_fury_dragon.vpcf_c new file mode 100755 index 0000000..c808c67 Binary files /dev/null and b/particles/custom/saber_blade_fury_dragon.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_dragon1.vpcf_c b/particles/custom/saber_blade_fury_dragon1.vpcf_c new file mode 100755 index 0000000..0d8d2f1 Binary files /dev/null and b/particles/custom/saber_blade_fury_dragon1.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_dragon2.vpcf_c b/particles/custom/saber_blade_fury_dragon2.vpcf_c new file mode 100755 index 0000000..87fe87f Binary files /dev/null and b/particles/custom/saber_blade_fury_dragon2.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_dragon3.vpcf_c b/particles/custom/saber_blade_fury_dragon3.vpcf_c new file mode 100755 index 0000000..febe874 Binary files /dev/null and b/particles/custom/saber_blade_fury_dragon3.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_dragon4.vpcf_c b/particles/custom/saber_blade_fury_dragon4.vpcf_c new file mode 100755 index 0000000..52b9624 Binary files /dev/null and b/particles/custom/saber_blade_fury_dragon4.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_dragon_trail.vpcf_c b/particles/custom/saber_blade_fury_dragon_trail.vpcf_c new file mode 100755 index 0000000..32e895a Binary files /dev/null and b/particles/custom/saber_blade_fury_dragon_trail.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_dragon_trail_detail.vpcf_c b/particles/custom/saber_blade_fury_dragon_trail_detail.vpcf_c new file mode 100755 index 0000000..00fbe44 Binary files /dev/null and b/particles/custom/saber_blade_fury_dragon_trail_detail.vpcf_c differ diff --git a/particles/custom/saber_blade_fury_dragon_trail_embers.vpcf_c b/particles/custom/saber_blade_fury_dragon_trail_embers.vpcf_c new file mode 100755 index 0000000..b8721cb Binary files /dev/null and b/particles/custom/saber_blade_fury_dragon_trail_embers.vpcf_c differ diff --git a/particles/custom/saber_blade_generic.vpcf_c b/particles/custom/saber_blade_generic.vpcf_c new file mode 100755 index 0000000..613400b Binary files /dev/null and b/particles/custom/saber_blade_generic.vpcf_c differ diff --git a/particles/custom/saber_body_ambient_flame.vpcf_c b/particles/custom/saber_body_ambient_flame.vpcf_c new file mode 100755 index 0000000..0c6399b Binary files /dev/null and b/particles/custom/saber_body_ambient_flame.vpcf_c differ diff --git a/particles/custom/saber_counter.vpcf_c b/particles/custom/saber_counter.vpcf_c new file mode 100755 index 0000000..ac99140 Binary files /dev/null and b/particles/custom/saber_counter.vpcf_c differ diff --git a/particles/custom/saber_counter_dark.vpcf_c b/particles/custom/saber_counter_dark.vpcf_c new file mode 100755 index 0000000..fde0282 Binary files /dev/null and b/particles/custom/saber_counter_dark.vpcf_c differ diff --git a/particles/custom/saber_counter_dmg_flare.vpcf_c b/particles/custom/saber_counter_dmg_flare.vpcf_c new file mode 100755 index 0000000..51297d5 Binary files /dev/null and b/particles/custom/saber_counter_dmg_flare.vpcf_c differ diff --git a/particles/custom/saber_counter_dmg_flare_glow.vpcf_c b/particles/custom/saber_counter_dmg_flare_glow.vpcf_c new file mode 100755 index 0000000..97c788b Binary files /dev/null and b/particles/custom/saber_counter_dmg_flare_glow.vpcf_c differ diff --git a/particles/custom/saber_counter_dmg_flare_light.vpcf_c b/particles/custom/saber_counter_dmg_flare_light.vpcf_c new file mode 100755 index 0000000..f4dbb23 Binary files /dev/null and b/particles/custom/saber_counter_dmg_flare_light.vpcf_c differ diff --git a/particles/custom/saber_counter_dmg_flash_pnt.vpcf_c b/particles/custom/saber_counter_dmg_flash_pnt.vpcf_c new file mode 100755 index 0000000..0bfaa81 Binary files /dev/null and b/particles/custom/saber_counter_dmg_flash_pnt.vpcf_c differ diff --git a/particles/custom/saber_counter_fire.vpcf_c b/particles/custom/saber_counter_fire.vpcf_c new file mode 100755 index 0000000..642ec3d Binary files /dev/null and b/particles/custom/saber_counter_fire.vpcf_c differ diff --git a/particles/custom/saber_counter_slash.vpcf_c b/particles/custom/saber_counter_slash.vpcf_c new file mode 100755 index 0000000..8cb7a4d Binary files /dev/null and b/particles/custom/saber_counter_slash.vpcf_c differ diff --git a/particles/custom/saber_counter_slash_rope.vpcf_c b/particles/custom/saber_counter_slash_rope.vpcf_c new file mode 100755 index 0000000..549db01 Binary files /dev/null and b/particles/custom/saber_counter_slash_rope.vpcf_c differ diff --git a/particles/custom/saber_counter_symbol.vpcf_c b/particles/custom/saber_counter_symbol.vpcf_c new file mode 100755 index 0000000..28b60b3 Binary files /dev/null and b/particles/custom/saber_counter_symbol.vpcf_c differ diff --git a/particles/custom/saber_counter_text.vpcf_c b/particles/custom/saber_counter_text.vpcf_c new file mode 100755 index 0000000..cae3df3 Binary files /dev/null and b/particles/custom/saber_counter_text.vpcf_c differ diff --git a/particles/custom/saber_counter_text_burst.vpcf_c b/particles/custom/saber_counter_text_burst.vpcf_c new file mode 100755 index 0000000..6ac2125 Binary files /dev/null and b/particles/custom/saber_counter_text_burst.vpcf_c differ diff --git a/particles/custom/saber_counter_text_flash.vpcf_c b/particles/custom/saber_counter_text_flash.vpcf_c new file mode 100755 index 0000000..92d7a38 Binary files /dev/null and b/particles/custom/saber_counter_text_flash.vpcf_c differ diff --git a/particles/custom/saber_counter_victories.vpcf_c b/particles/custom/saber_counter_victories.vpcf_c new file mode 100755 index 0000000..acf8a36 Binary files /dev/null and b/particles/custom/saber_counter_victories.vpcf_c differ diff --git a/particles/custom/saber_crit_blur.vpcf_c b/particles/custom/saber_crit_blur.vpcf_c new file mode 100755 index 0000000..f493517 Binary files /dev/null and b/particles/custom/saber_crit_blur.vpcf_c differ diff --git a/particles/custom/saber_crit_blur_glow.vpcf_c b/particles/custom/saber_crit_blur_glow.vpcf_c new file mode 100755 index 0000000..dcf6e4f Binary files /dev/null and b/particles/custom/saber_crit_blur_glow.vpcf_c differ diff --git a/particles/custom/saber_crit_tgt_glow.vpcf_c b/particles/custom/saber_crit_tgt_glow.vpcf_c new file mode 100755 index 0000000..bebade1 Binary files /dev/null and b/particles/custom/saber_crit_tgt_glow.vpcf_c differ diff --git a/particles/custom/saber_crit_tgt_glow_dark.vpcf_c b/particles/custom/saber_crit_tgt_glow_dark.vpcf_c new file mode 100755 index 0000000..733b80f Binary files /dev/null and b/particles/custom/saber_crit_tgt_glow_dark.vpcf_c differ diff --git a/particles/custom/saber_crit_tgt_light.vpcf_c b/particles/custom/saber_crit_tgt_light.vpcf_c new file mode 100755 index 0000000..85533d0 Binary files /dev/null and b/particles/custom/saber_crit_tgt_light.vpcf_c differ diff --git a/particles/custom/saber_crit_tgt_line_sparks.vpcf_c b/particles/custom/saber_crit_tgt_line_sparks.vpcf_c new file mode 100755 index 0000000..8ec80d7 Binary files /dev/null and b/particles/custom/saber_crit_tgt_line_sparks.vpcf_c differ diff --git a/particles/custom/saber_crit_tgt_model.vpcf_c b/particles/custom/saber_crit_tgt_model.vpcf_c new file mode 100755 index 0000000..060ab62 Binary files /dev/null and b/particles/custom/saber_crit_tgt_model.vpcf_c differ diff --git a/particles/custom/saber_crit_tgt_model_glow.vpcf_c b/particles/custom/saber_crit_tgt_model_glow.vpcf_c new file mode 100755 index 0000000..fdc93d4 Binary files /dev/null and b/particles/custom/saber_crit_tgt_model_glow.vpcf_c differ diff --git a/particles/custom/saber_death_model_glow.vpcf_c b/particles/custom/saber_death_model_glow.vpcf_c new file mode 100755 index 0000000..0e604db Binary files /dev/null and b/particles/custom/saber_death_model_glow.vpcf_c differ diff --git a/particles/custom/saber_haste_debris.vpcf_c b/particles/custom/saber_haste_debris.vpcf_c new file mode 100755 index 0000000..ec9268c Binary files /dev/null and b/particles/custom/saber_haste_debris.vpcf_c differ diff --git a/particles/custom/saber_haste_dust.vpcf_c b/particles/custom/saber_haste_dust.vpcf_c new file mode 100755 index 0000000..a96b82a Binary files /dev/null and b/particles/custom/saber_haste_dust.vpcf_c differ diff --git a/particles/custom/saber_haste_ember.vpcf_c b/particles/custom/saber_haste_ember.vpcf_c new file mode 100755 index 0000000..4c40725 Binary files /dev/null and b/particles/custom/saber_haste_ember.vpcf_c differ diff --git a/particles/custom/saber_haste_glow.vpcf_c b/particles/custom/saber_haste_glow.vpcf_c new file mode 100755 index 0000000..7756262 Binary files /dev/null and b/particles/custom/saber_haste_glow.vpcf_c differ diff --git a/particles/custom/saber_haste_rope.vpcf_c b/particles/custom/saber_haste_rope.vpcf_c new file mode 100755 index 0000000..b663236 Binary files /dev/null and b/particles/custom/saber_haste_rope.vpcf_c differ diff --git a/particles/custom/saber_haste_rope_dark.vpcf_c b/particles/custom/saber_haste_rope_dark.vpcf_c new file mode 100755 index 0000000..f57cea2 Binary files /dev/null and b/particles/custom/saber_haste_rope_dark.vpcf_c differ diff --git a/particles/custom/saber_healing_ward.vpcf_c b/particles/custom/saber_healing_ward.vpcf_c new file mode 100755 index 0000000..753cb87 Binary files /dev/null and b/particles/custom/saber_healing_ward.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_a.vpcf_c b/particles/custom/saber_healing_ward_a.vpcf_c new file mode 100755 index 0000000..0875cf6 Binary files /dev/null and b/particles/custom/saber_healing_ward_a.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_b.vpcf_c b/particles/custom/saber_healing_ward_b.vpcf_c new file mode 100755 index 0000000..92737bf Binary files /dev/null and b/particles/custom/saber_healing_ward_b.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_base.vpcf_c b/particles/custom/saber_healing_ward_base.vpcf_c new file mode 100755 index 0000000..ca883e0 Binary files /dev/null and b/particles/custom/saber_healing_ward_base.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_base_dc.vpcf_c b/particles/custom/saber_healing_ward_base_dc.vpcf_c new file mode 100755 index 0000000..d3d144f Binary files /dev/null and b/particles/custom/saber_healing_ward_base_dc.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_c.vpcf_c b/particles/custom/saber_healing_ward_c.vpcf_c new file mode 100755 index 0000000..b84d7c5 Binary files /dev/null and b/particles/custom/saber_healing_ward_c.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_d.vpcf_c b/particles/custom/saber_healing_ward_d.vpcf_c new file mode 100755 index 0000000..b98adaf Binary files /dev/null and b/particles/custom/saber_healing_ward_d.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_fortunes_tout_gold_glow.vpcf_c b/particles/custom/saber_healing_ward_fortunes_tout_gold_glow.vpcf_c new file mode 100755 index 0000000..40bf1ef Binary files /dev/null and b/particles/custom/saber_healing_ward_fortunes_tout_gold_glow.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_fortunes_tout_gold_magic.vpcf_c b/particles/custom/saber_healing_ward_fortunes_tout_gold_magic.vpcf_c new file mode 100755 index 0000000..107f638 Binary files /dev/null and b/particles/custom/saber_healing_ward_fortunes_tout_gold_magic.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_fortunes_tout_gold_shine.vpcf_c b/particles/custom/saber_healing_ward_fortunes_tout_gold_shine.vpcf_c new file mode 100755 index 0000000..2b051e3 Binary files /dev/null and b/particles/custom/saber_healing_ward_fortunes_tout_gold_shine.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_fortunes_tout_gold_twinkle.vpcf_c b/particles/custom/saber_healing_ward_fortunes_tout_gold_twinkle.vpcf_c new file mode 100755 index 0000000..bc93d5c Binary files /dev/null and b/particles/custom/saber_healing_ward_fortunes_tout_gold_twinkle.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_fortunes_tout_ward_fireflies.vpcf_c b/particles/custom/saber_healing_ward_fortunes_tout_ward_fireflies.vpcf_c new file mode 100755 index 0000000..640ba5c Binary files /dev/null and b/particles/custom/saber_healing_ward_fortunes_tout_ward_fireflies.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_fortunes_tout_ward_gold.vpcf_c b/particles/custom/saber_healing_ward_fortunes_tout_ward_gold.vpcf_c new file mode 100755 index 0000000..89a8c4c Binary files /dev/null and b/particles/custom/saber_healing_ward_fortunes_tout_ward_gold.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_fortunes_tout_ward_gold_flame.vpcf_c b/particles/custom/saber_healing_ward_fortunes_tout_ward_gold_flame.vpcf_c new file mode 100755 index 0000000..4538306 Binary files /dev/null and b/particles/custom/saber_healing_ward_fortunes_tout_ward_gold_flame.vpcf_c differ diff --git a/particles/custom/saber_healing_ward_ring_dc.vpcf_c b/particles/custom/saber_healing_ward_ring_dc.vpcf_c new file mode 100755 index 0000000..07383ba Binary files /dev/null and b/particles/custom/saber_healing_ward_ring_dc.vpcf_c differ diff --git a/particles/custom/saber_healingward_flame.vpcf_c b/particles/custom/saber_healingward_flame.vpcf_c new file mode 100755 index 0000000..e96a86b Binary files /dev/null and b/particles/custom/saber_healingward_flame.vpcf_c differ diff --git a/particles/custom/saber_healingward_flame_a.vpcf_c b/particles/custom/saber_healingward_flame_a.vpcf_c new file mode 100755 index 0000000..59cbfd8 Binary files /dev/null and b/particles/custom/saber_healingward_flame_a.vpcf_c differ diff --git a/particles/custom/saber_healingward_flame_b.vpcf_c b/particles/custom/saber_healingward_flame_b.vpcf_c new file mode 100755 index 0000000..f46bf6d Binary files /dev/null and b/particles/custom/saber_healingward_flame_b.vpcf_c differ diff --git a/particles/custom/saber_healingward_flame_c.vpcf_c b/particles/custom/saber_healingward_flame_c.vpcf_c new file mode 100755 index 0000000..46231c0 Binary files /dev/null and b/particles/custom/saber_healingward_flame_c.vpcf_c differ diff --git a/particles/custom/saber_healling_ward_fortunes_tout_ward_base.vpcf_c b/particles/custom/saber_healling_ward_fortunes_tout_ward_base.vpcf_c new file mode 100755 index 0000000..6b58535 Binary files /dev/null and b/particles/custom/saber_healling_ward_fortunes_tout_ward_base.vpcf_c differ diff --git a/particles/custom/saber_healling_ward_fortunes_tout_ward_center_glow.vpcf_c b/particles/custom/saber_healling_ward_fortunes_tout_ward_center_glow.vpcf_c new file mode 100755 index 0000000..c80262b Binary files /dev/null and b/particles/custom/saber_healling_ward_fortunes_tout_ward_center_glow.vpcf_c differ diff --git a/particles/custom/saber_healling_ward_fortunes_tout_ward_edge.vpcf_c b/particles/custom/saber_healling_ward_fortunes_tout_ward_edge.vpcf_c new file mode 100755 index 0000000..e243ccb Binary files /dev/null and b/particles/custom/saber_healling_ward_fortunes_tout_ward_edge.vpcf_c differ diff --git a/particles/custom/saber_healling_ward_fortunes_tout_ward_edge_glow.vpcf_c b/particles/custom/saber_healling_ward_fortunes_tout_ward_edge_glow.vpcf_c new file mode 100755 index 0000000..dbffe03 Binary files /dev/null and b/particles/custom/saber_healling_ward_fortunes_tout_ward_edge_glow.vpcf_c differ diff --git a/particles/custom/saber_healling_ward_fortunes_tout_ward_edge_sphere.vpcf_c b/particles/custom/saber_healling_ward_fortunes_tout_ward_edge_sphere.vpcf_c new file mode 100755 index 0000000..5f5eb39 Binary files /dev/null and b/particles/custom/saber_healling_ward_fortunes_tout_ward_edge_sphere.vpcf_c differ diff --git a/particles/custom/saber_healling_ward_fortunes_tout_ward_fill.vpcf_c b/particles/custom/saber_healling_ward_fortunes_tout_ward_fill.vpcf_c new file mode 100755 index 0000000..99734e3 Binary files /dev/null and b/particles/custom/saber_healling_ward_fortunes_tout_ward_fill.vpcf_c differ diff --git a/particles/custom/saber_idle_rare_entry.vpcf_c b/particles/custom/saber_idle_rare_entry.vpcf_c new file mode 100755 index 0000000..2a12630 Binary files /dev/null and b/particles/custom/saber_idle_rare_entry.vpcf_c differ diff --git a/particles/custom/saber_idle_rare_entry_glow.vpcf_c b/particles/custom/saber_idle_rare_entry_glow.vpcf_c new file mode 100755 index 0000000..7cf2bf6 Binary files /dev/null and b/particles/custom/saber_idle_rare_entry_glow.vpcf_c differ diff --git a/particles/custom/saber_idle_rare_glow.vpcf_c b/particles/custom/saber_idle_rare_glow.vpcf_c new file mode 100755 index 0000000..ab6e632 Binary files /dev/null and b/particles/custom/saber_idle_rare_glow.vpcf_c differ diff --git a/particles/custom/saber_idle_rare_ground.vpcf_c b/particles/custom/saber_idle_rare_ground.vpcf_c new file mode 100755 index 0000000..9c74e67 Binary files /dev/null and b/particles/custom/saber_idle_rare_ground.vpcf_c differ diff --git a/particles/custom/saber_idle_rare_ground_light.vpcf_c b/particles/custom/saber_idle_rare_ground_light.vpcf_c new file mode 100755 index 0000000..3afe3c1 Binary files /dev/null and b/particles/custom/saber_idle_rare_ground_light.vpcf_c differ diff --git a/particles/custom/saber_idle_rare_light.vpcf_c b/particles/custom/saber_idle_rare_light.vpcf_c new file mode 100755 index 0000000..e80b0c3 Binary files /dev/null and b/particles/custom/saber_idle_rare_light.vpcf_c differ diff --git a/particles/custom/saber_idle_rare_magic.vpcf_c b/particles/custom/saber_idle_rare_magic.vpcf_c new file mode 100755 index 0000000..8fb1724 Binary files /dev/null and b/particles/custom/saber_idle_rare_magic.vpcf_c differ diff --git a/particles/custom/saber_idle_rare_trail.vpcf_c b/particles/custom/saber_idle_rare_trail.vpcf_c new file mode 100755 index 0000000..966396c Binary files /dev/null and b/particles/custom/saber_idle_rare_trail.vpcf_c differ diff --git a/particles/custom/saber_idle_rare_twinkle.vpcf_c b/particles/custom/saber_idle_rare_twinkle.vpcf_c new file mode 100755 index 0000000..bc859e8 Binary files /dev/null and b/particles/custom/saber_idle_rare_twinkle.vpcf_c differ diff --git a/particles/custom/saber_loadout_rare_model_glow.vpcf_c b/particles/custom/saber_loadout_rare_model_glow.vpcf_c new file mode 100755 index 0000000..0199f00 Binary files /dev/null and b/particles/custom/saber_loadout_rare_model_glow.vpcf_c differ diff --git a/particles/custom/saber_loadout_rare_model_light.vpcf_c b/particles/custom/saber_loadout_rare_model_light.vpcf_c new file mode 100755 index 0000000..13ea8b1 Binary files /dev/null and b/particles/custom/saber_loadout_rare_model_light.vpcf_c differ diff --git a/particles/custom/saber_loadout_rare_model_magic.vpcf_c b/particles/custom/saber_loadout_rare_model_magic.vpcf_c new file mode 100755 index 0000000..0bdad8a Binary files /dev/null and b/particles/custom/saber_loadout_rare_model_magic.vpcf_c differ diff --git a/particles/custom/saber_loadout_rare_model_trail.vpcf_c b/particles/custom/saber_loadout_rare_model_trail.vpcf_c new file mode 100755 index 0000000..84b2f72 Binary files /dev/null and b/particles/custom/saber_loadout_rare_model_trail.vpcf_c differ diff --git a/particles/custom/saber_omni_dash_model.vpcf_c b/particles/custom/saber_omni_dash_model.vpcf_c new file mode 100755 index 0000000..32a4b1e Binary files /dev/null and b/particles/custom/saber_omni_dash_model.vpcf_c differ diff --git a/particles/custom/saber_omni_dash_model_dragon.vpcf_c b/particles/custom/saber_omni_dash_model_dragon.vpcf_c new file mode 100755 index 0000000..664f671 Binary files /dev/null and b/particles/custom/saber_omni_dash_model_dragon.vpcf_c differ diff --git a/particles/custom/saber_omni_end_dust.vpcf_c b/particles/custom/saber_omni_end_dust.vpcf_c new file mode 100755 index 0000000..c9f1cb6 Binary files /dev/null and b/particles/custom/saber_omni_end_dust.vpcf_c differ diff --git a/particles/custom/saber_omni_end_model.vpcf_c b/particles/custom/saber_omni_end_model.vpcf_c new file mode 100755 index 0000000..59f2dfd Binary files /dev/null and b/particles/custom/saber_omni_end_model.vpcf_c differ diff --git a/particles/custom/saber_omni_end_streak.vpcf_c b/particles/custom/saber_omni_end_streak.vpcf_c new file mode 100755 index 0000000..13b6a11 Binary files /dev/null and b/particles/custom/saber_omni_end_streak.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_flash.vpcf_c b/particles/custom/saber_omni_slash_flash.vpcf_c new file mode 100755 index 0000000..32cd743 Binary files /dev/null and b/particles/custom/saber_omni_slash_flash.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_flash_serrakura.vpcf_c b/particles/custom/saber_omni_slash_flash_serrakura.vpcf_c new file mode 100755 index 0000000..8138e5e Binary files /dev/null and b/particles/custom/saber_omni_slash_flash_serrakura.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_petals_serrakura.vpcf_c b/particles/custom/saber_omni_slash_petals_serrakura.vpcf_c new file mode 100755 index 0000000..12f9ab0 Binary files /dev/null and b/particles/custom/saber_omni_slash_petals_serrakura.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_rope.vpcf_c b/particles/custom/saber_omni_slash_rope.vpcf_c new file mode 100755 index 0000000..1131b7d Binary files /dev/null and b/particles/custom/saber_omni_slash_rope.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_rope_serrakura.vpcf_c b/particles/custom/saber_omni_slash_rope_serrakura.vpcf_c new file mode 100755 index 0000000..f3e2cc9 Binary files /dev/null and b/particles/custom/saber_omni_slash_rope_serrakura.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_tgt.vpcf_c b/particles/custom/saber_omni_slash_tgt.vpcf_c new file mode 100755 index 0000000..77a46f2 Binary files /dev/null and b/particles/custom/saber_omni_slash_tgt.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_tgt_bonus_burst.vpcf_c b/particles/custom/saber_omni_slash_tgt_bonus_burst.vpcf_c new file mode 100755 index 0000000..0f67227 Binary files /dev/null and b/particles/custom/saber_omni_slash_tgt_bonus_burst.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_tgt_bonus_burst_glow.vpcf_c b/particles/custom/saber_omni_slash_tgt_bonus_burst_glow.vpcf_c new file mode 100755 index 0000000..bf5e20b Binary files /dev/null and b/particles/custom/saber_omni_slash_tgt_bonus_burst_glow.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_tgt_bonus_burst_streak.vpcf_c b/particles/custom/saber_omni_slash_tgt_bonus_burst_streak.vpcf_c new file mode 100755 index 0000000..a9afb8a Binary files /dev/null and b/particles/custom/saber_omni_slash_tgt_bonus_burst_streak.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_tgt_dark.vpcf_c b/particles/custom/saber_omni_slash_tgt_dark.vpcf_c new file mode 100755 index 0000000..43c8f93 Binary files /dev/null and b/particles/custom/saber_omni_slash_tgt_dark.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_tgt_flash.vpcf_c b/particles/custom/saber_omni_slash_tgt_flash.vpcf_c new file mode 100755 index 0000000..aa761a8 Binary files /dev/null and b/particles/custom/saber_omni_slash_tgt_flash.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_tgt_rope.vpcf_c b/particles/custom/saber_omni_slash_tgt_rope.vpcf_c new file mode 100755 index 0000000..1bfae77 Binary files /dev/null and b/particles/custom/saber_omni_slash_tgt_rope.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_tgt_rope_vert.vpcf_c b/particles/custom/saber_omni_slash_tgt_rope_vert.vpcf_c new file mode 100755 index 0000000..acc7753 Binary files /dev/null and b/particles/custom/saber_omni_slash_tgt_rope_vert.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_tgt_serrakura.vpcf_c b/particles/custom/saber_omni_slash_tgt_serrakura.vpcf_c new file mode 100755 index 0000000..fbb6b63 Binary files /dev/null and b/particles/custom/saber_omni_slash_tgt_serrakura.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_tgt_top.vpcf_c b/particles/custom/saber_omni_slash_tgt_top.vpcf_c new file mode 100755 index 0000000..11f4919 Binary files /dev/null and b/particles/custom/saber_omni_slash_tgt_top.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_trail.vpcf_c b/particles/custom/saber_omni_slash_trail.vpcf_c new file mode 100755 index 0000000..8d818b2 Binary files /dev/null and b/particles/custom/saber_omni_slash_trail.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_trail_blur.vpcf_c b/particles/custom/saber_omni_slash_trail_blur.vpcf_c new file mode 100755 index 0000000..b49e267 Binary files /dev/null and b/particles/custom/saber_omni_slash_trail_blur.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_trail_blur_serrakura.vpcf_c b/particles/custom/saber_omni_slash_trail_blur_serrakura.vpcf_c new file mode 100755 index 0000000..9f02237 Binary files /dev/null and b/particles/custom/saber_omni_slash_trail_blur_serrakura.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_trail_core.vpcf_c b/particles/custom/saber_omni_slash_trail_core.vpcf_c new file mode 100755 index 0000000..c4b5eb7 Binary files /dev/null and b/particles/custom/saber_omni_slash_trail_core.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_trail_dust_l.vpcf_c b/particles/custom/saber_omni_slash_trail_dust_l.vpcf_c new file mode 100755 index 0000000..a405ba7 Binary files /dev/null and b/particles/custom/saber_omni_slash_trail_dust_l.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_trail_glow.vpcf_c b/particles/custom/saber_omni_slash_trail_glow.vpcf_c new file mode 100755 index 0000000..1dded16 Binary files /dev/null and b/particles/custom/saber_omni_slash_trail_glow.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_trail_glow_b.vpcf_c b/particles/custom/saber_omni_slash_trail_glow_b.vpcf_c new file mode 100755 index 0000000..95db38b Binary files /dev/null and b/particles/custom/saber_omni_slash_trail_glow_b.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_trail_glow_b_serrakura.vpcf_c b/particles/custom/saber_omni_slash_trail_glow_b_serrakura.vpcf_c new file mode 100755 index 0000000..b389fb3 Binary files /dev/null and b/particles/custom/saber_omni_slash_trail_glow_b_serrakura.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_trail_glow_serrakura.vpcf_c b/particles/custom/saber_omni_slash_trail_glow_serrakura.vpcf_c new file mode 100755 index 0000000..61886cc Binary files /dev/null and b/particles/custom/saber_omni_slash_trail_glow_serrakura.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_trail_ground.vpcf_c b/particles/custom/saber_omni_slash_trail_ground.vpcf_c new file mode 100755 index 0000000..2f8ed23 Binary files /dev/null and b/particles/custom/saber_omni_slash_trail_ground.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_trail_serrakura.vpcf_c b/particles/custom/saber_omni_slash_trail_serrakura.vpcf_c new file mode 100755 index 0000000..2bf7cb5 Binary files /dev/null and b/particles/custom/saber_omni_slash_trail_serrakura.vpcf_c differ diff --git a/particles/custom/saber_omni_slash_trail_soft.vpcf_c b/particles/custom/saber_omni_slash_trail_soft.vpcf_c new file mode 100755 index 0000000..9352446 Binary files /dev/null and b/particles/custom/saber_omni_slash_trail_soft.vpcf_c differ diff --git a/particles/custom/saber_omni_streaks.vpcf_c b/particles/custom/saber_omni_streaks.vpcf_c new file mode 100755 index 0000000..0b238b2 Binary files /dev/null and b/particles/custom/saber_omni_streaks.vpcf_c differ diff --git a/particles/custom/saber_sakura.vpcf_c b/particles/custom/saber_sakura.vpcf_c new file mode 100755 index 0000000..9874296 Binary files /dev/null and b/particles/custom/saber_sakura.vpcf_c differ diff --git a/particles/custom/saber_sakura_skill_sword.vpcf_c b/particles/custom/saber_sakura_skill_sword.vpcf_c new file mode 100755 index 0000000..0881159 Binary files /dev/null and b/particles/custom/saber_sakura_skill_sword.vpcf_c differ diff --git a/particles/custom/saber_serrakurra_ambient.vpcf_c b/particles/custom/saber_serrakurra_ambient.vpcf_c new file mode 100755 index 0000000..ba29fee Binary files /dev/null and b/particles/custom/saber_serrakurra_ambient.vpcf_c differ diff --git a/particles/custom/saber_serrakurra_ambient_blade.vpcf_c b/particles/custom/saber_serrakurra_ambient_blade.vpcf_c new file mode 100755 index 0000000..f6fa0bd Binary files /dev/null and b/particles/custom/saber_serrakurra_ambient_blade.vpcf_c differ diff --git a/particles/custom/saber_serrakurra_ambient_blade_glow.vpcf_c b/particles/custom/saber_serrakurra_ambient_blade_glow.vpcf_c new file mode 100755 index 0000000..ca87ead Binary files /dev/null and b/particles/custom/saber_serrakurra_ambient_blade_glow.vpcf_c differ diff --git a/particles/custom/saber_serrakurra_ambient_blade_petal.vpcf_c b/particles/custom/saber_serrakurra_ambient_blade_petal.vpcf_c new file mode 100755 index 0000000..617b300 Binary files /dev/null and b/particles/custom/saber_serrakurra_ambient_blade_petal.vpcf_c differ diff --git a/particles/custom/saber_teleport_end_light.vpcf_c b/particles/custom/saber_teleport_end_light.vpcf_c new file mode 100755 index 0000000..8506ebc Binary files /dev/null and b/particles/custom/saber_teleport_end_light.vpcf_c differ diff --git a/particles/custom/saber_teleport_end_model_glow.vpcf_c b/particles/custom/saber_teleport_end_model_glow.vpcf_c new file mode 100755 index 0000000..b65dced Binary files /dev/null and b/particles/custom/saber_teleport_end_model_glow.vpcf_c differ diff --git a/particles/custom/saber_teleport_light.vpcf_c b/particles/custom/saber_teleport_light.vpcf_c new file mode 100755 index 0000000..c34f20a Binary files /dev/null and b/particles/custom/saber_teleport_light.vpcf_c differ diff --git a/particles/custom/saber_teleport_model_glow.vpcf_c b/particles/custom/saber_teleport_model_glow.vpcf_c new file mode 100755 index 0000000..e022f7a Binary files /dev/null and b/particles/custom/saber_teleport_model_glow.vpcf_c differ diff --git a/particles/custom/saber_ti8_sword_crit_b_golden.vpcf_c b/particles/custom/saber_ti8_sword_crit_b_golden.vpcf_c new file mode 100755 index 0000000..b1fa97c Binary files /dev/null and b/particles/custom/saber_ti8_sword_crit_b_golden.vpcf_c differ diff --git a/particles/custom/saber_ti8_sword_crit_b_overtheshoulder_golden.vpcf_c b/particles/custom/saber_ti8_sword_crit_b_overtheshoulder_golden.vpcf_c new file mode 100755 index 0000000..f14f178 Binary files /dev/null and b/particles/custom/saber_ti8_sword_crit_b_overtheshoulder_golden.vpcf_c differ diff --git a/particles/custom/saber_ti8_sword_crit_c_overtheshoulder_golden.vpcf_c b/particles/custom/saber_ti8_sword_crit_c_overtheshoulder_golden.vpcf_c new file mode 100755 index 0000000..ec8c812 Binary files /dev/null and b/particles/custom/saber_ti8_sword_crit_c_overtheshoulder_golden.vpcf_c differ diff --git a/particles/custom/saber_ti8_sword_crit_d_overtheshoulder_golden.vpcf_c b/particles/custom/saber_ti8_sword_crit_d_overtheshoulder_golden.vpcf_c new file mode 100755 index 0000000..600d977 Binary files /dev/null and b/particles/custom/saber_ti8_sword_crit_d_overtheshoulder_golden.vpcf_c differ diff --git a/particles/custom/saber_ti8_sword_sakura.vpcf_c b/particles/custom/saber_ti8_sword_sakura.vpcf_c new file mode 100755 index 0000000..975f8dd Binary files /dev/null and b/particles/custom/saber_ti8_sword_sakura.vpcf_c differ diff --git a/particles/custom/saber_ti8_sword_sakura_around.vpcf_c b/particles/custom/saber_ti8_sword_sakura_around.vpcf_c new file mode 100755 index 0000000..ddb83f3 Binary files /dev/null and b/particles/custom/saber_ti8_sword_sakura_around.vpcf_c differ diff --git a/particles/custom/saber_trigger.vpcf_c b/particles/custom/saber_trigger.vpcf_c new file mode 100755 index 0000000..bc0739c Binary files /dev/null and b/particles/custom/saber_trigger.vpcf_c differ diff --git a/particles/custom/saber_trigger_beams.vpcf_c b/particles/custom/saber_trigger_beams.vpcf_c new file mode 100755 index 0000000..0d8e52a Binary files /dev/null and b/particles/custom/saber_trigger_beams.vpcf_c differ diff --git a/particles/custom/saber_trigger_body_glow.vpcf_c b/particles/custom/saber_trigger_body_glow.vpcf_c new file mode 100755 index 0000000..0e4b6e6 Binary files /dev/null and b/particles/custom/saber_trigger_body_glow.vpcf_c differ diff --git a/particles/custom/saber_trigger_body_glow_detail.vpcf_c b/particles/custom/saber_trigger_body_glow_detail.vpcf_c new file mode 100755 index 0000000..a18bbd0 Binary files /dev/null and b/particles/custom/saber_trigger_body_glow_detail.vpcf_c differ diff --git a/particles/custom/saber_trigger_body_glow_loadout.vpcf_c b/particles/custom/saber_trigger_body_glow_loadout.vpcf_c new file mode 100755 index 0000000..eb90792 Binary files /dev/null and b/particles/custom/saber_trigger_body_glow_loadout.vpcf_c differ diff --git a/particles/custom/saber_trigger_dark.vpcf_c b/particles/custom/saber_trigger_dark.vpcf_c new file mode 100755 index 0000000..0532c82 Binary files /dev/null and b/particles/custom/saber_trigger_dark.vpcf_c differ diff --git a/particles/custom/saber_trigger_elec.vpcf_c b/particles/custom/saber_trigger_elec.vpcf_c new file mode 100755 index 0000000..17542a0 Binary files /dev/null and b/particles/custom/saber_trigger_elec.vpcf_c differ diff --git a/particles/custom/saber_trigger_elec_loadout.vpcf_c b/particles/custom/saber_trigger_elec_loadout.vpcf_c new file mode 100755 index 0000000..ee03ad9 Binary files /dev/null and b/particles/custom/saber_trigger_elec_loadout.vpcf_c differ diff --git a/particles/custom/saber_trigger_ground.vpcf_c b/particles/custom/saber_trigger_ground.vpcf_c new file mode 100755 index 0000000..20665ca Binary files /dev/null and b/particles/custom/saber_trigger_ground.vpcf_c differ diff --git a/particles/custom/saber_trigger_ground_cracks.vpcf_c b/particles/custom/saber_trigger_ground_cracks.vpcf_c new file mode 100755 index 0000000..b8e0f99 Binary files /dev/null and b/particles/custom/saber_trigger_ground_cracks.vpcf_c differ diff --git a/particles/custom/saber_trigger_ground_lvl4_burst.vpcf_c b/particles/custom/saber_trigger_ground_lvl4_burst.vpcf_c new file mode 100755 index 0000000..92977de Binary files /dev/null and b/particles/custom/saber_trigger_ground_lvl4_burst.vpcf_c differ diff --git a/particles/custom/saber_trigger_ground_lvl5_rays.vpcf_c b/particles/custom/saber_trigger_ground_lvl5_rays.vpcf_c new file mode 100755 index 0000000..9a968ed Binary files /dev/null and b/particles/custom/saber_trigger_ground_lvl5_rays.vpcf_c differ diff --git a/particles/custom/saber_trigger_ground_mod.vpcf_c b/particles/custom/saber_trigger_ground_mod.vpcf_c new file mode 100755 index 0000000..484ca2e Binary files /dev/null and b/particles/custom/saber_trigger_ground_mod.vpcf_c differ diff --git a/particles/custom/saber_trigger_ground_symbol.vpcf_c b/particles/custom/saber_trigger_ground_symbol.vpcf_c new file mode 100755 index 0000000..b085546 Binary files /dev/null and b/particles/custom/saber_trigger_ground_symbol.vpcf_c differ diff --git a/particles/custom/saber_trigger_ground_symbol_add.vpcf_c b/particles/custom/saber_trigger_ground_symbol_add.vpcf_c new file mode 100755 index 0000000..60213df Binary files /dev/null and b/particles/custom/saber_trigger_ground_symbol_add.vpcf_c differ diff --git a/particles/custom/saber_trigger_ground_symbol_bonus.vpcf_c b/particles/custom/saber_trigger_ground_symbol_bonus.vpcf_c new file mode 100755 index 0000000..c0b329c Binary files /dev/null and b/particles/custom/saber_trigger_ground_symbol_bonus.vpcf_c differ diff --git a/particles/custom/saber_trigger_ground_symbol_bonus_add.vpcf_c b/particles/custom/saber_trigger_ground_symbol_bonus_add.vpcf_c new file mode 100755 index 0000000..369231a Binary files /dev/null and b/particles/custom/saber_trigger_ground_symbol_bonus_add.vpcf_c differ diff --git a/particles/custom/saber_trigger_ground_symbol_face_add.vpcf_c b/particles/custom/saber_trigger_ground_symbol_face_add.vpcf_c new file mode 100755 index 0000000..ef99799 Binary files /dev/null and b/particles/custom/saber_trigger_ground_symbol_face_add.vpcf_c differ diff --git a/particles/custom/saber_trigger_head.vpcf_c b/particles/custom/saber_trigger_head.vpcf_c new file mode 100755 index 0000000..589b1ee Binary files /dev/null and b/particles/custom/saber_trigger_head.vpcf_c differ diff --git a/particles/custom/saber_trigger_head_burst.vpcf_c b/particles/custom/saber_trigger_head_burst.vpcf_c new file mode 100755 index 0000000..d6bb35b Binary files /dev/null and b/particles/custom/saber_trigger_head_burst.vpcf_c differ diff --git a/particles/custom/saber_trigger_head_streak.vpcf_c b/particles/custom/saber_trigger_head_streak.vpcf_c new file mode 100755 index 0000000..f52fc2e Binary files /dev/null and b/particles/custom/saber_trigger_head_streak.vpcf_c differ diff --git a/particles/custom/saber_trigger_radiance.vpcf_c b/particles/custom/saber_trigger_radiance.vpcf_c new file mode 100755 index 0000000..4bbd32f Binary files /dev/null and b/particles/custom/saber_trigger_radiance.vpcf_c differ diff --git a/particles/custom/saber_trigger_shockwave.vpcf_c b/particles/custom/saber_trigger_shockwave.vpcf_c new file mode 100755 index 0000000..e79f7be Binary files /dev/null and b/particles/custom/saber_trigger_shockwave.vpcf_c differ diff --git a/particles/custom/saber_trigger_sky_beam.vpcf_c b/particles/custom/saber_trigger_sky_beam.vpcf_c new file mode 100755 index 0000000..0225dc4 Binary files /dev/null and b/particles/custom/saber_trigger_sky_beam.vpcf_c differ diff --git a/particles/custom/saber_trigger_sphere.vpcf_c b/particles/custom/saber_trigger_sphere.vpcf_c new file mode 100755 index 0000000..7a8bcba Binary files /dev/null and b/particles/custom/saber_trigger_sphere.vpcf_c differ diff --git a/particles/custom/saber_trigger_sphere_burst.vpcf_c b/particles/custom/saber_trigger_sphere_burst.vpcf_c new file mode 100755 index 0000000..ef1ac46 Binary files /dev/null and b/particles/custom/saber_trigger_sphere_burst.vpcf_c differ diff --git a/particles/custom/sabersakura_blade_fury_abyssal_cyclone.vpcf_c b/particles/custom/sabersakura_blade_fury_abyssal_cyclone.vpcf_c new file mode 100755 index 0000000..ffbcad8 Binary files /dev/null and b/particles/custom/sabersakura_blade_fury_abyssal_cyclone.vpcf_c differ diff --git a/particles/custom/sakura_floor.vpcf_c b/particles/custom/sakura_floor.vpcf_c new file mode 100755 index 0000000..a5e849d Binary files /dev/null and b/particles/custom/sakura_floor.vpcf_c differ diff --git a/particles/dac/ansha/death_black_steam.vpcf_c b/particles/dac/ansha/death_black_steam.vpcf_c new file mode 100755 index 0000000..42bee05 Binary files /dev/null and b/particles/dac/ansha/death_black_steam.vpcf_c differ diff --git a/particles/dac/ansha/death_elec_long.vpcf_c b/particles/dac/ansha/death_elec_long.vpcf_c new file mode 100755 index 0000000..5602d4c Binary files /dev/null and b/particles/dac/ansha/death_elec_long.vpcf_c differ diff --git a/particles/dac/ansha/death_streak.vpcf_c b/particles/dac/ansha/death_streak.vpcf_c new file mode 100755 index 0000000..53d9b74 Binary files /dev/null and b/particles/dac/ansha/death_streak.vpcf_c differ diff --git a/particles/dac/ansha/loadout.vpcf_c b/particles/dac/ansha/loadout.vpcf_c new file mode 100755 index 0000000..72854ed Binary files /dev/null and b/particles/dac/ansha/loadout.vpcf_c differ diff --git a/particles/dac/ansha/loadout_ps_disk_start.vpcf_c b/particles/dac/ansha/loadout_ps_disk_start.vpcf_c new file mode 100755 index 0000000..30bd864 Binary files /dev/null and b/particles/dac/ansha/loadout_ps_disk_start.vpcf_c differ diff --git a/particles/dac/ansha/phantom_strike_disk_lines.vpcf_c b/particles/dac/ansha/phantom_strike_disk_lines.vpcf_c new file mode 100755 index 0000000..e07cfc2 Binary files /dev/null and b/particles/dac/ansha/phantom_strike_disk_lines.vpcf_c differ diff --git a/particles/dac/ansha/phantom_strike_disk_ring.vpcf_c b/particles/dac/ansha/phantom_strike_disk_ring.vpcf_c new file mode 100755 index 0000000..fef1f74 Binary files /dev/null and b/particles/dac/ansha/phantom_strike_disk_ring.vpcf_c differ diff --git a/particles/dac/ansha/phantom_strike_disk_ring_black_start.vpcf_c b/particles/dac/ansha/phantom_strike_disk_ring_black_start.vpcf_c new file mode 100755 index 0000000..87edc2e Binary files /dev/null and b/particles/dac/ansha/phantom_strike_disk_ring_black_start.vpcf_c differ diff --git a/particles/dac/ansha/phantom_strike_disk_steam.vpcf_c b/particles/dac/ansha/phantom_strike_disk_steam.vpcf_c new file mode 100755 index 0000000..5bac88c Binary files /dev/null and b/particles/dac/ansha/phantom_strike_disk_steam.vpcf_c differ diff --git a/particles/dac/explode/boom_light_and_shake.vpcf_c b/particles/dac/explode/boom_light_and_shake.vpcf_c new file mode 100755 index 0000000..78b513b Binary files /dev/null and b/particles/dac/explode/boom_light_and_shake.vpcf_c differ diff --git a/particles/dac/explode/land_mine_ball_explosion.vpcf_c b/particles/dac/explode/land_mine_ball_explosion.vpcf_c new file mode 100755 index 0000000..30b22f7 Binary files /dev/null and b/particles/dac/explode/land_mine_ball_explosion.vpcf_c differ diff --git a/particles/dac/explode/land_mine_explode.vpcf_c b/particles/dac/explode/land_mine_explode.vpcf_c new file mode 100755 index 0000000..7231c71 Binary files /dev/null and b/particles/dac/explode/land_mine_explode.vpcf_c differ diff --git a/particles/dac/explode/land_mine_explode_flek.vpcf_c b/particles/dac/explode/land_mine_explode_flek.vpcf_c new file mode 100755 index 0000000..2d194f6 Binary files /dev/null and b/particles/dac/explode/land_mine_explode_flek.vpcf_c differ diff --git a/particles/dac/explode/land_mine_explode_halfdamge.vpcf_c b/particles/dac/explode/land_mine_explode_halfdamge.vpcf_c new file mode 100755 index 0000000..6722e8d Binary files /dev/null and b/particles/dac/explode/land_mine_explode_halfdamge.vpcf_c differ diff --git a/particles/dac/explode/land_mine_explode_streak.vpcf_c b/particles/dac/explode/land_mine_explode_streak.vpcf_c new file mode 100755 index 0000000..09e9c05 Binary files /dev/null and b/particles/dac/explode/land_mine_explode_streak.vpcf_c differ diff --git a/particles/dac/explode/land_mine_ground_flare.vpcf_c b/particles/dac/explode/land_mine_ground_flare.vpcf_c new file mode 100755 index 0000000..bb905c6 Binary files /dev/null and b/particles/dac/explode/land_mine_ground_flare.vpcf_c differ diff --git a/particles/dac/explode/land_mine_ground_scortch.vpcf_c b/particles/dac/explode/land_mine_ground_scortch.vpcf_c new file mode 100755 index 0000000..4628bda Binary files /dev/null and b/particles/dac/explode/land_mine_ground_scortch.vpcf_c differ diff --git a/particles/dac/explode/land_mine_groundscortch_sfull.vpcf_c b/particles/dac/explode/land_mine_groundscortch_sfull.vpcf_c new file mode 100755 index 0000000..f1d934b Binary files /dev/null and b/particles/dac/explode/land_mine_groundscortch_sfull.vpcf_c differ diff --git a/particles/dac/explode/land_mine_sparks.vpcf_c b/particles/dac/explode/land_mine_sparks.vpcf_c new file mode 100755 index 0000000..3a7e379 Binary files /dev/null and b/particles/dac/explode/land_mine_sparks.vpcf_c differ diff --git a/particles/dac/jingzhixianjingbeams_ambient_c.vpcf_c b/particles/dac/jingzhixianjingbeams_ambient_c.vpcf_c new file mode 100755 index 0000000..96ab241 Binary files /dev/null and b/particles/dac/jingzhixianjingbeams_ambient_c.vpcf_c differ diff --git a/particles/dac/jingzhixianjingplant_elec.vpcf_c b/particles/dac/jingzhixianjingplant_elec.vpcf_c new file mode 100755 index 0000000..01ed560 Binary files /dev/null and b/particles/dac/jingzhixianjingplant_elec.vpcf_c differ diff --git a/particles/dac/jingzhixianjingplant_elec_rad.vpcf_c b/particles/dac/jingzhixianjingplant_elec_rad.vpcf_c new file mode 100755 index 0000000..486d454 Binary files /dev/null and b/particles/dac/jingzhixianjingplant_elec_rad.vpcf_c differ diff --git a/particles/dac/jingzhixianjingplant_elec_radwall.vpcf_c b/particles/dac/jingzhixianjingplant_elec_radwall.vpcf_c new file mode 100755 index 0000000..0db6edb Binary files /dev/null and b/particles/dac/jingzhixianjingplant_elec_radwall.vpcf_c differ diff --git a/particles/dac/jingzhixianjingplant_ground_disturb.vpcf_c b/particles/dac/jingzhixianjingplant_ground_disturb.vpcf_c new file mode 100755 index 0000000..22329f0 Binary files /dev/null and b/particles/dac/jingzhixianjingplant_ground_disturb.vpcf_c differ diff --git a/particles/dac/zhayaotong/zhayaotong.vpcf_c b/particles/dac/zhayaotong/zhayaotong.vpcf_c new file mode 100755 index 0000000..c482683 Binary files /dev/null and b/particles/dac/zhayaotong/zhayaotong.vpcf_c differ diff --git a/particles/dac/zhayaotong/zhayaotong_fire.vpcf_c b/particles/dac/zhayaotong/zhayaotong_fire.vpcf_c new file mode 100755 index 0000000..e9c95f1 Binary files /dev/null and b/particles/dac/zhayaotong/zhayaotong_fire.vpcf_c differ diff --git a/particles/dac/zhayaotong/zhayaotong_fire_smallmoketrail.vpcf_c b/particles/dac/zhayaotong/zhayaotong_fire_smallmoketrail.vpcf_c new file mode 100755 index 0000000..dbc62f6 Binary files /dev/null and b/particles/dac/zhayaotong/zhayaotong_fire_smallmoketrail.vpcf_c differ diff --git a/particles/dac/zhayaotong/zhayaotong_fire_smalls_explosion_fingers.vpcf_c b/particles/dac/zhayaotong/zhayaotong_fire_smalls_explosion_fingers.vpcf_c new file mode 100755 index 0000000..2a48a20 Binary files /dev/null and b/particles/dac/zhayaotong/zhayaotong_fire_smalls_explosion_fingers.vpcf_c differ diff --git a/particles/dac/zhayaotong/zhayaotong_fluidlarge.vpcf_c b/particles/dac/zhayaotong/zhayaotong_fluidlarge.vpcf_c new file mode 100755 index 0000000..7b5028b Binary files /dev/null and b/particles/dac/zhayaotong/zhayaotong_fluidlarge.vpcf_c differ diff --git a/particles/dac/zhayaotong/zhayaotong_groundburn.vpcf_c b/particles/dac/zhayaotong/zhayaotong_groundburn.vpcf_c new file mode 100755 index 0000000..f8f2fb0 Binary files /dev/null and b/particles/dac/zhayaotong/zhayaotong_groundburn.vpcf_c differ diff --git a/particles/dac/zhayaotong/zhayaotong_ringmodel.vpcf_c b/particles/dac/zhayaotong/zhayaotong_ringmodel.vpcf_c new file mode 100755 index 0000000..9d71e4e Binary files /dev/null and b/particles/dac/zhayaotong/zhayaotong_ringmodel.vpcf_c differ diff --git a/particles/dac/zhayaotong/zhayaotong_sparks.vpcf_c b/particles/dac/zhayaotong/zhayaotong_sparks.vpcf_c new file mode 100755 index 0000000..102298f Binary files /dev/null and b/particles/dac/zhayaotong/zhayaotong_sparks.vpcf_c differ diff --git a/particles/dac/zhayaotong/zhayaotong_streak.vpcf_c b/particles/dac/zhayaotong/zhayaotong_streak.vpcf_c new file mode 100755 index 0000000..0d6b8c6 Binary files /dev/null and b/particles/dac/zhayaotong/zhayaotong_streak.vpcf_c differ diff --git a/particles/dac/zhayaotong/zhayaotong_streak_hard.vpcf_c b/particles/dac/zhayaotong/zhayaotong_streak_hard.vpcf_c new file mode 100755 index 0000000..766d455 Binary files /dev/null and b/particles/dac/zhayaotong/zhayaotong_streak_hard.vpcf_c differ diff --git a/particles/dzz/qingshanjiansheng_yjzcs.vpcf_c b/particles/dzz/qingshanjiansheng_yjzcs.vpcf_c new file mode 100755 index 0000000..b003f0f Binary files /dev/null and b/particles/dzz/qingshanjiansheng_yjzcs.vpcf_c differ diff --git a/particles/dzz/qingshanjiansheng_yjzcs_sparks.vpcf_c b/particles/dzz/qingshanjiansheng_yjzcs_sparks.vpcf_c new file mode 100755 index 0000000..e5d8739 Binary files /dev/null and b/particles/dzz/qingshanjiansheng_yjzcs_sparks.vpcf_c differ diff --git a/particles/dzz/qingshanjiansheng_yjzcs_sword.vpcf_c b/particles/dzz/qingshanjiansheng_yjzcs_sword.vpcf_c new file mode 100755 index 0000000..c228eea Binary files /dev/null and b/particles/dzz/qingshanjiansheng_yjzcs_sword.vpcf_c differ diff --git a/particles/dzz/qingshanjiansheng_yjzcs_sword_light.vpcf_c b/particles/dzz/qingshanjiansheng_yjzcs_sword_light.vpcf_c new file mode 100755 index 0000000..8676a24 Binary files /dev/null and b/particles/dzz/qingshanjiansheng_yjzcs_sword_light.vpcf_c differ diff --git a/particles/econ/courier/courier_cluckles/courier_cluckles_ambient_rocket_sparks.vpcf_c b/particles/econ/courier/courier_cluckles/courier_cluckles_ambient_rocket_sparks.vpcf_c new file mode 100755 index 0000000..b8aba7f Binary files /dev/null and b/particles/econ/courier/courier_cluckles/courier_cluckles_ambient_rocket_sparks.vpcf_c differ diff --git a/particles/econ/courier/courier_dolfrat_and_roshinante/courier_dolfrat_and_roshinante.vpcf_c b/particles/econ/courier/courier_dolfrat_and_roshinante/courier_dolfrat_and_roshinante.vpcf_c new file mode 100755 index 0000000..3e25dd1 Binary files /dev/null and b/particles/econ/courier/courier_dolfrat_and_roshinante/courier_dolfrat_and_roshinante.vpcf_c differ diff --git a/particles/econ/courier/courier_dolfrat_and_roshinante/courier_dolfrat_and_roshinante_a.vpcf_c b/particles/econ/courier/courier_dolfrat_and_roshinante/courier_dolfrat_and_roshinante_a.vpcf_c new file mode 100755 index 0000000..b133117 Binary files /dev/null and b/particles/econ/courier/courier_dolfrat_and_roshinante/courier_dolfrat_and_roshinante_a.vpcf_c differ diff --git a/particles/econ/courier/courier_dolfrat_and_roshinante/courier_dolfrat_and_roshinante_b.vpcf_c b/particles/econ/courier/courier_dolfrat_and_roshinante/courier_dolfrat_and_roshinante_b.vpcf_c new file mode 100755 index 0000000..8f93fcf Binary files /dev/null and b/particles/econ/courier/courier_dolfrat_and_roshinante/courier_dolfrat_and_roshinante_b.vpcf_c differ diff --git a/particles/econ/courier/courier_dolfrat_and_roshinante/courier_dolfrat_and_roshinante_c.vpcf_c b/particles/econ/courier/courier_dolfrat_and_roshinante/courier_dolfrat_and_roshinante_c.vpcf_c new file mode 100755 index 0000000..2b7ccb8 Binary files /dev/null and b/particles/econ/courier/courier_dolfrat_and_roshinante/courier_dolfrat_and_roshinante_c.vpcf_c differ diff --git a/particles/econ/courier/courier_eye_glow_02/courier_eye_glow_02a.vpcf_c b/particles/econ/courier/courier_eye_glow_02/courier_eye_glow_02a.vpcf_c new file mode 100755 index 0000000..6cc8770 Binary files /dev/null and b/particles/econ/courier/courier_eye_glow_02/courier_eye_glow_02a.vpcf_c differ diff --git a/particles/econ/courier/courier_eye_glow_02/courier_eye_glow_02b.vpcf_c b/particles/econ/courier/courier_eye_glow_02/courier_eye_glow_02b.vpcf_c new file mode 100755 index 0000000..49e8d22 Binary files /dev/null and b/particles/econ/courier/courier_eye_glow_02/courier_eye_glow_02b.vpcf_c differ diff --git a/particles/econ/courier/courier_eye_glow_02/courier_eye_glow_02c.vpcf_c b/particles/econ/courier/courier_eye_glow_02/courier_eye_glow_02c.vpcf_c new file mode 100755 index 0000000..2e665b6 Binary files /dev/null and b/particles/econ/courier/courier_eye_glow_02/courier_eye_glow_02c.vpcf_c differ diff --git a/particles/econ/courier/courier_eye_glow_02/courier_eye_glow_02e.vpcf_c b/particles/econ/courier/courier_eye_glow_02/courier_eye_glow_02e.vpcf_c new file mode 100755 index 0000000..a0eed4b Binary files /dev/null and b/particles/econ/courier/courier_eye_glow_02/courier_eye_glow_02e.vpcf_c differ diff --git a/particles/econ/courier/courier_greevil_black/courier_greevil_black_ambient_2_a.vpcf_c b/particles/econ/courier/courier_greevil_black/courier_greevil_black_ambient_2_a.vpcf_c new file mode 100755 index 0000000..a01da51 Binary files /dev/null and b/particles/econ/courier/courier_greevil_black/courier_greevil_black_ambient_2_a.vpcf_c differ diff --git a/particles/econ/courier/courier_greevil_black/courier_greevil_black_ambient_2_b.vpcf_c b/particles/econ/courier/courier_greevil_black/courier_greevil_black_ambient_2_b.vpcf_c new file mode 100755 index 0000000..5d9ef17 Binary files /dev/null and b/particles/econ/courier/courier_greevil_black/courier_greevil_black_ambient_2_b.vpcf_c differ diff --git a/particles/econ/courier/courier_greevil_black/courier_greevil_black_ambient_2_c.vpcf_c b/particles/econ/courier/courier_greevil_black/courier_greevil_black_ambient_2_c.vpcf_c new file mode 100755 index 0000000..98b929c Binary files /dev/null and b/particles/econ/courier/courier_greevil_black/courier_greevil_black_ambient_2_c.vpcf_c differ diff --git a/particles/econ/courier/courier_greevil_white/courier_greevil_white_ambient_2_c.vpcf_c b/particles/econ/courier/courier_greevil_white/courier_greevil_white_ambient_2_c.vpcf_c new file mode 100755 index 0000000..4519a34 Binary files /dev/null and b/particles/econ/courier/courier_greevil_white/courier_greevil_white_ambient_2_c.vpcf_c differ diff --git a/particles/econ/courier/courier_snail/courier_snail_ambient_rocket_sparks.vpcf_c b/particles/econ/courier/courier_snail/courier_snail_ambient_rocket_sparks.vpcf_c new file mode 100755 index 0000000..f42215f Binary files /dev/null and b/particles/econ/courier/courier_snail/courier_snail_ambient_rocket_sparks.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_end_h_ti4.vpcf_c b/particles/econ/events/ti4/teleport_end_h_ti4.vpcf_c new file mode 100755 index 0000000..54b3501 Binary files /dev/null and b/particles/econ/events/ti4/teleport_end_h_ti4.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_end_i_ti4.vpcf_c b/particles/econ/events/ti4/teleport_end_i_ti4.vpcf_c new file mode 100755 index 0000000..155508e Binary files /dev/null and b/particles/econ/events/ti4/teleport_end_i_ti4.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_end_playercolor_ti4.vpcf_c b/particles/econ/events/ti4/teleport_end_playercolor_ti4.vpcf_c new file mode 100755 index 0000000..81a7d88 Binary files /dev/null and b/particles/econ/events/ti4/teleport_end_playercolor_ti4.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_end_ti4.vpcf_c b/particles/econ/events/ti4/teleport_end_ti4.vpcf_c new file mode 100755 index 0000000..957f544 Binary files /dev/null and b/particles/econ/events/ti4/teleport_end_ti4.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_end_tube_ti4.vpcf_c b/particles/econ/events/ti4/teleport_end_tube_ti4.vpcf_c new file mode 100755 index 0000000..35db06e Binary files /dev/null and b/particles/econ/events/ti4/teleport_end_tube_ti4.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_end_volume_core_ti4.vpcf_c b/particles/econ/events/ti4/teleport_end_volume_core_ti4.vpcf_c new file mode 100755 index 0000000..8c050e6 Binary files /dev/null and b/particles/econ/events/ti4/teleport_end_volume_core_ti4.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_start_c_ti4.vpcf_c b/particles/econ/events/ti4/teleport_start_c_ti4.vpcf_c new file mode 100755 index 0000000..d2f5d43 Binary files /dev/null and b/particles/econ/events/ti4/teleport_start_c_ti4.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_start_d_ti4.vpcf_c b/particles/econ/events/ti4/teleport_start_d_ti4.vpcf_c new file mode 100755 index 0000000..84951be Binary files /dev/null and b/particles/econ/events/ti4/teleport_start_d_ti4.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_start_d_ti4_b.vpcf_c b/particles/econ/events/ti4/teleport_start_d_ti4_b.vpcf_c new file mode 100755 index 0000000..d50ecad Binary files /dev/null and b/particles/econ/events/ti4/teleport_start_d_ti4_b.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_start_d_ti4_c.vpcf_c b/particles/econ/events/ti4/teleport_start_d_ti4_c.vpcf_c new file mode 100755 index 0000000..4f863e4 Binary files /dev/null and b/particles/econ/events/ti4/teleport_start_d_ti4_c.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_start_h_ti4.vpcf_c b/particles/econ/events/ti4/teleport_start_h_ti4.vpcf_c new file mode 100755 index 0000000..1a911df Binary files /dev/null and b/particles/econ/events/ti4/teleport_start_h_ti4.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_start_i_ti4.vpcf_c b/particles/econ/events/ti4/teleport_start_i_ti4.vpcf_c new file mode 100755 index 0000000..55510eb Binary files /dev/null and b/particles/econ/events/ti4/teleport_start_i_ti4.vpcf_c differ diff --git a/particles/econ/events/ti4/teleport_start_n_endcap_ti4.vpcf_c b/particles/econ/events/ti4/teleport_start_n_endcap_ti4.vpcf_c new file mode 100755 index 0000000..4d17b51 Binary files /dev/null and b/particles/econ/events/ti4/teleport_start_n_endcap_ti4.vpcf_c differ diff --git a/particles/econ/items/death_prophet/death_prophet_acherontia/death_prophet_acher_swarm.vpcf_c b/particles/econ/items/death_prophet/death_prophet_acherontia/death_prophet_acher_swarm.vpcf_c new file mode 100755 index 0000000..c27c744 Binary files /dev/null and b/particles/econ/items/death_prophet/death_prophet_acherontia/death_prophet_acher_swarm.vpcf_c differ diff --git a/particles/econ/items/death_prophet/death_prophet_acherontia/death_prophet_acher_swarm_blots.vpcf_c b/particles/econ/items/death_prophet/death_prophet_acherontia/death_prophet_acher_swarm_blots.vpcf_c new file mode 100755 index 0000000..0a0290b Binary files /dev/null and b/particles/econ/items/death_prophet/death_prophet_acherontia/death_prophet_acher_swarm_blots.vpcf_c differ diff --git a/particles/econ/items/gyrocopter/hero_gyrocopter_gyrotechnics/gyro_guided_missile_target.vpcf_c b/particles/econ/items/gyrocopter/hero_gyrocopter_gyrotechnics/gyro_guided_missile_target.vpcf_c new file mode 100755 index 0000000..2a802a2 Binary files /dev/null and b/particles/econ/items/gyrocopter/hero_gyrocopter_gyrotechnics/gyro_guided_missile_target.vpcf_c differ diff --git a/particles/econ/items/gyrocopter/hero_gyrocopter_gyrotechnics/gyro_guided_missile_target_b.vpcf_c b/particles/econ/items/gyrocopter/hero_gyrocopter_gyrotechnics/gyro_guided_missile_target_b.vpcf_c new file mode 100755 index 0000000..1738a45 Binary files /dev/null and b/particles/econ/items/gyrocopter/hero_gyrocopter_gyrotechnics/gyro_guided_missile_target_b.vpcf_c differ diff --git a/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_armor_of_the_favorite_crit.vpcf_c b/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_armor_of_the_favorite_crit.vpcf_c new file mode 100755 index 0000000..1848f83 Binary files /dev/null and b/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_armor_of_the_favorite_crit.vpcf_c differ diff --git a/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_blade_fury_favoriteblade.vpcf_c b/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_blade_fury_favoriteblade.vpcf_c new file mode 100755 index 0000000..b51d2a5 Binary files /dev/null and b/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_blade_fury_favoriteblade.vpcf_c differ diff --git a/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_favorite_body_ambient.vpcf_c b/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_favorite_body_ambient.vpcf_c new file mode 100755 index 0000000..3b28778 Binary files /dev/null and b/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_favorite_body_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_favorite_eyes.vpcf_c b/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_favorite_eyes.vpcf_c new file mode 100755 index 0000000..d071706 Binary files /dev/null and b/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_favorite_eyes.vpcf_c differ diff --git a/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_favorite_shoulder_ambient.vpcf_c b/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_favorite_shoulder_ambient.vpcf_c new file mode 100755 index 0000000..951286e Binary files /dev/null and b/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_favorite_shoulder_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_favorite_weapon.vpcf_c b/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_favorite_weapon.vpcf_c new file mode 100755 index 0000000..2416457 Binary files /dev/null and b/particles/econ/items/juggernaut/armor_of_the_favorite/juggernaut_favorite_weapon.vpcf_c differ diff --git a/particles/econ/items/juggernaut/bladekeeper_bladefury/_dc_juggernaut_blade_fury.vpcf_c b/particles/econ/items/juggernaut/bladekeeper_bladefury/_dc_juggernaut_blade_fury.vpcf_c new file mode 100755 index 0000000..f717a19 Binary files /dev/null and b/particles/econ/items/juggernaut/bladekeeper_bladefury/_dc_juggernaut_blade_fury.vpcf_c differ diff --git a/particles/econ/items/juggernaut/bladekeeper_headglow/dc_juggernaut_bladekeeper_head.vpcf_c b/particles/econ/items/juggernaut/bladekeeper_headglow/dc_juggernaut_bladekeeper_head.vpcf_c new file mode 100755 index 0000000..7832a6a Binary files /dev/null and b/particles/econ/items/juggernaut/bladekeeper_headglow/dc_juggernaut_bladekeeper_head.vpcf_c differ diff --git a/particles/econ/items/juggernaut/bladekeeper_healing_ward/juggernaut_healing_ward_eruption_dc.vpcf_c b/particles/econ/items/juggernaut/bladekeeper_healing_ward/juggernaut_healing_ward_eruption_dc.vpcf_c new file mode 100755 index 0000000..b67eba0 Binary files /dev/null and b/particles/econ/items/juggernaut/bladekeeper_healing_ward/juggernaut_healing_ward_eruption_dc.vpcf_c differ diff --git a/particles/econ/items/juggernaut/bladekeeper_omnislash/_dc_juggernaut_omni_slash_tgt.vpcf_c b/particles/econ/items/juggernaut/bladekeeper_omnislash/_dc_juggernaut_omni_slash_tgt.vpcf_c new file mode 100755 index 0000000..0e1d510 Binary files /dev/null and b/particles/econ/items/juggernaut/bladekeeper_omnislash/_dc_juggernaut_omni_slash_tgt.vpcf_c differ diff --git a/particles/econ/items/juggernaut/bladekeeper_omnislash/_dc_juggernaut_omni_slash_trail.vpcf_c b/particles/econ/items/juggernaut/bladekeeper_omnislash/_dc_juggernaut_omni_slash_trail.vpcf_c new file mode 100755 index 0000000..bf28fd6 Binary files /dev/null and b/particles/econ/items/juggernaut/bladekeeper_omnislash/_dc_juggernaut_omni_slash_trail.vpcf_c differ diff --git a/particles/econ/items/juggernaut/bladekeeper_swordglow/dc_juggernaut_blade.vpcf_c b/particles/econ/items/juggernaut/bladekeeper_swordglow/dc_juggernaut_blade.vpcf_c new file mode 100755 index 0000000..9dcbc1e Binary files /dev/null and b/particles/econ/items/juggernaut/bladekeeper_swordglow/dc_juggernaut_blade.vpcf_c differ diff --git a/particles/econ/items/juggernaut/highplains_sword_longfang/jugg_weapon_glow_variation_longfang.vpcf_c b/particles/econ/items/juggernaut/highplains_sword_longfang/jugg_weapon_glow_variation_longfang.vpcf_c new file mode 100755 index 0000000..5b4f220 Binary files /dev/null and b/particles/econ/items/juggernaut/highplains_sword_longfang/jugg_weapon_glow_variation_longfang.vpcf_c differ diff --git a/particles/econ/items/juggernaut/highplains_sword_longfang/juggernaut_blade_fury_longfang_b.vpcf_c b/particles/econ/items/juggernaut/highplains_sword_longfang/juggernaut_blade_fury_longfang_b.vpcf_c new file mode 100755 index 0000000..5c3627b Binary files /dev/null and b/particles/econ/items/juggernaut/highplains_sword_longfang/juggernaut_blade_fury_longfang_b.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/jugg_arcana_crit_blur.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/jugg_arcana_crit_blur.vpcf_c new file mode 100755 index 0000000..c6767c4 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/jugg_arcana_crit_blur.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/jugg_arcana_haste.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/jugg_arcana_haste.vpcf_c new file mode 100755 index 0000000..711f662 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/jugg_arcana_haste.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/jugg_arcana_v2_crit_blur.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/jugg_arcana_v2_crit_blur.vpcf_c new file mode 100755 index 0000000..549cb6f Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/jugg_arcana_v2_crit_blur.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_ambient.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_ambient.vpcf_c new file mode 100755 index 0000000..df62dd7 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_blade_fury.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_blade_fury.vpcf_c new file mode 100755 index 0000000..9248ba9 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_blade_fury.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_body_ambient.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_body_ambient.vpcf_c new file mode 100755 index 0000000..00a7592 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_body_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_counter.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_counter.vpcf_c new file mode 100755 index 0000000..79087a5 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_counter.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_crit_tgt.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_crit_tgt.vpcf_c new file mode 100755 index 0000000..2684e08 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_crit_tgt.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_death_model.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_death_model.vpcf_c new file mode 100755 index 0000000..09125c0 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_death_model.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_idle_rare.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_idle_rare.vpcf_c new file mode 100755 index 0000000..c3cc014 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_idle_rare.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_loadout_rare_model.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_loadout_rare_model.vpcf_c new file mode 100755 index 0000000..5cf9713 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_loadout_rare_model.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_dash.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_dash.vpcf_c new file mode 100755 index 0000000..dfd2b7f Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_dash.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_end.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_end.vpcf_c new file mode 100755 index 0000000..7661b1b Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_end.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_tgt.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_tgt.vpcf_c new file mode 100755 index 0000000..79eb930 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_tgt.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_tgt_bladekeeper.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_tgt_bladekeeper.vpcf_c new file mode 100755 index 0000000..26d76aa Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_tgt_bladekeeper.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_tgt_bonus.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_tgt_bonus.vpcf_c new file mode 100755 index 0000000..e94aa99 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_tgt_bonus.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_tgt_serrakura.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_tgt_serrakura.vpcf_c new file mode 100755 index 0000000..bbca2be Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_tgt_serrakura.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_trail.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_trail.vpcf_c new file mode 100755 index 0000000..255706d Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_trail.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_trail_bladekeeper.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_trail_bladekeeper.vpcf_c new file mode 100755 index 0000000..2398878 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_trail_bladekeeper.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_trail_serrakura.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_trail_serrakura.vpcf_c new file mode 100755 index 0000000..97d3b44 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_omni_slash_trail_serrakura.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_teleport_end_model.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_teleport_end_model.vpcf_c new file mode 100755 index 0000000..86de812 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_teleport_end_model.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_teleport_model.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_teleport_model.vpcf_c new file mode 100755 index 0000000..a80ea35 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_teleport_model.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_trigger.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_trigger.vpcf_c new file mode 100755 index 0000000..2db532c Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_trigger.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_trigger_loadout.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_trigger_loadout.vpcf_c new file mode 100755 index 0000000..6fbfca6 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_trigger_loadout.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_ambient.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_ambient.vpcf_c new file mode 100755 index 0000000..9745777 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_blade_fury.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_blade_fury.vpcf_c new file mode 100755 index 0000000..a324f11 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_blade_fury.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_body_ambient.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_body_ambient.vpcf_c new file mode 100755 index 0000000..452bc39 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_body_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_crit_tgt.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_crit_tgt.vpcf_c new file mode 100755 index 0000000..0308ebe Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_crit_tgt.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_death_model.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_death_model.vpcf_c new file mode 100755 index 0000000..4a61b6c Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_death_model.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_idle_rare.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_idle_rare.vpcf_c new file mode 100755 index 0000000..d35d54c Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_idle_rare.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_loadout_rare_model.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_loadout_rare_model.vpcf_c new file mode 100755 index 0000000..9fc3b22 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_loadout_rare_model.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_dash.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_dash.vpcf_c new file mode 100755 index 0000000..0691b1c Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_dash.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_end.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_end.vpcf_c new file mode 100755 index 0000000..67069b1 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_end.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_tgt.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_tgt.vpcf_c new file mode 100755 index 0000000..6bf9c8b Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_tgt.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_tgt_bladekeeper.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_tgt_bladekeeper.vpcf_c new file mode 100755 index 0000000..9a62288 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_tgt_bladekeeper.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_tgt_serrakura.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_tgt_serrakura.vpcf_c new file mode 100755 index 0000000..a15163e Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_tgt_serrakura.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_trail.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_trail.vpcf_c new file mode 100755 index 0000000..bd8bc33 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_trail.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_trail_bladekeeper.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_trail_bladekeeper.vpcf_c new file mode 100755 index 0000000..c7d1396 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_trail_bladekeeper.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_trail_serrakura.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_trail_serrakura.vpcf_c new file mode 100755 index 0000000..f3b9b24 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_omni_slash_trail_serrakura.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_portrait_model.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_portrait_model.vpcf_c new file mode 100755 index 0000000..7395119 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_portrait_model.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_teleport_end_model.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_teleport_end_model.vpcf_c new file mode 100755 index 0000000..b0685bb Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_teleport_end_model.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_teleport_model.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_teleport_model.vpcf_c new file mode 100755 index 0000000..680e6e8 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_teleport_model.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_trigger.vpcf_c b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_trigger.vpcf_c new file mode 100755 index 0000000..d07b5fa Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_trigger.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_fortunes_tout/jugg_healing_ward_fortunes_tout_gold.vpcf_c b/particles/econ/items/juggernaut/jugg_fortunes_tout/jugg_healing_ward_fortunes_tout_gold.vpcf_c new file mode 100755 index 0000000..3fc5548 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_fortunes_tout/jugg_healing_ward_fortunes_tout_gold.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_fortunes_tout/jugg_healing_ward_fortunes_tout_ward_gold.vpcf_c b/particles/econ/items/juggernaut/jugg_fortunes_tout/jugg_healing_ward_fortunes_tout_ward_gold.vpcf_c new file mode 100755 index 0000000..8c4b5de Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_fortunes_tout/jugg_healing_ward_fortunes_tout_ward_gold.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_fortunes_tout/jugg_healling_ward_fortunes_tout_hero_heal.vpcf_c b/particles/econ/items/juggernaut/jugg_fortunes_tout/jugg_healling_ward_fortunes_tout_hero_heal.vpcf_c new file mode 100755 index 0000000..1324da9 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_fortunes_tout/jugg_healling_ward_fortunes_tout_hero_heal.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_fortunes_tout/jugg_healling_ward_fortunes_tout_ward.vpcf_c b/particles/econ/items/juggernaut/jugg_fortunes_tout/jugg_healling_ward_fortunes_tout_ward.vpcf_c new file mode 100755 index 0000000..ca6c930 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_fortunes_tout/jugg_healling_ward_fortunes_tout_ward.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_relentless_sword/juggernaut_relentless_sword_glow.vpcf_c b/particles/econ/items/juggernaut/jugg_relentless_sword/juggernaut_relentless_sword_glow.vpcf_c new file mode 100755 index 0000000..8a49471 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_relentless_sword/juggernaut_relentless_sword_glow.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_serrakura/jugg_serrakurra_ambient.vpcf_c b/particles/econ/items/juggernaut/jugg_serrakura/jugg_serrakurra_ambient.vpcf_c new file mode 100755 index 0000000..9cfb085 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_serrakura/jugg_serrakurra_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_arms_ambient.vpcf_c b/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_arms_ambient.vpcf_c new file mode 100755 index 0000000..9fc5f8e Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_arms_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_back_ambient.vpcf_c b/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_back_ambient.vpcf_c new file mode 100755 index 0000000..f1c178e Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_back_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_head_ambient.vpcf_c b/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_head_ambient.vpcf_c new file mode 100755 index 0000000..4cdb70c Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_head_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_legs_ambient.vpcf_c b/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_legs_ambient.vpcf_c new file mode 100755 index 0000000..4eac2c3 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_legs_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_weapon_ambient.vpcf_c b/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_weapon_ambient.vpcf_c new file mode 100755 index 0000000..c76682f Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_slayer/jugg_slayer_weapon_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_sword_default/jugg_weapon_glow.vpcf_c b/particles/econ/items/juggernaut/jugg_sword_default/jugg_weapon_glow.vpcf_c new file mode 100755 index 0000000..8b81248 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_sword_default/jugg_weapon_glow.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_sword_dragon/juggernaut_blade_ambient_dragon.vpcf_c b/particles/econ/items/juggernaut/jugg_sword_dragon/juggernaut_blade_ambient_dragon.vpcf_c new file mode 100755 index 0000000..d6c46ba Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_sword_dragon/juggernaut_blade_ambient_dragon.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_sword_dragon/juggernaut_blade_fury_dragon_b.vpcf_c b/particles/econ/items/juggernaut/jugg_sword_dragon/juggernaut_blade_fury_dragon_b.vpcf_c new file mode 100755 index 0000000..3c58402 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_sword_dragon/juggernaut_blade_fury_dragon_b.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_sword_fireborn_odachi/jugg_crit_blur_fb_odachi.vpcf_c b/particles/econ/items/juggernaut/jugg_sword_fireborn_odachi/jugg_crit_blur_fb_odachi.vpcf_c new file mode 100755 index 0000000..887a896 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_sword_fireborn_odachi/jugg_crit_blur_fb_odachi.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_sword_fireborn_odachi/juggernaut_blade_fury_fireborn_odachi_b.vpcf_c b/particles/econ/items/juggernaut/jugg_sword_fireborn_odachi/juggernaut_blade_fury_fireborn_odachi_b.vpcf_c new file mode 100755 index 0000000..5f27f12 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_sword_fireborn_odachi/juggernaut_blade_fury_fireborn_odachi_b.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_sword_fireborn_odachi/juggernaut_omni_slash_trail_fireborn_odachi.vpcf_c b/particles/econ/items/juggernaut/jugg_sword_fireborn_odachi/juggernaut_omni_slash_trail_fireborn_odachi.vpcf_c new file mode 100755 index 0000000..d21cf0c Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_sword_fireborn_odachi/juggernaut_omni_slash_trail_fireborn_odachi.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_sword_jade/jugg_weapon_glow_variation_jade.vpcf_c b/particles/econ/items/juggernaut/jugg_sword_jade/jugg_weapon_glow_variation_jade.vpcf_c new file mode 100755 index 0000000..747adad Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_sword_jade/jugg_weapon_glow_variation_jade.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_sword_jade/juggernaut_blade_fury_jade_b.vpcf_c b/particles/econ/items/juggernaut/jugg_sword_jade/juggernaut_blade_fury_jade_b.vpcf_c new file mode 100755 index 0000000..85c00c8 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_sword_jade/juggernaut_blade_fury_jade_b.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_sword_script/jugg_weapon_glow_variation_script.vpcf_c b/particles/econ/items/juggernaut/jugg_sword_script/jugg_weapon_glow_variation_script.vpcf_c new file mode 100755 index 0000000..8dca9c7 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_sword_script/jugg_weapon_glow_variation_script.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_sword_script/juggernaut_blade_fury_script_b.vpcf_c b/particles/econ/items/juggernaut/jugg_sword_script/juggernaut_blade_fury_script_b.vpcf_c new file mode 100755 index 0000000..0b49465 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_sword_script/juggernaut_blade_fury_script_b.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_sword_shred/juggernaut_blade_fury_shred_b.vpcf_c b/particles/econ/items/juggernaut/jugg_sword_shred/juggernaut_blade_fury_shred_b.vpcf_c new file mode 100755 index 0000000..5e43abd Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_sword_shred/juggernaut_blade_fury_shred_b.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_sword_thousand_faces/jugg_weapon_glow_thousand_faces.vpcf_c b/particles/econ/items/juggernaut/jugg_sword_thousand_faces/jugg_weapon_glow_thousand_faces.vpcf_c new file mode 100755 index 0000000..8187e71 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_sword_thousand_faces/jugg_weapon_glow_thousand_faces.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_ti8_sword/jugg_ti8_sword_ambient.vpcf_c b/particles/econ/items/juggernaut/jugg_ti8_sword/jugg_ti8_sword_ambient.vpcf_c new file mode 100755 index 0000000..026b3ad Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_ti8_sword/jugg_ti8_sword_ambient.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_ti8_sword/jugg_ti8_sword_ambient_golden.vpcf_c b/particles/econ/items/juggernaut/jugg_ti8_sword/jugg_ti8_sword_ambient_golden.vpcf_c new file mode 100755 index 0000000..abc66ad Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_ti8_sword/jugg_ti8_sword_ambient_golden.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_blade_fury_abyssal.vpcf_c b/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_blade_fury_abyssal.vpcf_c new file mode 100755 index 0000000..4182169 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_blade_fury_abyssal.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_blade_fury_abyssal_golden.vpcf_c b/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_blade_fury_abyssal_golden.vpcf_c new file mode 100755 index 0000000..b6d5a5c Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_blade_fury_abyssal_golden.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_ti8_sword_crit.vpcf_c b/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_ti8_sword_crit.vpcf_c new file mode 100755 index 0000000..0e80e72 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_ti8_sword_crit.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_ti8_sword_crit_golden.vpcf_c b/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_ti8_sword_crit_golden.vpcf_c new file mode 100755 index 0000000..1a45595 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_ti8_sword_crit_golden.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_ti8_sword_crit_overtheshoulder_golden.vpcf_c b/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_ti8_sword_crit_overtheshoulder_golden.vpcf_c new file mode 100755 index 0000000..008de0a Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_ti8_sword_crit_overtheshoulder_golden.vpcf_c differ diff --git a/particles/econ/items/juggernaut/jugg_ward_foo/juggernaut_healing_ward.vpcf_c b/particles/econ/items/juggernaut/jugg_ward_foo/juggernaut_healing_ward.vpcf_c new file mode 100755 index 0000000..0348722 Binary files /dev/null and b/particles/econ/items/juggernaut/jugg_ward_foo/juggernaut_healing_ward.vpcf_c differ diff --git a/particles/econ/items/juggernaut/lord_sword_ivory/jugg_weapon_glow_variation_ivory.vpcf_c b/particles/econ/items/juggernaut/lord_sword_ivory/jugg_weapon_glow_variation_ivory.vpcf_c new file mode 100755 index 0000000..651f059 Binary files /dev/null and b/particles/econ/items/juggernaut/lord_sword_ivory/jugg_weapon_glow_variation_ivory.vpcf_c differ diff --git a/particles/econ/items/juggernaut/lord_sword_ivory/juggernaut_blade_fury_ivory_b.vpcf_c b/particles/econ/items/juggernaut/lord_sword_ivory/juggernaut_blade_fury_ivory_b.vpcf_c new file mode 100755 index 0000000..6021057 Binary files /dev/null and b/particles/econ/items/juggernaut/lord_sword_ivory/juggernaut_blade_fury_ivory_b.vpcf_c differ diff --git a/particles/econ/items/juggernaut/nomad_sword_grand_claive/jugg_weapon_glow_variation_grand_claive.vpcf_c b/particles/econ/items/juggernaut/nomad_sword_grand_claive/jugg_weapon_glow_variation_grand_claive.vpcf_c new file mode 100755 index 0000000..9b7da54 Binary files /dev/null and b/particles/econ/items/juggernaut/nomad_sword_grand_claive/jugg_weapon_glow_variation_grand_claive.vpcf_c differ diff --git a/particles/econ/items/juggernaut/nomad_sword_grand_claive/juggernaut_blade_fury_grand_claive_b.vpcf_c b/particles/econ/items/juggernaut/nomad_sword_grand_claive/juggernaut_blade_fury_grand_claive_b.vpcf_c new file mode 100755 index 0000000..c9c7da2 Binary files /dev/null and b/particles/econ/items/juggernaut/nomad_sword_grand_claive/juggernaut_blade_fury_grand_claive_b.vpcf_c differ diff --git a/particles/econ/items/kunkka/kunkka_weapon_whaleblade/kunkka_spell_torrent_splash_whaleblade.vpcf_c b/particles/econ/items/kunkka/kunkka_weapon_whaleblade/kunkka_spell_torrent_splash_whaleblade.vpcf_c new file mode 100755 index 0000000..7a617a6 Binary files /dev/null and b/particles/econ/items/kunkka/kunkka_weapon_whaleblade/kunkka_spell_torrent_splash_whaleblade.vpcf_c differ diff --git a/particles/econ/items/legion/legion_weapon_voth_domosh/legion_commander_duel_text.vpcf_c b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_commander_duel_text.vpcf_c new file mode 100755 index 0000000..35de093 Binary files /dev/null and b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_commander_duel_text.vpcf_c differ diff --git a/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_arcana_evil.vpcf_c b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_arcana_evil.vpcf_c new file mode 100755 index 0000000..07cf908 Binary files /dev/null and b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_arcana_evil.vpcf_c differ diff --git a/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_proj_arcana_scorch.vpcf_c b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_proj_arcana_scorch.vpcf_c new file mode 100755 index 0000000..96ecedd Binary files /dev/null and b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_proj_arcana_scorch.vpcf_c differ diff --git a/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_rays_arcana.vpcf_c b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_rays_arcana.vpcf_c new file mode 100755 index 0000000..b652825 Binary files /dev/null and b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_rays_arcana.vpcf_c differ diff --git a/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_endcap_arcana.vpcf_c b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_endcap_arcana.vpcf_c new file mode 100755 index 0000000..28fc4ea Binary files /dev/null and b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_endcap_arcana.vpcf_c differ diff --git a/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_line_arcana.vpcf_c b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_line_arcana.vpcf_c new file mode 100755 index 0000000..1facb4c Binary files /dev/null and b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_line_arcana.vpcf_c differ diff --git a/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_arcana.vpcf_c b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_arcana.vpcf_c new file mode 100755 index 0000000..d2817d0 Binary files /dev/null and b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_arcana.vpcf_c differ diff --git a/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_arcana_flags.vpcf_c b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_arcana_flags.vpcf_c new file mode 100755 index 0000000..c0e36f5 Binary files /dev/null and b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_arcana_flags.vpcf_c differ diff --git a/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_arcana_hardflame.vpcf_c b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_arcana_hardflame.vpcf_c new file mode 100755 index 0000000..07d70c7 Binary files /dev/null and b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_arcana_hardflame.vpcf_c differ diff --git a/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_flash_arcana.vpcf_c b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_flash_arcana.vpcf_c new file mode 100755 index 0000000..30a5e6a Binary files /dev/null and b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_flash_arcana.vpcf_c differ diff --git a/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_rope_arcana.vpcf_c b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_rope_arcana.vpcf_c new file mode 100755 index 0000000..a7edbca Binary files /dev/null and b/particles/econ/items/legion/legion_weapon_voth_domosh/legion_duel_start_ring_rope_arcana.vpcf_c differ diff --git a/particles/econ/items/storm_spirit/storm_spirit_orchid_hat/stormspirit_orchid_ball_lightning.vpcf_c b/particles/econ/items/storm_spirit/storm_spirit_orchid_hat/stormspirit_orchid_ball_lightning.vpcf_c new file mode 100755 index 0000000..ecc713f Binary files /dev/null and b/particles/econ/items/storm_spirit/storm_spirit_orchid_hat/stormspirit_orchid_ball_lightning.vpcf_c differ diff --git a/particles/econ/items/templar_assassin/templar_assassin_weapon_scholar/templar_assassin_ambient_scholar.vpcf_c b/particles/econ/items/templar_assassin/templar_assassin_weapon_scholar/templar_assassin_ambient_scholar.vpcf_c new file mode 100755 index 0000000..a4aae75 Binary files /dev/null and b/particles/econ/items/templar_assassin/templar_assassin_weapon_scholar/templar_assassin_ambient_scholar.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet.vpcf_c new file mode 100755 index 0000000..5ede156 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_a.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_a.vpcf_c new file mode 100755 index 0000000..2177129 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_a.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_b.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_b.vpcf_c new file mode 100755 index 0000000..5e366d1 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_b.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_c.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_c.vpcf_c new file mode 100755 index 0000000..cb52a35 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_c.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_d.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_d.vpcf_c new file mode 100755 index 0000000..c53d90a Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_d.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_e.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_e.vpcf_c new file mode 100755 index 0000000..37c1d75 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_e.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f.vpcf_c new file mode 100755 index 0000000..626f3e4 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f0.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f0.vpcf_c new file mode 100755 index 0000000..7fba358 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f0.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f1.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f1.vpcf_c new file mode 100755 index 0000000..a9e2ef9 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f1.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f10.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f10.vpcf_c new file mode 100755 index 0000000..5f7e677 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f10.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f2.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f2.vpcf_c new file mode 100755 index 0000000..ef98f43 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f2.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f3.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f3.vpcf_c new file mode 100755 index 0000000..e49654a Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f3.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f4.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f4.vpcf_c new file mode 100755 index 0000000..dab3e62 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f4.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f5.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f5.vpcf_c new file mode 100755 index 0000000..0ccd191 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f5.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f5a.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f5a.vpcf_c new file mode 100755 index 0000000..8ccf5bd Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f5a.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f6.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f6.vpcf_c new file mode 100755 index 0000000..4115b63 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f6.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f7.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f7.vpcf_c new file mode 100755 index 0000000..e50c82d Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f7.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f8.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f8.vpcf_c new file mode 100755 index 0000000..8ad0422 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f8.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f9.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f9.vpcf_c new file mode 100755 index 0000000..96ca762 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_f9.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_g.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_g.vpcf_c new file mode 100755 index 0000000..4a3fb72 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_g.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_g0.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_g0.vpcf_c new file mode 100755 index 0000000..8caf34e Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_g0.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_h.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_h.vpcf_c new file mode 100755 index 0000000..78306bd Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_h.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_h0.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_h0.vpcf_c new file mode 100755 index 0000000..f0f316e Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_h0.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_i.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_i.vpcf_c new file mode 100755 index 0000000..0f5ef5a Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_i.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_i0.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_i0.vpcf_c new file mode 100755 index 0000000..923a6be Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_i0.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_j.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_j.vpcf_c new file mode 100755 index 0000000..842cc8c Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_j.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_k.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_k.vpcf_c new file mode 100755 index 0000000..3748b85 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_k.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_l.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_l.vpcf_c new file mode 100755 index 0000000..d143b48 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_l.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_m.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_m.vpcf_c new file mode 100755 index 0000000..566b029 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_m.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_n.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_n.vpcf_c new file mode 100755 index 0000000..f9ccb00 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_n.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_n0.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_n0.vpcf_c new file mode 100755 index 0000000..9ed9a74 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_n0.vpcf_c differ diff --git a/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_o.vpcf_c b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_o.vpcf_c new file mode 100755 index 0000000..1d33244 Binary files /dev/null and b/particles/econ/items/tidehunter/tidehunter_divinghelmet/tidehunter_gush_diving_helmet_o.vpcf_c differ diff --git a/particles/econ/items/warlock/warlock_golem_dark_curator/golem_ambient_fire_mouth_glow_dark_curator.vpcf_c b/particles/econ/items/warlock/warlock_golem_dark_curator/golem_ambient_fire_mouth_glow_dark_curator.vpcf_c new file mode 100755 index 0000000..a16bca0 Binary files /dev/null and b/particles/econ/items/warlock/warlock_golem_dark_curator/golem_ambient_fire_mouth_glow_dark_curator.vpcf_c differ diff --git a/particles/econ/items/warlock/warlock_golem_watcher/golem_ambient_watcher.vpcf_c b/particles/econ/items/warlock/warlock_golem_watcher/golem_ambient_watcher.vpcf_c new file mode 100755 index 0000000..7d2a664 Binary files /dev/null and b/particles/econ/items/warlock/warlock_golem_watcher/golem_ambient_watcher.vpcf_c differ diff --git a/particles/econ/items/warlock/warlock_golem_watcher/golem_ambient_watcher_eye.vpcf_c b/particles/econ/items/warlock/warlock_golem_watcher/golem_ambient_watcher_eye.vpcf_c new file mode 100755 index 0000000..205d9db Binary files /dev/null and b/particles/econ/items/warlock/warlock_golem_watcher/golem_ambient_watcher_eye.vpcf_c differ diff --git a/particles/econ/items/warlock/warlock_staff_archivist/warlock_ambient_staff_archivist.vpcf_c b/particles/econ/items/warlock/warlock_staff_archivist/warlock_ambient_staff_archivist.vpcf_c new file mode 100755 index 0000000..4223131 Binary files /dev/null and b/particles/econ/items/warlock/warlock_staff_archivist/warlock_ambient_staff_archivist.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_feet_effects_cascade_b.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_feet_effects_cascade_b.vpcf_c new file mode 100755 index 0000000..baf6455 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_feet_effects_cascade_b.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_feet_effects_cascade_c.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_feet_effects_cascade_c.vpcf_c new file mode 100755 index 0000000..be3fbbc Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_feet_effects_cascade_c.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_burst_cascade.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_burst_cascade.vpcf_c new file mode 100755 index 0000000..66a5800 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_burst_cascade.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_cascade.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_cascade.vpcf_c new file mode 100755 index 0000000..aede419 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_cascade.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_fire_cascade.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_fire_cascade.vpcf_c new file mode 100755 index 0000000..ed29d19 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_fire_cascade.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_leaves_cascade.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_leaves_cascade.vpcf_c new file mode 100755 index 0000000..4015b99 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_leaves_cascade.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_leaves_sides_b_cascade.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_leaves_sides_b_cascade.vpcf_c new file mode 100755 index 0000000..635ace9 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_leaves_sides_b_cascade.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_leaves_sides_cascade.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_leaves_sides_cascade.vpcf_c new file mode 100755 index 0000000..3e18834 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_leaves_sides_cascade.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_magic_cascade.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_magic_cascade.vpcf_c new file mode 100755 index 0000000..8ee46b2 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_magic_cascade.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_magic_trail_cascade.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_magic_trail_cascade.vpcf_c new file mode 100755 index 0000000..9b8400c Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_magic_trail_cascade.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_start_cascade.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_start_cascade.vpcf_c new file mode 100755 index 0000000..ef2bcf7 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_start_cascade.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_swirl_leaves_cascade.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_swirl_leaves_cascade.vpcf_c new file mode 100755 index 0000000..c40de05 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_swirl_leaves_cascade.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_whirlwind_static_cascade.vpcf_c b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_whirlwind_static_cascade.vpcf_c new file mode 100755 index 0000000..511b55f Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_whirlwind_static_cascade.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_base_ref.vpcf_c b/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_base_ref.vpcf_c new file mode 100755 index 0000000..56e1317 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_base_ref.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_ribbon_sparrowhawk.vpcf_c b/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_ribbon_sparrowhawk.vpcf_c new file mode 100755 index 0000000..a836074 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_ribbon_sparrowhawk.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_ribbon_sparrowhawk_b.vpcf_c b/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_ribbon_sparrowhawk_b.vpcf_c new file mode 100755 index 0000000..5681fe6 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_ribbon_sparrowhawk_b.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_ribbon_sparrowhawk_c.vpcf_c b/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_ribbon_sparrowhawk_c.vpcf_c new file mode 100755 index 0000000..32a68e4 Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_ribbon_sparrowhawk_c.vpcf_c differ diff --git a/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_ribbon_sparrowhawk_d.vpcf_c b/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_ribbon_sparrowhawk_d.vpcf_c new file mode 100755 index 0000000..306c50d Binary files /dev/null and b/particles/econ/items/windrunner/windrunner_weapon_sparrowhawk/windrunner_spell_powershot_ribbon_sparrowhawk_d.vpcf_c differ diff --git a/particles/econ/wards/warlock/ward_warlock/warlock_ambient_ward.vpcf_c b/particles/econ/wards/warlock/ward_warlock/warlock_ambient_ward.vpcf_c new file mode 100755 index 0000000..bc45985 Binary files /dev/null and b/particles/econ/wards/warlock/ward_warlock/warlock_ambient_ward.vpcf_c differ diff --git a/particles/econ/wards/warlock/ward_warlock/warlock_ambient_ward_c.vpcf_c b/particles/econ/wards/warlock/ward_warlock/warlock_ambient_ward_c.vpcf_c new file mode 100755 index 0000000..8cc9a75 Binary files /dev/null and b/particles/econ/wards/warlock/ward_warlock/warlock_ambient_ward_c.vpcf_c differ diff --git a/particles/environment/jump/jump.vpcf_c b/particles/environment/jump/jump.vpcf_c new file mode 100755 index 0000000..96a277c Binary files /dev/null and b/particles/environment/jump/jump.vpcf_c differ diff --git a/particles/environment/thd_rain.vpcf_c b/particles/environment/thd_rain.vpcf_c new file mode 100755 index 0000000..61a8dc7 Binary files /dev/null and b/particles/environment/thd_rain.vpcf_c differ diff --git a/particles/environment/waterfall/waterfall_1.vpcf_c b/particles/environment/waterfall/waterfall_1.vpcf_c new file mode 100755 index 0000000..0a89173 Binary files /dev/null and b/particles/environment/waterfall/waterfall_1.vpcf_c differ diff --git a/particles/environment/waterfall/waterfall_1_bottom_1.vpcf_c b/particles/environment/waterfall/waterfall_1_bottom_1.vpcf_c new file mode 100755 index 0000000..f115a8d Binary files /dev/null and b/particles/environment/waterfall/waterfall_1_bottom_1.vpcf_c differ diff --git a/particles/environment/waterfall/waterfall_1_bottom_2.vpcf_c b/particles/environment/waterfall/waterfall_1_bottom_2.vpcf_c new file mode 100755 index 0000000..f35a698 Binary files /dev/null and b/particles/environment/waterfall/waterfall_1_bottom_2.vpcf_c differ diff --git a/particles/gem/brewmaster_drunken_haze_debuff_bubbles_2.vpcf_c b/particles/gem/brewmaster_drunken_haze_debuff_bubbles_2.vpcf_c new file mode 100755 index 0000000..0909111 Binary files /dev/null and b/particles/gem/brewmaster_drunken_haze_debuff_bubbles_2.vpcf_c differ diff --git a/particles/gem/opal_pray.vpcf_c b/particles/gem/opal_pray.vpcf_c new file mode 100755 index 0000000..f2dda64 Binary files /dev/null and b/particles/gem/opal_pray.vpcf_c differ diff --git a/particles/gem/purple_pray.vpcf_c b/particles/gem/purple_pray.vpcf_c new file mode 100755 index 0000000..795a191 Binary files /dev/null and b/particles/gem/purple_pray.vpcf_c differ diff --git a/particles/gem/red_pray.vpcf_c b/particles/gem/red_pray.vpcf_c new file mode 100755 index 0000000..2f97937 Binary files /dev/null and b/particles/gem/red_pray.vpcf_c differ diff --git a/particles/gem/sniper_crosshair.vpcf_c b/particles/gem/sniper_crosshair.vpcf_c new file mode 100755 index 0000000..6681af3 Binary files /dev/null and b/particles/gem/sniper_crosshair.vpcf_c differ diff --git a/particles/gem/sniper_crosshair_c.vpcf_c b/particles/gem/sniper_crosshair_c.vpcf_c new file mode 100755 index 0000000..4b25091 Binary files /dev/null and b/particles/gem/sniper_crosshair_c.vpcf_c differ diff --git a/particles/gem/teleport_start_d_pw2014.vpcf_c b/particles/gem/teleport_start_d_pw2014.vpcf_c new file mode 100755 index 0000000..9210a67 Binary files /dev/null and b/particles/gem/teleport_start_d_pw2014.vpcf_c differ diff --git a/particles/gem/white_pray.vpcf_c b/particles/gem/white_pray.vpcf_c new file mode 100755 index 0000000..0de723b Binary files /dev/null and b/particles/gem/white_pray.vpcf_c differ diff --git a/particles/generic_gameplay/dropped_item_beam.vpcf_c b/particles/generic_gameplay/dropped_item_beam.vpcf_c new file mode 100755 index 0000000..ac5c2b2 Binary files /dev/null and b/particles/generic_gameplay/dropped_item_beam.vpcf_c differ diff --git a/particles/generic_gameplay/dropped_item_beam_core.vpcf_c b/particles/generic_gameplay/dropped_item_beam_core.vpcf_c new file mode 100755 index 0000000..6f310fb Binary files /dev/null and b/particles/generic_gameplay/dropped_item_beam_core.vpcf_c differ diff --git a/particles/generic_gameplay/dropped_item_emerald.vpcf_c b/particles/generic_gameplay/dropped_item_emerald.vpcf_c new file mode 100755 index 0000000..0428370 Binary files /dev/null and b/particles/generic_gameplay/dropped_item_emerald.vpcf_c differ diff --git a/particles/generic_gameplay/dropped_item_emerald_bubbles.vpcf_c b/particles/generic_gameplay/dropped_item_emerald_bubbles.vpcf_c new file mode 100755 index 0000000..5a53e16 Binary files /dev/null and b/particles/generic_gameplay/dropped_item_emerald_bubbles.vpcf_c differ diff --git a/particles/generic_gameplay/dropped_item_emerald_smoke.vpcf_c b/particles/generic_gameplay/dropped_item_emerald_smoke.vpcf_c new file mode 100755 index 0000000..7f9db23 Binary files /dev/null and b/particles/generic_gameplay/dropped_item_emerald_smoke.vpcf_c differ diff --git a/particles/generic_gameplay/dropped_item_important.vpcf_c b/particles/generic_gameplay/dropped_item_important.vpcf_c new file mode 100755 index 0000000..ac39814 Binary files /dev/null and b/particles/generic_gameplay/dropped_item_important.vpcf_c differ diff --git a/particles/generic_gameplay/dropped_item_lava.vpcf_c b/particles/generic_gameplay/dropped_item_lava.vpcf_c new file mode 100755 index 0000000..fa39450 Binary files /dev/null and b/particles/generic_gameplay/dropped_item_lava.vpcf_c differ diff --git a/particles/generic_gameplay/lasthit_crystal_local.vpcf_c b/particles/generic_gameplay/lasthit_crystal_local.vpcf_c new file mode 100755 index 0000000..0a686e1 Binary files /dev/null and b/particles/generic_gameplay/lasthit_crystal_local.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02.vpcf_c b/particles/heroes/alice/ability_alice_02.vpcf_c new file mode 100755 index 0000000..0748c73 Binary files /dev/null and b/particles/heroes/alice/ability_alice_02.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_a.vpcf_c b/particles/heroes/alice/ability_alice_02_a.vpcf_c new file mode 100755 index 0000000..76aba8f Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_a.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_b.vpcf_c b/particles/heroes/alice/ability_alice_02_b.vpcf_c new file mode 100755 index 0000000..131e30a Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_b.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_c.vpcf_c b/particles/heroes/alice/ability_alice_02_c.vpcf_c new file mode 100755 index 0000000..67be015 Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_c.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_c0.vpcf_c b/particles/heroes/alice/ability_alice_02_c0.vpcf_c new file mode 100755 index 0000000..c1dbc16 Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_c0.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_c1.vpcf_c b/particles/heroes/alice/ability_alice_02_c1.vpcf_c new file mode 100755 index 0000000..8e87d8c Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_c1.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_c2.vpcf_c b/particles/heroes/alice/ability_alice_02_c2.vpcf_c new file mode 100755 index 0000000..3228771 Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_c2.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_c3.vpcf_c b/particles/heroes/alice/ability_alice_02_c3.vpcf_c new file mode 100755 index 0000000..950e140 Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_c3.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_c4.vpcf_c b/particles/heroes/alice/ability_alice_02_c4.vpcf_c new file mode 100755 index 0000000..77d9fe9 Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_c4.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_c5.vpcf_c b/particles/heroes/alice/ability_alice_02_c5.vpcf_c new file mode 100755 index 0000000..f89441d Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_c5.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_c6.vpcf_c b/particles/heroes/alice/ability_alice_02_c6.vpcf_c new file mode 100755 index 0000000..1b1995a Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_c6.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_c7.vpcf_c b/particles/heroes/alice/ability_alice_02_c7.vpcf_c new file mode 100755 index 0000000..3a79f68 Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_c7.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_c8.vpcf_c b/particles/heroes/alice/ability_alice_02_c8.vpcf_c new file mode 100755 index 0000000..21dc68d Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_c8.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_d.vpcf_c b/particles/heroes/alice/ability_alice_02_d.vpcf_c new file mode 100755 index 0000000..b8b9d9b Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_d.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_e.vpcf_c b/particles/heroes/alice/ability_alice_02_e.vpcf_c new file mode 100755 index 0000000..270b6aa Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_e.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_f.vpcf_c b/particles/heroes/alice/ability_alice_02_f.vpcf_c new file mode 100755 index 0000000..6eea779 Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_f.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_g.vpcf_c b/particles/heroes/alice/ability_alice_02_g.vpcf_c new file mode 100755 index 0000000..f985fbf Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_g.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_h.vpcf_c b/particles/heroes/alice/ability_alice_02_h.vpcf_c new file mode 100755 index 0000000..4e37e28 Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_h.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_02_i.vpcf_c b/particles/heroes/alice/ability_alice_02_i.vpcf_c new file mode 100755 index 0000000..f28623a Binary files /dev/null and b/particles/heroes/alice/ability_alice_02_i.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_dash.vpcf_c b/particles/heroes/alice/ability_alice_dash.vpcf_c new file mode 100755 index 0000000..433131b Binary files /dev/null and b/particles/heroes/alice/ability_alice_dash.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_dash_a.vpcf_c b/particles/heroes/alice/ability_alice_dash_a.vpcf_c new file mode 100755 index 0000000..ac897b3 Binary files /dev/null and b/particles/heroes/alice/ability_alice_dash_a.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_dash_a0.vpcf_c b/particles/heroes/alice/ability_alice_dash_a0.vpcf_c new file mode 100755 index 0000000..25d5fe8 Binary files /dev/null and b/particles/heroes/alice/ability_alice_dash_a0.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_dash_a1.vpcf_c b/particles/heroes/alice/ability_alice_dash_a1.vpcf_c new file mode 100755 index 0000000..de573f4 Binary files /dev/null and b/particles/heroes/alice/ability_alice_dash_a1.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_dash_a2.vpcf_c b/particles/heroes/alice/ability_alice_dash_a2.vpcf_c new file mode 100755 index 0000000..b53b4a6 Binary files /dev/null and b/particles/heroes/alice/ability_alice_dash_a2.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_dash_a3.vpcf_c b/particles/heroes/alice/ability_alice_dash_a3.vpcf_c new file mode 100755 index 0000000..b64013b Binary files /dev/null and b/particles/heroes/alice/ability_alice_dash_a3.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_dash_a4.vpcf_c b/particles/heroes/alice/ability_alice_dash_a4.vpcf_c new file mode 100755 index 0000000..fd014dd Binary files /dev/null and b/particles/heroes/alice/ability_alice_dash_a4.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_dash_a5.vpcf_c b/particles/heroes/alice/ability_alice_dash_a5.vpcf_c new file mode 100755 index 0000000..fa850b2 Binary files /dev/null and b/particles/heroes/alice/ability_alice_dash_a5.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_ex_release.vpcf_c b/particles/heroes/alice/ability_alice_ex_release.vpcf_c new file mode 100755 index 0000000..26c017d Binary files /dev/null and b/particles/heroes/alice/ability_alice_ex_release.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_ex_release_a.vpcf_c b/particles/heroes/alice/ability_alice_ex_release_a.vpcf_c new file mode 100755 index 0000000..75e4795 Binary files /dev/null and b/particles/heroes/alice/ability_alice_ex_release_a.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_ex_release_b.vpcf_c b/particles/heroes/alice/ability_alice_ex_release_b.vpcf_c new file mode 100755 index 0000000..ae3120c Binary files /dev/null and b/particles/heroes/alice/ability_alice_ex_release_b.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_line.vpcf_c b/particles/heroes/alice/ability_alice_line.vpcf_c new file mode 100755 index 0000000..f00ef66 Binary files /dev/null and b/particles/heroes/alice/ability_alice_line.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_line_a.vpcf_c b/particles/heroes/alice/ability_alice_line_a.vpcf_c new file mode 100755 index 0000000..9d6798b Binary files /dev/null and b/particles/heroes/alice/ability_alice_line_a.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_line_b.vpcf_c b/particles/heroes/alice/ability_alice_line_b.vpcf_c new file mode 100755 index 0000000..6199c18 Binary files /dev/null and b/particles/heroes/alice/ability_alice_line_b.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_line_c.vpcf_c b/particles/heroes/alice/ability_alice_line_c.vpcf_c new file mode 100755 index 0000000..de6098f Binary files /dev/null and b/particles/heroes/alice/ability_alice_line_c.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_line_d.vpcf_c b/particles/heroes/alice/ability_alice_line_d.vpcf_c new file mode 100755 index 0000000..9d94354 Binary files /dev/null and b/particles/heroes/alice/ability_alice_line_d.vpcf_c differ diff --git a/particles/heroes/alice/ability_alice_line_e.vpcf_c b/particles/heroes/alice/ability_alice_line_e.vpcf_c new file mode 100755 index 0000000..52341e3 Binary files /dev/null and b/particles/heroes/alice/ability_alice_line_e.vpcf_c differ diff --git a/particles/heroes/aya/ability_aya_01.vpcf_c b/particles/heroes/aya/ability_aya_01.vpcf_c new file mode 100755 index 0000000..576135a Binary files /dev/null and b/particles/heroes/aya/ability_aya_01.vpcf_c differ diff --git a/particles/heroes/aya/ability_aya_02_mark.vpcf_c b/particles/heroes/aya/ability_aya_02_mark.vpcf_c new file mode 100755 index 0000000..1ad3d7e Binary files /dev/null and b/particles/heroes/aya/ability_aya_02_mark.vpcf_c differ diff --git a/particles/heroes/aya/ability_aya_03.vpcf_c b/particles/heroes/aya/ability_aya_03.vpcf_c new file mode 100755 index 0000000..c47e0e2 Binary files /dev/null and b/particles/heroes/aya/ability_aya_03.vpcf_c differ diff --git a/particles/heroes/aya/ability_aya_03_b.vpcf_c b/particles/heroes/aya/ability_aya_03_b.vpcf_c new file mode 100755 index 0000000..38f0882 Binary files /dev/null and b/particles/heroes/aya/ability_aya_03_b.vpcf_c differ diff --git a/particles/heroes/aya/ability_aya_04.vpcf_c b/particles/heroes/aya/ability_aya_04.vpcf_c new file mode 100755 index 0000000..ec39e18 Binary files /dev/null and b/particles/heroes/aya/ability_aya_04.vpcf_c differ diff --git a/particles/heroes/aya/ability_aya_04_b.vpcf_c b/particles/heroes/aya/ability_aya_04_b.vpcf_c new file mode 100755 index 0000000..12adc02 Binary files /dev/null and b/particles/heroes/aya/ability_aya_04_b.vpcf_c differ diff --git a/particles/heroes/aya/ability_aya_04_c.vpcf_c b/particles/heroes/aya/ability_aya_04_c.vpcf_c new file mode 100755 index 0000000..0c9212c Binary files /dev/null and b/particles/heroes/aya/ability_aya_04_c.vpcf_c differ diff --git a/particles/heroes/aya/ability_aya_04_d.vpcf_c b/particles/heroes/aya/ability_aya_04_d.vpcf_c new file mode 100755 index 0000000..63f155d Binary files /dev/null and b/particles/heroes/aya/ability_aya_04_d.vpcf_c differ diff --git a/particles/heroes/aya/ability_aya_04_e.vpcf_c b/particles/heroes/aya/ability_aya_04_e.vpcf_c new file mode 100755 index 0000000..83fc825 Binary files /dev/null and b/particles/heroes/aya/ability_aya_04_e.vpcf_c differ diff --git a/particles/heroes/aya/ability_aya_04_f.vpcf_c b/particles/heroes/aya/ability_aya_04_f.vpcf_c new file mode 100755 index 0000000..5c5a498 Binary files /dev/null and b/particles/heroes/aya/ability_aya_04_f.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_02.vpcf_c b/particles/heroes/byakuren/ability_byakuren_02.vpcf_c new file mode 100755 index 0000000..c5f3500 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_02.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_02_a.vpcf_c b/particles/heroes/byakuren/ability_byakuren_02_a.vpcf_c new file mode 100755 index 0000000..085dadc Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_02_a.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_02_b.vpcf_c b/particles/heroes/byakuren/ability_byakuren_02_b.vpcf_c new file mode 100755 index 0000000..b38c65a Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_02_b.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_02_c.vpcf_c b/particles/heroes/byakuren/ability_byakuren_02_c.vpcf_c new file mode 100755 index 0000000..f1069a8 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_02_c.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_02_d.vpcf_c b/particles/heroes/byakuren/ability_byakuren_02_d.vpcf_c new file mode 100755 index 0000000..3a29304 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_02_d.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_02_e.vpcf_c b/particles/heroes/byakuren/ability_byakuren_02_e.vpcf_c new file mode 100755 index 0000000..3cbe49f Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_02_e.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_02_f.vpcf_c b/particles/heroes/byakuren/ability_byakuren_02_f.vpcf_c new file mode 100755 index 0000000..07aea79 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_02_f.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_02_g.vpcf_c b/particles/heroes/byakuren/ability_byakuren_02_g.vpcf_c new file mode 100755 index 0000000..1fd599d Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_02_g.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_03.vpcf_c b/particles/heroes/byakuren/ability_byakuren_03.vpcf_c new file mode 100755 index 0000000..07ffc81 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_03.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_03_b.vpcf_c b/particles/heroes/byakuren/ability_byakuren_03_b.vpcf_c new file mode 100755 index 0000000..57bf6f6 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_03_b.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_03_c.vpcf_c b/particles/heroes/byakuren/ability_byakuren_03_c.vpcf_c new file mode 100755 index 0000000..c3af0a8 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_03_c.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_03_d.vpcf_c b/particles/heroes/byakuren/ability_byakuren_03_d.vpcf_c new file mode 100755 index 0000000..1643439 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_03_d.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_04.vpcf_c b/particles/heroes/byakuren/ability_byakuren_04.vpcf_c new file mode 100755 index 0000000..f48c4bf Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_04.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_04_attack.vpcf_c b/particles/heroes/byakuren/ability_byakuren_04_attack.vpcf_c new file mode 100755 index 0000000..d3b6237 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_04_attack.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_04_circle.vpcf_c b/particles/heroes/byakuren/ability_byakuren_04_circle.vpcf_c new file mode 100755 index 0000000..2958088 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_04_circle.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_04_circle_b.vpcf_c b/particles/heroes/byakuren/ability_byakuren_04_circle_b.vpcf_c new file mode 100755 index 0000000..bf9f4c7 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_04_circle_b.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_04_ult.vpcf_c b/particles/heroes/byakuren/ability_byakuren_04_ult.vpcf_c new file mode 100755 index 0000000..32c084d Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_04_ult.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_04_ult_b.vpcf_c b/particles/heroes/byakuren/ability_byakuren_04_ult_b.vpcf_c new file mode 100755 index 0000000..ea1028e Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_04_ult_b.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_04_ult_c.vpcf_c b/particles/heroes/byakuren/ability_byakuren_04_ult_c.vpcf_c new file mode 100755 index 0000000..5619774 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_04_ult_c.vpcf_c differ diff --git a/particles/heroes/byakuren/ability_byakuren_04_ult_flower.vpcf_c b/particles/heroes/byakuren/ability_byakuren_04_ult_flower.vpcf_c new file mode 100755 index 0000000..1a4a110 Binary files /dev/null and b/particles/heroes/byakuren/ability_byakuren_04_ult_flower.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02.vpcf_c b/particles/heroes/cirno/ability_cirno_02.vpcf_c new file mode 100755 index 0000000..edca07e Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_a.vpcf_c b/particles/heroes/cirno/ability_cirno_02_a.vpcf_c new file mode 100755 index 0000000..fc55f52 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_a.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_b.vpcf_c b/particles/heroes/cirno/ability_cirno_02_b.vpcf_c new file mode 100755 index 0000000..39a0aea Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_b.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_c.vpcf_c b/particles/heroes/cirno/ability_cirno_02_c.vpcf_c new file mode 100755 index 0000000..a65bf08 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_c.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_d.vpcf_c b/particles/heroes/cirno/ability_cirno_02_d.vpcf_c new file mode 100755 index 0000000..9a33124 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_d.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_e.vpcf_c b/particles/heroes/cirno/ability_cirno_02_e.vpcf_c new file mode 100755 index 0000000..785603a Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_e.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_e0.vpcf_c b/particles/heroes/cirno/ability_cirno_02_e0.vpcf_c new file mode 100755 index 0000000..f51ac9c Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_e0.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_e0a.vpcf_c b/particles/heroes/cirno/ability_cirno_02_e0a.vpcf_c new file mode 100755 index 0000000..f30aa8b Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_e0a.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_f.vpcf_c b/particles/heroes/cirno/ability_cirno_02_f.vpcf_c new file mode 100755 index 0000000..c18115c Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_f.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_g.vpcf_c b/particles/heroes/cirno/ability_cirno_02_g.vpcf_c new file mode 100755 index 0000000..0f2bece Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_g.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_h.vpcf_c b/particles/heroes/cirno/ability_cirno_02_h.vpcf_c new file mode 100755 index 0000000..cc4dfd8 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_h.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_i.vpcf_c b/particles/heroes/cirno/ability_cirno_02_i.vpcf_c new file mode 100755 index 0000000..8ecc0b7 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_i.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_j.vpcf_c b/particles/heroes/cirno/ability_cirno_02_j.vpcf_c new file mode 100755 index 0000000..0e57890 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_j.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_j0.vpcf_c b/particles/heroes/cirno/ability_cirno_02_j0.vpcf_c new file mode 100755 index 0000000..4d85aad Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_j0.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_k.vpcf_c b/particles/heroes/cirno/ability_cirno_02_k.vpcf_c new file mode 100755 index 0000000..684b5b5 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_k.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_m.vpcf_c b/particles/heroes/cirno/ability_cirno_02_m.vpcf_c new file mode 100755 index 0000000..df054b5 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_m.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_n.vpcf_c b/particles/heroes/cirno/ability_cirno_02_n.vpcf_c new file mode 100755 index 0000000..a093dc6 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_n.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_02_o.vpcf_c b/particles/heroes/cirno/ability_cirno_02_o.vpcf_c new file mode 100755 index 0000000..cba0510 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_02_o.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04.vpcf_c b/particles/heroes/cirno/ability_cirno_04.vpcf_c new file mode 100755 index 0000000..48e0749 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_a.vpcf_c b/particles/heroes/cirno/ability_cirno_04_a.vpcf_c new file mode 100755 index 0000000..10d4da7 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_a.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_b.vpcf_c b/particles/heroes/cirno/ability_cirno_04_b.vpcf_c new file mode 100755 index 0000000..c3bcbb3 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_b.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_buff.vpcf_c b/particles/heroes/cirno/ability_cirno_04_buff.vpcf_c new file mode 100755 index 0000000..f7f2ecc Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_buff.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_buff_a.vpcf_c b/particles/heroes/cirno/ability_cirno_04_buff_a.vpcf_c new file mode 100755 index 0000000..26db098 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_buff_a.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_buff_b.vpcf_c b/particles/heroes/cirno/ability_cirno_04_buff_b.vpcf_c new file mode 100755 index 0000000..d146c25 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_buff_b.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_buff_c.vpcf_c b/particles/heroes/cirno/ability_cirno_04_buff_c.vpcf_c new file mode 100755 index 0000000..5059e95 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_buff_c.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_buff_d.vpcf_c b/particles/heroes/cirno/ability_cirno_04_buff_d.vpcf_c new file mode 100755 index 0000000..c085680 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_buff_d.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_buff_d0.vpcf_c b/particles/heroes/cirno/ability_cirno_04_buff_d0.vpcf_c new file mode 100755 index 0000000..a57ddbe Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_buff_d0.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_buff_e.vpcf_c b/particles/heroes/cirno/ability_cirno_04_buff_e.vpcf_c new file mode 100755 index 0000000..3928b89 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_buff_e.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_buff_e0.vpcf_c b/particles/heroes/cirno/ability_cirno_04_buff_e0.vpcf_c new file mode 100755 index 0000000..c98d545 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_buff_e0.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_buff_f.vpcf_c b/particles/heroes/cirno/ability_cirno_04_buff_f.vpcf_c new file mode 100755 index 0000000..6feb275 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_buff_f.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_buff_f0.vpcf_c b/particles/heroes/cirno/ability_cirno_04_buff_f0.vpcf_c new file mode 100755 index 0000000..e0b1552 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_buff_f0.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_buff_f1.vpcf_c b/particles/heroes/cirno/ability_cirno_04_buff_f1.vpcf_c new file mode 100755 index 0000000..0d44641 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_buff_f1.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_c.vpcf_c b/particles/heroes/cirno/ability_cirno_04_c.vpcf_c new file mode 100755 index 0000000..06fee35 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_c.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_d.vpcf_c b/particles/heroes/cirno/ability_cirno_04_d.vpcf_c new file mode 100755 index 0000000..ab04055 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_d.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_e.vpcf_c b/particles/heroes/cirno/ability_cirno_04_e.vpcf_c new file mode 100755 index 0000000..a6a92af Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_e.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_f.vpcf_c b/particles/heroes/cirno/ability_cirno_04_f.vpcf_c new file mode 100755 index 0000000..168ea01 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_f.vpcf_c differ diff --git a/particles/heroes/cirno/ability_cirno_04_g.vpcf_c b/particles/heroes/cirno/ability_cirno_04_g.vpcf_c new file mode 100755 index 0000000..db01ea1 Binary files /dev/null and b/particles/heroes/cirno/ability_cirno_04_g.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_02.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_02.vpcf_c new file mode 100755 index 0000000..c494c7d Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_02.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_02_a.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_02_a.vpcf_c new file mode 100755 index 0000000..35ce2b6 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_02_a.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_02_b.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_02_b.vpcf_c new file mode 100755 index 0000000..4734600 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_02_b.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_02_b0.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_02_b0.vpcf_c new file mode 100755 index 0000000..b47283d Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_02_b0.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_02_b0a.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_02_b0a.vpcf_c new file mode 100755 index 0000000..df37a68 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_02_b0a.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_02_c.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_02_c.vpcf_c new file mode 100755 index 0000000..500824b Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_02_c.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_02_c0.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_02_c0.vpcf_c new file mode 100755 index 0000000..a482bf5 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_02_c0.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_02_c0a.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_02_c0a.vpcf_c new file mode 100755 index 0000000..eb37b99 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_02_c0a.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_02_c0b.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_02_c0b.vpcf_c new file mode 100755 index 0000000..390a38e Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_02_c0b.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_02_c0c.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_02_c0c.vpcf_c new file mode 100755 index 0000000..0e15d73 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_02_c0c.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_02_c0d.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_02_c0d.vpcf_c new file mode 100755 index 0000000..495b3f2 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_02_c0d.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_02_c0d0.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_02_c0d0.vpcf_c new file mode 100755 index 0000000..c23cb7e Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_02_c0d0.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_03.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_03.vpcf_c new file mode 100755 index 0000000..98d9037 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_03.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_03_a.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_03_a.vpcf_c new file mode 100755 index 0000000..fe23e5d Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_03_a.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_03_b.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_03_b.vpcf_c new file mode 100755 index 0000000..5feb13e Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_03_b.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_03_c.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_03_c.vpcf_c new file mode 100755 index 0000000..862bdf9 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_03_c.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_03_d.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_03_d.vpcf_c new file mode 100755 index 0000000..003ac73 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_03_d.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_03_e.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_03_e.vpcf_c new file mode 100755 index 0000000..7f4baf6 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_03_e.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_03_f.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_03_f.vpcf_c new file mode 100755 index 0000000..af10324 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_03_f.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_03_g.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_03_g.vpcf_c new file mode 100755 index 0000000..6550146 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_03_g.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_03_h.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_03_h.vpcf_c new file mode 100755 index 0000000..c0a2e90 Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_03_h.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_03_i.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_03_i.vpcf_c new file mode 100755 index 0000000..cbc9b3e Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_03_i.vpcf_c differ diff --git a/particles/heroes/daiyousei/ability_daiyousei_03_line.vpcf_c b/particles/heroes/daiyousei/ability_daiyousei_03_line.vpcf_c new file mode 100755 index 0000000..93e592d Binary files /dev/null and b/particles/heroes/daiyousei/ability_daiyousei_03_line.vpcf_c differ diff --git a/particles/heroes/eirin/ability_eirin_02.vpcf_c b/particles/heroes/eirin/ability_eirin_02.vpcf_c new file mode 100755 index 0000000..7ce610f Binary files /dev/null and b/particles/heroes/eirin/ability_eirin_02.vpcf_c differ diff --git a/particles/heroes/eirin/ability_eirin_04.vpcf_c b/particles/heroes/eirin/ability_eirin_04.vpcf_c new file mode 100755 index 0000000..c5d7d31 Binary files /dev/null and b/particles/heroes/eirin/ability_eirin_04.vpcf_c differ diff --git a/particles/heroes/eirin/ability_eirin_04_b.vpcf_c b/particles/heroes/eirin/ability_eirin_04_b.vpcf_c new file mode 100755 index 0000000..e4f01f1 Binary files /dev/null and b/particles/heroes/eirin/ability_eirin_04_b.vpcf_c differ diff --git a/particles/heroes/eirin/ability_eirin_04_c.vpcf_c b/particles/heroes/eirin/ability_eirin_04_c.vpcf_c new file mode 100755 index 0000000..0b230f3 Binary files /dev/null and b/particles/heroes/eirin/ability_eirin_04_c.vpcf_c differ diff --git a/particles/heroes/eirin/ability_eirin_04_d.vpcf_c b/particles/heroes/eirin/ability_eirin_04_d.vpcf_c new file mode 100755 index 0000000..c02385f Binary files /dev/null and b/particles/heroes/eirin/ability_eirin_04_d.vpcf_c differ diff --git a/particles/heroes/flandre/ability_flandre_04_aura.vpcf_c b/particles/heroes/flandre/ability_flandre_04_aura.vpcf_c new file mode 100755 index 0000000..7850ee6 Binary files /dev/null and b/particles/heroes/flandre/ability_flandre_04_aura.vpcf_c differ diff --git a/particles/heroes/flandre/ability_flandre_04_aura_light.vpcf_c b/particles/heroes/flandre/ability_flandre_04_aura_light.vpcf_c new file mode 100755 index 0000000..5955060 Binary files /dev/null and b/particles/heroes/flandre/ability_flandre_04_aura_light.vpcf_c differ diff --git a/particles/heroes/flandre/ability_flandre_04_buff.vpcf_c b/particles/heroes/flandre/ability_flandre_04_buff.vpcf_c new file mode 100755 index 0000000..0f8781f Binary files /dev/null and b/particles/heroes/flandre/ability_flandre_04_buff.vpcf_c differ diff --git a/particles/heroes/flandre/ability_flandre_04_effect.vpcf_c b/particles/heroes/flandre/ability_flandre_04_effect.vpcf_c new file mode 100755 index 0000000..c22c251 Binary files /dev/null and b/particles/heroes/flandre/ability_flandre_04_effect.vpcf_c differ diff --git a/particles/heroes/hatate/ability_hatate_01_mark.vpcf_c b/particles/heroes/hatate/ability_hatate_01_mark.vpcf_c new file mode 100755 index 0000000..b20452a Binary files /dev/null and b/particles/heroes/hatate/ability_hatate_01_mark.vpcf_c differ diff --git a/particles/heroes/hatate/ability_hatate_01_mark_a.vpcf_c b/particles/heroes/hatate/ability_hatate_01_mark_a.vpcf_c new file mode 100755 index 0000000..0e533cd Binary files /dev/null and b/particles/heroes/hatate/ability_hatate_01_mark_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011.vpcf_c b/particles/heroes/humei/ability_humei_011.vpcf_c new file mode 100755 index 0000000..d8ba8f2 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_a.vpcf_c b/particles/heroes/humei/ability_humei_011_a.vpcf_c new file mode 100755 index 0000000..88ba1bc Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_b.vpcf_c b/particles/heroes/humei/ability_humei_011_b.vpcf_c new file mode 100755 index 0000000..cd6d5a4 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_c.vpcf_c b/particles/heroes/humei/ability_humei_011_c.vpcf_c new file mode 100755 index 0000000..048c552 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_d.vpcf_c b/particles/heroes/humei/ability_humei_011_d.vpcf_c new file mode 100755 index 0000000..10e3a41 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_e.vpcf_c b/particles/heroes/humei/ability_humei_011_e.vpcf_c new file mode 100755 index 0000000..765c40a Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_e.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_e0.vpcf_c b/particles/heroes/humei/ability_humei_011_e0.vpcf_c new file mode 100755 index 0000000..36312a1 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_e0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_e0a.vpcf_c b/particles/heroes/humei/ability_humei_011_e0a.vpcf_c new file mode 100755 index 0000000..4a3c825 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_e0a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra.vpcf_c b/particles/heroes/humei/ability_humei_011_extra.vpcf_c new file mode 100755 index 0000000..269647d Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a.vpcf_c new file mode 100755 index 0000000..d2343c9 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a0.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a0.vpcf_c new file mode 100755 index 0000000..cecbb48 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a1.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a1.vpcf_c new file mode 100755 index 0000000..9e15149 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a10.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a10.vpcf_c new file mode 100755 index 0000000..e289d05 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a10.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a11.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a11.vpcf_c new file mode 100755 index 0000000..f007622 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a11.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a11a.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a11a.vpcf_c new file mode 100755 index 0000000..dad71f6 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a11a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a2.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a2.vpcf_c new file mode 100755 index 0000000..250cd7d Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a2.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a3.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a3.vpcf_c new file mode 100755 index 0000000..bf0ceae Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a3.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a4.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a4.vpcf_c new file mode 100755 index 0000000..1b36811 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a4.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a5.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a5.vpcf_c new file mode 100755 index 0000000..9f0ce96 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a5.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a6.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a6.vpcf_c new file mode 100755 index 0000000..e626ad9 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a6.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a7.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a7.vpcf_c new file mode 100755 index 0000000..b197834 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a7.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a7a.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a7a.vpcf_c new file mode 100755 index 0000000..155dfee Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a7a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a7b.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a7b.vpcf_c new file mode 100755 index 0000000..f91d411 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a7b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a7c.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a7c.vpcf_c new file mode 100755 index 0000000..c143f1c Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a7c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a7d.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a7d.vpcf_c new file mode 100755 index 0000000..f91e253 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a7d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a7d0.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a7d0.vpcf_c new file mode 100755 index 0000000..a975135 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a7d0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a8.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a8.vpcf_c new file mode 100755 index 0000000..935e283 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a8.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a8a.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a8a.vpcf_c new file mode 100755 index 0000000..def95e7 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a8a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_a9.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_a9.vpcf_c new file mode 100755 index 0000000..f720337 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_a9.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_extra_main.vpcf_c b/particles/heroes/humei/ability_humei_011_extra_main.vpcf_c new file mode 100755 index 0000000..89378fd Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_extra_main.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_f.vpcf_c b/particles/heroes/humei/ability_humei_011_f.vpcf_c new file mode 100755 index 0000000..a880bac Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_f.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_g.vpcf_c b/particles/heroes/humei/ability_humei_011_g.vpcf_c new file mode 100755 index 0000000..1321780 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_g.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_h.vpcf_c b/particles/heroes/humei/ability_humei_011_h.vpcf_c new file mode 100755 index 0000000..155ff66 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_h.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_hand.vpcf_c b/particles/heroes/humei/ability_humei_011_hand.vpcf_c new file mode 100755 index 0000000..0175bdd Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_hand.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_hand_a.vpcf_c b/particles/heroes/humei/ability_humei_011_hand_a.vpcf_c new file mode 100755 index 0000000..6e17186 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_hand_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_hand_a0.vpcf_c b/particles/heroes/humei/ability_humei_011_hand_a0.vpcf_c new file mode 100755 index 0000000..a281377 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_hand_a0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_hand_a1.vpcf_c b/particles/heroes/humei/ability_humei_011_hand_a1.vpcf_c new file mode 100755 index 0000000..8ee9707 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_hand_a1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_hand_a1a.vpcf_c b/particles/heroes/humei/ability_humei_011_hand_a1a.vpcf_c new file mode 100755 index 0000000..554dcbb Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_hand_a1a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_hand_a1b.vpcf_c b/particles/heroes/humei/ability_humei_011_hand_a1b.vpcf_c new file mode 100755 index 0000000..27f6869 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_hand_a1b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_hand_a1b0.vpcf_c b/particles/heroes/humei/ability_humei_011_hand_a1b0.vpcf_c new file mode 100755 index 0000000..448a7bf Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_hand_a1b0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_hand_a2.vpcf_c b/particles/heroes/humei/ability_humei_011_hand_a2.vpcf_c new file mode 100755 index 0000000..3809b48 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_hand_a2.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_i.vpcf_c b/particles/heroes/humei/ability_humei_011_i.vpcf_c new file mode 100755 index 0000000..3178d34 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_i.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice.vpcf_c b/particles/heroes/humei/ability_humei_011_ice.vpcf_c new file mode 100755 index 0000000..0433f68 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_b.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_b.vpcf_c new file mode 100755 index 0000000..dddca4d Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_c.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_c.vpcf_c new file mode 100755 index 0000000..d259d7b Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d.vpcf_c new file mode 100755 index 0000000..6234d9a Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_a.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_a.vpcf_c new file mode 100755 index 0000000..c735c95 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_b.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_b.vpcf_c new file mode 100755 index 0000000..cbe5a86 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_c.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_c.vpcf_c new file mode 100755 index 0000000..a9b8d27 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_d.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_d.vpcf_c new file mode 100755 index 0000000..0ace4c6 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_e.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_e.vpcf_c new file mode 100755 index 0000000..765be09 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_e.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_f.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_f.vpcf_c new file mode 100755 index 0000000..1806ae3 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_f.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_g.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_g.vpcf_c new file mode 100755 index 0000000..f19a842 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_g.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_h.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_h.vpcf_c new file mode 100755 index 0000000..274b604 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_h.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_h0.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_h0.vpcf_c new file mode 100755 index 0000000..a820b12 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_h0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_h1.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_h1.vpcf_c new file mode 100755 index 0000000..1d8d1d3 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_h1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_h2.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_h2.vpcf_c new file mode 100755 index 0000000..64d0961 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_h2.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_h3.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_h3.vpcf_c new file mode 100755 index 0000000..48c796f Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_h3.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_h3a.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_h3a.vpcf_c new file mode 100755 index 0000000..8288f4d Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_h3a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_i.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_i.vpcf_c new file mode 100755 index 0000000..a0d7597 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_i.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_j.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_j.vpcf_c new file mode 100755 index 0000000..4ea6c91 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_j.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_j0.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_j0.vpcf_c new file mode 100755 index 0000000..731d424 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_j0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_k.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_k.vpcf_c new file mode 100755 index 0000000..6a691b2 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_k.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_l.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_l.vpcf_c new file mode 100755 index 0000000..7991a4a Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_l.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_m.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_m.vpcf_c new file mode 100755 index 0000000..60aac88 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_m.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_m0.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_m0.vpcf_c new file mode 100755 index 0000000..13312d6 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_m0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_n.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_n.vpcf_c new file mode 100755 index 0000000..89a241d Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_n.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_n0.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_n0.vpcf_c new file mode 100755 index 0000000..5fa90b4 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_n0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_ice_d_n1.vpcf_c b/particles/heroes/humei/ability_humei_011_ice_d_n1.vpcf_c new file mode 100755 index 0000000..b0e293a Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_ice_d_n1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_j.vpcf_c b/particles/heroes/humei/ability_humei_011_j.vpcf_c new file mode 100755 index 0000000..0400ab0 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_j.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_j0.vpcf_c b/particles/heroes/humei/ability_humei_011_j0.vpcf_c new file mode 100755 index 0000000..a569e34 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_j0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_k.vpcf_c b/particles/heroes/humei/ability_humei_011_k.vpcf_c new file mode 100755 index 0000000..e57b128 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_k.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_l.vpcf_c b/particles/heroes/humei/ability_humei_011_l.vpcf_c new file mode 100755 index 0000000..35dc7b5 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_l.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_m.vpcf_c b/particles/heroes/humei/ability_humei_011_m.vpcf_c new file mode 100755 index 0000000..c4b94dd Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_m.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_n.vpcf_c b/particles/heroes/humei/ability_humei_011_n.vpcf_c new file mode 100755 index 0000000..9d0d182 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_n.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_011_o.vpcf_c b/particles/heroes/humei/ability_humei_011_o.vpcf_c new file mode 100755 index 0000000..63581a0 Binary files /dev/null and b/particles/heroes/humei/ability_humei_011_o.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012.vpcf_c b/particles/heroes/humei/ability_humei_012.vpcf_c new file mode 100755 index 0000000..d7850aa Binary files /dev/null and b/particles/heroes/humei/ability_humei_012.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_a.vpcf_c b/particles/heroes/humei/ability_humei_012_a.vpcf_c new file mode 100755 index 0000000..528cf1a Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom.vpcf_c b/particles/heroes/humei/ability_humei_012_boom.vpcf_c new file mode 100755 index 0000000..d9d6fed Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2.vpcf_c new file mode 100755 index 0000000..5436e3f Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_a.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_a.vpcf_c new file mode 100755 index 0000000..1250783 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_a0.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_a0.vpcf_c new file mode 100755 index 0000000..dd71610 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_a0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_a1.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_a1.vpcf_c new file mode 100755 index 0000000..d639e8e Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_a1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_b.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_b.vpcf_c new file mode 100755 index 0000000..f3bb203 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_c.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_c.vpcf_c new file mode 100755 index 0000000..b58d652 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_d.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_d.vpcf_c new file mode 100755 index 0000000..d1f986c Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_e.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_e.vpcf_c new file mode 100755 index 0000000..81fc1fd Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_e.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_e0.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_e0.vpcf_c new file mode 100755 index 0000000..dae6d39 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_e0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_f.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_f.vpcf_c new file mode 100755 index 0000000..4df459f Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_f.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_g.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_g.vpcf_c new file mode 100755 index 0000000..4546d00 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_g.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_h.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_h.vpcf_c new file mode 100755 index 0000000..3b44923 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_h.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_i.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_i.vpcf_c new file mode 100755 index 0000000..3e8619b Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_i.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_j.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_j.vpcf_c new file mode 100755 index 0000000..45ddb63 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_j.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_k.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_k.vpcf_c new file mode 100755 index 0000000..3a0fa90 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_k.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_l.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_l.vpcf_c new file mode 100755 index 0000000..f640050 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_l.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_m.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_m.vpcf_c new file mode 100755 index 0000000..80efedb Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_m.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_n.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_n.vpcf_c new file mode 100755 index 0000000..d57d4e6 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_n.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_o.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_o.vpcf_c new file mode 100755 index 0000000..f8153e9 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_o.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_p.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_p.vpcf_c new file mode 100755 index 0000000..c9ac409 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_p.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_q.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_q.vpcf_c new file mode 100755 index 0000000..cd2519d Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_q.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_2_r.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_2_r.vpcf_c new file mode 100755 index 0000000..74b3b0a Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_2_r.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_a.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_a.vpcf_c new file mode 100755 index 0000000..cacf0c5 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_b.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_b.vpcf_c new file mode 100755 index 0000000..4d5eaa8 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_c.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_c.vpcf_c new file mode 100755 index 0000000..f56281a Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_d.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_d.vpcf_c new file mode 100755 index 0000000..1ca4e9e Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_e.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_e.vpcf_c new file mode 100755 index 0000000..6ed45d4 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_e.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_f.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_f.vpcf_c new file mode 100755 index 0000000..a37955a Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_f.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_g.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_g.vpcf_c new file mode 100755 index 0000000..845248f Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_g.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_h.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_h.vpcf_c new file mode 100755 index 0000000..80e7507 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_h.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_i.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_i.vpcf_c new file mode 100755 index 0000000..f99ddf8 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_i.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_j.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_j.vpcf_c new file mode 100755 index 0000000..63a641b Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_j.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_boom_k.vpcf_c b/particles/heroes/humei/ability_humei_012_boom_k.vpcf_c new file mode 100755 index 0000000..0e77d39 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_boom_k.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_orb.vpcf_c b/particles/heroes/humei/ability_humei_012_orb.vpcf_c new file mode 100755 index 0000000..4665318 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_orb.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_orb_a.vpcf_c b/particles/heroes/humei/ability_humei_012_orb_a.vpcf_c new file mode 100755 index 0000000..675f021 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_orb_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_orb_b.vpcf_c b/particles/heroes/humei/ability_humei_012_orb_b.vpcf_c new file mode 100755 index 0000000..4e76016 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_orb_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_orb_c.vpcf_c b/particles/heroes/humei/ability_humei_012_orb_c.vpcf_c new file mode 100755 index 0000000..cbd8bb6 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_orb_c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_orb_d.vpcf_c b/particles/heroes/humei/ability_humei_012_orb_d.vpcf_c new file mode 100755 index 0000000..1f955da Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_orb_d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_orb_d0.vpcf_c b/particles/heroes/humei/ability_humei_012_orb_d0.vpcf_c new file mode 100755 index 0000000..8552e64 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_orb_d0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_orb_e.vpcf_c b/particles/heroes/humei/ability_humei_012_orb_e.vpcf_c new file mode 100755 index 0000000..a752366 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_orb_e.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_orb_f.vpcf_c b/particles/heroes/humei/ability_humei_012_orb_f.vpcf_c new file mode 100755 index 0000000..81fea94 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_orb_f.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_012_orb_g.vpcf_c b/particles/heroes/humei/ability_humei_012_orb_g.vpcf_c new file mode 100755 index 0000000..ec31164 Binary files /dev/null and b/particles/heroes/humei/ability_humei_012_orb_g.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect.vpcf_c b/particles/heroes/humei/ability_humei_01_effect.vpcf_c new file mode 100755 index 0000000..6c6d303 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_a.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_a.vpcf_c new file mode 100755 index 0000000..a6b5886 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_b.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_b.vpcf_c new file mode 100755 index 0000000..bb63cd2 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_c.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_c.vpcf_c new file mode 100755 index 0000000..1bab2bf Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_d.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_d.vpcf_c new file mode 100755 index 0000000..2167126 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_e.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_e.vpcf_c new file mode 100755 index 0000000..5ae66f8 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_e.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_e0.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_e0.vpcf_c new file mode 100755 index 0000000..37709a2 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_e0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_e1.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_e1.vpcf_c new file mode 100755 index 0000000..9c6ffd1 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_e1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_f.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_f.vpcf_c new file mode 100755 index 0000000..afd8b2d Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_f.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_g.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_g.vpcf_c new file mode 100755 index 0000000..1464d8e Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_g.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_h.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_h.vpcf_c new file mode 100755 index 0000000..9b17b93 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_h.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_h0.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_h0.vpcf_c new file mode 100755 index 0000000..357f00b Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_h0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_h1.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_h1.vpcf_c new file mode 100755 index 0000000..c477ed9 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_h1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_h2.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_h2.vpcf_c new file mode 100755 index 0000000..fcbe734 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_h2.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_h3.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_h3.vpcf_c new file mode 100755 index 0000000..2250ad3 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_h3.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_h4.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_h4.vpcf_c new file mode 100755 index 0000000..5f715a1 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_h4.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_i.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_i.vpcf_c new file mode 100755 index 0000000..a5e74e6 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_i.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_i0.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_i0.vpcf_c new file mode 100755 index 0000000..db28884 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_i0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_i0a.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_i0a.vpcf_c new file mode 100755 index 0000000..0bc51fa Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_i0a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_i0b.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_i0b.vpcf_c new file mode 100755 index 0000000..433e451 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_i0b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_i0c.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_i0c.vpcf_c new file mode 100755 index 0000000..69f3c67 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_i0c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_i1.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_i1.vpcf_c new file mode 100755 index 0000000..8307674 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_i1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_i1a.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_i1a.vpcf_c new file mode 100755 index 0000000..70871ca Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_i1a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_i1b.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_i1b.vpcf_c new file mode 100755 index 0000000..9f24cd6 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_i1b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_i1c.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_i1c.vpcf_c new file mode 100755 index 0000000..886b795 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_i1c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_i1d.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_i1d.vpcf_c new file mode 100755 index 0000000..874e67e Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_i1d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_i1e.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_i1e.vpcf_c new file mode 100755 index 0000000..0e6706d Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_i1e.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_i2.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_i2.vpcf_c new file mode 100755 index 0000000..74b548a Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_i2.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_effect_j.vpcf_c b/particles/heroes/humei/ability_humei_01_effect_j.vpcf_c new file mode 100755 index 0000000..3742ea0 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_effect_j.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning.vpcf_c new file mode 100755 index 0000000..ca0995b Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_a.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_a.vpcf_c new file mode 100755 index 0000000..d6e4340 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_a0.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_a0.vpcf_c new file mode 100755 index 0000000..2b8c7f1 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_a0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_a0a.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_a0a.vpcf_c new file mode 100755 index 0000000..87bfb4d Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_a0a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_a0b.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_a0b.vpcf_c new file mode 100755 index 0000000..df975ba Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_a0b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_a0c.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_a0c.vpcf_c new file mode 100755 index 0000000..26c3cfa Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_a0c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_a0d.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_a0d.vpcf_c new file mode 100755 index 0000000..f879a4e Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_a0d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_a1.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_a1.vpcf_c new file mode 100755 index 0000000..d0eeae8 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_a1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_a2.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_a2.vpcf_c new file mode 100755 index 0000000..9f06880 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_a2.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b.vpcf_c new file mode 100755 index 0000000..93f2d74 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b0.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b0.vpcf_c new file mode 100755 index 0000000..184fc28 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b1.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b1.vpcf_c new file mode 100755 index 0000000..e643299 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b2.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b2.vpcf_c new file mode 100755 index 0000000..e2797a5 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b2.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b3.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b3.vpcf_c new file mode 100755 index 0000000..5441243 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b3.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4.vpcf_c new file mode 100755 index 0000000..c99bd1b Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4a.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4a.vpcf_c new file mode 100755 index 0000000..5f86b85 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4a0.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4a0.vpcf_c new file mode 100755 index 0000000..00ddde3 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4a0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4a1.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4a1.vpcf_c new file mode 100755 index 0000000..b107fa9 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4a1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4a2.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4a2.vpcf_c new file mode 100755 index 0000000..d497916 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4a2.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4a3.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4a3.vpcf_c new file mode 100755 index 0000000..b82e408 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4a3.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4a4.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4a4.vpcf_c new file mode 100755 index 0000000..cca2a75 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4a4.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4a4a.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4a4a.vpcf_c new file mode 100755 index 0000000..17fce1a Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4a4a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4a5.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4a5.vpcf_c new file mode 100755 index 0000000..236464a Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4a5.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4b.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4b.vpcf_c new file mode 100755 index 0000000..92801fc Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4b0.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4b0.vpcf_c new file mode 100755 index 0000000..4cfef19 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4b0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4c.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4c.vpcf_c new file mode 100755 index 0000000..24407b1 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4d.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4d.vpcf_c new file mode 100755 index 0000000..0adcbdb Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4d0.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4d0.vpcf_c new file mode 100755 index 0000000..e59bac0 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4d0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4e.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4e.vpcf_c new file mode 100755 index 0000000..231f74c Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4e.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4e0.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4e0.vpcf_c new file mode 100755 index 0000000..5be014b Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4e0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4e1.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4e1.vpcf_c new file mode 100755 index 0000000..30d248e Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4e1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4e1a.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4e1a.vpcf_c new file mode 100755 index 0000000..44524cc Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4e1a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4e1a0.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4e1a0.vpcf_c new file mode 100755 index 0000000..16ee359 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4e1a0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4e1a1.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4e1a1.vpcf_c new file mode 100755 index 0000000..59e57ca Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4e1a1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b4f.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b4f.vpcf_c new file mode 100755 index 0000000..7e30e92 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b4f.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b5.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b5.vpcf_c new file mode 100755 index 0000000..b7cf7e9 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b5.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b6.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b6.vpcf_c new file mode 100755 index 0000000..fe8bd41 Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b6.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_01_lightning_b7.vpcf_c b/particles/heroes/humei/ability_humei_01_lightning_b7.vpcf_c new file mode 100755 index 0000000..b7829de Binary files /dev/null and b/particles/heroes/humei/ability_humei_01_lightning_b7.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_03_attack.vpcf_c b/particles/heroes/humei/ability_humei_03_attack.vpcf_c new file mode 100755 index 0000000..de6f23c Binary files /dev/null and b/particles/heroes/humei/ability_humei_03_attack.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_03_attack_a.vpcf_c b/particles/heroes/humei/ability_humei_03_attack_a.vpcf_c new file mode 100755 index 0000000..ba20d46 Binary files /dev/null and b/particles/heroes/humei/ability_humei_03_attack_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_03_attack_a0.vpcf_c b/particles/heroes/humei/ability_humei_03_attack_a0.vpcf_c new file mode 100755 index 0000000..60a876f Binary files /dev/null and b/particles/heroes/humei/ability_humei_03_attack_a0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_03_attack_a1.vpcf_c b/particles/heroes/humei/ability_humei_03_attack_a1.vpcf_c new file mode 100755 index 0000000..8d01041 Binary files /dev/null and b/particles/heroes/humei/ability_humei_03_attack_a1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_03_attack_a2.vpcf_c b/particles/heroes/humei/ability_humei_03_attack_a2.vpcf_c new file mode 100755 index 0000000..837e7c5 Binary files /dev/null and b/particles/heroes/humei/ability_humei_03_attack_a2.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_03_attack_a3.vpcf_c b/particles/heroes/humei/ability_humei_03_attack_a3.vpcf_c new file mode 100755 index 0000000..2d0c2fc Binary files /dev/null and b/particles/heroes/humei/ability_humei_03_attack_a3.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_03_attack_b.vpcf_c b/particles/heroes/humei/ability_humei_03_attack_b.vpcf_c new file mode 100755 index 0000000..5f49d1f Binary files /dev/null and b/particles/heroes/humei/ability_humei_03_attack_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_03_attack_c.vpcf_c b/particles/heroes/humei/ability_humei_03_attack_c.vpcf_c new file mode 100755 index 0000000..a1461e1 Binary files /dev/null and b/particles/heroes/humei/ability_humei_03_attack_c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_03_attack_c0.vpcf_c b/particles/heroes/humei/ability_humei_03_attack_c0.vpcf_c new file mode 100755 index 0000000..f1bce90 Binary files /dev/null and b/particles/heroes/humei/ability_humei_03_attack_c0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_03_attack_c1.vpcf_c b/particles/heroes/humei/ability_humei_03_attack_c1.vpcf_c new file mode 100755 index 0000000..d10b7df Binary files /dev/null and b/particles/heroes/humei/ability_humei_03_attack_c1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_03_attack_d.vpcf_c b/particles/heroes/humei/ability_humei_03_attack_d.vpcf_c new file mode 100755 index 0000000..9529908 Binary files /dev/null and b/particles/heroes/humei/ability_humei_03_attack_d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_03_attack_e.vpcf_c b/particles/heroes/humei/ability_humei_03_attack_e.vpcf_c new file mode 100755 index 0000000..e4cd320 Binary files /dev/null and b/particles/heroes/humei/ability_humei_03_attack_e.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_04_a5.vpcf_c b/particles/heroes/humei/ability_humei_04_a5.vpcf_c new file mode 100755 index 0000000..512c6d5 Binary files /dev/null and b/particles/heroes/humei/ability_humei_04_a5.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_04_b.vpcf_c b/particles/heroes/humei/ability_humei_04_b.vpcf_c new file mode 100755 index 0000000..2f54184 Binary files /dev/null and b/particles/heroes/humei/ability_humei_04_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_04_c.vpcf_c b/particles/heroes/humei/ability_humei_04_c.vpcf_c new file mode 100755 index 0000000..6e9d938 Binary files /dev/null and b/particles/heroes/humei/ability_humei_04_c.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_04_c0.vpcf_c b/particles/heroes/humei/ability_humei_04_c0.vpcf_c new file mode 100755 index 0000000..23d4853 Binary files /dev/null and b/particles/heroes/humei/ability_humei_04_c0.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_04_c1.vpcf_c b/particles/heroes/humei/ability_humei_04_c1.vpcf_c new file mode 100755 index 0000000..077d1ab Binary files /dev/null and b/particles/heroes/humei/ability_humei_04_c1.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_04_c2.vpcf_c b/particles/heroes/humei/ability_humei_04_c2.vpcf_c new file mode 100755 index 0000000..8983c4e Binary files /dev/null and b/particles/heroes/humei/ability_humei_04_c2.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_04_d.vpcf_c b/particles/heroes/humei/ability_humei_04_d.vpcf_c new file mode 100755 index 0000000..3ecebad Binary files /dev/null and b/particles/heroes/humei/ability_humei_04_d.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_04_spark_wind_b.vpcf_c b/particles/heroes/humei/ability_humei_04_spark_wind_b.vpcf_c new file mode 100755 index 0000000..2a694b6 Binary files /dev/null and b/particles/heroes/humei/ability_humei_04_spark_wind_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_04_spark_wind_b_a.vpcf_c b/particles/heroes/humei/ability_humei_04_spark_wind_b_a.vpcf_c new file mode 100755 index 0000000..ddda364 Binary files /dev/null and b/particles/heroes/humei/ability_humei_04_spark_wind_b_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_04_spark_wind_b_b.vpcf_c b/particles/heroes/humei/ability_humei_04_spark_wind_b_b.vpcf_c new file mode 100755 index 0000000..e9bc182 Binary files /dev/null and b/particles/heroes/humei/ability_humei_04_spark_wind_b_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_humei_04_spark_wind_b_c.vpcf_c b/particles/heroes/humei/ability_humei_04_spark_wind_b_c.vpcf_c new file mode 100755 index 0000000..d9b4bd4 Binary files /dev/null and b/particles/heroes/humei/ability_humei_04_spark_wind_b_c.vpcf_c differ diff --git a/particles/heroes/humei/ability_minamitsu_03_body.vpcf_c b/particles/heroes/humei/ability_minamitsu_03_body.vpcf_c new file mode 100755 index 0000000..d971189 Binary files /dev/null and b/particles/heroes/humei/ability_minamitsu_03_body.vpcf_c differ diff --git a/particles/heroes/humei/ability_minamitsu_03_body_a.vpcf_c b/particles/heroes/humei/ability_minamitsu_03_body_a.vpcf_c new file mode 100755 index 0000000..ac1404f Binary files /dev/null and b/particles/heroes/humei/ability_minamitsu_03_body_a.vpcf_c differ diff --git a/particles/heroes/humei/ability_minamitsu_03_body_b.vpcf_c b/particles/heroes/humei/ability_minamitsu_03_body_b.vpcf_c new file mode 100755 index 0000000..33f36eb Binary files /dev/null and b/particles/heroes/humei/ability_minamitsu_03_body_b.vpcf_c differ diff --git a/particles/heroes/humei/ability_minamitsu_03_body_c.vpcf_c b/particles/heroes/humei/ability_minamitsu_03_body_c.vpcf_c new file mode 100755 index 0000000..898ae1b Binary files /dev/null and b/particles/heroes/humei/ability_minamitsu_03_body_c.vpcf_c differ diff --git a/particles/heroes/humei/ability_minamitsu_03_body_d.vpcf_c b/particles/heroes/humei/ability_minamitsu_03_body_d.vpcf_c new file mode 100755 index 0000000..1f3e673 Binary files /dev/null and b/particles/heroes/humei/ability_minamitsu_03_body_d.vpcf_c differ diff --git a/particles/heroes/humei/ability_minamitsu_03_body_e.vpcf_c b/particles/heroes/humei/ability_minamitsu_03_body_e.vpcf_c new file mode 100755 index 0000000..89f7436 Binary files /dev/null and b/particles/heroes/humei/ability_minamitsu_03_body_e.vpcf_c differ diff --git a/particles/heroes/humei/ability_minamitsu_03_body_f.vpcf_c b/particles/heroes/humei/ability_minamitsu_03_body_f.vpcf_c new file mode 100755 index 0000000..180bbac Binary files /dev/null and b/particles/heroes/humei/ability_minamitsu_03_body_f.vpcf_c differ diff --git a/particles/heroes/humei/ability_minamitsu_03_body_g.vpcf_c b/particles/heroes/humei/ability_minamitsu_03_body_g.vpcf_c new file mode 100755 index 0000000..4dc145c Binary files /dev/null and b/particles/heroes/humei/ability_minamitsu_03_body_g.vpcf_c differ diff --git a/particles/heroes/humei/bane_nightmare_light.vpcf_c b/particles/heroes/humei/bane_nightmare_light.vpcf_c new file mode 100755 index 0000000..0aff7a1 Binary files /dev/null and b/particles/heroes/humei/bane_nightmare_light.vpcf_c differ diff --git a/particles/heroes/humei/bane_nightmare_slimeglow.vpcf_c b/particles/heroes/humei/bane_nightmare_slimeglow.vpcf_c new file mode 100755 index 0000000..503508d Binary files /dev/null and b/particles/heroes/humei/bane_nightmare_slimeglow.vpcf_c differ diff --git a/particles/heroes/humei/enchantress_death_butterfly.vpcf_c b/particles/heroes/humei/enchantress_death_butterfly.vpcf_c new file mode 100755 index 0000000..d66deb8 Binary files /dev/null and b/particles/heroes/humei/enchantress_death_butterfly.vpcf_c differ diff --git a/particles/heroes/humei/keeper_cast01_glow3.vpcf_c b/particles/heroes/humei/keeper_cast01_glow3.vpcf_c new file mode 100755 index 0000000..720a9ca Binary files /dev/null and b/particles/heroes/humei/keeper_cast01_glow3.vpcf_c differ diff --git a/particles/heroes/humei/keeper_cast02_glow2.vpcf_c b/particles/heroes/humei/keeper_cast02_glow2.vpcf_c new file mode 100755 index 0000000..ce3cc0d Binary files /dev/null and b/particles/heroes/humei/keeper_cast02_glow2.vpcf_c differ diff --git a/particles/heroes/humei/keeper_cast02_glow4.vpcf_c b/particles/heroes/humei/keeper_cast02_glow4.vpcf_c new file mode 100755 index 0000000..dec7f36 Binary files /dev/null and b/particles/heroes/humei/keeper_cast02_glow4.vpcf_c differ diff --git a/particles/heroes/humei/keeper_chakra_magic_beam_projectile.vpcf_c b/particles/heroes/humei/keeper_chakra_magic_beam_projectile.vpcf_c new file mode 100755 index 0000000..e32e244 Binary files /dev/null and b/particles/heroes/humei/keeper_chakra_magic_beam_projectile.vpcf_c differ diff --git a/particles/heroes/humei/templar_assassin_trap_bits_butterfly.vpcf_c b/particles/heroes/humei/templar_assassin_trap_bits_butterfly.vpcf_c new file mode 100755 index 0000000..1cbe147 Binary files /dev/null and b/particles/heroes/humei/templar_assassin_trap_bits_butterfly.vpcf_c differ diff --git a/particles/heroes/humei/templar_assassin_trap_proj_drk_butterfly.vpcf_c b/particles/heroes/humei/templar_assassin_trap_proj_drk_butterfly.vpcf_c new file mode 100755 index 0000000..03c9ac9 Binary files /dev/null and b/particles/heroes/humei/templar_assassin_trap_proj_drk_butterfly.vpcf_c differ diff --git a/particles/heroes/iku/ability_iku_01_explosion.vpcf_c b/particles/heroes/iku/ability_iku_01_explosion.vpcf_c new file mode 100755 index 0000000..06a601f Binary files /dev/null and b/particles/heroes/iku/ability_iku_01_explosion.vpcf_c differ diff --git a/particles/heroes/iku/ability_iku_01_explosion_a.vpcf_c b/particles/heroes/iku/ability_iku_01_explosion_a.vpcf_c new file mode 100755 index 0000000..6ecbb97 Binary files /dev/null and b/particles/heroes/iku/ability_iku_01_explosion_a.vpcf_c differ diff --git a/particles/heroes/iku/ability_iku_01_explosion_b.vpcf_c b/particles/heroes/iku/ability_iku_01_explosion_b.vpcf_c new file mode 100755 index 0000000..3106b50 Binary files /dev/null and b/particles/heroes/iku/ability_iku_01_explosion_b.vpcf_c differ diff --git a/particles/heroes/iku/ability_iku_01_explosion_c.vpcf_c b/particles/heroes/iku/ability_iku_01_explosion_c.vpcf_c new file mode 100755 index 0000000..45595a7 Binary files /dev/null and b/particles/heroes/iku/ability_iku_01_explosion_c.vpcf_c differ diff --git a/particles/heroes/iku/ability_iku_01_explosion_d.vpcf_c b/particles/heroes/iku/ability_iku_01_explosion_d.vpcf_c new file mode 100755 index 0000000..293266f Binary files /dev/null and b/particles/heroes/iku/ability_iku_01_explosion_d.vpcf_c differ diff --git a/particles/heroes/iku/ability_iku_01_explosion_e.vpcf_c b/particles/heroes/iku/ability_iku_01_explosion_e.vpcf_c new file mode 100755 index 0000000..86ec6a7 Binary files /dev/null and b/particles/heroes/iku/ability_iku_01_explosion_e.vpcf_c differ diff --git a/particles/heroes/iku/ability_iku_lightning.vpcf_c b/particles/heroes/iku/ability_iku_lightning.vpcf_c new file mode 100755 index 0000000..2342b40 Binary files /dev/null and b/particles/heroes/iku/ability_iku_lightning.vpcf_c differ diff --git a/particles/heroes/iku/ability_iku_lightning_a.vpcf_c b/particles/heroes/iku/ability_iku_lightning_a.vpcf_c new file mode 100755 index 0000000..dca77ca Binary files /dev/null and b/particles/heroes/iku/ability_iku_lightning_a.vpcf_c differ diff --git a/particles/heroes/iku/ability_iku_lightning_b.vpcf_c b/particles/heroes/iku/ability_iku_lightning_b.vpcf_c new file mode 100755 index 0000000..962beb7 Binary files /dev/null and b/particles/heroes/iku/ability_iku_lightning_b.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect.vpcf_c new file mode 100755 index 0000000..5850eb1 Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect_a.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect_a.vpcf_c new file mode 100755 index 0000000..042e19b Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect_a.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect_b.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect_b.vpcf_c new file mode 100755 index 0000000..3536780 Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect_b.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect_c.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect_c.vpcf_c new file mode 100755 index 0000000..bbe52ee Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect_c.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect_d.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect_d.vpcf_c new file mode 100755 index 0000000..24f0886 Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect_d.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect_e.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect_e.vpcf_c new file mode 100755 index 0000000..040fba8 Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect_e.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect_f.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect_f.vpcf_c new file mode 100755 index 0000000..d36e10c Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect_f.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect_g.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect_g.vpcf_c new file mode 100755 index 0000000..a42d3b7 Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect_g.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect_h.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect_h.vpcf_c new file mode 100755 index 0000000..a0d3edc Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect_h.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect_i.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect_i.vpcf_c new file mode 100755 index 0000000..11894eb Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect_i.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect_j.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect_j.vpcf_c new file mode 100755 index 0000000..ed36287 Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect_j.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect_k.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect_k.vpcf_c new file mode 100755 index 0000000..c8e7eb2 Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect_k.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_effect_k0.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_effect_k0.vpcf_c new file mode 100755 index 0000000..be4400b Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_effect_k0.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_explosion.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_explosion.vpcf_c new file mode 100755 index 0000000..f153d10 Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_explosion.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_explosion_a.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_explosion_a.vpcf_c new file mode 100755 index 0000000..ac4a2a3 Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_explosion_a.vpcf_c differ diff --git a/particles/heroes/kaguya/ability_kaguya04_explosion_b.vpcf_c b/particles/heroes/kaguya/ability_kaguya04_explosion_b.vpcf_c new file mode 100755 index 0000000..880cfec Binary files /dev/null and b/particles/heroes/kaguya/ability_kaguya04_explosion_b.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_01.vpcf_c b/particles/heroes/kanako/ability_kanako_01.vpcf_c new file mode 100755 index 0000000..6978bb4 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_01.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_01_explosion.vpcf_c b/particles/heroes/kanako/ability_kanako_01_explosion.vpcf_c new file mode 100755 index 0000000..7bc9876 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_01_explosion.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_01_explosion_a.vpcf_c b/particles/heroes/kanako/ability_kanako_01_explosion_a.vpcf_c new file mode 100755 index 0000000..92749b8 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_01_explosion_a.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_01_explosion_b.vpcf_c b/particles/heroes/kanako/ability_kanako_01_explosion_b.vpcf_c new file mode 100755 index 0000000..e45b12b Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_01_explosion_b.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_01_explosion_c.vpcf_c b/particles/heroes/kanako/ability_kanako_01_explosion_c.vpcf_c new file mode 100755 index 0000000..f9fc7e3 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_01_explosion_c.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_01_explosion_c0.vpcf_c b/particles/heroes/kanako/ability_kanako_01_explosion_c0.vpcf_c new file mode 100755 index 0000000..36d8ec4 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_01_explosion_c0.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_01_explosion_c1.vpcf_c b/particles/heroes/kanako/ability_kanako_01_explosion_c1.vpcf_c new file mode 100755 index 0000000..55cbd9a Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_01_explosion_c1.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_01_explosion_d.vpcf_c b/particles/heroes/kanako/ability_kanako_01_explosion_d.vpcf_c new file mode 100755 index 0000000..dff2228 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_01_explosion_d.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_01_explosion_e.vpcf_c b/particles/heroes/kanako/ability_kanako_01_explosion_e.vpcf_c new file mode 100755 index 0000000..7f49629 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_01_explosion_e.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_01_explosion_f.vpcf_c b/particles/heroes/kanako/ability_kanako_01_explosion_f.vpcf_c new file mode 100755 index 0000000..9fc7aed Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_01_explosion_f.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_01_projectile.vpcf_c b/particles/heroes/kanako/ability_kanako_01_projectile.vpcf_c new file mode 100755 index 0000000..fab9b00 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_01_projectile.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_02.vpcf_c b/particles/heroes/kanako/ability_kanako_02.vpcf_c new file mode 100755 index 0000000..e8bfb6c Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_02.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04.vpcf_c b/particles/heroes/kanako/ability_kanako_04.vpcf_c new file mode 100755 index 0000000..2475484 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_041.vpcf_c b/particles/heroes/kanako/ability_kanako_041.vpcf_c new file mode 100755 index 0000000..57c64ad Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_041.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_041_a.vpcf_c b/particles/heroes/kanako/ability_kanako_041_a.vpcf_c new file mode 100755 index 0000000..6a12b28 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_041_a.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_041_b.vpcf_c b/particles/heroes/kanako/ability_kanako_041_b.vpcf_c new file mode 100755 index 0000000..c6d05ab Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_041_b.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_041_c.vpcf_c b/particles/heroes/kanako/ability_kanako_041_c.vpcf_c new file mode 100755 index 0000000..cb0a813 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_041_c.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_041_d.vpcf_c b/particles/heroes/kanako/ability_kanako_041_d.vpcf_c new file mode 100755 index 0000000..d1dcf17 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_041_d.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_041_e.vpcf_c b/particles/heroes/kanako/ability_kanako_041_e.vpcf_c new file mode 100755 index 0000000..d6290a5 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_041_e.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_041_projectile.vpcf_c b/particles/heroes/kanako/ability_kanako_041_projectile.vpcf_c new file mode 100755 index 0000000..9678266 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_041_projectile.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_042.vpcf_c b/particles/heroes/kanako/ability_kanako_042.vpcf_c new file mode 100755 index 0000000..c14aeeb Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_042.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_042_bv.vpcf_c b/particles/heroes/kanako/ability_kanako_042_bv.vpcf_c new file mode 100755 index 0000000..38e6e80 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_042_bv.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_043.vpcf_c b/particles/heroes/kanako/ability_kanako_043.vpcf_c new file mode 100755 index 0000000..001a062 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_043.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_043_a.vpcf_c b/particles/heroes/kanako/ability_kanako_043_a.vpcf_c new file mode 100755 index 0000000..ef332de Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_043_a.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_043_b.vpcf_c b/particles/heroes/kanako/ability_kanako_043_b.vpcf_c new file mode 100755 index 0000000..f83ec77 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_043_b.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_043_c.vpcf_c b/particles/heroes/kanako/ability_kanako_043_c.vpcf_c new file mode 100755 index 0000000..e4af761 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_043_c.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_a.vpcf_c b/particles/heroes/kanako/ability_kanako_04_a.vpcf_c new file mode 100755 index 0000000..daa9921 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_a.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_a0.vpcf_c b/particles/heroes/kanako/ability_kanako_04_a0.vpcf_c new file mode 100755 index 0000000..9a16852 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_a0.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_a0a.vpcf_c b/particles/heroes/kanako/ability_kanako_04_a0a.vpcf_c new file mode 100755 index 0000000..0ab6a38 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_a0a.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_b.vpcf_c b/particles/heroes/kanako/ability_kanako_04_b.vpcf_c new file mode 100755 index 0000000..1542782 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_b.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c.vpcf_c new file mode 100755 index 0000000..e87ce9f Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c0.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c0.vpcf_c new file mode 100755 index 0000000..3f295e6 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c0.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c1.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c1.vpcf_c new file mode 100755 index 0000000..761da38 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c1.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c1a.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c1a.vpcf_c new file mode 100755 index 0000000..a4a6238 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c1a.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c2.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c2.vpcf_c new file mode 100755 index 0000000..c67cbfe Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c2.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c2a.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c2a.vpcf_c new file mode 100755 index 0000000..1b0f085 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c2a.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c2a0.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c2a0.vpcf_c new file mode 100755 index 0000000..0c6a7da Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c2a0.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c2a1.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c2a1.vpcf_c new file mode 100755 index 0000000..cf06687 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c2a1.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c3.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c3.vpcf_c new file mode 100755 index 0000000..e238749 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c3.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c4.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c4.vpcf_c new file mode 100755 index 0000000..071e2eb Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c4.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c4a.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c4a.vpcf_c new file mode 100755 index 0000000..3074a4b Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c4a.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c4b.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c4b.vpcf_c new file mode 100755 index 0000000..45f2a64 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c4b.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c4c.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c4c.vpcf_c new file mode 100755 index 0000000..5f8df23 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c4c.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c4c0.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c4c0.vpcf_c new file mode 100755 index 0000000..3b6da54 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c4c0.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c4c1.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c4c1.vpcf_c new file mode 100755 index 0000000..3211224 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c4c1.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c5.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c5.vpcf_c new file mode 100755 index 0000000..86f6ce1 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c5.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c5a.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c5a.vpcf_c new file mode 100755 index 0000000..9c1c724 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c5a.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c6.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c6.vpcf_c new file mode 100755 index 0000000..d41e9f7 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c6.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_c7.vpcf_c b/particles/heroes/kanako/ability_kanako_04_c7.vpcf_c new file mode 100755 index 0000000..76b3fdd Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_c7.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_d.vpcf_c b/particles/heroes/kanako/ability_kanako_04_d.vpcf_c new file mode 100755 index 0000000..6fb8830 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_d.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_e.vpcf_c b/particles/heroes/kanako/ability_kanako_04_e.vpcf_c new file mode 100755 index 0000000..45db84d Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_e.vpcf_c differ diff --git a/particles/heroes/kanako/ability_kanako_04_f.vpcf_c b/particles/heroes/kanako/ability_kanako_04_f.vpcf_c new file mode 100755 index 0000000..a4774b0 Binary files /dev/null and b/particles/heroes/kanako/ability_kanako_04_f.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01.vpcf_c new file mode 100755 index 0000000..85ac40c Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_a.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_a.vpcf_c new file mode 100755 index 0000000..a488c4c Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_a.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_b.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_b.vpcf_c new file mode 100755 index 0000000..ef4194d Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_b.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_c.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_c.vpcf_c new file mode 100755 index 0000000..72de412 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_c.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_d.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_d.vpcf_c new file mode 100755 index 0000000..39e9202 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_d.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_debuff.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_debuff.vpcf_c new file mode 100755 index 0000000..d28d7f6 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_debuff.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_debuff_a.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_debuff_a.vpcf_c new file mode 100755 index 0000000..0019d10 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_debuff_a.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_debuff_b.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_debuff_b.vpcf_c new file mode 100755 index 0000000..1781fba Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_debuff_b.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_debuff_c.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_debuff_c.vpcf_c new file mode 100755 index 0000000..cec15cd Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_debuff_c.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_debuff_d.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_debuff_d.vpcf_c new file mode 100755 index 0000000..936f753 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_debuff_d.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_debuff_e.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_debuff_e.vpcf_c new file mode 100755 index 0000000..4f74c78 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_debuff_e.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_e.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_e.vpcf_c new file mode 100755 index 0000000..4aeb784 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_e.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_f.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_f.vpcf_c new file mode 100755 index 0000000..4e0f309 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_f.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_g.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_g.vpcf_c new file mode 100755 index 0000000..fb49908 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_g.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_h.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_h.vpcf_c new file mode 100755 index 0000000..f748ff7 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_h.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_i.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_i.vpcf_c new file mode 100755 index 0000000..c096ed0 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_i.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_j.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_j.vpcf_c new file mode 100755 index 0000000..2c60622 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_j.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_j0.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_j0.vpcf_c new file mode 100755 index 0000000..bda54f8 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_j0.vpcf_c differ diff --git a/particles/heroes/kogasa/ability_kogasa_01_k.vpcf_c b/particles/heroes/kogasa/ability_kogasa_01_k.vpcf_c new file mode 100755 index 0000000..ec26174 Binary files /dev/null and b/particles/heroes/kogasa/ability_kogasa_01_k.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_01.vpcf_c b/particles/heroes/komachi/ability_komachi_01.vpcf_c new file mode 100755 index 0000000..95f4e37 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_01.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_02.vpcf_c b/particles/heroes/komachi/ability_komachi_02.vpcf_c new file mode 100755 index 0000000..d27cbb8 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_02.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_02_a.vpcf_c b/particles/heroes/komachi/ability_komachi_02_a.vpcf_c new file mode 100755 index 0000000..4d011e1 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_02_a.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_02_b.vpcf_c b/particles/heroes/komachi/ability_komachi_02_b.vpcf_c new file mode 100755 index 0000000..4752640 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_02_b.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_02_c.vpcf_c b/particles/heroes/komachi/ability_komachi_02_c.vpcf_c new file mode 100755 index 0000000..cf9429a Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_02_c.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03.vpcf_c b/particles/heroes/komachi/ability_komachi_03.vpcf_c new file mode 100755 index 0000000..4c4b4bb Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_a.vpcf_c b/particles/heroes/komachi/ability_komachi_03_a.vpcf_c new file mode 100755 index 0000000..65fa65a Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_a.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_b.vpcf_c b/particles/heroes/komachi/ability_komachi_03_b.vpcf_c new file mode 100755 index 0000000..864de8c Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_b.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_c.vpcf_c b/particles/heroes/komachi/ability_komachi_03_c.vpcf_c new file mode 100755 index 0000000..d7fcdc3 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_c.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_d.vpcf_c b/particles/heroes/komachi/ability_komachi_03_d.vpcf_c new file mode 100755 index 0000000..ad32f6d Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_d.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_e.vpcf_c b/particles/heroes/komachi/ability_komachi_03_e.vpcf_c new file mode 100755 index 0000000..e5ae361 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_e.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion.vpcf_c new file mode 100755 index 0000000..e695cce Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_2.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_2.vpcf_c new file mode 100755 index 0000000..98553c0 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_2.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_2_a.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_2_a.vpcf_c new file mode 100755 index 0000000..3da64ba Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_2_a.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_2_b.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_2_b.vpcf_c new file mode 100755 index 0000000..a23432e Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_2_b.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_2_c.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_2_c.vpcf_c new file mode 100755 index 0000000..aa966d1 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_2_c.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_2_d.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_2_d.vpcf_c new file mode 100755 index 0000000..846ddbd Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_2_d.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_2_e.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_2_e.vpcf_c new file mode 100755 index 0000000..cc059ce Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_2_e.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_2_f.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_2_f.vpcf_c new file mode 100755 index 0000000..8340529 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_2_f.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_a.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_a.vpcf_c new file mode 100755 index 0000000..ff1b50b Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_a.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_b.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_b.vpcf_c new file mode 100755 index 0000000..3a96534 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_b.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_b0.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_b0.vpcf_c new file mode 100755 index 0000000..2b3487c Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_b0.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_c.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_c.vpcf_c new file mode 100755 index 0000000..18d97ec Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_c.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_d.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_d.vpcf_c new file mode 100755 index 0000000..aca20f7 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_d.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_e.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_e.vpcf_c new file mode 100755 index 0000000..72fc8a0 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_e.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_explosion_f.vpcf_c b/particles/heroes/komachi/ability_komachi_03_explosion_f.vpcf_c new file mode 100755 index 0000000..e7d6ec6 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_explosion_f.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_f.vpcf_c b/particles/heroes/komachi/ability_komachi_03_f.vpcf_c new file mode 100755 index 0000000..ffbddb5 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_f.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_g.vpcf_c b/particles/heroes/komachi/ability_komachi_03_g.vpcf_c new file mode 100755 index 0000000..097a5bf Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_g.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_h.vpcf_c b/particles/heroes/komachi/ability_komachi_03_h.vpcf_c new file mode 100755 index 0000000..ce649e5 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_h.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_03_i.vpcf_c b/particles/heroes/komachi/ability_komachi_03_i.vpcf_c new file mode 100755 index 0000000..c23a021 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_03_i.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_blink.vpcf_c b/particles/heroes/komachi/ability_komachi_04_blink.vpcf_c new file mode 100755 index 0000000..a0722fe Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_blink.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_blink_a.vpcf_c b/particles/heroes/komachi/ability_komachi_04_blink_a.vpcf_c new file mode 100755 index 0000000..900104c Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_blink_a.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_blink_a0.vpcf_c b/particles/heroes/komachi/ability_komachi_04_blink_a0.vpcf_c new file mode 100755 index 0000000..d2dc55c Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_blink_a0.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_blink_a0a.vpcf_c b/particles/heroes/komachi/ability_komachi_04_blink_a0a.vpcf_c new file mode 100755 index 0000000..5c150b5 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_blink_a0a.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_blink_a0b.vpcf_c b/particles/heroes/komachi/ability_komachi_04_blink_a0b.vpcf_c new file mode 100755 index 0000000..b96f877 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_blink_a0b.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_blink_b.vpcf_c b/particles/heroes/komachi/ability_komachi_04_blink_b.vpcf_c new file mode 100755 index 0000000..cf7ff9a Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_blink_b.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_blink_b0.vpcf_c b/particles/heroes/komachi/ability_komachi_04_blink_b0.vpcf_c new file mode 100755 index 0000000..cd131ef Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_blink_b0.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_blink_b1.vpcf_c b/particles/heroes/komachi/ability_komachi_04_blink_b1.vpcf_c new file mode 100755 index 0000000..eedc371 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_blink_b1.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_circle.vpcf_c b/particles/heroes/komachi/ability_komachi_04_circle.vpcf_c new file mode 100755 index 0000000..c18017d Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_circle.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_circle_a.vpcf_c b/particles/heroes/komachi/ability_komachi_04_circle_a.vpcf_c new file mode 100755 index 0000000..7130096 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_circle_a.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_scythe.vpcf_c b/particles/heroes/komachi/ability_komachi_04_scythe.vpcf_c new file mode 100755 index 0000000..7f9959f Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_scythe.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_scythe_a.vpcf_c b/particles/heroes/komachi/ability_komachi_04_scythe_a.vpcf_c new file mode 100755 index 0000000..36f8483 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_scythe_a.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_scythe_b.vpcf_c b/particles/heroes/komachi/ability_komachi_04_scythe_b.vpcf_c new file mode 100755 index 0000000..b93eecc Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_scythe_b.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_scythe_c.vpcf_c b/particles/heroes/komachi/ability_komachi_04_scythe_c.vpcf_c new file mode 100755 index 0000000..43e5127 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_scythe_c.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_scythe_d.vpcf_c b/particles/heroes/komachi/ability_komachi_04_scythe_d.vpcf_c new file mode 100755 index 0000000..0db86a3 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_scythe_d.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_scythe_e.vpcf_c b/particles/heroes/komachi/ability_komachi_04_scythe_e.vpcf_c new file mode 100755 index 0000000..119ce71 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_scythe_e.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_scythe_f.vpcf_c b/particles/heroes/komachi/ability_komachi_04_scythe_f.vpcf_c new file mode 100755 index 0000000..63a8f14 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_scythe_f.vpcf_c differ diff --git a/particles/heroes/komachi/ability_komachi_04_start.vpcf_c b/particles/heroes/komachi/ability_komachi_04_start.vpcf_c new file mode 100755 index 0000000..ca1e7c2 Binary files /dev/null and b/particles/heroes/komachi/ability_komachi_04_start.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01.vpcf_c b/particles/heroes/letty/ability_letty_01.vpcf_c new file mode 100755 index 0000000..89fb35a Binary files /dev/null and b/particles/heroes/letty/ability_letty_01.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_a.vpcf_c b/particles/heroes/letty/ability_letty_01_a.vpcf_c new file mode 100755 index 0000000..aae0e2c Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_a.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_b.vpcf_c b/particles/heroes/letty/ability_letty_01_b.vpcf_c new file mode 100755 index 0000000..0b10860 Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_b.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_c.vpcf_c b/particles/heroes/letty/ability_letty_01_c.vpcf_c new file mode 100755 index 0000000..c04894f Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_c.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_d.vpcf_c b/particles/heroes/letty/ability_letty_01_d.vpcf_c new file mode 100755 index 0000000..fd29447 Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_d.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_e.vpcf_c b/particles/heroes/letty/ability_letty_01_e.vpcf_c new file mode 100755 index 0000000..a69b8ca Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_e.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_f.vpcf_c b/particles/heroes/letty/ability_letty_01_f.vpcf_c new file mode 100755 index 0000000..289a1aa Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_f.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_g.vpcf_c b/particles/heroes/letty/ability_letty_01_g.vpcf_c new file mode 100755 index 0000000..f562da8 Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_g.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_h.vpcf_c b/particles/heroes/letty/ability_letty_01_h.vpcf_c new file mode 100755 index 0000000..26f317b Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_h.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_i.vpcf_c b/particles/heroes/letty/ability_letty_01_i.vpcf_c new file mode 100755 index 0000000..05572b0 Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_i.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_j.vpcf_c b/particles/heroes/letty/ability_letty_01_j.vpcf_c new file mode 100755 index 0000000..b4794f9 Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_j.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_k.vpcf_c b/particles/heroes/letty/ability_letty_01_k.vpcf_c new file mode 100755 index 0000000..34bfc76 Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_k.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_k0.vpcf_c b/particles/heroes/letty/ability_letty_01_k0.vpcf_c new file mode 100755 index 0000000..2950ac6 Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_k0.vpcf_c differ diff --git a/particles/heroes/letty/ability_letty_01_k0a.vpcf_c b/particles/heroes/letty/ability_letty_01_k0a.vpcf_c new file mode 100755 index 0000000..7f5a9da Binary files /dev/null and b/particles/heroes/letty/ability_letty_01_k0a.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01.vpcf_c b/particles/heroes/lily/ability_lily_01.vpcf_c new file mode 100755 index 0000000..14d69a9 Binary files /dev/null and b/particles/heroes/lily/ability_lily_01.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01_a.vpcf_c b/particles/heroes/lily/ability_lily_01_a.vpcf_c new file mode 100755 index 0000000..614b641 Binary files /dev/null and b/particles/heroes/lily/ability_lily_01_a.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01_a0.vpcf_c b/particles/heroes/lily/ability_lily_01_a0.vpcf_c new file mode 100755 index 0000000..f452fb8 Binary files /dev/null and b/particles/heroes/lily/ability_lily_01_a0.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01_a1.vpcf_c b/particles/heroes/lily/ability_lily_01_a1.vpcf_c new file mode 100755 index 0000000..b0b477b Binary files /dev/null and b/particles/heroes/lily/ability_lily_01_a1.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01_a2.vpcf_c b/particles/heroes/lily/ability_lily_01_a2.vpcf_c new file mode 100755 index 0000000..03ef5c8 Binary files /dev/null and b/particles/heroes/lily/ability_lily_01_a2.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01_a3.vpcf_c b/particles/heroes/lily/ability_lily_01_a3.vpcf_c new file mode 100755 index 0000000..7ba70ab Binary files /dev/null and b/particles/heroes/lily/ability_lily_01_a3.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01_a4.vpcf_c b/particles/heroes/lily/ability_lily_01_a4.vpcf_c new file mode 100755 index 0000000..2327b29 Binary files /dev/null and b/particles/heroes/lily/ability_lily_01_a4.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01_a5.vpcf_c b/particles/heroes/lily/ability_lily_01_a5.vpcf_c new file mode 100755 index 0000000..1971d46 Binary files /dev/null and b/particles/heroes/lily/ability_lily_01_a5.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01_a6.vpcf_c b/particles/heroes/lily/ability_lily_01_a6.vpcf_c new file mode 100755 index 0000000..270d1c9 Binary files /dev/null and b/particles/heroes/lily/ability_lily_01_a6.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01_a7.vpcf_c b/particles/heroes/lily/ability_lily_01_a7.vpcf_c new file mode 100755 index 0000000..d12ba8c Binary files /dev/null and b/particles/heroes/lily/ability_lily_01_a7.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01_a8.vpcf_c b/particles/heroes/lily/ability_lily_01_a8.vpcf_c new file mode 100755 index 0000000..83835ff Binary files /dev/null and b/particles/heroes/lily/ability_lily_01_a8.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01_ready.vpcf_c b/particles/heroes/lily/ability_lily_01_ready.vpcf_c new file mode 100755 index 0000000..eb80ca3 Binary files /dev/null and b/particles/heroes/lily/ability_lily_01_ready.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_01_ready_a.vpcf_c b/particles/heroes/lily/ability_lily_01_ready_a.vpcf_c new file mode 100755 index 0000000..95f39af Binary files /dev/null and b/particles/heroes/lily/ability_lily_01_ready_a.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02.vpcf_c b/particles/heroes/lily/ability_lily_02.vpcf_c new file mode 100755 index 0000000..72050c6 Binary files /dev/null and b/particles/heroes/lily/ability_lily_02.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_a.vpcf_c b/particles/heroes/lily/ability_lily_02_a.vpcf_c new file mode 100755 index 0000000..63a28d5 Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_a.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_b.vpcf_c b/particles/heroes/lily/ability_lily_02_b.vpcf_c new file mode 100755 index 0000000..f04274c Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_b.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_b0.vpcf_c b/particles/heroes/lily/ability_lily_02_b0.vpcf_c new file mode 100755 index 0000000..07c125c Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_b0.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_b1.vpcf_c b/particles/heroes/lily/ability_lily_02_b1.vpcf_c new file mode 100755 index 0000000..fd891cf Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_b1.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_b2.vpcf_c b/particles/heroes/lily/ability_lily_02_b2.vpcf_c new file mode 100755 index 0000000..fc4cb7a Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_b2.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_b3.vpcf_c b/particles/heroes/lily/ability_lily_02_b3.vpcf_c new file mode 100755 index 0000000..2aca5f1 Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_b3.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_b4.vpcf_c b/particles/heroes/lily/ability_lily_02_b4.vpcf_c new file mode 100755 index 0000000..4044afb Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_b4.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_b5.vpcf_c b/particles/heroes/lily/ability_lily_02_b5.vpcf_c new file mode 100755 index 0000000..a3ddda6 Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_b5.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_b6.vpcf_c b/particles/heroes/lily/ability_lily_02_b6.vpcf_c new file mode 100755 index 0000000..10cf6de Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_b6.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_c.vpcf_c b/particles/heroes/lily/ability_lily_02_c.vpcf_c new file mode 100755 index 0000000..6e3426b Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_c.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_d.vpcf_c b/particles/heroes/lily/ability_lily_02_d.vpcf_c new file mode 100755 index 0000000..0ac4aad Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_d.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_e.vpcf_c b/particles/heroes/lily/ability_lily_02_e.vpcf_c new file mode 100755 index 0000000..cd8d111 Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_e.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_f.vpcf_c b/particles/heroes/lily/ability_lily_02_f.vpcf_c new file mode 100755 index 0000000..5c43e6a Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_f.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_f0.vpcf_c b/particles/heroes/lily/ability_lily_02_f0.vpcf_c new file mode 100755 index 0000000..fb21abd Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_f0.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_f0a.vpcf_c b/particles/heroes/lily/ability_lily_02_f0a.vpcf_c new file mode 100755 index 0000000..064f8d2 Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_f0a.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_f0b.vpcf_c b/particles/heroes/lily/ability_lily_02_f0b.vpcf_c new file mode 100755 index 0000000..22a5925 Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_f0b.vpcf_c differ diff --git a/particles/heroes/lily/ability_lily_02_g.vpcf_c b/particles/heroes/lily/ability_lily_02_g.vpcf_c new file mode 100755 index 0000000..7f949bf Binary files /dev/null and b/particles/heroes/lily/ability_lily_02_g.vpcf_c differ diff --git a/particles/heroes/lunasa/ability_lunasa_01.vpcf_c b/particles/heroes/lunasa/ability_lunasa_01.vpcf_c new file mode 100755 index 0000000..f1d5204 Binary files /dev/null and b/particles/heroes/lunasa/ability_lunasa_01.vpcf_c differ diff --git a/particles/heroes/lunasa/ability_lunasa_01_a.vpcf_c b/particles/heroes/lunasa/ability_lunasa_01_a.vpcf_c new file mode 100755 index 0000000..b7b8ed8 Binary files /dev/null and b/particles/heroes/lunasa/ability_lunasa_01_a.vpcf_c differ diff --git a/particles/heroes/lunasa/ability_lunasa_01_b.vpcf_c b/particles/heroes/lunasa/ability_lunasa_01_b.vpcf_c new file mode 100755 index 0000000..185e892 Binary files /dev/null and b/particles/heroes/lunasa/ability_lunasa_01_b.vpcf_c differ diff --git a/particles/heroes/lunasa/ability_lunasa_01_explosion.vpcf_c b/particles/heroes/lunasa/ability_lunasa_01_explosion.vpcf_c new file mode 100755 index 0000000..a58dc6b Binary files /dev/null and b/particles/heroes/lunasa/ability_lunasa_01_explosion.vpcf_c differ diff --git a/particles/heroes/lunasa/ability_lunasa_buff.vpcf_c b/particles/heroes/lunasa/ability_lunasa_buff.vpcf_c new file mode 100755 index 0000000..469b002 Binary files /dev/null and b/particles/heroes/lunasa/ability_lunasa_buff.vpcf_c differ diff --git a/particles/heroes/lunasa/ability_lunasa_buff_a.vpcf_c b/particles/heroes/lunasa/ability_lunasa_buff_a.vpcf_c new file mode 100755 index 0000000..21321f3 Binary files /dev/null and b/particles/heroes/lunasa/ability_lunasa_buff_a.vpcf_c differ diff --git a/particles/heroes/lunasa/ability_lunasa_buff_b.vpcf_c b/particles/heroes/lunasa/ability_lunasa_buff_b.vpcf_c new file mode 100755 index 0000000..b733c4c Binary files /dev/null and b/particles/heroes/lunasa/ability_lunasa_buff_b.vpcf_c differ diff --git a/particles/heroes/lunasa/ability_lunasa_music_buff.vpcf_c b/particles/heroes/lunasa/ability_lunasa_music_buff.vpcf_c new file mode 100755 index 0000000..7238918 Binary files /dev/null and b/particles/heroes/lunasa/ability_lunasa_music_buff.vpcf_c differ diff --git a/particles/heroes/lunasa/ability_lunasa_music_buff_a.vpcf_c b/particles/heroes/lunasa/ability_lunasa_music_buff_a.vpcf_c new file mode 100755 index 0000000..5dbe8c3 Binary files /dev/null and b/particles/heroes/lunasa/ability_lunasa_music_buff_a.vpcf_c differ diff --git a/particles/heroes/lunasa/ability_lunasa_music_buff_a0.vpcf_c b/particles/heroes/lunasa/ability_lunasa_music_buff_a0.vpcf_c new file mode 100755 index 0000000..70ba3f7 Binary files /dev/null and b/particles/heroes/lunasa/ability_lunasa_music_buff_a0.vpcf_c differ diff --git a/particles/heroes/lyrica/ability_lyrica_01.vpcf_c b/particles/heroes/lyrica/ability_lyrica_01.vpcf_c new file mode 100755 index 0000000..254e94c Binary files /dev/null and b/particles/heroes/lyrica/ability_lyrica_01.vpcf_c differ diff --git a/particles/heroes/lyrica/ability_lyrica_01_a.vpcf_c b/particles/heroes/lyrica/ability_lyrica_01_a.vpcf_c new file mode 100755 index 0000000..ac09dd6 Binary files /dev/null and b/particles/heroes/lyrica/ability_lyrica_01_a.vpcf_c differ diff --git a/particles/heroes/lyrica/ability_lyrica_01_b.vpcf_c b/particles/heroes/lyrica/ability_lyrica_01_b.vpcf_c new file mode 100755 index 0000000..ff37c56 Binary files /dev/null and b/particles/heroes/lyrica/ability_lyrica_01_b.vpcf_c differ diff --git a/particles/heroes/lyrica/ability_lyrica_01_explosion.vpcf_c b/particles/heroes/lyrica/ability_lyrica_01_explosion.vpcf_c new file mode 100755 index 0000000..af4f9e3 Binary files /dev/null and b/particles/heroes/lyrica/ability_lyrica_01_explosion.vpcf_c differ diff --git a/particles/heroes/lyrica/ability_lyrica_music_buff.vpcf_c b/particles/heroes/lyrica/ability_lyrica_music_buff.vpcf_c new file mode 100755 index 0000000..7d2ea84 Binary files /dev/null and b/particles/heroes/lyrica/ability_lyrica_music_buff.vpcf_c differ diff --git a/particles/heroes/lyrica/ability_lyrica_music_buff_b.vpcf_c b/particles/heroes/lyrica/ability_lyrica_music_buff_b.vpcf_c new file mode 100755 index 0000000..d5f1b46 Binary files /dev/null and b/particles/heroes/lyrica/ability_lyrica_music_buff_b.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_01_rocket.vpcf_c b/particles/heroes/marisa/marisa_01_rocket.vpcf_c new file mode 100755 index 0000000..e5c7636 Binary files /dev/null and b/particles/heroes/marisa/marisa_01_rocket.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_01_rocket_a.vpcf_c b/particles/heroes/marisa/marisa_01_rocket_a.vpcf_c new file mode 100755 index 0000000..f273f70 Binary files /dev/null and b/particles/heroes/marisa/marisa_01_rocket_a.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_01_rocket_a_light.vpcf_c b/particles/heroes/marisa/marisa_01_rocket_a_light.vpcf_c new file mode 100755 index 0000000..c3c7ac0 Binary files /dev/null and b/particles/heroes/marisa/marisa_01_rocket_a_light.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_01_rocket_a_spark.vpcf_c b/particles/heroes/marisa/marisa_01_rocket_a_spark.vpcf_c new file mode 100755 index 0000000..6f4f112 Binary files /dev/null and b/particles/heroes/marisa/marisa_01_rocket_a_spark.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_01_rocket_a_wind.vpcf_c b/particles/heroes/marisa/marisa_01_rocket_a_wind.vpcf_c new file mode 100755 index 0000000..2cba8fe Binary files /dev/null and b/particles/heroes/marisa/marisa_01_rocket_a_wind.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_02_stars.vpcf_c b/particles/heroes/marisa/marisa_02_stars.vpcf_c new file mode 100755 index 0000000..69b55ac Binary files /dev/null and b/particles/heroes/marisa/marisa_02_stars.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_02_stars_a.vpcf_c b/particles/heroes/marisa/marisa_02_stars_a.vpcf_c new file mode 100755 index 0000000..ff6d601 Binary files /dev/null and b/particles/heroes/marisa/marisa_02_stars_a.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_02_stars_b.vpcf_c b/particles/heroes/marisa/marisa_02_stars_b.vpcf_c new file mode 100755 index 0000000..f2b667f Binary files /dev/null and b/particles/heroes/marisa/marisa_02_stars_b.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_02_stars_c.vpcf_c b/particles/heroes/marisa/marisa_02_stars_c.vpcf_c new file mode 100755 index 0000000..cd23401 Binary files /dev/null and b/particles/heroes/marisa/marisa_02_stars_c.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_02_stars_d.vpcf_c b/particles/heroes/marisa/marisa_02_stars_d.vpcf_c new file mode 100755 index 0000000..30e89b4 Binary files /dev/null and b/particles/heroes/marisa/marisa_02_stars_d.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_03_stars.vpcf_c b/particles/heroes/marisa/marisa_03_stars.vpcf_c new file mode 100755 index 0000000..bc2f2f9 Binary files /dev/null and b/particles/heroes/marisa/marisa_03_stars.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_03_stars_b.vpcf_c b/particles/heroes/marisa/marisa_03_stars_b.vpcf_c new file mode 100755 index 0000000..e953144 Binary files /dev/null and b/particles/heroes/marisa/marisa_03_stars_b.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_03_stars_c.vpcf_c b/particles/heroes/marisa/marisa_03_stars_c.vpcf_c new file mode 100755 index 0000000..b89f3a0 Binary files /dev/null and b/particles/heroes/marisa/marisa_03_stars_c.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_03_stars_d.vpcf_c b/particles/heroes/marisa/marisa_03_stars_d.vpcf_c new file mode 100755 index 0000000..dd0f43e Binary files /dev/null and b/particles/heroes/marisa/marisa_03_stars_d.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_04_spark.vpcf_c b/particles/heroes/marisa/marisa_04_spark.vpcf_c new file mode 100755 index 0000000..ac0a622 Binary files /dev/null and b/particles/heroes/marisa/marisa_04_spark.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_04_spark_circle.vpcf_c b/particles/heroes/marisa/marisa_04_spark_circle.vpcf_c new file mode 100755 index 0000000..0d19e6f Binary files /dev/null and b/particles/heroes/marisa/marisa_04_spark_circle.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_04_spark_laser.vpcf_c b/particles/heroes/marisa/marisa_04_spark_laser.vpcf_c new file mode 100755 index 0000000..8a8a16f Binary files /dev/null and b/particles/heroes/marisa/marisa_04_spark_laser.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_04_spark_laser_g.vpcf_c b/particles/heroes/marisa/marisa_04_spark_laser_g.vpcf_c new file mode 100755 index 0000000..3874774 Binary files /dev/null and b/particles/heroes/marisa/marisa_04_spark_laser_g.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_04_spark_laser_h.vpcf_c b/particles/heroes/marisa/marisa_04_spark_laser_h.vpcf_c new file mode 100755 index 0000000..29924e5 Binary files /dev/null and b/particles/heroes/marisa/marisa_04_spark_laser_h.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_04_spark_laser_i.vpcf_c b/particles/heroes/marisa/marisa_04_spark_laser_i.vpcf_c new file mode 100755 index 0000000..8334740 Binary files /dev/null and b/particles/heroes/marisa/marisa_04_spark_laser_i.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_04_spark_laserlight.vpcf_c b/particles/heroes/marisa/marisa_04_spark_laserlight.vpcf_c new file mode 100755 index 0000000..179a3cf Binary files /dev/null and b/particles/heroes/marisa/marisa_04_spark_laserlight.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_04_spark_light.vpcf_c b/particles/heroes/marisa/marisa_04_spark_light.vpcf_c new file mode 100755 index 0000000..32af09c Binary files /dev/null and b/particles/heroes/marisa/marisa_04_spark_light.vpcf_c differ diff --git a/particles/heroes/marisa/marisa_04_spark_wind.vpcf_c b/particles/heroes/marisa/marisa_04_spark_wind.vpcf_c new file mode 100755 index 0000000..de2ac81 Binary files /dev/null and b/particles/heroes/marisa/marisa_04_spark_wind.vpcf_c differ diff --git a/particles/heroes/merlin/ability_merlin_01.vpcf_c b/particles/heroes/merlin/ability_merlin_01.vpcf_c new file mode 100755 index 0000000..3279129 Binary files /dev/null and b/particles/heroes/merlin/ability_merlin_01.vpcf_c differ diff --git a/particles/heroes/merlin/ability_merlin_01_a.vpcf_c b/particles/heroes/merlin/ability_merlin_01_a.vpcf_c new file mode 100755 index 0000000..55ddbd7 Binary files /dev/null and b/particles/heroes/merlin/ability_merlin_01_a.vpcf_c differ diff --git a/particles/heroes/merlin/ability_merlin_01_b.vpcf_c b/particles/heroes/merlin/ability_merlin_01_b.vpcf_c new file mode 100755 index 0000000..a88033b Binary files /dev/null and b/particles/heroes/merlin/ability_merlin_01_b.vpcf_c differ diff --git a/particles/heroes/merlin/ability_merlin_01_explosion.vpcf_c b/particles/heroes/merlin/ability_merlin_01_explosion.vpcf_c new file mode 100755 index 0000000..e1e2012 Binary files /dev/null and b/particles/heroes/merlin/ability_merlin_01_explosion.vpcf_c differ diff --git a/particles/heroes/merlin/ability_merlin_buff.vpcf_c b/particles/heroes/merlin/ability_merlin_buff.vpcf_c new file mode 100755 index 0000000..03fff34 Binary files /dev/null and b/particles/heroes/merlin/ability_merlin_buff.vpcf_c differ diff --git a/particles/heroes/merlin/ability_merlin_buff_a.vpcf_c b/particles/heroes/merlin/ability_merlin_buff_a.vpcf_c new file mode 100755 index 0000000..9a6b4c9 Binary files /dev/null and b/particles/heroes/merlin/ability_merlin_buff_a.vpcf_c differ diff --git a/particles/heroes/merlin/ability_merlin_buff_b.vpcf_c b/particles/heroes/merlin/ability_merlin_buff_b.vpcf_c new file mode 100755 index 0000000..e16643b Binary files /dev/null and b/particles/heroes/merlin/ability_merlin_buff_b.vpcf_c differ diff --git a/particles/heroes/merlin/ability_merlin_music_buff.vpcf_c b/particles/heroes/merlin/ability_merlin_music_buff.vpcf_c new file mode 100755 index 0000000..b82e4e2 Binary files /dev/null and b/particles/heroes/merlin/ability_merlin_music_buff.vpcf_c differ diff --git a/particles/heroes/merlin/ability_merlin_music_buff_a.vpcf_c b/particles/heroes/merlin/ability_merlin_music_buff_a.vpcf_c new file mode 100755 index 0000000..06c6d0d Binary files /dev/null and b/particles/heroes/merlin/ability_merlin_music_buff_a.vpcf_c differ diff --git a/particles/heroes/merlin/ability_merlin_music_buff_a0.vpcf_c b/particles/heroes/merlin/ability_merlin_music_buff_a0.vpcf_c new file mode 100755 index 0000000..0977739 Binary files /dev/null and b/particles/heroes/merlin/ability_merlin_music_buff_a0.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_01.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_01.vpcf_c new file mode 100755 index 0000000..26f8e13 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_01.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_01_a.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_01_a.vpcf_c new file mode 100755 index 0000000..bbc5942 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_01_a.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_01_a0.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_01_a0.vpcf_c new file mode 100755 index 0000000..fa2e27e Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_01_a0.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_01_b.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_01_b.vpcf_c new file mode 100755 index 0000000..1f0e747 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_01_b.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_02.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_02.vpcf_c new file mode 100755 index 0000000..987283d Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_02.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_02_a.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_02_a.vpcf_c new file mode 100755 index 0000000..0dd6893 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_02_a.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_02_a0.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_02_a0.vpcf_c new file mode 100755 index 0000000..ec5909d Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_02_a0.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_02_a1.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_02_a1.vpcf_c new file mode 100755 index 0000000..f063d28 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_02_a1.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_02_a2.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_02_a2.vpcf_c new file mode 100755 index 0000000..69c5b3d Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_02_a2.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_02_a3.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_02_a3.vpcf_c new file mode 100755 index 0000000..6877a91 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_02_a3.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_02_a4.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_02_a4.vpcf_c new file mode 100755 index 0000000..e673bd5 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_02_a4.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_02_b.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_02_b.vpcf_c new file mode 100755 index 0000000..dae839a Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_02_b.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_02_body.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_02_body.vpcf_c new file mode 100755 index 0000000..e4f5294 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_02_body.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_02_body_1.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_02_body_1.vpcf_c new file mode 100755 index 0000000..d6cfc30 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_02_body_1.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03.vpcf_c new file mode 100755 index 0000000..e5c7a85 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03_a.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03_a.vpcf_c new file mode 100755 index 0000000..44c30cd Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03_a.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03_b.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03_b.vpcf_c new file mode 100755 index 0000000..781924e Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03_b.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03_body.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03_body.vpcf_c new file mode 100755 index 0000000..6c0c26b Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03_body.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03_body_a.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03_body_a.vpcf_c new file mode 100755 index 0000000..9cce22c Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03_body_a.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03_body_b.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03_body_b.vpcf_c new file mode 100755 index 0000000..d4f174b Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03_body_b.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03_body_c.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03_body_c.vpcf_c new file mode 100755 index 0000000..75500eb Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03_body_c.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03_body_d.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03_body_d.vpcf_c new file mode 100755 index 0000000..eb88b6a Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03_body_d.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03_body_e.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03_body_e.vpcf_c new file mode 100755 index 0000000..8195647 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03_body_e.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03_body_f.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03_body_f.vpcf_c new file mode 100755 index 0000000..c2eb116 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03_body_f.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03_body_g.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03_body_g.vpcf_c new file mode 100755 index 0000000..a816501 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03_body_g.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03_c.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03_c.vpcf_c new file mode 100755 index 0000000..ec311b6 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03_c.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_03_c0.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_03_c0.vpcf_c new file mode 100755 index 0000000..4e2b408 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_03_c0.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_04_boom.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_04_boom.vpcf_c new file mode 100755 index 0000000..64adcd9 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_04_boom.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_04_boom_a.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_04_boom_a.vpcf_c new file mode 100755 index 0000000..b0fe5b2 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_04_boom_a.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_04_boom_b.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_04_boom_b.vpcf_c new file mode 100755 index 0000000..c6581cd Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_04_boom_b.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_04_boom_b0.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_04_boom_b0.vpcf_c new file mode 100755 index 0000000..8f13b3e Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_04_boom_b0.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_04_boom_b1.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_04_boom_b1.vpcf_c new file mode 100755 index 0000000..81055ba Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_04_boom_b1.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_04_boom_c.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_04_boom_c.vpcf_c new file mode 100755 index 0000000..9a70f35 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_04_boom_c.vpcf_c differ diff --git a/particles/heroes/minamitsu/ability_minamitsu_04_boom_d.vpcf_c b/particles/heroes/minamitsu/ability_minamitsu_04_boom_d.vpcf_c new file mode 100755 index 0000000..9cfddd5 Binary files /dev/null and b/particles/heroes/minamitsu/ability_minamitsu_04_boom_d.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_01.vpcf_c b/particles/heroes/minoriko/ability_minoriko_01.vpcf_c new file mode 100755 index 0000000..92401e1 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_01.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_01_projectile.vpcf_c b/particles/heroes/minoriko/ability_minoriko_01_projectile.vpcf_c new file mode 100755 index 0000000..de0e882 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_01_projectile.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_01_projectile_a.vpcf_c b/particles/heroes/minoriko/ability_minoriko_01_projectile_a.vpcf_c new file mode 100755 index 0000000..35bec62 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_01_projectile_a.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_01_projectile_b.vpcf_c b/particles/heroes/minoriko/ability_minoriko_01_projectile_b.vpcf_c new file mode 100755 index 0000000..22dbd60 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_01_projectile_b.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_01_projectile_b0.vpcf_c b/particles/heroes/minoriko/ability_minoriko_01_projectile_b0.vpcf_c new file mode 100755 index 0000000..2a6d99e Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_01_projectile_b0.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_01_projectile_c.vpcf_c b/particles/heroes/minoriko/ability_minoriko_01_projectile_c.vpcf_c new file mode 100755 index 0000000..d9b0837 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_01_projectile_c.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_01_projectile_d.vpcf_c b/particles/heroes/minoriko/ability_minoriko_01_projectile_d.vpcf_c new file mode 100755 index 0000000..a48b6f6 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_01_projectile_d.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_01_projectile_d0.vpcf_c b/particles/heroes/minoriko/ability_minoriko_01_projectile_d0.vpcf_c new file mode 100755 index 0000000..48cdd75 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_01_projectile_d0.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_01_projectile_d1.vpcf_c b/particles/heroes/minoriko/ability_minoriko_01_projectile_d1.vpcf_c new file mode 100755 index 0000000..afc252f Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_01_projectile_d1.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_01_projectile_d2.vpcf_c b/particles/heroes/minoriko/ability_minoriko_01_projectile_d2.vpcf_c new file mode 100755 index 0000000..32f6e67 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_01_projectile_d2.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04.vpcf_c new file mode 100755 index 0000000..14a64ed Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_b.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_b.vpcf_c new file mode 100755 index 0000000..b905dfd Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_b.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_c.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_c.vpcf_c new file mode 100755 index 0000000..e71ac03 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_c.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_fruit.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_fruit.vpcf_c new file mode 100755 index 0000000..71efabd Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_fruit.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_fruit_b.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_fruit_b.vpcf_c new file mode 100755 index 0000000..0f950fb Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_fruit_b.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser.vpcf_c new file mode 100755 index 0000000..c2a0c9f Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_a.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_a.vpcf_c new file mode 100755 index 0000000..76074c4 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_a.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_b.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_b.vpcf_c new file mode 100755 index 0000000..855be01 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_b.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_c.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_c.vpcf_c new file mode 100755 index 0000000..8d06dce Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_c.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_c0.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_c0.vpcf_c new file mode 100755 index 0000000..24df1cc Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_c0.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_c1.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_c1.vpcf_c new file mode 100755 index 0000000..743da01 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_c1.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_c2.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_c2.vpcf_c new file mode 100755 index 0000000..2985468 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_c2.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_c3.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_c3.vpcf_c new file mode 100755 index 0000000..6a7ddf3 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_c3.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_c4.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_c4.vpcf_c new file mode 100755 index 0000000..6c9b9d9 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_c4.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_c5.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_c5.vpcf_c new file mode 100755 index 0000000..52b63cb Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_c5.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_c6.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_c6.vpcf_c new file mode 100755 index 0000000..4c79711 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_c6.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_c7.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_c7.vpcf_c new file mode 100755 index 0000000..c94dca5 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_c7.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_c8.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_c8.vpcf_c new file mode 100755 index 0000000..97e9b0d Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_c8.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_d.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_d.vpcf_c new file mode 100755 index 0000000..a839200 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_d.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_e.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_e.vpcf_c new file mode 100755 index 0000000..3288759 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_e.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_f.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_f.vpcf_c new file mode 100755 index 0000000..f848c9b Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_f.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_g.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_g.vpcf_c new file mode 100755 index 0000000..89ece7e Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_g.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_h.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_h.vpcf_c new file mode 100755 index 0000000..3d2f32a Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_h.vpcf_c differ diff --git a/particles/heroes/minoriko/ability_minoriko_04_laser_i.vpcf_c b/particles/heroes/minoriko/ability_minoriko_04_laser_i.vpcf_c new file mode 100755 index 0000000..62c6232 Binary files /dev/null and b/particles/heroes/minoriko/ability_minoriko_04_laser_i.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014.vpcf_c new file mode 100755 index 0000000..10ff68c Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_a.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_a.vpcf_c new file mode 100755 index 0000000..7cf01c5 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_a.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_b.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_b.vpcf_c new file mode 100755 index 0000000..bdee516 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_b.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_c.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_c.vpcf_c new file mode 100755 index 0000000..ee7fd3e Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_c.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_d.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_d.vpcf_c new file mode 100755 index 0000000..e5e9e8e Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_d.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_e.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_e.vpcf_c new file mode 100755 index 0000000..f31c7c2 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_e.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_f.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_f.vpcf_c new file mode 100755 index 0000000..f71a794 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_f.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_g.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_g.vpcf_c new file mode 100755 index 0000000..24c52bf Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_g.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_g0.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_g0.vpcf_c new file mode 100755 index 0000000..4081444 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_g0.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_h.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_h.vpcf_c new file mode 100755 index 0000000..bc53151 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_h.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_i.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_i.vpcf_c new file mode 100755 index 0000000..980dd26 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_i.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_j.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_j.vpcf_c new file mode 100755 index 0000000..571bb82 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_j.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_k.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_k.vpcf_c new file mode 100755 index 0000000..32ac101 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_k.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_k0.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_k0.vpcf_c new file mode 100755 index 0000000..ae3a828 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_k0.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_l.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_l.vpcf_c new file mode 100755 index 0000000..173e450 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_l.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_m.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_m.vpcf_c new file mode 100755 index 0000000..4b88078 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_m.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_n.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_n.vpcf_c new file mode 100755 index 0000000..925bac6 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_n.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_o.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_o.vpcf_c new file mode 100755 index 0000000..5b3a041 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_o.vpcf_c differ diff --git a/particles/heroes/moluo/abiilty_moluo_014_p.vpcf_c b/particles/heroes/moluo/abiilty_moluo_014_p.vpcf_c new file mode 100755 index 0000000..8386e12 Binary files /dev/null and b/particles/heroes/moluo/abiilty_moluo_014_p.vpcf_c differ diff --git a/particles/heroes/moluo/ability_juexin_014_body.vpcf_c b/particles/heroes/moluo/ability_juexin_014_body.vpcf_c new file mode 100755 index 0000000..0bf1fd6 Binary files /dev/null and b/particles/heroes/moluo/ability_juexin_014_body.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo01_explosion.vpcf_c b/particles/heroes/moluo/ability_moluo01_explosion.vpcf_c new file mode 100755 index 0000000..dd2da57 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo01_explosion.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo01_explosion_a.vpcf_c b/particles/heroes/moluo/ability_moluo01_explosion_a.vpcf_c new file mode 100755 index 0000000..14eac5f Binary files /dev/null and b/particles/heroes/moluo/ability_moluo01_explosion_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo01_explosion_vip.vpcf_c b/particles/heroes/moluo/ability_moluo01_explosion_vip.vpcf_c new file mode 100755 index 0000000..926126a Binary files /dev/null and b/particles/heroes/moluo/ability_moluo01_explosion_vip.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect.vpcf_c new file mode 100755 index 0000000..10889a5 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_blood.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_blood.vpcf_c new file mode 100755 index 0000000..4d76e8d Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_blood.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_on.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_on.vpcf_c new file mode 100755 index 0000000..d768702 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_on.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_on_vip.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_on_vip.vpcf_c new file mode 100755 index 0000000..7fcc400 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_on_vip.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_rolling.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_rolling.vpcf_c new file mode 100755 index 0000000..893d493 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_rolling.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_rolling_a.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_rolling_a.vpcf_c new file mode 100755 index 0000000..9e9deda Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_rolling_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_rolling_b.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_rolling_b.vpcf_c new file mode 100755 index 0000000..10513a0 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_rolling_b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_rolling_c.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_rolling_c.vpcf_c new file mode 100755 index 0000000..721c4f3 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_rolling_c.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_rolling_d.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_rolling_d.vpcf_c new file mode 100755 index 0000000..ea8448b Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_rolling_d.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_rolling_e.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_rolling_e.vpcf_c new file mode 100755 index 0000000..779f373 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_rolling_e.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_rolling_f.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_rolling_f.vpcf_c new file mode 100755 index 0000000..e72fbfa Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_rolling_f.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_rolling_g.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_rolling_g.vpcf_c new file mode 100755 index 0000000..acae8d0 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_rolling_g.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_rolling_h.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_rolling_h.vpcf_c new file mode 100755 index 0000000..e0bc4c7 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_rolling_h.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_effect_rolling_h0.vpcf_c b/particles/heroes/moluo/ability_moluo02_effect_rolling_h0.vpcf_c new file mode 100755 index 0000000..48319ef Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_effect_rolling_h0.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo02_flow.vpcf_c b/particles/heroes/moluo/ability_moluo02_flow.vpcf_c new file mode 100755 index 0000000..123ccd7 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo02_flow.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo03_explosion.vpcf_c b/particles/heroes/moluo/ability_moluo03_explosion.vpcf_c new file mode 100755 index 0000000..32b3a80 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo03_explosion.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo03_explosion_a.vpcf_c b/particles/heroes/moluo/ability_moluo03_explosion_a.vpcf_c new file mode 100755 index 0000000..3496527 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo03_explosion_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo03_explosion_a0.vpcf_c b/particles/heroes/moluo/ability_moluo03_explosion_a0.vpcf_c new file mode 100755 index 0000000..d6fc275 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo03_explosion_a0.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo03_illusion.vpcf_c b/particles/heroes/moluo/ability_moluo03_illusion.vpcf_c new file mode 100755 index 0000000..259b6fb Binary files /dev/null and b/particles/heroes/moluo/ability_moluo03_illusion.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo03_illusion_1.vpcf_c b/particles/heroes/moluo/ability_moluo03_illusion_1.vpcf_c new file mode 100755 index 0000000..afe7d0e Binary files /dev/null and b/particles/heroes/moluo/ability_moluo03_illusion_1.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo03_illusion_2.vpcf_c b/particles/heroes/moluo/ability_moluo03_illusion_2.vpcf_c new file mode 100755 index 0000000..d167625 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo03_illusion_2.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_011.vpcf_c b/particles/heroes/moluo/ability_moluo_011.vpcf_c new file mode 100755 index 0000000..6578535 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_011.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012.vpcf_c b/particles/heroes/moluo/ability_moluo_012.vpcf_c new file mode 100755 index 0000000..420aa04 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_a.vpcf_c b/particles/heroes/moluo/ability_moluo_012_a.vpcf_c new file mode 100755 index 0000000..d79e0f1 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_b.vpcf_c b/particles/heroes/moluo/ability_moluo_012_b.vpcf_c new file mode 100755 index 0000000..bf8f797 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_c.vpcf_c b/particles/heroes/moluo/ability_moluo_012_c.vpcf_c new file mode 100755 index 0000000..ffaae48 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_c.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end.vpcf_c new file mode 100755 index 0000000..c62ee54 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_a.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_a.vpcf_c new file mode 100755 index 0000000..3ae29c7 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_b.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_b.vpcf_c new file mode 100755 index 0000000..538a0ae Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_c.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_c.vpcf_c new file mode 100755 index 0000000..55faf3c Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_c.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_d.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_d.vpcf_c new file mode 100755 index 0000000..707b665 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_d.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_e.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_e.vpcf_c new file mode 100755 index 0000000..1ccc908 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_e.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_f.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_f.vpcf_c new file mode 100755 index 0000000..bb7f597 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_f.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_g.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_g.vpcf_c new file mode 100755 index 0000000..00091f4 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_g.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_g0.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_g0.vpcf_c new file mode 100755 index 0000000..66e0601 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_g0.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_h.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_h.vpcf_c new file mode 100755 index 0000000..076c22b Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_h.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_i.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_i.vpcf_c new file mode 100755 index 0000000..7976bb5 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_i.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_j.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_j.vpcf_c new file mode 100755 index 0000000..98980ed Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_j.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_k.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_k.vpcf_c new file mode 100755 index 0000000..28788fa Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_k.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_k0.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_k0.vpcf_c new file mode 100755 index 0000000..c7399c2 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_k0.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_l.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_l.vpcf_c new file mode 100755 index 0000000..463457b Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_l.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_m.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_m.vpcf_c new file mode 100755 index 0000000..9710a10 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_m.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_n.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_n.vpcf_c new file mode 100755 index 0000000..e5d0e3f Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_n.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_o.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_o.vpcf_c new file mode 100755 index 0000000..60385e7 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_o.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_012_end_p.vpcf_c b/particles/heroes/moluo/ability_moluo_012_end_p.vpcf_c new file mode 100755 index 0000000..5e23b91 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_012_end_p.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_013_circle.vpcf_c b/particles/heroes/moluo/ability_moluo_013_circle.vpcf_c new file mode 100755 index 0000000..79fd34b Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_013_circle.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_013_fire.vpcf_c b/particles/heroes/moluo/ability_moluo_013_fire.vpcf_c new file mode 100755 index 0000000..f32a800 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_013_fire.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_013_fire_a.vpcf_c b/particles/heroes/moluo/ability_moluo_013_fire_a.vpcf_c new file mode 100755 index 0000000..3c49448 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_013_fire_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_013_fire_b.vpcf_c b/particles/heroes/moluo/ability_moluo_013_fire_b.vpcf_c new file mode 100755 index 0000000..4de7886 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_013_fire_b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_013_fire_c.vpcf_c b/particles/heroes/moluo/ability_moluo_013_fire_c.vpcf_c new file mode 100755 index 0000000..c5d8ace Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_013_fire_c.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_013_fire_d.vpcf_c b/particles/heroes/moluo/ability_moluo_013_fire_d.vpcf_c new file mode 100755 index 0000000..b8e1eda Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_013_fire_d.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_013_fire_e.vpcf_c b/particles/heroes/moluo/ability_moluo_013_fire_e.vpcf_c new file mode 100755 index 0000000..7e6683a Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_013_fire_e.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_013_fire_f.vpcf_c b/particles/heroes/moluo/ability_moluo_013_fire_f.vpcf_c new file mode 100755 index 0000000..ab8a921 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_013_fire_f.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_013_fire_g.vpcf_c b/particles/heroes/moluo/ability_moluo_013_fire_g.vpcf_c new file mode 100755 index 0000000..da43bc0 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_013_fire_g.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_013_fire_h.vpcf_c b/particles/heroes/moluo/ability_moluo_013_fire_h.vpcf_c new file mode 100755 index 0000000..30ff7a6 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_013_fire_h.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_hand.vpcf_c b/particles/heroes/moluo/ability_moluo_014_hand.vpcf_c new file mode 100755 index 0000000..4435542 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_hand.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_hand_a.vpcf_c b/particles/heroes/moluo/ability_moluo_014_hand_a.vpcf_c new file mode 100755 index 0000000..8d2e6d8 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_hand_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_hand_a0.vpcf_c b/particles/heroes/moluo/ability_moluo_014_hand_a0.vpcf_c new file mode 100755 index 0000000..3003209 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_hand_a0.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_hand_a1.vpcf_c b/particles/heroes/moluo/ability_moluo_014_hand_a1.vpcf_c new file mode 100755 index 0000000..91b1f49 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_hand_a1.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_hand_a1a.vpcf_c b/particles/heroes/moluo/ability_moluo_014_hand_a1a.vpcf_c new file mode 100755 index 0000000..1c65ccc Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_hand_a1a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_hand_a1b.vpcf_c b/particles/heroes/moluo/ability_moluo_014_hand_a1b.vpcf_c new file mode 100755 index 0000000..4fdd715 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_hand_a1b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_hand_a1b0.vpcf_c b/particles/heroes/moluo/ability_moluo_014_hand_a1b0.vpcf_c new file mode 100755 index 0000000..b997c3b Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_hand_a1b0.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_hand_a2.vpcf_c b/particles/heroes/moluo/ability_moluo_014_hand_a2.vpcf_c new file mode 100755 index 0000000..caa8f01 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_hand_a2.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_start.vpcf_c b/particles/heroes/moluo/ability_moluo_014_start.vpcf_c new file mode 100755 index 0000000..babebc1 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_start.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_start_a.vpcf_c b/particles/heroes/moluo/ability_moluo_014_start_a.vpcf_c new file mode 100755 index 0000000..4371f64 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_start_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_start_a0.vpcf_c b/particles/heroes/moluo/ability_moluo_014_start_a0.vpcf_c new file mode 100755 index 0000000..eb6107a Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_start_a0.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_weapon.vpcf_c b/particles/heroes/moluo/ability_moluo_014_weapon.vpcf_c new file mode 100755 index 0000000..ef37bb8 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_weapon.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_014_weapon_a.vpcf_c b/particles/heroes/moluo/ability_moluo_014_weapon_a.vpcf_c new file mode 100755 index 0000000..1b94346 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_014_weapon_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_fire.vpcf_c b/particles/heroes/moluo/ability_moluo_01_fire.vpcf_c new file mode 100755 index 0000000..fc238c9 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_fire.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_fire_a.vpcf_c b/particles/heroes/moluo/ability_moluo_01_fire_a.vpcf_c new file mode 100755 index 0000000..93a9c41 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_fire_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_fire_b.vpcf_c b/particles/heroes/moluo/ability_moluo_01_fire_b.vpcf_c new file mode 100755 index 0000000..e9d5399 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_fire_b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_fire_c.vpcf_c b/particles/heroes/moluo/ability_moluo_01_fire_c.vpcf_c new file mode 100755 index 0000000..9287581 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_fire_c.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_fire_d.vpcf_c b/particles/heroes/moluo/ability_moluo_01_fire_d.vpcf_c new file mode 100755 index 0000000..5ab5b34 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_fire_d.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_fire_e.vpcf_c b/particles/heroes/moluo/ability_moluo_01_fire_e.vpcf_c new file mode 100755 index 0000000..590ffff Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_fire_e.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_fire_f.vpcf_c b/particles/heroes/moluo/ability_moluo_01_fire_f.vpcf_c new file mode 100755 index 0000000..3852bbc Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_fire_f.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_fire_g.vpcf_c b/particles/heroes/moluo/ability_moluo_01_fire_g.vpcf_c new file mode 100755 index 0000000..4d147f1 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_fire_g.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_regen.vpcf_c b/particles/heroes/moluo/ability_moluo_01_regen.vpcf_c new file mode 100755 index 0000000..faedce8 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_regen.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_regen_a.vpcf_c b/particles/heroes/moluo/ability_moluo_01_regen_a.vpcf_c new file mode 100755 index 0000000..d74506c Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_regen_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_regen_b.vpcf_c b/particles/heroes/moluo/ability_moluo_01_regen_b.vpcf_c new file mode 100755 index 0000000..e118a4f Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_regen_b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_regen_c.vpcf_c b/particles/heroes/moluo/ability_moluo_01_regen_c.vpcf_c new file mode 100755 index 0000000..08b7851 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_regen_c.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv.vpcf_c new file mode 100755 index 0000000..d270220 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_a.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_a.vpcf_c new file mode 100755 index 0000000..cbc0951 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_b.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_b.vpcf_c new file mode 100755 index 0000000..5647143 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_c.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_c.vpcf_c new file mode 100755 index 0000000..df93aeb Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_c.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_d.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_d.vpcf_c new file mode 100755 index 0000000..4b08ad5 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_d.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_e.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_e.vpcf_c new file mode 100755 index 0000000..f50059a Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_e.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_f.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_f.vpcf_c new file mode 100755 index 0000000..bb4825c Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_f.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_g.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_g.vpcf_c new file mode 100755 index 0000000..016e316 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_g.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_g0.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_g0.vpcf_c new file mode 100755 index 0000000..345840a Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_g0.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_h.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_h.vpcf_c new file mode 100755 index 0000000..49f8d32 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_h.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_i.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_i.vpcf_c new file mode 100755 index 0000000..1f2c50c Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_i.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_j.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_j.vpcf_c new file mode 100755 index 0000000..806e8f0 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_j.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_soul.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_soul.vpcf_c new file mode 100755 index 0000000..e922d1f Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_soul.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_soul_a.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_soul_a.vpcf_c new file mode 100755 index 0000000..953ec7e Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_soul_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_01_xiqv_soul_a0.vpcf_c b/particles/heroes/moluo/ability_moluo_01_xiqv_soul_a0.vpcf_c new file mode 100755 index 0000000..0c4f2d5 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_01_xiqv_soul_a0.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_body.vpcf_c b/particles/heroes/moluo/ability_moluo_03_body.vpcf_c new file mode 100755 index 0000000..0f98bad Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_body.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_body_a.vpcf_c b/particles/heroes/moluo/ability_moluo_03_body_a.vpcf_c new file mode 100755 index 0000000..905e259 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_body_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_body_b.vpcf_c b/particles/heroes/moluo/ability_moluo_03_body_b.vpcf_c new file mode 100755 index 0000000..a08040d Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_body_b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_body_black.vpcf_c b/particles/heroes/moluo/ability_moluo_03_body_black.vpcf_c new file mode 100755 index 0000000..2fbfb7f Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_body_black.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_body_c.vpcf_c b/particles/heroes/moluo/ability_moluo_03_body_c.vpcf_c new file mode 100755 index 0000000..64e69a3 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_body_c.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_body_d.vpcf_c b/particles/heroes/moluo/ability_moluo_03_body_d.vpcf_c new file mode 100755 index 0000000..9853119 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_body_d.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_body_e.vpcf_c b/particles/heroes/moluo/ability_moluo_03_body_e.vpcf_c new file mode 100755 index 0000000..9ef0f72 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_body_e.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_body_f.vpcf_c b/particles/heroes/moluo/ability_moluo_03_body_f.vpcf_c new file mode 100755 index 0000000..044eb41 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_body_f.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_body_g.vpcf_c b/particles/heroes/moluo/ability_moluo_03_body_g.vpcf_c new file mode 100755 index 0000000..0498718 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_body_g.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword.vpcf_c new file mode 100755 index 0000000..f2df877 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword_1.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword_1.vpcf_c new file mode 100755 index 0000000..81bdc2d Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword_1.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword_1_a.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword_1_a.vpcf_c new file mode 100755 index 0000000..126b84b Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword_1_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword_1_b.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword_1_b.vpcf_c new file mode 100755 index 0000000..84cb1f7 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword_1_b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword_2.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword_2.vpcf_c new file mode 100755 index 0000000..47d7a53 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword_2.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword_2_a.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword_2_a.vpcf_c new file mode 100755 index 0000000..6f296c1 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword_2_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword_2_b.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword_2_b.vpcf_c new file mode 100755 index 0000000..45c2664 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword_2_b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword_3.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword_3.vpcf_c new file mode 100755 index 0000000..5865b91 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword_3.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword_3_a.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword_3_a.vpcf_c new file mode 100755 index 0000000..49459f1 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword_3_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword_3_b.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword_3_b.vpcf_c new file mode 100755 index 0000000..ea1d396 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword_3_b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword_a.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword_a.vpcf_c new file mode 100755 index 0000000..c89d56f Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword_b.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword_b.vpcf_c new file mode 100755 index 0000000..9c16022 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword_b.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_sword_black_smoke_a.vpcf_c b/particles/heroes/moluo/ability_moluo_03_sword_black_smoke_a.vpcf_c new file mode 100755 index 0000000..75ec98d Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_sword_black_smoke_a.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_weapon.vpcf_c b/particles/heroes/moluo/ability_moluo_03_weapon.vpcf_c new file mode 100755 index 0000000..069e719 Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_weapon.vpcf_c differ diff --git a/particles/heroes/moluo/ability_moluo_03_weapon_a.vpcf_c b/particles/heroes/moluo/ability_moluo_03_weapon_a.vpcf_c new file mode 100755 index 0000000..538658f Binary files /dev/null and b/particles/heroes/moluo/ability_moluo_03_weapon_a.vpcf_c differ diff --git a/particles/heroes/mouko/ability_mokou_01_boom.vpcf_c b/particles/heroes/mouko/ability_mokou_01_boom.vpcf_c new file mode 100755 index 0000000..81bba3c Binary files /dev/null and b/particles/heroes/mouko/ability_mokou_01_boom.vpcf_c differ diff --git a/particles/heroes/mouko/ability_mokou_01_boom_b.vpcf_c b/particles/heroes/mouko/ability_mokou_01_boom_b.vpcf_c new file mode 100755 index 0000000..3468fc5 Binary files /dev/null and b/particles/heroes/mouko/ability_mokou_01_boom_b.vpcf_c differ diff --git a/particles/heroes/mouko/ability_mokou_01_boom_c.vpcf_c b/particles/heroes/mouko/ability_mokou_01_boom_c.vpcf_c new file mode 100755 index 0000000..c869e4d Binary files /dev/null and b/particles/heroes/mouko/ability_mokou_01_boom_c.vpcf_c differ diff --git a/particles/heroes/mouko/ability_mokou_01_boom_d.vpcf_c b/particles/heroes/mouko/ability_mokou_01_boom_d.vpcf_c new file mode 100755 index 0000000..604e46e Binary files /dev/null and b/particles/heroes/mouko/ability_mokou_01_boom_d.vpcf_c differ diff --git a/particles/heroes/mouko/ability_mokou_01_boom_e.vpcf_c b/particles/heroes/mouko/ability_mokou_01_boom_e.vpcf_c new file mode 100755 index 0000000..8cf7ec1 Binary files /dev/null and b/particles/heroes/mouko/ability_mokou_01_boom_e.vpcf_c differ diff --git a/particles/heroes/mouko/ability_mokou_01_boom_f.vpcf_c b/particles/heroes/mouko/ability_mokou_01_boom_f.vpcf_c new file mode 100755 index 0000000..5246c01 Binary files /dev/null and b/particles/heroes/mouko/ability_mokou_01_boom_f.vpcf_c differ diff --git a/particles/heroes/mouko/ability_mokou_01_boom_g.vpcf_c b/particles/heroes/mouko/ability_mokou_01_boom_g.vpcf_c new file mode 100755 index 0000000..28bf17b Binary files /dev/null and b/particles/heroes/mouko/ability_mokou_01_boom_g.vpcf_c differ diff --git a/particles/heroes/mouko/ability_mokou_01_boom_h.vpcf_c b/particles/heroes/mouko/ability_mokou_01_boom_h.vpcf_c new file mode 100755 index 0000000..f62c4e2 Binary files /dev/null and b/particles/heroes/mouko/ability_mokou_01_boom_h.vpcf_c differ diff --git a/particles/heroes/mouko/ability_mokou_01_boom_i.vpcf_c b/particles/heroes/mouko/ability_mokou_01_boom_i.vpcf_c new file mode 100755 index 0000000..6e5abf1 Binary files /dev/null and b/particles/heroes/mouko/ability_mokou_01_boom_i.vpcf_c differ diff --git a/particles/heroes/mouko/ability_mokou_01_boom_j.vpcf_c b/particles/heroes/mouko/ability_mokou_01_boom_j.vpcf_c new file mode 100755 index 0000000..5ce2c54 Binary files /dev/null and b/particles/heroes/mouko/ability_mokou_01_boom_j.vpcf_c differ diff --git a/particles/heroes/mouko/ability_mokou_02_boom.vpcf_c b/particles/heroes/mouko/ability_mokou_02_boom.vpcf_c new file mode 100755 index 0000000..8248800 Binary files /dev/null and b/particles/heroes/mouko/ability_mokou_02_boom.vpcf_c differ diff --git a/particles/heroes/mouko/ability_mokou_04_wing.vpcf_c b/particles/heroes/mouko/ability_mokou_04_wing.vpcf_c new file mode 100755 index 0000000..692999e Binary files /dev/null and b/particles/heroes/mouko/ability_mokou_04_wing.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011.vpcf_c b/particles/heroes/muyue/ability_muyue_011.vpcf_c new file mode 100755 index 0000000..f7cb2cf Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_a.vpcf_c b/particles/heroes/muyue/ability_muyue_011_a.vpcf_c new file mode 100755 index 0000000..95a3513 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_a.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_b.vpcf_c b/particles/heroes/muyue/ability_muyue_011_b.vpcf_c new file mode 100755 index 0000000..f9ed103 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_b.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink.vpcf_c new file mode 100755 index 0000000..c405bba Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_a.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_a.vpcf_c new file mode 100755 index 0000000..d3098ee Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_a.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_a0.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_a0.vpcf_c new file mode 100755 index 0000000..2a09f4d Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_a0.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_a0a.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_a0a.vpcf_c new file mode 100755 index 0000000..f38acb5 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_a0a.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_a0b.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_a0b.vpcf_c new file mode 100755 index 0000000..2a8baca Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_a0b.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_a0c.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_a0c.vpcf_c new file mode 100755 index 0000000..2f49757 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_a0c.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_a0d.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_a0d.vpcf_c new file mode 100755 index 0000000..05cc696 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_a0d.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_a0d0.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_a0d0.vpcf_c new file mode 100755 index 0000000..a98abc9 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_a0d0.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_end.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_end.vpcf_c new file mode 100755 index 0000000..54b12b4 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_end.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_end_a.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_end_a.vpcf_c new file mode 100755 index 0000000..a254f14 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_end_a.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_end_a0.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_end_a0.vpcf_c new file mode 100755 index 0000000..e1507f5 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_end_a0.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_end_a0a.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_end_a0a.vpcf_c new file mode 100755 index 0000000..dbf0039 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_end_a0a.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_end_a0b.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_end_a0b.vpcf_c new file mode 100755 index 0000000..4f17619 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_end_a0b.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_end_a0c.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_end_a0c.vpcf_c new file mode 100755 index 0000000..65de1d9 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_end_a0c.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_end_a0d.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_end_a0d.vpcf_c new file mode 100755 index 0000000..1402e56 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_end_a0d.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_end_a0d0.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_end_a0d0.vpcf_c new file mode 100755 index 0000000..f667f8b Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_end_a0d0.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_kill.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_kill.vpcf_c new file mode 100755 index 0000000..594cecf Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_kill.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_kill_a.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_kill_a.vpcf_c new file mode 100755 index 0000000..4d14942 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_kill_a.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_kill_a0.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_kill_a0.vpcf_c new file mode 100755 index 0000000..d868adb Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_kill_a0.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_kill_a0a.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_kill_a0a.vpcf_c new file mode 100755 index 0000000..5d4492f Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_kill_a0a.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_kill_a0b.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_kill_a0b.vpcf_c new file mode 100755 index 0000000..5558862 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_kill_a0b.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_kill_a0c.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_kill_a0c.vpcf_c new file mode 100755 index 0000000..9379ff4 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_kill_a0c.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_kill_a0d.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_kill_a0d.vpcf_c new file mode 100755 index 0000000..bdc87a5 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_kill_a0d.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_kill_a0d0.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_kill_a0d0.vpcf_c new file mode 100755 index 0000000..b0aad76 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_kill_a0d0.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_wall.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_wall.vpcf_c new file mode 100755 index 0000000..7db87cc Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_wall.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_wall_a.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_wall_a.vpcf_c new file mode 100755 index 0000000..0ca13fa Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_wall_a.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_wall_a0.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_wall_a0.vpcf_c new file mode 100755 index 0000000..62c7bc1 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_wall_a0.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_wall_a0a.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_wall_a0a.vpcf_c new file mode 100755 index 0000000..cb7c785 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_wall_a0a.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_wall_a0b.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_wall_a0b.vpcf_c new file mode 100755 index 0000000..fd14674 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_wall_a0b.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_wall_a0c.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_wall_a0c.vpcf_c new file mode 100755 index 0000000..c6fb400 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_wall_a0c.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_wall_a0d.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_wall_a0d.vpcf_c new file mode 100755 index 0000000..de88703 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_wall_a0d.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_blink_wall_a0d0.vpcf_c b/particles/heroes/muyue/ability_muyue_011_blink_wall_a0d0.vpcf_c new file mode 100755 index 0000000..a2fc833 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_blink_wall_a0d0.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_011_c.vpcf_c b/particles/heroes/muyue/ability_muyue_011_c.vpcf_c new file mode 100755 index 0000000..6a9ce80 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_011_c.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_012.vpcf_c b/particles/heroes/muyue/ability_muyue_012.vpcf_c new file mode 100755 index 0000000..0c3fb7d Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_012.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_012_fire.vpcf_c b/particles/heroes/muyue/ability_muyue_012_fire.vpcf_c new file mode 100755 index 0000000..8c3f195 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_012_fire.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_012_line.vpcf_c b/particles/heroes/muyue/ability_muyue_012_line.vpcf_c new file mode 100755 index 0000000..2d106fc Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_012_line.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_012_projectile.vpcf_c b/particles/heroes/muyue/ability_muyue_012_projectile.vpcf_c new file mode 100755 index 0000000..3a50555 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_012_projectile.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014.vpcf_c b/particles/heroes/muyue/ability_muyue_014.vpcf_c new file mode 100755 index 0000000..f4a31e5 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons.vpcf_c new file mode 100755 index 0000000..ee7a73a Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_a.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_a.vpcf_c new file mode 100755 index 0000000..7e9cc84 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_a.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_b.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_b.vpcf_c new file mode 100755 index 0000000..0c1dc67 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_b.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_c.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_c.vpcf_c new file mode 100755 index 0000000..8ce8f89 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_c.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_d.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_d.vpcf_c new file mode 100755 index 0000000..c8593dd Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_d.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_e.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_e.vpcf_c new file mode 100755 index 0000000..2e81751 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_e.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_f.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_f.vpcf_c new file mode 100755 index 0000000..075d4bd Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_f.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_g.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_g.vpcf_c new file mode 100755 index 0000000..103bea1 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_g.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_h.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_h.vpcf_c new file mode 100755 index 0000000..34d80c8 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_h.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_i.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_i.vpcf_c new file mode 100755 index 0000000..0996db0 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_i.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_j.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_j.vpcf_c new file mode 100755 index 0000000..14dd75a Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_j.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_k.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_k.vpcf_c new file mode 100755 index 0000000..b4fcd57 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_k.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_l.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_l.vpcf_c new file mode 100755 index 0000000..49cda21 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_l.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_m.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_m.vpcf_c new file mode 100755 index 0000000..8f8ce84 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_m.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_n.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_n.vpcf_c new file mode 100755 index 0000000..8465cfb Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_n.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_o.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_o.vpcf_c new file mode 100755 index 0000000..b0b157b Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_o.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_p.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_p.vpcf_c new file mode 100755 index 0000000..f932b9a Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_p.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_q.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_q.vpcf_c new file mode 100755 index 0000000..176f111 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_q.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_r.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_r.vpcf_c new file mode 100755 index 0000000..9d0ca7c Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_r.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_s.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_s.vpcf_c new file mode 100755 index 0000000..14ce7d7 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_s.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_t.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_t.vpcf_c new file mode 100755 index 0000000..f02f4db Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_t.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_u.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_u.vpcf_c new file mode 100755 index 0000000..d2dbf07 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_u.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_v.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_v.vpcf_c new file mode 100755 index 0000000..516884d Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_v.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_w.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_w.vpcf_c new file mode 100755 index 0000000..5ee817e Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_w.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_aeons_x.vpcf_c b/particles/heroes/muyue/ability_muyue_014_aeons_x.vpcf_c new file mode 100755 index 0000000..4ec8007 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_aeons_x.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_status.vpcf_c b/particles/heroes/muyue/ability_muyue_014_status.vpcf_c new file mode 100755 index 0000000..d8d311c Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_status.vpcf_c differ diff --git a/particles/heroes/muyue/ability_muyue_014_status_b.vpcf_c b/particles/heroes/muyue/ability_muyue_014_status_b.vpcf_c new file mode 100755 index 0000000..1fb9431 Binary files /dev/null and b/particles/heroes/muyue/ability_muyue_014_status_b.vpcf_c differ diff --git a/particles/heroes/muyue/muyue_base_attack.vpcf_c b/particles/heroes/muyue/muyue_base_attack.vpcf_c new file mode 100755 index 0000000..e2fe8e8 Binary files /dev/null and b/particles/heroes/muyue/muyue_base_attack.vpcf_c differ diff --git a/particles/heroes/muyue/muyue_base_attack_a.vpcf_c b/particles/heroes/muyue/muyue_base_attack_a.vpcf_c new file mode 100755 index 0000000..6237eb8 Binary files /dev/null and b/particles/heroes/muyue/muyue_base_attack_a.vpcf_c differ diff --git a/particles/heroes/muyue/muyue_base_attack_a0.vpcf_c b/particles/heroes/muyue/muyue_base_attack_a0.vpcf_c new file mode 100755 index 0000000..fb3cf3f Binary files /dev/null and b/particles/heroes/muyue/muyue_base_attack_a0.vpcf_c differ diff --git a/particles/heroes/muyue/muyue_base_attack_b.vpcf_c b/particles/heroes/muyue/muyue_base_attack_b.vpcf_c new file mode 100755 index 0000000..f2ac2a8 Binary files /dev/null and b/particles/heroes/muyue/muyue_base_attack_b.vpcf_c differ diff --git a/particles/heroes/muyue/muyue_base_attack_b0.vpcf_c b/particles/heroes/muyue/muyue_base_attack_b0.vpcf_c new file mode 100755 index 0000000..eab921b Binary files /dev/null and b/particles/heroes/muyue/muyue_base_attack_b0.vpcf_c differ diff --git a/particles/heroes/muyue/muyue_base_attack_b1.vpcf_c b/particles/heroes/muyue/muyue_base_attack_b1.vpcf_c new file mode 100755 index 0000000..f47335c Binary files /dev/null and b/particles/heroes/muyue/muyue_base_attack_b1.vpcf_c differ diff --git a/particles/heroes/muyue/muyue_base_attack_b2.vpcf_c b/particles/heroes/muyue/muyue_base_attack_b2.vpcf_c new file mode 100755 index 0000000..dba6b39 Binary files /dev/null and b/particles/heroes/muyue/muyue_base_attack_b2.vpcf_c differ diff --git a/particles/heroes/muyue/muyue_base_attack_c.vpcf_c b/particles/heroes/muyue/muyue_base_attack_c.vpcf_c new file mode 100755 index 0000000..5bd8a31 Binary files /dev/null and b/particles/heroes/muyue/muyue_base_attack_c.vpcf_c differ diff --git a/particles/heroes/muyue/muyue_base_attack_d.vpcf_c b/particles/heroes/muyue/muyue_base_attack_d.vpcf_c new file mode 100755 index 0000000..2310524 Binary files /dev/null and b/particles/heroes/muyue/muyue_base_attack_d.vpcf_c differ diff --git a/particles/heroes/nazrin/nazrin_base_attack.vpcf_c b/particles/heroes/nazrin/nazrin_base_attack.vpcf_c new file mode 100755 index 0000000..95661a2 Binary files /dev/null and b/particles/heroes/nazrin/nazrin_base_attack.vpcf_c differ diff --git a/particles/heroes/nazrin/nazrin_base_attack_a.vpcf_c b/particles/heroes/nazrin/nazrin_base_attack_a.vpcf_c new file mode 100755 index 0000000..1d61354 Binary files /dev/null and b/particles/heroes/nazrin/nazrin_base_attack_a.vpcf_c differ diff --git a/particles/heroes/nazrin/nazrin_base_attack_a0.vpcf_c b/particles/heroes/nazrin/nazrin_base_attack_a0.vpcf_c new file mode 100755 index 0000000..7e52eee Binary files /dev/null and b/particles/heroes/nazrin/nazrin_base_attack_a0.vpcf_c differ diff --git a/particles/heroes/nazrin/nazrin_base_attack_a1.vpcf_c b/particles/heroes/nazrin/nazrin_base_attack_a1.vpcf_c new file mode 100755 index 0000000..0b32075 Binary files /dev/null and b/particles/heroes/nazrin/nazrin_base_attack_a1.vpcf_c differ diff --git a/particles/heroes/nazrin/nazrin_base_attack_b.vpcf_c b/particles/heroes/nazrin/nazrin_base_attack_b.vpcf_c new file mode 100755 index 0000000..f23e35e Binary files /dev/null and b/particles/heroes/nazrin/nazrin_base_attack_b.vpcf_c differ diff --git a/particles/heroes/nazrin/nazrin_base_attack_b0.vpcf_c b/particles/heroes/nazrin/nazrin_base_attack_b0.vpcf_c new file mode 100755 index 0000000..37030db Binary files /dev/null and b/particles/heroes/nazrin/nazrin_base_attack_b0.vpcf_c differ diff --git a/particles/heroes/nazrin/nazrin_base_attack_c.vpcf_c b/particles/heroes/nazrin/nazrin_base_attack_c.vpcf_c new file mode 100755 index 0000000..e731e92 Binary files /dev/null and b/particles/heroes/nazrin/nazrin_base_attack_c.vpcf_c differ diff --git a/particles/heroes/nazrin/nazrin_base_attack_c0.vpcf_c b/particles/heroes/nazrin/nazrin_base_attack_c0.vpcf_c new file mode 100755 index 0000000..5dcda8f Binary files /dev/null and b/particles/heroes/nazrin/nazrin_base_attack_c0.vpcf_c differ diff --git a/particles/heroes/nazrin/nazrin_base_attack_c1.vpcf_c b/particles/heroes/nazrin/nazrin_base_attack_c1.vpcf_c new file mode 100755 index 0000000..da2bcad Binary files /dev/null and b/particles/heroes/nazrin/nazrin_base_attack_c1.vpcf_c differ diff --git a/particles/heroes/nazrin/nazrin_base_attack_c2.vpcf_c b/particles/heroes/nazrin/nazrin_base_attack_c2.vpcf_c new file mode 100755 index 0000000..4c73a8e Binary files /dev/null and b/particles/heroes/nazrin/nazrin_base_attack_c2.vpcf_c differ diff --git a/particles/heroes/nazrin/nazrin_base_attack_c3.vpcf_c b/particles/heroes/nazrin/nazrin_base_attack_c3.vpcf_c new file mode 100755 index 0000000..3bc4af4 Binary files /dev/null and b/particles/heroes/nazrin/nazrin_base_attack_c3.vpcf_c differ diff --git a/particles/heroes/nazrin/nazrin_base_attack_d.vpcf_c b/particles/heroes/nazrin/nazrin_base_attack_d.vpcf_c new file mode 100755 index 0000000..1ce5e56 Binary files /dev/null and b/particles/heroes/nazrin/nazrin_base_attack_d.vpcf_c differ diff --git a/particles/heroes/nue/ability_minoriko_04_ufo.vpcf_c b/particles/heroes/nue/ability_minoriko_04_ufo.vpcf_c new file mode 100755 index 0000000..92e06ae Binary files /dev/null and b/particles/heroes/nue/ability_minoriko_04_ufo.vpcf_c differ diff --git a/particles/heroes/nue/ability_minoriko_04_ufo_move.vpcf_c b/particles/heroes/nue/ability_minoriko_04_ufo_move.vpcf_c new file mode 100755 index 0000000..bb2430e Binary files /dev/null and b/particles/heroes/nue/ability_minoriko_04_ufo_move.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01.vpcf_c b/particles/heroes/nue/ability_nue_01.vpcf_c new file mode 100755 index 0000000..7e291d7 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a.vpcf_c b/particles/heroes/nue/ability_nue_01_a.vpcf_c new file mode 100755 index 0000000..76941e4 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a0.vpcf_c b/particles/heroes/nue/ability_nue_01_a0.vpcf_c new file mode 100755 index 0000000..152247d Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a0.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a1.vpcf_c b/particles/heroes/nue/ability_nue_01_a1.vpcf_c new file mode 100755 index 0000000..7d90511 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a1.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a10.vpcf_c b/particles/heroes/nue/ability_nue_01_a10.vpcf_c new file mode 100755 index 0000000..8f4b22c Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a10.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a11.vpcf_c b/particles/heroes/nue/ability_nue_01_a11.vpcf_c new file mode 100755 index 0000000..11bc23d Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a11.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a12.vpcf_c b/particles/heroes/nue/ability_nue_01_a12.vpcf_c new file mode 100755 index 0000000..327b778 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a12.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a13.vpcf_c b/particles/heroes/nue/ability_nue_01_a13.vpcf_c new file mode 100755 index 0000000..94529ef Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a13.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a14.vpcf_c b/particles/heroes/nue/ability_nue_01_a14.vpcf_c new file mode 100755 index 0000000..6d85913 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a14.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a15.vpcf_c b/particles/heroes/nue/ability_nue_01_a15.vpcf_c new file mode 100755 index 0000000..ed72f36 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a15.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a16.vpcf_c b/particles/heroes/nue/ability_nue_01_a16.vpcf_c new file mode 100755 index 0000000..95244c3 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a16.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a17.vpcf_c b/particles/heroes/nue/ability_nue_01_a17.vpcf_c new file mode 100755 index 0000000..793559f Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a17.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a18.vpcf_c b/particles/heroes/nue/ability_nue_01_a18.vpcf_c new file mode 100755 index 0000000..769afc7 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a18.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a19.vpcf_c b/particles/heroes/nue/ability_nue_01_a19.vpcf_c new file mode 100755 index 0000000..251df8e Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a19.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a2.vpcf_c b/particles/heroes/nue/ability_nue_01_a2.vpcf_c new file mode 100755 index 0000000..7b5c320 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a2.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a3.vpcf_c b/particles/heroes/nue/ability_nue_01_a3.vpcf_c new file mode 100755 index 0000000..5763753 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a3.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a3a.vpcf_c b/particles/heroes/nue/ability_nue_01_a3a.vpcf_c new file mode 100755 index 0000000..b67d618 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a3a.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a4.vpcf_c b/particles/heroes/nue/ability_nue_01_a4.vpcf_c new file mode 100755 index 0000000..77d21b9 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a4.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a5.vpcf_c b/particles/heroes/nue/ability_nue_01_a5.vpcf_c new file mode 100755 index 0000000..a26fc30 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a5.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a5a.vpcf_c b/particles/heroes/nue/ability_nue_01_a5a.vpcf_c new file mode 100755 index 0000000..b914660 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a5a.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a6.vpcf_c b/particles/heroes/nue/ability_nue_01_a6.vpcf_c new file mode 100755 index 0000000..9a68203 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a6.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a7.vpcf_c b/particles/heroes/nue/ability_nue_01_a7.vpcf_c new file mode 100755 index 0000000..da3d88d Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a7.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a8.vpcf_c b/particles/heroes/nue/ability_nue_01_a8.vpcf_c new file mode 100755 index 0000000..10d125b Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a8.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a8a.vpcf_c b/particles/heroes/nue/ability_nue_01_a8a.vpcf_c new file mode 100755 index 0000000..b3bd4f0 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a8a.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_a9.vpcf_c b/particles/heroes/nue/ability_nue_01_a9.vpcf_c new file mode 100755 index 0000000..4ce0b83 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_a9.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball.vpcf_c b/particles/heroes/nue/ability_nue_01_ball.vpcf_c new file mode 100755 index 0000000..c7d8407 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball_a.vpcf_c b/particles/heroes/nue/ability_nue_01_ball_a.vpcf_c new file mode 100755 index 0000000..2d29b71 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball_a.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball_b.vpcf_c b/particles/heroes/nue/ability_nue_01_ball_b.vpcf_c new file mode 100755 index 0000000..eb0f864 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball_b.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball_c.vpcf_c b/particles/heroes/nue/ability_nue_01_ball_c.vpcf_c new file mode 100755 index 0000000..c421c14 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball_c.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball_d.vpcf_c b/particles/heroes/nue/ability_nue_01_ball_d.vpcf_c new file mode 100755 index 0000000..267876b Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball_d.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball_e.vpcf_c b/particles/heroes/nue/ability_nue_01_ball_e.vpcf_c new file mode 100755 index 0000000..2d0e600 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball_e.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball_f.vpcf_c b/particles/heroes/nue/ability_nue_01_ball_f.vpcf_c new file mode 100755 index 0000000..4451c5e Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball_f.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball_g.vpcf_c b/particles/heroes/nue/ability_nue_01_ball_g.vpcf_c new file mode 100755 index 0000000..22eed16 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball_g.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball_h.vpcf_c b/particles/heroes/nue/ability_nue_01_ball_h.vpcf_c new file mode 100755 index 0000000..0648a06 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball_h.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball_i.vpcf_c b/particles/heroes/nue/ability_nue_01_ball_i.vpcf_c new file mode 100755 index 0000000..cf543b9 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball_i.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball_j.vpcf_c b/particles/heroes/nue/ability_nue_01_ball_j.vpcf_c new file mode 100755 index 0000000..5986ec7 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball_j.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball_k.vpcf_c b/particles/heroes/nue/ability_nue_01_ball_k.vpcf_c new file mode 100755 index 0000000..3b484e2 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball_k.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_01_ball_l.vpcf_c b/particles/heroes/nue/ability_nue_01_ball_l.vpcf_c new file mode 100755 index 0000000..018b380 Binary files /dev/null and b/particles/heroes/nue/ability_nue_01_ball_l.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04.vpcf_c b/particles/heroes/nue/ability_nue_04.vpcf_c new file mode 100755 index 0000000..df9e96e Binary files /dev/null and b/particles/heroes/nue/ability_nue_04.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_a.vpcf_c b/particles/heroes/nue/ability_nue_04_a.vpcf_c new file mode 100755 index 0000000..86b9bf8 Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_a.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_b.vpcf_c b/particles/heroes/nue/ability_nue_04_b.vpcf_c new file mode 100755 index 0000000..9300ec7 Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_b.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_c.vpcf_c b/particles/heroes/nue/ability_nue_04_c.vpcf_c new file mode 100755 index 0000000..113303b Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_c.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_d.vpcf_c b/particles/heroes/nue/ability_nue_04_d.vpcf_c new file mode 100755 index 0000000..57d9fc2 Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_d.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_e.vpcf_c b/particles/heroes/nue/ability_nue_04_e.vpcf_c new file mode 100755 index 0000000..73c0f25 Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_e.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_f.vpcf_c b/particles/heroes/nue/ability_nue_04_f.vpcf_c new file mode 100755 index 0000000..3b46c4e Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_f.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_g.vpcf_c b/particles/heroes/nue/ability_nue_04_g.vpcf_c new file mode 100755 index 0000000..510f7a3 Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_g.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_h.vpcf_c b/particles/heroes/nue/ability_nue_04_h.vpcf_c new file mode 100755 index 0000000..6b4f94a Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_h.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_i.vpcf_c b/particles/heroes/nue/ability_nue_04_i.vpcf_c new file mode 100755 index 0000000..bf78dde Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_i.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_light.vpcf_c b/particles/heroes/nue/ability_nue_04_light.vpcf_c new file mode 100755 index 0000000..8a84005 Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_light.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_light_ufo.vpcf_c b/particles/heroes/nue/ability_nue_04_light_ufo.vpcf_c new file mode 100755 index 0000000..72f7a0f Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_light_ufo.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_light_ufo_a.vpcf_c b/particles/heroes/nue/ability_nue_04_light_ufo_a.vpcf_c new file mode 100755 index 0000000..22cfab5 Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_light_ufo_a.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_light_ufo_b.vpcf_c b/particles/heroes/nue/ability_nue_04_light_ufo_b.vpcf_c new file mode 100755 index 0000000..de3a087 Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_light_ufo_b.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_light_ufo_c.vpcf_c b/particles/heroes/nue/ability_nue_04_light_ufo_c.vpcf_c new file mode 100755 index 0000000..e2652e4 Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_light_ufo_c.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_light_ufo_d.vpcf_c b/particles/heroes/nue/ability_nue_04_light_ufo_d.vpcf_c new file mode 100755 index 0000000..86f0ad8 Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_light_ufo_d.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_light_ufo_e.vpcf_c b/particles/heroes/nue/ability_nue_04_light_ufo_e.vpcf_c new file mode 100755 index 0000000..dd9ba3d Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_light_ufo_e.vpcf_c differ diff --git a/particles/heroes/nue/ability_nue_04_light_ufo_f.vpcf_c b/particles/heroes/nue/ability_nue_04_light_ufo_f.vpcf_c new file mode 100755 index 0000000..b40ea77 Binary files /dev/null and b/particles/heroes/nue/ability_nue_04_light_ufo_f.vpcf_c differ diff --git a/particles/heroes/patchouli/ability_patchouli_01.vpcf_c b/particles/heroes/patchouli/ability_patchouli_01.vpcf_c new file mode 100755 index 0000000..1697329 Binary files /dev/null and b/particles/heroes/patchouli/ability_patchouli_01.vpcf_c differ diff --git a/particles/heroes/patchouli/ability_patchouli_01_a.vpcf_c b/particles/heroes/patchouli/ability_patchouli_01_a.vpcf_c new file mode 100755 index 0000000..3d2f5c0 Binary files /dev/null and b/particles/heroes/patchouli/ability_patchouli_01_a.vpcf_c differ diff --git a/particles/heroes/patchouli/ability_patchouli_01_b.vpcf_c b/particles/heroes/patchouli/ability_patchouli_01_b.vpcf_c new file mode 100755 index 0000000..6bc2e5e Binary files /dev/null and b/particles/heroes/patchouli/ability_patchouli_01_b.vpcf_c differ diff --git a/particles/heroes/patchouli/ability_patchouli_01_c.vpcf_c b/particles/heroes/patchouli/ability_patchouli_01_c.vpcf_c new file mode 100755 index 0000000..8818b37 Binary files /dev/null and b/particles/heroes/patchouli/ability_patchouli_01_c.vpcf_c differ diff --git a/particles/heroes/patchouli/ability_patchouli_01_circle.vpcf_c b/particles/heroes/patchouli/ability_patchouli_01_circle.vpcf_c new file mode 100755 index 0000000..bfb1537 Binary files /dev/null and b/particles/heroes/patchouli/ability_patchouli_01_circle.vpcf_c differ diff --git a/particles/heroes/patchouli/ability_patchouli_01_circle_a.vpcf_c b/particles/heroes/patchouli/ability_patchouli_01_circle_a.vpcf_c new file mode 100755 index 0000000..cca77d1 Binary files /dev/null and b/particles/heroes/patchouli/ability_patchouli_01_circle_a.vpcf_c differ diff --git a/particles/heroes/patchouli/ability_patchouli_01_lava.vpcf_c b/particles/heroes/patchouli/ability_patchouli_01_lava.vpcf_c new file mode 100755 index 0000000..232eae0 Binary files /dev/null and b/particles/heroes/patchouli/ability_patchouli_01_lava.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_02.vpcf_c b/particles/heroes/ran/ability_ran_02.vpcf_c new file mode 100755 index 0000000..99b8719 Binary files /dev/null and b/particles/heroes/ran/ability_ran_02.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_02_effect.vpcf_c b/particles/heroes/ran/ability_ran_02_effect.vpcf_c new file mode 100755 index 0000000..8964e20 Binary files /dev/null and b/particles/heroes/ran/ability_ran_02_effect.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_02_new.vpcf_c b/particles/heroes/ran/ability_ran_02_new.vpcf_c new file mode 100755 index 0000000..1c887c0 Binary files /dev/null and b/particles/heroes/ran/ability_ran_02_new.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_02_new_a.vpcf_c b/particles/heroes/ran/ability_ran_02_new_a.vpcf_c new file mode 100755 index 0000000..1c9d4f6 Binary files /dev/null and b/particles/heroes/ran/ability_ran_02_new_a.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_02_wan.vpcf_c b/particles/heroes/ran/ability_ran_02_wan.vpcf_c new file mode 100755 index 0000000..7bd6c94 Binary files /dev/null and b/particles/heroes/ran/ability_ran_02_wan.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_02_wan_a.vpcf_c b/particles/heroes/ran/ability_ran_02_wan_a.vpcf_c new file mode 100755 index 0000000..ea8341b Binary files /dev/null and b/particles/heroes/ran/ability_ran_02_wan_a.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_02_wan_b.vpcf_c b/particles/heroes/ran/ability_ran_02_wan_b.vpcf_c new file mode 100755 index 0000000..c97decb Binary files /dev/null and b/particles/heroes/ran/ability_ran_02_wan_b.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_02_wan_c.vpcf_c b/particles/heroes/ran/ability_ran_02_wan_c.vpcf_c new file mode 100755 index 0000000..d2d5868 Binary files /dev/null and b/particles/heroes/ran/ability_ran_02_wan_c.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_02_wan_d.vpcf_c b/particles/heroes/ran/ability_ran_02_wan_d.vpcf_c new file mode 100755 index 0000000..60e1d38 Binary files /dev/null and b/particles/heroes/ran/ability_ran_02_wan_d.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_02_wan_light.vpcf_c b/particles/heroes/ran/ability_ran_02_wan_light.vpcf_c new file mode 100755 index 0000000..3702a9b Binary files /dev/null and b/particles/heroes/ran/ability_ran_02_wan_light.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_02_wan_special.vpcf_c b/particles/heroes/ran/ability_ran_02_wan_special.vpcf_c new file mode 100755 index 0000000..8db9e3c Binary files /dev/null and b/particles/heroes/ran/ability_ran_02_wan_special.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser.vpcf_c b/particles/heroes/ran/ability_ran_03_laser.vpcf_c new file mode 100755 index 0000000..14db7a5 Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_a.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_a.vpcf_c new file mode 100755 index 0000000..d5b932a Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_a.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_b.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_b.vpcf_c new file mode 100755 index 0000000..887970c Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_b.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_c.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_c.vpcf_c new file mode 100755 index 0000000..54714bc Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_c.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_c0.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_c0.vpcf_c new file mode 100755 index 0000000..1ebf345 Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_c0.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_c1.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_c1.vpcf_c new file mode 100755 index 0000000..ddce7ea Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_c1.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_c2.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_c2.vpcf_c new file mode 100755 index 0000000..a8592fb Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_c2.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_c3.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_c3.vpcf_c new file mode 100755 index 0000000..aac9de3 Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_c3.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_c4.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_c4.vpcf_c new file mode 100755 index 0000000..cde4433 Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_c4.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_c5.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_c5.vpcf_c new file mode 100755 index 0000000..029e2ae Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_c5.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_c6.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_c6.vpcf_c new file mode 100755 index 0000000..cda77ac Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_c6.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_c7.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_c7.vpcf_c new file mode 100755 index 0000000..1577ed2 Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_c7.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_c8.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_c8.vpcf_c new file mode 100755 index 0000000..9c3f78c Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_c8.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_d.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_d.vpcf_c new file mode 100755 index 0000000..4b78645 Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_d.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_e.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_e.vpcf_c new file mode 100755 index 0000000..2fd6835 Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_e.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_f.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_f.vpcf_c new file mode 100755 index 0000000..ecaf232 Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_f.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_g.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_g.vpcf_c new file mode 100755 index 0000000..0a92fa2 Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_g.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_h.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_h.vpcf_c new file mode 100755 index 0000000..5a59f10 Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_h.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_03_laser_i.vpcf_c b/particles/heroes/ran/ability_ran_03_laser_i.vpcf_c new file mode 100755 index 0000000..179a36b Binary files /dev/null and b/particles/heroes/ran/ability_ran_03_laser_i.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_04_buff.vpcf_c b/particles/heroes/ran/ability_ran_04_buff.vpcf_c new file mode 100755 index 0000000..a5efead Binary files /dev/null and b/particles/heroes/ran/ability_ran_04_buff.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_04_buff_a.vpcf_c b/particles/heroes/ran/ability_ran_04_buff_a.vpcf_c new file mode 100755 index 0000000..2d86bbd Binary files /dev/null and b/particles/heroes/ran/ability_ran_04_buff_a.vpcf_c differ diff --git a/particles/heroes/ran/ability_ran_04_buff_b.vpcf_c b/particles/heroes/ran/ability_ran_04_buff_b.vpcf_c new file mode 100755 index 0000000..392d282 Binary files /dev/null and b/particles/heroes/ran/ability_ran_04_buff_b.vpcf_c differ diff --git a/particles/heroes/reimu/reimu_01_ball.vpcf_c b/particles/heroes/reimu/reimu_01_ball.vpcf_c new file mode 100755 index 0000000..11ba0e3 Binary files /dev/null and b/particles/heroes/reimu/reimu_01_ball.vpcf_c differ diff --git a/particles/heroes/reimu/reimu_01_effect.vpcf_c b/particles/heroes/reimu/reimu_01_effect.vpcf_c new file mode 100755 index 0000000..f4b8422 Binary files /dev/null and b/particles/heroes/reimu/reimu_01_effect.vpcf_c differ diff --git a/particles/heroes/reimu/reimu_01_effect_b.vpcf_c b/particles/heroes/reimu/reimu_01_effect_b.vpcf_c new file mode 100755 index 0000000..38f5ba9 Binary files /dev/null and b/particles/heroes/reimu/reimu_01_effect_b.vpcf_c differ diff --git a/particles/heroes/reimu/reimu_01_effect_c.vpcf_c b/particles/heroes/reimu/reimu_01_effect_c.vpcf_c new file mode 100755 index 0000000..4d7b776 Binary files /dev/null and b/particles/heroes/reimu/reimu_01_effect_c.vpcf_c differ diff --git a/particles/heroes/reimu/reimu_01_effect_fire.vpcf_c b/particles/heroes/reimu/reimu_01_effect_fire.vpcf_c new file mode 100755 index 0000000..e84200b Binary files /dev/null and b/particles/heroes/reimu/reimu_01_effect_fire.vpcf_c differ diff --git a/particles/heroes/reimu/reimu_03_effect.vpcf_c b/particles/heroes/reimu/reimu_03_effect.vpcf_c new file mode 100755 index 0000000..590f809 Binary files /dev/null and b/particles/heroes/reimu/reimu_03_effect.vpcf_c differ diff --git a/particles/heroes/reimu/reimu_04_effect.vpcf_c b/particles/heroes/reimu/reimu_04_effect.vpcf_c new file mode 100755 index 0000000..32026d3 Binary files /dev/null and b/particles/heroes/reimu/reimu_04_effect.vpcf_c differ diff --git a/particles/heroes/reimu/reimu_04_effect_buff.vpcf_c b/particles/heroes/reimu/reimu_04_effect_buff.vpcf_c new file mode 100755 index 0000000..2f7a407 Binary files /dev/null and b/particles/heroes/reimu/reimu_04_effect_buff.vpcf_c differ diff --git a/particles/heroes/reimu/reimu_04_effect_light.vpcf_c b/particles/heroes/reimu/reimu_04_effect_light.vpcf_c new file mode 100755 index 0000000..74fd6d0 Binary files /dev/null and b/particles/heroes/reimu/reimu_04_effect_light.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen01_projectile.vpcf_c b/particles/heroes/reisen/ability_reisen01_projectile.vpcf_c new file mode 100755 index 0000000..38ad3ac Binary files /dev/null and b/particles/heroes/reisen/ability_reisen01_projectile.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen01_projectile_a.vpcf_c b/particles/heroes/reisen/ability_reisen01_projectile_a.vpcf_c new file mode 100755 index 0000000..badc0c3 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen01_projectile_a.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen01_projectile_a0.vpcf_c b/particles/heroes/reisen/ability_reisen01_projectile_a0.vpcf_c new file mode 100755 index 0000000..09e0161 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen01_projectile_a0.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen01_projectile_a1.vpcf_c b/particles/heroes/reisen/ability_reisen01_projectile_a1.vpcf_c new file mode 100755 index 0000000..850bfdd Binary files /dev/null and b/particles/heroes/reisen/ability_reisen01_projectile_a1.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen01_projectile_b.vpcf_c b/particles/heroes/reisen/ability_reisen01_projectile_b.vpcf_c new file mode 100755 index 0000000..084e12f Binary files /dev/null and b/particles/heroes/reisen/ability_reisen01_projectile_b.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen01_projectile_b0.vpcf_c b/particles/heroes/reisen/ability_reisen01_projectile_b0.vpcf_c new file mode 100755 index 0000000..1ff2fa4 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen01_projectile_b0.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen01_projectile_c.vpcf_c b/particles/heroes/reisen/ability_reisen01_projectile_c.vpcf_c new file mode 100755 index 0000000..556bfb5 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen01_projectile_c.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen01_projectile_c0.vpcf_c b/particles/heroes/reisen/ability_reisen01_projectile_c0.vpcf_c new file mode 100755 index 0000000..cdbfb7d Binary files /dev/null and b/particles/heroes/reisen/ability_reisen01_projectile_c0.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen01_projectile_c1.vpcf_c b/particles/heroes/reisen/ability_reisen01_projectile_c1.vpcf_c new file mode 100755 index 0000000..8e21802 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen01_projectile_c1.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen01_projectile_c2.vpcf_c b/particles/heroes/reisen/ability_reisen01_projectile_c2.vpcf_c new file mode 100755 index 0000000..6402cb2 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen01_projectile_c2.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen01_projectile_d.vpcf_c b/particles/heroes/reisen/ability_reisen01_projectile_d.vpcf_c new file mode 100755 index 0000000..cdfad8d Binary files /dev/null and b/particles/heroes/reisen/ability_reisen01_projectile_d.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen01_projectile_e.vpcf_c b/particles/heroes/reisen/ability_reisen01_projectile_e.vpcf_c new file mode 100755 index 0000000..9581d75 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen01_projectile_e.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen02.vpcf_c b/particles/heroes/reisen/ability_reisen02.vpcf_c new file mode 100755 index 0000000..d167ba2 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen02.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen02_a.vpcf_c b/particles/heroes/reisen/ability_reisen02_a.vpcf_c new file mode 100755 index 0000000..1d5292c Binary files /dev/null and b/particles/heroes/reisen/ability_reisen02_a.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen02_b.vpcf_c b/particles/heroes/reisen/ability_reisen02_b.vpcf_c new file mode 100755 index 0000000..e5cd07a Binary files /dev/null and b/particles/heroes/reisen/ability_reisen02_b.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen02_buff.vpcf_c b/particles/heroes/reisen/ability_reisen02_buff.vpcf_c new file mode 100755 index 0000000..ead1a34 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen02_buff.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen02_buff_a.vpcf_c b/particles/heroes/reisen/ability_reisen02_buff_a.vpcf_c new file mode 100755 index 0000000..bbb17ef Binary files /dev/null and b/particles/heroes/reisen/ability_reisen02_buff_a.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen02_c.vpcf_c b/particles/heroes/reisen/ability_reisen02_c.vpcf_c new file mode 100755 index 0000000..a8c49e6 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen02_c.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen02_d.vpcf_c b/particles/heroes/reisen/ability_reisen02_d.vpcf_c new file mode 100755 index 0000000..858dcbf Binary files /dev/null and b/particles/heroes/reisen/ability_reisen02_d.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen_01.vpcf_c b/particles/heroes/reisen/ability_reisen_01.vpcf_c new file mode 100755 index 0000000..d7c6586 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen_01.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen_01_a.vpcf_c b/particles/heroes/reisen/ability_reisen_01_a.vpcf_c new file mode 100755 index 0000000..1f11fdb Binary files /dev/null and b/particles/heroes/reisen/ability_reisen_01_a.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen_01_b.vpcf_c b/particles/heroes/reisen/ability_reisen_01_b.vpcf_c new file mode 100755 index 0000000..0930049 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen_01_b.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen_01_c.vpcf_c b/particles/heroes/reisen/ability_reisen_01_c.vpcf_c new file mode 100755 index 0000000..46233c6 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen_01_c.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen_01_d.vpcf_c b/particles/heroes/reisen/ability_reisen_01_d.vpcf_c new file mode 100755 index 0000000..b2c1209 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen_01_d.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen_01_e.vpcf_c b/particles/heroes/reisen/ability_reisen_01_e.vpcf_c new file mode 100755 index 0000000..0cc3c0a Binary files /dev/null and b/particles/heroes/reisen/ability_reisen_01_e.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen_01_f.vpcf_c b/particles/heroes/reisen/ability_reisen_01_f.vpcf_c new file mode 100755 index 0000000..67efcf5 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen_01_f.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen_04_bullet.vpcf_c b/particles/heroes/reisen/ability_reisen_04_bullet.vpcf_c new file mode 100755 index 0000000..9ffaec6 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen_04_bullet.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen_base_attack.vpcf_c b/particles/heroes/reisen/ability_reisen_base_attack.vpcf_c new file mode 100755 index 0000000..c6dc955 Binary files /dev/null and b/particles/heroes/reisen/ability_reisen_base_attack.vpcf_c differ diff --git a/particles/heroes/reisen/ability_reisen_base_attack_b.vpcf_c b/particles/heroes/reisen/ability_reisen_base_attack_b.vpcf_c new file mode 100755 index 0000000..f74d63d Binary files /dev/null and b/particles/heroes/reisen/ability_reisen_base_attack_b.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01.vpcf_c b/particles/heroes/remilia/ability_remilia_01.vpcf_c new file mode 100755 index 0000000..1fd3670 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_a.vpcf_c b/particles/heroes/remilia/ability_remilia_01_a.vpcf_c new file mode 100755 index 0000000..96bcade Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_a.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_a0.vpcf_c b/particles/heroes/remilia/ability_remilia_01_a0.vpcf_c new file mode 100755 index 0000000..40d7dd8 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_a0.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_b.vpcf_c b/particles/heroes/remilia/ability_remilia_01_b.vpcf_c new file mode 100755 index 0000000..06a60ea Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_b.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_c.vpcf_c b/particles/heroes/remilia/ability_remilia_01_c.vpcf_c new file mode 100755 index 0000000..4aaace5 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_c.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_d.vpcf_c b/particles/heroes/remilia/ability_remilia_01_d.vpcf_c new file mode 100755 index 0000000..d48ccaf Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_d.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_explosion.vpcf_c b/particles/heroes/remilia/ability_remilia_01_explosion.vpcf_c new file mode 100755 index 0000000..23ec092 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_explosion.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_explosion_a.vpcf_c b/particles/heroes/remilia/ability_remilia_01_explosion_a.vpcf_c new file mode 100755 index 0000000..34b6ebe Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_explosion_a.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_explosion_b.vpcf_c b/particles/heroes/remilia/ability_remilia_01_explosion_b.vpcf_c new file mode 100755 index 0000000..5614660 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_explosion_b.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_explosion_d.vpcf_c b/particles/heroes/remilia/ability_remilia_01_explosion_d.vpcf_c new file mode 100755 index 0000000..4f46eb1 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_explosion_d.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_explosion_e.vpcf_c b/particles/heroes/remilia/ability_remilia_01_explosion_e.vpcf_c new file mode 100755 index 0000000..ae541f1 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_explosion_e.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_explosion_f.vpcf_c b/particles/heroes/remilia/ability_remilia_01_explosion_f.vpcf_c new file mode 100755 index 0000000..fc71cea Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_explosion_f.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_explosion_g.vpcf_c b/particles/heroes/remilia/ability_remilia_01_explosion_g.vpcf_c new file mode 100755 index 0000000..324183d Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_explosion_g.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_01_explosion_h.vpcf_c b/particles/heroes/remilia/ability_remilia_01_explosion_h.vpcf_c new file mode 100755 index 0000000..689138a Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_01_explosion_h.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_02.vpcf_c b/particles/heroes/remilia/ability_remilia_02.vpcf_c new file mode 100755 index 0000000..e9c1a29 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_02.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_03.vpcf_c b/particles/heroes/remilia/ability_remilia_03.vpcf_c new file mode 100755 index 0000000..8449306 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_03.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_03_b.vpcf_c b/particles/heroes/remilia/ability_remilia_03_b.vpcf_c new file mode 100755 index 0000000..47e324f Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_03_b.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_03_spark.vpcf_c b/particles/heroes/remilia/ability_remilia_03_spark.vpcf_c new file mode 100755 index 0000000..e33314f Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_03_spark.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_03_spark_a.vpcf_c b/particles/heroes/remilia/ability_remilia_03_spark_a.vpcf_c new file mode 100755 index 0000000..448a4cf Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_03_spark_a.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_03_spark_b.vpcf_c b/particles/heroes/remilia/ability_remilia_03_spark_b.vpcf_c new file mode 100755 index 0000000..0e216c7 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_03_spark_b.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_03_spark_c.vpcf_c b/particles/heroes/remilia/ability_remilia_03_spark_c.vpcf_c new file mode 100755 index 0000000..f1f2268 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_03_spark_c.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_04.vpcf_c b/particles/heroes/remilia/ability_remilia_04.vpcf_c new file mode 100755 index 0000000..c177344 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_04.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_04_laser.vpcf_c b/particles/heroes/remilia/ability_remilia_04_laser.vpcf_c new file mode 100755 index 0000000..802ee04 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_04_laser.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_04_laser_b.vpcf_c b/particles/heroes/remilia/ability_remilia_04_laser_b.vpcf_c new file mode 100755 index 0000000..5d79c8b Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_04_laser_b.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_04_laser_c.vpcf_c b/particles/heroes/remilia/ability_remilia_04_laser_c.vpcf_c new file mode 100755 index 0000000..5f37392 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_04_laser_c.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_04_laser_d.vpcf_c b/particles/heroes/remilia/ability_remilia_04_laser_d.vpcf_c new file mode 100755 index 0000000..5d5ebd3 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_04_laser_d.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_04_laser_rocket.vpcf_c b/particles/heroes/remilia/ability_remilia_04_laser_rocket.vpcf_c new file mode 100755 index 0000000..0c142e4 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_04_laser_rocket.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_04_laser_rocket_b.vpcf_c b/particles/heroes/remilia/ability_remilia_04_laser_rocket_b.vpcf_c new file mode 100755 index 0000000..24df39c Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_04_laser_rocket_b.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_04_laser_rocket_c.vpcf_c b/particles/heroes/remilia/ability_remilia_04_laser_rocket_c.vpcf_c new file mode 100755 index 0000000..11596e2 Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_04_laser_rocket_c.vpcf_c differ diff --git a/particles/heroes/remilia/ability_remilia_04_laser_rocket_d.vpcf_c b/particles/heroes/remilia/ability_remilia_04_laser_rocket_d.vpcf_c new file mode 100755 index 0000000..02c621f Binary files /dev/null and b/particles/heroes/remilia/ability_remilia_04_laser_rocket_d.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01.vpcf_c b/particles/heroes/rin/ability_rin_01.vpcf_c new file mode 100755 index 0000000..ea5af02 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_a.vpcf_c b/particles/heroes/rin/ability_rin_01_a.vpcf_c new file mode 100755 index 0000000..6513a24 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_a.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_b.vpcf_c b/particles/heroes/rin/ability_rin_01_b.vpcf_c new file mode 100755 index 0000000..4c31de2 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_b.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_c.vpcf_c b/particles/heroes/rin/ability_rin_01_c.vpcf_c new file mode 100755 index 0000000..c4cecc8 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_c.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_d.vpcf_c b/particles/heroes/rin/ability_rin_01_d.vpcf_c new file mode 100755 index 0000000..fa00d72 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_d.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_e.vpcf_c b/particles/heroes/rin/ability_rin_01_e.vpcf_c new file mode 100755 index 0000000..20acc43 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_e.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_f.vpcf_c b/particles/heroes/rin/ability_rin_01_f.vpcf_c new file mode 100755 index 0000000..bdc8a17 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_f.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_g.vpcf_c b/particles/heroes/rin/ability_rin_01_g.vpcf_c new file mode 100755 index 0000000..381938f Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_g.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_g0.vpcf_c b/particles/heroes/rin/ability_rin_01_g0.vpcf_c new file mode 100755 index 0000000..f2658e6 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_g0.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_g0a.vpcf_c b/particles/heroes/rin/ability_rin_01_g0a.vpcf_c new file mode 100755 index 0000000..ac880c7 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_g0a.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_g0b.vpcf_c b/particles/heroes/rin/ability_rin_01_g0b.vpcf_c new file mode 100755 index 0000000..1989e6a Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_g0b.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_g0c.vpcf_c b/particles/heroes/rin/ability_rin_01_g0c.vpcf_c new file mode 100755 index 0000000..ed27b3f Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_g0c.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_g0d.vpcf_c b/particles/heroes/rin/ability_rin_01_g0d.vpcf_c new file mode 100755 index 0000000..9891fa1 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_g0d.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_g0e.vpcf_c b/particles/heroes/rin/ability_rin_01_g0e.vpcf_c new file mode 100755 index 0000000..271473a Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_g0e.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_g0e0.vpcf_c b/particles/heroes/rin/ability_rin_01_g0e0.vpcf_c new file mode 100755 index 0000000..3f58e78 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_g0e0.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_g0e0a.vpcf_c b/particles/heroes/rin/ability_rin_01_g0e0a.vpcf_c new file mode 100755 index 0000000..f2002ec Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_g0e0a.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_g0e0a0.vpcf_c b/particles/heroes/rin/ability_rin_01_g0e0a0.vpcf_c new file mode 100755 index 0000000..692569a Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_g0e0a0.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_g0f.vpcf_c b/particles/heroes/rin/ability_rin_01_g0f.vpcf_c new file mode 100755 index 0000000..4724b8a Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_g0f.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_g0g.vpcf_c b/particles/heroes/rin/ability_rin_01_g0g.vpcf_c new file mode 100755 index 0000000..168ef61 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_g0g.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_h.vpcf_c b/particles/heroes/rin/ability_rin_01_h.vpcf_c new file mode 100755 index 0000000..d5b9e65 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_h.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_i.vpcf_c b/particles/heroes/rin/ability_rin_01_i.vpcf_c new file mode 100755 index 0000000..c925830 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_i.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_j.vpcf_c b/particles/heroes/rin/ability_rin_01_j.vpcf_c new file mode 100755 index 0000000..d69d8a8 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_j.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_k.vpcf_c b/particles/heroes/rin/ability_rin_01_k.vpcf_c new file mode 100755 index 0000000..8b62047 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_k.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_l.vpcf_c b/particles/heroes/rin/ability_rin_01_l.vpcf_c new file mode 100755 index 0000000..b3fdae8 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_l.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_m.vpcf_c b/particles/heroes/rin/ability_rin_01_m.vpcf_c new file mode 100755 index 0000000..f6d587c Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_m.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_n.vpcf_c b/particles/heroes/rin/ability_rin_01_n.vpcf_c new file mode 100755 index 0000000..687f48c Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_n.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_n0.vpcf_c b/particles/heroes/rin/ability_rin_01_n0.vpcf_c new file mode 100755 index 0000000..501b60c Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_n0.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_n1.vpcf_c b/particles/heroes/rin/ability_rin_01_n1.vpcf_c new file mode 100755 index 0000000..f936052 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_n1.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_n2.vpcf_c b/particles/heroes/rin/ability_rin_01_n2.vpcf_c new file mode 100755 index 0000000..abf1562 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_n2.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_n3.vpcf_c b/particles/heroes/rin/ability_rin_01_n3.vpcf_c new file mode 100755 index 0000000..d97d821 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_n3.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_n4.vpcf_c b/particles/heroes/rin/ability_rin_01_n4.vpcf_c new file mode 100755 index 0000000..275530c Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_n4.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_n5.vpcf_c b/particles/heroes/rin/ability_rin_01_n5.vpcf_c new file mode 100755 index 0000000..61ec363 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_n5.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_n6.vpcf_c b/particles/heroes/rin/ability_rin_01_n6.vpcf_c new file mode 100755 index 0000000..ba57e6c Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_n6.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_projectile.vpcf_c b/particles/heroes/rin/ability_rin_01_projectile.vpcf_c new file mode 100755 index 0000000..0d4c52b Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_projectile.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_projectile_b.vpcf_c b/particles/heroes/rin/ability_rin_01_projectile_b.vpcf_c new file mode 100755 index 0000000..5eb4c47 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_projectile_b.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_01_projectile_c.vpcf_c b/particles/heroes/rin/ability_rin_01_projectile_c.vpcf_c new file mode 100755 index 0000000..b7793f9 Binary files /dev/null and b/particles/heroes/rin/ability_rin_01_projectile_c.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_02_body_c.vpcf_c b/particles/heroes/rin/ability_rin_02_body_c.vpcf_c new file mode 100755 index 0000000..0de2ff5 Binary files /dev/null and b/particles/heroes/rin/ability_rin_02_body_c.vpcf_c differ diff --git a/particles/heroes/rin/ability_rin_utsuho_buff.vpcf_c b/particles/heroes/rin/ability_rin_utsuho_buff.vpcf_c new file mode 100755 index 0000000..4018bef Binary files /dev/null and b/particles/heroes/rin/ability_rin_utsuho_buff.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_ex_projectile.vpcf_c b/particles/heroes/rumia/ability_rumia_02_ex_projectile.vpcf_c new file mode 100755 index 0000000..9cb9255 Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_ex_projectile.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_ex_projectile_a.vpcf_c b/particles/heroes/rumia/ability_rumia_02_ex_projectile_a.vpcf_c new file mode 100755 index 0000000..7363f9e Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_ex_projectile_a.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_ex_projectile_a0.vpcf_c b/particles/heroes/rumia/ability_rumia_02_ex_projectile_a0.vpcf_c new file mode 100755 index 0000000..b935281 Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_ex_projectile_a0.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_ex_projectile_b.vpcf_c b/particles/heroes/rumia/ability_rumia_02_ex_projectile_b.vpcf_c new file mode 100755 index 0000000..1c55890 Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_ex_projectile_b.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_ex_projectile_c.vpcf_c b/particles/heroes/rumia/ability_rumia_02_ex_projectile_c.vpcf_c new file mode 100755 index 0000000..dfb391e Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_ex_projectile_c.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_ex_projectile_d.vpcf_c b/particles/heroes/rumia/ability_rumia_02_ex_projectile_d.vpcf_c new file mode 100755 index 0000000..e589e7f Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_ex_projectile_d.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_ex_projectile_e.vpcf_c b/particles/heroes/rumia/ability_rumia_02_ex_projectile_e.vpcf_c new file mode 100755 index 0000000..cf47e1c Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_ex_projectile_e.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_projectile.vpcf_c b/particles/heroes/rumia/ability_rumia_02_projectile.vpcf_c new file mode 100755 index 0000000..742a6d8 Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_projectile.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_projectile_a.vpcf_c b/particles/heroes/rumia/ability_rumia_02_projectile_a.vpcf_c new file mode 100755 index 0000000..1ce5682 Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_projectile_a.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_projectile_b.vpcf_c b/particles/heroes/rumia/ability_rumia_02_projectile_b.vpcf_c new file mode 100755 index 0000000..506c3ed Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_projectile_b.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_projectile_c.vpcf_c b/particles/heroes/rumia/ability_rumia_02_projectile_c.vpcf_c new file mode 100755 index 0000000..02d5c52 Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_projectile_c.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_projectile_c0.vpcf_c b/particles/heroes/rumia/ability_rumia_02_projectile_c0.vpcf_c new file mode 100755 index 0000000..a38e2e4 Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_projectile_c0.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_projectile_d.vpcf_c b/particles/heroes/rumia/ability_rumia_02_projectile_d.vpcf_c new file mode 100755 index 0000000..9e961c7 Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_projectile_d.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_projectile_e.vpcf_c b/particles/heroes/rumia/ability_rumia_02_projectile_e.vpcf_c new file mode 100755 index 0000000..47afff9 Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_projectile_e.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_projectile_f.vpcf_c b/particles/heroes/rumia/ability_rumia_02_projectile_f.vpcf_c new file mode 100755 index 0000000..58543a5 Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_projectile_f.vpcf_c differ diff --git a/particles/heroes/rumia/ability_rumia_02_projectile_g.vpcf_c b/particles/heroes/rumia/ability_rumia_02_projectile_g.vpcf_c new file mode 100755 index 0000000..4095396 Binary files /dev/null and b/particles/heroes/rumia/ability_rumia_02_projectile_g.vpcf_c differ diff --git a/particles/heroes/sakuya/ability_sakuya_01.vpcf_c b/particles/heroes/sakuya/ability_sakuya_01.vpcf_c new file mode 100755 index 0000000..b24b9e8 Binary files /dev/null and b/particles/heroes/sakuya/ability_sakuya_01.vpcf_c differ diff --git a/particles/heroes/sakuya/ability_sakuya_01_b.vpcf_c b/particles/heroes/sakuya/ability_sakuya_01_b.vpcf_c new file mode 100755 index 0000000..0641346 Binary files /dev/null and b/particles/heroes/sakuya/ability_sakuya_01_b.vpcf_c differ diff --git a/particles/heroes/sakuya/ability_sakuya_03.vpcf_c b/particles/heroes/sakuya/ability_sakuya_03.vpcf_c new file mode 100755 index 0000000..a760d13 Binary files /dev/null and b/particles/heroes/sakuya/ability_sakuya_03.vpcf_c differ diff --git a/particles/heroes/sakuya/ability_sakuya_04.vpcf_c b/particles/heroes/sakuya/ability_sakuya_04.vpcf_c new file mode 100755 index 0000000..ec9e799 Binary files /dev/null and b/particles/heroes/sakuya/ability_sakuya_04.vpcf_c differ diff --git a/particles/heroes/sakuya/ability_sakuya_04_light.vpcf_c b/particles/heroes/sakuya/ability_sakuya_04_light.vpcf_c new file mode 100755 index 0000000..938aa85 Binary files /dev/null and b/particles/heroes/sakuya/ability_sakuya_04_light.vpcf_c differ diff --git a/particles/heroes/sakuya/ability_sakuya_ex.vpcf_c b/particles/heroes/sakuya/ability_sakuya_ex.vpcf_c new file mode 100755 index 0000000..3762ad2 Binary files /dev/null and b/particles/heroes/sakuya/ability_sakuya_ex.vpcf_c differ diff --git a/particles/heroes/sakuya/ability_sakuya_ex_b.vpcf_c b/particles/heroes/sakuya/ability_sakuya_ex_b.vpcf_c new file mode 100755 index 0000000..720dc7a Binary files /dev/null and b/particles/heroes/sakuya/ability_sakuya_ex_b.vpcf_c differ diff --git a/particles/heroes/sakuya/ability_sakuya_ex_stun.vpcf_c b/particles/heroes/sakuya/ability_sakuya_ex_stun.vpcf_c new file mode 100755 index 0000000..f893515 Binary files /dev/null and b/particles/heroes/sakuya/ability_sakuya_ex_stun.vpcf_c differ diff --git a/particles/heroes/sakuya/ability_sakuya_ex_stun_b.vpcf_c b/particles/heroes/sakuya/ability_sakuya_ex_stun_b.vpcf_c new file mode 100755 index 0000000..8740966 Binary files /dev/null and b/particles/heroes/sakuya/ability_sakuya_ex_stun_b.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01.vpcf_c b/particles/heroes/sanae/ability_sanae_01.vpcf_c new file mode 100755 index 0000000..f32ed9d Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_a.vpcf_c b/particles/heroes/sanae/ability_sanae_01_a.vpcf_c new file mode 100755 index 0000000..f7ad764 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_a.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_b.vpcf_c b/particles/heroes/sanae/ability_sanae_01_b.vpcf_c new file mode 100755 index 0000000..873adba Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_b.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_c.vpcf_c b/particles/heroes/sanae/ability_sanae_01_c.vpcf_c new file mode 100755 index 0000000..312ae7a Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_c.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_d.vpcf_c b/particles/heroes/sanae/ability_sanae_01_d.vpcf_c new file mode 100755 index 0000000..52b72f7 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_d.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_e.vpcf_c b/particles/heroes/sanae/ability_sanae_01_e.vpcf_c new file mode 100755 index 0000000..7adfe18 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_e.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_e0.vpcf_c b/particles/heroes/sanae/ability_sanae_01_e0.vpcf_c new file mode 100755 index 0000000..dc2c3df Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_e0.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_e1.vpcf_c b/particles/heroes/sanae/ability_sanae_01_e1.vpcf_c new file mode 100755 index 0000000..e428651 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_e1.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_e2.vpcf_c b/particles/heroes/sanae/ability_sanae_01_e2.vpcf_c new file mode 100755 index 0000000..d03e29e Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_e2.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_e3.vpcf_c b/particles/heroes/sanae/ability_sanae_01_e3.vpcf_c new file mode 100755 index 0000000..3ceaab2 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_e3.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_e4.vpcf_c b/particles/heroes/sanae/ability_sanae_01_e4.vpcf_c new file mode 100755 index 0000000..d2f1be7 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_e4.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_e5.vpcf_c b/particles/heroes/sanae/ability_sanae_01_e5.vpcf_c new file mode 100755 index 0000000..57f2b0b Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_e5.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_e6.vpcf_c b/particles/heroes/sanae/ability_sanae_01_e6.vpcf_c new file mode 100755 index 0000000..b367ff4 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_e6.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_e7.vpcf_c b/particles/heroes/sanae/ability_sanae_01_e7.vpcf_c new file mode 100755 index 0000000..e34956c Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_e7.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_effect.vpcf_c b/particles/heroes/sanae/ability_sanae_01_effect.vpcf_c new file mode 100755 index 0000000..e5aaa79 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_effect.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_effect_b.vpcf_c b/particles/heroes/sanae/ability_sanae_01_effect_b.vpcf_c new file mode 100755 index 0000000..36171dc Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_effect_b.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_effect_c.vpcf_c b/particles/heroes/sanae/ability_sanae_01_effect_c.vpcf_c new file mode 100755 index 0000000..69542a6 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_effect_c.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_f.vpcf_c b/particles/heroes/sanae/ability_sanae_01_f.vpcf_c new file mode 100755 index 0000000..a51c4d0 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_f.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_g.vpcf_c b/particles/heroes/sanae/ability_sanae_01_g.vpcf_c new file mode 100755 index 0000000..53f0746 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_g.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_g0.vpcf_c b/particles/heroes/sanae/ability_sanae_01_g0.vpcf_c new file mode 100755 index 0000000..b759ad6 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_g0.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_g1.vpcf_c b/particles/heroes/sanae/ability_sanae_01_g1.vpcf_c new file mode 100755 index 0000000..bd02a03 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_g1.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_g2.vpcf_c b/particles/heroes/sanae/ability_sanae_01_g2.vpcf_c new file mode 100755 index 0000000..a31525e Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_g2.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_h.vpcf_c b/particles/heroes/sanae/ability_sanae_01_h.vpcf_c new file mode 100755 index 0000000..a7eb673 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_h.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanae_01_i.vpcf_c b/particles/heroes/sanae/ability_sanae_01_i.vpcf_c new file mode 100755 index 0000000..41ca8b5 Binary files /dev/null and b/particles/heroes/sanae/ability_sanae_01_i.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanea_02_effect.vpcf_c b/particles/heroes/sanae/ability_sanea_02_effect.vpcf_c new file mode 100755 index 0000000..46dad66 Binary files /dev/null and b/particles/heroes/sanae/ability_sanea_02_effect.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanea_04_effect.vpcf_c b/particles/heroes/sanae/ability_sanea_04_effect.vpcf_c new file mode 100755 index 0000000..c932d0a Binary files /dev/null and b/particles/heroes/sanae/ability_sanea_04_effect.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanea_04_effect_b.vpcf_c b/particles/heroes/sanae/ability_sanea_04_effect_b.vpcf_c new file mode 100755 index 0000000..32eccbd Binary files /dev/null and b/particles/heroes/sanae/ability_sanea_04_effect_b.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanea_04_effect_c.vpcf_c b/particles/heroes/sanae/ability_sanea_04_effect_c.vpcf_c new file mode 100755 index 0000000..1fb271b Binary files /dev/null and b/particles/heroes/sanae/ability_sanea_04_effect_c.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanea_04_effect_d.vpcf_c b/particles/heroes/sanae/ability_sanea_04_effect_d.vpcf_c new file mode 100755 index 0000000..5e699eb Binary files /dev/null and b/particles/heroes/sanae/ability_sanea_04_effect_d.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanea_04_effect_e.vpcf_c b/particles/heroes/sanae/ability_sanea_04_effect_e.vpcf_c new file mode 100755 index 0000000..8133deb Binary files /dev/null and b/particles/heroes/sanae/ability_sanea_04_effect_e.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanea_04_effect_f.vpcf_c b/particles/heroes/sanae/ability_sanea_04_effect_f.vpcf_c new file mode 100755 index 0000000..afb075d Binary files /dev/null and b/particles/heroes/sanae/ability_sanea_04_effect_f.vpcf_c differ diff --git a/particles/heroes/sanae/ability_sanea_04_effect_g.vpcf_c b/particles/heroes/sanae/ability_sanea_04_effect_g.vpcf_c new file mode 100755 index 0000000..e5338ab Binary files /dev/null and b/particles/heroes/sanae/ability_sanea_04_effect_g.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_01.vpcf_c b/particles/heroes/satori/ability_satori_01.vpcf_c new file mode 100755 index 0000000..871c76d Binary files /dev/null and b/particles/heroes/satori/ability_satori_01.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_01_b.vpcf_c b/particles/heroes/satori/ability_satori_01_b.vpcf_c new file mode 100755 index 0000000..d3ac84d Binary files /dev/null and b/particles/heroes/satori/ability_satori_01_b.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead.vpcf_c b/particles/heroes/satori/ability_satori_overhead.vpcf_c new file mode 100755 index 0000000..0335802 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a.vpcf_c new file mode 100755 index 0000000..dceded7 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a0.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a0.vpcf_c new file mode 100755 index 0000000..d5175b5 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a0.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1.vpcf_c new file mode 100755 index 0000000..6a6251f Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1a.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1a.vpcf_c new file mode 100755 index 0000000..ff84390 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1a.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1a0.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1a0.vpcf_c new file mode 100755 index 0000000..e1d7b07 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1a0.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1a0a.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1a0a.vpcf_c new file mode 100755 index 0000000..7cfa3ca Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1a0a.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1b.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1b.vpcf_c new file mode 100755 index 0000000..a6edc23 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1b.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1b0.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1b0.vpcf_c new file mode 100755 index 0000000..3ec8038 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1b0.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1b0a.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1b0a.vpcf_c new file mode 100755 index 0000000..014d040 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1b0a.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1b0a0.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1b0a0.vpcf_c new file mode 100755 index 0000000..055e86c Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1b0a0.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1b0b.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1b0b.vpcf_c new file mode 100755 index 0000000..e8dd702 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1b0b.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1b0c.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1b0c.vpcf_c new file mode 100755 index 0000000..009572f Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1b0c.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1b0d.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1b0d.vpcf_c new file mode 100755 index 0000000..bf910ae Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1b0d.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1b0e.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1b0e.vpcf_c new file mode 100755 index 0000000..471c54e Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1b0e.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1b0f.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1b0f.vpcf_c new file mode 100755 index 0000000..3638175 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1b0f.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1b0g.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1b0g.vpcf_c new file mode 100755 index 0000000..e7a9ef3 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1b0g.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1b0g0.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1b0g0.vpcf_c new file mode 100755 index 0000000..6cb70c9 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1b0g0.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1b0h.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1b0h.vpcf_c new file mode 100755 index 0000000..ab36c3f Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1b0h.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_a1c.vpcf_c b/particles/heroes/satori/ability_satori_overhead_a1c.vpcf_c new file mode 100755 index 0000000..f71fb95 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_a1c.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_b.vpcf_c b/particles/heroes/satori/ability_satori_overhead_b.vpcf_c new file mode 100755 index 0000000..2300a1f Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_b.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_b0.vpcf_c b/particles/heroes/satori/ability_satori_overhead_b0.vpcf_c new file mode 100755 index 0000000..a12fa49 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_b0.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_b1.vpcf_c b/particles/heroes/satori/ability_satori_overhead_b1.vpcf_c new file mode 100755 index 0000000..fafd371 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_b1.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_c.vpcf_c b/particles/heroes/satori/ability_satori_overhead_c.vpcf_c new file mode 100755 index 0000000..b42aad9 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_c.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_c0.vpcf_c b/particles/heroes/satori/ability_satori_overhead_c0.vpcf_c new file mode 100755 index 0000000..1803d3a Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_c0.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_c1.vpcf_c b/particles/heroes/satori/ability_satori_overhead_c1.vpcf_c new file mode 100755 index 0000000..5c478c0 Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_c1.vpcf_c differ diff --git a/particles/heroes/satori/ability_satori_overhead_d.vpcf_c b/particles/heroes/satori/ability_satori_overhead_d.vpcf_c new file mode 100755 index 0000000..0dad6cc Binary files /dev/null and b/particles/heroes/satori/ability_satori_overhead_d.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_eirin_04_light.vpcf_c b/particles/heroes/shikieiki/ability_eirin_04_light.vpcf_c new file mode 100755 index 0000000..e7e34f6 Binary files /dev/null and b/particles/heroes/shikieiki/ability_eirin_04_light.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_eirin_04_light_a.vpcf_c b/particles/heroes/shikieiki/ability_eirin_04_light_a.vpcf_c new file mode 100755 index 0000000..695179a Binary files /dev/null and b/particles/heroes/shikieiki/ability_eirin_04_light_a.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_eirin_04_light_b.vpcf_c b/particles/heroes/shikieiki/ability_eirin_04_light_b.vpcf_c new file mode 100755 index 0000000..5365542 Binary files /dev/null and b/particles/heroes/shikieiki/ability_eirin_04_light_b.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_eirin_04_light_c.vpcf_c b/particles/heroes/shikieiki/ability_eirin_04_light_c.vpcf_c new file mode 100755 index 0000000..efffe24 Binary files /dev/null and b/particles/heroes/shikieiki/ability_eirin_04_light_c.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_eirin_04_light_d.vpcf_c b/particles/heroes/shikieiki/ability_eirin_04_light_d.vpcf_c new file mode 100755 index 0000000..ae0117b Binary files /dev/null and b/particles/heroes/shikieiki/ability_eirin_04_light_d.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_eirin_04_light_e.vpcf_c b/particles/heroes/shikieiki/ability_eirin_04_light_e.vpcf_c new file mode 100755 index 0000000..ace2cb7 Binary files /dev/null and b/particles/heroes/shikieiki/ability_eirin_04_light_e.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_eirin_04_light_f.vpcf_c b/particles/heroes/shikieiki/ability_eirin_04_light_f.vpcf_c new file mode 100755 index 0000000..da44449 Binary files /dev/null and b/particles/heroes/shikieiki/ability_eirin_04_light_f.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_01.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_01.vpcf_c new file mode 100755 index 0000000..3d41144 Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_01.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_01_a.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_01_a.vpcf_c new file mode 100755 index 0000000..58d5898 Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_01_a.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_01_b.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_01_b.vpcf_c new file mode 100755 index 0000000..982300c Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_01_b.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_01_guilty.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_01_guilty.vpcf_c new file mode 100755 index 0000000..d5eef2a Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_01_guilty.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_01_guilty_b.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_01_guilty_b.vpcf_c new file mode 100755 index 0000000..f11a34f Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_01_guilty_b.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_04.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_04.vpcf_c new file mode 100755 index 0000000..12056e9 Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_04.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_04_a.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_04_a.vpcf_c new file mode 100755 index 0000000..ab728ce Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_04_a.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_04_b.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_04_b.vpcf_c new file mode 100755 index 0000000..bd46b3c Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_04_b.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_04_c.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_04_c.vpcf_c new file mode 100755 index 0000000..7ef5f5d Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_04_c.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_04_d.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_04_d.vpcf_c new file mode 100755 index 0000000..d5f9ce4 Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_04_d.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_04_e.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_04_e.vpcf_c new file mode 100755 index 0000000..d8bb79e Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_04_e.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_04_f.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_04_f.vpcf_c new file mode 100755 index 0000000..314e930 Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_04_f.vpcf_c differ diff --git a/particles/heroes/shikieiki/ability_shikieiki_04_g.vpcf_c b/particles/heroes/shikieiki/ability_shikieiki_04_g.vpcf_c new file mode 100755 index 0000000..2355272 Binary files /dev/null and b/particles/heroes/shikieiki/ability_shikieiki_04_g.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser.vpcf_c new file mode 100755 index 0000000..53bb711 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_a.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_a.vpcf_c new file mode 100755 index 0000000..32af80c Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_a.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_b.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_b.vpcf_c new file mode 100755 index 0000000..418b8d1 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_b.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_c.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_c.vpcf_c new file mode 100755 index 0000000..0f52877 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_c.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_c0.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_c0.vpcf_c new file mode 100755 index 0000000..f60f353 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_c0.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_c1.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_c1.vpcf_c new file mode 100755 index 0000000..d7df6ab Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_c1.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_c2.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_c2.vpcf_c new file mode 100755 index 0000000..7afeac5 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_c2.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_c3.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_c3.vpcf_c new file mode 100755 index 0000000..77397d4 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_c3.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_c4.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_c4.vpcf_c new file mode 100755 index 0000000..63da53c Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_c4.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_c5.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_c5.vpcf_c new file mode 100755 index 0000000..39f3449 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_c5.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_c6.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_c6.vpcf_c new file mode 100755 index 0000000..6a19a53 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_c6.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_c7.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_c7.vpcf_c new file mode 100755 index 0000000..8744258 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_c7.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_c8.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_c8.vpcf_c new file mode 100755 index 0000000..f180a2b Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_c8.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_d.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_d.vpcf_c new file mode 100755 index 0000000..2d52dee Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_d.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_e.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_e.vpcf_c new file mode 100755 index 0000000..f03b0b6 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_e.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_f.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_f.vpcf_c new file mode 100755 index 0000000..4354576 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_f.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_g.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_g.vpcf_c new file mode 100755 index 0000000..d11a1be Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_g.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_h.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_h.vpcf_c new file mode 100755 index 0000000..b5d3f92 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_h.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_01_laser_i.vpcf_c b/particles/heroes/sunny/ability_sunny_01_laser_i.vpcf_c new file mode 100755 index 0000000..8b4d940 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_01_laser_i.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_02.vpcf_c b/particles/heroes/sunny/ability_sunny_02.vpcf_c new file mode 100755 index 0000000..102a045 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_02.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_02_a.vpcf_c b/particles/heroes/sunny/ability_sunny_02_a.vpcf_c new file mode 100755 index 0000000..c707631 Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_02_a.vpcf_c differ diff --git a/particles/heroes/sunny/ability_sunny_02_b.vpcf_c b/particles/heroes/sunny/ability_sunny_02_b.vpcf_c new file mode 100755 index 0000000..2a3e3ec Binary files /dev/null and b/particles/heroes/sunny/ability_sunny_02_b.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03.vpcf_c new file mode 100755 index 0000000..390faa3 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_a.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_a.vpcf_c new file mode 100755 index 0000000..1b49537 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_a.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_b.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_b.vpcf_c new file mode 100755 index 0000000..2bf01e9 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_b.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_c.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_c.vpcf_c new file mode 100755 index 0000000..f7be73d Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_c.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_d.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_d.vpcf_c new file mode 100755 index 0000000..ba5827e Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_d.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_e.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_e.vpcf_c new file mode 100755 index 0000000..0967f44 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_e.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_f.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_f.vpcf_c new file mode 100755 index 0000000..9eb38f6 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_f.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_g.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_g.vpcf_c new file mode 100755 index 0000000..b8ce8b6 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_g.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_g0.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_g0.vpcf_c new file mode 100755 index 0000000..5db3276 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_g0.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_g0a.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_g0a.vpcf_c new file mode 100755 index 0000000..8acbdd2 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_g0a.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_g0b.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_g0b.vpcf_c new file mode 100755 index 0000000..633c373 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_g0b.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_g0c.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_g0c.vpcf_c new file mode 100755 index 0000000..2c60da9 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_g0c.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_g0d.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_g0d.vpcf_c new file mode 100755 index 0000000..5f5dab5 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_g0d.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_g0e.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_g0e.vpcf_c new file mode 100755 index 0000000..d79f5f2 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_g0e.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_g0e0.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_g0e0.vpcf_c new file mode 100755 index 0000000..39f5499 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_g0e0.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_g0e0a.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_g0e0a.vpcf_c new file mode 100755 index 0000000..b38624d Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_g0e0a.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_g0e0a0.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_g0e0a0.vpcf_c new file mode 100755 index 0000000..ab9fdb1 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_g0e0a0.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_g0f.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_g0f.vpcf_c new file mode 100755 index 0000000..4bf05d7 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_g0f.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_g0g.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_g0g.vpcf_c new file mode 100755 index 0000000..52fc39e Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_g0g.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_h.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_h.vpcf_c new file mode 100755 index 0000000..e7184ea Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_h.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_i.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_i.vpcf_c new file mode 100755 index 0000000..66590dd Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_i.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_j.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_j.vpcf_c new file mode 100755 index 0000000..e23d1e2 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_j.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_k.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_k.vpcf_c new file mode 100755 index 0000000..7dccedd Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_k.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_l.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_l.vpcf_c new file mode 100755 index 0000000..d029ff3 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_l.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_m.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_m.vpcf_c new file mode 100755 index 0000000..8dcf628 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_m.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_shock.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_shock.vpcf_c new file mode 100755 index 0000000..2bf1cff Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_shock.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_shock_a.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_shock_a.vpcf_c new file mode 100755 index 0000000..0a700f7 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_shock_a.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_shock_b.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_shock_b.vpcf_c new file mode 100755 index 0000000..c940bd9 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_shock_b.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_shock_c.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_shock_c.vpcf_c new file mode 100755 index 0000000..e02b9e3 Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_shock_c.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_shock_d.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_shock_d.vpcf_c new file mode 100755 index 0000000..2fffa8f Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_shock_d.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_shock_e.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_shock_e.vpcf_c new file mode 100755 index 0000000..f7da1dd Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_shock_e.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_shock_f.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_shock_f.vpcf_c new file mode 100755 index 0000000..a2cc70b Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_shock_f.vpcf_c differ diff --git a/particles/heroes/tenshi/ability_tenshi_03_shock_g.vpcf_c b/particles/heroes/tenshi/ability_tenshi_03_shock_g.vpcf_c new file mode 100755 index 0000000..7c34abe Binary files /dev/null and b/particles/heroes/tenshi/ability_tenshi_03_shock_g.vpcf_c differ diff --git a/particles/heroes/thtd_aya/ability_aya_01.vpcf_c b/particles/heroes/thtd_aya/ability_aya_01.vpcf_c new file mode 100755 index 0000000..5413b0d Binary files /dev/null and b/particles/heroes/thtd_aya/ability_aya_01.vpcf_c differ diff --git a/particles/heroes/thtd_aya/ability_aya_01_a.vpcf_c b/particles/heroes/thtd_aya/ability_aya_01_a.vpcf_c new file mode 100755 index 0000000..35374f3 Binary files /dev/null and b/particles/heroes/thtd_aya/ability_aya_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_aya/ability_aya_01_news.vpcf_c b/particles/heroes/thtd_aya/ability_aya_01_news.vpcf_c new file mode 100755 index 0000000..59c4f1d Binary files /dev/null and b/particles/heroes/thtd_aya/ability_aya_01_news.vpcf_c differ diff --git a/particles/heroes/thtd_aya/ability_aya_01_news_a.vpcf_c b/particles/heroes/thtd_aya/ability_aya_01_news_a.vpcf_c new file mode 100755 index 0000000..ddbe691 Binary files /dev/null and b/particles/heroes/thtd_aya/ability_aya_01_news_a.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_item.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_item.vpcf_c new file mode 100755 index 0000000..fea9a93 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_item.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_item_a.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_item_a.vpcf_c new file mode 100755 index 0000000..202a755 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_item_a.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser.vpcf_c new file mode 100755 index 0000000..ce4135b Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_a.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_a.vpcf_c new file mode 100755 index 0000000..f57ddc5 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_a.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_b.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_b.vpcf_c new file mode 100755 index 0000000..f7f3160 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_b.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c.vpcf_c new file mode 100755 index 0000000..91b5772 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c0.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c0.vpcf_c new file mode 100755 index 0000000..6a14e55 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c0.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c1.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c1.vpcf_c new file mode 100755 index 0000000..4d8d69a Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c1.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c2.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c2.vpcf_c new file mode 100755 index 0000000..c32e313 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c2.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c3.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c3.vpcf_c new file mode 100755 index 0000000..3265cfd Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c3.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c4.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c4.vpcf_c new file mode 100755 index 0000000..d35c2e5 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c4.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c5.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c5.vpcf_c new file mode 100755 index 0000000..4de57a0 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c5.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c6.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c6.vpcf_c new file mode 100755 index 0000000..c8cf8e8 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c6.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c7.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c7.vpcf_c new file mode 100755 index 0000000..c239354 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c7.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c8.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c8.vpcf_c new file mode 100755 index 0000000..b4c8271 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_c8.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_d.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_d.vpcf_c new file mode 100755 index 0000000..eed23d4 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_d.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_e.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_e.vpcf_c new file mode 100755 index 0000000..1cc7368 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_e.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_f.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_f.vpcf_c new file mode 100755 index 0000000..f5b7275 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_f.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_g.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_g.vpcf_c new file mode 100755 index 0000000..ee8aa50 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_g.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_h.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_h.vpcf_c new file mode 100755 index 0000000..db094bd Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_h.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_i.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_i.vpcf_c new file mode 100755 index 0000000..9148c60 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_laser_i.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy.vpcf_c new file mode 100755 index 0000000..7b199b4 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_a.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_a.vpcf_c new file mode 100755 index 0000000..7fc38d4 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_a.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_b.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_b.vpcf_c new file mode 100755 index 0000000..fec2f0d Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_b.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_c.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_c.vpcf_c new file mode 100755 index 0000000..6e04117 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_c.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_d.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_d.vpcf_c new file mode 100755 index 0000000..a9a5d2d Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_d.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_e.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_e.vpcf_c new file mode 100755 index 0000000..8453934 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_e.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_f.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_f.vpcf_c new file mode 100755 index 0000000..1910fbf Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_f.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_f0.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_f0.vpcf_c new file mode 100755 index 0000000..dc220ce Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_f0.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_g.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_g.vpcf_c new file mode 100755 index 0000000..d8a4cf9 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_g.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_h.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_h.vpcf_c new file mode 100755 index 0000000..497b935 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_h.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_i.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_i.vpcf_c new file mode 100755 index 0000000..8024a49 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_i.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j.vpcf_c new file mode 100755 index 0000000..738f4aa Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j0.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j0.vpcf_c new file mode 100755 index 0000000..805df3a Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j0.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j1.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j1.vpcf_c new file mode 100755 index 0000000..8e14d3b Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j1.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j2.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j2.vpcf_c new file mode 100755 index 0000000..29746b4 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j2.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j3.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j3.vpcf_c new file mode 100755 index 0000000..8649baf Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_j3.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_k.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_k.vpcf_c new file mode 100755 index 0000000..fc0db1c Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_k.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_l.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_l.vpcf_c new file mode 100755 index 0000000..89027da Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_l.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_m.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_m.vpcf_c new file mode 100755 index 0000000..6e384ca Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_m.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_n.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_n.vpcf_c new file mode 100755 index 0000000..c277a8e Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_n.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_o.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_o.vpcf_c new file mode 100755 index 0000000..7e42c04 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_o.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_p.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_p.vpcf_c new file mode 100755 index 0000000..9726206 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_p.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_q.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_q.vpcf_c new file mode 100755 index 0000000..d880842 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_q.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_r.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_r.vpcf_c new file mode 100755 index 0000000..862f082 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_r.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_s.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_s.vpcf_c new file mode 100755 index 0000000..482fde7 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_s.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_t.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_t.vpcf_c new file mode 100755 index 0000000..584e710 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_t.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_u.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_u.vpcf_c new file mode 100755 index 0000000..1a5b288 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_u.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_v.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_v.vpcf_c new file mode 100755 index 0000000..eeb155e Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_v.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_w.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_w.vpcf_c new file mode 100755 index 0000000..01a0f5d Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_w.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_x.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_x.vpcf_c new file mode 100755 index 0000000..f5be7f2 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_x.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_y.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_y.vpcf_c new file mode 100755 index 0000000..a1293ea Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_y.vpcf_c differ diff --git a/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_z.vpcf_c b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_z.vpcf_c new file mode 100755 index 0000000..522fdf4 Binary files /dev/null and b/particles/heroes/thtd_byakuren/ability_byakuren_04_phy_z.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01.vpcf_c new file mode 100755 index 0000000..ad9a003 Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_a.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_a.vpcf_c new file mode 100755 index 0000000..5de545f Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_b.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_b.vpcf_c new file mode 100755 index 0000000..83d5b6c Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_b0.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_b0.vpcf_c new file mode 100755 index 0000000..cc4d734 Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_b0.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_c.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_c.vpcf_c new file mode 100755 index 0000000..174dcc2 Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_d.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_d.vpcf_c new file mode 100755 index 0000000..d38acde Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_e.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_e.vpcf_c new file mode 100755 index 0000000..60c31fb Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_e.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_e0.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_e0.vpcf_c new file mode 100755 index 0000000..9c28d5b Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_e0.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_f.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_f.vpcf_c new file mode 100755 index 0000000..ce216bb Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_f.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_g.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_g.vpcf_c new file mode 100755 index 0000000..1b9cdb3 Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_g.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_h.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_h.vpcf_c new file mode 100755 index 0000000..4d9e7ff Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_h.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_i.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_i.vpcf_c new file mode 100755 index 0000000..890a7b0 Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_i.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_j.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_j.vpcf_c new file mode 100755 index 0000000..d80837b Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_j.vpcf_c differ diff --git a/particles/heroes/thtd_chen/ability_chen_01_k.vpcf_c b/particles/heroes/thtd_chen/ability_chen_01_k.vpcf_c new file mode 100755 index 0000000..c9bf8bc Binary files /dev/null and b/particles/heroes/thtd_chen/ability_chen_01_k.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02.vpcf_c new file mode 100755 index 0000000..2eaa962 Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_a.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_a.vpcf_c new file mode 100755 index 0000000..c87dfc2 Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_a.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_a0.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_a0.vpcf_c new file mode 100755 index 0000000..80e87da Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_a0.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_a1.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_a1.vpcf_c new file mode 100755 index 0000000..e204e03 Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_a1.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_b.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_b.vpcf_c new file mode 100755 index 0000000..429d830 Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_b.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_b0.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_b0.vpcf_c new file mode 100755 index 0000000..5cd07f2 Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_b0.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_c.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_c.vpcf_c new file mode 100755 index 0000000..e39bff7 Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_c.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_c0.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_c0.vpcf_c new file mode 100755 index 0000000..c1be2bf Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_c0.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_c1.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_c1.vpcf_c new file mode 100755 index 0000000..fcc5556 Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_c1.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_c2.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_c2.vpcf_c new file mode 100755 index 0000000..c16aa2b Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_c2.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_explosion.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_explosion.vpcf_c new file mode 100755 index 0000000..f8c88b5 Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_explosion.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_explosion_a.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_explosion_a.vpcf_c new file mode 100755 index 0000000..3aa5ff9 Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_explosion_a.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_explosion_b.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_explosion_b.vpcf_c new file mode 100755 index 0000000..cb7fd93 Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_explosion_b.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_explosion_c.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_explosion_c.vpcf_c new file mode 100755 index 0000000..ef610ae Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_explosion_c.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_02_mist.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_02_mist.vpcf_c new file mode 100755 index 0000000..6a19633 Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_02_mist.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_04_circle.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_04_circle.vpcf_c new file mode 100755 index 0000000..f84d0e1 Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_04_circle.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_04_circle_a.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_04_circle_a.vpcf_c new file mode 100755 index 0000000..9e136fb Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_04_circle_a.vpcf_c differ diff --git a/particles/heroes/thtd_cirno/ability_cirno_04_circle_b.vpcf_c b/particles/heroes/thtd_cirno/ability_cirno_04_circle_b.vpcf_c new file mode 100755 index 0000000..e44f9ff Binary files /dev/null and b/particles/heroes/thtd_cirno/ability_cirno_04_circle_b.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01.vpcf_c new file mode 100755 index 0000000..4f7696c Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_a.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_a.vpcf_c new file mode 100755 index 0000000..99958f6 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_b.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_b.vpcf_c new file mode 100755 index 0000000..596ef0e Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_c.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_c.vpcf_c new file mode 100755 index 0000000..45a966d Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_c0.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_c0.vpcf_c new file mode 100755 index 0000000..0f1eaf4 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_c0.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_d.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_d.vpcf_c new file mode 100755 index 0000000..9485bbd Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_d0.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_d0.vpcf_c new file mode 100755 index 0000000..50ea4ab Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_d0.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_d1.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_d1.vpcf_c new file mode 100755 index 0000000..fe36df4 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_d1.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_e.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_e.vpcf_c new file mode 100755 index 0000000..247a77e Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_e.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_e0.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_e0.vpcf_c new file mode 100755 index 0000000..35fb361 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_e0.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_e0a.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_e0a.vpcf_c new file mode 100755 index 0000000..d7d6e95 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_e0a.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_e0a0.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_e0a0.vpcf_c new file mode 100755 index 0000000..44b176d Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_e0a0.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_e0a1.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_e0a1.vpcf_c new file mode 100755 index 0000000..0e99292 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_e0a1.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_e0b.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_e0b.vpcf_c new file mode 100755 index 0000000..162ec8a Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_e0b.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_e0c.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_e0c.vpcf_c new file mode 100755 index 0000000..fcb4ead Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_e0c.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_f.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_f.vpcf_c new file mode 100755 index 0000000..35ce91a Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_f.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_f0.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_f0.vpcf_c new file mode 100755 index 0000000..5caf424 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_f0.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_01_g.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_01_g.vpcf_c new file mode 100755 index 0000000..0e4146f Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_01_g.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03.vpcf_c new file mode 100755 index 0000000..3c72afb Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_a.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_a.vpcf_c new file mode 100755 index 0000000..8f3a579 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons.vpcf_c new file mode 100755 index 0000000..c0feb4f Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_a.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_a.vpcf_c new file mode 100755 index 0000000..0eea12e Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_a.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_b.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_b.vpcf_c new file mode 100755 index 0000000..6f53964 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_b.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_c.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_c.vpcf_c new file mode 100755 index 0000000..d7e292e Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_c.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_d.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_d.vpcf_c new file mode 100755 index 0000000..93ee652 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_d.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_e.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_e.vpcf_c new file mode 100755 index 0000000..ae6ec2b Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_e.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_f.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_f.vpcf_c new file mode 100755 index 0000000..dadb8dd Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_f.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_g.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_g.vpcf_c new file mode 100755 index 0000000..6c09fc4 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_g.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_h.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_h.vpcf_c new file mode 100755 index 0000000..37292b2 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_h.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_i.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_i.vpcf_c new file mode 100755 index 0000000..da8c092 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_i.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_j.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_j.vpcf_c new file mode 100755 index 0000000..cb228bd Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_j.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_k.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_k.vpcf_c new file mode 100755 index 0000000..e5ce82b Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_k.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_l.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_l.vpcf_c new file mode 100755 index 0000000..eed1677 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_l.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_m.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_m.vpcf_c new file mode 100755 index 0000000..f907888 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_m.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_n.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_n.vpcf_c new file mode 100755 index 0000000..fed0975 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_n.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_o.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_o.vpcf_c new file mode 100755 index 0000000..b00fe5a Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_o.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_p.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_p.vpcf_c new file mode 100755 index 0000000..38a5478 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_p.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_q.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_q.vpcf_c new file mode 100755 index 0000000..295aca3 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_q.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_r.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_r.vpcf_c new file mode 100755 index 0000000..e8446e6 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_r.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_s.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_s.vpcf_c new file mode 100755 index 0000000..ea18167 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_s.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_t.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_t.vpcf_c new file mode 100755 index 0000000..1d66df2 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_t.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_u.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_u.vpcf_c new file mode 100755 index 0000000..4120340 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_u.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_v.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_v.vpcf_c new file mode 100755 index 0000000..6799e88 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_v.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_w.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_w.vpcf_c new file mode 100755 index 0000000..8924485 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_w.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_x.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_x.vpcf_c new file mode 100755 index 0000000..afe9cc9 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_x.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_y.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_y.vpcf_c new file mode 100755 index 0000000..651247d Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_y.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_aeons_y0.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_y0.vpcf_c new file mode 100755 index 0000000..a46fdc6 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_aeons_y0.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_b.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_b.vpcf_c new file mode 100755 index 0000000..a5f77bb Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_b.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_c.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_c.vpcf_c new file mode 100755 index 0000000..af91162 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_c.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_d.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_d.vpcf_c new file mode 100755 index 0000000..acf7075 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_d.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_d0.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_d0.vpcf_c new file mode 100755 index 0000000..a48d63e Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_d0.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_d0a.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_d0a.vpcf_c new file mode 100755 index 0000000..00bbd55 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_d0a.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_d0a0.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_d0a0.vpcf_c new file mode 100755 index 0000000..83c6dce Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_d0a0.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_d0a1.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_d0a1.vpcf_c new file mode 100755 index 0000000..8a1b079 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_d0a1.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_d1.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_d1.vpcf_c new file mode 100755 index 0000000..6824ffe Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_d1.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_d1a.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_d1a.vpcf_c new file mode 100755 index 0000000..84dd753 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_d1a.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_e.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_e.vpcf_c new file mode 100755 index 0000000..adbd65f Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_e.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_03_f.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_03_f.vpcf_c new file mode 100755 index 0000000..304149d Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_03_f.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_04.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_04.vpcf_c new file mode 100755 index 0000000..7336029 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_04.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_04_a.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_04_a.vpcf_c new file mode 100755 index 0000000..84c99f6 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_04_a.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_04_b.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_04_b.vpcf_c new file mode 100755 index 0000000..24884de Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_04_b.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_04_c.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_04_c.vpcf_c new file mode 100755 index 0000000..d6213dd Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_04_c.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_04_red.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_04_red.vpcf_c new file mode 100755 index 0000000..5f7329f Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_04_red.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_04_red_a.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_04_red_a.vpcf_c new file mode 100755 index 0000000..31a4e85 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_04_red_a.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_04_red_b.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_04_red_b.vpcf_c new file mode 100755 index 0000000..bf20b98 Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_04_red_b.vpcf_c differ diff --git a/particles/heroes/thtd_eirin/ability_eirin_04_red_c.vpcf_c b/particles/heroes/thtd_eirin/ability_eirin_04_red_c.vpcf_c new file mode 100755 index 0000000..a0fda7d Binary files /dev/null and b/particles/heroes/thtd_eirin/ability_eirin_04_red_c.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion.vpcf_c new file mode 100755 index 0000000..d9adcfb Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_a.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_a.vpcf_c new file mode 100755 index 0000000..2cf3e05 Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_a.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_b.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_b.vpcf_c new file mode 100755 index 0000000..263b4ec Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_b.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_c.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_c.vpcf_c new file mode 100755 index 0000000..a47bdcb Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_c.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_d.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_d.vpcf_c new file mode 100755 index 0000000..2fd5fcf Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_d.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_e.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_e.vpcf_c new file mode 100755 index 0000000..d0d5c7c Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_e.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_f.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_f.vpcf_c new file mode 100755 index 0000000..8686e5b Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_f.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_g.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_g.vpcf_c new file mode 100755 index 0000000..311f011 Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_g.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_g0.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_g0.vpcf_c new file mode 100755 index 0000000..ed97842 Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_g0.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_h.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_h.vpcf_c new file mode 100755 index 0000000..428c4c2 Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_h.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_i.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_i.vpcf_c new file mode 100755 index 0000000..b5687e6 Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_i.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_j.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_j.vpcf_c new file mode 100755 index 0000000..cd65360 Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_j.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_k.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_k.vpcf_c new file mode 100755 index 0000000..597de3f Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_k.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_k0.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_k0.vpcf_c new file mode 100755 index 0000000..6a07502 Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_k0.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_l.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_l.vpcf_c new file mode 100755 index 0000000..43c1611 Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_l.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_light.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_light.vpcf_c new file mode 100755 index 0000000..37d27da Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_light.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_m.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_m.vpcf_c new file mode 100755 index 0000000..933384a Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_m.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_n.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_n.vpcf_c new file mode 100755 index 0000000..3eff2f3 Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_n.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_o.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_o.vpcf_c new file mode 100755 index 0000000..8e8b898 Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_o.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_p.vpcf_c b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_p.vpcf_c new file mode 100755 index 0000000..3c226f5 Binary files /dev/null and b/particles/heroes/thtd_flandre/abiilty_flandre_02_explosion_p.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_02_effect.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_02_effect.vpcf_c new file mode 100755 index 0000000..c7c052b Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_02_effect.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_02_effect_a.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_02_effect_a.vpcf_c new file mode 100755 index 0000000..0e83cca Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_02_effect_a.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_02_effect_fire.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_02_effect_fire.vpcf_c new file mode 100755 index 0000000..defd51e Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_02_effect_fire.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_02_effect_sword.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_02_effect_sword.vpcf_c new file mode 100755 index 0000000..f76bc82 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_02_effect_sword.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_02_fire.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_02_fire.vpcf_c new file mode 100755 index 0000000..02450e1 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_02_fire.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_02_fire_a.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_02_fire_a.vpcf_c new file mode 100755 index 0000000..6731fa4 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_02_fire_a.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_02_fire_b.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_02_fire_b.vpcf_c new file mode 100755 index 0000000..863b45b Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_02_fire_b.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_02_fire_c.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_02_fire_c.vpcf_c new file mode 100755 index 0000000..e9f90fc Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_02_fire_c.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_02_fire_d.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_02_fire_d.vpcf_c new file mode 100755 index 0000000..c01646d Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_02_fire_d.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_02_weapon.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_02_weapon.vpcf_c new file mode 100755 index 0000000..c5f5e85 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_02_weapon.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_02_weapon_a.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_02_weapon_a.vpcf_c new file mode 100755 index 0000000..9fb1bc1 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_02_weapon_a.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04.vpcf_c new file mode 100755 index 0000000..4f69fb0 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_a.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_a.vpcf_c new file mode 100755 index 0000000..7202ce8 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_a.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_b.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_b.vpcf_c new file mode 100755 index 0000000..4a5c1ae Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_b.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_b0.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_b0.vpcf_c new file mode 100755 index 0000000..ef0c438 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_b0.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_b1.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_b1.vpcf_c new file mode 100755 index 0000000..9bca458 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_b1.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_b2.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_b2.vpcf_c new file mode 100755 index 0000000..2b87b15 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_b2.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_c.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_c.vpcf_c new file mode 100755 index 0000000..a86d08f Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_c.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_d.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_d.vpcf_c new file mode 100755 index 0000000..db20ba7 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_d.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_explosion.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_explosion.vpcf_c new file mode 100755 index 0000000..e1e4552 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_explosion.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_explosion_a.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_explosion_a.vpcf_c new file mode 100755 index 0000000..0ab457d Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_explosion_a.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_start.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_start.vpcf_c new file mode 100755 index 0000000..4108921 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_start.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_start_a.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_start_a.vpcf_c new file mode 100755 index 0000000..2136af7 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_start_a.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_start_absorb.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_start_absorb.vpcf_c new file mode 100755 index 0000000..8d02617 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_start_absorb.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_start_absorb_a.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_start_absorb_a.vpcf_c new file mode 100755 index 0000000..d86473e Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_start_absorb_a.vpcf_c differ diff --git a/particles/heroes/thtd_flandre/ability_flandre_04_start_absorb_a0.vpcf_c b/particles/heroes/thtd_flandre/ability_flandre_04_start_absorb_a0.vpcf_c new file mode 100755 index 0000000..b208595 Binary files /dev/null and b/particles/heroes/thtd_flandre/ability_flandre_04_start_absorb_a0.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_01_projectile.vpcf_c b/particles/heroes/thtd_futo/ability_futo_01_projectile.vpcf_c new file mode 100755 index 0000000..c112ff2 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_01_projectile.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_01_projectile_a.vpcf_c b/particles/heroes/thtd_futo/ability_futo_01_projectile_a.vpcf_c new file mode 100755 index 0000000..ae607ef Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_01_projectile_a.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_01_projectile_b.vpcf_c b/particles/heroes/thtd_futo/ability_futo_01_projectile_b.vpcf_c new file mode 100755 index 0000000..76e0932 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_01_projectile_b.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_01_projectile_b0.vpcf_c b/particles/heroes/thtd_futo/ability_futo_01_projectile_b0.vpcf_c new file mode 100755 index 0000000..f8e1eba Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_01_projectile_b0.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack.vpcf_c new file mode 100755 index 0000000..84f9e6e Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_1.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_1.vpcf_c new file mode 100755 index 0000000..8bc8c14 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_1.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_2.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_2.vpcf_c new file mode 100755 index 0000000..c1343d9 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_2.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_3.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_3.vpcf_c new file mode 100755 index 0000000..063cc41 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_3.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_4.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_4.vpcf_c new file mode 100755 index 0000000..c2cd610 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_4.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_5.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_5.vpcf_c new file mode 100755 index 0000000..109463f Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_5.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_6.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_6.vpcf_c new file mode 100755 index 0000000..1192620 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_6.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_a.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_a.vpcf_c new file mode 100755 index 0000000..c5667a3 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_a.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_a0.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_a0.vpcf_c new file mode 100755 index 0000000..91254f9 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_a0.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_b.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_b.vpcf_c new file mode 100755 index 0000000..007caed Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_b.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_b0.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_b0.vpcf_c new file mode 100755 index 0000000..f24a217 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_b0.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_b1.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_b1.vpcf_c new file mode 100755 index 0000000..144fa5f Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_b1.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_b2.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_b2.vpcf_c new file mode 100755 index 0000000..57b05c4 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_b2.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_c.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_c.vpcf_c new file mode 100755 index 0000000..9f14b4d Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_c.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_futo_base_attack_d.vpcf_c b/particles/heroes/thtd_futo/ability_futo_base_attack_d.vpcf_c new file mode 100755 index 0000000..e125342 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_futo_base_attack_d.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_01_fire.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire.vpcf_c new file mode 100755 index 0000000..1e206f5 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_a.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_a.vpcf_c new file mode 100755 index 0000000..3903c51 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_a.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_b.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_b.vpcf_c new file mode 100755 index 0000000..0335c7f Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_b.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_c.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_c.vpcf_c new file mode 100755 index 0000000..9d83163 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_c.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_d.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_d.vpcf_c new file mode 100755 index 0000000..c0f08c4 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_d.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_e.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_e.vpcf_c new file mode 100755 index 0000000..ae754da Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_e.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_f.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_f.vpcf_c new file mode 100755 index 0000000..bad7e6c Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_f.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_g.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_g.vpcf_c new file mode 100755 index 0000000..6013ee6 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_g.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_h.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_h.vpcf_c new file mode 100755 index 0000000..4d4b468 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_01_fire_h.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_03.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_03.vpcf_c new file mode 100755 index 0000000..967f939 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_03.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_03_a.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_03_a.vpcf_c new file mode 100755 index 0000000..10d6828 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_03_b.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_03_b.vpcf_c new file mode 100755 index 0000000..2a04ab8 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_03_b.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_03_c.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_03_c.vpcf_c new file mode 100755 index 0000000..3b4798c Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_03_c.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_03_d.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_03_d.vpcf_c new file mode 100755 index 0000000..4e04c31 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_03_d.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_03_e.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_03_e.vpcf_c new file mode 100755 index 0000000..865a74f Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_03_e.vpcf_c differ diff --git a/particles/heroes/thtd_futo/ability_thtd_futo_03_e0.vpcf_c b/particles/heroes/thtd_futo/ability_thtd_futo_03_e0.vpcf_c new file mode 100755 index 0000000..85c4666 Binary files /dev/null and b/particles/heroes/thtd_futo/ability_thtd_futo_03_e0.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_01.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_01.vpcf_c new file mode 100755 index 0000000..baafcee Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_01.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_01_news.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_01_news.vpcf_c new file mode 100755 index 0000000..6912c72 Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_01_news.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_01_news_a.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_01_news_a.vpcf_c new file mode 100755 index 0000000..c1cfcde Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_01_news_a.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_02.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_02.vpcf_c new file mode 100755 index 0000000..0c851a8 Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_02.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_02_a.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_02_a.vpcf_c new file mode 100755 index 0000000..e5f97e8 Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_02_a.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_02_b.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_02_b.vpcf_c new file mode 100755 index 0000000..a5b8d32 Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_02_b.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_02_b0.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_02_b0.vpcf_c new file mode 100755 index 0000000..abe1021 Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_02_b0.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_02_b1.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_02_b1.vpcf_c new file mode 100755 index 0000000..8ce7987 Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_02_b1.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_02_b2.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_02_b2.vpcf_c new file mode 100755 index 0000000..7ec9a9d Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_02_b2.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_02_b3.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_02_b3.vpcf_c new file mode 100755 index 0000000..58bf8a7 Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_02_b3.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_02_b4.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_02_b4.vpcf_c new file mode 100755 index 0000000..eb32c20 Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_02_b4.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_02_b5.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_02_b5.vpcf_c new file mode 100755 index 0000000..fced539 Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_02_b5.vpcf_c differ diff --git a/particles/heroes/thtd_hatate/ability_hatate_02_b6.vpcf_c b/particles/heroes/thtd_hatate/ability_hatate_02_b6.vpcf_c new file mode 100755 index 0000000..af350c8 Binary files /dev/null and b/particles/heroes/thtd_hatate/ability_hatate_02_b6.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_01_earth.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_01_earth.vpcf_c new file mode 100755 index 0000000..e5d4555 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_01_earth.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_01_earth_a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_01_earth_a.vpcf_c new file mode 100755 index 0000000..74db846 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_01_earth_a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_01_moon.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_01_moon.vpcf_c new file mode 100755 index 0000000..4899f19 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_01_moon.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_01_moon_a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_01_moon_a.vpcf_c new file mode 100755 index 0000000..3509f4b Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_01_moon_a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_01_otherworld.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_01_otherworld.vpcf_c new file mode 100755 index 0000000..61f8627 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_01_otherworld.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_01_otherworld_a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_01_otherworld_a.vpcf_c new file mode 100755 index 0000000..a8302e7 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_01_otherworld_a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf_c new file mode 100755 index 0000000..a9c34cc Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_a.vpcf_c new file mode 100755 index 0000000..b88565b Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_b.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_b.vpcf_c new file mode 100755 index 0000000..ac70a47 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_b.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c.vpcf_c new file mode 100755 index 0000000..69268fb Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c0.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c0.vpcf_c new file mode 100755 index 0000000..cb5a354 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c0.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c1.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c1.vpcf_c new file mode 100755 index 0000000..fbbf8c6 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c1.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c2.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c2.vpcf_c new file mode 100755 index 0000000..422c1e7 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c2.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c3.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c3.vpcf_c new file mode 100755 index 0000000..6385bb7 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c3.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c4.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c4.vpcf_c new file mode 100755 index 0000000..53f2be7 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c4.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c5.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c5.vpcf_c new file mode 100755 index 0000000..58a4e8f Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c5.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c6.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c6.vpcf_c new file mode 100755 index 0000000..c7b979b Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c6.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c7.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c7.vpcf_c new file mode 100755 index 0000000..19507a4 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c7.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c8.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c8.vpcf_c new file mode 100755 index 0000000..7f4b166 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_c8.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_d.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_d.vpcf_c new file mode 100755 index 0000000..43a8c97 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_d.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_e.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_e.vpcf_c new file mode 100755 index 0000000..798c5ca Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_e.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_f.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_f.vpcf_c new file mode 100755 index 0000000..4239105 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_f.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_g.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_g.vpcf_c new file mode 100755 index 0000000..6926b76 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_g.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_h.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_h.vpcf_c new file mode 100755 index 0000000..c5a218b Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_h.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_i.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_i.vpcf_c new file mode 100755 index 0000000..f8337f0 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_laser_i.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle.vpcf_c new file mode 100755 index 0000000..5dbc095 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_a.vpcf_c new file mode 100755 index 0000000..3b21334 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_b.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_b.vpcf_c new file mode 100755 index 0000000..82b1607 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_b.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_c.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_c.vpcf_c new file mode 100755 index 0000000..229ddd5 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_c.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_d.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_d.vpcf_c new file mode 100755 index 0000000..a9c783d Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_d.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_e.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_e.vpcf_c new file mode 100755 index 0000000..7b8b9b6 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_e.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_f.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_f.vpcf_c new file mode 100755 index 0000000..0235bf1 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_f.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_g.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_g.vpcf_c new file mode 100755 index 0000000..2290fa5 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_04_triangle_g.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff.vpcf_c new file mode 100755 index 0000000..56cea86 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a.vpcf_c new file mode 100755 index 0000000..cbf7d8e Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a0.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a0.vpcf_c new file mode 100755 index 0000000..3e409d5 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a0.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1.vpcf_c new file mode 100755 index 0000000..9f41f17 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1a.vpcf_c new file mode 100755 index 0000000..af9300f Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1a0.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1a0.vpcf_c new file mode 100755 index 0000000..8bebb23 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1a0.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1a0a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1a0a.vpcf_c new file mode 100755 index 0000000..ea42d3f Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1a0a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b.vpcf_c new file mode 100755 index 0000000..e81054f Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0.vpcf_c new file mode 100755 index 0000000..62cb673 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0a.vpcf_c new file mode 100755 index 0000000..0b08efe Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0a0.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0a0.vpcf_c new file mode 100755 index 0000000..9d00fc1 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0a0.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0b.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0b.vpcf_c new file mode 100755 index 0000000..b39e529 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0b.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0c.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0c.vpcf_c new file mode 100755 index 0000000..4eb31cc Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0c.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0d.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0d.vpcf_c new file mode 100755 index 0000000..cc1f1b3 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0d.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0e.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0e.vpcf_c new file mode 100755 index 0000000..d6ea5c8 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0e.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0f.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0f.vpcf_c new file mode 100755 index 0000000..b7c9d72 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0f.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0g.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0g.vpcf_c new file mode 100755 index 0000000..af6a279 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0g.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0g0.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0g0.vpcf_c new file mode 100755 index 0000000..53751c0 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0g0.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0h.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0h.vpcf_c new file mode 100755 index 0000000..7ec9458 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1b0h.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1c.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1c.vpcf_c new file mode 100755 index 0000000..ac0fe06 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_a1c.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_b.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_b.vpcf_c new file mode 100755 index 0000000..20c8e12 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_b.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_b0.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_b0.vpcf_c new file mode 100755 index 0000000..16ff71b Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_b0.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_b1.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_b1.vpcf_c new file mode 100755 index 0000000..dc5cb93 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_b1.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_c.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_c.vpcf_c new file mode 100755 index 0000000..2b244ce Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_c.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_c0.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_c0.vpcf_c new file mode 100755 index 0000000..94c31f5 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_c0.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_c1.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_c1.vpcf_c new file mode 100755 index 0000000..125cebc Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_c1.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_d.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_d.vpcf_c new file mode 100755 index 0000000..2a7081f Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff_d.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_rain.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_rain.vpcf_c new file mode 100755 index 0000000..2e77a91 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_rain.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_rain_a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_rain_a.vpcf_c new file mode 100755 index 0000000..b190d95 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_rain_a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_rain_b.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_rain_b.vpcf_c new file mode 100755 index 0000000..62c3960 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_rain_b.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_earth_rain_c.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_earth_rain_c.vpcf_c new file mode 100755 index 0000000..2d6c1d3 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_earth_rain_c.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_hit.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_hit.vpcf_c new file mode 100755 index 0000000..fa609f2 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_hit.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex.vpcf_c new file mode 100755 index 0000000..60090eb Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_a.vpcf_c new file mode 100755 index 0000000..a679af0 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_b.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_b.vpcf_c new file mode 100755 index 0000000..8aa87a5 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_b.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c.vpcf_c new file mode 100755 index 0000000..fb9bb30 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c0.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c0.vpcf_c new file mode 100755 index 0000000..d086b15 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c0.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c1.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c1.vpcf_c new file mode 100755 index 0000000..521e755 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c1.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c2.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c2.vpcf_c new file mode 100755 index 0000000..2547be9 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c2.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c3.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c3.vpcf_c new file mode 100755 index 0000000..3b6cf70 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c3.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c4.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c4.vpcf_c new file mode 100755 index 0000000..7856d4d Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c4.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c5.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c5.vpcf_c new file mode 100755 index 0000000..058cb82 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c5.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c6.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c6.vpcf_c new file mode 100755 index 0000000..27edf77 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c6.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c7.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c7.vpcf_c new file mode 100755 index 0000000..17dd8c4 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c7.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c8.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c8.vpcf_c new file mode 100755 index 0000000..52f67c2 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_c8.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_d.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_d.vpcf_c new file mode 100755 index 0000000..83fd4ff Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_d.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_e.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_e.vpcf_c new file mode 100755 index 0000000..faaff7a Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_e.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_f.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_f.vpcf_c new file mode 100755 index 0000000..1627c07 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_f.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_g.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_g.vpcf_c new file mode 100755 index 0000000..b1be7c7 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_g.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_h.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_h.vpcf_c new file mode 100755 index 0000000..876301a Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_h.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_i.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_i.vpcf_c new file mode 100755 index 0000000..38d718e Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex_i.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_otherworld.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld.vpcf_c new file mode 100755 index 0000000..0ac617f Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_a.vpcf_c new file mode 100755 index 0000000..8ca9f32 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_b.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_b.vpcf_c new file mode 100755 index 0000000..857516e Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_b.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile.vpcf_c new file mode 100755 index 0000000..104690b Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile_a.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile_a.vpcf_c new file mode 100755 index 0000000..6291786 Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile_a.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile_b.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile_b.vpcf_c new file mode 100755 index 0000000..df323aa Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile_b.vpcf_c differ diff --git a/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile_b0.vpcf_c b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile_b0.vpcf_c new file mode 100755 index 0000000..b2ecb5a Binary files /dev/null and b/particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile_b0.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_01_buff.vpcf_c b/particles/heroes/thtd_junko/ability_junko_01_buff.vpcf_c new file mode 100755 index 0000000..e80204c Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_01_buff.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_01_buff_a.vpcf_c b/particles/heroes/thtd_junko/ability_junko_01_buff_a.vpcf_c new file mode 100755 index 0000000..9259edd Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_01_buff_a.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_01_buff_b.vpcf_c b/particles/heroes/thtd_junko/ability_junko_01_buff_b.vpcf_c new file mode 100755 index 0000000..11387df Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_01_buff_b.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_01_buff_b0.vpcf_c b/particles/heroes/thtd_junko/ability_junko_01_buff_b0.vpcf_c new file mode 100755 index 0000000..9e71537 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_01_buff_b0.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_01_buff_c.vpcf_c b/particles/heroes/thtd_junko/ability_junko_01_buff_c.vpcf_c new file mode 100755 index 0000000..d0473d4 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_01_buff_c.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_01_buff_d.vpcf_c b/particles/heroes/thtd_junko/ability_junko_01_buff_d.vpcf_c new file mode 100755 index 0000000..836de2c Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_01_buff_d.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_01_buff_e.vpcf_c b/particles/heroes/thtd_junko/ability_junko_01_buff_e.vpcf_c new file mode 100755 index 0000000..435a546 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_01_buff_e.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02.vpcf_c new file mode 100755 index 0000000..b356a1d Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_a.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_a.vpcf_c new file mode 100755 index 0000000..c175ba3 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_a.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_b.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_b.vpcf_c new file mode 100755 index 0000000..e8283da Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_b.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_c.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_c.vpcf_c new file mode 100755 index 0000000..634107b Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_c.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_d.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_d.vpcf_c new file mode 100755 index 0000000..8eb024b Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_d.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e.vpcf_c new file mode 100755 index 0000000..5799984 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e0.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e0.vpcf_c new file mode 100755 index 0000000..5c01ccc Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e0.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e1.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e1.vpcf_c new file mode 100755 index 0000000..08aca3c Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e1.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e10.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e10.vpcf_c new file mode 100755 index 0000000..e9c00a7 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e10.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e11.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e11.vpcf_c new file mode 100755 index 0000000..6d709b3 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e11.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e12.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e12.vpcf_c new file mode 100755 index 0000000..fa99739 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e12.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e13.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e13.vpcf_c new file mode 100755 index 0000000..a068945 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e13.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e14.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e14.vpcf_c new file mode 100755 index 0000000..aedaccc Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e14.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e15.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e15.vpcf_c new file mode 100755 index 0000000..29b9957 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e15.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e16.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e16.vpcf_c new file mode 100755 index 0000000..95d6a47 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e16.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e17.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e17.vpcf_c new file mode 100755 index 0000000..1b787ab Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e17.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e18.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e18.vpcf_c new file mode 100755 index 0000000..4748a1b Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e18.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e19.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e19.vpcf_c new file mode 100755 index 0000000..2b1ecca Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e19.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e2.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e2.vpcf_c new file mode 100755 index 0000000..ca078e8 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e2.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e3.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e3.vpcf_c new file mode 100755 index 0000000..99820d8 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e3.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e3a.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e3a.vpcf_c new file mode 100755 index 0000000..9bf2d6a Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e3a.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e3b.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e3b.vpcf_c new file mode 100755 index 0000000..d79e3fa Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e3b.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e3b0.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e3b0.vpcf_c new file mode 100755 index 0000000..5ce7467 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e3b0.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e3b1.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e3b1.vpcf_c new file mode 100755 index 0000000..3edfa4f Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e3b1.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e3b2.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e3b2.vpcf_c new file mode 100755 index 0000000..ae83b62 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e3b2.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e3b2a.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e3b2a.vpcf_c new file mode 100755 index 0000000..ba11792 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e3b2a.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e3b2b.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e3b2b.vpcf_c new file mode 100755 index 0000000..9b240ca Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e3b2b.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e3b3.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e3b3.vpcf_c new file mode 100755 index 0000000..6cc2f4b Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e3b3.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e3b4.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e3b4.vpcf_c new file mode 100755 index 0000000..4c12da4 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e3b4.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e3b5.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e3b5.vpcf_c new file mode 100755 index 0000000..2f5c29d Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e3b5.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e3b6.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e3b6.vpcf_c new file mode 100755 index 0000000..fb737b6 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e3b6.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e4.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e4.vpcf_c new file mode 100755 index 0000000..eb8c983 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e4.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e5.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e5.vpcf_c new file mode 100755 index 0000000..3521f5e Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e5.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e5a.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e5a.vpcf_c new file mode 100755 index 0000000..c04b69a Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e5a.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e6.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e6.vpcf_c new file mode 100755 index 0000000..1434550 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e6.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e7.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e7.vpcf_c new file mode 100755 index 0000000..804ccd4 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e7.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e8.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e8.vpcf_c new file mode 100755 index 0000000..6c93a27 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e8.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e8a.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e8a.vpcf_c new file mode 100755 index 0000000..a9d5e58 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e8a.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_02_e9.vpcf_c b/particles/heroes/thtd_junko/ability_junko_02_e9.vpcf_c new file mode 100755 index 0000000..ff9505b Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_02_e9.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03.vpcf_c new file mode 100755 index 0000000..95f8e9f Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_a.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_a.vpcf_c new file mode 100755 index 0000000..82d93ae Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_b.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_b.vpcf_c new file mode 100755 index 0000000..7474029 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_b.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_c.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_c.vpcf_c new file mode 100755 index 0000000..b40dbbe Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_c.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_d.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_d.vpcf_c new file mode 100755 index 0000000..c101dcd Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_d.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e.vpcf_c new file mode 100755 index 0000000..29769d2 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0.vpcf_c new file mode 100755 index 0000000..5ce2f0e Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0a.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0a.vpcf_c new file mode 100755 index 0000000..fc5fd89 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0a.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0b.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0b.vpcf_c new file mode 100755 index 0000000..ed7cf47 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0b.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0c.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0c.vpcf_c new file mode 100755 index 0000000..8c74470 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0c.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0d.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0d.vpcf_c new file mode 100755 index 0000000..dfd5357 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0d.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0e.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0e.vpcf_c new file mode 100755 index 0000000..f9da3b0 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0e.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0f.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0f.vpcf_c new file mode 100755 index 0000000..d93f3b3 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0f.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0g.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0g.vpcf_c new file mode 100755 index 0000000..ede10f4 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0g.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0h.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0h.vpcf_c new file mode 100755 index 0000000..9a13ca3 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0h.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0h0.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0h0.vpcf_c new file mode 100755 index 0000000..d832343 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0h0.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0h1.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0h1.vpcf_c new file mode 100755 index 0000000..9d7f705 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0h1.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0h2.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0h2.vpcf_c new file mode 100755 index 0000000..bdffde1 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0h2.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0h3.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0h3.vpcf_c new file mode 100755 index 0000000..33eea2a Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0h3.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0h3a.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0h3a.vpcf_c new file mode 100755 index 0000000..e7f2daf Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0h3a.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0i.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0i.vpcf_c new file mode 100755 index 0000000..e7dba37 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0i.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0i0.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0i0.vpcf_c new file mode 100755 index 0000000..20db544 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0i0.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0j.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0j.vpcf_c new file mode 100755 index 0000000..de6b2f5 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0j.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0k.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0k.vpcf_c new file mode 100755 index 0000000..2fcac49 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0k.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0l.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0l.vpcf_c new file mode 100755 index 0000000..28bcd06 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0l.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_03_e0l0.vpcf_c b/particles/heroes/thtd_junko/ability_junko_03_e0l0.vpcf_c new file mode 100755 index 0000000..d523800 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_03_e0l0.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04.vpcf_c new file mode 100755 index 0000000..6a1930f Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a.vpcf_c new file mode 100755 index 0000000..8aaaa76 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a0.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a0.vpcf_c new file mode 100755 index 0000000..b9300a7 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a0.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a1.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a1.vpcf_c new file mode 100755 index 0000000..f14d8c6 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a1.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a10.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a10.vpcf_c new file mode 100755 index 0000000..f741747 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a10.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a11.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a11.vpcf_c new file mode 100755 index 0000000..8db4bb2 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a11.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a12.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a12.vpcf_c new file mode 100755 index 0000000..6396406 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a12.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a13.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a13.vpcf_c new file mode 100755 index 0000000..218019f Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a13.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a13a.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a13a.vpcf_c new file mode 100755 index 0000000..4ca432c Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a13a.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a13b.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a13b.vpcf_c new file mode 100755 index 0000000..8b1a9f4 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a13b.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a13c.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a13c.vpcf_c new file mode 100755 index 0000000..bc7e9f7 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a13c.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a2.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a2.vpcf_c new file mode 100755 index 0000000..60f40da Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a2.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a3.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a3.vpcf_c new file mode 100755 index 0000000..0d11ce7 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a3.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a4.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a4.vpcf_c new file mode 100755 index 0000000..48ac40f Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a4.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a5.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a5.vpcf_c new file mode 100755 index 0000000..64b8460 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a5.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a6.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a6.vpcf_c new file mode 100755 index 0000000..0366e67 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a6.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a7.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a7.vpcf_c new file mode 100755 index 0000000..6aa6efe Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a7.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a8.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a8.vpcf_c new file mode 100755 index 0000000..559d83c Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a8.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_a9.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_a9.vpcf_c new file mode 100755 index 0000000..99a2fe7 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_a9.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_b.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_b.vpcf_c new file mode 100755 index 0000000..0993fb3 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_b.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_b0.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_b0.vpcf_c new file mode 100755 index 0000000..0d217c5 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_b0.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_b1.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_b1.vpcf_c new file mode 100755 index 0000000..70d82a7 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_b1.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_c.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_c.vpcf_c new file mode 100755 index 0000000..ec5a159 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_c.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_c0.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_c0.vpcf_c new file mode 100755 index 0000000..e25d5f2 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_c0.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_d.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_d.vpcf_c new file mode 100755 index 0000000..1575082 Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_d.vpcf_c differ diff --git a/particles/heroes/thtd_junko/ability_junko_04_debuff.vpcf_c b/particles/heroes/thtd_junko/ability_junko_04_debuff.vpcf_c new file mode 100755 index 0000000..003d1bc Binary files /dev/null and b/particles/heroes/thtd_junko/ability_junko_04_debuff.vpcf_c differ diff --git a/particles/heroes/thtd_kaguya/ability_kaguya_03_2_b.vpcf_c b/particles/heroes/thtd_kaguya/ability_kaguya_03_2_b.vpcf_c new file mode 100755 index 0000000..76e02d7 Binary files /dev/null and b/particles/heroes/thtd_kaguya/ability_kaguya_03_2_b.vpcf_c differ diff --git a/particles/heroes/thtd_kaguya/thtd_kaguya_03_1.vpcf_c b/particles/heroes/thtd_kaguya/thtd_kaguya_03_1.vpcf_c new file mode 100755 index 0000000..95fe00e Binary files /dev/null and b/particles/heroes/thtd_kaguya/thtd_kaguya_03_1.vpcf_c differ diff --git a/particles/heroes/thtd_kaguya/thtd_kaguya_03_1_a.vpcf_c b/particles/heroes/thtd_kaguya/thtd_kaguya_03_1_a.vpcf_c new file mode 100755 index 0000000..1e33ad0 Binary files /dev/null and b/particles/heroes/thtd_kaguya/thtd_kaguya_03_1_a.vpcf_c differ diff --git a/particles/heroes/thtd_kaguya/thtd_kaguya_03_2.vpcf_c b/particles/heroes/thtd_kaguya/thtd_kaguya_03_2.vpcf_c new file mode 100755 index 0000000..5783c7c Binary files /dev/null and b/particles/heroes/thtd_kaguya/thtd_kaguya_03_2.vpcf_c differ diff --git a/particles/heroes/thtd_kaguya/thtd_kaguya_03_2_a.vpcf_c b/particles/heroes/thtd_kaguya/thtd_kaguya_03_2_a.vpcf_c new file mode 100755 index 0000000..4862f9c Binary files /dev/null and b/particles/heroes/thtd_kaguya/thtd_kaguya_03_2_a.vpcf_c differ diff --git a/particles/heroes/thtd_kaguya/thtd_kaguya_03_3.vpcf_c b/particles/heroes/thtd_kaguya/thtd_kaguya_03_3.vpcf_c new file mode 100755 index 0000000..3b7152a Binary files /dev/null and b/particles/heroes/thtd_kaguya/thtd_kaguya_03_3.vpcf_c differ diff --git a/particles/heroes/thtd_kaguya/thtd_kaguya_03_3_a.vpcf_c b/particles/heroes/thtd_kaguya/thtd_kaguya_03_3_a.vpcf_c new file mode 100755 index 0000000..7148eed Binary files /dev/null and b/particles/heroes/thtd_kaguya/thtd_kaguya_03_3_a.vpcf_c differ diff --git a/particles/heroes/thtd_kaguya/thtd_kaguya_03_4.vpcf_c b/particles/heroes/thtd_kaguya/thtd_kaguya_03_4.vpcf_c new file mode 100755 index 0000000..f75e13e Binary files /dev/null and b/particles/heroes/thtd_kaguya/thtd_kaguya_03_4.vpcf_c differ diff --git a/particles/heroes/thtd_kaguya/thtd_kaguya_03_4_a.vpcf_c b/particles/heroes/thtd_kaguya/thtd_kaguya_03_4_a.vpcf_c new file mode 100755 index 0000000..8c96024 Binary files /dev/null and b/particles/heroes/thtd_kaguya/thtd_kaguya_03_4_a.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion.vpcf_c new file mode 100755 index 0000000..b70fc02 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_a.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_a.vpcf_c new file mode 100755 index 0000000..49b5faa Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_a.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_b.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_b.vpcf_c new file mode 100755 index 0000000..2721429 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_b.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_b0.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_b0.vpcf_c new file mode 100755 index 0000000..e6bee25 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_b0.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_c.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_c.vpcf_c new file mode 100755 index 0000000..6fa0e40 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_c.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_d.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_d.vpcf_c new file mode 100755 index 0000000..329ad70 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_d.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_e.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_e.vpcf_c new file mode 100755 index 0000000..5df612b Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_e.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_e0.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_e0.vpcf_c new file mode 100755 index 0000000..b73653d Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_e0.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_f.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_f.vpcf_c new file mode 100755 index 0000000..1a7f0e2 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_f.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_g.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_g.vpcf_c new file mode 100755 index 0000000..4608d95 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_g.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_h.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_h.vpcf_c new file mode 100755 index 0000000..2038b06 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_h.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_i.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_i.vpcf_c new file mode 100755 index 0000000..4cd86a5 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_i.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_j.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_j.vpcf_c new file mode 100755 index 0000000..27524c1 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_j.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_01_explosion_k.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_k.vpcf_c new file mode 100755 index 0000000..e8dce44 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_01_explosion_k.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03.vpcf_c new file mode 100755 index 0000000..0936372 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line.vpcf_c new file mode 100755 index 0000000..4b43dd0 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_a.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_a.vpcf_c new file mode 100755 index 0000000..b103a18 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_a.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_a0.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_a0.vpcf_c new file mode 100755 index 0000000..86f2bbb Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_a0.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_b.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_b.vpcf_c new file mode 100755 index 0000000..ad5a162 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_b.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_ball_light.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_ball_light.vpcf_c new file mode 100755 index 0000000..8dcbc3a Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_ball_light.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_c.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_c.vpcf_c new file mode 100755 index 0000000..02fec41 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_c.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_c0.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_c0.vpcf_c new file mode 100755 index 0000000..23a0bc5 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_c0.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_c1.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_c1.vpcf_c new file mode 100755 index 0000000..c189d16 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_c1.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_c1a.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_c1a.vpcf_c new file mode 100755 index 0000000..67a21bb Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_c1a.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_c2.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_c2.vpcf_c new file mode 100755 index 0000000..34bc08a Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_c2.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_c3.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_c3.vpcf_c new file mode 100755 index 0000000..7d7ae1d Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_c3.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_c4.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_c4.vpcf_c new file mode 100755 index 0000000..6402bf4 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_c4.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_d.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_d.vpcf_c new file mode 100755 index 0000000..7b30e61 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_d.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_e.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_e.vpcf_c new file mode 100755 index 0000000..02d831b Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_e.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_e0.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_e0.vpcf_c new file mode 100755 index 0000000..90bf838 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_e0.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_e1.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_e1.vpcf_c new file mode 100755 index 0000000..37490d6 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_e1.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_f.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_f.vpcf_c new file mode 100755 index 0000000..15c72f5 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_f.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_g.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_g.vpcf_c new file mode 100755 index 0000000..f41c8ad Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_g.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_h.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_h.vpcf_c new file mode 100755 index 0000000..5de26c8 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_h.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_h0.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_h0.vpcf_c new file mode 100755 index 0000000..3ce38a7 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_h0.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_h1.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_h1.vpcf_c new file mode 100755 index 0000000..49eb20b Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_h1.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_h2.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_h2.vpcf_c new file mode 100755 index 0000000..cb38a20 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_h2.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_h3.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_h3.vpcf_c new file mode 100755 index 0000000..deafd0e Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_h3.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_h4.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_h4.vpcf_c new file mode 100755 index 0000000..cbb0c2f Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_h4.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_h4a.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_h4a.vpcf_c new file mode 100755 index 0000000..f7cecdf Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_h4a.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_h4b.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_h4b.vpcf_c new file mode 100755 index 0000000..15a49db Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_h4b.vpcf_c differ diff --git a/particles/heroes/thtd_kanako/ability_kanako_03_line_i.vpcf_c b/particles/heroes/thtd_kanako/ability_kanako_03_line_i.vpcf_c new file mode 100755 index 0000000..e885aa4 Binary files /dev/null and b/particles/heroes/thtd_kanako/ability_kanako_03_line_i.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_buff.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_buff.vpcf_c new file mode 100755 index 0000000..8e53808 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_buff.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_buff_a.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_buff_a.vpcf_c new file mode 100755 index 0000000..8fce6b1 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_buff_a.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_buff_b.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_buff_b.vpcf_c new file mode 100755 index 0000000..4721c31 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_buff_b.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun.vpcf_c new file mode 100755 index 0000000..3c0f09f Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_a.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_a.vpcf_c new file mode 100755 index 0000000..5713c2c Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_a.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_b.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_b.vpcf_c new file mode 100755 index 0000000..a416921 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_b.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_b0.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_b0.vpcf_c new file mode 100755 index 0000000..e2feae1 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_b0.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_c.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_c.vpcf_c new file mode 100755 index 0000000..1d86c39 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_c.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_d.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_d.vpcf_c new file mode 100755 index 0000000..5879ec9 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_d.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_e.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_e.vpcf_c new file mode 100755 index 0000000..14efd6c Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_e.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_e0.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_e0.vpcf_c new file mode 100755 index 0000000..931f780 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_e0.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_f.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_f.vpcf_c new file mode 100755 index 0000000..df9f009 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_f.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_g.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_g.vpcf_c new file mode 100755 index 0000000..adf4d0d Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_g.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_h.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_h.vpcf_c new file mode 100755 index 0000000..f8782a2 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_h.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_i.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_i.vpcf_c new file mode 100755 index 0000000..fa0043a Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_i.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_j.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_j.vpcf_c new file mode 100755 index 0000000..30718fa Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_j.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_01_stun_k.vpcf_c b/particles/heroes/thtd_keine/ability_keine_01_stun_k.vpcf_c new file mode 100755 index 0000000..5e87035 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_01_stun_k.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03.vpcf_c new file mode 100755 index 0000000..14cb00b Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03_a.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03_a.vpcf_c new file mode 100755 index 0000000..3cf14a4 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03_b.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03_b.vpcf_c new file mode 100755 index 0000000..9cbb426 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03_b.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03_c.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03_c.vpcf_c new file mode 100755 index 0000000..bc4f5c5 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03_c.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03_d.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03_d.vpcf_c new file mode 100755 index 0000000..e9b11da Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03_d.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03_e.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03_e.vpcf_c new file mode 100755 index 0000000..d6b8efb Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03_e.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03_f.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03_f.vpcf_c new file mode 100755 index 0000000..a67db74 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03_f.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03_g.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03_g.vpcf_c new file mode 100755 index 0000000..c01c67c Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03_g.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03_h.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03_h.vpcf_c new file mode 100755 index 0000000..c4cb89d Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03_h.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03_i.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03_i.vpcf_c new file mode 100755 index 0000000..05df915 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03_i.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03_j.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03_j.vpcf_c new file mode 100755 index 0000000..3a7c672 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03_j.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03_k.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03_k.vpcf_c new file mode 100755 index 0000000..b402f88 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03_k.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_03_l.vpcf_c b/particles/heroes/thtd_keine/ability_keine_03_l.vpcf_c new file mode 100755 index 0000000..b14f539 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_03_l.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_mirror.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_mirror.vpcf_c new file mode 100755 index 0000000..2da7b5b Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_mirror.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_mirror_a.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_mirror_a.vpcf_c new file mode 100755 index 0000000..72f3aba Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_mirror_a.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_mirror_b.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_mirror_b.vpcf_c new file mode 100755 index 0000000..0450b02 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_mirror_b.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_mirror_b0.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_mirror_b0.vpcf_c new file mode 100755 index 0000000..7ec95dd Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_mirror_b0.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_mirror_c.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_mirror_c.vpcf_c new file mode 100755 index 0000000..935c949 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_mirror_c.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_sword.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_sword.vpcf_c new file mode 100755 index 0000000..294d0bc Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_sword.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_sword_a.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_sword_a.vpcf_c new file mode 100755 index 0000000..54c43c1 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_sword_a.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_sword_a0.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_sword_a0.vpcf_c new file mode 100755 index 0000000..5ae5a90 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_sword_a0.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_sword_b.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_sword_b.vpcf_c new file mode 100755 index 0000000..0a2b34a Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_sword_b.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_sword_b0.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_sword_b0.vpcf_c new file mode 100755 index 0000000..e52cbc2 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_sword_b0.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_sword_b1.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_sword_b1.vpcf_c new file mode 100755 index 0000000..94ea094 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_sword_b1.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_sword_b2.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_sword_b2.vpcf_c new file mode 100755 index 0000000..515d586 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_sword_b2.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_sword_c.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_sword_c.vpcf_c new file mode 100755 index 0000000..31f68f3 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_sword_c.vpcf_c differ diff --git a/particles/heroes/thtd_keine/ability_keine_04_sword_d.vpcf_c b/particles/heroes/thtd_keine/ability_keine_04_sword_d.vpcf_c new file mode 100755 index 0000000..fce5ad1 Binary files /dev/null and b/particles/heroes/thtd_keine/ability_keine_04_sword_d.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01.vpcf_c new file mode 100755 index 0000000..72f139d Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01_a.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01_a.vpcf_c new file mode 100755 index 0000000..1e538d6 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01_b.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01_b.vpcf_c new file mode 100755 index 0000000..a0e4c09 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01_c.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01_c.vpcf_c new file mode 100755 index 0000000..accbe72 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01_d.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01_d.vpcf_c new file mode 100755 index 0000000..301ad70 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01_e.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01_e.vpcf_c new file mode 100755 index 0000000..7cb00c3 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01_e.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01_f.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01_f.vpcf_c new file mode 100755 index 0000000..457bada Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01_f.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01_g.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01_g.vpcf_c new file mode 100755 index 0000000..0d640ae Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01_g.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01_h.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01_h.vpcf_c new file mode 100755 index 0000000..bbcf640 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01_h.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01_h0.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01_h0.vpcf_c new file mode 100755 index 0000000..dee4d24 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01_h0.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01_h0a.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01_h0a.vpcf_c new file mode 100755 index 0000000..fca905d Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01_h0a.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01_i.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01_i.vpcf_c new file mode 100755 index 0000000..ea113cf Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01_i.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_01_i0.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_01_i0.vpcf_c new file mode 100755 index 0000000..dd9b0bb Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_01_i0.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_01.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_01.vpcf_c new file mode 100755 index 0000000..4fad508 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_01.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_01_a.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_01_a.vpcf_c new file mode 100755 index 0000000..732bc59 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_02.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_02.vpcf_c new file mode 100755 index 0000000..c4c5d22 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_02.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_02_a.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_02_a.vpcf_c new file mode 100755 index 0000000..0458349 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_02_a.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_03.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_03.vpcf_c new file mode 100755 index 0000000..e25c299 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_03.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_03_a.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_03_a.vpcf_c new file mode 100755 index 0000000..0461600 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_04.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_04.vpcf_c new file mode 100755 index 0000000..5a18f8c Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_04.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_04_a.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_04_a.vpcf_c new file mode 100755 index 0000000..9a5a1c8 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_04_a.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_05.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_05.vpcf_c new file mode 100755 index 0000000..43f8d1e Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_05.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_05_a.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_05_a.vpcf_c new file mode 100755 index 0000000..d12eb8e Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_05_a.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_06.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_06.vpcf_c new file mode 100755 index 0000000..552fbf5 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_06.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_06_a.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_06_a.vpcf_c new file mode 100755 index 0000000..a2a96f3 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_06_a.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed.vpcf_c new file mode 100755 index 0000000..9afee91 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_a.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_a.vpcf_c new file mode 100755 index 0000000..0276a92 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_a.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_b.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_b.vpcf_c new file mode 100755 index 0000000..72533e9 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_b.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_c.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_c.vpcf_c new file mode 100755 index 0000000..b5a3612 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_c.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_d.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_d.vpcf_c new file mode 100755 index 0000000..995cf8f Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_d.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_e.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_e.vpcf_c new file mode 100755 index 0000000..7c8ca0b Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_e.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_f.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_f.vpcf_c new file mode 100755 index 0000000..e6340e5 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_f.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_g.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_g.vpcf_c new file mode 100755 index 0000000..577fc64 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_g.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_h.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_h.vpcf_c new file mode 100755 index 0000000..61122b0 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_h.vpcf_c differ diff --git a/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_i.vpcf_c b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_i.vpcf_c new file mode 100755 index 0000000..cb87d36 Binary files /dev/null and b/particles/heroes/thtd_koishi/ability_koishi_04_attack_landed_i.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01.vpcf_c new file mode 100755 index 0000000..bc4c5ee Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_a.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_a.vpcf_c new file mode 100755 index 0000000..c280fd5 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_b.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_b.vpcf_c new file mode 100755 index 0000000..08aaf7c Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_c.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_c.vpcf_c new file mode 100755 index 0000000..e05e8af Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_d.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_d.vpcf_c new file mode 100755 index 0000000..13afc4a Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_e.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_e.vpcf_c new file mode 100755 index 0000000..7a8a801 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_e.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_f.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_f.vpcf_c new file mode 100755 index 0000000..d844536 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_f.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_g.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_g.vpcf_c new file mode 100755 index 0000000..dbebc45 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_g.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_g0.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_g0.vpcf_c new file mode 100755 index 0000000..7ce6e13 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_g0.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_h.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_h.vpcf_c new file mode 100755 index 0000000..4b41281 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_h.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_i.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_i.vpcf_c new file mode 100755 index 0000000..7988711 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_i.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_j.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_j.vpcf_c new file mode 100755 index 0000000..f37b617 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_j.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_k.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_k.vpcf_c new file mode 100755 index 0000000..5c1b7b9 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_k.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_l.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_l.vpcf_c new file mode 100755 index 0000000..d5b4c8d Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_l.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_m.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_m.vpcf_c new file mode 100755 index 0000000..70cb721 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_m.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_n.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_n.vpcf_c new file mode 100755 index 0000000..c4f5fc7 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_n.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_01_o.vpcf_c b/particles/heroes/thtd_luna/ability_luna_01_o.vpcf_c new file mode 100755 index 0000000..82bae8d Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_01_o.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser.vpcf_c new file mode 100755 index 0000000..f5f0fbb Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_a.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_a.vpcf_c new file mode 100755 index 0000000..2699d6f Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_a.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_b.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_b.vpcf_c new file mode 100755 index 0000000..ad457ee Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_b.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_c.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_c.vpcf_c new file mode 100755 index 0000000..70f28fa Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_c.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_c0.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_c0.vpcf_c new file mode 100755 index 0000000..6ed6f0f Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_c0.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_c1.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_c1.vpcf_c new file mode 100755 index 0000000..da61d5c Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_c1.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_c2.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_c2.vpcf_c new file mode 100755 index 0000000..69a8ad9 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_c2.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_c3.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_c3.vpcf_c new file mode 100755 index 0000000..e821d26 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_c3.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_c4.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_c4.vpcf_c new file mode 100755 index 0000000..9ff9084 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_c4.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_c5.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_c5.vpcf_c new file mode 100755 index 0000000..b3eb7fc Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_c5.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_c6.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_c6.vpcf_c new file mode 100755 index 0000000..e5b96bb Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_c6.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_c7.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_c7.vpcf_c new file mode 100755 index 0000000..f4eff40 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_c7.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_c8.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_c8.vpcf_c new file mode 100755 index 0000000..fdf8e09 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_c8.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_d.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_d.vpcf_c new file mode 100755 index 0000000..d967022 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_d.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_e.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_e.vpcf_c new file mode 100755 index 0000000..15b5aa7 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_e.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_f.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_f.vpcf_c new file mode 100755 index 0000000..58f0cae Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_f.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_g.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_g.vpcf_c new file mode 100755 index 0000000..c731b55 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_g.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_h.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_h.vpcf_c new file mode 100755 index 0000000..cc66671 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_h.vpcf_c differ diff --git a/particles/heroes/thtd_luna/ability_luna_02_laser_i.vpcf_c b/particles/heroes/thtd_luna/ability_luna_02_laser_i.vpcf_c new file mode 100755 index 0000000..4688275 Binary files /dev/null and b/particles/heroes/thtd_luna/ability_luna_02_laser_i.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02.vpcf_c new file mode 100755 index 0000000..2af46ec Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_a.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_a.vpcf_c new file mode 100755 index 0000000..5a4faf2 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_a.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_a0.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_a0.vpcf_c new file mode 100755 index 0000000..3631f91 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_a0.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_a1.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_a1.vpcf_c new file mode 100755 index 0000000..3c5cebf Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_a1.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_b.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_b.vpcf_c new file mode 100755 index 0000000..f438a55 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_b.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_b0.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_b0.vpcf_c new file mode 100755 index 0000000..82f54f6 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_b0.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_blue.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_blue.vpcf_c new file mode 100755 index 0000000..20baf3d Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_blue.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_blue_a.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_blue_a.vpcf_c new file mode 100755 index 0000000..5ce6b59 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_blue_a.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_blue_a0.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_blue_a0.vpcf_c new file mode 100755 index 0000000..cf15009 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_blue_a0.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_blue_a1.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_blue_a1.vpcf_c new file mode 100755 index 0000000..e377a98 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_blue_a1.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_c.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_c.vpcf_c new file mode 100755 index 0000000..3b8cc74 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_c.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_c0.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_c0.vpcf_c new file mode 100755 index 0000000..e048bd0 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_c0.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_c1.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_c1.vpcf_c new file mode 100755 index 0000000..72888dc Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_c1.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_c2.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_c2.vpcf_c new file mode 100755 index 0000000..65bd3bf Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_c2.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_c3.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_c3.vpcf_c new file mode 100755 index 0000000..1b06a45 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_c3.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_c3a.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_c3a.vpcf_c new file mode 100755 index 0000000..462453c Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_c3a.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_c3b.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_c3b.vpcf_c new file mode 100755 index 0000000..e41a9b9 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_c3b.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_c3c.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_c3c.vpcf_c new file mode 100755 index 0000000..579eae0 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_c3c.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_d.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_d.vpcf_c new file mode 100755 index 0000000..8d00554 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_d.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_normal.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_normal.vpcf_c new file mode 100755 index 0000000..b5d23c5 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_normal.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_normal_a.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_normal_a.vpcf_c new file mode 100755 index 0000000..2289519 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_normal_a.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_normal_a0.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_normal_a0.vpcf_c new file mode 100755 index 0000000..526cab6 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_normal_a0.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_normal_a1.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_normal_a1.vpcf_c new file mode 100755 index 0000000..dd729df Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_normal_a1.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_pink.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_pink.vpcf_c new file mode 100755 index 0000000..f5cd000 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_pink.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_pink_a.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_pink_a.vpcf_c new file mode 100755 index 0000000..3da8b4b Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_pink_a.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_pink_a0.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_pink_a0.vpcf_c new file mode 100755 index 0000000..9e92982 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_pink_a0.vpcf_c differ diff --git a/particles/heroes/thtd_marisa/ability_marisa_02_pink_a1.vpcf_c b/particles/heroes/thtd_marisa/ability_marisa_02_pink_a1.vpcf_c new file mode 100755 index 0000000..33dba28 Binary files /dev/null and b/particles/heroes/thtd_marisa/ability_marisa_02_pink_a1.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_02.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_02.vpcf_c new file mode 100755 index 0000000..e8ef447 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_02.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_02_a.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_02_a.vpcf_c new file mode 100755 index 0000000..01a297b Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_02_a.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_02_b.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_02_b.vpcf_c new file mode 100755 index 0000000..3d81fdc Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_02_b.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_02_c.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_02_c.vpcf_c new file mode 100755 index 0000000..cdcf579 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_02_c.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_02_circle.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_02_circle.vpcf_c new file mode 100755 index 0000000..984381b Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_02_circle.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_02_circle_light.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_02_circle_light.vpcf_c new file mode 100755 index 0000000..c2c5fe0 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_02_circle_light.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_02_d.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_02_d.vpcf_c new file mode 100755 index 0000000..b58b552 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_02_d.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_02_e.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_02_e.vpcf_c new file mode 100755 index 0000000..89fb24e Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_02_e.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_02_f.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_02_f.vpcf_c new file mode 100755 index 0000000..c32be6a Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_02_f.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_02_g.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_02_g.vpcf_c new file mode 100755 index 0000000..503f7a2 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_02_g.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_02_h.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_02_h.vpcf_c new file mode 100755 index 0000000..0a22694 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_02_h.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_02_i.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_02_i.vpcf_c new file mode 100755 index 0000000..0297273 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_02_i.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_base_attack.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_base_attack.vpcf_c new file mode 100755 index 0000000..3c73c73 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_base_attack.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_base_attack_a.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a.vpcf_c new file mode 100755 index 0000000..5b2fc02 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0.vpcf_c new file mode 100755 index 0000000..c7a4d96 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0a.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0a.vpcf_c new file mode 100755 index 0000000..3c56edc Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0a.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0a0.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0a0.vpcf_c new file mode 100755 index 0000000..2758def Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0a0.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0b.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0b.vpcf_c new file mode 100755 index 0000000..e4e31e8 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0b.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0c.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0c.vpcf_c new file mode 100755 index 0000000..a0b029c Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0c.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0d.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0d.vpcf_c new file mode 100755 index 0000000..c08e010 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0d.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0e.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0e.vpcf_c new file mode 100755 index 0000000..a0d7c2b Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a0e.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_base_attack_a1.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a1.vpcf_c new file mode 100755 index 0000000..d85dba2 Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_base_attack_a1.vpcf_c differ diff --git a/particles/heroes/thtd_medicine/ability_medicine_base_attack_b.vpcf_c b/particles/heroes/thtd_medicine/ability_medicine_base_attack_b.vpcf_c new file mode 100755 index 0000000..44d44dc Binary files /dev/null and b/particles/heroes/thtd_medicine/ability_medicine_base_attack_b.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01.vpcf_c new file mode 100755 index 0000000..a535635 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_a.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_a.vpcf_c new file mode 100755 index 0000000..5410012 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_b.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_b.vpcf_c new file mode 100755 index 0000000..ee9d9b4 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_c.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_c.vpcf_c new file mode 100755 index 0000000..fdf79aa Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_d.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_d.vpcf_c new file mode 100755 index 0000000..37a6ba3 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_1.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_1.vpcf_c new file mode 100755 index 0000000..3786200 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_1.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_1_a.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_1_a.vpcf_c new file mode 100755 index 0000000..28ededd Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_1_a.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_1_b.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_1_b.vpcf_c new file mode 100755 index 0000000..b8dc2e9 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_1_b.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_1_c.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_1_c.vpcf_c new file mode 100755 index 0000000..2e10e72 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_1_c.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_2.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_2.vpcf_c new file mode 100755 index 0000000..6aa41dc Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_2.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_2_a.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_a.vpcf_c new file mode 100755 index 0000000..4e5ec37 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_a.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_2_b.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_b.vpcf_c new file mode 100755 index 0000000..eaeb68e Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_b.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_2_c.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_c.vpcf_c new file mode 100755 index 0000000..fc7363c Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_c.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_2_d.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_d.vpcf_c new file mode 100755 index 0000000..936cf6a Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_d.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_2_e.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_e.vpcf_c new file mode 100755 index 0000000..04686be Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_e.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_2_f.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_f.vpcf_c new file mode 100755 index 0000000..ddc4317 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_f.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_2_g.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_g.vpcf_c new file mode 100755 index 0000000..6b5118c Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_g.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_2_h.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_h.vpcf_c new file mode 100755 index 0000000..df188ec Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_h.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_2_h0.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_h0.vpcf_c new file mode 100755 index 0000000..3853d30 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_h0.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_2_i.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_i.vpcf_c new file mode 100755 index 0000000..f6baabd Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_2_i.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_3.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_3.vpcf_c new file mode 100755 index 0000000..5cd6336 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_3.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_3_a.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_a.vpcf_c new file mode 100755 index 0000000..c27a171 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_a.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_3_b.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_b.vpcf_c new file mode 100755 index 0000000..aaac4ae Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_b.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_3_c.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_c.vpcf_c new file mode 100755 index 0000000..d245967 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_c.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_3_d.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_d.vpcf_c new file mode 100755 index 0000000..d8b68c1 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_d.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_3_e.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_e.vpcf_c new file mode 100755 index 0000000..9dfb751 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_e.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_3_f.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_f.vpcf_c new file mode 100755 index 0000000..d77e2b1 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_f.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_3_g.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_g.vpcf_c new file mode 100755 index 0000000..67e1a6c Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_g.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_3_h.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_h.vpcf_c new file mode 100755 index 0000000..dd78cd6 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_h.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_3_i.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_i.vpcf_c new file mode 100755 index 0000000..c98487f Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_3_i.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4.vpcf_c new file mode 100755 index 0000000..efd81c6 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_a.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_a.vpcf_c new file mode 100755 index 0000000..94d9a55 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_a.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_b.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_b.vpcf_c new file mode 100755 index 0000000..d8f40c0 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_b.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_c.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_c.vpcf_c new file mode 100755 index 0000000..8e389b0 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_c.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_d.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_d.vpcf_c new file mode 100755 index 0000000..944e37e Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_d.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_e.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_e.vpcf_c new file mode 100755 index 0000000..8e92f4d Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_e.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_f.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_f.vpcf_c new file mode 100755 index 0000000..c88740d Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_f.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_g.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_g.vpcf_c new file mode 100755 index 0000000..0cbfb1d Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_g.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_h.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_h.vpcf_c new file mode 100755 index 0000000..606818f Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_h.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_i.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_i.vpcf_c new file mode 100755 index 0000000..18a7ccb Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_i.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_j.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_j.vpcf_c new file mode 100755 index 0000000..5391526 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_j.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_k.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_k.vpcf_c new file mode 100755 index 0000000..30d4e5f Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_k.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_l.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_l.vpcf_c new file mode 100755 index 0000000..214e193 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_l.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_m.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_m.vpcf_c new file mode 100755 index 0000000..cca203f Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_m.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n.vpcf_c new file mode 100755 index 0000000..5ba985c Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n0.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n0.vpcf_c new file mode 100755 index 0000000..68d7c47 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n0.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n1.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n1.vpcf_c new file mode 100755 index 0000000..53e551e Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n1.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n2.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n2.vpcf_c new file mode 100755 index 0000000..17b34e5 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n2.vpcf_c differ diff --git a/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n3.vpcf_c b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n3.vpcf_c new file mode 100755 index 0000000..d2c8c45 Binary files /dev/null and b/particles/heroes/thtd_meirin/ability_meirin_01_step_4_n3.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01.vpcf_c new file mode 100755 index 0000000..7bfd589 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01_a.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01_a.vpcf_c new file mode 100755 index 0000000..86794f6 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01_b.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01_b.vpcf_c new file mode 100755 index 0000000..00d1cb2 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01_c.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01_c.vpcf_c new file mode 100755 index 0000000..fe966ef Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01_d.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01_d.vpcf_c new file mode 100755 index 0000000..ffde389 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01_e.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01_e.vpcf_c new file mode 100755 index 0000000..ffd32c1 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01_e.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01_f.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01_f.vpcf_c new file mode 100755 index 0000000..b44e010 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01_f.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01_g.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01_g.vpcf_c new file mode 100755 index 0000000..2fac373 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01_g.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01_h.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01_h.vpcf_c new file mode 100755 index 0000000..a2dfb78 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01_h.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01_i.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01_i.vpcf_c new file mode 100755 index 0000000..a3a750b Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01_i.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01_j.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01_j.vpcf_c new file mode 100755 index 0000000..d1c21a2 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01_j.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01_k.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01_k.vpcf_c new file mode 100755 index 0000000..d16a5b5 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01_k.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_01_k0.vpcf_c b/particles/heroes/thtd_miko/ability_miko_01_k0.vpcf_c new file mode 100755 index 0000000..e3be670 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_01_k0.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_02_buff.vpcf_c b/particles/heroes/thtd_miko/ability_miko_02_buff.vpcf_c new file mode 100755 index 0000000..89d92a0 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_02_buff.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_02_buff_a.vpcf_c b/particles/heroes/thtd_miko/ability_miko_02_buff_a.vpcf_c new file mode 100755 index 0000000..e55dcd6 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_02_buff_a.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_03.vpcf_c b/particles/heroes/thtd_miko/ability_miko_03.vpcf_c new file mode 100755 index 0000000..9c0a10e Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_03.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_03_a.vpcf_c b/particles/heroes/thtd_miko/ability_miko_03_a.vpcf_c new file mode 100755 index 0000000..988d35b Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_03_a0.vpcf_c b/particles/heroes/thtd_miko/ability_miko_03_a0.vpcf_c new file mode 100755 index 0000000..8f756b1 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_03_a0.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_miko_03_a1.vpcf_c b/particles/heroes/thtd_miko/ability_miko_03_a1.vpcf_c new file mode 100755 index 0000000..cb8a01b Binary files /dev/null and b/particles/heroes/thtd_miko/ability_miko_03_a1.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall.vpcf_c new file mode 100755 index 0000000..a2ffcdf Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_a.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_a.vpcf_c new file mode 100755 index 0000000..5a46dfb Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_a.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_b.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_b.vpcf_c new file mode 100755 index 0000000..7e1e7ee Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_b.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_c.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_c.vpcf_c new file mode 100755 index 0000000..a7fad05 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_c.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_d.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_d.vpcf_c new file mode 100755 index 0000000..3a250cf Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_d.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_e.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_e.vpcf_c new file mode 100755 index 0000000..b50ea37 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_e.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_f.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_f.vpcf_c new file mode 100755 index 0000000..e7b5010 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_f.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_g.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_g.vpcf_c new file mode 100755 index 0000000..30ccf64 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_g.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_h.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_h.vpcf_c new file mode 100755 index 0000000..2aedaf4 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_h.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_i.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_i.vpcf_c new file mode 100755 index 0000000..2d8ec5d Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_i.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_j.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_j.vpcf_c new file mode 100755 index 0000000..149592b Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_j.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_k.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_k.vpcf_c new file mode 100755 index 0000000..f4b8918 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_k.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_l.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_l.vpcf_c new file mode 100755 index 0000000..9762b18 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_l.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_m.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_m.vpcf_c new file mode 100755 index 0000000..041395c Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_m.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_n.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_n.vpcf_c new file mode 100755 index 0000000..0cdf85e Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_n.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_o.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_o.vpcf_c new file mode 100755 index 0000000..9065102 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_o.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_p.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_p.vpcf_c new file mode 100755 index 0000000..8e87d0d Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_p.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_q.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_q.vpcf_c new file mode 100755 index 0000000..0f74563 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_q.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_r.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_r.vpcf_c new file mode 100755 index 0000000..783003f Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_starfall_r.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_start.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_start.vpcf_c new file mode 100755 index 0000000..048319d Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_start.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_start_a.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_start_a.vpcf_c new file mode 100755 index 0000000..cfecb60 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_start_a.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_start_b.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_start_b.vpcf_c new file mode 100755 index 0000000..97702e7 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_start_b.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_start_c.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_start_c.vpcf_c new file mode 100755 index 0000000..9b44d1c Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_start_c.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_start_d.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_start_d.vpcf_c new file mode 100755 index 0000000..54d01b8 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_start_d.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_start_e.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_start_e.vpcf_c new file mode 100755 index 0000000..a803999 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_start_e.vpcf_c differ diff --git a/particles/heroes/thtd_miko/ability_thtd_miko_04_start_f.vpcf_c b/particles/heroes/thtd_miko/ability_thtd_miko_04_start_f.vpcf_c new file mode 100755 index 0000000..2461543 Binary files /dev/null and b/particles/heroes/thtd_miko/ability_thtd_miko_04_start_f.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship.vpcf_c new file mode 100755 index 0000000..af2c16f Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_a.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_a.vpcf_c new file mode 100755 index 0000000..4a0ef8e Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_a.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_b.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_b.vpcf_c new file mode 100755 index 0000000..23c258e Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_b.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_c.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_c.vpcf_c new file mode 100755 index 0000000..0bbfdb5 Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_c.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_d.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_d.vpcf_c new file mode 100755 index 0000000..483a7a2 Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_d.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_e.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_e.vpcf_c new file mode 100755 index 0000000..3304a53 Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_e.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_e0.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_e0.vpcf_c new file mode 100755 index 0000000..07b0a46 Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_e0.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_f.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_f.vpcf_c new file mode 100755 index 0000000..6b57deb Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_f.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_f0.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_f0.vpcf_c new file mode 100755 index 0000000..f87c4ca Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_f0.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_f1.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_f1.vpcf_c new file mode 100755 index 0000000..60deffb Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_f1.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_f2.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_f2.vpcf_c new file mode 100755 index 0000000..5b6e8e9 Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_f2.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_g.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_g.vpcf_c new file mode 100755 index 0000000..5d2acf6 Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_g.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_h.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_h.vpcf_c new file mode 100755 index 0000000..ba1de6f Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_h.vpcf_c differ diff --git a/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_water.vpcf_c b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_water.vpcf_c new file mode 100755 index 0000000..0568320 Binary files /dev/null and b/particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_water.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02.vpcf_c new file mode 100755 index 0000000..9d280b4 Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02_a.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02_a.vpcf_c new file mode 100755 index 0000000..9874265 Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02_a.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02_b.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02_b.vpcf_c new file mode 100755 index 0000000..21a2d7b Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02_b.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02_c.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02_c.vpcf_c new file mode 100755 index 0000000..496b4ad Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02_c.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02_d.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02_d.vpcf_c new file mode 100755 index 0000000..a6ac21b Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02_d.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02_e.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02_e.vpcf_c new file mode 100755 index 0000000..72f3831 Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02_e.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02_f.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02_f.vpcf_c new file mode 100755 index 0000000..88d89dc Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02_f.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02_g.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02_g.vpcf_c new file mode 100755 index 0000000..08be405 Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02_g.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02_h.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02_h.vpcf_c new file mode 100755 index 0000000..5582a69 Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02_h.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02_i.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02_i.vpcf_c new file mode 100755 index 0000000..d97ca0b Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02_i.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02_j.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02_j.vpcf_c new file mode 100755 index 0000000..e140eec Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02_j.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02_shield.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02_shield.vpcf_c new file mode 100755 index 0000000..411d52f Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02_shield.vpcf_c differ diff --git a/particles/heroes/thtd_momiji/ability_momiji_02_shield_a.vpcf_c b/particles/heroes/thtd_momiji/ability_momiji_02_shield_a.vpcf_c new file mode 100755 index 0000000..13d7473 Binary files /dev/null and b/particles/heroes/thtd_momiji/ability_momiji_02_shield_a.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_circle.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_circle.vpcf_c new file mode 100755 index 0000000..b9f8f93 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_circle.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine.vpcf_c new file mode 100755 index 0000000..94fbe8f Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_a.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_a.vpcf_c new file mode 100755 index 0000000..cc64ebd Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_a.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_a0.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_a0.vpcf_c new file mode 100755 index 0000000..414ffe6 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_a0.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_a1.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_a1.vpcf_c new file mode 100755 index 0000000..0eb58f9 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_a1.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_b.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_b.vpcf_c new file mode 100755 index 0000000..269eee9 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_b.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_c.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_c.vpcf_c new file mode 100755 index 0000000..46d6011 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_c.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_circle.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_circle.vpcf_c new file mode 100755 index 0000000..a23884f Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_circle.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_d.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_d.vpcf_c new file mode 100755 index 0000000..f3b8c79 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_d.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_e.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_e.vpcf_c new file mode 100755 index 0000000..4b4f65a Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_e.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_e0.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_e0.vpcf_c new file mode 100755 index 0000000..53e8029 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_e0.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_f.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_f.vpcf_c new file mode 100755 index 0000000..0ced027 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_f.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_g.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_g.vpcf_c new file mode 100755 index 0000000..a6b234e Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_g.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_h.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_h.vpcf_c new file mode 100755 index 0000000..4ecd4d5 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_h.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_i.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_i.vpcf_c new file mode 100755 index 0000000..33f238b Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_i.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_j.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_j.vpcf_c new file mode 100755 index 0000000..f9f422f Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_j.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_k.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_k.vpcf_c new file mode 100755 index 0000000..0f1f034 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_k.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_l.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_l.vpcf_c new file mode 100755 index 0000000..922dc4a Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_l.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_m.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_m.vpcf_c new file mode 100755 index 0000000..a255454 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_m.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_n.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_n.vpcf_c new file mode 100755 index 0000000..6b4a318 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_n.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_o.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_o.vpcf_c new file mode 100755 index 0000000..204b4dc Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_o.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_p.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_p.vpcf_c new file mode 100755 index 0000000..dc2c662 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_p.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_q.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_q.vpcf_c new file mode 100755 index 0000000..35e0c60 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_q.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_r.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_r.vpcf_c new file mode 100755 index 0000000..faf80fc Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_r.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_s.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_s.vpcf_c new file mode 100755 index 0000000..8aa6810 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_s.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_t.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_t.vpcf_c new file mode 100755 index 0000000..8f75b29 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_t.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_u.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_u.vpcf_c new file mode 100755 index 0000000..a8f4261 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_u.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_v.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_v.vpcf_c new file mode 100755 index 0000000..b6dc798 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_v.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_w.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_w.vpcf_c new file mode 100755 index 0000000..a6ce3ba Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_w.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_x.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_x.vpcf_c new file mode 100755 index 0000000..e9d68e4 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine_x.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake.vpcf_c new file mode 100755 index 0000000..cd9d9d8 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_a.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_a.vpcf_c new file mode 100755 index 0000000..097e81d Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_a.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_b.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_b.vpcf_c new file mode 100755 index 0000000..76a51b1 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_b.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury.vpcf_c new file mode 100755 index 0000000..ac93831 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_a.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_a.vpcf_c new file mode 100755 index 0000000..f4f8059 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_a.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_b.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_b.vpcf_c new file mode 100755 index 0000000..b3e208b Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_b.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_c.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_c.vpcf_c new file mode 100755 index 0000000..242b9f9 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_c.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_d.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_d.vpcf_c new file mode 100755 index 0000000..bcb5069 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_d.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_d0.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_d0.vpcf_c new file mode 100755 index 0000000..1d041a5 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_d0.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_d1.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_d1.vpcf_c new file mode 100755 index 0000000..d37139f Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_d1.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_d2.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_d2.vpcf_c new file mode 100755 index 0000000..cee6877 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_d2.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_e.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_e.vpcf_c new file mode 100755 index 0000000..a8f1f67 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_e.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_f.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_f.vpcf_c new file mode 100755 index 0000000..6152124 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_f.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_g.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_g.vpcf_c new file mode 100755 index 0000000..ff3614b Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_g.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_h.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_h.vpcf_c new file mode 100755 index 0000000..5fd14b4 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_h.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_h0.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_h0.vpcf_c new file mode 100755 index 0000000..b11fa66 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_h0.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_i.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_i.vpcf_c new file mode 100755 index 0000000..67a26cd Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_i.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_i0.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_i0.vpcf_c new file mode 100755 index 0000000..7b832e7 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_i0.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_i1.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_i1.vpcf_c new file mode 100755 index 0000000..bf4ff66 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_i1.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_j.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_j.vpcf_c new file mode 100755 index 0000000..d92819e Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury_j.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_c.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_c.vpcf_c new file mode 100755 index 0000000..8fba346 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_c.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_d.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_d.vpcf_c new file mode 100755 index 0000000..5941eef Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_d.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_e.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_e.vpcf_c new file mode 100755 index 0000000..7871a2f Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_e.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_f.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_f.vpcf_c new file mode 100755 index 0000000..6fe6a36 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_f.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_g.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_g.vpcf_c new file mode 100755 index 0000000..3cd05b1 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_g.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_g0.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_g0.vpcf_c new file mode 100755 index 0000000..42d9f16 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_g0.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_h.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_h.vpcf_c new file mode 100755 index 0000000..0a71dab Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_h.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_i.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_i.vpcf_c new file mode 100755 index 0000000..6603ca4 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_i.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_j.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_j.vpcf_c new file mode 100755 index 0000000..f5d8683 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_j.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_k.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_k.vpcf_c new file mode 100755 index 0000000..9b05eb1 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_k.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison.vpcf_c new file mode 100755 index 0000000..fd89a89 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_a.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_a.vpcf_c new file mode 100755 index 0000000..fe91400 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_a.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_b.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_b.vpcf_c new file mode 100755 index 0000000..0708524 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_b.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_b0.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_b0.vpcf_c new file mode 100755 index 0000000..6a186a1 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_b0.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_c.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_c.vpcf_c new file mode 100755 index 0000000..65d274f Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_c.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_circle.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_circle.vpcf_c new file mode 100755 index 0000000..9b5512f Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_circle.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_d.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_d.vpcf_c new file mode 100755 index 0000000..23a8144 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_d.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_e.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_e.vpcf_c new file mode 100755 index 0000000..272114d Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_e.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_f.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_f.vpcf_c new file mode 100755 index 0000000..5e6334c Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_f.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_g.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_g.vpcf_c new file mode 100755 index 0000000..87fc1c1 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_g.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_h.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_h.vpcf_c new file mode 100755 index 0000000..a906135 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_h.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_h0.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_h0.vpcf_c new file mode 100755 index 0000000..5b41d35 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_h0.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_i.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_i.vpcf_c new file mode 100755 index 0000000..314200e Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_i.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_j.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_j.vpcf_c new file mode 100755 index 0000000..8be6b1b Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_j.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_k.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_k.vpcf_c new file mode 100755 index 0000000..54be338 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_k.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_l.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_l.vpcf_c new file mode 100755 index 0000000..60f7d53 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_l.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_light.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_light.vpcf_c new file mode 100755 index 0000000..3f64846 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_light.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_m.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_m.vpcf_c new file mode 100755 index 0000000..4545219 Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_m.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_n.vpcf_c b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_n.vpcf_c new file mode 100755 index 0000000..4317a2a Binary files /dev/null and b/particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison_n.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04.vpcf_c new file mode 100755 index 0000000..e156c8e Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_a.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_a.vpcf_c new file mode 100755 index 0000000..9507d4f Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_a.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_b.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_b.vpcf_c new file mode 100755 index 0000000..b8a1bec Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_b.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_c.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_c.vpcf_c new file mode 100755 index 0000000..656a91b Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_c.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_d.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_d.vpcf_c new file mode 100755 index 0000000..0812434 Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_d.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_e.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_e.vpcf_c new file mode 100755 index 0000000..63424f4 Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_e.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_f.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_f.vpcf_c new file mode 100755 index 0000000..edbfea3 Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_f.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_g.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_g.vpcf_c new file mode 100755 index 0000000..ed1f3d9 Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_g.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_h.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_h.vpcf_c new file mode 100755 index 0000000..fd72903 Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_h.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_i.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_i.vpcf_c new file mode 100755 index 0000000..223236a Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_i.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_j.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_j.vpcf_c new file mode 100755 index 0000000..fcc12da Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_j.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_k.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_k.vpcf_c new file mode 100755 index 0000000..a142e0e Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_k.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_k0.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_k0.vpcf_c new file mode 100755 index 0000000..ac99f60 Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_k0.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_l.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_l.vpcf_c new file mode 100755 index 0000000..1b2e517 Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_l.vpcf_c differ diff --git a/particles/heroes/thtd_patchouli_04/ability_patchouli_04_l0.vpcf_c b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_l0.vpcf_c new file mode 100755 index 0000000..da9c990 Binary files /dev/null and b/particles/heroes/thtd_patchouli_04/ability_patchouli_04_l0.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_01_end.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_01_end.vpcf_c new file mode 100755 index 0000000..db6d2df Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_01_end.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_01_end_a.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_01_end_a.vpcf_c new file mode 100755 index 0000000..472ea2f Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_01_end_a.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_01_light.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_01_light.vpcf_c new file mode 100755 index 0000000..bcc61e2 Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_01_light.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_01_projectile.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_01_projectile.vpcf_c new file mode 100755 index 0000000..dfe0abd Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_01_projectile.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_01_projectile_b.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_01_projectile_b.vpcf_c new file mode 100755 index 0000000..c1566a0 Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_01_projectile_b.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04.vpcf_c new file mode 100755 index 0000000..2e9e47e Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04_a.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04_a.vpcf_c new file mode 100755 index 0000000..f44cfeb Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04_a.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04_b.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04_b.vpcf_c new file mode 100755 index 0000000..fd6d0db Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04_b.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04_explosion.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04_explosion.vpcf_c new file mode 100755 index 0000000..d208404 Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04_explosion.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04_explosion_a.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_a.vpcf_c new file mode 100755 index 0000000..fb1cf20 Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_a.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04_explosion_b.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_b.vpcf_c new file mode 100755 index 0000000..3e9cb75 Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_b.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04_explosion_c.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_c.vpcf_c new file mode 100755 index 0000000..c795b13 Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_c.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04_explosion_c0.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_c0.vpcf_c new file mode 100755 index 0000000..56d75bb Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_c0.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04_explosion_c1.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_c1.vpcf_c new file mode 100755 index 0000000..142b318 Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_c1.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04_explosion_d.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_d.vpcf_c new file mode 100755 index 0000000..6879943 Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_d.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04_explosion_e.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_e.vpcf_c new file mode 100755 index 0000000..cff8e3b Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_e.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04_explosion_f.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_f.vpcf_c new file mode 100755 index 0000000..fbbb785 Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04_explosion_f.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_04_projectile.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_04_projectile.vpcf_c new file mode 100755 index 0000000..dec86b0 Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_04_projectile.vpcf_c differ diff --git a/particles/heroes/thtd_reimu/ability_reimu_base_attack.vpcf_c b/particles/heroes/thtd_reimu/ability_reimu_base_attack.vpcf_c new file mode 100755 index 0000000..0827d95 Binary files /dev/null and b/particles/heroes/thtd_reimu/ability_reimu_base_attack.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03.vpcf_c new file mode 100755 index 0000000..9f914f6 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_a.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_a.vpcf_c new file mode 100755 index 0000000..e42b5d9 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_b.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_b.vpcf_c new file mode 100755 index 0000000..f0640d5 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_b.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_c.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_c.vpcf_c new file mode 100755 index 0000000..7c36e30 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_c.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_c0.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_c0.vpcf_c new file mode 100755 index 0000000..f24329b Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_c0.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_c1.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_c1.vpcf_c new file mode 100755 index 0000000..318b3d4 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_c1.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_c2.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_c2.vpcf_c new file mode 100755 index 0000000..dc3a6ab Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_c2.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_c3.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_c3.vpcf_c new file mode 100755 index 0000000..b404b41 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_c3.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_c4.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_c4.vpcf_c new file mode 100755 index 0000000..73fae60 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_c4.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_c5.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_c5.vpcf_c new file mode 100755 index 0000000..29151cd Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_c5.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_c6.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_c6.vpcf_c new file mode 100755 index 0000000..34bd1be Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_c6.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_c7.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_c7.vpcf_c new file mode 100755 index 0000000..b574943 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_c7.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_c8.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_c8.vpcf_c new file mode 100755 index 0000000..6865494 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_c8.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_circle.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_circle.vpcf_c new file mode 100755 index 0000000..92d2237 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_circle.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_circle_a.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_circle_a.vpcf_c new file mode 100755 index 0000000..865ebb3 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_circle_a.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_d.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_d.vpcf_c new file mode 100755 index 0000000..7d83ade Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_d.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_e.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_e.vpcf_c new file mode 100755 index 0000000..22a87ea Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_e.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_explosion.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_explosion.vpcf_c new file mode 100755 index 0000000..8f64b08 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_explosion.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_explosion_a.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_a.vpcf_c new file mode 100755 index 0000000..4b8b2c4 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_a.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_explosion_b.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_b.vpcf_c new file mode 100755 index 0000000..7912902 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_b.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_explosion_c.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_c.vpcf_c new file mode 100755 index 0000000..fd891ab Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_c.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_explosion_d.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_d.vpcf_c new file mode 100755 index 0000000..0e6d460 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_d.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_explosion_e.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_e.vpcf_c new file mode 100755 index 0000000..b9ad263 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_e.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_explosion_f.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_f.vpcf_c new file mode 100755 index 0000000..42b4ca6 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_f.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_explosion_g.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_g.vpcf_c new file mode 100755 index 0000000..9b7f2ff Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_g.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_explosion_h.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_h.vpcf_c new file mode 100755 index 0000000..b00a4d8 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_explosion_h.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_f.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_f.vpcf_c new file mode 100755 index 0000000..4c861b8 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_f.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_g.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_g.vpcf_c new file mode 100755 index 0000000..599e358 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_g.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_h.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_h.vpcf_c new file mode 100755 index 0000000..460d9f2 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_h.vpcf_c differ diff --git a/particles/heroes/thtd_reisen/ability_reisen_03_i.vpcf_c b/particles/heroes/thtd_reisen/ability_reisen_03_i.vpcf_c new file mode 100755 index 0000000..b316df7 Binary files /dev/null and b/particles/heroes/thtd_reisen/ability_reisen_03_i.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect.vpcf_c new file mode 100755 index 0000000..9c1bd80 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_a.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_a.vpcf_c new file mode 100755 index 0000000..f0e2124 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_a.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_b.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_b.vpcf_c new file mode 100755 index 0000000..793ef26 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_b.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_c.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_c.vpcf_c new file mode 100755 index 0000000..289194f Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_c.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_d.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_d.vpcf_c new file mode 100755 index 0000000..6354ea6 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_d.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_d0.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_d0.vpcf_c new file mode 100755 index 0000000..84365ae Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_d0.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_e.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_e.vpcf_c new file mode 100755 index 0000000..1a5e8d9 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_e.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_f.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_f.vpcf_c new file mode 100755 index 0000000..eaad09a Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_f.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_f0.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_f0.vpcf_c new file mode 100755 index 0000000..1511f44 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_f0.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_g.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_g.vpcf_c new file mode 100755 index 0000000..a38f538 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_g.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_h.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_h.vpcf_c new file mode 100755 index 0000000..8dc06c8 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_h.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_i.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_i.vpcf_c new file mode 100755 index 0000000..2645497 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_i.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_i0.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_i0.vpcf_c new file mode 100755 index 0000000..5c4bca9 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_i0.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_j.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_j.vpcf_c new file mode 100755 index 0000000..9027c1b Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_j.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_k.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_k.vpcf_c new file mode 100755 index 0000000..f3f8c66 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_k.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_l.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_l.vpcf_c new file mode 100755 index 0000000..0fb094c Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_l.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_m.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_m.vpcf_c new file mode 100755 index 0000000..81c4ea4 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_m.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_n.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_n.vpcf_c new file mode 100755 index 0000000..93e2e8b Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_n.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_o.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_o.vpcf_c new file mode 100755 index 0000000..14b93c2 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_o.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_p.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_p.vpcf_c new file mode 100755 index 0000000..19e6afa Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_p.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_q.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_q.vpcf_c new file mode 100755 index 0000000..1103864 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_q.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_r.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_r.vpcf_c new file mode 100755 index 0000000..cb8d2ee Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_r.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_s.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_s.vpcf_c new file mode 100755 index 0000000..d8e4942 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_s.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_effect_t.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_effect_t.vpcf_c new file mode 100755 index 0000000..a8a2c65 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_effect_t.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_end.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_end.vpcf_c new file mode 100755 index 0000000..3005f08 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_end.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_end_a.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_end_a.vpcf_c new file mode 100755 index 0000000..c2a0fc9 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_end_a.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_end_b.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_end_b.vpcf_c new file mode 100755 index 0000000..d091102 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_end_b.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_end_c.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_end_c.vpcf_c new file mode 100755 index 0000000..6501511 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_end_c.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_end_c0.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_end_c0.vpcf_c new file mode 100755 index 0000000..4bc10ca Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_end_c0.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_end_c1.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_end_c1.vpcf_c new file mode 100755 index 0000000..de6475d Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_end_c1.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_end_d.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_end_d.vpcf_c new file mode 100755 index 0000000..0878faf Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_end_d.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_end_e.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_end_e.vpcf_c new file mode 100755 index 0000000..c8f568c Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_end_e.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_03_end_f.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_03_end_f.vpcf_c new file mode 100755 index 0000000..5601940 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_03_end_f.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_04_circle.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_04_circle.vpcf_c new file mode 100755 index 0000000..e640d21 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_04_circle.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_04_circle_a.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_04_circle_a.vpcf_c new file mode 100755 index 0000000..fe018da Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_04_circle_a.vpcf_c differ diff --git a/particles/heroes/thtd_remilia/ability_remilia_04_circle_c.vpcf_c b/particles/heroes/thtd_remilia/ability_remilia_04_circle_c.vpcf_c new file mode 100755 index 0000000..30e6ea2 Binary files /dev/null and b/particles/heroes/thtd_remilia/ability_remilia_04_circle_c.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_02_ex_projectile_tail.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_02_ex_projectile_tail.vpcf_c new file mode 100755 index 0000000..8e1c674 Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_02_ex_projectile_tail.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_03.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_03.vpcf_c new file mode 100755 index 0000000..fe7a99e Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_03.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_03_a.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_03_a.vpcf_c new file mode 100755 index 0000000..251bdf4 Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_03_b.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_03_b.vpcf_c new file mode 100755 index 0000000..ac2da13 Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_03_b.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04.vpcf_c new file mode 100755 index 0000000..23e7c99 Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_b.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_b.vpcf_c new file mode 100755 index 0000000..b35c775 Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_b.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_end.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_end.vpcf_c new file mode 100755 index 0000000..1cb56bf Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_end.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_end_a.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_end_a.vpcf_c new file mode 100755 index 0000000..563e286 Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_end_a.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_explosion.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_explosion.vpcf_c new file mode 100755 index 0000000..802dc9a Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_explosion.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_explosion_a.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_a.vpcf_c new file mode 100755 index 0000000..1a46ba9 Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_a.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_explosion_b.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_b.vpcf_c new file mode 100755 index 0000000..eebf3d0 Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_b.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_explosion_c.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_c.vpcf_c new file mode 100755 index 0000000..d76124e Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_c.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_explosion_c0.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_c0.vpcf_c new file mode 100755 index 0000000..a7fce97 Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_c0.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_explosion_c1.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_c1.vpcf_c new file mode 100755 index 0000000..6c459b3 Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_c1.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_explosion_d.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_d.vpcf_c new file mode 100755 index 0000000..365c929 Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_d.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_explosion_e.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_e.vpcf_c new file mode 100755 index 0000000..d80b91f Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_e.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_explosion_f.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_f.vpcf_c new file mode 100755 index 0000000..d7c1e31 Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_explosion_f.vpcf_c differ diff --git a/particles/heroes/thtd_rumia/ability_rumia_04_weapon.vpcf_c b/particles/heroes/thtd_rumia/ability_rumia_04_weapon.vpcf_c new file mode 100755 index 0000000..99d5d6a Binary files /dev/null and b/particles/heroes/thtd_rumia/ability_rumia_04_weapon.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02.vpcf_c new file mode 100755 index 0000000..de8e09b Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_a.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_a.vpcf_c new file mode 100755 index 0000000..d583aed Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_a.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_b.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_b.vpcf_c new file mode 100755 index 0000000..0417477 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_b.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_c.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_c.vpcf_c new file mode 100755 index 0000000..b70261b Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_c.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_d.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_d.vpcf_c new file mode 100755 index 0000000..c56dcf1 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_d.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_e.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_e.vpcf_c new file mode 100755 index 0000000..48fe9bf Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_e.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_f.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_f.vpcf_c new file mode 100755 index 0000000..c922609 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_f.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_g.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_g.vpcf_c new file mode 100755 index 0000000..e2ccf52 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_g.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_h.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_h.vpcf_c new file mode 100755 index 0000000..9f36e21 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_h.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_i.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_i.vpcf_c new file mode 100755 index 0000000..0a48253 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_i.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_j.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_j.vpcf_c new file mode 100755 index 0000000..95d9851 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_j.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_k.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_k.vpcf_c new file mode 100755 index 0000000..f8b14c4 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_k.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_l.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_l.vpcf_c new file mode 100755 index 0000000..3c4c674 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_l.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_m.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_m.vpcf_c new file mode 100755 index 0000000..8528261 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_m.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_n.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_n.vpcf_c new file mode 100755 index 0000000..0db8709 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_n.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_o.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_o.vpcf_c new file mode 100755 index 0000000..497c4cf Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_o.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_p.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_p.vpcf_c new file mode 100755 index 0000000..6649ac3 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_p.vpcf_c differ diff --git a/particles/heroes/thtd_sanae/ability_sanae_02_p_a.vpcf_c b/particles/heroes/thtd_sanae/ability_sanae_02_p_a.vpcf_c new file mode 100755 index 0000000..7aac2b1 Binary files /dev/null and b/particles/heroes/thtd_sanae/ability_sanae_02_p_a.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03.vpcf_c new file mode 100755 index 0000000..6c82a55 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_a.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_a.vpcf_c new file mode 100755 index 0000000..b2302dc Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_b.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_b.vpcf_c new file mode 100755 index 0000000..a4f2006 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_b.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_c.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_c.vpcf_c new file mode 100755 index 0000000..b9ecb47 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_c.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_d.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_d.vpcf_c new file mode 100755 index 0000000..dc771fe Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_d.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_d0.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_d0.vpcf_c new file mode 100755 index 0000000..044b599 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_d0.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_d1.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_d1.vpcf_c new file mode 100755 index 0000000..b6110e5 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_d1.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_e.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_e.vpcf_c new file mode 100755 index 0000000..fb66d1a Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_e.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_f.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_f.vpcf_c new file mode 100755 index 0000000..32c996e Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_f.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_g.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_g.vpcf_c new file mode 100755 index 0000000..dd0f02a Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_g.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_g0.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_g0.vpcf_c new file mode 100755 index 0000000..128321a Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_g0.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_g1.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_g1.vpcf_c new file mode 100755 index 0000000..16ab6f8 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_g1.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_g2.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_g2.vpcf_c new file mode 100755 index 0000000..a622139 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_g2.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_g3.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_g3.vpcf_c new file mode 100755 index 0000000..f63f35a Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_g3.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_g4.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_g4.vpcf_c new file mode 100755 index 0000000..1eb81e4 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_g4.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_h.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_h.vpcf_c new file mode 100755 index 0000000..b21e95c Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_h.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_h0.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_h0.vpcf_c new file mode 100755 index 0000000..824a0e7 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_h0.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_h0a.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_h0a.vpcf_c new file mode 100755 index 0000000..7d5abd0 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_h0a.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_h0b.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_h0b.vpcf_c new file mode 100755 index 0000000..64552a1 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_h0b.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_h0c.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_h0c.vpcf_c new file mode 100755 index 0000000..f83c205 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_h0c.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_h1.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_h1.vpcf_c new file mode 100755 index 0000000..5b16192 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_h1.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_h1a.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_h1a.vpcf_c new file mode 100755 index 0000000..10f1fd6 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_h1a.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_h1b.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_h1b.vpcf_c new file mode 100755 index 0000000..3194d7f Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_h1b.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_h1c.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_h1c.vpcf_c new file mode 100755 index 0000000..19065db Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_h1c.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_h1d.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_h1d.vpcf_c new file mode 100755 index 0000000..7e45840 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_h1d.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_h1e.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_h1e.vpcf_c new file mode 100755 index 0000000..0a0022c Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_h1e.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_h2.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_h2.vpcf_c new file mode 100755 index 0000000..3427a05 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_h2.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_i.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_i.vpcf_c new file mode 100755 index 0000000..ddfe2dc Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_i.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j.vpcf_c new file mode 100755 index 0000000..2e38ca8 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j0.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0.vpcf_c new file mode 100755 index 0000000..092fb0c Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a.vpcf_c new file mode 100755 index 0000000..e7f6959 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a0.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a0.vpcf_c new file mode 100755 index 0000000..a066b63 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a0.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a1.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a1.vpcf_c new file mode 100755 index 0000000..bea56b9 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a1.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a2.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a2.vpcf_c new file mode 100755 index 0000000..6b1d4a0 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a2.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a3.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a3.vpcf_c new file mode 100755 index 0000000..eddc55e Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0a3.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j0b.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0b.vpcf_c new file mode 100755 index 0000000..cc19cab Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0b.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j0c.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0c.vpcf_c new file mode 100755 index 0000000..3223c8b Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j0c.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1.vpcf_c new file mode 100755 index 0000000..71e5925 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1a.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1a.vpcf_c new file mode 100755 index 0000000..fe71a7d Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1a.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1b.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1b.vpcf_c new file mode 100755 index 0000000..9fad2c2 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1b.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1c.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1c.vpcf_c new file mode 100755 index 0000000..18e8f03 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1c.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1d.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1d.vpcf_c new file mode 100755 index 0000000..e8943dd Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1d.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e.vpcf_c new file mode 100755 index 0000000..da1fd5a Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0.vpcf_c new file mode 100755 index 0000000..b299365 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0a.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0a.vpcf_c new file mode 100755 index 0000000..725c2a8 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0a.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0b.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0b.vpcf_c new file mode 100755 index 0000000..2bd6acc Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0b.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0c.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0c.vpcf_c new file mode 100755 index 0000000..5a54d5e Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0c.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0d.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0d.vpcf_c new file mode 100755 index 0000000..a4ec35e Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0d.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0e.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0e.vpcf_c new file mode 100755 index 0000000..1090cec Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0e.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0e0.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0e0.vpcf_c new file mode 100755 index 0000000..4f3e093 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0e0.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0f.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0f.vpcf_c new file mode 100755 index 0000000..64dd9c0 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e0f.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e1.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e1.vpcf_c new file mode 100755 index 0000000..b6a799f Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e1.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e1a.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e1a.vpcf_c new file mode 100755 index 0000000..8e68cb7 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e1a.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e2.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e2.vpcf_c new file mode 100755 index 0000000..b031fc6 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e2.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e3.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e3.vpcf_c new file mode 100755 index 0000000..c8313c5 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e3.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e3a.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e3a.vpcf_c new file mode 100755 index 0000000..6834fc6 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e3a.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4.vpcf_c new file mode 100755 index 0000000..3f94404 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4a.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4a.vpcf_c new file mode 100755 index 0000000..9d162b4 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4a.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4b.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4b.vpcf_c new file mode 100755 index 0000000..31a37d9 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4b.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4b0.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4b0.vpcf_c new file mode 100755 index 0000000..06a11b5 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4b0.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4b0a.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4b0a.vpcf_c new file mode 100755 index 0000000..eea6cd7 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4b0a.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4b0b.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4b0b.vpcf_c new file mode 100755 index 0000000..e59079b Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e4b0b.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e5.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e5.vpcf_c new file mode 100755 index 0000000..1b91955 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1e5.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1f.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1f.vpcf_c new file mode 100755 index 0000000..bd1b6b6 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1f.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1g.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1g.vpcf_c new file mode 100755 index 0000000..301aa69 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1g.vpcf_c differ diff --git a/particles/heroes/thtd_sanae_03/ability_sanae_03_j1h.vpcf_c b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1h.vpcf_c new file mode 100755 index 0000000..a879a22 Binary files /dev/null and b/particles/heroes/thtd_sanae_03/ability_sanae_03_j1h.vpcf_c differ diff --git a/particles/heroes/thtd_seiga/ability_seiga_03.vpcf_c b/particles/heroes/thtd_seiga/ability_seiga_03.vpcf_c new file mode 100755 index 0000000..5dde497 Binary files /dev/null and b/particles/heroes/thtd_seiga/ability_seiga_03.vpcf_c differ diff --git a/particles/heroes/thtd_seiga/ability_seiga_03_a.vpcf_c b/particles/heroes/thtd_seiga/ability_seiga_03_a.vpcf_c new file mode 100755 index 0000000..7627cc5 Binary files /dev/null and b/particles/heroes/thtd_seiga/ability_seiga_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_seiga/ability_seiga_03_b.vpcf_c b/particles/heroes/thtd_seiga/ability_seiga_03_b.vpcf_c new file mode 100755 index 0000000..f9380f6 Binary files /dev/null and b/particles/heroes/thtd_seiga/ability_seiga_03_b.vpcf_c differ diff --git a/particles/heroes/thtd_seiga/ability_seiga_03_c.vpcf_c b/particles/heroes/thtd_seiga/ability_seiga_03_c.vpcf_c new file mode 100755 index 0000000..b252cd6 Binary files /dev/null and b/particles/heroes/thtd_seiga/ability_seiga_03_c.vpcf_c differ diff --git a/particles/heroes/thtd_seiga/ability_seiga_03_d.vpcf_c b/particles/heroes/thtd_seiga/ability_seiga_03_d.vpcf_c new file mode 100755 index 0000000..ddf4b8d Binary files /dev/null and b/particles/heroes/thtd_seiga/ability_seiga_03_d.vpcf_c differ diff --git a/particles/heroes/thtd_seiga/ability_seiga_03_e.vpcf_c b/particles/heroes/thtd_seiga/ability_seiga_03_e.vpcf_c new file mode 100755 index 0000000..0a7ccdc Binary files /dev/null and b/particles/heroes/thtd_seiga/ability_seiga_03_e.vpcf_c differ diff --git a/particles/heroes/thtd_seiga/ability_seiga_03_f.vpcf_c b/particles/heroes/thtd_seiga/ability_seiga_03_f.vpcf_c new file mode 100755 index 0000000..80c29bf Binary files /dev/null and b/particles/heroes/thtd_seiga/ability_seiga_03_f.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01.vpcf_c new file mode 100755 index 0000000..88f3c1d Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_a.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_a.vpcf_c new file mode 100755 index 0000000..b48861c Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_a0.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_a0.vpcf_c new file mode 100755 index 0000000..d86f3e3 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_a0.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_a0a.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_a0a.vpcf_c new file mode 100755 index 0000000..68d5b96 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_a0a.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_b.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_b.vpcf_c new file mode 100755 index 0000000..340b89a Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_b0.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_b0.vpcf_c new file mode 100755 index 0000000..860c330 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_b0.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_b0a.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_b0a.vpcf_c new file mode 100755 index 0000000..e996e34 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_b0a.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_b0b.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_b0b.vpcf_c new file mode 100755 index 0000000..47e6787 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_b0b.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_c.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_c.vpcf_c new file mode 100755 index 0000000..0c1db43 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_c0.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_c0.vpcf_c new file mode 100755 index 0000000..6a858d1 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_c0.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_c1.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_c1.vpcf_c new file mode 100755 index 0000000..f8745d8 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_c1.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_c2.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_c2.vpcf_c new file mode 100755 index 0000000..1deb2e2 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_c2.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_d.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_d.vpcf_c new file mode 100755 index 0000000..8d00228 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_d0.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_d0.vpcf_c new file mode 100755 index 0000000..061c909 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_d0.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_d0a.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_d0a.vpcf_c new file mode 100755 index 0000000..719a11d Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_d0a.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_e.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_e.vpcf_c new file mode 100755 index 0000000..d1350f6 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_e.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_e0.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_e0.vpcf_c new file mode 100755 index 0000000..85b5c23 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_e0.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_e1.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_e1.vpcf_c new file mode 100755 index 0000000..2d9a871 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_e1.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_e2.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_e2.vpcf_c new file mode 100755 index 0000000..a5f2034 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_e2.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_e3.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_e3.vpcf_c new file mode 100755 index 0000000..de91aad Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_e3.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_e4.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_e4.vpcf_c new file mode 100755 index 0000000..a40ff04 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_e4.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_e5.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_e5.vpcf_c new file mode 100755 index 0000000..21c127f Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_e5.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_e6.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_e6.vpcf_c new file mode 100755 index 0000000..260e3b4 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_e6.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_e6a.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_e6a.vpcf_c new file mode 100755 index 0000000..2d6c5b8 Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_e6a.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_e7.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_e7.vpcf_c new file mode 100755 index 0000000..131371c Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_e7.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_f.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_f.vpcf_c new file mode 100755 index 0000000..7db2f9b Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_f.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_g.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_g.vpcf_c new file mode 100755 index 0000000..7a14d2a Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_g.vpcf_c differ diff --git a/particles/heroes/thtd_shinki/ability_shinki_01_h.vpcf_c b/particles/heroes/thtd_shinki/ability_shinki_01_h.vpcf_c new file mode 100755 index 0000000..916fe3c Binary files /dev/null and b/particles/heroes/thtd_shinki/ability_shinki_01_h.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01.vpcf_c new file mode 100755 index 0000000..2a379df Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_a.vpcf_c new file mode 100755 index 0000000..13eff6b Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_b.vpcf_c new file mode 100755 index 0000000..81a8534 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_c.vpcf_c new file mode 100755 index 0000000..68551c0 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_d.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_d.vpcf_c new file mode 100755 index 0000000..d82589f Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_d0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_d0.vpcf_c new file mode 100755 index 0000000..fdfe474 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_d0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_d1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_d1.vpcf_c new file mode 100755 index 0000000..059e344 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_d1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_e.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_e.vpcf_c new file mode 100755 index 0000000..6674d36 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_e.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_f.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_f.vpcf_c new file mode 100755 index 0000000..4ae8110 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_f.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_g.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_g.vpcf_c new file mode 100755 index 0000000..28b6e56 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_g.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_g0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_g0.vpcf_c new file mode 100755 index 0000000..a99cb51 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_g0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_g1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_g1.vpcf_c new file mode 100755 index 0000000..0ed9aa9 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_g1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_g2.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_g2.vpcf_c new file mode 100755 index 0000000..ea783bd Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_g2.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_g3.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_g3.vpcf_c new file mode 100755 index 0000000..2ba823f Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_g3.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_g4.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_g4.vpcf_c new file mode 100755 index 0000000..0e08e28 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_g4.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_h.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_h.vpcf_c new file mode 100755 index 0000000..be4e04b Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_h.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_h0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_h0.vpcf_c new file mode 100755 index 0000000..f61f543 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_h0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_h0a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_h0a.vpcf_c new file mode 100755 index 0000000..4b9cb93 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_h0a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_h0b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_h0b.vpcf_c new file mode 100755 index 0000000..d152d97 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_h0b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_h0c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_h0c.vpcf_c new file mode 100755 index 0000000..99e0a33 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_h0c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_h1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_h1.vpcf_c new file mode 100755 index 0000000..7254833 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_h1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_h1a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_h1a.vpcf_c new file mode 100755 index 0000000..d205c49 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_h1a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_h1b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_h1b.vpcf_c new file mode 100755 index 0000000..260bd49 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_h1b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_h1c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_h1c.vpcf_c new file mode 100755 index 0000000..0e1612d Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_h1c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_h1d.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_h1d.vpcf_c new file mode 100755 index 0000000..3ccae7e Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_h1d.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_h1e.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_h1e.vpcf_c new file mode 100755 index 0000000..59304c8 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_h1e.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_h2.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_h2.vpcf_c new file mode 100755 index 0000000..39fe57d Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_h2.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_i.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_i.vpcf_c new file mode 100755 index 0000000..03420de Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_i.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j.vpcf_c new file mode 100755 index 0000000..2184c83 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j0.vpcf_c new file mode 100755 index 0000000..c00727f Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j0a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j0a.vpcf_c new file mode 100755 index 0000000..d5226d4 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j0a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j0a0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j0a0.vpcf_c new file mode 100755 index 0000000..2fff8aa Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j0a0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j0a1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j0a1.vpcf_c new file mode 100755 index 0000000..a86dba2 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j0a1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j0a2.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j0a2.vpcf_c new file mode 100755 index 0000000..b866699 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j0a2.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j0a3.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j0a3.vpcf_c new file mode 100755 index 0000000..1508502 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j0a3.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j0b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j0b.vpcf_c new file mode 100755 index 0000000..1f4e5c4 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j0b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j0c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j0c.vpcf_c new file mode 100755 index 0000000..ec9d105 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j0c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1.vpcf_c new file mode 100755 index 0000000..65b2a1f Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1a.vpcf_c new file mode 100755 index 0000000..9a234cd Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1b.vpcf_c new file mode 100755 index 0000000..405a73a Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1c.vpcf_c new file mode 100755 index 0000000..749cb2c Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1d.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1d.vpcf_c new file mode 100755 index 0000000..1a184c2 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1d.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e.vpcf_c new file mode 100755 index 0000000..f9f771e Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e0.vpcf_c new file mode 100755 index 0000000..a1a2a3b Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e0a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e0a.vpcf_c new file mode 100755 index 0000000..4eaf2f9 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e0a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e0b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e0b.vpcf_c new file mode 100755 index 0000000..a8bb5d6 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e0b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e0c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e0c.vpcf_c new file mode 100755 index 0000000..dd349af Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e0c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e0d.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e0d.vpcf_c new file mode 100755 index 0000000..4d7a3bf Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e0d.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e0e.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e0e.vpcf_c new file mode 100755 index 0000000..7189a8f Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e0e.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e0e0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e0e0.vpcf_c new file mode 100755 index 0000000..ba25f42 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e0e0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e0f.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e0f.vpcf_c new file mode 100755 index 0000000..20fe0ad Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e0f.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e1.vpcf_c new file mode 100755 index 0000000..8977258 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e1a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e1a.vpcf_c new file mode 100755 index 0000000..266d312 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e1a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e2.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e2.vpcf_c new file mode 100755 index 0000000..a8237aa Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e2.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e3.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e3.vpcf_c new file mode 100755 index 0000000..83aa94a Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e3.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e3a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e3a.vpcf_c new file mode 100755 index 0000000..3f24ca9 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e3a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e4.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e4.vpcf_c new file mode 100755 index 0000000..382dce4 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e4.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e4a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e4a.vpcf_c new file mode 100755 index 0000000..df3a677 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e4a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e4b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e4b.vpcf_c new file mode 100755 index 0000000..2f0b96c Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e4b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e4b0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e4b0.vpcf_c new file mode 100755 index 0000000..173b8f3 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e4b0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e4b0a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e4b0a.vpcf_c new file mode 100755 index 0000000..53ee4a5 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e4b0a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e4b0b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e4b0b.vpcf_c new file mode 100755 index 0000000..4d5330b Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e4b0b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1e5.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1e5.vpcf_c new file mode 100755 index 0000000..1146dd0 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1e5.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1f.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1f.vpcf_c new file mode 100755 index 0000000..8060fcf Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1f.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1g.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1g.vpcf_c new file mode 100755 index 0000000..1e67ad8 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1g.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_j1h.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_j1h.vpcf_c new file mode 100755 index 0000000..e39fb08 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_j1h.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k.vpcf_c new file mode 100755 index 0000000..1390e09 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k0.vpcf_c new file mode 100755 index 0000000..1cd88f2 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k1.vpcf_c new file mode 100755 index 0000000..70cd12b Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k2.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k2.vpcf_c new file mode 100755 index 0000000..39c1e7c Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k2.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k3.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k3.vpcf_c new file mode 100755 index 0000000..71235d4 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k3.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k4.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k4.vpcf_c new file mode 100755 index 0000000..8f77663 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k4.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k5.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k5.vpcf_c new file mode 100755 index 0000000..1b39c2c Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k5.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k6.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k6.vpcf_c new file mode 100755 index 0000000..56b5e64 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k6.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k7.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k7.vpcf_c new file mode 100755 index 0000000..95827a4 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k7.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8.vpcf_c new file mode 100755 index 0000000..eb111df Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8a.vpcf_c new file mode 100755 index 0000000..893a757 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8b.vpcf_c new file mode 100755 index 0000000..91ddc6f Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8b0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8b0.vpcf_c new file mode 100755 index 0000000..72d300e Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8b0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8b1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8b1.vpcf_c new file mode 100755 index 0000000..7306b60 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8b1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8c.vpcf_c new file mode 100755 index 0000000..54a9c01 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8d.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8d.vpcf_c new file mode 100755 index 0000000..1851d72 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8d.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8e.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8e.vpcf_c new file mode 100755 index 0000000..eb2947a Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8e.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8e0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8e0.vpcf_c new file mode 100755 index 0000000..bfa3928 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8e0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8e1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8e1.vpcf_c new file mode 100755 index 0000000..202e26c Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8e1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8f.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8f.vpcf_c new file mode 100755 index 0000000..e816cb8 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8f.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8g.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8g.vpcf_c new file mode 100755 index 0000000..4743d1c Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8g.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8g0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8g0.vpcf_c new file mode 100755 index 0000000..e363397 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8g0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8h.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8h.vpcf_c new file mode 100755 index 0000000..0a51463 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8h.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8i.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8i.vpcf_c new file mode 100755 index 0000000..155da4a Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8i.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8j.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8j.vpcf_c new file mode 100755 index 0000000..03b1a24 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8j.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8k.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8k.vpcf_c new file mode 100755 index 0000000..b3e70c5 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8k.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8l.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8l.vpcf_c new file mode 100755 index 0000000..02caed6 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8l.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8m.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8m.vpcf_c new file mode 100755 index 0000000..f045475 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8m.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8n.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8n.vpcf_c new file mode 100755 index 0000000..490d3dc Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8n.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_01_k8o.vpcf_c b/particles/heroes/thtd_soga/ability_soga_01_k8o.vpcf_c new file mode 100755 index 0000000..ec3b9cb Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_01_k8o.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02.vpcf_c new file mode 100755 index 0000000..60f92a8 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_a.vpcf_c new file mode 100755 index 0000000..c5b9ad6 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_b.vpcf_c new file mode 100755 index 0000000..e637230 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_c.vpcf_c new file mode 100755 index 0000000..9370136 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_d.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_d.vpcf_c new file mode 100755 index 0000000..73870af Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_d.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_d0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_d0.vpcf_c new file mode 100755 index 0000000..4c6ab67 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_d0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_d1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_d1.vpcf_c new file mode 100755 index 0000000..acdd809 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_d1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_e.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_e.vpcf_c new file mode 100755 index 0000000..4a54e72 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_e.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_f.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_f.vpcf_c new file mode 100755 index 0000000..8c4792f Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_f.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_g.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_g.vpcf_c new file mode 100755 index 0000000..8edb017 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_g.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_g0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_g0.vpcf_c new file mode 100755 index 0000000..f4b7297 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_g0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_g1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_g1.vpcf_c new file mode 100755 index 0000000..6dfaeaa Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_g1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_g2.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_g2.vpcf_c new file mode 100755 index 0000000..13ea000 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_g2.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_g3.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_g3.vpcf_c new file mode 100755 index 0000000..10c9687 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_g3.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_g4.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_g4.vpcf_c new file mode 100755 index 0000000..6469fad Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_g4.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_h.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_h.vpcf_c new file mode 100755 index 0000000..4b6a08e Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_h.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_h0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_h0.vpcf_c new file mode 100755 index 0000000..309f11d Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_h0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_h0a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_h0a.vpcf_c new file mode 100755 index 0000000..8bd38f3 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_h0a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_h0b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_h0b.vpcf_c new file mode 100755 index 0000000..12f04e9 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_h0b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_h0c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_h0c.vpcf_c new file mode 100755 index 0000000..23356ca Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_h0c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_h1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_h1.vpcf_c new file mode 100755 index 0000000..ec4681b Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_h1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_h1a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_h1a.vpcf_c new file mode 100755 index 0000000..d412c04 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_h1a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_h1b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_h1b.vpcf_c new file mode 100755 index 0000000..dcf2777 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_h1b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_h1c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_h1c.vpcf_c new file mode 100755 index 0000000..98c16fc Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_h1c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_h1d.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_h1d.vpcf_c new file mode 100755 index 0000000..a9e8b14 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_h1d.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_h1e.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_h1e.vpcf_c new file mode 100755 index 0000000..63c51b3 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_h1e.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_h2.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_h2.vpcf_c new file mode 100755 index 0000000..6a4423d Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_h2.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_i.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_i.vpcf_c new file mode 100755 index 0000000..0e39b9f Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_i.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j.vpcf_c new file mode 100755 index 0000000..96c00d0 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j0.vpcf_c new file mode 100755 index 0000000..3ba1a08 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j0a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j0a.vpcf_c new file mode 100755 index 0000000..f1c58c3 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j0a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j0a0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j0a0.vpcf_c new file mode 100755 index 0000000..3d471ff Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j0a0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j0a1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j0a1.vpcf_c new file mode 100755 index 0000000..fe53a7d Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j0a1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j0a2.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j0a2.vpcf_c new file mode 100755 index 0000000..d2f5fca Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j0a2.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j0a3.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j0a3.vpcf_c new file mode 100755 index 0000000..eb0aef7 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j0a3.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j0b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j0b.vpcf_c new file mode 100755 index 0000000..8c555f1 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j0b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j0c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j0c.vpcf_c new file mode 100755 index 0000000..4a34bf9 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j0c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1.vpcf_c new file mode 100755 index 0000000..5d51e4d Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1a.vpcf_c new file mode 100755 index 0000000..c288900 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1b.vpcf_c new file mode 100755 index 0000000..c15677a Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1c.vpcf_c new file mode 100755 index 0000000..ccd913b Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1d.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1d.vpcf_c new file mode 100755 index 0000000..c8f022d Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1d.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e.vpcf_c new file mode 100755 index 0000000..93a00bd Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e0.vpcf_c new file mode 100755 index 0000000..db947f3 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e0a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e0a.vpcf_c new file mode 100755 index 0000000..55b939f Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e0a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e0b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e0b.vpcf_c new file mode 100755 index 0000000..d2595f8 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e0b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e0c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e0c.vpcf_c new file mode 100755 index 0000000..16e9cd1 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e0c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e0d.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e0d.vpcf_c new file mode 100755 index 0000000..be6f65f Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e0d.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e0e.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e0e.vpcf_c new file mode 100755 index 0000000..118852d Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e0e.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e0e0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e0e0.vpcf_c new file mode 100755 index 0000000..89e9421 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e0e0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e0f.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e0f.vpcf_c new file mode 100755 index 0000000..4c14b9c Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e0f.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e1.vpcf_c new file mode 100755 index 0000000..9bdb600 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e1a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e1a.vpcf_c new file mode 100755 index 0000000..3b5310c Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e1a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e2.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e2.vpcf_c new file mode 100755 index 0000000..70a8c15 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e2.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e3.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e3.vpcf_c new file mode 100755 index 0000000..a4abbf8 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e3.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e3a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e3a.vpcf_c new file mode 100755 index 0000000..91ea749 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e3a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e4.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e4.vpcf_c new file mode 100755 index 0000000..57f2102 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e4.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e4a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e4a.vpcf_c new file mode 100755 index 0000000..5e1ef0e Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e4a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e4b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e4b.vpcf_c new file mode 100755 index 0000000..15b480a Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e4b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e4b0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e4b0.vpcf_c new file mode 100755 index 0000000..5fa9555 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e4b0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e4b0a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e4b0a.vpcf_c new file mode 100755 index 0000000..2c2b6c9 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e4b0a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e4b0b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e4b0b.vpcf_c new file mode 100755 index 0000000..074217f Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e4b0b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1e5.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1e5.vpcf_c new file mode 100755 index 0000000..859b32b Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1e5.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1f.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1f.vpcf_c new file mode 100755 index 0000000..e43d054 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1f.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1g.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1g.vpcf_c new file mode 100755 index 0000000..36791df Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1g.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_j1h.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_j1h.vpcf_c new file mode 100755 index 0000000..87e1f81 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_j1h.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k.vpcf_c new file mode 100755 index 0000000..bc2316b Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k0.vpcf_c new file mode 100755 index 0000000..51f37e3 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k1.vpcf_c new file mode 100755 index 0000000..4ff9e43 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k2.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k2.vpcf_c new file mode 100755 index 0000000..2d608fd Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k2.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k3.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k3.vpcf_c new file mode 100755 index 0000000..ecd80b0 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k3.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k4.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k4.vpcf_c new file mode 100755 index 0000000..b576090 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k4.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k5.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k5.vpcf_c new file mode 100755 index 0000000..79b54be Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k5.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k6.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k6.vpcf_c new file mode 100755 index 0000000..d3dc641 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k6.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k7.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k7.vpcf_c new file mode 100755 index 0000000..01ab253 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k7.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k7a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k7a.vpcf_c new file mode 100755 index 0000000..2ef061b Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k7a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k7b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k7b.vpcf_c new file mode 100755 index 0000000..3092a78 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k7b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k7c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k7c.vpcf_c new file mode 100755 index 0000000..793d68b Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k7c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k7d.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k7d.vpcf_c new file mode 100755 index 0000000..cc28bf7 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k7d.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k7e.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k7e.vpcf_c new file mode 100755 index 0000000..04aae6d Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k7e.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8.vpcf_c new file mode 100755 index 0000000..5a24c04 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8a.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8a.vpcf_c new file mode 100755 index 0000000..79c26ea Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8b.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8b.vpcf_c new file mode 100755 index 0000000..911c7f8 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8b0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8b0.vpcf_c new file mode 100755 index 0000000..178e5d8 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8b0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8b1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8b1.vpcf_c new file mode 100755 index 0000000..639d395 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8b1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8c.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8c.vpcf_c new file mode 100755 index 0000000..53c5f7e Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8d.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8d.vpcf_c new file mode 100755 index 0000000..ed47995 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8d.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8e.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8e.vpcf_c new file mode 100755 index 0000000..334479d Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8e.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8e0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8e0.vpcf_c new file mode 100755 index 0000000..8e9d494 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8e0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8e1.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8e1.vpcf_c new file mode 100755 index 0000000..2701e14 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8e1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8f.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8f.vpcf_c new file mode 100755 index 0000000..543aaf4 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8f.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8g.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8g.vpcf_c new file mode 100755 index 0000000..1ae1e71 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8g.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8g0.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8g0.vpcf_c new file mode 100755 index 0000000..326a077 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8g0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8h.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8h.vpcf_c new file mode 100755 index 0000000..eaed50d Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8h.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8i.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8i.vpcf_c new file mode 100755 index 0000000..6604b84 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8i.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8j.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8j.vpcf_c new file mode 100755 index 0000000..a4a2779 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8j.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8k.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8k.vpcf_c new file mode 100755 index 0000000..e40de6f Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8k.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8l.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8l.vpcf_c new file mode 100755 index 0000000..0559f0b Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8l.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8m.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8m.vpcf_c new file mode 100755 index 0000000..1edadab Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8m.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8n.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8n.vpcf_c new file mode 100755 index 0000000..a5122b5 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8n.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_soga_02_k8o.vpcf_c b/particles/heroes/thtd_soga/ability_soga_02_k8o.vpcf_c new file mode 100755 index 0000000..7fcc356 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_soga_02_k8o.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning.vpcf_c new file mode 100755 index 0000000..f256ffa Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_a.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_a.vpcf_c new file mode 100755 index 0000000..f62dc88 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_a.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_b.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_b.vpcf_c new file mode 100755 index 0000000..7e920d6 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_b.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_c.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_c.vpcf_c new file mode 100755 index 0000000..42cd59a Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_c.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_d.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_d.vpcf_c new file mode 100755 index 0000000..54b20b9 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_d.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_e.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_e.vpcf_c new file mode 100755 index 0000000..46ff3cf Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_e.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_f.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_f.vpcf_c new file mode 100755 index 0000000..eeb30be Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_f.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_g.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_g.vpcf_c new file mode 100755 index 0000000..4e80eb8 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_g.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_h.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_h.vpcf_c new file mode 100755 index 0000000..ab3ffee Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_h.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_i.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_i.vpcf_c new file mode 100755 index 0000000..233c3b8 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_i.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_j.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_j.vpcf_c new file mode 100755 index 0000000..6acdf73 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_j.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_k.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_k.vpcf_c new file mode 100755 index 0000000..01803aa Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_k.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_k0.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_k0.vpcf_c new file mode 100755 index 0000000..abea946 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_k0.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_k1.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_k1.vpcf_c new file mode 100755 index 0000000..70f2400 Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_k1.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_k2.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_k2.vpcf_c new file mode 100755 index 0000000..a96c1af Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_k2.vpcf_c differ diff --git a/particles/heroes/thtd_soga/ability_thtd_soga_lightning_l.vpcf_c b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_l.vpcf_c new file mode 100755 index 0000000..947397c Binary files /dev/null and b/particles/heroes/thtd_soga/ability_thtd_soga_lightning_l.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01.vpcf_c b/particles/heroes/thtd_star/ability_star_01.vpcf_c new file mode 100755 index 0000000..b24608a Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_a.vpcf_c b/particles/heroes/thtd_star/ability_star_01_a.vpcf_c new file mode 100755 index 0000000..c57ca3f Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_b.vpcf_c b/particles/heroes/thtd_star/ability_star_01_b.vpcf_c new file mode 100755 index 0000000..d64e323 Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_c.vpcf_c b/particles/heroes/thtd_star/ability_star_01_c.vpcf_c new file mode 100755 index 0000000..41e8b09 Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_d.vpcf_c b/particles/heroes/thtd_star/ability_star_01_d.vpcf_c new file mode 100755 index 0000000..14d74ce Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_e.vpcf_c b/particles/heroes/thtd_star/ability_star_01_e.vpcf_c new file mode 100755 index 0000000..a57ecc6 Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_e.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_f.vpcf_c b/particles/heroes/thtd_star/ability_star_01_f.vpcf_c new file mode 100755 index 0000000..144ccd7 Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_f.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_g.vpcf_c b/particles/heroes/thtd_star/ability_star_01_g.vpcf_c new file mode 100755 index 0000000..00b29b1 Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_g.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_h.vpcf_c b/particles/heroes/thtd_star/ability_star_01_h.vpcf_c new file mode 100755 index 0000000..541db8e Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_h.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_i.vpcf_c b/particles/heroes/thtd_star/ability_star_01_i.vpcf_c new file mode 100755 index 0000000..390b521 Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_i.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_j.vpcf_c b/particles/heroes/thtd_star/ability_star_01_j.vpcf_c new file mode 100755 index 0000000..f419387 Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_j.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_k.vpcf_c b/particles/heroes/thtd_star/ability_star_01_k.vpcf_c new file mode 100755 index 0000000..ea6a321 Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_k.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_l.vpcf_c b/particles/heroes/thtd_star/ability_star_01_l.vpcf_c new file mode 100755 index 0000000..feb15b5 Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_l.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_m.vpcf_c b/particles/heroes/thtd_star/ability_star_01_m.vpcf_c new file mode 100755 index 0000000..1dced7d Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_m.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_n.vpcf_c b/particles/heroes/thtd_star/ability_star_01_n.vpcf_c new file mode 100755 index 0000000..c0615d5 Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_n.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_o.vpcf_c b/particles/heroes/thtd_star/ability_star_01_o.vpcf_c new file mode 100755 index 0000000..a397d90 Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_o.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_p.vpcf_c b/particles/heroes/thtd_star/ability_star_01_p.vpcf_c new file mode 100755 index 0000000..e1a35cc Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_p.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_q.vpcf_c b/particles/heroes/thtd_star/ability_star_01_q.vpcf_c new file mode 100755 index 0000000..1dc256d Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_q.vpcf_c differ diff --git a/particles/heroes/thtd_star/ability_star_01_r.vpcf_c b/particles/heroes/thtd_star/ability_star_01_r.vpcf_c new file mode 100755 index 0000000..80ebe4d Binary files /dev/null and b/particles/heroes/thtd_star/ability_star_01_r.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01.vpcf_c new file mode 100755 index 0000000..75e53bf Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01_a.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01_a.vpcf_c new file mode 100755 index 0000000..0cef611 Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01_a0.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01_a0.vpcf_c new file mode 100755 index 0000000..29cb991 Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01_a0.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01_a1.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01_a1.vpcf_c new file mode 100755 index 0000000..565713a Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01_a1.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01_a2.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01_a2.vpcf_c new file mode 100755 index 0000000..ad6d4ee Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01_a2.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01_a3.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01_a3.vpcf_c new file mode 100755 index 0000000..5d862fe Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01_a3.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01_a4.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01_a4.vpcf_c new file mode 100755 index 0000000..d937f12 Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01_a4.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01_a5.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01_a5.vpcf_c new file mode 100755 index 0000000..377dd8b Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01_a5.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01_a6.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01_a6.vpcf_c new file mode 100755 index 0000000..74a7c0c Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01_a6.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01_b.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01_b.vpcf_c new file mode 100755 index 0000000..8fea56a Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01_c.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01_c.vpcf_c new file mode 100755 index 0000000..edc607c Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01_d.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01_d.vpcf_c new file mode 100755 index 0000000..1a0769f Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_01_smoke.vpcf_c b/particles/heroes/thtd_suika/ability_suika_01_smoke.vpcf_c new file mode 100755 index 0000000..5ea0d73 Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_01_smoke.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_03.vpcf_c b/particles/heroes/thtd_suika/ability_suika_03.vpcf_c new file mode 100755 index 0000000..7d35462 Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_03.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_03_a.vpcf_c b/particles/heroes/thtd_suika/ability_suika_03_a.vpcf_c new file mode 100755 index 0000000..2fc758f Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_04.vpcf_c b/particles/heroes/thtd_suika/ability_suika_04.vpcf_c new file mode 100755 index 0000000..94c0832 Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_04.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_04_a.vpcf_c b/particles/heroes/thtd_suika/ability_suika_04_a.vpcf_c new file mode 100755 index 0000000..ad8e04d Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_04_a.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_04_a0.vpcf_c b/particles/heroes/thtd_suika/ability_suika_04_a0.vpcf_c new file mode 100755 index 0000000..f2599a5 Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_04_a0.vpcf_c differ diff --git a/particles/heroes/thtd_suika/ability_suika_04_b.vpcf_c b/particles/heroes/thtd_suika/ability_suika_04_b.vpcf_c new file mode 100755 index 0000000..3af8a9a Binary files /dev/null and b/particles/heroes/thtd_suika/ability_suika_04_b.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_01_ring.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_01_ring.vpcf_c new file mode 100755 index 0000000..1569e81 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_01_ring.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_01_ring_a.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_01_ring_a.vpcf_c new file mode 100755 index 0000000..4646e02 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_01_ring_a.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_01_ring_b.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_01_ring_b.vpcf_c new file mode 100755 index 0000000..69a59ab Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_01_ring_b.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_01_ring_b0.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_01_ring_b0.vpcf_c new file mode 100755 index 0000000..9cb7bdf Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_01_ring_b0.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02.vpcf_c new file mode 100755 index 0000000..ec779c7 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_a.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_a.vpcf_c new file mode 100755 index 0000000..650fecf Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_a.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_b.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_b.vpcf_c new file mode 100755 index 0000000..1d83730 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_b.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_c.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_c.vpcf_c new file mode 100755 index 0000000..7f924fb Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_c.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_c0.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_c0.vpcf_c new file mode 100755 index 0000000..a4f0f75 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_c0.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_d.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_d.vpcf_c new file mode 100755 index 0000000..bbe27a2 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_d.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_d0.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_d0.vpcf_c new file mode 100755 index 0000000..3463777 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_d0.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_d0a.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_d0a.vpcf_c new file mode 100755 index 0000000..d442e94 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_d0a.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_d0b.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_d0b.vpcf_c new file mode 100755 index 0000000..f1bc72d Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_d0b.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_d0c.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_d0c.vpcf_c new file mode 100755 index 0000000..075d55c Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_d0c.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_d0d.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_d0d.vpcf_c new file mode 100755 index 0000000..6670986 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_d0d.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_d0e.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_d0e.vpcf_c new file mode 100755 index 0000000..59df34f Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_d0e.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_d0f.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_d0f.vpcf_c new file mode 100755 index 0000000..507cb5f Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_d0f.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_e.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_e.vpcf_c new file mode 100755 index 0000000..093baa6 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_e.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_f.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_f.vpcf_c new file mode 100755 index 0000000..c5137c1 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_f.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_g.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_g.vpcf_c new file mode 100755 index 0000000..b555812 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_g.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_h.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_h.vpcf_c new file mode 100755 index 0000000..c0c5893 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_h.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_i.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_i.vpcf_c new file mode 100755 index 0000000..d329ef1 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_i.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_j.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_j.vpcf_c new file mode 100755 index 0000000..a349b0a Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_j.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_k.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_k.vpcf_c new file mode 100755 index 0000000..32d877d Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_k.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_l.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_l.vpcf_c new file mode 100755 index 0000000..6b36f89 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_l.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_m.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_m.vpcf_c new file mode 100755 index 0000000..9cadcbe Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_m.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_n.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_n.vpcf_c new file mode 100755 index 0000000..04c1361 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_n.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_n0.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_n0.vpcf_c new file mode 100755 index 0000000..f1c594c Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_n0.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_n1.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_n1.vpcf_c new file mode 100755 index 0000000..df4ec74 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_n1.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_n2.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_n2.vpcf_c new file mode 100755 index 0000000..3ca2b49 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_n2.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_n3.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_n3.vpcf_c new file mode 100755 index 0000000..4bba46e Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_n3.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_n4.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_n4.vpcf_c new file mode 100755 index 0000000..917bad5 Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_n4.vpcf_c differ diff --git a/particles/heroes/thtd_suwako/ability_suwako_02_o.vpcf_c b/particles/heroes/thtd_suwako/ability_suwako_02_o.vpcf_c new file mode 100755 index 0000000..200ffbb Binary files /dev/null and b/particles/heroes/thtd_suwako/ability_suwako_02_o.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01.vpcf_c new file mode 100755 index 0000000..1afdc23 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01_a.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01_a.vpcf_c new file mode 100755 index 0000000..64740e3 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01_b.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01_b.vpcf_c new file mode 100755 index 0000000..1c98ffa Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01_c.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01_c.vpcf_c new file mode 100755 index 0000000..e5f7b4f Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01_d.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01_d.vpcf_c new file mode 100755 index 0000000..7c8dd5d Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01_debuff.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01_debuff.vpcf_c new file mode 100755 index 0000000..c5bcf76 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01_debuff.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01_debuff_a.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01_debuff_a.vpcf_c new file mode 100755 index 0000000..5857aa6 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01_debuff_a.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01_debuff_b.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01_debuff_b.vpcf_c new file mode 100755 index 0000000..49d3fc6 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01_debuff_b.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01_e.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01_e.vpcf_c new file mode 100755 index 0000000..5044d7f Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01_e.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01_f.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01_f.vpcf_c new file mode 100755 index 0000000..72ba3d6 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01_f.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01_g.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01_g.vpcf_c new file mode 100755 index 0000000..d26c504 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01_g.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01_h.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01_h.vpcf_c new file mode 100755 index 0000000..c41256f Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01_h.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_01_i.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_01_i.vpcf_c new file mode 100755 index 0000000..83b908e Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_01_i.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_02.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_02.vpcf_c new file mode 100755 index 0000000..b81fbfd Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_02.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_02_a.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_02_a.vpcf_c new file mode 100755 index 0000000..ff748f5 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_02_a.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_02_a0.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_02_a0.vpcf_c new file mode 100755 index 0000000..e254217 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_02_a0.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_02_b.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_02_b.vpcf_c new file mode 100755 index 0000000..5bfc4a6 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_02_b.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_02_b0.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_02_b0.vpcf_c new file mode 100755 index 0000000..b4886d6 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_02_b0.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_02_c.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_02_c.vpcf_c new file mode 100755 index 0000000..fb68239 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_02_c.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_02_c0.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_02_c0.vpcf_c new file mode 100755 index 0000000..b60a0f1 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_02_c0.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_02_d.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_02_d.vpcf_c new file mode 100755 index 0000000..536f07a Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_02_d.vpcf_c differ diff --git a/particles/heroes/thtd_yoshika/ability_yoshika_02_d0.vpcf_c b/particles/heroes/thtd_yoshika/ability_yoshika_02_d0.vpcf_c new file mode 100755 index 0000000..5429c92 Binary files /dev/null and b/particles/heroes/thtd_yoshika/ability_yoshika_02_d0.vpcf_c differ diff --git a/particles/heroes/thtd_youmu/ability_youmu_01_laser.vpcf_c b/particles/heroes/thtd_youmu/ability_youmu_01_laser.vpcf_c new file mode 100755 index 0000000..aa880c4 Binary files /dev/null and b/particles/heroes/thtd_youmu/ability_youmu_01_laser.vpcf_c differ diff --git a/particles/heroes/thtd_youmu/ability_youmu_01_laser_b.vpcf_c b/particles/heroes/thtd_youmu/ability_youmu_01_laser_b.vpcf_c new file mode 100755 index 0000000..96b6ccb Binary files /dev/null and b/particles/heroes/thtd_youmu/ability_youmu_01_laser_b.vpcf_c differ diff --git a/particles/heroes/thtd_youmu/ability_youmu_01_laser_c.vpcf_c b/particles/heroes/thtd_youmu/ability_youmu_01_laser_c.vpcf_c new file mode 100755 index 0000000..6079ad9 Binary files /dev/null and b/particles/heroes/thtd_youmu/ability_youmu_01_laser_c.vpcf_c differ diff --git a/particles/heroes/thtd_youmu/ability_youmu_01_laser_d.vpcf_c b/particles/heroes/thtd_youmu/ability_youmu_01_laser_d.vpcf_c new file mode 100755 index 0000000..bb67b18 Binary files /dev/null and b/particles/heroes/thtd_youmu/ability_youmu_01_laser_d.vpcf_c differ diff --git a/particles/heroes/thtd_youmu/ability_youmu_03_sword_light.vpcf_c b/particles/heroes/thtd_youmu/ability_youmu_03_sword_light.vpcf_c new file mode 100755 index 0000000..159c78d Binary files /dev/null and b/particles/heroes/thtd_youmu/ability_youmu_03_sword_light.vpcf_c differ diff --git a/particles/heroes/thtd_yuggi/ability_yuugi_03.vpcf_c b/particles/heroes/thtd_yuggi/ability_yuugi_03.vpcf_c new file mode 100755 index 0000000..733008e Binary files /dev/null and b/particles/heroes/thtd_yuggi/ability_yuugi_03.vpcf_c differ diff --git a/particles/heroes/thtd_yuggi/ability_yuugi_03_a.vpcf_c b/particles/heroes/thtd_yuggi/ability_yuugi_03_a.vpcf_c new file mode 100755 index 0000000..11576a3 Binary files /dev/null and b/particles/heroes/thtd_yuggi/ability_yuugi_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuggi/ability_yuugi_03_b.vpcf_c b/particles/heroes/thtd_yuggi/ability_yuugi_03_b.vpcf_c new file mode 100755 index 0000000..cdf74f0 Binary files /dev/null and b/particles/heroes/thtd_yuggi/ability_yuugi_03_b.vpcf_c differ diff --git a/particles/heroes/thtd_yuggi/ability_yuugi_03_c.vpcf_c b/particles/heroes/thtd_yuggi/ability_yuugi_03_c.vpcf_c new file mode 100755 index 0000000..6606e47 Binary files /dev/null and b/particles/heroes/thtd_yuggi/ability_yuugi_03_c.vpcf_c differ diff --git a/particles/heroes/thtd_yuggi/ability_yuugi_03_d.vpcf_c b/particles/heroes/thtd_yuggi/ability_yuugi_03_d.vpcf_c new file mode 100755 index 0000000..a1aa2f4 Binary files /dev/null and b/particles/heroes/thtd_yuggi/ability_yuugi_03_d.vpcf_c differ diff --git a/particles/heroes/thtd_yuggi/ability_yuugi_03_d0.vpcf_c b/particles/heroes/thtd_yuggi/ability_yuugi_03_d0.vpcf_c new file mode 100755 index 0000000..66b6c27 Binary files /dev/null and b/particles/heroes/thtd_yuggi/ability_yuugi_03_d0.vpcf_c differ diff --git a/particles/heroes/thtd_yuggi/ability_yuugi_03_d1.vpcf_c b/particles/heroes/thtd_yuggi/ability_yuugi_03_d1.vpcf_c new file mode 100755 index 0000000..a10e25f Binary files /dev/null and b/particles/heroes/thtd_yuggi/ability_yuugi_03_d1.vpcf_c differ diff --git a/particles/heroes/thtd_yuggi/ability_yuugi_03_d2.vpcf_c b/particles/heroes/thtd_yuggi/ability_yuugi_03_d2.vpcf_c new file mode 100755 index 0000000..9163731 Binary files /dev/null and b/particles/heroes/thtd_yuggi/ability_yuugi_03_d2.vpcf_c differ diff --git a/particles/heroes/thtd_yuggi/ability_yuugi_03_d3.vpcf_c b/particles/heroes/thtd_yuggi/ability_yuugi_03_d3.vpcf_c new file mode 100755 index 0000000..be98463 Binary files /dev/null and b/particles/heroes/thtd_yuggi/ability_yuugi_03_d3.vpcf_c differ diff --git a/particles/heroes/thtd_yuggi/ability_yuugi_03_d4.vpcf_c b/particles/heroes/thtd_yuggi/ability_yuugi_03_d4.vpcf_c new file mode 100755 index 0000000..85b1635 Binary files /dev/null and b/particles/heroes/thtd_yuggi/ability_yuugi_03_d4.vpcf_c differ diff --git a/particles/heroes/thtd_yukari/ability_yukari_04_door.vpcf_c b/particles/heroes/thtd_yukari/ability_yukari_04_door.vpcf_c new file mode 100755 index 0000000..16f25af Binary files /dev/null and b/particles/heroes/thtd_yukari/ability_yukari_04_door.vpcf_c differ diff --git a/particles/heroes/thtd_yukari/ability_yukari_04_door_a.vpcf_c b/particles/heroes/thtd_yukari/ability_yukari_04_door_a.vpcf_c new file mode 100755 index 0000000..3a61a3d Binary files /dev/null and b/particles/heroes/thtd_yukari/ability_yukari_04_door_a.vpcf_c differ diff --git a/particles/heroes/thtd_yukari/ability_yukari_04_door_a0.vpcf_c b/particles/heroes/thtd_yukari/ability_yukari_04_door_a0.vpcf_c new file mode 100755 index 0000000..5120ec5 Binary files /dev/null and b/particles/heroes/thtd_yukari/ability_yukari_04_door_a0.vpcf_c differ diff --git a/particles/heroes/thtd_yukari/ability_yukari_04_door_a1.vpcf_c b/particles/heroes/thtd_yukari/ability_yukari_04_door_a1.vpcf_c new file mode 100755 index 0000000..b310173 Binary files /dev/null and b/particles/heroes/thtd_yukari/ability_yukari_04_door_a1.vpcf_c differ diff --git a/particles/heroes/thtd_yukari/ability_yukari_04_spawn.vpcf_c b/particles/heroes/thtd_yukari/ability_yukari_04_spawn.vpcf_c new file mode 100755 index 0000000..7dc16f7 Binary files /dev/null and b/particles/heroes/thtd_yukari/ability_yukari_04_spawn.vpcf_c differ diff --git a/particles/heroes/thtd_yukari/ability_yukari_04_spawn_a.vpcf_c b/particles/heroes/thtd_yukari/ability_yukari_04_spawn_a.vpcf_c new file mode 100755 index 0000000..e69c283 Binary files /dev/null and b/particles/heroes/thtd_yukari/ability_yukari_04_spawn_a.vpcf_c differ diff --git a/particles/heroes/thtd_yukari/ability_yukari_04_spawn_b.vpcf_c b/particles/heroes/thtd_yukari/ability_yukari_04_spawn_b.vpcf_c new file mode 100755 index 0000000..9cdef8f Binary files /dev/null and b/particles/heroes/thtd_yukari/ability_yukari_04_spawn_b.vpcf_c differ diff --git a/particles/heroes/thtd_yukari/ability_yukari_04_spawn_b0.vpcf_c b/particles/heroes/thtd_yukari/ability_yukari_04_spawn_b0.vpcf_c new file mode 100755 index 0000000..3f81204 Binary files /dev/null and b/particles/heroes/thtd_yukari/ability_yukari_04_spawn_b0.vpcf_c differ diff --git a/particles/heroes/thtd_yukari/ability_yukari_04_spawn_c.vpcf_c b/particles/heroes/thtd_yukari/ability_yukari_04_spawn_c.vpcf_c new file mode 100755 index 0000000..fb340f1 Binary files /dev/null and b/particles/heroes/thtd_yukari/ability_yukari_04_spawn_c.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_01.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_01.vpcf_c new file mode 100755 index 0000000..5f9bbda Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_01.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_01_a.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_01_a.vpcf_c new file mode 100755 index 0000000..0fcb42d Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_01_a0.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_01_a0.vpcf_c new file mode 100755 index 0000000..67b5899 Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_01_a0.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_01_a1.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_01_a1.vpcf_c new file mode 100755 index 0000000..39fe7bc Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_01_a1.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_01_a2.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_01_a2.vpcf_c new file mode 100755 index 0000000..296efa4 Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_01_a2.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_01_a3.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_01_a3.vpcf_c new file mode 100755 index 0000000..735ce6a Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_01_a3.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_01_a4.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_01_a4.vpcf_c new file mode 100755 index 0000000..fd7c800 Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_01_a4.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_01_a5.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_01_a5.vpcf_c new file mode 100755 index 0000000..4c092be Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_01_a5.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_01_a6.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_01_a6.vpcf_c new file mode 100755 index 0000000..2e6aa64 Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_01_a6.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_01_b.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_01_b.vpcf_c new file mode 100755 index 0000000..2b7b1e3 Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_01_c.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_01_c.vpcf_c new file mode 100755 index 0000000..a214b60 Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_01_d.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_01_d.vpcf_c new file mode 100755 index 0000000..6e5df6f Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_02.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_02.vpcf_c new file mode 100755 index 0000000..49e2497 Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_02.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_02_a.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_02_a.vpcf_c new file mode 100755 index 0000000..3f47880 Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_02_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_02_b.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_02_b.vpcf_c new file mode 100755 index 0000000..8811ba0 Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_02_b.vpcf_c differ diff --git a/particles/heroes/thtd_yuugi/ability_yuugi_02_c.vpcf_c b/particles/heroes/thtd_yuugi/ability_yuugi_02_c.vpcf_c new file mode 100755 index 0000000..91f60b9 Binary files /dev/null and b/particles/heroes/thtd_yuugi/ability_yuugi_02_c.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01.vpcf_c new file mode 100755 index 0000000..93b6a62 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_a.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_a.vpcf_c new file mode 100755 index 0000000..8ec9f52 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_b.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_b.vpcf_c new file mode 100755 index 0000000..341a70a Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_b.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_c.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_c.vpcf_c new file mode 100755 index 0000000..4562c63 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_c.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_c0.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_c0.vpcf_c new file mode 100755 index 0000000..607a56c Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_c0.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_d.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_d.vpcf_c new file mode 100755 index 0000000..7f670b0 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_d.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_e.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_e.vpcf_c new file mode 100755 index 0000000..bb35a20 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_e.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_f.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_f.vpcf_c new file mode 100755 index 0000000..1b1b036 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_f.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_f0.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_f0.vpcf_c new file mode 100755 index 0000000..07780c2 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_f0.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_f0a.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_f0a.vpcf_c new file mode 100755 index 0000000..b7fc859 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_f0a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_f0b.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_f0b.vpcf_c new file mode 100755 index 0000000..41011e7 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_f0b.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_f0b0.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_f0b0.vpcf_c new file mode 100755 index 0000000..a6fce0b Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_f0b0.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_f0b0a.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_f0b0a.vpcf_c new file mode 100755 index 0000000..b2b594f Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_f0b0a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower.vpcf_c new file mode 100755 index 0000000..6f672b3 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_a.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_a.vpcf_c new file mode 100755 index 0000000..dd003af Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_b.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_b.vpcf_c new file mode 100755 index 0000000..78732fe Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_b.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_c.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_c.vpcf_c new file mode 100755 index 0000000..2866ddf Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_c.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_c0.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_c0.vpcf_c new file mode 100755 index 0000000..efc9faa Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_c0.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_d.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_d.vpcf_c new file mode 100755 index 0000000..2cf640e Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_d.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_e.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_e.vpcf_c new file mode 100755 index 0000000..4be20c8 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_e.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f.vpcf_c new file mode 100755 index 0000000..d55630a Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0.vpcf_c new file mode 100755 index 0000000..b36796c Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0a.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0a.vpcf_c new file mode 100755 index 0000000..1026473 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0b.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0b.vpcf_c new file mode 100755 index 0000000..e5e1b5d Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0b.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0b0.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0b0.vpcf_c new file mode 100755 index 0000000..002581a Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0b0.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0b0a.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0b0a.vpcf_c new file mode 100755 index 0000000..8318454 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_f0b0a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_g.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_g.vpcf_c new file mode 100755 index 0000000..809188c Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_g.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_h.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_h.vpcf_c new file mode 100755 index 0000000..1743f0e Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_h.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_h0.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_h0.vpcf_c new file mode 100755 index 0000000..afee525 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_h0.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_i.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_i.vpcf_c new file mode 100755 index 0000000..bcfa38a Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_i.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_j.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_j.vpcf_c new file mode 100755 index 0000000..d3f7e9a Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_j.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_k.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_k.vpcf_c new file mode 100755 index 0000000..2d9649b Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_k.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_k0.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_k0.vpcf_c new file mode 100755 index 0000000..7d7f2ab Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_k0.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_k1.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_k1.vpcf_c new file mode 100755 index 0000000..2472aed Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_k1.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_l.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_l.vpcf_c new file mode 100755 index 0000000..17616e2 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_flower_l.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_g.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_g.vpcf_c new file mode 100755 index 0000000..5743a54 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_g.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_h.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_h.vpcf_c new file mode 100755 index 0000000..1b15175 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_h.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_h0.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_h0.vpcf_c new file mode 100755 index 0000000..e143dfd Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_h0.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_i.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_i.vpcf_c new file mode 100755 index 0000000..a1b5bd4 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_i.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_j.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_j.vpcf_c new file mode 100755 index 0000000..92c26c0 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_j.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_k.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_k.vpcf_c new file mode 100755 index 0000000..587be89 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_k.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_k0.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_k0.vpcf_c new file mode 100755 index 0000000..63c24a8 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_k0.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_k1.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_k1.vpcf_c new file mode 100755 index 0000000..1b19fff Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_k1.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_l.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_l.vpcf_c new file mode 100755 index 0000000..a353128 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_l.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn.vpcf_c new file mode 100755 index 0000000..d78852a Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_a.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_a.vpcf_c new file mode 100755 index 0000000..cacba84 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_b.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_b.vpcf_c new file mode 100755 index 0000000..e7a7b96 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_b.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_c.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_c.vpcf_c new file mode 100755 index 0000000..71b6369 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_c.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_light.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_light.vpcf_c new file mode 100755 index 0000000..ae1a2ae Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_light.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_light_a.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_light_a.vpcf_c new file mode 100755 index 0000000..70d0f06 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_light_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_light_b.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_light_b.vpcf_c new file mode 100755 index 0000000..89f3794 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_01_spawn_light_b.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_02_plant.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_02_plant.vpcf_c new file mode 100755 index 0000000..06986cf Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_02_plant.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_02_seed.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_02_seed.vpcf_c new file mode 100755 index 0000000..f16160a Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_02_seed.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_02_seed_a.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_02_seed_a.vpcf_c new file mode 100755 index 0000000..fc496bd Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_02_seed_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_02_seed_b.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_02_seed_b.vpcf_c new file mode 100755 index 0000000..7986770 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_02_seed_b.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_03.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_03.vpcf_c new file mode 100755 index 0000000..a0049f8 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_03.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_03_a.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_03_a.vpcf_c new file mode 100755 index 0000000..41a4ffc Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_03_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_03_b.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_03_b.vpcf_c new file mode 100755 index 0000000..153ec29 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_03_b.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_03_circle.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_03_circle.vpcf_c new file mode 100755 index 0000000..ce08597 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_03_circle.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_03_circle_a.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_03_circle_a.vpcf_c new file mode 100755 index 0000000..c70d6c8 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_03_circle_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind.vpcf_c new file mode 100755 index 0000000..b1b228f Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind_a.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind_a.vpcf_c new file mode 100755 index 0000000..6214c8c Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind_b.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind_b.vpcf_c new file mode 100755 index 0000000..947e878 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind_b.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind_c.vpcf_c b/particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind_c.vpcf_c new file mode 100755 index 0000000..f25d9f2 Binary files /dev/null and b/particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind_c.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/yuuka_04_spark.vpcf_c b/particles/heroes/thtd_yuuka/yuuka_04_spark.vpcf_c new file mode 100755 index 0000000..842904c Binary files /dev/null and b/particles/heroes/thtd_yuuka/yuuka_04_spark.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/yuuka_04_spark_a.vpcf_c b/particles/heroes/thtd_yuuka/yuuka_04_spark_a.vpcf_c new file mode 100755 index 0000000..ef288e3 Binary files /dev/null and b/particles/heroes/thtd_yuuka/yuuka_04_spark_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/yuuka_04_spark_a0.vpcf_c b/particles/heroes/thtd_yuuka/yuuka_04_spark_a0.vpcf_c new file mode 100755 index 0000000..49745f8 Binary files /dev/null and b/particles/heroes/thtd_yuuka/yuuka_04_spark_a0.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/yuuka_04_spark_a1.vpcf_c b/particles/heroes/thtd_yuuka/yuuka_04_spark_a1.vpcf_c new file mode 100755 index 0000000..df89e29 Binary files /dev/null and b/particles/heroes/thtd_yuuka/yuuka_04_spark_a1.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/yuuka_04_spark_a2.vpcf_c b/particles/heroes/thtd_yuuka/yuuka_04_spark_a2.vpcf_c new file mode 100755 index 0000000..97c63d1 Binary files /dev/null and b/particles/heroes/thtd_yuuka/yuuka_04_spark_a2.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/yuuka_04_spark_a3.vpcf_c b/particles/heroes/thtd_yuuka/yuuka_04_spark_a3.vpcf_c new file mode 100755 index 0000000..0f473cf Binary files /dev/null and b/particles/heroes/thtd_yuuka/yuuka_04_spark_a3.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/yuuka_04_spark_a4.vpcf_c b/particles/heroes/thtd_yuuka/yuuka_04_spark_a4.vpcf_c new file mode 100755 index 0000000..e9bd3aa Binary files /dev/null and b/particles/heroes/thtd_yuuka/yuuka_04_spark_a4.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/yuuka_04_spark_b.vpcf_c b/particles/heroes/thtd_yuuka/yuuka_04_spark_b.vpcf_c new file mode 100755 index 0000000..49b0fcd Binary files /dev/null and b/particles/heroes/thtd_yuuka/yuuka_04_spark_b.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/yuuka_04_spark_circle.vpcf_c b/particles/heroes/thtd_yuuka/yuuka_04_spark_circle.vpcf_c new file mode 100755 index 0000000..9ca40e1 Binary files /dev/null and b/particles/heroes/thtd_yuuka/yuuka_04_spark_circle.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/yuuka_04_spark_circle_a.vpcf_c b/particles/heroes/thtd_yuuka/yuuka_04_spark_circle_a.vpcf_c new file mode 100755 index 0000000..df16c4b Binary files /dev/null and b/particles/heroes/thtd_yuuka/yuuka_04_spark_circle_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuuka/yuuka_04_spark_light.vpcf_c b/particles/heroes/thtd_yuuka/yuuka_04_spark_light.vpcf_c new file mode 100755 index 0000000..787f080 Binary files /dev/null and b/particles/heroes/thtd_yuuka/yuuka_04_spark_light.vpcf_c differ diff --git a/particles/heroes/thtd_yuyuko/ability_yuyuko_01.vpcf_c b/particles/heroes/thtd_yuyuko/ability_yuyuko_01.vpcf_c new file mode 100755 index 0000000..ea1ede3 Binary files /dev/null and b/particles/heroes/thtd_yuyuko/ability_yuyuko_01.vpcf_c differ diff --git a/particles/heroes/thtd_yuyuko/ability_yuyuko_01_a.vpcf_c b/particles/heroes/thtd_yuyuko/ability_yuyuko_01_a.vpcf_c new file mode 100755 index 0000000..6c90d87 Binary files /dev/null and b/particles/heroes/thtd_yuyuko/ability_yuyuko_01_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuyuko/ability_yuyuko_01_a0.vpcf_c b/particles/heroes/thtd_yuyuko/ability_yuyuko_01_a0.vpcf_c new file mode 100755 index 0000000..b04d513 Binary files /dev/null and b/particles/heroes/thtd_yuyuko/ability_yuyuko_01_a0.vpcf_c differ diff --git a/particles/heroes/thtd_yuyuko/ability_yuyuko_01_a1.vpcf_c b/particles/heroes/thtd_yuyuko/ability_yuyuko_01_a1.vpcf_c new file mode 100755 index 0000000..c9c4713 Binary files /dev/null and b/particles/heroes/thtd_yuyuko/ability_yuyuko_01_a1.vpcf_c differ diff --git a/particles/heroes/thtd_yuyuko/ability_yuyuko_04.vpcf_c b/particles/heroes/thtd_yuyuko/ability_yuyuko_04.vpcf_c new file mode 100755 index 0000000..236353f Binary files /dev/null and b/particles/heroes/thtd_yuyuko/ability_yuyuko_04.vpcf_c differ diff --git a/particles/heroes/thtd_yuyuko/ability_yuyuko_04_a.vpcf_c b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_a.vpcf_c new file mode 100755 index 0000000..8e73030 Binary files /dev/null and b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_a.vpcf_c differ diff --git a/particles/heroes/thtd_yuyuko/ability_yuyuko_04_b.vpcf_c b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_b.vpcf_c new file mode 100755 index 0000000..0ad8700 Binary files /dev/null and b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_b.vpcf_c differ diff --git a/particles/heroes/thtd_yuyuko/ability_yuyuko_04_c.vpcf_c b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_c.vpcf_c new file mode 100755 index 0000000..a7cb4a7 Binary files /dev/null and b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_c.vpcf_c differ diff --git a/particles/heroes/thtd_yuyuko/ability_yuyuko_04_d.vpcf_c b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_d.vpcf_c new file mode 100755 index 0000000..49adfe2 Binary files /dev/null and b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_d.vpcf_c differ diff --git a/particles/heroes/thtd_yuyuko/ability_yuyuko_04_e.vpcf_c b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_e.vpcf_c new file mode 100755 index 0000000..1752adf Binary files /dev/null and b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_e.vpcf_c differ diff --git a/particles/heroes/thtd_yuyuko/ability_yuyuko_04_f.vpcf_c b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_f.vpcf_c new file mode 100755 index 0000000..1fb38d7 Binary files /dev/null and b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_f.vpcf_c differ diff --git a/particles/heroes/thtd_yuyuko/ability_yuyuko_04_g.vpcf_c b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_g.vpcf_c new file mode 100755 index 0000000..a0b9f0c Binary files /dev/null and b/particles/heroes/thtd_yuyuko/ability_yuyuko_04_g.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_01_blink_effect.vpcf_c b/particles/heroes/youmu/youmu_01_blink_effect.vpcf_c new file mode 100755 index 0000000..fdf7eab Binary files /dev/null and b/particles/heroes/youmu/youmu_01_blink_effect.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_02_effect_explosion.vpcf_c b/particles/heroes/youmu/youmu_02_effect_explosion.vpcf_c new file mode 100755 index 0000000..580b151 Binary files /dev/null and b/particles/heroes/youmu/youmu_02_effect_explosion.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_02_effect_explosion_b.vpcf_c b/particles/heroes/youmu/youmu_02_effect_explosion_b.vpcf_c new file mode 100755 index 0000000..c4d841e Binary files /dev/null and b/particles/heroes/youmu/youmu_02_effect_explosion_b.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_02_effect_number.vpcf_c b/particles/heroes/youmu/youmu_02_effect_number.vpcf_c new file mode 100755 index 0000000..d72d02f Binary files /dev/null and b/particles/heroes/youmu/youmu_02_effect_number.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_02_effect_number_b.vpcf_c b/particles/heroes/youmu/youmu_02_effect_number_b.vpcf_c new file mode 100755 index 0000000..fffe34f Binary files /dev/null and b/particles/heroes/youmu/youmu_02_effect_number_b.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_02_effect_number_c.vpcf_c b/particles/heroes/youmu/youmu_02_effect_number_c.vpcf_c new file mode 100755 index 0000000..59ddcab Binary files /dev/null and b/particles/heroes/youmu/youmu_02_effect_number_c.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_02_effect_number_d.vpcf_c b/particles/heroes/youmu/youmu_02_effect_number_d.vpcf_c new file mode 100755 index 0000000..d7e0f0f Binary files /dev/null and b/particles/heroes/youmu/youmu_02_effect_number_d.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_02_effect_sword_light.vpcf_c b/particles/heroes/youmu/youmu_02_effect_sword_light.vpcf_c new file mode 100755 index 0000000..bee4d34 Binary files /dev/null and b/particles/heroes/youmu/youmu_02_effect_sword_light.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_02_effect_sword_light_b.vpcf_c b/particles/heroes/youmu/youmu_02_effect_sword_light_b.vpcf_c new file mode 100755 index 0000000..34f2095 Binary files /dev/null and b/particles/heroes/youmu/youmu_02_effect_sword_light_b.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_02_effect_sword_light_c.vpcf_c b/particles/heroes/youmu/youmu_02_effect_sword_light_c.vpcf_c new file mode 100755 index 0000000..43c4f64 Binary files /dev/null and b/particles/heroes/youmu/youmu_02_effect_sword_light_c.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_04_blossoms_effect.vpcf_c b/particles/heroes/youmu/youmu_04_blossoms_effect.vpcf_c new file mode 100755 index 0000000..1f1d667 Binary files /dev/null and b/particles/heroes/youmu/youmu_04_blossoms_effect.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_04_blossoms_effect_light.vpcf_c b/particles/heroes/youmu/youmu_04_blossoms_effect_light.vpcf_c new file mode 100755 index 0000000..3fb4148 Binary files /dev/null and b/particles/heroes/youmu/youmu_04_blossoms_effect_light.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_04_circle.vpcf_c b/particles/heroes/youmu/youmu_04_circle.vpcf_c new file mode 100755 index 0000000..620da44 Binary files /dev/null and b/particles/heroes/youmu/youmu_04_circle.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_04_circle_light.vpcf_c b/particles/heroes/youmu/youmu_04_circle_light.vpcf_c new file mode 100755 index 0000000..bf1f57c Binary files /dev/null and b/particles/heroes/youmu/youmu_04_circle_light.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_04_sword_effect.vpcf_c b/particles/heroes/youmu/youmu_04_sword_effect.vpcf_c new file mode 100755 index 0000000..e5945f5 Binary files /dev/null and b/particles/heroes/youmu/youmu_04_sword_effect.vpcf_c differ diff --git a/particles/heroes/youmu/youmu_04_sword_effect_light.vpcf_c b/particles/heroes/youmu/youmu_04_sword_effect_light.vpcf_c new file mode 100755 index 0000000..7478dd4 Binary files /dev/null and b/particles/heroes/youmu/youmu_04_sword_effect_light.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_body.vpcf_c b/particles/heroes/yukari/ability_yukari_02_body.vpcf_c new file mode 100755 index 0000000..6e1c9bb Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_body.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_down.vpcf_c b/particles/heroes/yukari/ability_yukari_02_down.vpcf_c new file mode 100755 index 0000000..6bc10f1 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_down.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_down_1.vpcf_c b/particles/heroes/yukari/ability_yukari_02_down_1.vpcf_c new file mode 100755 index 0000000..cc9914c Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_down_1.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_down_2.vpcf_c b/particles/heroes/yukari/ability_yukari_02_down_2.vpcf_c new file mode 100755 index 0000000..ce083d1 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_down_2.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_down_5dust.vpcf_c b/particles/heroes/yukari/ability_yukari_02_down_5dust.vpcf_c new file mode 100755 index 0000000..5281a50 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_down_5dust.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_down_5dust_grit.vpcf_c b/particles/heroes/yukari/ability_yukari_02_down_5dust_grit.vpcf_c new file mode 100755 index 0000000..092abb1 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_down_5dust_grit.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_down_5dust_sand.vpcf_c b/particles/heroes/yukari/ability_yukari_02_down_5dust_sand.vpcf_c new file mode 100755 index 0000000..f235449 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_down_5dust_sand.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_effect_c.vpcf_c b/particles/heroes/yukari/ability_yukari_02_effect_c.vpcf_c new file mode 100755 index 0000000..0e8a155 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_effect_c.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_effect_g.vpcf_c b/particles/heroes/yukari/ability_yukari_02_effect_g.vpcf_c new file mode 100755 index 0000000..4dfad22 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_effect_g.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_effect_j.vpcf_c b/particles/heroes/yukari/ability_yukari_02_effect_j.vpcf_c new file mode 100755 index 0000000..2d55f09 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_effect_j.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_effect_l.vpcf_c b/particles/heroes/yukari/ability_yukari_02_effect_l.vpcf_c new file mode 100755 index 0000000..1c6a93b Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_effect_l.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_effect_m.vpcf_c b/particles/heroes/yukari/ability_yukari_02_effect_m.vpcf_c new file mode 100755 index 0000000..b639a6a Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_effect_m.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_vortex_2.vpcf_c b/particles/heroes/yukari/ability_yukari_02_vortex_2.vpcf_c new file mode 100755 index 0000000..13e32cf Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_vortex_2.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_vortex_2_end.vpcf_c b/particles/heroes/yukari/ability_yukari_02_vortex_2_end.vpcf_c new file mode 100755 index 0000000..9773e8a Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_vortex_2_end.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_vortex_2_end_mana_flash.vpcf_c b/particles/heroes/yukari/ability_yukari_02_vortex_2_end_mana_flash.vpcf_c new file mode 100755 index 0000000..9b56749 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_vortex_2_end_mana_flash.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_vortex_2_end_top_flare.vpcf_c b/particles/heroes/yukari/ability_yukari_02_vortex_2_end_top_flare.vpcf_c new file mode 100755 index 0000000..fe72b17 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_vortex_2_end_top_flare.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_vortex_2_end_top_warp.vpcf_c b/particles/heroes/yukari/ability_yukari_02_vortex_2_end_top_warp.vpcf_c new file mode 100755 index 0000000..b4add1a Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_vortex_2_end_top_warp.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_vortex_2_flash_lght.vpcf_c b/particles/heroes/yukari/ability_yukari_02_vortex_2_flash_lght.vpcf_c new file mode 100755 index 0000000..bdcaecf Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_vortex_2_flash_lght.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_vortex_2_g.vpcf_c b/particles/heroes/yukari/ability_yukari_02_vortex_2_g.vpcf_c new file mode 100755 index 0000000..0ca82ac Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_vortex_2_g.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_vortex_2_h.vpcf_c b/particles/heroes/yukari/ability_yukari_02_vortex_2_h.vpcf_c new file mode 100755 index 0000000..4be1475 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_vortex_2_h.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_vortex_2_i.vpcf_c b/particles/heroes/yukari/ability_yukari_02_vortex_2_i.vpcf_c new file mode 100755 index 0000000..2f46f75 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_vortex_2_i.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_vortex_2_l.vpcf_c b/particles/heroes/yukari/ability_yukari_02_vortex_2_l.vpcf_c new file mode 100755 index 0000000..ddf2ef3 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_vortex_2_l.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_vortex_2_n.vpcf_c b/particles/heroes/yukari/ability_yukari_02_vortex_2_n.vpcf_c new file mode 100755 index 0000000..154ee1a Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_vortex_2_n.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_02_vortex_2_o.vpcf_c b/particles/heroes/yukari/ability_yukari_02_vortex_2_o.vpcf_c new file mode 100755 index 0000000..7c5a0dd Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_02_vortex_2_o.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleport_light.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleport_light.vpcf_c new file mode 100755 index 0000000..ad949c0 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleport_light.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleport_light_core.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleport_light_core.vpcf_c new file mode 100755 index 0000000..b7d5ae9 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleport_light_core.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleport_light_e.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleport_light_e.vpcf_c new file mode 100755 index 0000000..5ec0e64 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleport_light_e.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleport_light_end.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleport_light_end.vpcf_c new file mode 100755 index 0000000..11227a8 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleport_light_end.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleport_light_f.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleport_light_f.vpcf_c new file mode 100755 index 0000000..17e6cc9 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleport_light_f.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleport_light_j.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleport_light_j.vpcf_c new file mode 100755 index 0000000..4553cd4 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleport_light_j.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleport_light_k.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleport_light_k.vpcf_c new file mode 100755 index 0000000..e66f109 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleport_light_k.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleportdrop.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleportdrop.vpcf_c new file mode 100755 index 0000000..66aae91 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleportdrop.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleportflash.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleportflash.vpcf_c new file mode 100755 index 0000000..6cc9a08 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleportflash.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleportflash2.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleportflash2.vpcf_c new file mode 100755 index 0000000..5fe125d Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleportflash2.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleportflash2_flash.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleportflash2_flash.vpcf_c new file mode 100755 index 0000000..6cdb280 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleportflash2_flash.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleportflash2_glow.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleportflash2_glow.vpcf_c new file mode 100755 index 0000000..20b0fc5 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleportflash2_glow.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_03_teleportglow.vpcf_c b/particles/heroes/yukari/ability_yukari_03_teleportglow.vpcf_c new file mode 100755 index 0000000..4b75919 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_03_teleportglow.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_boom.vpcf_c b/particles/heroes/yukari/ability_yukari_04_boom.vpcf_c new file mode 100755 index 0000000..75f9b5d Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_boom.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_boom_a.vpcf_c b/particles/heroes/yukari/ability_yukari_04_boom_a.vpcf_c new file mode 100755 index 0000000..f7f4137 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_boom_a.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_boom_b.vpcf_c b/particles/heroes/yukari/ability_yukari_04_boom_b.vpcf_c new file mode 100755 index 0000000..7c47b75 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_boom_b.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_boom_c.vpcf_c b/particles/heroes/yukari/ability_yukari_04_boom_c.vpcf_c new file mode 100755 index 0000000..dfc6800 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_boom_c.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_boom_c0.vpcf_c b/particles/heroes/yukari/ability_yukari_04_boom_c0.vpcf_c new file mode 100755 index 0000000..47326c7 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_boom_c0.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_boom_c1.vpcf_c b/particles/heroes/yukari/ability_yukari_04_boom_c1.vpcf_c new file mode 100755 index 0000000..06257b1 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_boom_c1.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_effect.vpcf_c b/particles/heroes/yukari/ability_yukari_04_effect.vpcf_c new file mode 100755 index 0000000..4e77ed2 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_effect.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_effect_a.vpcf_c b/particles/heroes/yukari/ability_yukari_04_effect_a.vpcf_c new file mode 100755 index 0000000..3fce717 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_effect_a.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_effect_a0.vpcf_c b/particles/heroes/yukari/ability_yukari_04_effect_a0.vpcf_c new file mode 100755 index 0000000..14278eb Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_effect_a0.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_effect_b.vpcf_c b/particles/heroes/yukari/ability_yukari_04_effect_b.vpcf_c new file mode 100755 index 0000000..c374077 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_effect_b.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_effect_d.vpcf_c b/particles/heroes/yukari/ability_yukari_04_effect_d.vpcf_c new file mode 100755 index 0000000..1f1a04d Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_effect_d.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_magical.vpcf_c b/particles/heroes/yukari/ability_yukari_04_magical.vpcf_c new file mode 100755 index 0000000..0283f7c Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_magical.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_magical_b.vpcf_c b/particles/heroes/yukari/ability_yukari_04_magical_b.vpcf_c new file mode 100755 index 0000000..afc7a90 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_magical_b.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_magical_c.vpcf_c b/particles/heroes/yukari/ability_yukari_04_magical_c.vpcf_c new file mode 100755 index 0000000..008a696 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_magical_c.vpcf_c differ diff --git a/particles/heroes/yukari/ability_yukari_04_magical_end.vpcf_c b/particles/heroes/yukari/ability_yukari_04_magical_end.vpcf_c new file mode 100755 index 0000000..9634805 Binary files /dev/null and b/particles/heroes/yukari/ability_yukari_04_magical_end.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01.vpcf_c new file mode 100755 index 0000000..f623b8d Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_a.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_a.vpcf_c new file mode 100755 index 0000000..9598c3a Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_a.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_a0.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_a0.vpcf_c new file mode 100755 index 0000000..962a20c Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_a0.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_b.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_b.vpcf_c new file mode 100755 index 0000000..f6a775c Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_b.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_c.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_c.vpcf_c new file mode 100755 index 0000000..f35a3f5 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_c.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_d.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_d.vpcf_c new file mode 100755 index 0000000..aca2709 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_d.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_ground.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_ground.vpcf_c new file mode 100755 index 0000000..8608f29 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_ground.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_ground_a.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_ground_a.vpcf_c new file mode 100755 index 0000000..7a906e4 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_ground_a.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_ground_a0.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_ground_a0.vpcf_c new file mode 100755 index 0000000..6b6e749 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_ground_a0.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_ground_a1.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_ground_a1.vpcf_c new file mode 100755 index 0000000..5bbc4d5 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_ground_a1.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_ground_a2.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_ground_a2.vpcf_c new file mode 100755 index 0000000..ccdc30c Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_ground_a2.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_ground_a3.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_ground_a3.vpcf_c new file mode 100755 index 0000000..2740e79 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_ground_a3.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_ground_a4.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_ground_a4.vpcf_c new file mode 100755 index 0000000..6d66e17 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_ground_a4.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_ground_a4a.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_ground_a4a.vpcf_c new file mode 100755 index 0000000..2b6d241 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_ground_a4a.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_ground_a4a0.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_ground_a4a0.vpcf_c new file mode 100755 index 0000000..6a28f6b Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_ground_a4a0.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_ground_a4a0a.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_ground_a4a0a.vpcf_c new file mode 100755 index 0000000..a6c5313 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_ground_a4a0a.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_ground_a5.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_ground_a5.vpcf_c new file mode 100755 index 0000000..894b652 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_ground_a5.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_01_ground_a6.vpcf_c b/particles/heroes/yumemi/ability_yumemi_01_ground_a6.vpcf_c new file mode 100755 index 0000000..a9af604 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_01_ground_a6.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_03_explosion.vpcf_c b/particles/heroes/yumemi/ability_yumemi_03_explosion.vpcf_c new file mode 100755 index 0000000..0fadd00 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_03_explosion.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_03_explosion_a.vpcf_c b/particles/heroes/yumemi/ability_yumemi_03_explosion_a.vpcf_c new file mode 100755 index 0000000..c274492 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_03_explosion_a.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_03_explosion_b.vpcf_c b/particles/heroes/yumemi/ability_yumemi_03_explosion_b.vpcf_c new file mode 100755 index 0000000..c502066 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_03_explosion_b.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_03_explosion_c.vpcf_c b/particles/heroes/yumemi/ability_yumemi_03_explosion_c.vpcf_c new file mode 100755 index 0000000..02e62f0 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_03_explosion_c.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_03_explosion_d.vpcf_c b/particles/heroes/yumemi/ability_yumemi_03_explosion_d.vpcf_c new file mode 100755 index 0000000..dcf7c0b Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_03_explosion_d.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_03_explosion_e.vpcf_c b/particles/heroes/yumemi/ability_yumemi_03_explosion_e.vpcf_c new file mode 100755 index 0000000..7e96efa Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_03_explosion_e.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_03_unit.vpcf_c b/particles/heroes/yumemi/ability_yumemi_03_unit.vpcf_c new file mode 100755 index 0000000..9b97828 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_03_unit.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_03_unit_a.vpcf_c b/particles/heroes/yumemi/ability_yumemi_03_unit_a.vpcf_c new file mode 100755 index 0000000..b0b7fe2 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_03_unit_a.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_03_unit_b.vpcf_c b/particles/heroes/yumemi/ability_yumemi_03_unit_b.vpcf_c new file mode 100755 index 0000000..3564cc1 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_03_unit_b.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_03_unit_c.vpcf_c b/particles/heroes/yumemi/ability_yumemi_03_unit_c.vpcf_c new file mode 100755 index 0000000..f1b6e08 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_03_unit_c.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04.vpcf_c new file mode 100755 index 0000000..9609623 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_a.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_a.vpcf_c new file mode 100755 index 0000000..b418d8e Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_a.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_b.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_b.vpcf_c new file mode 100755 index 0000000..d726706 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_b.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_c.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_c.vpcf_c new file mode 100755 index 0000000..92209e2 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_c.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_d.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_d.vpcf_c new file mode 100755 index 0000000..37c9d9b Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_d.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_e.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_e.vpcf_c new file mode 100755 index 0000000..5ce3ee7 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_e.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_exolosion.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_exolosion.vpcf_c new file mode 100755 index 0000000..09fcb5f Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_exolosion.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_exolosion_a.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_exolosion_a.vpcf_c new file mode 100755 index 0000000..1994e5d Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_exolosion_a.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_exolosion_b.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_exolosion_b.vpcf_c new file mode 100755 index 0000000..18a231e Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_exolosion_b.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_exolosion_c.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_exolosion_c.vpcf_c new file mode 100755 index 0000000..af89b52 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_exolosion_c.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_explosion_2.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_explosion_2.vpcf_c new file mode 100755 index 0000000..319b915 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_explosion_2.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_explosion_2_a.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_explosion_2_a.vpcf_c new file mode 100755 index 0000000..273abe5 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_explosion_2_a.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_explosion_2_b.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_explosion_2_b.vpcf_c new file mode 100755 index 0000000..6cca617 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_explosion_2_b.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_explosion_2_c.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_explosion_2_c.vpcf_c new file mode 100755 index 0000000..1f592ca Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_explosion_2_c.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_explosion_2_d.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_explosion_2_d.vpcf_c new file mode 100755 index 0000000..007421c Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_explosion_2_d.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_explosion_2_e.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_explosion_2_e.vpcf_c new file mode 100755 index 0000000..8707726 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_explosion_2_e.vpcf_c differ diff --git a/particles/heroes/yumemi/ability_yumemi_04_f.vpcf_c b/particles/heroes/yumemi/ability_yumemi_04_f.vpcf_c new file mode 100755 index 0000000..dd43300 Binary files /dev/null and b/particles/heroes/yumemi/ability_yumemi_04_f.vpcf_c differ diff --git a/particles/heroes/yumemi/yumemi_base_attack.vpcf_c b/particles/heroes/yumemi/yumemi_base_attack.vpcf_c new file mode 100755 index 0000000..701e6d5 Binary files /dev/null and b/particles/heroes/yumemi/yumemi_base_attack.vpcf_c differ diff --git a/particles/heroes/yumemi/yumemi_base_attack_a.vpcf_c b/particles/heroes/yumemi/yumemi_base_attack_a.vpcf_c new file mode 100755 index 0000000..0ac248c Binary files /dev/null and b/particles/heroes/yumemi/yumemi_base_attack_a.vpcf_c differ diff --git a/particles/heroes/yumemi/yumemi_base_attack_a0.vpcf_c b/particles/heroes/yumemi/yumemi_base_attack_a0.vpcf_c new file mode 100755 index 0000000..b21dece Binary files /dev/null and b/particles/heroes/yumemi/yumemi_base_attack_a0.vpcf_c differ diff --git a/particles/heroes/yumemi/yumemi_base_attack_b.vpcf_c b/particles/heroes/yumemi/yumemi_base_attack_b.vpcf_c new file mode 100755 index 0000000..98b2989 Binary files /dev/null and b/particles/heroes/yumemi/yumemi_base_attack_b.vpcf_c differ diff --git a/particles/heroes/yumemi/yumemi_base_attack_c.vpcf_c b/particles/heroes/yumemi/yumemi_base_attack_c.vpcf_c new file mode 100755 index 0000000..4eef30a Binary files /dev/null and b/particles/heroes/yumemi/yumemi_base_attack_c.vpcf_c differ diff --git a/particles/heroes/yuuka/ability_yuuka_03.vpcf_c b/particles/heroes/yuuka/ability_yuuka_03.vpcf_c new file mode 100755 index 0000000..8f9dbda Binary files /dev/null and b/particles/heroes/yuuka/ability_yuuka_03.vpcf_c differ diff --git a/particles/heroes/yuuka/ability_yuuka_03_a.vpcf_c b/particles/heroes/yuuka/ability_yuuka_03_a.vpcf_c new file mode 100755 index 0000000..3f66110 Binary files /dev/null and b/particles/heroes/yuuka/ability_yuuka_03_a.vpcf_c differ diff --git a/particles/heroes/yuuka/ability_yuuka_03_b.vpcf_c b/particles/heroes/yuuka/ability_yuuka_03_b.vpcf_c new file mode 100755 index 0000000..dcda05d Binary files /dev/null and b/particles/heroes/yuuka/ability_yuuka_03_b.vpcf_c differ diff --git a/particles/heroes/yuyuko/ability_yuyuko_04_effect.vpcf_c b/particles/heroes/yuyuko/ability_yuyuko_04_effect.vpcf_c new file mode 100755 index 0000000..20b61c2 Binary files /dev/null and b/particles/heroes/yuyuko/ability_yuyuko_04_effect.vpcf_c differ diff --git a/particles/heroes/yuyuko/ability_yuyuko_04_effect_a.vpcf_c b/particles/heroes/yuyuko/ability_yuyuko_04_effect_a.vpcf_c new file mode 100755 index 0000000..fbb52be Binary files /dev/null and b/particles/heroes/yuyuko/ability_yuyuko_04_effect_a.vpcf_c differ diff --git a/particles/heroes/yuyuko/ability_yuyuko_04_effect_b.vpcf_c b/particles/heroes/yuyuko/ability_yuyuko_04_effect_b.vpcf_c new file mode 100755 index 0000000..6317fec Binary files /dev/null and b/particles/heroes/yuyuko/ability_yuyuko_04_effect_b.vpcf_c differ diff --git a/particles/heroes/yuyuko/ability_yuyuko_04_effect_c.vpcf_c b/particles/heroes/yuyuko/ability_yuyuko_04_effect_c.vpcf_c new file mode 100755 index 0000000..21b40f4 Binary files /dev/null and b/particles/heroes/yuyuko/ability_yuyuko_04_effect_c.vpcf_c differ diff --git a/particles/heroes/yuyuko/ability_yuyuko_04_effect_d.vpcf_c b/particles/heroes/yuyuko/ability_yuyuko_04_effect_d.vpcf_c new file mode 100755 index 0000000..50c648b Binary files /dev/null and b/particles/heroes/yuyuko/ability_yuyuko_04_effect_d.vpcf_c differ diff --git a/particles/heroes/yuyuko/ability_yuyuko_04_effect_e.vpcf_c b/particles/heroes/yuyuko/ability_yuyuko_04_effect_e.vpcf_c new file mode 100755 index 0000000..da99bc2 Binary files /dev/null and b/particles/heroes/yuyuko/ability_yuyuko_04_effect_e.vpcf_c differ diff --git a/particles/heroes/yuyuko/ability_yuyuko_04_effect_f.vpcf_c b/particles/heroes/yuyuko/ability_yuyuko_04_effect_f.vpcf_c new file mode 100755 index 0000000..a188a56 Binary files /dev/null and b/particles/heroes/yuyuko/ability_yuyuko_04_effect_f.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3.vpcf_c b/particles/imagine_assets/courier_fx/courier_3.vpcf_c new file mode 100755 index 0000000..83d2eff Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3_coins.vpcf_c b/particles/imagine_assets/courier_fx/courier_3_coins.vpcf_c new file mode 100755 index 0000000..f0a6d76 Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3_coins.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3_energy.vpcf_c b/particles/imagine_assets/courier_fx/courier_3_energy.vpcf_c new file mode 100755 index 0000000..b049bef Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3_energy.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3_eye.vpcf_c b/particles/imagine_assets/courier_fx/courier_3_eye.vpcf_c new file mode 100755 index 0000000..a3fb1d7 Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3_eye.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3_eye_twinkle.vpcf_c b/particles/imagine_assets/courier_fx/courier_3_eye_twinkle.vpcf_c new file mode 100755 index 0000000..b48511f Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3_eye_twinkle.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3_gold_glow.vpcf_c b/particles/imagine_assets/courier_fx/courier_3_gold_glow.vpcf_c new file mode 100755 index 0000000..ab3097d Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3_gold_glow.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3_gold_highlight.vpcf_c b/particles/imagine_assets/courier_fx/courier_3_gold_highlight.vpcf_c new file mode 100755 index 0000000..c6d70b6 Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3_gold_highlight.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3_gold_twinkle.vpcf_c b/particles/imagine_assets/courier_fx/courier_3_gold_twinkle.vpcf_c new file mode 100755 index 0000000..117319e Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3_gold_twinkle.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3_magic.vpcf_c b/particles/imagine_assets/courier_fx/courier_3_magic.vpcf_c new file mode 100755 index 0000000..aea2655 Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3_magic.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3_shine.vpcf_c b/particles/imagine_assets/courier_fx/courier_3_shine.vpcf_c new file mode 100755 index 0000000..2955437 Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3_shine.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3_soft_smoke.vpcf_c b/particles/imagine_assets/courier_fx/courier_3_soft_smoke.vpcf_c new file mode 100755 index 0000000..f3d1079 Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3_soft_smoke.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3_trail.vpcf_c b/particles/imagine_assets/courier_fx/courier_3_trail.vpcf_c new file mode 100755 index 0000000..1a545eb Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3_trail.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_3_twinkle.vpcf_c b/particles/imagine_assets/courier_fx/courier_3_twinkle.vpcf_c new file mode 100755 index 0000000..0daefee Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_3_twinkle.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_fx_2.vpcf_c b/particles/imagine_assets/courier_fx/courier_fx_2.vpcf_c new file mode 100755 index 0000000..a1582d4 Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_fx_2.vpcf_c differ diff --git a/particles/imagine_assets/courier_fx/courier_status_effect_effigy_gold_01.vpcf_c b/particles/imagine_assets/courier_fx/courier_status_effect_effigy_gold_01.vpcf_c new file mode 100755 index 0000000..ad1b18c Binary files /dev/null and b/particles/imagine_assets/courier_fx/courier_status_effect_effigy_gold_01.vpcf_c differ diff --git a/particles/items2_fx/skadi_projectile_copy.vpcf_c b/particles/items2_fx/skadi_projectile_copy.vpcf_c new file mode 100755 index 0000000..21a271e Binary files /dev/null and b/particles/items2_fx/skadi_projectile_copy.vpcf_c differ diff --git a/particles/items2_fx/skadi_projectile_explosion_flakes.vpcf_c b/particles/items2_fx/skadi_projectile_explosion_flakes.vpcf_c new file mode 100755 index 0000000..899c50e Binary files /dev/null and b/particles/items2_fx/skadi_projectile_explosion_flakes.vpcf_c differ diff --git a/particles/items2_fx/skadi_projectile_trail.vpcf_c b/particles/items2_fx/skadi_projectile_trail.vpcf_c new file mode 100755 index 0000000..fb44751 Binary files /dev/null and b/particles/items2_fx/skadi_projectile_trail.vpcf_c differ diff --git a/particles/items2_fx/skadi_projectile_trail_bits.vpcf_c b/particles/items2_fx/skadi_projectile_trail_bits.vpcf_c new file mode 100755 index 0000000..d35f7e6 Binary files /dev/null and b/particles/items2_fx/skadi_projectile_trail_bits.vpcf_c differ diff --git a/particles/items2_fx/skadi_projectile_trail_glow.vpcf_c b/particles/items2_fx/skadi_projectile_trail_glow.vpcf_c new file mode 100755 index 0000000..d88d431 Binary files /dev/null and b/particles/items2_fx/skadi_projectile_trail_glow.vpcf_c differ diff --git a/particles/jugg_weapon_glow_variation_jade.vpcf_c b/particles/jugg_weapon_glow_variation_jade.vpcf_c new file mode 100755 index 0000000..2a46d10 Binary files /dev/null and b/particles/jugg_weapon_glow_variation_jade.vpcf_c differ diff --git a/particles/models/td/card_bar_fx.vsnap_c b/particles/models/td/card_bar_fx.vsnap_c new file mode 100755 index 0000000..aad11c7 Binary files /dev/null and b/particles/models/td/card_bar_fx.vsnap_c differ diff --git a/particles/msg_fx/msg_poison.vpcf_c b/particles/msg_fx/msg_poison.vpcf_c new file mode 100755 index 0000000..0b5a523 Binary files /dev/null and b/particles/msg_fx/msg_poison.vpcf_c differ diff --git a/particles/new/ranged_siege_bad.vpcf_c b/particles/new/ranged_siege_bad.vpcf_c new file mode 100755 index 0000000..cfe7c2a Binary files /dev/null and b/particles/new/ranged_siege_bad.vpcf_c differ diff --git a/particles/new/ranged_siege_explosion.vpcf_c b/particles/new/ranged_siege_explosion.vpcf_c new file mode 100755 index 0000000..d83ec59 Binary files /dev/null and b/particles/new/ranged_siege_explosion.vpcf_c differ diff --git a/particles/new/ranged_siege_explosion_flash_b.vpcf_c b/particles/new/ranged_siege_explosion_flash_b.vpcf_c new file mode 100755 index 0000000..90568a3 Binary files /dev/null and b/particles/new/ranged_siege_explosion_flash_b.vpcf_c differ diff --git a/particles/new/ranged_siege_explosion_flash_c.vpcf_c b/particles/new/ranged_siege_explosion_flash_c.vpcf_c new file mode 100755 index 0000000..82eb91a Binary files /dev/null and b/particles/new/ranged_siege_explosion_flash_c.vpcf_c differ diff --git a/particles/new/ranged_siege_model.vpcf_c b/particles/new/ranged_siege_model.vpcf_c new file mode 100755 index 0000000..f7de492 Binary files /dev/null and b/particles/new/ranged_siege_model.vpcf_c differ diff --git a/particles/particles/imagine_assets/courier_fx/rainbow_tail.vpcf_c b/particles/particles/imagine_assets/courier_fx/rainbow_tail.vpcf_c new file mode 100755 index 0000000..b3f2d26 Binary files /dev/null and b/particles/particles/imagine_assets/courier_fx/rainbow_tail.vpcf_c differ diff --git a/particles/particles/imagine_assets/courier_fx/rainbow_tail_b.vpcf_c b/particles/particles/imagine_assets/courier_fx/rainbow_tail_b.vpcf_c new file mode 100755 index 0000000..1a996f8 Binary files /dev/null and b/particles/particles/imagine_assets/courier_fx/rainbow_tail_b.vpcf_c differ diff --git a/particles/particles/imagine_assets/courier_fx/rainbow_tail_d.vpcf_c b/particles/particles/imagine_assets/courier_fx/rainbow_tail_d.vpcf_c new file mode 100755 index 0000000..8be63f8 Binary files /dev/null and b/particles/particles/imagine_assets/courier_fx/rainbow_tail_d.vpcf_c differ diff --git a/particles/particles/imagine_assets/courier_fx/rainbow_tail_e.vpcf_c b/particles/particles/imagine_assets/courier_fx/rainbow_tail_e.vpcf_c new file mode 100755 index 0000000..0195b44 Binary files /dev/null and b/particles/particles/imagine_assets/courier_fx/rainbow_tail_e.vpcf_c differ diff --git a/particles/particles/imagine_assets/courier_fx/rainbow_tail_g.vpcf_c b/particles/particles/imagine_assets/courier_fx/rainbow_tail_g.vpcf_c new file mode 100755 index 0000000..f5fa505 Binary files /dev/null and b/particles/particles/imagine_assets/courier_fx/rainbow_tail_g.vpcf_c differ diff --git a/particles/particles/imagine_assets/courier_fx/rainbow_tail_i.vpcf_c b/particles/particles/imagine_assets/courier_fx/rainbow_tail_i.vpcf_c new file mode 100755 index 0000000..effb8ac Binary files /dev/null and b/particles/particles/imagine_assets/courier_fx/rainbow_tail_i.vpcf_c differ diff --git a/particles/portraits/alice/thtd_alice_portraits.vpcf_c b/particles/portraits/alice/thtd_alice_portraits.vpcf_c new file mode 100755 index 0000000..f8532af Binary files /dev/null and b/particles/portraits/alice/thtd_alice_portraits.vpcf_c differ diff --git a/particles/portraits/alice/thtd_alice_portraits_a.vpcf_c b/particles/portraits/alice/thtd_alice_portraits_a.vpcf_c new file mode 100755 index 0000000..943a04f Binary files /dev/null and b/particles/portraits/alice/thtd_alice_portraits_a.vpcf_c differ diff --git a/particles/portraits/aya/thtd_aya_portraits.vpcf_c b/particles/portraits/aya/thtd_aya_portraits.vpcf_c new file mode 100755 index 0000000..a810681 Binary files /dev/null and b/particles/portraits/aya/thtd_aya_portraits.vpcf_c differ diff --git a/particles/portraits/aya/thtd_aya_portraits_a.vpcf_c b/particles/portraits/aya/thtd_aya_portraits_a.vpcf_c new file mode 100755 index 0000000..aa98a8a Binary files /dev/null and b/particles/portraits/aya/thtd_aya_portraits_a.vpcf_c differ diff --git a/particles/portraits/byakuren/thtd_byakuren_portraits.vpcf_c b/particles/portraits/byakuren/thtd_byakuren_portraits.vpcf_c new file mode 100755 index 0000000..4a904d8 Binary files /dev/null and b/particles/portraits/byakuren/thtd_byakuren_portraits.vpcf_c differ diff --git a/particles/portraits/byakuren/thtd_byakuren_portraits_a.vpcf_c b/particles/portraits/byakuren/thtd_byakuren_portraits_a.vpcf_c new file mode 100755 index 0000000..86b4d38 Binary files /dev/null and b/particles/portraits/byakuren/thtd_byakuren_portraits_a.vpcf_c differ diff --git a/particles/portraits/chen/thtd_chen_portraits.vpcf_c b/particles/portraits/chen/thtd_chen_portraits.vpcf_c new file mode 100755 index 0000000..8487d4d Binary files /dev/null and b/particles/portraits/chen/thtd_chen_portraits.vpcf_c differ diff --git a/particles/portraits/chen/thtd_chen_portraits_a.vpcf_c b/particles/portraits/chen/thtd_chen_portraits_a.vpcf_c new file mode 100755 index 0000000..7d06079 Binary files /dev/null and b/particles/portraits/chen/thtd_chen_portraits_a.vpcf_c differ diff --git a/particles/portraits/cirno/thtd_cirno_portraits.vpcf_c b/particles/portraits/cirno/thtd_cirno_portraits.vpcf_c new file mode 100755 index 0000000..26aa776 Binary files /dev/null and b/particles/portraits/cirno/thtd_cirno_portraits.vpcf_c differ diff --git a/particles/portraits/cirno/thtd_cirno_portraits_a.vpcf_c b/particles/portraits/cirno/thtd_cirno_portraits_a.vpcf_c new file mode 100755 index 0000000..68cb8f3 Binary files /dev/null and b/particles/portraits/cirno/thtd_cirno_portraits_a.vpcf_c differ diff --git a/particles/portraits/clownpiece/thtd_clownpiece_portraits.vpcf_c b/particles/portraits/clownpiece/thtd_clownpiece_portraits.vpcf_c new file mode 100755 index 0000000..4d514ea Binary files /dev/null and b/particles/portraits/clownpiece/thtd_clownpiece_portraits.vpcf_c differ diff --git a/particles/portraits/clownpiece/thtd_clownpiece_portraits_a.vpcf_c b/particles/portraits/clownpiece/thtd_clownpiece_portraits_a.vpcf_c new file mode 100755 index 0000000..61edf9f Binary files /dev/null and b/particles/portraits/clownpiece/thtd_clownpiece_portraits_a.vpcf_c differ diff --git a/particles/portraits/daiyousei/thtd_daiyousei_portraits.vpcf_c b/particles/portraits/daiyousei/thtd_daiyousei_portraits.vpcf_c new file mode 100755 index 0000000..9978a5a Binary files /dev/null and b/particles/portraits/daiyousei/thtd_daiyousei_portraits.vpcf_c differ diff --git a/particles/portraits/daiyousei/thtd_daiyousei_portraits_a.vpcf_c b/particles/portraits/daiyousei/thtd_daiyousei_portraits_a.vpcf_c new file mode 100755 index 0000000..c06a635 Binary files /dev/null and b/particles/portraits/daiyousei/thtd_daiyousei_portraits_a.vpcf_c differ diff --git a/particles/portraits/eirin/thtd_eirin_portraits.vpcf_c b/particles/portraits/eirin/thtd_eirin_portraits.vpcf_c new file mode 100755 index 0000000..2277c2e Binary files /dev/null and b/particles/portraits/eirin/thtd_eirin_portraits.vpcf_c differ diff --git a/particles/portraits/eirin/thtd_eirin_portraits_a.vpcf_c b/particles/portraits/eirin/thtd_eirin_portraits_a.vpcf_c new file mode 100755 index 0000000..eff7c05 Binary files /dev/null and b/particles/portraits/eirin/thtd_eirin_portraits_a.vpcf_c differ diff --git a/particles/portraits/elly/thtd_elly_portraits.vpcf_c b/particles/portraits/elly/thtd_elly_portraits.vpcf_c new file mode 100755 index 0000000..bda08f6 Binary files /dev/null and b/particles/portraits/elly/thtd_elly_portraits.vpcf_c differ diff --git a/particles/portraits/elly/thtd_elly_portraits_a.vpcf_c b/particles/portraits/elly/thtd_elly_portraits_a.vpcf_c new file mode 100755 index 0000000..f11b2a1 Binary files /dev/null and b/particles/portraits/elly/thtd_elly_portraits_a.vpcf_c differ diff --git a/particles/portraits/flandre/thtd_flandre_portraits.vpcf_c b/particles/portraits/flandre/thtd_flandre_portraits.vpcf_c new file mode 100755 index 0000000..a0ae6aa Binary files /dev/null and b/particles/portraits/flandre/thtd_flandre_portraits.vpcf_c differ diff --git a/particles/portraits/flandre/thtd_flandre_portraits_a.vpcf_c b/particles/portraits/flandre/thtd_flandre_portraits_a.vpcf_c new file mode 100755 index 0000000..3e3be87 Binary files /dev/null and b/particles/portraits/flandre/thtd_flandre_portraits_a.vpcf_c differ diff --git a/particles/portraits/futo/thtd_futo_portraits.vpcf_c b/particles/portraits/futo/thtd_futo_portraits.vpcf_c new file mode 100755 index 0000000..e0da189 Binary files /dev/null and b/particles/portraits/futo/thtd_futo_portraits.vpcf_c differ diff --git a/particles/portraits/futo/thtd_futo_portraits_a.vpcf_c b/particles/portraits/futo/thtd_futo_portraits_a.vpcf_c new file mode 100755 index 0000000..8dda9eb Binary files /dev/null and b/particles/portraits/futo/thtd_futo_portraits_a.vpcf_c differ diff --git a/particles/portraits/gengetu/thtd_gengetu_portraits.vpcf_c b/particles/portraits/gengetu/thtd_gengetu_portraits.vpcf_c new file mode 100755 index 0000000..eb60fe9 Binary files /dev/null and b/particles/portraits/gengetu/thtd_gengetu_portraits.vpcf_c differ diff --git a/particles/portraits/gengetu/thtd_gengetu_portraits_a.vpcf_c b/particles/portraits/gengetu/thtd_gengetu_portraits_a.vpcf_c new file mode 100755 index 0000000..175eff7 Binary files /dev/null and b/particles/portraits/gengetu/thtd_gengetu_portraits_a.vpcf_c differ diff --git a/particles/portraits/hatate/thtd_hatate_portraits.vpcf_c b/particles/portraits/hatate/thtd_hatate_portraits.vpcf_c new file mode 100755 index 0000000..8d02c41 Binary files /dev/null and b/particles/portraits/hatate/thtd_hatate_portraits.vpcf_c differ diff --git a/particles/portraits/hatate/thtd_hatate_portraits_a.vpcf_c b/particles/portraits/hatate/thtd_hatate_portraits_a.vpcf_c new file mode 100755 index 0000000..b06f753 Binary files /dev/null and b/particles/portraits/hatate/thtd_hatate_portraits_a.vpcf_c differ diff --git a/particles/portraits/hecatia/thtd_hecatia_portraits.vpcf_c b/particles/portraits/hecatia/thtd_hecatia_portraits.vpcf_c new file mode 100755 index 0000000..b8ae1c2 Binary files /dev/null and b/particles/portraits/hecatia/thtd_hecatia_portraits.vpcf_c differ diff --git a/particles/portraits/hecatia/thtd_hecatia_portraits_a.vpcf_c b/particles/portraits/hecatia/thtd_hecatia_portraits_a.vpcf_c new file mode 100755 index 0000000..5301118 Binary files /dev/null and b/particles/portraits/hecatia/thtd_hecatia_portraits_a.vpcf_c differ diff --git a/particles/portraits/hina/thtd_hina_portraits.vpcf_c b/particles/portraits/hina/thtd_hina_portraits.vpcf_c new file mode 100755 index 0000000..61b1e8d Binary files /dev/null and b/particles/portraits/hina/thtd_hina_portraits.vpcf_c differ diff --git a/particles/portraits/hina/thtd_hina_portraits_a.vpcf_c b/particles/portraits/hina/thtd_hina_portraits_a.vpcf_c new file mode 100755 index 0000000..91d38ad Binary files /dev/null and b/particles/portraits/hina/thtd_hina_portraits_a.vpcf_c differ diff --git a/particles/portraits/iku/thtd_iku_portraits.vpcf_c b/particles/portraits/iku/thtd_iku_portraits.vpcf_c new file mode 100755 index 0000000..09c3e08 Binary files /dev/null and b/particles/portraits/iku/thtd_iku_portraits.vpcf_c differ diff --git a/particles/portraits/iku/thtd_iku_portraits_a.vpcf_c b/particles/portraits/iku/thtd_iku_portraits_a.vpcf_c new file mode 100755 index 0000000..0dca0ac Binary files /dev/null and b/particles/portraits/iku/thtd_iku_portraits_a.vpcf_c differ diff --git a/particles/portraits/inaba/thtd_inaba_portraits.vpcf_c b/particles/portraits/inaba/thtd_inaba_portraits.vpcf_c new file mode 100755 index 0000000..af18c9e Binary files /dev/null and b/particles/portraits/inaba/thtd_inaba_portraits.vpcf_c differ diff --git a/particles/portraits/inaba/thtd_inaba_portraits_a.vpcf_c b/particles/portraits/inaba/thtd_inaba_portraits_a.vpcf_c new file mode 100755 index 0000000..86b926e Binary files /dev/null and b/particles/portraits/inaba/thtd_inaba_portraits_a.vpcf_c differ diff --git a/particles/portraits/junko/thtd_junko_portraits.vpcf_c b/particles/portraits/junko/thtd_junko_portraits.vpcf_c new file mode 100755 index 0000000..21f5b06 Binary files /dev/null and b/particles/portraits/junko/thtd_junko_portraits.vpcf_c differ diff --git a/particles/portraits/junko/thtd_junko_portraits_a.vpcf_c b/particles/portraits/junko/thtd_junko_portraits_a.vpcf_c new file mode 100755 index 0000000..2943324 Binary files /dev/null and b/particles/portraits/junko/thtd_junko_portraits_a.vpcf_c differ diff --git a/particles/portraits/kagerou/thtd_kagerou_portraits.vpcf_c b/particles/portraits/kagerou/thtd_kagerou_portraits.vpcf_c new file mode 100755 index 0000000..a261290 Binary files /dev/null and b/particles/portraits/kagerou/thtd_kagerou_portraits.vpcf_c differ diff --git a/particles/portraits/kagerou/thtd_kagerou_portraits_a.vpcf_c b/particles/portraits/kagerou/thtd_kagerou_portraits_a.vpcf_c new file mode 100755 index 0000000..4db6acb Binary files /dev/null and b/particles/portraits/kagerou/thtd_kagerou_portraits_a.vpcf_c differ diff --git a/particles/portraits/kaguya/thtd_kaguya_portraits.vpcf_c b/particles/portraits/kaguya/thtd_kaguya_portraits.vpcf_c new file mode 100755 index 0000000..4338b34 Binary files /dev/null and b/particles/portraits/kaguya/thtd_kaguya_portraits.vpcf_c differ diff --git a/particles/portraits/kaguya/thtd_kaguya_portraits_a.vpcf_c b/particles/portraits/kaguya/thtd_kaguya_portraits_a.vpcf_c new file mode 100755 index 0000000..02b21f2 Binary files /dev/null and b/particles/portraits/kaguya/thtd_kaguya_portraits_a.vpcf_c differ diff --git a/particles/portraits/kanako/thtd_kanako_portraits.vpcf_c b/particles/portraits/kanako/thtd_kanako_portraits.vpcf_c new file mode 100755 index 0000000..039a23d Binary files /dev/null and b/particles/portraits/kanako/thtd_kanako_portraits.vpcf_c differ diff --git a/particles/portraits/kanako/thtd_kanako_portraits_a.vpcf_c b/particles/portraits/kanako/thtd_kanako_portraits_a.vpcf_c new file mode 100755 index 0000000..aa00c1c Binary files /dev/null and b/particles/portraits/kanako/thtd_kanako_portraits_a.vpcf_c differ diff --git a/particles/portraits/keine/thtd_keine_portraits.vpcf_c b/particles/portraits/keine/thtd_keine_portraits.vpcf_c new file mode 100755 index 0000000..cdb2df3 Binary files /dev/null and b/particles/portraits/keine/thtd_keine_portraits.vpcf_c differ diff --git a/particles/portraits/keine/thtd_keine_portraits_a.vpcf_c b/particles/portraits/keine/thtd_keine_portraits_a.vpcf_c new file mode 100755 index 0000000..9bf5448 Binary files /dev/null and b/particles/portraits/keine/thtd_keine_portraits_a.vpcf_c differ diff --git a/particles/portraits/kishin/thtd_kishin_portraits.vpcf_c b/particles/portraits/kishin/thtd_kishin_portraits.vpcf_c new file mode 100755 index 0000000..5c811f3 Binary files /dev/null and b/particles/portraits/kishin/thtd_kishin_portraits.vpcf_c differ diff --git a/particles/portraits/kishin/thtd_kishin_portraits_a.vpcf_c b/particles/portraits/kishin/thtd_kishin_portraits_a.vpcf_c new file mode 100755 index 0000000..08328c2 Binary files /dev/null and b/particles/portraits/kishin/thtd_kishin_portraits_a.vpcf_c differ diff --git a/particles/portraits/kisume/thtd_kisume_portraits.vpcf_c b/particles/portraits/kisume/thtd_kisume_portraits.vpcf_c new file mode 100755 index 0000000..1e4943f Binary files /dev/null and b/particles/portraits/kisume/thtd_kisume_portraits.vpcf_c differ diff --git a/particles/portraits/kisume/thtd_kisume_portraits_a.vpcf_c b/particles/portraits/kisume/thtd_kisume_portraits_a.vpcf_c new file mode 100755 index 0000000..3e47732 Binary files /dev/null and b/particles/portraits/kisume/thtd_kisume_portraits_a.vpcf_c differ diff --git a/particles/portraits/koakuma/thtd_koakuma_portraits.vpcf_c b/particles/portraits/koakuma/thtd_koakuma_portraits.vpcf_c new file mode 100755 index 0000000..b52d0d0 Binary files /dev/null and b/particles/portraits/koakuma/thtd_koakuma_portraits.vpcf_c differ diff --git a/particles/portraits/koakuma/thtd_koakuma_portraits_a.vpcf_c b/particles/portraits/koakuma/thtd_koakuma_portraits_a.vpcf_c new file mode 100755 index 0000000..e382810 Binary files /dev/null and b/particles/portraits/koakuma/thtd_koakuma_portraits_a.vpcf_c differ diff --git a/particles/portraits/kogasa/thtd_kogasa_portraits.vpcf_c b/particles/portraits/kogasa/thtd_kogasa_portraits.vpcf_c new file mode 100755 index 0000000..ea44f2f Binary files /dev/null and b/particles/portraits/kogasa/thtd_kogasa_portraits.vpcf_c differ diff --git a/particles/portraits/kogasa/thtd_kogasa_portraits_a.vpcf_c b/particles/portraits/kogasa/thtd_kogasa_portraits_a.vpcf_c new file mode 100755 index 0000000..748d3c1 Binary files /dev/null and b/particles/portraits/kogasa/thtd_kogasa_portraits_a.vpcf_c differ diff --git a/particles/portraits/koishi/thtd_koishi_portraits.vpcf_c b/particles/portraits/koishi/thtd_koishi_portraits.vpcf_c new file mode 100755 index 0000000..92605b1 Binary files /dev/null and b/particles/portraits/koishi/thtd_koishi_portraits.vpcf_c differ diff --git a/particles/portraits/koishi/thtd_koishi_portraits_a.vpcf_c b/particles/portraits/koishi/thtd_koishi_portraits_a.vpcf_c new file mode 100755 index 0000000..11f98c7 Binary files /dev/null and b/particles/portraits/koishi/thtd_koishi_portraits_a.vpcf_c differ diff --git a/particles/portraits/kokoro/thtd_kokoro_portraits.vpcf_c b/particles/portraits/kokoro/thtd_kokoro_portraits.vpcf_c new file mode 100755 index 0000000..c691d7d Binary files /dev/null and b/particles/portraits/kokoro/thtd_kokoro_portraits.vpcf_c differ diff --git a/particles/portraits/kokoro/thtd_kokoro_portraits_a.vpcf_c b/particles/portraits/kokoro/thtd_kokoro_portraits_a.vpcf_c new file mode 100755 index 0000000..0290936 Binary files /dev/null and b/particles/portraits/kokoro/thtd_kokoro_portraits_a.vpcf_c differ diff --git a/particles/portraits/komachi/thtd_komachi_portraits.vpcf_c b/particles/portraits/komachi/thtd_komachi_portraits.vpcf_c new file mode 100755 index 0000000..aa3ac5d Binary files /dev/null and b/particles/portraits/komachi/thtd_komachi_portraits.vpcf_c differ diff --git a/particles/portraits/komachi/thtd_komachi_portraits_a.vpcf_c b/particles/portraits/komachi/thtd_komachi_portraits_a.vpcf_c new file mode 100755 index 0000000..77a1b27 Binary files /dev/null and b/particles/portraits/komachi/thtd_komachi_portraits_a.vpcf_c differ diff --git a/particles/portraits/kyouko/thtd_kyouko_portraits.vpcf_c b/particles/portraits/kyouko/thtd_kyouko_portraits.vpcf_c new file mode 100755 index 0000000..9b8e9bc Binary files /dev/null and b/particles/portraits/kyouko/thtd_kyouko_portraits.vpcf_c differ diff --git a/particles/portraits/kyouko/thtd_kyouko_portraits_a.vpcf_c b/particles/portraits/kyouko/thtd_kyouko_portraits_a.vpcf_c new file mode 100755 index 0000000..99b9e48 Binary files /dev/null and b/particles/portraits/kyouko/thtd_kyouko_portraits_a.vpcf_c differ diff --git a/particles/portraits/letty/thtd_letty_portraits.vpcf_c b/particles/portraits/letty/thtd_letty_portraits.vpcf_c new file mode 100755 index 0000000..a26788f Binary files /dev/null and b/particles/portraits/letty/thtd_letty_portraits.vpcf_c differ diff --git a/particles/portraits/letty/thtd_letty_portraits_a.vpcf_c b/particles/portraits/letty/thtd_letty_portraits_a.vpcf_c new file mode 100755 index 0000000..40c80b3 Binary files /dev/null and b/particles/portraits/letty/thtd_letty_portraits_a.vpcf_c differ diff --git a/particles/portraits/lily/thtd_lily_portraits.vpcf_c b/particles/portraits/lily/thtd_lily_portraits.vpcf_c new file mode 100755 index 0000000..930379c Binary files /dev/null and b/particles/portraits/lily/thtd_lily_portraits.vpcf_c differ diff --git a/particles/portraits/lily/thtd_lily_portraits_a.vpcf_c b/particles/portraits/lily/thtd_lily_portraits_a.vpcf_c new file mode 100755 index 0000000..daed090 Binary files /dev/null and b/particles/portraits/lily/thtd_lily_portraits_a.vpcf_c differ diff --git a/particles/portraits/lina/thtd_lina_portraits.vpcf_c b/particles/portraits/lina/thtd_lina_portraits.vpcf_c new file mode 100755 index 0000000..e079562 Binary files /dev/null and b/particles/portraits/lina/thtd_lina_portraits.vpcf_c differ diff --git a/particles/portraits/lina/thtd_lina_portraits_a.vpcf_c b/particles/portraits/lina/thtd_lina_portraits_a.vpcf_c new file mode 100755 index 0000000..1236442 Binary files /dev/null and b/particles/portraits/lina/thtd_lina_portraits_a.vpcf_c differ diff --git a/particles/portraits/lina/thtd_lina_portraits_b.vpcf_c b/particles/portraits/lina/thtd_lina_portraits_b.vpcf_c new file mode 100755 index 0000000..2e37fc2 Binary files /dev/null and b/particles/portraits/lina/thtd_lina_portraits_b.vpcf_c differ diff --git a/particles/portraits/luna/thtd_luna_portraits.vpcf_c b/particles/portraits/luna/thtd_luna_portraits.vpcf_c new file mode 100755 index 0000000..c666a25 Binary files /dev/null and b/particles/portraits/luna/thtd_luna_portraits.vpcf_c differ diff --git a/particles/portraits/luna/thtd_luna_portraits_a.vpcf_c b/particles/portraits/luna/thtd_luna_portraits_a.vpcf_c new file mode 100755 index 0000000..d9d6a74 Binary files /dev/null and b/particles/portraits/luna/thtd_luna_portraits_a.vpcf_c differ diff --git a/particles/portraits/lunasa/thtd_lunasa_portraits.vpcf_c b/particles/portraits/lunasa/thtd_lunasa_portraits.vpcf_c new file mode 100755 index 0000000..32dd37a Binary files /dev/null and b/particles/portraits/lunasa/thtd_lunasa_portraits.vpcf_c differ diff --git a/particles/portraits/lunasa/thtd_lunasa_portraits_a.vpcf_c b/particles/portraits/lunasa/thtd_lunasa_portraits_a.vpcf_c new file mode 100755 index 0000000..bdfd4a9 Binary files /dev/null and b/particles/portraits/lunasa/thtd_lunasa_portraits_a.vpcf_c differ diff --git a/particles/portraits/lyrica/thtd_lyrica_portraits.vpcf_c b/particles/portraits/lyrica/thtd_lyrica_portraits.vpcf_c new file mode 100755 index 0000000..4ac8e4b Binary files /dev/null and b/particles/portraits/lyrica/thtd_lyrica_portraits.vpcf_c differ diff --git a/particles/portraits/lyrica/thtd_lyrica_portraits_a.vpcf_c b/particles/portraits/lyrica/thtd_lyrica_portraits_a.vpcf_c new file mode 100755 index 0000000..7856ba2 Binary files /dev/null and b/particles/portraits/lyrica/thtd_lyrica_portraits_a.vpcf_c differ diff --git a/particles/portraits/mamizou/thtd_mamizou_portraits.vpcf_c b/particles/portraits/mamizou/thtd_mamizou_portraits.vpcf_c new file mode 100755 index 0000000..48cd972 Binary files /dev/null and b/particles/portraits/mamizou/thtd_mamizou_portraits.vpcf_c differ diff --git a/particles/portraits/mamizou/thtd_mamizou_portraits_a.vpcf_c b/particles/portraits/mamizou/thtd_mamizou_portraits_a.vpcf_c new file mode 100755 index 0000000..14785c4 Binary files /dev/null and b/particles/portraits/mamizou/thtd_mamizou_portraits_a.vpcf_c differ diff --git a/particles/portraits/maribel/thtd_maribel_portraits.vpcf_c b/particles/portraits/maribel/thtd_maribel_portraits.vpcf_c new file mode 100755 index 0000000..a0999b9 Binary files /dev/null and b/particles/portraits/maribel/thtd_maribel_portraits.vpcf_c differ diff --git a/particles/portraits/maribel/thtd_maribel_portraits_a.vpcf_c b/particles/portraits/maribel/thtd_maribel_portraits_a.vpcf_c new file mode 100755 index 0000000..7f6b299 Binary files /dev/null and b/particles/portraits/maribel/thtd_maribel_portraits_a.vpcf_c differ diff --git a/particles/portraits/marisa/thtd_marisa_portraits.vpcf_c b/particles/portraits/marisa/thtd_marisa_portraits.vpcf_c new file mode 100755 index 0000000..afb7019 Binary files /dev/null and b/particles/portraits/marisa/thtd_marisa_portraits.vpcf_c differ diff --git a/particles/portraits/marisa/thtd_marisa_portraits_a.vpcf_c b/particles/portraits/marisa/thtd_marisa_portraits_a.vpcf_c new file mode 100755 index 0000000..f05cde0 Binary files /dev/null and b/particles/portraits/marisa/thtd_marisa_portraits_a.vpcf_c differ diff --git a/particles/portraits/matara/thtd_matara_portraits.vpcf_c b/particles/portraits/matara/thtd_matara_portraits.vpcf_c new file mode 100755 index 0000000..9f30f1d Binary files /dev/null and b/particles/portraits/matara/thtd_matara_portraits.vpcf_c differ diff --git a/particles/portraits/matara/thtd_matara_portraits_a.vpcf_c b/particles/portraits/matara/thtd_matara_portraits_a.vpcf_c new file mode 100755 index 0000000..ed58284 Binary files /dev/null and b/particles/portraits/matara/thtd_matara_portraits_a.vpcf_c differ diff --git a/particles/portraits/medicine/thtd_medicine_portraits.vpcf_c b/particles/portraits/medicine/thtd_medicine_portraits.vpcf_c new file mode 100755 index 0000000..f348d75 Binary files /dev/null and b/particles/portraits/medicine/thtd_medicine_portraits.vpcf_c differ diff --git a/particles/portraits/medicine/thtd_medicine_portraits_a.vpcf_c b/particles/portraits/medicine/thtd_medicine_portraits_a.vpcf_c new file mode 100755 index 0000000..9501422 Binary files /dev/null and b/particles/portraits/medicine/thtd_medicine_portraits_a.vpcf_c differ diff --git a/particles/portraits/meirin/thtd_meirin_portraits.vpcf_c b/particles/portraits/meirin/thtd_meirin_portraits.vpcf_c new file mode 100755 index 0000000..9f3c009 Binary files /dev/null and b/particles/portraits/meirin/thtd_meirin_portraits.vpcf_c differ diff --git a/particles/portraits/meirin/thtd_meirin_portraits_a.vpcf_c b/particles/portraits/meirin/thtd_meirin_portraits_a.vpcf_c new file mode 100755 index 0000000..aab7665 Binary files /dev/null and b/particles/portraits/meirin/thtd_meirin_portraits_a.vpcf_c differ diff --git a/particles/portraits/merlin/thtd_merlin_portraits.vpcf_c b/particles/portraits/merlin/thtd_merlin_portraits.vpcf_c new file mode 100755 index 0000000..40f9e1c Binary files /dev/null and b/particles/portraits/merlin/thtd_merlin_portraits.vpcf_c differ diff --git a/particles/portraits/merlin/thtd_merlin_portraits_a.vpcf_c b/particles/portraits/merlin/thtd_merlin_portraits_a.vpcf_c new file mode 100755 index 0000000..f7bd1cf Binary files /dev/null and b/particles/portraits/merlin/thtd_merlin_portraits_a.vpcf_c differ diff --git a/particles/portraits/miko/thtd_miko_portraits.vpcf_c b/particles/portraits/miko/thtd_miko_portraits.vpcf_c new file mode 100755 index 0000000..c163cfb Binary files /dev/null and b/particles/portraits/miko/thtd_miko_portraits.vpcf_c differ diff --git a/particles/portraits/miko/thtd_miko_portraits_a.vpcf_c b/particles/portraits/miko/thtd_miko_portraits_a.vpcf_c new file mode 100755 index 0000000..6a82411 Binary files /dev/null and b/particles/portraits/miko/thtd_miko_portraits_a.vpcf_c differ diff --git a/particles/portraits/mima/thtd_mima_portraits.vpcf_c b/particles/portraits/mima/thtd_mima_portraits.vpcf_c new file mode 100755 index 0000000..1d9573b Binary files /dev/null and b/particles/portraits/mima/thtd_mima_portraits.vpcf_c differ diff --git a/particles/portraits/mima/thtd_mima_portraits_a.vpcf_c b/particles/portraits/mima/thtd_mima_portraits_a.vpcf_c new file mode 100755 index 0000000..23376e1 Binary files /dev/null and b/particles/portraits/mima/thtd_mima_portraits_a.vpcf_c differ diff --git a/particles/portraits/minamitsu/thtd_minamitsu_portraits.vpcf_c b/particles/portraits/minamitsu/thtd_minamitsu_portraits.vpcf_c new file mode 100755 index 0000000..5eb3cbe Binary files /dev/null and b/particles/portraits/minamitsu/thtd_minamitsu_portraits.vpcf_c differ diff --git a/particles/portraits/minamitsu/thtd_minamitsu_portraits_a.vpcf_c b/particles/portraits/minamitsu/thtd_minamitsu_portraits_a.vpcf_c new file mode 100755 index 0000000..418bae0 Binary files /dev/null and b/particles/portraits/minamitsu/thtd_minamitsu_portraits_a.vpcf_c differ diff --git a/particles/portraits/minoriko/thtd_minoriko_portraits.vpcf_c b/particles/portraits/minoriko/thtd_minoriko_portraits.vpcf_c new file mode 100755 index 0000000..0699559 Binary files /dev/null and b/particles/portraits/minoriko/thtd_minoriko_portraits.vpcf_c differ diff --git a/particles/portraits/minoriko/thtd_minoriko_portraits_a.vpcf_c b/particles/portraits/minoriko/thtd_minoriko_portraits_a.vpcf_c new file mode 100755 index 0000000..92a829f Binary files /dev/null and b/particles/portraits/minoriko/thtd_minoriko_portraits_a.vpcf_c differ diff --git a/particles/portraits/mokou/thtd_mokou_portraits.vpcf_c b/particles/portraits/mokou/thtd_mokou_portraits.vpcf_c new file mode 100755 index 0000000..40c5c56 Binary files /dev/null and b/particles/portraits/mokou/thtd_mokou_portraits.vpcf_c differ diff --git a/particles/portraits/mokou/thtd_mokou_portraits_a.vpcf_c b/particles/portraits/mokou/thtd_mokou_portraits_a.vpcf_c new file mode 100755 index 0000000..8e2d1b7 Binary files /dev/null and b/particles/portraits/mokou/thtd_mokou_portraits_a.vpcf_c differ diff --git a/particles/portraits/momiji/thtd_momiji_portraits.vpcf_c b/particles/portraits/momiji/thtd_momiji_portraits.vpcf_c new file mode 100755 index 0000000..aedbc51 Binary files /dev/null and b/particles/portraits/momiji/thtd_momiji_portraits.vpcf_c differ diff --git a/particles/portraits/momiji/thtd_momiji_portraits_a.vpcf_c b/particles/portraits/momiji/thtd_momiji_portraits_a.vpcf_c new file mode 100755 index 0000000..151baeb Binary files /dev/null and b/particles/portraits/momiji/thtd_momiji_portraits_a.vpcf_c differ diff --git a/particles/portraits/mystia/thtd_mystia_portraits.vpcf_c b/particles/portraits/mystia/thtd_mystia_portraits.vpcf_c new file mode 100755 index 0000000..a3f8aa1 Binary files /dev/null and b/particles/portraits/mystia/thtd_mystia_portraits.vpcf_c differ diff --git a/particles/portraits/mystia/thtd_mystia_portraits_a.vpcf_c b/particles/portraits/mystia/thtd_mystia_portraits_a.vpcf_c new file mode 100755 index 0000000..2c11a18 Binary files /dev/null and b/particles/portraits/mystia/thtd_mystia_portraits_a.vpcf_c differ diff --git a/particles/portraits/nazrin/thtd_nazrin_portraits.vpcf_c b/particles/portraits/nazrin/thtd_nazrin_portraits.vpcf_c new file mode 100755 index 0000000..586aa22 Binary files /dev/null and b/particles/portraits/nazrin/thtd_nazrin_portraits.vpcf_c differ diff --git a/particles/portraits/nazrin/thtd_nazrin_portraits_a.vpcf_c b/particles/portraits/nazrin/thtd_nazrin_portraits_a.vpcf_c new file mode 100755 index 0000000..4a64210 Binary files /dev/null and b/particles/portraits/nazrin/thtd_nazrin_portraits_a.vpcf_c differ diff --git a/particles/portraits/nitori/thtd_nitori_portraits.vpcf_c b/particles/portraits/nitori/thtd_nitori_portraits.vpcf_c new file mode 100755 index 0000000..0a4f404 Binary files /dev/null and b/particles/portraits/nitori/thtd_nitori_portraits.vpcf_c differ diff --git a/particles/portraits/nitori/thtd_nitori_portraits_a.vpcf_c b/particles/portraits/nitori/thtd_nitori_portraits_a.vpcf_c new file mode 100755 index 0000000..cdc8e3f Binary files /dev/null and b/particles/portraits/nitori/thtd_nitori_portraits_a.vpcf_c differ diff --git a/particles/portraits/nue/thtd_nue_portraits.vpcf_c b/particles/portraits/nue/thtd_nue_portraits.vpcf_c new file mode 100755 index 0000000..6c55304 Binary files /dev/null and b/particles/portraits/nue/thtd_nue_portraits.vpcf_c differ diff --git a/particles/portraits/nue/thtd_nue_portraits_a.vpcf_c b/particles/portraits/nue/thtd_nue_portraits_a.vpcf_c new file mode 100755 index 0000000..87d9b99 Binary files /dev/null and b/particles/portraits/nue/thtd_nue_portraits_a.vpcf_c differ diff --git a/particles/portraits/patchouli/thtd_patchouli_portraits.vpcf_c b/particles/portraits/patchouli/thtd_patchouli_portraits.vpcf_c new file mode 100755 index 0000000..3c4c309 Binary files /dev/null and b/particles/portraits/patchouli/thtd_patchouli_portraits.vpcf_c differ diff --git a/particles/portraits/patchouli/thtd_patchouli_portraits_a.vpcf_c b/particles/portraits/patchouli/thtd_patchouli_portraits_a.vpcf_c new file mode 100755 index 0000000..964fb0b Binary files /dev/null and b/particles/portraits/patchouli/thtd_patchouli_portraits_a.vpcf_c differ diff --git a/particles/portraits/portraits_r_get_effect.vpcf_c b/particles/portraits/portraits_r_get_effect.vpcf_c new file mode 100755 index 0000000..2d5deb1 Binary files /dev/null and b/particles/portraits/portraits_r_get_effect.vpcf_c differ diff --git a/particles/portraits/portraits_sr_get_effect.vpcf_c b/particles/portraits/portraits_sr_get_effect.vpcf_c new file mode 100755 index 0000000..3a2f821 Binary files /dev/null and b/particles/portraits/portraits_sr_get_effect.vpcf_c differ diff --git a/particles/portraits/portraits_sr_get_effect_a.vpcf_c b/particles/portraits/portraits_sr_get_effect_a.vpcf_c new file mode 100755 index 0000000..604ec1d Binary files /dev/null and b/particles/portraits/portraits_sr_get_effect_a.vpcf_c differ diff --git a/particles/portraits/portraits_ssr_get_effect.vpcf_c b/particles/portraits/portraits_ssr_get_effect.vpcf_c new file mode 100755 index 0000000..71cacc1 Binary files /dev/null and b/particles/portraits/portraits_ssr_get_effect.vpcf_c differ diff --git a/particles/portraits/portraits_ssr_get_effect_a.vpcf_c b/particles/portraits/portraits_ssr_get_effect_a.vpcf_c new file mode 100755 index 0000000..520aa89 Binary files /dev/null and b/particles/portraits/portraits_ssr_get_effect_a.vpcf_c differ diff --git a/particles/portraits/portraits_ssr_get_screen_effect.vpcf_c b/particles/portraits/portraits_ssr_get_screen_effect.vpcf_c new file mode 100755 index 0000000..d3431f4 Binary files /dev/null and b/particles/portraits/portraits_ssr_get_screen_effect.vpcf_c differ diff --git a/particles/portraits/portraits_ssr_get_screen_effect_a.vpcf_c b/particles/portraits/portraits_ssr_get_screen_effect_a.vpcf_c new file mode 100755 index 0000000..de460cc Binary files /dev/null and b/particles/portraits/portraits_ssr_get_screen_effect_a.vpcf_c differ diff --git a/particles/portraits/portraits_ssr_get_screen_effect_b.vpcf_c b/particles/portraits/portraits_ssr_get_screen_effect_b.vpcf_c new file mode 100755 index 0000000..bddc48d Binary files /dev/null and b/particles/portraits/portraits_ssr_get_screen_effect_b.vpcf_c differ diff --git a/particles/portraits/portraits_ssr_get_screen_effect_c.vpcf_c b/particles/portraits/portraits_ssr_get_screen_effect_c.vpcf_c new file mode 100755 index 0000000..6dff3fb Binary files /dev/null and b/particles/portraits/portraits_ssr_get_screen_effect_c.vpcf_c differ diff --git a/particles/portraits/portraits_ssr_get_screen_effect_d.vpcf_c b/particles/portraits/portraits_ssr_get_screen_effect_d.vpcf_c new file mode 100755 index 0000000..3e542f0 Binary files /dev/null and b/particles/portraits/portraits_ssr_get_screen_effect_d.vpcf_c differ diff --git a/particles/portraits/portraits_ssr_get_screen_effect_e.vpcf_c b/particles/portraits/portraits_ssr_get_screen_effect_e.vpcf_c new file mode 100755 index 0000000..4a554b5 Binary files /dev/null and b/particles/portraits/portraits_ssr_get_screen_effect_e.vpcf_c differ diff --git a/particles/portraits/ran/thtd_ran_portraits.vpcf_c b/particles/portraits/ran/thtd_ran_portraits.vpcf_c new file mode 100755 index 0000000..9f78d39 Binary files /dev/null and b/particles/portraits/ran/thtd_ran_portraits.vpcf_c differ diff --git a/particles/portraits/ran/thtd_ran_portraits_a.vpcf_c b/particles/portraits/ran/thtd_ran_portraits_a.vpcf_c new file mode 100755 index 0000000..f56ccf0 Binary files /dev/null and b/particles/portraits/ran/thtd_ran_portraits_a.vpcf_c differ diff --git a/particles/portraits/reimu/thtd_reimu_portraits.vpcf_c b/particles/portraits/reimu/thtd_reimu_portraits.vpcf_c new file mode 100755 index 0000000..1d0f70d Binary files /dev/null and b/particles/portraits/reimu/thtd_reimu_portraits.vpcf_c differ diff --git a/particles/portraits/reimu/thtd_reimu_portraits_a.vpcf_c b/particles/portraits/reimu/thtd_reimu_portraits_a.vpcf_c new file mode 100755 index 0000000..eb86865 Binary files /dev/null and b/particles/portraits/reimu/thtd_reimu_portraits_a.vpcf_c differ diff --git a/particles/portraits/reisen/thtd_reisen_portraits.vpcf_c b/particles/portraits/reisen/thtd_reisen_portraits.vpcf_c new file mode 100755 index 0000000..e7ba1ac Binary files /dev/null and b/particles/portraits/reisen/thtd_reisen_portraits.vpcf_c differ diff --git a/particles/portraits/reisen/thtd_reisen_portraits_a.vpcf_c b/particles/portraits/reisen/thtd_reisen_portraits_a.vpcf_c new file mode 100755 index 0000000..e6a90d2 Binary files /dev/null and b/particles/portraits/reisen/thtd_reisen_portraits_a.vpcf_c differ diff --git a/particles/portraits/remilia/thtd_remilia_portraits.vpcf_c b/particles/portraits/remilia/thtd_remilia_portraits.vpcf_c new file mode 100755 index 0000000..734a6e8 Binary files /dev/null and b/particles/portraits/remilia/thtd_remilia_portraits.vpcf_c differ diff --git a/particles/portraits/remilia/thtd_remilia_portraits_a.vpcf_c b/particles/portraits/remilia/thtd_remilia_portraits_a.vpcf_c new file mode 100755 index 0000000..1fb2e5e Binary files /dev/null and b/particles/portraits/remilia/thtd_remilia_portraits_a.vpcf_c differ diff --git a/particles/portraits/renko/thtd_renko_portraits.vpcf_c b/particles/portraits/renko/thtd_renko_portraits.vpcf_c new file mode 100755 index 0000000..4a89194 Binary files /dev/null and b/particles/portraits/renko/thtd_renko_portraits.vpcf_c differ diff --git a/particles/portraits/renko/thtd_renko_portraits_a.vpcf_c b/particles/portraits/renko/thtd_renko_portraits_a.vpcf_c new file mode 100755 index 0000000..a4d5c90 Binary files /dev/null and b/particles/portraits/renko/thtd_renko_portraits_a.vpcf_c differ diff --git a/particles/portraits/rin/thtd_rin_portraits.vpcf_c b/particles/portraits/rin/thtd_rin_portraits.vpcf_c new file mode 100755 index 0000000..eaef5fb Binary files /dev/null and b/particles/portraits/rin/thtd_rin_portraits.vpcf_c differ diff --git a/particles/portraits/rin/thtd_rin_portraits_a.vpcf_c b/particles/portraits/rin/thtd_rin_portraits_a.vpcf_c new file mode 100755 index 0000000..43831b7 Binary files /dev/null and b/particles/portraits/rin/thtd_rin_portraits_a.vpcf_c differ diff --git a/particles/portraits/rumia/thtd_rumia_portraits.vpcf_c b/particles/portraits/rumia/thtd_rumia_portraits.vpcf_c new file mode 100755 index 0000000..5a62c8c Binary files /dev/null and b/particles/portraits/rumia/thtd_rumia_portraits.vpcf_c differ diff --git a/particles/portraits/rumia/thtd_rumia_portraits_a.vpcf_c b/particles/portraits/rumia/thtd_rumia_portraits_a.vpcf_c new file mode 100755 index 0000000..e0c2502 Binary files /dev/null and b/particles/portraits/rumia/thtd_rumia_portraits_a.vpcf_c differ diff --git a/particles/portraits/sakuya/thtd_sakuya_portraits.vpcf_c b/particles/portraits/sakuya/thtd_sakuya_portraits.vpcf_c new file mode 100755 index 0000000..857aa23 Binary files /dev/null and b/particles/portraits/sakuya/thtd_sakuya_portraits.vpcf_c differ diff --git a/particles/portraits/sakuya/thtd_sakuya_portraits_a.vpcf_c b/particles/portraits/sakuya/thtd_sakuya_portraits_a.vpcf_c new file mode 100755 index 0000000..44ed460 Binary files /dev/null and b/particles/portraits/sakuya/thtd_sakuya_portraits_a.vpcf_c differ diff --git a/particles/portraits/sanae/thtd_sanae_portraits.vpcf_c b/particles/portraits/sanae/thtd_sanae_portraits.vpcf_c new file mode 100755 index 0000000..f80e98d Binary files /dev/null and b/particles/portraits/sanae/thtd_sanae_portraits.vpcf_c differ diff --git a/particles/portraits/sanae/thtd_sanae_portraits_a.vpcf_c b/particles/portraits/sanae/thtd_sanae_portraits_a.vpcf_c new file mode 100755 index 0000000..7b8f024 Binary files /dev/null and b/particles/portraits/sanae/thtd_sanae_portraits_a.vpcf_c differ diff --git a/particles/portraits/sariel/thtd_sariel_portraits.vpcf_c b/particles/portraits/sariel/thtd_sariel_portraits.vpcf_c new file mode 100755 index 0000000..19b47d2 Binary files /dev/null and b/particles/portraits/sariel/thtd_sariel_portraits.vpcf_c differ diff --git a/particles/portraits/sariel/thtd_sariel_portraits_a.vpcf_c b/particles/portraits/sariel/thtd_sariel_portraits_a.vpcf_c new file mode 100755 index 0000000..177c6fc Binary files /dev/null and b/particles/portraits/sariel/thtd_sariel_portraits_a.vpcf_c differ diff --git a/particles/portraits/satori/thtd_satori_portraits.vpcf_c b/particles/portraits/satori/thtd_satori_portraits.vpcf_c new file mode 100755 index 0000000..27e3c2c Binary files /dev/null and b/particles/portraits/satori/thtd_satori_portraits.vpcf_c differ diff --git a/particles/portraits/satori/thtd_satori_portraits_a.vpcf_c b/particles/portraits/satori/thtd_satori_portraits_a.vpcf_c new file mode 100755 index 0000000..9af6053 Binary files /dev/null and b/particles/portraits/satori/thtd_satori_portraits_a.vpcf_c differ diff --git a/particles/portraits/seiga/thtd_seiga_portraits.vpcf_c b/particles/portraits/seiga/thtd_seiga_portraits.vpcf_c new file mode 100755 index 0000000..a6a6a76 Binary files /dev/null and b/particles/portraits/seiga/thtd_seiga_portraits.vpcf_c differ diff --git a/particles/portraits/seiga/thtd_seiga_portraits_a.vpcf_c b/particles/portraits/seiga/thtd_seiga_portraits_a.vpcf_c new file mode 100755 index 0000000..4a6ab9f Binary files /dev/null and b/particles/portraits/seiga/thtd_seiga_portraits_a.vpcf_c differ diff --git a/particles/portraits/seija/thtd_seija_portraits.vpcf_c b/particles/portraits/seija/thtd_seija_portraits.vpcf_c new file mode 100755 index 0000000..17f8089 Binary files /dev/null and b/particles/portraits/seija/thtd_seija_portraits.vpcf_c differ diff --git a/particles/portraits/seija/thtd_seija_portraits_a.vpcf_c b/particles/portraits/seija/thtd_seija_portraits_a.vpcf_c new file mode 100755 index 0000000..ac0afb3 Binary files /dev/null and b/particles/portraits/seija/thtd_seija_portraits_a.vpcf_c differ diff --git a/particles/portraits/shikieiki/thtd_shikieiki_portraits.vpcf_c b/particles/portraits/shikieiki/thtd_shikieiki_portraits.vpcf_c new file mode 100755 index 0000000..db607c3 Binary files /dev/null and b/particles/portraits/shikieiki/thtd_shikieiki_portraits.vpcf_c differ diff --git a/particles/portraits/shikieiki/thtd_shikieiki_portraits_a.vpcf_c b/particles/portraits/shikieiki/thtd_shikieiki_portraits_a.vpcf_c new file mode 100755 index 0000000..5db8564 Binary files /dev/null and b/particles/portraits/shikieiki/thtd_shikieiki_portraits_a.vpcf_c differ diff --git a/particles/portraits/shinki/thtd_shinki_portraits.vpcf_c b/particles/portraits/shinki/thtd_shinki_portraits.vpcf_c new file mode 100755 index 0000000..40df7ba Binary files /dev/null and b/particles/portraits/shinki/thtd_shinki_portraits.vpcf_c differ diff --git a/particles/portraits/shinki/thtd_shinki_portraits_a.vpcf_c b/particles/portraits/shinki/thtd_shinki_portraits_a.vpcf_c new file mode 100755 index 0000000..39f15d8 Binary files /dev/null and b/particles/portraits/shinki/thtd_shinki_portraits_a.vpcf_c differ diff --git a/particles/portraits/shinmyoumaru/thtd_shinmyoumaru_portraits.vpcf_c b/particles/portraits/shinmyoumaru/thtd_shinmyoumaru_portraits.vpcf_c new file mode 100755 index 0000000..546da21 Binary files /dev/null and b/particles/portraits/shinmyoumaru/thtd_shinmyoumaru_portraits.vpcf_c differ diff --git a/particles/portraits/shinmyoumaru/thtd_shinmyoumaru_portraits_a.vpcf_c b/particles/portraits/shinmyoumaru/thtd_shinmyoumaru_portraits_a.vpcf_c new file mode 100755 index 0000000..c42f545 Binary files /dev/null and b/particles/portraits/shinmyoumaru/thtd_shinmyoumaru_portraits_a.vpcf_c differ diff --git a/particles/portraits/sizuha/thtd_sizuha_portraits.vpcf_c b/particles/portraits/sizuha/thtd_sizuha_portraits.vpcf_c new file mode 100755 index 0000000..9007fda Binary files /dev/null and b/particles/portraits/sizuha/thtd_sizuha_portraits.vpcf_c differ diff --git a/particles/portraits/sizuha/thtd_sizuha_portraits_a.vpcf_c b/particles/portraits/sizuha/thtd_sizuha_portraits_a.vpcf_c new file mode 100755 index 0000000..dc78f84 Binary files /dev/null and b/particles/portraits/sizuha/thtd_sizuha_portraits_a.vpcf_c differ diff --git a/particles/portraits/soga/thtd_soga_portraits.vpcf_c b/particles/portraits/soga/thtd_soga_portraits.vpcf_c new file mode 100755 index 0000000..8f9c9c5 Binary files /dev/null and b/particles/portraits/soga/thtd_soga_portraits.vpcf_c differ diff --git a/particles/portraits/soga/thtd_soga_portraits_a.vpcf_c b/particles/portraits/soga/thtd_soga_portraits_a.vpcf_c new file mode 100755 index 0000000..ba4b7e6 Binary files /dev/null and b/particles/portraits/soga/thtd_soga_portraits_a.vpcf_c differ diff --git a/particles/portraits/star/thtd_star_portraits.vpcf_c b/particles/portraits/star/thtd_star_portraits.vpcf_c new file mode 100755 index 0000000..e45caf1 Binary files /dev/null and b/particles/portraits/star/thtd_star_portraits.vpcf_c differ diff --git a/particles/portraits/star/thtd_star_portraits_a.vpcf_c b/particles/portraits/star/thtd_star_portraits_a.vpcf_c new file mode 100755 index 0000000..93428a2 Binary files /dev/null and b/particles/portraits/star/thtd_star_portraits_a.vpcf_c differ diff --git a/particles/portraits/suika/thtd_suika_portraits.vpcf_c b/particles/portraits/suika/thtd_suika_portraits.vpcf_c new file mode 100755 index 0000000..8655386 Binary files /dev/null and b/particles/portraits/suika/thtd_suika_portraits.vpcf_c differ diff --git a/particles/portraits/suika/thtd_suika_portraits_a.vpcf_c b/particles/portraits/suika/thtd_suika_portraits_a.vpcf_c new file mode 100755 index 0000000..28b0530 Binary files /dev/null and b/particles/portraits/suika/thtd_suika_portraits_a.vpcf_c differ diff --git a/particles/portraits/sumireko/thtd_sumireko_portraits.vpcf_c b/particles/portraits/sumireko/thtd_sumireko_portraits.vpcf_c new file mode 100755 index 0000000..fd4c9f3 Binary files /dev/null and b/particles/portraits/sumireko/thtd_sumireko_portraits.vpcf_c differ diff --git a/particles/portraits/sumireko/thtd_sumireko_portraits_a.vpcf_c b/particles/portraits/sumireko/thtd_sumireko_portraits_a.vpcf_c new file mode 100755 index 0000000..ded296f Binary files /dev/null and b/particles/portraits/sumireko/thtd_sumireko_portraits_a.vpcf_c differ diff --git a/particles/portraits/sunny/thtd_sunny_portraits.vpcf_c b/particles/portraits/sunny/thtd_sunny_portraits.vpcf_c new file mode 100755 index 0000000..fb9a188 Binary files /dev/null and b/particles/portraits/sunny/thtd_sunny_portraits.vpcf_c differ diff --git a/particles/portraits/sunny/thtd_sunny_portraits_a.vpcf_c b/particles/portraits/sunny/thtd_sunny_portraits_a.vpcf_c new file mode 100755 index 0000000..a7c7b14 Binary files /dev/null and b/particles/portraits/sunny/thtd_sunny_portraits_a.vpcf_c differ diff --git a/particles/portraits/suwako/thtd_suwako_portraits.vpcf_c b/particles/portraits/suwako/thtd_suwako_portraits.vpcf_c new file mode 100755 index 0000000..45c553e Binary files /dev/null and b/particles/portraits/suwako/thtd_suwako_portraits.vpcf_c differ diff --git a/particles/portraits/suwako/thtd_suwako_portraits_a.vpcf_c b/particles/portraits/suwako/thtd_suwako_portraits_a.vpcf_c new file mode 100755 index 0000000..b155133 Binary files /dev/null and b/particles/portraits/suwako/thtd_suwako_portraits_a.vpcf_c differ diff --git a/particles/portraits/tenshi/thtd_tenshi_portraits.vpcf_c b/particles/portraits/tenshi/thtd_tenshi_portraits.vpcf_c new file mode 100755 index 0000000..5b71dff Binary files /dev/null and b/particles/portraits/tenshi/thtd_tenshi_portraits.vpcf_c differ diff --git a/particles/portraits/tenshi/thtd_tenshi_portraits_a.vpcf_c b/particles/portraits/tenshi/thtd_tenshi_portraits_a.vpcf_c new file mode 100755 index 0000000..ccdb193 Binary files /dev/null and b/particles/portraits/tenshi/thtd_tenshi_portraits_a.vpcf_c differ diff --git a/particles/portraits/toramaru/thtd_toramaru_portraits.vpcf_c b/particles/portraits/toramaru/thtd_toramaru_portraits.vpcf_c new file mode 100755 index 0000000..42b90cb Binary files /dev/null and b/particles/portraits/toramaru/thtd_toramaru_portraits.vpcf_c differ diff --git a/particles/portraits/toramaru/thtd_toramaru_portraits_a.vpcf_c b/particles/portraits/toramaru/thtd_toramaru_portraits_a.vpcf_c new file mode 100755 index 0000000..e737cfd Binary files /dev/null and b/particles/portraits/toramaru/thtd_toramaru_portraits_a.vpcf_c differ diff --git a/particles/portraits/utsuho/thtd_utsuho_portraits.vpcf_c b/particles/portraits/utsuho/thtd_utsuho_portraits.vpcf_c new file mode 100755 index 0000000..1fa789a Binary files /dev/null and b/particles/portraits/utsuho/thtd_utsuho_portraits.vpcf_c differ diff --git a/particles/portraits/utsuho/thtd_utsuho_portraits_a.vpcf_c b/particles/portraits/utsuho/thtd_utsuho_portraits_a.vpcf_c new file mode 100755 index 0000000..9af2b19 Binary files /dev/null and b/particles/portraits/utsuho/thtd_utsuho_portraits_a.vpcf_c differ diff --git a/particles/portraits/wriggle/thtd_wriggle_portraits.vpcf_c b/particles/portraits/wriggle/thtd_wriggle_portraits.vpcf_c new file mode 100755 index 0000000..c0ee0fe Binary files /dev/null and b/particles/portraits/wriggle/thtd_wriggle_portraits.vpcf_c differ diff --git a/particles/portraits/wriggle/thtd_wriggle_portraits_a.vpcf_c b/particles/portraits/wriggle/thtd_wriggle_portraits_a.vpcf_c new file mode 100755 index 0000000..97a879e Binary files /dev/null and b/particles/portraits/wriggle/thtd_wriggle_portraits_a.vpcf_c differ diff --git a/particles/portraits/yoshika/thtd_yoshika_portraits.vpcf_c b/particles/portraits/yoshika/thtd_yoshika_portraits.vpcf_c new file mode 100755 index 0000000..f602119 Binary files /dev/null and b/particles/portraits/yoshika/thtd_yoshika_portraits.vpcf_c differ diff --git a/particles/portraits/yoshika/thtd_yoshika_portraits_a.vpcf_c b/particles/portraits/yoshika/thtd_yoshika_portraits_a.vpcf_c new file mode 100755 index 0000000..fc589cf Binary files /dev/null and b/particles/portraits/yoshika/thtd_yoshika_portraits_a.vpcf_c differ diff --git a/particles/portraits/youmu/thtd_youmu_portraits.vpcf_c b/particles/portraits/youmu/thtd_youmu_portraits.vpcf_c new file mode 100755 index 0000000..20a1e85 Binary files /dev/null and b/particles/portraits/youmu/thtd_youmu_portraits.vpcf_c differ diff --git a/particles/portraits/youmu/thtd_youmu_portraits_a.vpcf_c b/particles/portraits/youmu/thtd_youmu_portraits_a.vpcf_c new file mode 100755 index 0000000..09077d9 Binary files /dev/null and b/particles/portraits/youmu/thtd_youmu_portraits_a.vpcf_c differ diff --git a/particles/portraits/yukari/thtd_yukari_portraits.vpcf_c b/particles/portraits/yukari/thtd_yukari_portraits.vpcf_c new file mode 100755 index 0000000..af24196 Binary files /dev/null and b/particles/portraits/yukari/thtd_yukari_portraits.vpcf_c differ diff --git a/particles/portraits/yukari/thtd_yukari_portraits_a.vpcf_c b/particles/portraits/yukari/thtd_yukari_portraits_a.vpcf_c new file mode 100755 index 0000000..e906f89 Binary files /dev/null and b/particles/portraits/yukari/thtd_yukari_portraits_a.vpcf_c differ diff --git a/particles/portraits/yumemi/thtd_yumemi_portraits.vpcf_c b/particles/portraits/yumemi/thtd_yumemi_portraits.vpcf_c new file mode 100755 index 0000000..f292686 Binary files /dev/null and b/particles/portraits/yumemi/thtd_yumemi_portraits.vpcf_c differ diff --git a/particles/portraits/yumemi/thtd_yumemi_portraits_a.vpcf_c b/particles/portraits/yumemi/thtd_yumemi_portraits_a.vpcf_c new file mode 100755 index 0000000..ee2117d Binary files /dev/null and b/particles/portraits/yumemi/thtd_yumemi_portraits_a.vpcf_c differ diff --git a/particles/portraits/yuugi/thtd_yuugi_portraits.vpcf_c b/particles/portraits/yuugi/thtd_yuugi_portraits.vpcf_c new file mode 100755 index 0000000..5bd81bb Binary files /dev/null and b/particles/portraits/yuugi/thtd_yuugi_portraits.vpcf_c differ diff --git a/particles/portraits/yuugi/thtd_yuugi_portraits_a.vpcf_c b/particles/portraits/yuugi/thtd_yuugi_portraits_a.vpcf_c new file mode 100755 index 0000000..fd491b0 Binary files /dev/null and b/particles/portraits/yuugi/thtd_yuugi_portraits_a.vpcf_c differ diff --git a/particles/portraits/yuuka/thtd_yuuka_portraits.vpcf_c b/particles/portraits/yuuka/thtd_yuuka_portraits.vpcf_c new file mode 100755 index 0000000..7aa7e92 Binary files /dev/null and b/particles/portraits/yuuka/thtd_yuuka_portraits.vpcf_c differ diff --git a/particles/portraits/yuuka/thtd_yuuka_portraits_a.vpcf_c b/particles/portraits/yuuka/thtd_yuuka_portraits_a.vpcf_c new file mode 100755 index 0000000..87aabd8 Binary files /dev/null and b/particles/portraits/yuuka/thtd_yuuka_portraits_a.vpcf_c differ diff --git a/particles/portraits/yuyuko/thtd_yuyuko_portraits.vpcf_c b/particles/portraits/yuyuko/thtd_yuyuko_portraits.vpcf_c new file mode 100755 index 0000000..1e998e0 Binary files /dev/null and b/particles/portraits/yuyuko/thtd_yuyuko_portraits.vpcf_c differ diff --git a/particles/portraits/yuyuko/thtd_yuyuko_portraits_a.vpcf_c b/particles/portraits/yuyuko/thtd_yuyuko_portraits_a.vpcf_c new file mode 100755 index 0000000..66efc70 Binary files /dev/null and b/particles/portraits/yuyuko/thtd_yuyuko_portraits_a.vpcf_c differ diff --git a/particles/radiant_fx2/radiant_ancient001_blsss.vpcf_c b/particles/radiant_fx2/radiant_ancient001_blsss.vpcf_c new file mode 100755 index 0000000..429299a Binary files /dev/null and b/particles/radiant_fx2/radiant_ancient001_blsss.vpcf_c differ diff --git a/particles/radiant_fx2/radiant_ancient001_destruction.vpcf_c b/particles/radiant_fx2/radiant_ancient001_destruction.vpcf_c new file mode 100755 index 0000000..33757e5 Binary files /dev/null and b/particles/radiant_fx2/radiant_ancient001_destruction.vpcf_c differ diff --git a/particles/thd/items/item_qijizhixing_xing.vpcf_c b/particles/thd/items/item_qijizhixing_xing.vpcf_c new file mode 100755 index 0000000..94ea337 Binary files /dev/null and b/particles/thd/items/item_qijizhixing_xing.vpcf_c differ diff --git a/particles/thd2/chen_cast_4.vpcf_c b/particles/thd2/chen_cast_4.vpcf_c new file mode 100755 index 0000000..11124ef Binary files /dev/null and b/particles/thd2/chen_cast_4.vpcf_c differ diff --git a/particles/thd2/chen_cast_4_d.vpcf_c b/particles/thd2/chen_cast_4_d.vpcf_c new file mode 100755 index 0000000..fc64d85 Binary files /dev/null and b/particles/thd2/chen_cast_4_d.vpcf_c differ diff --git a/particles/thd2/denghuo.vpcf_c b/particles/thd2/denghuo.vpcf_c new file mode 100755 index 0000000..4790030 Binary files /dev/null and b/particles/thd2/denghuo.vpcf_c differ diff --git a/particles/thd2/environment/death/act_hero_die.vpcf_c b/particles/thd2/environment/death/act_hero_die.vpcf_c new file mode 100755 index 0000000..8620954 Binary files /dev/null and b/particles/thd2/environment/death/act_hero_die.vpcf_c differ diff --git a/particles/thd2/environment/jump/jump.vpcf_c b/particles/thd2/environment/jump/jump.vpcf_c new file mode 100755 index 0000000..2be5b30 Binary files /dev/null and b/particles/thd2/environment/jump/jump.vpcf_c differ diff --git a/particles/thd2/environment/waterfall/waterfall_1.vpcf_c b/particles/thd2/environment/waterfall/waterfall_1.vpcf_c new file mode 100755 index 0000000..e65d837 Binary files /dev/null and b/particles/thd2/environment/waterfall/waterfall_1.vpcf_c differ diff --git a/particles/thd2/environment/waterfall/waterfall_1_bottom_1.vpcf_c b/particles/thd2/environment/waterfall/waterfall_1_bottom_1.vpcf_c new file mode 100755 index 0000000..87b74b1 Binary files /dev/null and b/particles/thd2/environment/waterfall/waterfall_1_bottom_1.vpcf_c differ diff --git a/particles/thd2/environment/waterfall/waterfall_1_bottom_2.vpcf_c b/particles/thd2/environment/waterfall/waterfall_1_bottom_2.vpcf_c new file mode 100755 index 0000000..fadfa81 Binary files /dev/null and b/particles/thd2/environment/waterfall/waterfall_1_bottom_2.vpcf_c differ diff --git a/particles/thd2/heroes/aya/ability_aya_02_mark.vpcf_c b/particles/thd2/heroes/aya/ability_aya_02_mark.vpcf_c new file mode 100755 index 0000000..33d570b Binary files /dev/null and b/particles/thd2/heroes/aya/ability_aya_02_mark.vpcf_c differ diff --git a/particles/thd2/heroes/aya/ability_aya_02_mark_a.vpcf_c b/particles/thd2/heroes/aya/ability_aya_02_mark_a.vpcf_c new file mode 100755 index 0000000..3ec43a7 Binary files /dev/null and b/particles/thd2/heroes/aya/ability_aya_02_mark_a.vpcf_c differ diff --git a/particles/thd2/heroes/byakuren/ability_byakuren_03.vpcf_c b/particles/thd2/heroes/byakuren/ability_byakuren_03.vpcf_c new file mode 100755 index 0000000..b186a0a Binary files /dev/null and b/particles/thd2/heroes/byakuren/ability_byakuren_03.vpcf_c differ diff --git a/particles/thd2/heroes/eirin/ability_eirin02_arrow_effect.vpcf_c b/particles/thd2/heroes/eirin/ability_eirin02_arrow_effect.vpcf_c new file mode 100755 index 0000000..ba6a389 Binary files /dev/null and b/particles/thd2/heroes/eirin/ability_eirin02_arrow_effect.vpcf_c differ diff --git a/particles/thd2/heroes/eirin/ability_eirin02_heal.vpcf_c b/particles/thd2/heroes/eirin/ability_eirin02_heal.vpcf_c new file mode 100755 index 0000000..511235d Binary files /dev/null and b/particles/thd2/heroes/eirin/ability_eirin02_heal.vpcf_c differ diff --git a/particles/thd2/heroes/flandre/ability_flandre_04_buff.vpcf_c b/particles/thd2/heroes/flandre/ability_flandre_04_buff.vpcf_c new file mode 100755 index 0000000..a9a4790 Binary files /dev/null and b/particles/thd2/heroes/flandre/ability_flandre_04_buff.vpcf_c differ diff --git a/particles/thd2/heroes/flandre/ability_flandre_04_effect.vpcf_c b/particles/thd2/heroes/flandre/ability_flandre_04_effect.vpcf_c new file mode 100755 index 0000000..ee2bad3 Binary files /dev/null and b/particles/thd2/heroes/flandre/ability_flandre_04_effect.vpcf_c differ diff --git a/particles/thd2/heroes/iku/ability_iku_04_light.vpcf_c b/particles/thd2/heroes/iku/ability_iku_04_light.vpcf_c new file mode 100755 index 0000000..5c859de Binary files /dev/null and b/particles/thd2/heroes/iku/ability_iku_04_light.vpcf_c differ diff --git a/particles/thd2/heroes/iku/ability_iku_04_light_a.vpcf_c b/particles/thd2/heroes/iku/ability_iku_04_light_a.vpcf_c new file mode 100755 index 0000000..e9d5c1a Binary files /dev/null and b/particles/thd2/heroes/iku/ability_iku_04_light_a.vpcf_c differ diff --git a/particles/thd2/heroes/iku/ability_iku_04_light_b.vpcf_c b/particles/thd2/heroes/iku/ability_iku_04_light_b.vpcf_c new file mode 100755 index 0000000..d1e60ec Binary files /dev/null and b/particles/thd2/heroes/iku/ability_iku_04_light_b.vpcf_c differ diff --git a/particles/thd2/heroes/iku/ability_iku_04_light_c.vpcf_c b/particles/thd2/heroes/iku/ability_iku_04_light_c.vpcf_c new file mode 100755 index 0000000..b51877a Binary files /dev/null and b/particles/thd2/heroes/iku/ability_iku_04_light_c.vpcf_c differ diff --git a/particles/thd2/heroes/iku/ability_iku_04_light_d.vpcf_c b/particles/thd2/heroes/iku/ability_iku_04_light_d.vpcf_c new file mode 100755 index 0000000..53ac639 Binary files /dev/null and b/particles/thd2/heroes/iku/ability_iku_04_light_d.vpcf_c differ diff --git a/particles/thd2/heroes/iku/ability_iku_04_light_e.vpcf_c b/particles/thd2/heroes/iku/ability_iku_04_light_e.vpcf_c new file mode 100755 index 0000000..679175f Binary files /dev/null and b/particles/thd2/heroes/iku/ability_iku_04_light_e.vpcf_c differ diff --git a/particles/thd2/heroes/iku/ability_iku_04_light_f.vpcf_c b/particles/thd2/heroes/iku/ability_iku_04_light_f.vpcf_c new file mode 100755 index 0000000..a68cfd5 Binary files /dev/null and b/particles/thd2/heroes/iku/ability_iku_04_light_f.vpcf_c differ diff --git a/particles/thd2/heroes/iku/ability_iku_04_model.vpcf_c b/particles/thd2/heroes/iku/ability_iku_04_model.vpcf_c new file mode 100755 index 0000000..02c0503 Binary files /dev/null and b/particles/thd2/heroes/iku/ability_iku_04_model.vpcf_c differ diff --git a/particles/thd2/heroes/iku/iku_02.vpcf_c b/particles/thd2/heroes/iku/iku_02.vpcf_c new file mode 100755 index 0000000..6460fc5 Binary files /dev/null and b/particles/thd2/heroes/iku/iku_02.vpcf_c differ diff --git a/particles/thd2/heroes/iku/iku_light_hand.vpcf_c b/particles/thd2/heroes/iku/iku_light_hand.vpcf_c new file mode 100755 index 0000000..084ea7c Binary files /dev/null and b/particles/thd2/heroes/iku/iku_light_hand.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light.vpcf_c new file mode 100755 index 0000000..2e6988e Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light_a.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light_a.vpcf_c new file mode 100755 index 0000000..275ddd2 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light_a.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light_b.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light_b.vpcf_c new file mode 100755 index 0000000..89373d3 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light_b.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light_c.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light_c.vpcf_c new file mode 100755 index 0000000..d9f7a73 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light_c.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light_d.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light_d.vpcf_c new file mode 100755 index 0000000..40086a3 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light_d.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light_e.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light_e.vpcf_c new file mode 100755 index 0000000..7db6728 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light_e.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light_g.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light_g.vpcf_c new file mode 100755 index 0000000..7c34131 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light_g.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light_green.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light_green.vpcf_c new file mode 100755 index 0000000..a361bc6 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light_green.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light_green_a.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light_green_a.vpcf_c new file mode 100755 index 0000000..0794ba6 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light_green_a.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light_green_b.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light_green_b.vpcf_c new file mode 100755 index 0000000..f3cb7a7 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light_green_b.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light_red.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light_red.vpcf_c new file mode 100755 index 0000000..8615076 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light_red.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light_red_a.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light_red_a.vpcf_c new file mode 100755 index 0000000..4548aee Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light_red_a.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya01_light_red_b.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya01_light_red_b.vpcf_c new file mode 100755 index 0000000..b0e8a0b Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya01_light_red_b.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet.vpcf_c new file mode 100755 index 0000000..b04e214 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_a.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_a.vpcf_c new file mode 100755 index 0000000..b9bb8e9 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_a.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_b.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_b.vpcf_c new file mode 100755 index 0000000..17d2e07 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_b.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_c.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_c.vpcf_c new file mode 100755 index 0000000..505560a Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_c.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_d.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_d.vpcf_c new file mode 100755 index 0000000..6bd3328 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_d.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_e.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_e.vpcf_c new file mode 100755 index 0000000..4ed6be3 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_brilliant_dragon_bullet_e.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond.vpcf_c new file mode 100755 index 0000000..1a10b8d Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_a.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_a.vpcf_c new file mode 100755 index 0000000..a4509d3 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_a.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_b.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_b.vpcf_c new file mode 100755 index 0000000..7bfc4c7 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_b.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_c.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_c.vpcf_c new file mode 100755 index 0000000..96ee2a3 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_c.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_d.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_d.vpcf_c new file mode 100755 index 0000000..12956ef Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_d.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_e.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_e.vpcf_c new file mode 100755 index 0000000..ce86db0 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_buddhist_diamond_e.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_life_spring_infinity.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_life_spring_infinity.vpcf_c new file mode 100755 index 0000000..8efbe49 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_life_spring_infinity.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield.vpcf_c new file mode 100755 index 0000000..69b72ae Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield_a.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield_a.vpcf_c new file mode 100755 index 0000000..c70fb8f Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield_a.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield_b.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield_b.vpcf_c new file mode 100755 index 0000000..be15bba Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield_b.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield_c.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield_c.vpcf_c new file mode 100755 index 0000000..3fef001 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield_c.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield_d.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield_d.vpcf_c new file mode 100755 index 0000000..3b89e7d Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya02_salamander_shield_d.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect.vpcf_c new file mode 100755 index 0000000..60decd3 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect_a.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_a.vpcf_c new file mode 100755 index 0000000..7acd9a3 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_a.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect_b.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_b.vpcf_c new file mode 100755 index 0000000..c658feb Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_b.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect_c.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_c.vpcf_c new file mode 100755 index 0000000..30d7b9f Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_c.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect_d.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_d.vpcf_c new file mode 100755 index 0000000..b3aa66a Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_d.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect_e.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_e.vpcf_c new file mode 100755 index 0000000..e18aeec Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_e.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect_f.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_f.vpcf_c new file mode 100755 index 0000000..88c4031 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_f.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect_g.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_g.vpcf_c new file mode 100755 index 0000000..7761d2f Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_g.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect_h.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_h.vpcf_c new file mode 100755 index 0000000..53515fb Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_h.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect_i.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_i.vpcf_c new file mode 100755 index 0000000..b9de1e2 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_i.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect_j.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_j.vpcf_c new file mode 100755 index 0000000..6b13c95 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_j.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect_k.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_k.vpcf_c new file mode 100755 index 0000000..d779b66 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_k.vpcf_c differ diff --git a/particles/thd2/heroes/kaguya/ability_kaguya04_effect_k0.vpcf_c b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_k0.vpcf_c new file mode 100755 index 0000000..2c77ae3 Binary files /dev/null and b/particles/thd2/heroes/kaguya/ability_kaguya04_effect_k0.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_01_rocket.vpcf_c b/particles/thd2/heroes/marisa/marisa_01_rocket.vpcf_c new file mode 100755 index 0000000..6bcb540 Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_01_rocket.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_01_rocket_a.vpcf_c b/particles/thd2/heroes/marisa/marisa_01_rocket_a.vpcf_c new file mode 100755 index 0000000..20be19a Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_01_rocket_a.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_01_rocket_a_light.vpcf_c b/particles/thd2/heroes/marisa/marisa_01_rocket_a_light.vpcf_c new file mode 100755 index 0000000..d935dcf Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_01_rocket_a_light.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_01_rocket_a_spark.vpcf_c b/particles/thd2/heroes/marisa/marisa_01_rocket_a_spark.vpcf_c new file mode 100755 index 0000000..5a3e57a Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_01_rocket_a_spark.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_01_rocket_a_wind.vpcf_c b/particles/thd2/heroes/marisa/marisa_01_rocket_a_wind.vpcf_c new file mode 100755 index 0000000..93e916e Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_01_rocket_a_wind.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_02_stars.vpcf_c b/particles/thd2/heroes/marisa/marisa_02_stars.vpcf_c new file mode 100755 index 0000000..05d630c Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_02_stars.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_02_stars_a.vpcf_c b/particles/thd2/heroes/marisa/marisa_02_stars_a.vpcf_c new file mode 100755 index 0000000..521f4ed Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_02_stars_a.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_02_stars_b.vpcf_c b/particles/thd2/heroes/marisa/marisa_02_stars_b.vpcf_c new file mode 100755 index 0000000..5b882b7 Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_02_stars_b.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_02_stars_c.vpcf_c b/particles/thd2/heroes/marisa/marisa_02_stars_c.vpcf_c new file mode 100755 index 0000000..764b4a9 Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_02_stars_c.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_02_stars_d.vpcf_c b/particles/thd2/heroes/marisa/marisa_02_stars_d.vpcf_c new file mode 100755 index 0000000..92e2c5f Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_02_stars_d.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_02_stars_e.vpcf_c b/particles/thd2/heroes/marisa/marisa_02_stars_e.vpcf_c new file mode 100755 index 0000000..de2b242 Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_02_stars_e.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_04_spark.vpcf_c b/particles/thd2/heroes/marisa/marisa_04_spark.vpcf_c new file mode 100755 index 0000000..76c934f Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_04_spark.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_04_spark_laser.vpcf_c b/particles/thd2/heroes/marisa/marisa_04_spark_laser.vpcf_c new file mode 100755 index 0000000..99a383a Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_04_spark_laser.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_04_spark_laserlight.vpcf_c b/particles/thd2/heroes/marisa/marisa_04_spark_laserlight.vpcf_c new file mode 100755 index 0000000..8413397 Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_04_spark_laserlight.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_04_spark_light.vpcf_c b/particles/thd2/heroes/marisa/marisa_04_spark_light.vpcf_c new file mode 100755 index 0000000..2c9e898 Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_04_spark_light.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_04_spark_light_b.vpcf_c b/particles/thd2/heroes/marisa/marisa_04_spark_light_b.vpcf_c new file mode 100755 index 0000000..fc452fd Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_04_spark_light_b.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_04_spark_wind.vpcf_c b/particles/thd2/heroes/marisa/marisa_04_spark_wind.vpcf_c new file mode 100755 index 0000000..96c2ca3 Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_04_spark_wind.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_04_spark_wind_b.vpcf_c b/particles/thd2/heroes/marisa/marisa_04_spark_wind_b.vpcf_c new file mode 100755 index 0000000..6790bf2 Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_04_spark_wind_b.vpcf_c differ diff --git a/particles/thd2/heroes/marisa/marisa_04_spark_wind_c.vpcf_c b/particles/thd2/heroes/marisa/marisa_04_spark_wind_c.vpcf_c new file mode 100755 index 0000000..43352cc Binary files /dev/null and b/particles/thd2/heroes/marisa/marisa_04_spark_wind_c.vpcf_c differ diff --git a/particles/thd2/heroes/miko/ability_miko_01.vpcf_c b/particles/thd2/heroes/miko/ability_miko_01.vpcf_c new file mode 100755 index 0000000..a354d31 Binary files /dev/null and b/particles/thd2/heroes/miko/ability_miko_01.vpcf_c differ diff --git a/particles/thd2/heroes/miko/ability_miko_01_a.vpcf_c b/particles/thd2/heroes/miko/ability_miko_01_a.vpcf_c new file mode 100755 index 0000000..c0e0950 Binary files /dev/null and b/particles/thd2/heroes/miko/ability_miko_01_a.vpcf_c differ diff --git a/particles/thd2/heroes/miko/ability_miko_01_a0.vpcf_c b/particles/thd2/heroes/miko/ability_miko_01_a0.vpcf_c new file mode 100755 index 0000000..76e5938 Binary files /dev/null and b/particles/thd2/heroes/miko/ability_miko_01_a0.vpcf_c differ diff --git a/particles/thd2/heroes/miko/ability_miko_01_b.vpcf_c b/particles/thd2/heroes/miko/ability_miko_01_b.vpcf_c new file mode 100755 index 0000000..c8901c4 Binary files /dev/null and b/particles/thd2/heroes/miko/ability_miko_01_b.vpcf_c differ diff --git a/particles/thd2/heroes/miko/ability_miko_01_c.vpcf_c b/particles/thd2/heroes/miko/ability_miko_01_c.vpcf_c new file mode 100755 index 0000000..ecd188e Binary files /dev/null and b/particles/thd2/heroes/miko/ability_miko_01_c.vpcf_c differ diff --git a/particles/thd2/heroes/miko/ability_miko_01_stage_b.vpcf_c b/particles/thd2/heroes/miko/ability_miko_01_stage_b.vpcf_c new file mode 100755 index 0000000..ebf6ba5 Binary files /dev/null and b/particles/thd2/heroes/miko/ability_miko_01_stage_b.vpcf_c differ diff --git a/particles/thd2/heroes/miko/ability_miko_01_stage_b_a.vpcf_c b/particles/thd2/heroes/miko/ability_miko_01_stage_b_a.vpcf_c new file mode 100755 index 0000000..6ac7e8b Binary files /dev/null and b/particles/thd2/heroes/miko/ability_miko_01_stage_b_a.vpcf_c differ diff --git a/particles/thd2/heroes/miko/ability_miko_01_stage_b_b.vpcf_c b/particles/thd2/heroes/miko/ability_miko_01_stage_b_b.vpcf_c new file mode 100755 index 0000000..0fefe11 Binary files /dev/null and b/particles/thd2/heroes/miko/ability_miko_01_stage_b_b.vpcf_c differ diff --git a/particles/thd2/heroes/miko/ability_miko_01_stage_b_c.vpcf_c b/particles/thd2/heroes/miko/ability_miko_01_stage_b_c.vpcf_c new file mode 100755 index 0000000..9f7eb4c Binary files /dev/null and b/particles/thd2/heroes/miko/ability_miko_01_stage_b_c.vpcf_c differ diff --git a/particles/thd2/heroes/mouko/ability_mokou_01_boom.vpcf_c b/particles/thd2/heroes/mouko/ability_mokou_01_boom.vpcf_c new file mode 100755 index 0000000..ffa1c54 Binary files /dev/null and b/particles/thd2/heroes/mouko/ability_mokou_01_boom.vpcf_c differ diff --git a/particles/thd2/heroes/mouko/ability_mokou_02_boom.vpcf_c b/particles/thd2/heroes/mouko/ability_mokou_02_boom.vpcf_c new file mode 100755 index 0000000..1e038b0 Binary files /dev/null and b/particles/thd2/heroes/mouko/ability_mokou_02_boom.vpcf_c differ diff --git a/particles/thd2/heroes/mouko/ability_mokou_04_wing.vpcf_c b/particles/thd2/heroes/mouko/ability_mokou_04_wing.vpcf_c new file mode 100755 index 0000000..4df3cfe Binary files /dev/null and b/particles/thd2/heroes/mouko/ability_mokou_04_wing.vpcf_c differ diff --git a/particles/thd2/heroes/mouko/ability_mokou_04_wing_b.vpcf_c b/particles/thd2/heroes/mouko/ability_mokou_04_wing_b.vpcf_c new file mode 100755 index 0000000..8397114 Binary files /dev/null and b/particles/thd2/heroes/mouko/ability_mokou_04_wing_b.vpcf_c differ diff --git a/particles/thd2/heroes/reimu/reimu_01_effect.vpcf_c b/particles/thd2/heroes/reimu/reimu_01_effect.vpcf_c new file mode 100755 index 0000000..950aacc Binary files /dev/null and b/particles/thd2/heroes/reimu/reimu_01_effect.vpcf_c differ diff --git a/particles/thd2/heroes/reimu/reimu_01_effect_b.vpcf_c b/particles/thd2/heroes/reimu/reimu_01_effect_b.vpcf_c new file mode 100755 index 0000000..6b0becb Binary files /dev/null and b/particles/thd2/heroes/reimu/reimu_01_effect_b.vpcf_c differ diff --git a/particles/thd2/heroes/reimu/reimu_01_effect_c.vpcf_c b/particles/thd2/heroes/reimu/reimu_01_effect_c.vpcf_c new file mode 100755 index 0000000..e754a8b Binary files /dev/null and b/particles/thd2/heroes/reimu/reimu_01_effect_c.vpcf_c differ diff --git a/particles/thd2/heroes/reimu/reimu_01_effect_fire.vpcf_c b/particles/thd2/heroes/reimu/reimu_01_effect_fire.vpcf_c new file mode 100755 index 0000000..f0efd58 Binary files /dev/null and b/particles/thd2/heroes/reimu/reimu_01_effect_fire.vpcf_c differ diff --git a/particles/thd2/heroes/reimu/reimu_01_effect_light.vpcf_c b/particles/thd2/heroes/reimu/reimu_01_effect_light.vpcf_c new file mode 100755 index 0000000..f0d52b1 Binary files /dev/null and b/particles/thd2/heroes/reimu/reimu_01_effect_light.vpcf_c differ diff --git a/particles/thd2/heroes/reimu/reimu_03_effect.vpcf_c b/particles/thd2/heroes/reimu/reimu_03_effect.vpcf_c new file mode 100755 index 0000000..929be36 Binary files /dev/null and b/particles/thd2/heroes/reimu/reimu_03_effect.vpcf_c differ diff --git a/particles/thd2/heroes/reimu/reimu_04_effect.vpcf_c b/particles/thd2/heroes/reimu/reimu_04_effect.vpcf_c new file mode 100755 index 0000000..38bf10f Binary files /dev/null and b/particles/thd2/heroes/reimu/reimu_04_effect.vpcf_c differ diff --git a/particles/thd2/heroes/reimu/reimu_04_effect_a.vpcf_c b/particles/thd2/heroes/reimu/reimu_04_effect_a.vpcf_c new file mode 100755 index 0000000..a65c788 Binary files /dev/null and b/particles/thd2/heroes/reimu/reimu_04_effect_a.vpcf_c differ diff --git a/particles/thd2/heroes/reimu/reimu_04_effect_b.vpcf_c b/particles/thd2/heroes/reimu/reimu_04_effect_b.vpcf_c new file mode 100755 index 0000000..b901636 Binary files /dev/null and b/particles/thd2/heroes/reimu/reimu_04_effect_b.vpcf_c differ diff --git a/particles/thd2/heroes/reimu/reimu_04_effect_buff.vpcf_c b/particles/thd2/heroes/reimu/reimu_04_effect_buff.vpcf_c new file mode 100755 index 0000000..4147e9f Binary files /dev/null and b/particles/thd2/heroes/reimu/reimu_04_effect_buff.vpcf_c differ diff --git a/particles/thd2/heroes/reimu/reimu_04_effect_c.vpcf_c b/particles/thd2/heroes/reimu/reimu_04_effect_c.vpcf_c new file mode 100755 index 0000000..298030c Binary files /dev/null and b/particles/thd2/heroes/reimu/reimu_04_effect_c.vpcf_c differ diff --git a/particles/thd2/heroes/rumia/ability_rumia01_effect.vpcf_c b/particles/thd2/heroes/rumia/ability_rumia01_effect.vpcf_c new file mode 100755 index 0000000..b3ef877 Binary files /dev/null and b/particles/thd2/heroes/rumia/ability_rumia01_effect.vpcf_c differ diff --git a/particles/thd2/heroes/rumia/ability_rumia01_effect_b.vpcf_c b/particles/thd2/heroes/rumia/ability_rumia01_effect_b.vpcf_c new file mode 100755 index 0000000..31e183f Binary files /dev/null and b/particles/thd2/heroes/rumia/ability_rumia01_effect_b.vpcf_c differ diff --git a/particles/thd2/heroes/rumia/ability_rumia02_effect.vpcf_c b/particles/thd2/heroes/rumia/ability_rumia02_effect.vpcf_c new file mode 100755 index 0000000..4ef7d47 Binary files /dev/null and b/particles/thd2/heroes/rumia/ability_rumia02_effect.vpcf_c differ diff --git a/particles/thd2/heroes/sakuya/ability_sakuya_01.vpcf_c b/particles/thd2/heroes/sakuya/ability_sakuya_01.vpcf_c new file mode 100755 index 0000000..ceeea46 Binary files /dev/null and b/particles/thd2/heroes/sakuya/ability_sakuya_01.vpcf_c differ diff --git a/particles/thd2/heroes/sakuya/ability_sakuya_03.vpcf_c b/particles/thd2/heroes/sakuya/ability_sakuya_03.vpcf_c new file mode 100755 index 0000000..2e750e6 Binary files /dev/null and b/particles/thd2/heroes/sakuya/ability_sakuya_03.vpcf_c differ diff --git a/particles/thd2/heroes/sakuya/ability_sakuya_04.vpcf_c b/particles/thd2/heroes/sakuya/ability_sakuya_04.vpcf_c new file mode 100755 index 0000000..c6c0af4 Binary files /dev/null and b/particles/thd2/heroes/sakuya/ability_sakuya_04.vpcf_c differ diff --git a/particles/thd2/heroes/sakuya/ability_sakuya_04_a.vpcf_c b/particles/thd2/heroes/sakuya/ability_sakuya_04_a.vpcf_c new file mode 100755 index 0000000..2ff25e2 Binary files /dev/null and b/particles/thd2/heroes/sakuya/ability_sakuya_04_a.vpcf_c differ diff --git a/particles/thd2/heroes/sakuya/ability_sakuya_04_light.vpcf_c b/particles/thd2/heroes/sakuya/ability_sakuya_04_light.vpcf_c new file mode 100755 index 0000000..8fd35b1 Binary files /dev/null and b/particles/thd2/heroes/sakuya/ability_sakuya_04_light.vpcf_c differ diff --git a/particles/thd2/heroes/suika/ability_suika_03_effect.vpcf_c b/particles/thd2/heroes/suika/ability_suika_03_effect.vpcf_c new file mode 100755 index 0000000..b04d61b Binary files /dev/null and b/particles/thd2/heroes/suika/ability_suika_03_effect.vpcf_c differ diff --git a/particles/thd2/heroes/suika/ability_suika_04_effect.vpcf_c b/particles/thd2/heroes/suika/ability_suika_04_effect.vpcf_c new file mode 100755 index 0000000..9cc41ce Binary files /dev/null and b/particles/thd2/heroes/suika/ability_suika_04_effect.vpcf_c differ diff --git a/particles/thd2/heroes/thtd_rumia/ability_rumia_03.vpcf_c b/particles/thd2/heroes/thtd_rumia/ability_rumia_03.vpcf_c new file mode 100755 index 0000000..7c4d088 Binary files /dev/null and b/particles/thd2/heroes/thtd_rumia/ability_rumia_03.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho01_effect.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho01_effect.vpcf_c new file mode 100755 index 0000000..3d82857 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho01_effect.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho03_effect.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho03_effect.vpcf_c new file mode 100755 index 0000000..476c3e9 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho03_effect.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho03_effect_a.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho03_effect_a.vpcf_c new file mode 100755 index 0000000..3f12e41 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho03_effect_a.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho03_effect_b.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho03_effect_b.vpcf_c new file mode 100755 index 0000000..ea642c1 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho03_effect_b.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho03_effect_c.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho03_effect_c.vpcf_c new file mode 100755 index 0000000..e7d863f Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho03_effect_c.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho03_effect_d.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho03_effect_d.vpcf_c new file mode 100755 index 0000000..ce1bea2 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho03_effect_d.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_anticlockwise.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_anticlockwise.vpcf_c new file mode 100755 index 0000000..6075377 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_anticlockwise.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_anticlockwise_nuclear.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_anticlockwise_nuclear.vpcf_c new file mode 100755 index 0000000..88c876c Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_anticlockwise_nuclear.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_clockwise.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_clockwise.vpcf_c new file mode 100755 index 0000000..2c8cb70 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_clockwise.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_effect.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_effect.vpcf_c new file mode 100755 index 0000000..2f1eae0 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_effect.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_effect_a.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_effect_a.vpcf_c new file mode 100755 index 0000000..6f781a8 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_effect_a.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_effect_b.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_effect_b.vpcf_c new file mode 100755 index 0000000..026dc87 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_effect_b.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_end.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_end.vpcf_c new file mode 100755 index 0000000..6ece399 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_end.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_exploration.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_exploration.vpcf_c new file mode 100755 index 0000000..3655392 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_exploration.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_exploration_dark.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_exploration_dark.vpcf_c new file mode 100755 index 0000000..5bc7e2b Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_exploration_dark.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_firework.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_firework.vpcf_c new file mode 100755 index 0000000..97205f5 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_firework.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_ripple.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_ripple.vpcf_c new file mode 100755 index 0000000..037448c Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_ripple.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_scorch.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_scorch.vpcf_c new file mode 100755 index 0000000..e83dbfe Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_scorch.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_scorch_b.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_scorch_b.vpcf_c new file mode 100755 index 0000000..7a395f5 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_scorch_b.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_smoke.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_smoke.vpcf_c new file mode 100755 index 0000000..79f13ad Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_smoke.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_smoke_lightr.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_smoke_lightr.vpcf_c new file mode 100755 index 0000000..6d14ad1 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_smoke_lightr.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_spelling_sphere.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_spelling_sphere.vpcf_c new file mode 100755 index 0000000..fedd92d Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_spelling_sphere.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_sun.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_sun.vpcf_c new file mode 100755 index 0000000..633a223 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_sun.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_wave.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_wave.vpcf_c new file mode 100755 index 0000000..5606901 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_wave.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_wave_2.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_wave_2.vpcf_c new file mode 100755 index 0000000..3ec0f90 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_wave_2.vpcf_c differ diff --git a/particles/thd2/heroes/utsuho/ability_utsuho04_wave_2_i.vpcf_c b/particles/thd2/heroes/utsuho/ability_utsuho04_wave_2_i.vpcf_c new file mode 100755 index 0000000..09153d6 Binary files /dev/null and b/particles/thd2/heroes/utsuho/ability_utsuho04_wave_2_i.vpcf_c differ diff --git a/particles/thd2/heroes/youmu/ability_youmu_soul.vpcf_c b/particles/thd2/heroes/youmu/ability_youmu_soul.vpcf_c new file mode 100755 index 0000000..e2edf61 Binary files /dev/null and b/particles/thd2/heroes/youmu/ability_youmu_soul.vpcf_c differ diff --git a/particles/thd2/heroes/youmu/youmu_01_blink_effect.vpcf_c b/particles/thd2/heroes/youmu/youmu_01_blink_effect.vpcf_c new file mode 100755 index 0000000..7161f33 Binary files /dev/null and b/particles/thd2/heroes/youmu/youmu_01_blink_effect.vpcf_c differ diff --git a/particles/thd2/heroes/youmu/youmu_01_blink_effect_a.vpcf_c b/particles/thd2/heroes/youmu/youmu_01_blink_effect_a.vpcf_c new file mode 100755 index 0000000..23dcc25 Binary files /dev/null and b/particles/thd2/heroes/youmu/youmu_01_blink_effect_a.vpcf_c differ diff --git a/particles/thd2/heroes/youmu/youmu_01_blink_effect_b.vpcf_c b/particles/thd2/heroes/youmu/youmu_01_blink_effect_b.vpcf_c new file mode 100755 index 0000000..ad9ea63 Binary files /dev/null and b/particles/thd2/heroes/youmu/youmu_01_blink_effect_b.vpcf_c differ diff --git a/particles/thd2/heroes/youmu/youmu_01_blink_effect_c.vpcf_c b/particles/thd2/heroes/youmu/youmu_01_blink_effect_c.vpcf_c new file mode 100755 index 0000000..a8bae92 Binary files /dev/null and b/particles/thd2/heroes/youmu/youmu_01_blink_effect_c.vpcf_c differ diff --git a/particles/thd2/heroes/youmu/youmu_01_blink_effect_d.vpcf_c b/particles/thd2/heroes/youmu/youmu_01_blink_effect_d.vpcf_c new file mode 100755 index 0000000..7172207 Binary files /dev/null and b/particles/thd2/heroes/youmu/youmu_01_blink_effect_d.vpcf_c differ diff --git a/particles/thd2/heroes/youmu/youmu_01_blink_effect_e.vpcf_c b/particles/thd2/heroes/youmu/youmu_01_blink_effect_e.vpcf_c new file mode 100755 index 0000000..c0e9e01 Binary files /dev/null and b/particles/thd2/heroes/youmu/youmu_01_blink_effect_e.vpcf_c differ diff --git a/particles/thd2/heroes/youmu/youmu_04_blossoms_effect.vpcf_c b/particles/thd2/heroes/youmu/youmu_04_blossoms_effect.vpcf_c new file mode 100755 index 0000000..2eae028 Binary files /dev/null and b/particles/thd2/heroes/youmu/youmu_04_blossoms_effect.vpcf_c differ diff --git a/particles/thd2/heroes/youmu/youmu_04_sword_effect.vpcf_c b/particles/thd2/heroes/youmu/youmu_04_sword_effect.vpcf_c new file mode 100755 index 0000000..510ec06 Binary files /dev/null and b/particles/thd2/heroes/youmu/youmu_04_sword_effect.vpcf_c differ diff --git a/particles/thd2/heroes/youmu/youmu_04_sword_effect_light.vpcf_c b/particles/thd2/heroes/youmu/youmu_04_sword_effect_light.vpcf_c new file mode 100755 index 0000000..85854f1 Binary files /dev/null and b/particles/thd2/heroes/youmu/youmu_04_sword_effect_light.vpcf_c differ diff --git a/particles/thd2/heroes/youmu/youmu_04_word.vpcf_c b/particles/thd2/heroes/youmu/youmu_04_word.vpcf_c new file mode 100755 index 0000000..ca8273b Binary files /dev/null and b/particles/thd2/heroes/youmu/youmu_04_word.vpcf_c differ diff --git a/particles/thd2/heroes/yugi/yugi_slam.vpcf_c b/particles/thd2/heroes/yugi/yugi_slam.vpcf_c new file mode 100755 index 0000000..d072274 Binary files /dev/null and b/particles/thd2/heroes/yugi/yugi_slam.vpcf_c differ diff --git a/particles/thd2/heroes/yugi/yugi_slam_delay.vpcf_c b/particles/thd2/heroes/yugi/yugi_slam_delay.vpcf_c new file mode 100755 index 0000000..b33df41 Binary files /dev/null and b/particles/thd2/heroes/yugi/yugi_slam_delay.vpcf_c differ diff --git a/particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect.vpcf_c b/particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect.vpcf_c new file mode 100755 index 0000000..7f71ac0 Binary files /dev/null and b/particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect.vpcf_c differ diff --git a/particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect_a.vpcf_c b/particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect_a.vpcf_c new file mode 100755 index 0000000..97aa7c3 Binary files /dev/null and b/particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect_a.vpcf_c differ diff --git a/particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect_g.vpcf_c b/particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect_g.vpcf_c new file mode 100755 index 0000000..85194e6 Binary files /dev/null and b/particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect_g.vpcf_c differ diff --git a/particles/thd2/items/item_bad_man_card.vpcf_c b/particles/thd2/items/item_bad_man_card.vpcf_c new file mode 100755 index 0000000..4b7f148 Binary files /dev/null and b/particles/thd2/items/item_bad_man_card.vpcf_c differ diff --git a/particles/thd2/items/item_ballon.vpcf_c b/particles/thd2/items/item_ballon.vpcf_c new file mode 100755 index 0000000..0b7faea Binary files /dev/null and b/particles/thd2/items/item_ballon.vpcf_c differ diff --git a/particles/thd2/items/item_camera.vpcf_c b/particles/thd2/items/item_camera.vpcf_c new file mode 100755 index 0000000..df66eb7 Binary files /dev/null and b/particles/thd2/items/item_camera.vpcf_c differ diff --git a/particles/thd2/items/item_darkred_umbrella_fog_attach.vpcf_c b/particles/thd2/items/item_darkred_umbrella_fog_attach.vpcf_c new file mode 100755 index 0000000..a43b2c7 Binary files /dev/null and b/particles/thd2/items/item_darkred_umbrella_fog_attach.vpcf_c differ diff --git a/particles/thd2/items/item_donation_box.vpcf_c b/particles/thd2/items/item_donation_box.vpcf_c new file mode 100755 index 0000000..d76e631 Binary files /dev/null and b/particles/thd2/items/item_donation_box.vpcf_c differ diff --git a/particles/thd2/items/item_donation_box_a.vpcf_c b/particles/thd2/items/item_donation_box_a.vpcf_c new file mode 100755 index 0000000..137ab7c Binary files /dev/null and b/particles/thd2/items/item_donation_box_a.vpcf_c differ diff --git a/particles/thd2/items/item_donation_box_b.vpcf_c b/particles/thd2/items/item_donation_box_b.vpcf_c new file mode 100755 index 0000000..add980f Binary files /dev/null and b/particles/thd2/items/item_donation_box_b.vpcf_c differ diff --git a/particles/thd2/items/item_donation_box_sparkrays.vpcf_c b/particles/thd2/items/item_donation_box_sparkrays.vpcf_c new file mode 100755 index 0000000..b7ec4df Binary files /dev/null and b/particles/thd2/items/item_donation_box_sparkrays.vpcf_c differ diff --git a/particles/thd2/items/item_donation_box_sparkrays_a.vpcf_c b/particles/thd2/items/item_donation_box_sparkrays_a.vpcf_c new file mode 100755 index 0000000..db91194 Binary files /dev/null and b/particles/thd2/items/item_donation_box_sparkrays_a.vpcf_c differ diff --git a/particles/thd2/items/item_donation_box_sparkrays_b.vpcf_c b/particles/thd2/items/item_donation_box_sparkrays_b.vpcf_c new file mode 100755 index 0000000..7e76268 Binary files /dev/null and b/particles/thd2/items/item_donation_box_sparkrays_b.vpcf_c differ diff --git a/particles/thd2/items/item_dragon_star.vpcf_c b/particles/thd2/items/item_dragon_star.vpcf_c new file mode 100755 index 0000000..fd6a15f Binary files /dev/null and b/particles/thd2/items/item_dragon_star.vpcf_c differ diff --git a/particles/thd2/items/item_frock.vpcf_c b/particles/thd2/items/item_frock.vpcf_c new file mode 100755 index 0000000..cd4a686 Binary files /dev/null and b/particles/thd2/items/item_frock.vpcf_c differ diff --git a/particles/thd2/items/item_frock_b.vpcf_c b/particles/thd2/items/item_frock_b.vpcf_c new file mode 100755 index 0000000..1ce85b5 Binary files /dev/null and b/particles/thd2/items/item_frock_b.vpcf_c differ diff --git a/particles/thd2/items/item_good_man_card.vpcf_c b/particles/thd2/items/item_good_man_card.vpcf_c new file mode 100755 index 0000000..06e8c55 Binary files /dev/null and b/particles/thd2/items/item_good_man_card.vpcf_c differ diff --git a/particles/thd2/items/item_kafziel.vpcf_c b/particles/thd2/items/item_kafziel.vpcf_c new file mode 100755 index 0000000..de73290 Binary files /dev/null and b/particles/thd2/items/item_kafziel.vpcf_c differ diff --git a/particles/thd2/items/item_lily.vpcf_c b/particles/thd2/items/item_lily.vpcf_c new file mode 100755 index 0000000..72a5b0a Binary files /dev/null and b/particles/thd2/items/item_lily.vpcf_c differ diff --git a/particles/thd2/items/item_love_man_card.vpcf_c b/particles/thd2/items/item_love_man_card.vpcf_c new file mode 100755 index 0000000..b0fd3a6 Binary files /dev/null and b/particles/thd2/items/item_love_man_card.vpcf_c differ diff --git a/particles/thd2/items/item_moon_bow.vpcf_c b/particles/thd2/items/item_moon_bow.vpcf_c new file mode 100755 index 0000000..8c88a26 Binary files /dev/null and b/particles/thd2/items/item_moon_bow.vpcf_c differ diff --git a/particles/thd2/items/item_morenjingjuan.vpcf_c b/particles/thd2/items/item_morenjingjuan.vpcf_c new file mode 100755 index 0000000..905d738 Binary files /dev/null and b/particles/thd2/items/item_morenjingjuan.vpcf_c differ diff --git a/particles/thd2/items/item_morenjingjuan_a.vpcf_c b/particles/thd2/items/item_morenjingjuan_a.vpcf_c new file mode 100755 index 0000000..6848aa2 Binary files /dev/null and b/particles/thd2/items/item_morenjingjuan_a.vpcf_c differ diff --git a/particles/thd2/items/item_morenjingjuan_b.vpcf_c b/particles/thd2/items/item_morenjingjuan_b.vpcf_c new file mode 100755 index 0000000..2a07468 Binary files /dev/null and b/particles/thd2/items/item_morenjingjuan_b.vpcf_c differ diff --git a/particles/thd2/items/item_morenjingjuan_c.vpcf_c b/particles/thd2/items/item_morenjingjuan_c.vpcf_c new file mode 100755 index 0000000..a07e4be Binary files /dev/null and b/particles/thd2/items/item_morenjingjuan_c.vpcf_c differ diff --git a/particles/thd2/items/item_morenjingjuan_d.vpcf_c b/particles/thd2/items/item_morenjingjuan_d.vpcf_c new file mode 100755 index 0000000..0b32672 Binary files /dev/null and b/particles/thd2/items/item_morenjingjuan_d.vpcf_c differ diff --git a/particles/thd2/items/item_mr_yang.vpcf_c b/particles/thd2/items/item_mr_yang.vpcf_c new file mode 100755 index 0000000..398f6ad Binary files /dev/null and b/particles/thd2/items/item_mr_yang.vpcf_c differ diff --git a/particles/thd2/items/item_phoenix_wing.vpcf_c b/particles/thd2/items/item_phoenix_wing.vpcf_c new file mode 100755 index 0000000..8980e6b Binary files /dev/null and b/particles/thd2/items/item_phoenix_wing.vpcf_c differ diff --git a/particles/thd2/items/item_pocket_watch.vpcf_c b/particles/thd2/items/item_pocket_watch.vpcf_c new file mode 100755 index 0000000..cacf5ad Binary files /dev/null and b/particles/thd2/items/item_pocket_watch.vpcf_c differ diff --git a/particles/thd2/items/item_pocket_watch_b.vpcf_c b/particles/thd2/items/item_pocket_watch_b.vpcf_c new file mode 100755 index 0000000..8b7aab1 Binary files /dev/null and b/particles/thd2/items/item_pocket_watch_b.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing.vpcf_c b/particles/thd2/items/item_qijizhixing.vpcf_c new file mode 100755 index 0000000..5046501 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_a.vpcf_c b/particles/thd2/items/item_qijizhixing_a.vpcf_c new file mode 100755 index 0000000..b428b31 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_a.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_b.vpcf_c b/particles/thd2/items/item_qijizhixing_b.vpcf_c new file mode 100755 index 0000000..68d86b8 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_b.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_c.vpcf_c b/particles/thd2/items/item_qijizhixing_c.vpcf_c new file mode 100755 index 0000000..ed064b9 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_c.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_d.vpcf_c b/particles/thd2/items/item_qijizhixing_d.vpcf_c new file mode 100755 index 0000000..cfb1df6 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_d.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_e.vpcf_c b/particles/thd2/items/item_qijizhixing_e.vpcf_c new file mode 100755 index 0000000..f77ec47 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_e.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_f.vpcf_c b/particles/thd2/items/item_qijizhixing_f.vpcf_c new file mode 100755 index 0000000..f5391b9 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_f.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_g.vpcf_c b/particles/thd2/items/item_qijizhixing_g.vpcf_c new file mode 100755 index 0000000..64d4a72 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_g.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_h.vpcf_c b/particles/thd2/items/item_qijizhixing_h.vpcf_c new file mode 100755 index 0000000..4e3e0a1 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_h.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_i.vpcf_c b/particles/thd2/items/item_qijizhixing_i.vpcf_c new file mode 100755 index 0000000..c5bae17 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_i.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_j.vpcf_c b/particles/thd2/items/item_qijizhixing_j.vpcf_c new file mode 100755 index 0000000..8ad6c02 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_j.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_k.vpcf_c b/particles/thd2/items/item_qijizhixing_k.vpcf_c new file mode 100755 index 0000000..94762b5 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_k.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_l.vpcf_c b/particles/thd2/items/item_qijizhixing_l.vpcf_c new file mode 100755 index 0000000..d424d89 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_l.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_m.vpcf_c b/particles/thd2/items/item_qijizhixing_m.vpcf_c new file mode 100755 index 0000000..0ee7cf7 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_m.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_n.vpcf_c b/particles/thd2/items/item_qijizhixing_n.vpcf_c new file mode 100755 index 0000000..01135d8 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_n.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_o.vpcf_c b/particles/thd2/items/item_qijizhixing_o.vpcf_c new file mode 100755 index 0000000..2d6a386 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_o.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_p.vpcf_c b/particles/thd2/items/item_qijizhixing_p.vpcf_c new file mode 100755 index 0000000..c55829c Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_p.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_q.vpcf_c b/particles/thd2/items/item_qijizhixing_q.vpcf_c new file mode 100755 index 0000000..da11ec8 Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_q.vpcf_c differ diff --git a/particles/thd2/items/item_qijizhixing_r.vpcf_c b/particles/thd2/items/item_qijizhixing_r.vpcf_c new file mode 100755 index 0000000..24c116d Binary files /dev/null and b/particles/thd2/items/item_qijizhixing_r.vpcf_c differ diff --git a/particles/thd2/items/item_rocket.vpcf_c b/particles/thd2/items/item_rocket.vpcf_c new file mode 100755 index 0000000..92e39f3 Binary files /dev/null and b/particles/thd2/items/item_rocket.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia.vpcf_c b/particles/thd2/items/item_shizijia.vpcf_c new file mode 100755 index 0000000..6c8f334 Binary files /dev/null and b/particles/thd2/items/item_shizijia.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_a.vpcf_c b/particles/thd2/items/item_shizijia_a.vpcf_c new file mode 100755 index 0000000..e76af51 Binary files /dev/null and b/particles/thd2/items/item_shizijia_a.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_b.vpcf_c b/particles/thd2/items/item_shizijia_b.vpcf_c new file mode 100755 index 0000000..d71c55d Binary files /dev/null and b/particles/thd2/items/item_shizijia_b.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_b0.vpcf_c b/particles/thd2/items/item_shizijia_b0.vpcf_c new file mode 100755 index 0000000..454ac73 Binary files /dev/null and b/particles/thd2/items/item_shizijia_b0.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_b0a.vpcf_c b/particles/thd2/items/item_shizijia_b0a.vpcf_c new file mode 100755 index 0000000..910f2dc Binary files /dev/null and b/particles/thd2/items/item_shizijia_b0a.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_b1.vpcf_c b/particles/thd2/items/item_shizijia_b1.vpcf_c new file mode 100755 index 0000000..0f41c69 Binary files /dev/null and b/particles/thd2/items/item_shizijia_b1.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_b1a.vpcf_c b/particles/thd2/items/item_shizijia_b1a.vpcf_c new file mode 100755 index 0000000..72d64dd Binary files /dev/null and b/particles/thd2/items/item_shizijia_b1a.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_b2.vpcf_c b/particles/thd2/items/item_shizijia_b2.vpcf_c new file mode 100755 index 0000000..512be2b Binary files /dev/null and b/particles/thd2/items/item_shizijia_b2.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_b3.vpcf_c b/particles/thd2/items/item_shizijia_b3.vpcf_c new file mode 100755 index 0000000..40c40f8 Binary files /dev/null and b/particles/thd2/items/item_shizijia_b3.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_c.vpcf_c b/particles/thd2/items/item_shizijia_c.vpcf_c new file mode 100755 index 0000000..5b20d89 Binary files /dev/null and b/particles/thd2/items/item_shizijia_c.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_c0.vpcf_c b/particles/thd2/items/item_shizijia_c0.vpcf_c new file mode 100755 index 0000000..b2a354a Binary files /dev/null and b/particles/thd2/items/item_shizijia_c0.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_d.vpcf_c b/particles/thd2/items/item_shizijia_d.vpcf_c new file mode 100755 index 0000000..256988f Binary files /dev/null and b/particles/thd2/items/item_shizijia_d.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_d0.vpcf_c b/particles/thd2/items/item_shizijia_d0.vpcf_c new file mode 100755 index 0000000..c6be31e Binary files /dev/null and b/particles/thd2/items/item_shizijia_d0.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_d1.vpcf_c b/particles/thd2/items/item_shizijia_d1.vpcf_c new file mode 100755 index 0000000..4b8dbe5 Binary files /dev/null and b/particles/thd2/items/item_shizijia_d1.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_d2.vpcf_c b/particles/thd2/items/item_shizijia_d2.vpcf_c new file mode 100755 index 0000000..72d4c24 Binary files /dev/null and b/particles/thd2/items/item_shizijia_d2.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_d3.vpcf_c b/particles/thd2/items/item_shizijia_d3.vpcf_c new file mode 100755 index 0000000..7cf1f76 Binary files /dev/null and b/particles/thd2/items/item_shizijia_d3.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_d4.vpcf_c b/particles/thd2/items/item_shizijia_d4.vpcf_c new file mode 100755 index 0000000..d45e4df Binary files /dev/null and b/particles/thd2/items/item_shizijia_d4.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_e.vpcf_c b/particles/thd2/items/item_shizijia_e.vpcf_c new file mode 100755 index 0000000..2d37217 Binary files /dev/null and b/particles/thd2/items/item_shizijia_e.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_f.vpcf_c b/particles/thd2/items/item_shizijia_f.vpcf_c new file mode 100755 index 0000000..0ed420e Binary files /dev/null and b/particles/thd2/items/item_shizijia_f.vpcf_c differ diff --git a/particles/thd2/items/item_shizijia_g.vpcf_c b/particles/thd2/items/item_shizijia_g.vpcf_c new file mode 100755 index 0000000..eb2ada2 Binary files /dev/null and b/particles/thd2/items/item_shizijia_g.vpcf_c differ diff --git a/particles/thd2/items/item_tsundere.vpcf_c b/particles/thd2/items/item_tsundere.vpcf_c new file mode 100755 index 0000000..2436b41 Binary files /dev/null and b/particles/thd2/items/item_tsundere.vpcf_c differ diff --git a/particles/thd2/items/item_unlucky_man_card.vpcf_c b/particles/thd2/items/item_unlucky_man_card.vpcf_c new file mode 100755 index 0000000..15a1829 Binary files /dev/null and b/particles/thd2/items/item_unlucky_man_card.vpcf_c differ diff --git a/particles/thd2/items/item_yatagarasu.vpcf_c b/particles/thd2/items/item_yatagarasu.vpcf_c new file mode 100755 index 0000000..2b42ffb Binary files /dev/null and b/particles/thd2/items/item_yatagarasu.vpcf_c differ diff --git a/particles/thd2/items/item_zaiezhizhu_b.vpcf_c b/particles/thd2/items/item_zaiezhizhu_b.vpcf_c new file mode 100755 index 0000000..5a91709 Binary files /dev/null and b/particles/thd2/items/item_zaiezhizhu_b.vpcf_c differ diff --git a/particles/thd2/items/item_zaiezhizhurenxing.vpcf_c b/particles/thd2/items/item_zaiezhizhurenxing.vpcf_c new file mode 100755 index 0000000..7350113 Binary files /dev/null and b/particles/thd2/items/item_zaiezhizhurenxing.vpcf_c differ diff --git a/particles/thd2/tiaotai.vpcf_c b/particles/thd2/tiaotai.vpcf_c new file mode 100755 index 0000000..1b0228b Binary files /dev/null and b/particles/thd2/tiaotai.vpcf_c differ diff --git a/particles/thd2/wenquan.vpcf_c b/particles/thd2/wenquan.vpcf_c new file mode 100755 index 0000000..1547cd3 Binary files /dev/null and b/particles/thd2/wenquan.vpcf_c differ diff --git a/particles/thtd/emoji/thtd_msg_hongliange.vpcf_c b/particles/thtd/emoji/thtd_msg_hongliange.vpcf_c new file mode 100755 index 0000000..8af0267 Binary files /dev/null and b/particles/thtd/emoji/thtd_msg_hongliange.vpcf_c differ diff --git a/particles/thtd/msg/thtd_msg_food.vpcf_c b/particles/thtd/msg/thtd_msg_food.vpcf_c new file mode 100755 index 0000000..cfcb015 Binary files /dev/null and b/particles/thtd/msg/thtd_msg_food.vpcf_c differ diff --git a/particles/thtd/msg/thtd_msg_level.vpcf_c b/particles/thtd/msg/thtd_msg_level.vpcf_c new file mode 100755 index 0000000..1bb6a0e Binary files /dev/null and b/particles/thtd/msg/thtd_msg_level.vpcf_c differ diff --git a/particles/thtd/msg/thtd_msg_star.vpcf_c b/particles/thtd/msg/thtd_msg_star.vpcf_c new file mode 100755 index 0000000..7fd3399 Binary files /dev/null and b/particles/thtd/msg/thtd_msg_star.vpcf_c differ diff --git a/particles/thtd_item/ability_item_2022.vpcf_c b/particles/thtd_item/ability_item_2022.vpcf_c new file mode 100755 index 0000000..d6fc055 Binary files /dev/null and b/particles/thtd_item/ability_item_2022.vpcf_c differ diff --git a/particles/thtd_item/ability_item_2022_a.vpcf_c b/particles/thtd_item/ability_item_2022_a.vpcf_c new file mode 100755 index 0000000..7431732 Binary files /dev/null and b/particles/thtd_item/ability_item_2022_a.vpcf_c differ diff --git a/particles/thtd_item/ability_item_2022_b.vpcf_c b/particles/thtd_item/ability_item_2022_b.vpcf_c new file mode 100755 index 0000000..3f4b09a Binary files /dev/null and b/particles/thtd_item/ability_item_2022_b.vpcf_c differ diff --git a/particles/thtd_item/ability_item_2022_c.vpcf_c b/particles/thtd_item/ability_item_2022_c.vpcf_c new file mode 100755 index 0000000..4bff738 Binary files /dev/null and b/particles/thtd_item/ability_item_2022_c.vpcf_c differ diff --git a/particles/thtd_item/ability_item_2022_d.vpcf_c b/particles/thtd_item/ability_item_2022_d.vpcf_c new file mode 100755 index 0000000..5757b3a Binary files /dev/null and b/particles/thtd_item/ability_item_2022_d.vpcf_c differ diff --git a/particles/thtd_item/ability_item_2022_e.vpcf_c b/particles/thtd_item/ability_item_2022_e.vpcf_c new file mode 100755 index 0000000..eb1bf6a Binary files /dev/null and b/particles/thtd_item/ability_item_2022_e.vpcf_c differ diff --git a/particles/thtd_item/ability_item_2022_f.vpcf_c b/particles/thtd_item/ability_item_2022_f.vpcf_c new file mode 100755 index 0000000..0fde605 Binary files /dev/null and b/particles/thtd_item/ability_item_2022_f.vpcf_c differ diff --git a/particles/thtd_item/ability_item_2022_g.vpcf_c b/particles/thtd_item/ability_item_2022_g.vpcf_c new file mode 100755 index 0000000..874935e Binary files /dev/null and b/particles/thtd_item/ability_item_2022_g.vpcf_c differ diff --git a/particles/thtd_item/ability_item_2022_h.vpcf_c b/particles/thtd_item/ability_item_2022_h.vpcf_c new file mode 100755 index 0000000..fd0909f Binary files /dev/null and b/particles/thtd_item/ability_item_2022_h.vpcf_c differ diff --git a/particles/thtd_item/ability_item_2022_i.vpcf_c b/particles/thtd_item/ability_item_2022_i.vpcf_c new file mode 100755 index 0000000..61d0f65 Binary files /dev/null and b/particles/thtd_item/ability_item_2022_i.vpcf_c differ diff --git a/particles/ui/attacking_process.vpcf_c b/particles/ui/attacking_process.vpcf_c new file mode 100755 index 0000000..7f58bd5 Binary files /dev/null and b/particles/ui/attacking_process.vpcf_c differ diff --git a/particles/ui/card_bar.vpcf_c b/particles/ui/card_bar.vpcf_c new file mode 100755 index 0000000..b739368 Binary files /dev/null and b/particles/ui/card_bar.vpcf_c differ diff --git a/particles/ui/card_bar_a.vpcf_c b/particles/ui/card_bar_a.vpcf_c new file mode 100755 index 0000000..ad8cb2a Binary files /dev/null and b/particles/ui/card_bar_a.vpcf_c differ diff --git a/particles/ui/card_bar_sr.vpcf_c b/particles/ui/card_bar_sr.vpcf_c new file mode 100755 index 0000000..491a743 Binary files /dev/null and b/particles/ui/card_bar_sr.vpcf_c differ diff --git a/particles/ui/card_bar_sr_a.vpcf_c b/particles/ui/card_bar_sr_a.vpcf_c new file mode 100755 index 0000000..234e3c8 Binary files /dev/null and b/particles/ui/card_bar_sr_a.vpcf_c differ diff --git a/particles/ui/card_bar_ssr.vpcf_c b/particles/ui/card_bar_ssr.vpcf_c new file mode 100755 index 0000000..d981d66 Binary files /dev/null and b/particles/ui/card_bar_ssr.vpcf_c differ diff --git a/particles/ui/card_bar_ssr_a.vpcf_c b/particles/ui/card_bar_ssr_a.vpcf_c new file mode 100755 index 0000000..a6a64e1 Binary files /dev/null and b/particles/ui/card_bar_ssr_a.vpcf_c differ diff --git a/particles/ui/clicked.vpcf_c b/particles/ui/clicked.vpcf_c new file mode 100755 index 0000000..38a8eb7 Binary files /dev/null and b/particles/ui/clicked.vpcf_c differ diff --git a/particles/ui/clicked_point.vpcf_c b/particles/ui/clicked_point.vpcf_c new file mode 100755 index 0000000..d2a4d35 Binary files /dev/null and b/particles/ui/clicked_point.vpcf_c differ diff --git a/particles/ui/clicked_point_a.vpcf_c b/particles/ui/clicked_point_a.vpcf_c new file mode 100755 index 0000000..00df44d Binary files /dev/null and b/particles/ui/clicked_point_a.vpcf_c differ diff --git a/particles/ui/draw_card_success.vpcf_c b/particles/ui/draw_card_success.vpcf_c new file mode 100755 index 0000000..6918d8e Binary files /dev/null and b/particles/ui/draw_card_success.vpcf_c differ diff --git a/particles/ui/select_card.vpcf_c b/particles/ui/select_card.vpcf_c new file mode 100755 index 0000000..338a88b Binary files /dev/null and b/particles/ui/select_card.vpcf_c differ diff --git a/particles/ui/wait_extract_card.vpcf_c b/particles/ui/wait_extract_card.vpcf_c new file mode 100755 index 0000000..b126bb7 Binary files /dev/null and b/particles/ui/wait_extract_card.vpcf_c differ diff --git a/particles/units/heroes/hero_abaddon/abaddon_aphotic_shield_explosion_wave.vpcf_c b/particles/units/heroes/hero_abaddon/abaddon_aphotic_shield_explosion_wave.vpcf_c new file mode 100755 index 0000000..9841ca1 Binary files /dev/null and b/particles/units/heroes/hero_abaddon/abaddon_aphotic_shield_explosion_wave.vpcf_c differ diff --git a/particles/units/heroes/hero_bane/bane_fiendsgrip_blob.vpcf_c b/particles/units/heroes/hero_bane/bane_fiendsgrip_blob.vpcf_c new file mode 100755 index 0000000..e320692 Binary files /dev/null and b/particles/units/heroes/hero_bane/bane_fiendsgrip_blob.vpcf_c differ diff --git a/particles/units/heroes/hero_bane/bane_nightmare.vpcf_c b/particles/units/heroes/hero_bane/bane_nightmare.vpcf_c new file mode 100755 index 0000000..6f077d4 Binary files /dev/null and b/particles/units/heroes/hero_bane/bane_nightmare.vpcf_c differ diff --git a/particles/units/heroes/hero_bane/bane_nightmare_inkblots_thick.vpcf_c b/particles/units/heroes/hero_bane/bane_nightmare_inkblots_thick.vpcf_c new file mode 100755 index 0000000..31d7da9 Binary files /dev/null and b/particles/units/heroes/hero_bane/bane_nightmare_inkblots_thick.vpcf_c differ diff --git a/particles/units/heroes/hero_batrider/batrider_firefly_startflash.vpcf_c b/particles/units/heroes/hero_batrider/batrider_firefly_startflash.vpcf_c new file mode 100755 index 0000000..1f30334 Binary files /dev/null and b/particles/units/heroes/hero_batrider/batrider_firefly_startflash.vpcf_c differ diff --git a/particles/units/heroes/hero_batrider/batrider_flamebreak.vpcf_c b/particles/units/heroes/hero_batrider/batrider_flamebreak.vpcf_c new file mode 100755 index 0000000..dfe0029 Binary files /dev/null and b/particles/units/heroes/hero_batrider/batrider_flamebreak.vpcf_c differ diff --git a/particles/units/heroes/hero_batrider/batrider_flamebreak_explosion_g.vpcf_c b/particles/units/heroes/hero_batrider/batrider_flamebreak_explosion_g.vpcf_c new file mode 100755 index 0000000..6dfc5ef Binary files /dev/null and b/particles/units/heroes/hero_batrider/batrider_flamebreak_explosion_g.vpcf_c differ diff --git a/particles/units/heroes/hero_beastmaster/beastmaster_primal_roar_dust.vpcf_c b/particles/units/heroes/hero_beastmaster/beastmaster_primal_roar_dust.vpcf_c new file mode 100755 index 0000000..fecfa6a Binary files /dev/null and b/particles/units/heroes/hero_beastmaster/beastmaster_primal_roar_dust.vpcf_c differ diff --git a/particles/units/heroes/hero_brewmaster/brewmaster_cyclone.vpcf_c b/particles/units/heroes/hero_brewmaster/brewmaster_cyclone.vpcf_c new file mode 100755 index 0000000..c16719e Binary files /dev/null and b/particles/units/heroes/hero_brewmaster/brewmaster_cyclone.vpcf_c differ diff --git a/particles/units/heroes/hero_brewmaster/brewmaster_cyclone_distort.vpcf_c b/particles/units/heroes/hero_brewmaster/brewmaster_cyclone_distort.vpcf_c new file mode 100755 index 0000000..a8f070d Binary files /dev/null and b/particles/units/heroes/hero_brewmaster/brewmaster_cyclone_distort.vpcf_c differ diff --git a/particles/units/heroes/hero_brewmaster/brewmaster_cyclone_energy.vpcf_c b/particles/units/heroes/hero_brewmaster/brewmaster_cyclone_energy.vpcf_c new file mode 100755 index 0000000..3e30882 Binary files /dev/null and b/particles/units/heroes/hero_brewmaster/brewmaster_cyclone_energy.vpcf_c differ diff --git a/particles/units/heroes/hero_brewmaster/brewmaster_cyclone_glow.vpcf_c b/particles/units/heroes/hero_brewmaster/brewmaster_cyclone_glow.vpcf_c new file mode 100755 index 0000000..9484053 Binary files /dev/null and b/particles/units/heroes/hero_brewmaster/brewmaster_cyclone_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_brewmaster/brewmaster_pulverize.vpcf_c b/particles/units/heroes/hero_brewmaster/brewmaster_pulverize.vpcf_c new file mode 100755 index 0000000..7c23120 Binary files /dev/null and b/particles/units/heroes/hero_brewmaster/brewmaster_pulverize.vpcf_c differ diff --git a/particles/units/heroes/hero_brewmaster/brewmaster_pulverize_shock.vpcf_c b/particles/units/heroes/hero_brewmaster/brewmaster_pulverize_shock.vpcf_c new file mode 100755 index 0000000..40b5b8c Binary files /dev/null and b/particles/units/heroes/hero_brewmaster/brewmaster_pulverize_shock.vpcf_c differ diff --git a/particles/units/heroes/hero_brewmaster/brewmaster_pulverize_shock_b.vpcf_c b/particles/units/heroes/hero_brewmaster/brewmaster_pulverize_shock_b.vpcf_c new file mode 100755 index 0000000..b79d2a9 Binary files /dev/null and b/particles/units/heroes/hero_brewmaster/brewmaster_pulverize_shock_b.vpcf_c differ diff --git a/particles/units/heroes/hero_brewmaster/brewmaster_pulverize_soil.vpcf_c b/particles/units/heroes/hero_brewmaster/brewmaster_pulverize_soil.vpcf_c new file mode 100755 index 0000000..f8ba6b1 Binary files /dev/null and b/particles/units/heroes/hero_brewmaster/brewmaster_pulverize_soil.vpcf_c differ diff --git a/particles/units/heroes/hero_chen/chen_holy_persuasion_d.vpcf_c b/particles/units/heroes/hero_chen/chen_holy_persuasion_d.vpcf_c new file mode 100755 index 0000000..4f69897 Binary files /dev/null and b/particles/units/heroes/hero_chen/chen_holy_persuasion_d.vpcf_c differ diff --git a/particles/units/heroes/hero_chen/chen_holy_persuasion_e.vpcf_c b/particles/units/heroes/hero_chen/chen_holy_persuasion_e.vpcf_c new file mode 100755 index 0000000..eb0c280 Binary files /dev/null and b/particles/units/heroes/hero_chen/chen_holy_persuasion_e.vpcf_c differ diff --git a/particles/units/heroes/hero_clinkz/clinkz_body_fire.vpcf_c b/particles/units/heroes/hero_clinkz/clinkz_body_fire.vpcf_c new file mode 100755 index 0000000..d58d435 Binary files /dev/null and b/particles/units/heroes/hero_clinkz/clinkz_body_fire.vpcf_c differ diff --git a/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm.vpcf_c b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm.vpcf_c new file mode 100755 index 0000000..13b2033 Binary files /dev/null and b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm.vpcf_c differ diff --git a/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_bats.vpcf_c b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_bats.vpcf_c new file mode 100755 index 0000000..560c835 Binary files /dev/null and b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_bats.vpcf_c differ diff --git a/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_bats_blur.vpcf_c b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_bats_blur.vpcf_c new file mode 100755 index 0000000..7c90024 Binary files /dev/null and b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_bats_blur.vpcf_c differ diff --git a/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_core01.vpcf_c b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_core01.vpcf_c new file mode 100755 index 0000000..27fe05a Binary files /dev/null and b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_core01.vpcf_c differ diff --git a/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_core02.vpcf_c b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_core02.vpcf_c new file mode 100755 index 0000000..cdb392a Binary files /dev/null and b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_core02.vpcf_c differ diff --git a/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_spawnbits.vpcf_c b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_spawnbits.vpcf_c new file mode 100755 index 0000000..97fc099 Binary files /dev/null and b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_spawnbits.vpcf_c differ diff --git a/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_spawnsmoke.vpcf_c b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_spawnsmoke.vpcf_c new file mode 100755 index 0000000..0369538 Binary files /dev/null and b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_spawnsmoke.vpcf_c differ diff --git a/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_spawnswirl.vpcf_c b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_spawnswirl.vpcf_c new file mode 100755 index 0000000..9c4ff42 Binary files /dev/null and b/particles/units/heroes/hero_death_prophet/death_prophet_carrion_swarm_spawnswirl.vpcf_c differ diff --git a/particles/units/heroes/hero_death_prophet/death_prophet_spirit_model.vpcf_c b/particles/units/heroes/hero_death_prophet/death_prophet_spirit_model.vpcf_c new file mode 100755 index 0000000..f4693c3 Binary files /dev/null and b/particles/units/heroes/hero_death_prophet/death_prophet_spirit_model.vpcf_c differ diff --git a/particles/units/heroes/hero_doom_bringer/doom_bringer_ambient.vpcf_c b/particles/units/heroes/hero_doom_bringer/doom_bringer_ambient.vpcf_c new file mode 100755 index 0000000..757a93e Binary files /dev/null and b/particles/units/heroes/hero_doom_bringer/doom_bringer_ambient.vpcf_c differ diff --git a/particles/units/heroes/hero_doom_bringer/doom_bringer_ambient_b.vpcf_c b/particles/units/heroes/hero_doom_bringer/doom_bringer_ambient_b.vpcf_c new file mode 100755 index 0000000..96ce3c1 Binary files /dev/null and b/particles/units/heroes/hero_doom_bringer/doom_bringer_ambient_b.vpcf_c differ diff --git a/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_ring_b.vpcf_c b/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_ring_b.vpcf_c new file mode 100755 index 0000000..aaea3c9 Binary files /dev/null and b/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_ring_b.vpcf_c differ diff --git a/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_ring_c.vpcf_c b/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_ring_c.vpcf_c new file mode 100755 index 0000000..1cc5206 Binary files /dev/null and b/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_ring_c.vpcf_c differ diff --git a/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_ring_d.vpcf_c b/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_ring_d.vpcf_c new file mode 100755 index 0000000..8c4f4db Binary files /dev/null and b/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_ring_d.vpcf_c differ diff --git a/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_ring_e.vpcf_c b/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_ring_e.vpcf_c new file mode 100755 index 0000000..944577e Binary files /dev/null and b/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_ring_e.vpcf_c differ diff --git a/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_sigil_c.vpcf_c b/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_sigil_c.vpcf_c new file mode 100755 index 0000000..d649550 Binary files /dev/null and b/particles/units/heroes/hero_doom_bringer/doom_bringer_doom_sigil_c.vpcf_c differ diff --git a/particles/units/heroes/hero_ember_spirit/ember_spirit_remnant_dash_trail_base.vpcf_c b/particles/units/heroes/hero_ember_spirit/ember_spirit_remnant_dash_trail_base.vpcf_c new file mode 100755 index 0000000..a0a2e13 Binary files /dev/null and b/particles/units/heroes/hero_ember_spirit/ember_spirit_remnant_dash_trail_base.vpcf_c differ diff --git a/particles/units/heroes/hero_invoker/invoker_base_attack.vpcf_c b/particles/units/heroes/hero_invoker/invoker_base_attack.vpcf_c new file mode 100755 index 0000000..26e3d1a Binary files /dev/null and b/particles/units/heroes/hero_invoker/invoker_base_attack.vpcf_c differ diff --git a/particles/units/heroes/hero_invoker/invoker_ice_wall_shards.vpcf_c b/particles/units/heroes/hero_invoker/invoker_ice_wall_shards.vpcf_c new file mode 100755 index 0000000..60e495b Binary files /dev/null and b/particles/units/heroes/hero_invoker/invoker_ice_wall_shards.vpcf_c differ diff --git a/particles/units/heroes/hero_invoker/invoker_ice_wall_snow_ground.vpcf_c b/particles/units/heroes/hero_invoker/invoker_ice_wall_snow_ground.vpcf_c new file mode 100755 index 0000000..5b033cb Binary files /dev/null and b/particles/units/heroes/hero_invoker/invoker_ice_wall_snow_ground.vpcf_c differ diff --git a/particles/units/heroes/hero_invoker/invoker_sun_strike.vpcf_c b/particles/units/heroes/hero_invoker/invoker_sun_strike.vpcf_c new file mode 100755 index 0000000..9110ccc Binary files /dev/null and b/particles/units/heroes/hero_invoker/invoker_sun_strike.vpcf_c differ diff --git a/particles/units/heroes/hero_jakiro/jakiro_base_attack_fire_ember_trail.vpcf_c b/particles/units/heroes/hero_jakiro/jakiro_base_attack_fire_ember_trail.vpcf_c new file mode 100755 index 0000000..67c9838 Binary files /dev/null and b/particles/units/heroes/hero_jakiro/jakiro_base_attack_fire_ember_trail.vpcf_c differ diff --git a/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_beam.vpcf_c b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_beam.vpcf_c new file mode 100755 index 0000000..3cf8deb Binary files /dev/null and b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_beam.vpcf_c differ diff --git a/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_cast_ring.vpcf_c b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_cast_ring.vpcf_c new file mode 100755 index 0000000..62fb417 Binary files /dev/null and b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_cast_ring.vpcf_c differ diff --git a/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_cast_ring02.vpcf_c b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_cast_ring02.vpcf_c new file mode 100755 index 0000000..42398f9 Binary files /dev/null and b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_cast_ring02.vpcf_c differ diff --git a/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_glow.vpcf_c b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_glow.vpcf_c new file mode 100755 index 0000000..2569ec4 Binary files /dev/null and b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_ground.vpcf_c b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_ground.vpcf_c new file mode 100755 index 0000000..818b6be Binary files /dev/null and b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_ground.vpcf_c differ diff --git a/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_ring.vpcf_c b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_ring.vpcf_c new file mode 100755 index 0000000..ac05252 Binary files /dev/null and b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_ring.vpcf_c differ diff --git a/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_spiral.vpcf_c b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_spiral.vpcf_c new file mode 100755 index 0000000..19f5586 Binary files /dev/null and b/particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic_spiral.vpcf_c differ diff --git a/particles/units/heroes/hero_leshrac/leshrac_pulse_nova_h.vpcf_c b/particles/units/heroes/hero_leshrac/leshrac_pulse_nova_h.vpcf_c new file mode 100755 index 0000000..1c59465 Binary files /dev/null and b/particles/units/heroes/hero_leshrac/leshrac_pulse_nova_h.vpcf_c differ diff --git a/particles/units/heroes/hero_leshrac/leshrac_pulse_nova_i.vpcf_c b/particles/units/heroes/hero_leshrac/leshrac_pulse_nova_i.vpcf_c new file mode 100755 index 0000000..8ecbf20 Binary files /dev/null and b/particles/units/heroes/hero_leshrac/leshrac_pulse_nova_i.vpcf_c differ diff --git a/particles/units/heroes/hero_lion/lion_base_attack.vpcf_c b/particles/units/heroes/hero_lion/lion_base_attack.vpcf_c new file mode 100755 index 0000000..4c839e2 Binary files /dev/null and b/particles/units/heroes/hero_lion/lion_base_attack.vpcf_c differ diff --git a/particles/units/heroes/hero_lion/lion_base_attack_arcs.vpcf_c b/particles/units/heroes/hero_lion/lion_base_attack_arcs.vpcf_c new file mode 100755 index 0000000..2d36d4d Binary files /dev/null and b/particles/units/heroes/hero_lion/lion_base_attack_arcs.vpcf_c differ diff --git a/particles/units/heroes/hero_lion/lion_base_attack_fingera.vpcf_c b/particles/units/heroes/hero_lion/lion_base_attack_fingera.vpcf_c new file mode 100755 index 0000000..3023f29 Binary files /dev/null and b/particles/units/heroes/hero_lion/lion_base_attack_fingera.vpcf_c differ diff --git a/particles/units/heroes/hero_lion/lion_base_attack_glow.vpcf_c b/particles/units/heroes/hero_lion/lion_base_attack_glow.vpcf_c new file mode 100755 index 0000000..15992d3 Binary files /dev/null and b/particles/units/heroes/hero_lion/lion_base_attack_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_lion/lion_base_attack_launch_glow.vpcf_c b/particles/units/heroes/hero_lion/lion_base_attack_launch_glow.vpcf_c new file mode 100755 index 0000000..79f68ae Binary files /dev/null and b/particles/units/heroes/hero_lion/lion_base_attack_launch_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_lion/lion_base_attack_trail.vpcf_c b/particles/units/heroes/hero_lion/lion_base_attack_trail.vpcf_c new file mode 100755 index 0000000..fa89e67 Binary files /dev/null and b/particles/units/heroes/hero_lion/lion_base_attack_trail.vpcf_c differ diff --git a/particles/units/heroes/hero_mirana/mirana_moonlight_owner.vpcf_c b/particles/units/heroes/hero_mirana/mirana_moonlight_owner.vpcf_c new file mode 100755 index 0000000..4ed69d6 Binary files /dev/null and b/particles/units/heroes/hero_mirana/mirana_moonlight_owner.vpcf_c differ diff --git a/particles/units/heroes/hero_mirana/mirana_moonlight_owner_b.vpcf_c b/particles/units/heroes/hero_mirana/mirana_moonlight_owner_b.vpcf_c new file mode 100755 index 0000000..438d8cf Binary files /dev/null and b/particles/units/heroes/hero_mirana/mirana_moonlight_owner_b.vpcf_c differ diff --git a/particles/units/heroes/hero_mirana/mirana_moonlight_owner_c.vpcf_c b/particles/units/heroes/hero_mirana/mirana_moonlight_owner_c.vpcf_c new file mode 100755 index 0000000..05f7285 Binary files /dev/null and b/particles/units/heroes/hero_mirana/mirana_moonlight_owner_c.vpcf_c differ diff --git a/particles/units/heroes/hero_mirana/mirana_spell_arrow_destruction.vpcf_c b/particles/units/heroes/hero_mirana/mirana_spell_arrow_destruction.vpcf_c new file mode 100755 index 0000000..6e9d24c Binary files /dev/null and b/particles/units/heroes/hero_mirana/mirana_spell_arrow_destruction.vpcf_c differ diff --git a/particles/units/heroes/hero_mirana/mirana_spell_arrow_destruction_sparkles.vpcf_c b/particles/units/heroes/hero_mirana/mirana_spell_arrow_destruction_sparkles.vpcf_c new file mode 100755 index 0000000..6045cc2 Binary files /dev/null and b/particles/units/heroes/hero_mirana/mirana_spell_arrow_destruction_sparkles.vpcf_c differ diff --git a/particles/units/heroes/hero_mirana/mirana_spell_arrow_ribbon_b.vpcf_c b/particles/units/heroes/hero_mirana/mirana_spell_arrow_ribbon_b.vpcf_c new file mode 100755 index 0000000..31131ac Binary files /dev/null and b/particles/units/heroes/hero_mirana/mirana_spell_arrow_ribbon_b.vpcf_c differ diff --git a/particles/units/heroes/hero_mirana/mirana_starfall_attack.vpcf_c b/particles/units/heroes/hero_mirana/mirana_starfall_attack.vpcf_c new file mode 100755 index 0000000..f9e8567 Binary files /dev/null and b/particles/units/heroes/hero_mirana/mirana_starfall_attack.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack.vpcf_c new file mode 100755 index 0000000..d1ccaa6 Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_cloud.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_cloud.vpcf_c new file mode 100755 index 0000000..912cbe3 Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_cloud.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_explosion.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_explosion.vpcf_c new file mode 100755 index 0000000..8ddb86b Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_explosion.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_explosion_b.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_explosion_b.vpcf_c new file mode 100755 index 0000000..29265d1 Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_explosion_b.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_explosion_flash.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_explosion_flash.vpcf_c new file mode 100755 index 0000000..0a7fd4e Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_explosion_flash.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_explosion_flash_b.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_explosion_flash_b.vpcf_c new file mode 100755 index 0000000..91277c3 Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_explosion_flash_b.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_flash.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_flash.vpcf_c new file mode 100755 index 0000000..85ce56e Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_flash.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_gas.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_gas.vpcf_c new file mode 100755 index 0000000..d7d1369 Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_gas.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_glow.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_glow.vpcf_c new file mode 100755 index 0000000..a7fab1a Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_launch.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_launch.vpcf_c new file mode 100755 index 0000000..cde9608 Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_launch.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_launch_b.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_launch_b.vpcf_c new file mode 100755 index 0000000..51b3c39 Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_launch_b.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_launch_exp.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_launch_exp.vpcf_c new file mode 100755 index 0000000..e5af77a Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_launch_exp.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_launch_glow.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_launch_glow.vpcf_c new file mode 100755 index 0000000..27503bb Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_launch_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_swirl.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_swirl.vpcf_c new file mode 100755 index 0000000..5b5af94 Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_swirl.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_trail_b.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_trail_b.vpcf_c new file mode 100755 index 0000000..5c679ca Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_trail_b.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_trail_c.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_trail_c.vpcf_c new file mode 100755 index 0000000..e494e87 Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_trail_c.vpcf_c differ diff --git a/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_trail_noise.vpcf_c b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_trail_noise.vpcf_c new file mode 100755 index 0000000..b2d2f8e Binary files /dev/null and b/particles/units/heroes/hero_necrolyte/necrolyte_base_attack_trail_noise.vpcf_c differ diff --git a/particles/units/heroes/hero_obsidian_destroyer/obsidian_death_model.vpcf_c b/particles/units/heroes/hero_obsidian_destroyer/obsidian_death_model.vpcf_c new file mode 100755 index 0000000..beaef45 Binary files /dev/null and b/particles/units/heroes/hero_obsidian_destroyer/obsidian_death_model.vpcf_c differ diff --git a/particles/units/heroes/hero_omniknight/omniknight_purification_cast_b.vpcf_c b/particles/units/heroes/hero_omniknight/omniknight_purification_cast_b.vpcf_c new file mode 100755 index 0000000..39d1cef Binary files /dev/null and b/particles/units/heroes/hero_omniknight/omniknight_purification_cast_b.vpcf_c differ diff --git a/particles/units/heroes/hero_omniknight/omniknight_repel_buff_cylinder.vpcf_c b/particles/units/heroes/hero_omniknight/omniknight_repel_buff_cylinder.vpcf_c new file mode 100755 index 0000000..c2b303c Binary files /dev/null and b/particles/units/heroes/hero_omniknight/omniknight_repel_buff_cylinder.vpcf_c differ diff --git a/particles/units/heroes/hero_phantom_assassin/phantom_assassin_stifling_dagger.vpcf_c b/particles/units/heroes/hero_phantom_assassin/phantom_assassin_stifling_dagger.vpcf_c new file mode 100755 index 0000000..e88a191 Binary files /dev/null and b/particles/units/heroes/hero_phantom_assassin/phantom_assassin_stifling_dagger.vpcf_c differ diff --git a/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground.vpcf_c b/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground.vpcf_c new file mode 100755 index 0000000..86230aa Binary files /dev/null and b/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground.vpcf_c differ diff --git a/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_cracks.vpcf_c b/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_cracks.vpcf_c new file mode 100755 index 0000000..69460d4 Binary files /dev/null and b/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_cracks.vpcf_c differ diff --git a/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_hit.vpcf_c b/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_hit.vpcf_c new file mode 100755 index 0000000..aea16a4 Binary files /dev/null and b/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_hit.vpcf_c differ diff --git a/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_hit_fireb.vpcf_c b/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_hit_fireb.vpcf_c new file mode 100755 index 0000000..d5ea90e Binary files /dev/null and b/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_hit_fireb.vpcf_c differ diff --git a/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_hit_glow.vpcf_c b/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_hit_glow.vpcf_c new file mode 100755 index 0000000..0d68eff Binary files /dev/null and b/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_hit_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_hit_smoke.vpcf_c b/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_hit_smoke.vpcf_c new file mode 100755 index 0000000..259c6c1 Binary files /dev/null and b/particles/units/heroes/hero_phoenix/phoenix_fire_spirit_ground_hit_smoke.vpcf_c differ diff --git a/particles/units/heroes/hero_phoenix/phoenix_sunray_tgt_sphere.vpcf_c b/particles/units/heroes/hero_phoenix/phoenix_sunray_tgt_sphere.vpcf_c new file mode 100755 index 0000000..f465717 Binary files /dev/null and b/particles/units/heroes/hero_phoenix/phoenix_sunray_tgt_sphere.vpcf_c differ diff --git a/particles/units/heroes/hero_puck/puck_illusory_orb_explode_b.vpcf_c b/particles/units/heroes/hero_puck/puck_illusory_orb_explode_b.vpcf_c new file mode 100755 index 0000000..fce673e Binary files /dev/null and b/particles/units/heroes/hero_puck/puck_illusory_orb_explode_b.vpcf_c differ diff --git a/particles/units/heroes/hero_puck/puck_illusory_orb_explode_c.vpcf_c b/particles/units/heroes/hero_puck/puck_illusory_orb_explode_c.vpcf_c new file mode 100755 index 0000000..d913ace Binary files /dev/null and b/particles/units/heroes/hero_puck/puck_illusory_orb_explode_c.vpcf_c differ diff --git a/particles/units/heroes/hero_queenofpain/queen_base_attack.vpcf_c b/particles/units/heroes/hero_queenofpain/queen_base_attack.vpcf_c new file mode 100755 index 0000000..d59560e Binary files /dev/null and b/particles/units/heroes/hero_queenofpain/queen_base_attack.vpcf_c differ diff --git a/particles/units/heroes/hero_queenofpain/queen_blink_start_model.vpcf_c b/particles/units/heroes/hero_queenofpain/queen_blink_start_model.vpcf_c new file mode 100755 index 0000000..22e355c Binary files /dev/null and b/particles/units/heroes/hero_queenofpain/queen_blink_start_model.vpcf_c differ diff --git a/particles/units/heroes/hero_queenofpain/queen_blink_start_smoke.vpcf_c b/particles/units/heroes/hero_queenofpain/queen_blink_start_smoke.vpcf_c new file mode 100755 index 0000000..0ce16b6 Binary files /dev/null and b/particles/units/heroes/hero_queenofpain/queen_blink_start_smoke.vpcf_c differ diff --git a/particles/units/heroes/hero_queenofpain/queen_blink_start_sparks.vpcf_c b/particles/units/heroes/hero_queenofpain/queen_blink_start_sparks.vpcf_c new file mode 100755 index 0000000..c8feafe Binary files /dev/null and b/particles/units/heroes/hero_queenofpain/queen_blink_start_sparks.vpcf_c differ diff --git a/particles/units/heroes/hero_queenofpain/queen_blink_start_sparks_follow.vpcf_c b/particles/units/heroes/hero_queenofpain/queen_blink_start_sparks_follow.vpcf_c new file mode 100755 index 0000000..8cfc1e6 Binary files /dev/null and b/particles/units/heroes/hero_queenofpain/queen_blink_start_sparks_follow.vpcf_c differ diff --git a/particles/units/heroes/hero_queenofpain/queen_blink_start_wisp.vpcf_c b/particles/units/heroes/hero_queenofpain/queen_blink_start_wisp.vpcf_c new file mode 100755 index 0000000..19ed24e Binary files /dev/null and b/particles/units/heroes/hero_queenofpain/queen_blink_start_wisp.vpcf_c differ diff --git a/particles/units/heroes/hero_queenofpain/queen_sonic_wave_rings.vpcf_c b/particles/units/heroes/hero_queenofpain/queen_sonic_wave_rings.vpcf_c new file mode 100755 index 0000000..ad395f8 Binary files /dev/null and b/particles/units/heroes/hero_queenofpain/queen_sonic_wave_rings.vpcf_c differ diff --git a/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion.vpcf_c b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion.vpcf_c new file mode 100755 index 0000000..71f6e8e Binary files /dev/null and b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion.vpcf_c differ diff --git a/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash.vpcf_c b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash.vpcf_c new file mode 100755 index 0000000..585a7cf Binary files /dev/null and b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash.vpcf_c differ diff --git a/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash_b.vpcf_c b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash_b.vpcf_c new file mode 100755 index 0000000..09517e7 Binary files /dev/null and b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash_b.vpcf_c differ diff --git a/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash_c.vpcf_c b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash_c.vpcf_c new file mode 100755 index 0000000..26e59a9 Binary files /dev/null and b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash_c.vpcf_c differ diff --git a/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash_f.vpcf_c b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash_f.vpcf_c new file mode 100755 index 0000000..9a062b9 Binary files /dev/null and b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash_f.vpcf_c differ diff --git a/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash_light.vpcf_c b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash_light.vpcf_c new file mode 100755 index 0000000..28b65bb Binary files /dev/null and b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_explosion_flash_light.vpcf_c differ diff --git a/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_model.vpcf_c b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_model.vpcf_c new file mode 100755 index 0000000..255a523 Binary files /dev/null and b/particles/units/heroes/hero_rattletrap/rattletrap_rocket_flare_model.vpcf_c differ diff --git a/particles/units/heroes/hero_silencer/silencer_last_word_status_ring_end_flash.vpcf_c b/particles/units/heroes/hero_silencer/silencer_last_word_status_ring_end_flash.vpcf_c new file mode 100755 index 0000000..7bd048e Binary files /dev/null and b/particles/units/heroes/hero_silencer/silencer_last_word_status_ring_end_flash.vpcf_c differ diff --git a/particles/units/heroes/hero_skywrath_mage/skywrath_mage_mystic_flare_beam.vpcf_c b/particles/units/heroes/hero_skywrath_mage/skywrath_mage_mystic_flare_beam.vpcf_c new file mode 100755 index 0000000..c8bf394 Binary files /dev/null and b/particles/units/heroes/hero_skywrath_mage/skywrath_mage_mystic_flare_beam.vpcf_c differ diff --git a/particles/units/heroes/hero_skywrath_mage/skywrath_mage_mystic_flare_beam_b.vpcf_c b/particles/units/heroes/hero_skywrath_mage/skywrath_mage_mystic_flare_beam_b.vpcf_c new file mode 100755 index 0000000..bd71c18 Binary files /dev/null and b/particles/units/heroes/hero_skywrath_mage/skywrath_mage_mystic_flare_beam_b.vpcf_c differ diff --git a/particles/units/heroes/hero_slark/portrait_slark.vpcf_c b/particles/units/heroes/hero_slark/portrait_slark.vpcf_c new file mode 100755 index 0000000..58f96bd Binary files /dev/null and b/particles/units/heroes/hero_slark/portrait_slark.vpcf_c differ diff --git a/particles/units/heroes/hero_slark/slark_ambient_ring_splash.vpcf_c b/particles/units/heroes/hero_slark/slark_ambient_ring_splash.vpcf_c new file mode 100755 index 0000000..473cd58 Binary files /dev/null and b/particles/units/heroes/hero_slark/slark_ambient_ring_splash.vpcf_c differ diff --git a/particles/units/heroes/hero_slark/slark_ambient_ring_splash_link.vpcf_c b/particles/units/heroes/hero_slark/slark_ambient_ring_splash_link.vpcf_c new file mode 100755 index 0000000..90a36ce Binary files /dev/null and b/particles/units/heroes/hero_slark/slark_ambient_ring_splash_link.vpcf_c differ diff --git a/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_dust.vpcf_c b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_dust.vpcf_c new file mode 100755 index 0000000..618f169 Binary files /dev/null and b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_dust.vpcf_c differ diff --git a/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_glow.vpcf_c b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_glow.vpcf_c new file mode 100755 index 0000000..e5b4c9a Binary files /dev/null and b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_mist.vpcf_c b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_mist.vpcf_c new file mode 100755 index 0000000..1dd3db6 Binary files /dev/null and b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_mist.vpcf_c differ diff --git a/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_smoke.vpcf_c b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_smoke.vpcf_c new file mode 100755 index 0000000..3268462 Binary files /dev/null and b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_smoke.vpcf_c differ diff --git a/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_wave.vpcf_c b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_wave.vpcf_c new file mode 100755 index 0000000..456ad1f Binary files /dev/null and b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_wave.vpcf_c differ diff --git a/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_wave_c.vpcf_c b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_wave_c.vpcf_c new file mode 100755 index 0000000..57455fc Binary files /dev/null and b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_wave_c.vpcf_c differ diff --git a/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_wave_d.vpcf_c b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_wave_d.vpcf_c new file mode 100755 index 0000000..730f2a3 Binary files /dev/null and b/particles/units/heroes/hero_spirit_breaker/spirit_breaker_charge_wave_d.vpcf_c differ diff --git a/particles/units/heroes/hero_stormspirit/stormspirit_base_attack.vpcf_c b/particles/units/heroes/hero_stormspirit/stormspirit_base_attack.vpcf_c new file mode 100755 index 0000000..f88dfab Binary files /dev/null and b/particles/units/heroes/hero_stormspirit/stormspirit_base_attack.vpcf_c differ diff --git a/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_explosion_b.vpcf_c b/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_explosion_b.vpcf_c new file mode 100755 index 0000000..f0e410a Binary files /dev/null and b/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_explosion_b.vpcf_c differ diff --git a/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_glow.vpcf_c b/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_glow.vpcf_c new file mode 100755 index 0000000..4e0516c Binary files /dev/null and b/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_sparkles.vpcf_c b/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_sparkles.vpcf_c new file mode 100755 index 0000000..2360915 Binary files /dev/null and b/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_sparkles.vpcf_c differ diff --git a/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_sparks_1.vpcf_c b/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_sparks_1.vpcf_c new file mode 100755 index 0000000..b8ff255 Binary files /dev/null and b/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_sparks_1.vpcf_c differ diff --git a/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_trail.vpcf_c b/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_trail.vpcf_c new file mode 100755 index 0000000..9366909 Binary files /dev/null and b/particles/units/heroes/hero_stormspirit/stormspirit_base_attack_trail.vpcf_c differ diff --git a/particles/units/heroes/hero_stormspirit/stormspirit_overload_discharge.vpcf_c b/particles/units/heroes/hero_stormspirit/stormspirit_overload_discharge.vpcf_c new file mode 100755 index 0000000..a144e57 Binary files /dev/null and b/particles/units/heroes/hero_stormspirit/stormspirit_overload_discharge.vpcf_c differ diff --git a/particles/units/heroes/hero_templar_assassin/templar_assassin_ambient.vpcf_c b/particles/units/heroes/hero_templar_assassin/templar_assassin_ambient.vpcf_c new file mode 100755 index 0000000..dff6120 Binary files /dev/null and b/particles/units/heroes/hero_templar_assassin/templar_assassin_ambient.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_ambient.vpcf_c b/particles/units/heroes/hero_visage/visage_ambient.vpcf_c new file mode 100755 index 0000000..2a1f3de Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_ambient.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack.vpcf_c new file mode 100755 index 0000000..49c2d10 Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2.vpcf_c new file mode 100755 index 0000000..b8e0f73 Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2_core.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2_core.vpcf_c new file mode 100755 index 0000000..b66e3da Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2_core.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2_core_glow.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2_core_glow.vpcf_c new file mode 100755 index 0000000..1a8006b Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2_core_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2_core_glow_trail.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2_core_glow_trail.vpcf_c new file mode 100755 index 0000000..ea576a5 Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2_core_glow_trail.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2_core_rocks.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2_core_rocks.vpcf_c new file mode 100755 index 0000000..b1a92f6 Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2_core_rocks.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2_energy.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2_energy.vpcf_c new file mode 100755 index 0000000..7578518 Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2_energy.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2_fire.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2_fire.vpcf_c new file mode 100755 index 0000000..a3ad4a3 Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2_fire.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2_flash.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2_flash.vpcf_c new file mode 100755 index 0000000..e23cad7 Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2_flash.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2_flek.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2_flek.vpcf_c new file mode 100755 index 0000000..7ebea7e Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2_flek.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2_hit.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2_hit.vpcf_c new file mode 100755 index 0000000..3184f52 Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2_hit.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2_hit_glow.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2_hit_glow.vpcf_c new file mode 100755 index 0000000..45f5977 Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2_hit_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2_hit_ring.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2_hit_ring.vpcf_c new file mode 100755 index 0000000..e14a2ba Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2_hit_ring.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_base_attack_2_trail_glow.vpcf_c b/particles/units/heroes/hero_visage/visage_base_attack_2_trail_glow.vpcf_c new file mode 100755 index 0000000..6fbd626 Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_base_attack_2_trail_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_visage/visage_loadout.vpcf_c b/particles/units/heroes/hero_visage/visage_loadout.vpcf_c new file mode 100755 index 0000000..ffd5903 Binary files /dev/null and b/particles/units/heroes/hero_visage/visage_loadout.vpcf_c differ diff --git a/particles/units/heroes/hero_warlock/warlock_ambient_smoke.vpcf_c b/particles/units/heroes/hero_warlock/warlock_ambient_smoke.vpcf_c new file mode 100755 index 0000000..8716849 Binary files /dev/null and b/particles/units/heroes/hero_warlock/warlock_ambient_smoke.vpcf_c differ diff --git a/particles/units/heroes/hero_warlock/warlock_ambient_staff.vpcf_c b/particles/units/heroes/hero_warlock/warlock_ambient_staff.vpcf_c new file mode 100755 index 0000000..8f8cb29 Binary files /dev/null and b/particles/units/heroes/hero_warlock/warlock_ambient_staff.vpcf_c differ diff --git a/particles/units/heroes/hero_warlock/warlock_ambient_staff_c.vpcf_c b/particles/units/heroes/hero_warlock/warlock_ambient_staff_c.vpcf_c new file mode 100755 index 0000000..77af7d1 Binary files /dev/null and b/particles/units/heroes/hero_warlock/warlock_ambient_staff_c.vpcf_c differ diff --git a/particles/units/heroes/hero_warlock/warlock_ambient_staff_e.vpcf_c b/particles/units/heroes/hero_warlock/warlock_ambient_staff_e.vpcf_c new file mode 100755 index 0000000..8b926f5 Binary files /dev/null and b/particles/units/heroes/hero_warlock/warlock_ambient_staff_e.vpcf_c differ diff --git a/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_base.vpcf_c b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_base.vpcf_c new file mode 100755 index 0000000..1a7029c Binary files /dev/null and b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_base.vpcf_c differ diff --git a/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_destruction.vpcf_c b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_destruction.vpcf_c new file mode 100755 index 0000000..d51193d Binary files /dev/null and b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_destruction.vpcf_c differ diff --git a/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_destruction_sparkles.vpcf_c b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_destruction_sparkles.vpcf_c new file mode 100755 index 0000000..3b87cf3 Binary files /dev/null and b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_destruction_sparkles.vpcf_c differ diff --git a/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_b.vpcf_c b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_b.vpcf_c new file mode 100755 index 0000000..d298a04 Binary files /dev/null and b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_b.vpcf_c differ diff --git a/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_c.vpcf_c b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_c.vpcf_c new file mode 100755 index 0000000..7b3ff65 Binary files /dev/null and b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_c.vpcf_c differ diff --git a/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_d.vpcf_c b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_d.vpcf_c new file mode 100755 index 0000000..bb14273 Binary files /dev/null and b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_d.vpcf_c differ diff --git a/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_f.vpcf_c b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_f.vpcf_c new file mode 100755 index 0000000..3fde3e0 Binary files /dev/null and b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_f.vpcf_c differ diff --git a/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_g.vpcf_c b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_g.vpcf_c new file mode 100755 index 0000000..410a316 Binary files /dev/null and b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_g.vpcf_c differ diff --git a/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_h.vpcf_c b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_h.vpcf_c new file mode 100755 index 0000000..886bb60 Binary files /dev/null and b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_h.vpcf_c differ diff --git a/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_i.vpcf_c b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_i.vpcf_c new file mode 100755 index 0000000..e9ce6ef Binary files /dev/null and b/particles/units/heroes/hero_windrunner/windrunner_spell_powershot_trail_i.vpcf_c differ diff --git a/particles/units/heroes/hero_wisp/wisp_guardian_explosion_2.vpcf_c b/particles/units/heroes/hero_wisp/wisp_guardian_explosion_2.vpcf_c new file mode 100755 index 0000000..f16370a Binary files /dev/null and b/particles/units/heroes/hero_wisp/wisp_guardian_explosion_2.vpcf_c differ diff --git a/particles/units/heroes/hero_wisp/wisp_guardian_explosion_2_b.vpcf_c b/particles/units/heroes/hero_wisp/wisp_guardian_explosion_2_b.vpcf_c new file mode 100755 index 0000000..2a2e631 Binary files /dev/null and b/particles/units/heroes/hero_wisp/wisp_guardian_explosion_2_b.vpcf_c differ diff --git a/particles/units/heroes/hero_wisp/wisp_guardian_explosion_b.vpcf_c b/particles/units/heroes/hero_wisp/wisp_guardian_explosion_b.vpcf_c new file mode 100755 index 0000000..b919f79 Binary files /dev/null and b/particles/units/heroes/hero_wisp/wisp_guardian_explosion_b.vpcf_c differ diff --git a/particles/units/heroes/hero_witchdoctor/witchdoctor_deathward_glow.vpcf_c b/particles/units/heroes/hero_witchdoctor/witchdoctor_deathward_glow.vpcf_c new file mode 100755 index 0000000..bbaa407 Binary files /dev/null and b/particles/units/heroes/hero_witchdoctor/witchdoctor_deathward_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_witchdoctor/witchdoctor_voodoo_restoration_b.vpcf_c b/particles/units/heroes/hero_witchdoctor/witchdoctor_voodoo_restoration_b.vpcf_c new file mode 100755 index 0000000..2159fbd Binary files /dev/null and b/particles/units/heroes/hero_witchdoctor/witchdoctor_voodoo_restoration_b.vpcf_c differ diff --git a/particles/units/heroes/hero_witchdoctor/witchdoctor_voodoo_restoration_heal.vpcf_c b/particles/units/heroes/hero_witchdoctor/witchdoctor_voodoo_restoration_heal.vpcf_c new file mode 100755 index 0000000..37f987b Binary files /dev/null and b/particles/units/heroes/hero_witchdoctor/witchdoctor_voodoo_restoration_heal.vpcf_c differ diff --git a/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_flame_a.vpcf_c b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_flame_a.vpcf_c new file mode 100755 index 0000000..94fe725 Binary files /dev/null and b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_flame_a.vpcf_c differ diff --git a/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_glyphs.vpcf_c b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_glyphs.vpcf_c new file mode 100755 index 0000000..1533167 Binary files /dev/null and b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_glyphs.vpcf_c differ diff --git a/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_glyphs_glow.vpcf_c b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_glyphs_glow.vpcf_c new file mode 100755 index 0000000..625bc96 Binary files /dev/null and b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_glyphs_glow.vpcf_c differ diff --git a/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_satellites.vpcf_c b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_satellites.vpcf_c new file mode 100755 index 0000000..1a6bb55 Binary files /dev/null and b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_satellites.vpcf_c differ diff --git a/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_satellites_trail.vpcf_c b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_satellites_trail.vpcf_c new file mode 100755 index 0000000..edf0c00 Binary files /dev/null and b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_satellites_trail.vpcf_c differ diff --git a/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_skull.vpcf_c b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_skull.vpcf_c new file mode 100755 index 0000000..41f53cf Binary files /dev/null and b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_skull.vpcf_c differ diff --git a/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_skull_lv.vpcf_c b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_skull_lv.vpcf_c new file mode 100755 index 0000000..46cb998 Binary files /dev/null and b/particles/units/heroes/hero_witchdoctor/witchdoctor_ward_skull_lv.vpcf_c differ diff --git a/particles/units/towers/aura_dark.vpcf_c b/particles/units/towers/aura_dark.vpcf_c new file mode 100755 index 0000000..cf88c95 Binary files /dev/null and b/particles/units/towers/aura_dark.vpcf_c differ diff --git a/particles/units/towers/aura_dark_a.vpcf_c b/particles/units/towers/aura_dark_a.vpcf_c new file mode 100755 index 0000000..2d2e7b7 Binary files /dev/null and b/particles/units/towers/aura_dark_a.vpcf_c differ diff --git a/particles/units/towers/aura_dark_b.vpcf_c b/particles/units/towers/aura_dark_b.vpcf_c new file mode 100755 index 0000000..7a4de99 Binary files /dev/null and b/particles/units/towers/aura_dark_b.vpcf_c differ diff --git a/resource/addon_english.txt b/resource/addon_english.txt new file mode 100755 index 0000000..cbe8007 --- /dev/null +++ b/resource/addon_english.txt @@ -0,0 +1,1162 @@ +"lang" +{ + "Language" "english" + "Tokens" + { + "game_mode_15" "Touhou Dream Sign Festival" + "addon_game_name" "Touhou Dream Sign Festival" + "DOTA_Hero_Selection_Team_Good" "Hakurei Shrine" + "DOTA_Hero_Selection_Team_Bad" "Incident" + "dota_match_history_Winner_GoodGuys" "Winner: Hakurei Shrine" + "dota_match_history_Winner_BadGuys" "Winner: Incident" + "npc_dota_goodguys_fort" "Hakurei Shrine" + "npc_dota_hero_lina" "Hakurei Reimu" + "DOTA_GoodGuys" "Hakurei Shrine" + "DOTA_BadGuys" "Incident" + "DOTA_Winner_GoodGuys" "The Hakurei Shrine has won." + "DOTA_Winner_BadGuys" "Your whole body is covered in wounds..." + "DOTA_Starting_Team_Radiant" "Hakurei Shrine" + "DOTA_Starting_Team_Dire" "Incident" + "DOTA_GoodGuysCaps" "Hakurei Shrine" + "DOTA_BadGuysCaps" "Incident" + "DOTA_Chat_CourierRespawnedGood" "" + "DOTA_Chat_CourierRespawnedBad" "" + "npc_dota_fort" "Shrine" + "pause_game" "The game has been paused. Press F9 to restore the game!" + "item_is_locked" "The item has been locked. Please click on the right-click items to open and unlock. Locked items can not be used as materials for training, rising stars, not for sale, and can not be picked up by teammates." + "item_locked_tip" "Locked items can not be used as materials for cultivation, star promotion, sale, and can not be picked up by teammates. Please make good use of this function to prevent misoperation or stolen items." + "reach_to_wave" "The specified wave number is successful and the next wave will jump directly to the {d:count} wave." + "power_game_end_info" "The maximum number of wave s that have been successfully passed this time: {d: wave}, the total damage of the wave: {d: damage} * 10,000, 30 seconds after the end of the game and settlement of rewards." + "fast_game_on" "In the fast mode, the first 50 wave times reduced by 30% per wave, and all kinds of revenue increased by 30% simultaneously." + "challenge_game_on" "In Challenge mode, the endless preparation time is extended and three gifts from Nazlin Liebert, the autumn dumpling, are given directly from Wave 68." + "user_steam_id" "{s:name}" + "item_pick_chen_bug_fix" "Please note that orange equipment has been put back in storage (to solve the problem that orange items may fall into the brush channel when they are recycled, which may lead to the impossibility of picking up)" + "not_enough_item_slot" "Not enough inventory space!" + "not_enough_food" "Not enough unit space!" + "minoriko_up_to_5_star" "Please note that Minoriko has reached 5 stars!" + "sizuha_up_to_5_star" "Please note that Sizuha has reached 5 stars!" + "bonus_tower_limit" "You can only have a maximum of three income shikigami(Lily, Nazrin, Minoriko, Daiyousei, Shou, Shizuha, Shinki)!" + "player_disconnect" "A player has been disconnected! Enter -kickafk + player number to kick the player. Player number:" + "player_in_vote" "In the voting, one minute after the end of the mandatory, then vote can be launched again.\nCurrently kicked player number: {d:count}" + "player_vote_pass" "The vote has been successful and has been kicked out of the {d:count} player." + "player_vote_no_pass" "The vote was unsuccessful. The {d:count} player objected, and this polls ended." + "spawn_unlimited" "Endless level is imminent, you must stick to the defensive {d:count} bouts. In the endless level, each player will count the number of missing monsters individually. Simultaneously, all income category shikigami near expiry. Please use the last time to configure your shikigami lineup." + "DOTA_Tooltip_ability_item_0001_Description" "Although there is no attack, but can quickly enhance the experience of Shikigamis.\n[★][★]Spring Sign「Proclaim Of spring」\n[★★★★]Spring Sign「Surprise Spring」" + "DOTA_Tooltip_ability_item_0001" "[R]Lily White" + "DOTA_Tooltip_ability_item_1001" "Normal Summon Sign" + "DOTA_Tooltip_ability_item_1001_Description" "Summon a normal Shikigami.\n[N]80%%\n[R]20%%" + "DOTA_Tooltip_ability_item_1002" "Advanced Summon Sign" + "DOTA_Tooltip_ability_item_1002_Description" "Summon a rare Shikigami.\n[R]75%%\n[SR]20%%\n[SSR]5%%" + "DOTA_Tooltip_ability_item_1003" "The Drug Of Evolution Lv1" + "DOTA_Tooltip_ability_item_1003_Description" "It can replace any material with a star level of 1." + "DOTA_Tooltip_ability_item_1004" "The Drug Of Evolution Lv2" + "DOTA_Tooltip_ability_item_1005" "The Drug Of Evolution Lv3" + "DOTA_Tooltip_ability_item_1006" "The Drug Of Evolution Lv4" + "DOTA_Tooltip_ability_item_1004_Description" "It can replace any material with a star level of 2." + "DOTA_Tooltip_ability_item_1005_Description" "It can replace any material with a star level of 3." + "DOTA_Tooltip_ability_item_1006_Description" "It can replace any material with a star level of 4." + "DOTA_Tooltip_ability_item_0001_Lore" "Lily White is a fairy that heralds the coming of spring. Where she passes, there will be warm air in spring." + "DOTA_Tooltip_ability_item_0002" "[R]Nazrin" + "DOTA_Tooltip_ability_item_0002_Description" "Have a certain ability to attack and could steal money by attack.\n[★]Search Sign「Gold Detector」" + "DOTA_Tooltip_ability_item_0003" "[R]Aki Minoriko" + "DOTA_Tooltip_ability_item_0003_Description" "Although there is no attack ability and can not grow through the general way, she can grow up stars with the time, and exchange star with other Shikigami.\n[★]Fruit Sign「Warm Color Harvest」\n[★★★]Bumper Crop「Promise of the Wheat Godg」" + "DOTA_Tooltip_ability_item_0002_Lore" "The Little Dowser General" + "DOTA_Tooltip_ability_item_0003_Lore" "Aki Minoriko and her old sister-Aki Shizuha manipulate the Autumn together." + "DOTA_Tooltip_ability_item_0004" "[N]Graveyard Fairy" + "DOTA_Tooltip_ability_item_0004_Description" "A fairy that can be found everywhere in the GY.\n[★]POISONED DAGGER" + "DOTA_Tooltip_ability_item_0005" "[N]Shanghai Doll" + "DOTA_Tooltip_ability_item_0005_Description" "A doll that was made by Alice.\n[★]CRITICAL STRIKE" + "DOTA_Tooltip_ability_item_0006" "[N]Hourai Doll" + "DOTA_Tooltip_ability_item_0006_Description" "A doll that was made by Alice.\n[★]THUMP" + "DOTA_Tooltip_ability_item_0007" "[N]Flower Field Fairy" + "DOTA_Tooltip_ability_item_0007_Description" "A fairy that can be found everywhere on a flower field.\n[★]MULTI-SHOT" + "DOTA_Tooltip_ability_item_0008" "[N]Maid Fairy" + "DOTA_Tooltip_ability_item_0008_Description" "A fairy that can be found everywhere in Koumakan.\n[★]MOONBLADE" + "DOTA_Tooltip_ability_item_0009" "[R]Cirno" + "DOTA_Tooltip_ability_item_0009_Description" "Cirno is leader of fairies that live near the Misty Lake,hence she has stronger power than other fairies. She is aggressive and has the ability of manipulating cold air,can freeze things flashily. She is more dangerous than normal fairies.\n[★]Frost Sign Card「Frost Columns」\n[★★★★]Freeze Sign「Perfect Freeze」" + "DOTA_Tooltip_ability_item_0009_Lore" "I am the strongest!" + "DOTA_Tooltip_ability_item_0010" "[R]Tatara Kogasa" + "DOTA_Tooltip_ability_item_0010_Description" "Karakasa Obake,is a Tsukumogami which transformed by the umbrella that is not used for a long time.\ndoes not attack people or eat people, only like shock people. \n[★]Halo「Karakasa Surprising Flash」\n[★★★]Rain Sign「A Rainy Night's Ghost Story」" + "DOTA_Tooltip_ability_item_0010_Lore" "Just often cannot shock anyone...." + "DOTA_Tooltip_ability_item_0011" "[R]Letty Whiterock" + "DOTA_Tooltip_ability_item_0011_Description" "This youkai only can be seen in Winter, Like cold place, is a kind of scary fairy that can freeze people cause they cannot fight any more. \n[★]Winter Sign「Flower Wither Away」\n[★★★]Cold Sign「Lingering Cold」" + "DOTA_Tooltip_ability_item_0012" "[R]Lyrica Prismriver" + "DOTA_Tooltip_ability_item_0012_Description" "Prismriver Band is formed by Poltergeist Sisters, Lyrica is the youngest sister of Poltergeist Sisters.\nNormally using keyboard or percussion.\n[★]Nether Keys「Fazioli Nether Performance」\n[★★★]Key Spirit「B?sendorfer Divine Performance」" + "DOTA_Tooltip_ability_item_0013" "[R]Lunasa Prismriver" + "DOTA_Tooltip_ability_item_0012_Lore" "Be different from her sisters, her music is the 'Fantasy Music' which is nonexistent." + "DOTA_Tooltip_ability_item_0013_Description" "Prismriver Band is formed by Poltergeist Sisters,Lunasa is the oldest sister of Poltergeist Sisters, is good at playing violin. And he is also the captain of Prismriver Band\n[★]String Performance「Guarneri del Gesù」\n[★★★]Fake Strings「Pseudo Stradivarius」" + "DOTA_Tooltip_ability_item_0014" "[R]Merlin Prismriver" + "DOTA_Tooltip_ability_item_0014_Description" "The middle sister of Poltergeist Sisters.\n Has pleasant personality, she is the tallest in three sisters, hence she often stands in the mid of the three when they are in concerts.\n[★]Trumpet Spirit「Hino Phantasm」\n[★★★]Trumpet Spirit「Ghost Clifford」" + "DOTA_Tooltip_ability_item_0014_Lore" "When you heard her music, you will suddenly start dancing or impossible to have fluent conversations." + "DOTA_Tooltip_ability_item_0013_Lore" "Do not make children heard that. Only adults can listen ghost music." + "DOTA_Tooltip_ability_item_0015" "[R]Rumia" + "DOTA_Tooltip_ability_item_0015_Description" "a kind of low level youkai, the ability is manipulate darkness-create some ranges of the dark area circle around her. Although she looks young, she also eats people. \n[★]「SOU~NA~NO~KA!」\n[★★★]Darkness Sign「Demarcation」" + "DOTA_Tooltip_ability_item_0015_Lore" "Actually the ribbon which twines around the hair is the Sign, even if she wants to take off the ribbon, Rumia-herself still cannot touch it" + "DOTA_Tooltip_ability_item_0016" "[R]Komeiji Satori" + "DOTA_Tooltip_ability_item_0016_Description" "Satori Komeiji is the Mistress of the Palace of the Earth Spirits after the underground city was separated from Hell. Her ability to read minds causes various youkai and spirits to fear her, but makes her loved by the animals that normally can't be understood. With these animals as pets, she manages the ruins of the Hell of Blazing Fires where her home stands.\n[★]Recollection「Terrible Souvenir」\n[★★★★]Recollection「Terrifying hypnotism」" + "DOTA_Tooltip_ability_item_0016_Lore" "Because she can read others'minds, there is no secret behind her.\nNo matter any fairies, even ghost feels scary." + "DOTA_Tooltip_ability_item_0017" "[R]Nagae Iku" + "DOTA_Tooltip_ability_item_0017_Description" "The envoy of Dragon Palace who lives in the cloud, Most of time she lives in the cloud, guarding the dragon.\n[★]Thunder Sign「Lightning Fish」\n[★★★★]Fish Sign「Dragonfish Drill」" + "DOTA_Tooltip_ability_item_0017_Lore" "Can understand dragon's language, convey important things to humans and youkaies." + "DOTA_Tooltip_ability_item_0018" "[R]Mystia Lorelei" + "DOTA_Tooltip_ability_item_0018_Description" "Mystia Lorelei is a night sparrow with an outgoing egocentric personality, at least she sounds arrogant, that enjoys infusing confusion and terror into the hearts of humans using her ability: a song that creates confusion in those who hear her. Her song seems to attract nearby monsters as well. She roams the Youkai Trail near the Human Village that Keine Kamishirasawa tries to protect, in search of humans to frighten. She is indeed feared by the locals as people around her become blinded by darkness. \nlike bustle environments, she often sings popular songs\n[★]Vocal Sign「Hooting in the Night」\n[★★★] Vocal Sign「Howl of the Horned Owl」" + "DOTA_Tooltip_ability_item_0018_Lore" "Looking a stall with red lanterns in the Roads at night, feeling strange and walking there, you will find out it's Night-Birds' stall." + "DOTA_Tooltip_ability_item_0019" "[SR]Kirisame Marisa" + "DOTA_Tooltip_ability_item_0019_Description" "Marisa Kirisame is an ordinary human magician who specializes in light and heat magic and currently resides in the Forest of Magic.\nRunning a 'Kirisame Magic Shop',that place is not only her work place but also her home.\nHer appearance looks like a typical western witch, and she often rides a broom to fly.\n[★]Love Sign「Master Spark」\n[★]Magic Sign「Stardust Reverie」\n[★★★★]Magiccannon「Final Spark」" + "DOTA_Tooltip_ability_item_0019_Lore" "I am a passing magician! Da☆Ze" + "DOTA_Tooltip_ability_item_0020" "[SR]Hinanawi Tenshi" + "DOTA_Tooltip_ability_item_0020_Description" "The celestial who lives in the heaven,the 'Eldest Daughter' of the Hinanawi clan.\nShe can suppress and trigger the earthquake, and can manipulate the keystones and use Sword Of Hisou.\n[★]Heaven Sign「Sword of Divine Justice」\n[★]Non-Perception「Sword of Neither Perception nor Non-Perception」\n[★★★★]Earth Sign「Sword of Unletting Soil」" + "DOTA_Tooltip_ability_item_0020_Lore" "Celestials is just a kind of nonentity that occationally comes to the earth to give advice. Tell the truth, They are all some fantastic advice as for me." + "DOTA_Tooltip_ability_item_0021" "[SR]Patchouli Knowledge" + "DOTA_Tooltip_ability_item_0021_Description" "Patchouli is the witch and resident of the Scarlet Devil Mansion\nShe's friends with the mistress,Remilia,is an about 100-year-old witch.\nShe likes reading, and can manipulate fire,water,wood,metal,earth,sun,and moon. \nShe often stays in the library,has hard asthma,anemia,cause the body is weak, she is weak in hand-to-hand combat.\n[★]Fire Water Wood Metal Earth Sign「Philosopher's Stone」\n[★]「Philosopher's Stone」\n[★★★] Moon Sign「Silent Selene」" + "DOTA_Tooltip_ability_item_0021_Lore" "Everytime she carries books, and think books are apart of herself." + "DOTA_Tooltip_ability_item_0022" "[SR]Sakuya Izayoi" + "DOTA_Tooltip_ability_item_0023" "[SR]Reisen Udongein Inaba" + "DOTA_Tooltip_ability_item_0023_Description" "Reisen Udongein Inaba is a rabbit youkai that has a much different temperament from other fairies.\nit is said keep looking her red eyes will make people mad, and her voice,can't be heard even you want to, conversely sometimes in the far place you can hear it is talking beside your ears.\nDue to this makes people mad,hardly ever can talk to her.\n[★]Weak Heart 「Demotivation」\n[★]Illusion Rabbit 「Parallel Cross」\n[★★★★]「Lunatic Red Eyes」" + "DOTA_Tooltip_ability_item_0023_Lore" "Reisen" + "DOTA_Tooltip_ability_item_0024" "[SR]Saigyouji Yuyuko" + "DOTA_Tooltip_ability_item_0024_Description" "Mistress of Saigyouji family,1000 years ago this ghost girl had been living in Hakugyokurou in the Netherworld.\nShe has ability to command ghosts, so she was appointed to the manager of ghosts in the Netherworld by Enma,and can live in the Netherworld forever.\n[★]Deadly Butterfly「Eternal Sleep in Dreamland」\n[★]Deadly Dance「Law of Mortality」\n[★★★★]Death Sign「Life of Drunk, Dream of Death」" + "DOTA_Tooltip_ability_item_0024_Lore" "Sparrows have too much tiny bone, I really don't like them." + "DOTA_Tooltip_ability_item_0025_Lore" "Guangzhou people shoot fairies is none of my business." + "DOTA_Tooltip_ability_item_0025" "[SR]Konpaku Youmu" + "DOTA_Tooltip_ability_item_0025_Description" "Youmu is the second generation of the desire of the Saiyouji family. The former generation of the desire, Youmu's grandfather - Konpaku Youki, after he had been 300 years desire, one day he suddenly understand something, so he give this job to Youmu, when she was just a young girl, then he lived with himself alone.\nYoumu is different from her pure-ghost master,Saigyouji Yuyuko, she is the 'half-human half-phantom '. The huge ghost beside her is active by her thought, that is a part of her body.\n[★]Sword Skill「Cherry Blossom Flashing」\n[★]Konpaku「Dharma of Gumonji Wisdom of the Living and Dead」\n[★★★★]Six Realms Sword「A Single Thought and the Infinite Kalpas」" + "DOTA_Tooltip_ability_item_0026" "[SR]Kaenbyou Rin" + "DOTA_Tooltip_ability_item_0026_Description" "living in the Old Hell, one of the fairies which are hated, is called 'Cart'. appearing in funerals and carrying-away corpses,this ominous behaviour will enrage people who are in sadness.So people hate this youkaies.\nis Satori Komeiji's pet, due to it's silver tongue and have the ability to have conversations with corpses and souls,it manages the Hell of Blazing Fires's ghosts.\n[★]Youkai「Blazing Wheel」\n[★★★]「Rekindling of Dead Ashes」" + "DOTA_Tooltip_ability_item_0026_Lore" "That human is surprisingly strong, reputedly it is called the professor of defeating fairies\nIf that human exactly has some power, perhaps he can give that pretentious Okuu a hard blow.\nNot sure, she thought." + "DOTA_Tooltip_ability_item_0027" "[SR]Reiuji Utsuho" + "DOTA_Tooltip_ability_item_0027_Description" "This crow has special posture\nThe left leg is\'the leg of decomposition'\,the right leg is'\the leg of fusion\',otherwise she also has the right arm's \'third leg\'' for controling rod and fuel, she use these three legs to manipulate ultimate energy. rod\nOkuu's mission is guarding the Hell of Blazing Fires' remain to ensure it would not be out of control.\nThe deity-Yatagarasu lives in her body. Yatagarasu has ultimate power,that is the power of creating the nuclear-nuclear fusion.\n[★]Explosion Sign「Petit Flare」\n[★]Explosion Sign「Peta Flare」\n[★★★★]「Hell's Artificial Sun」" + "DOTA_Tooltip_ability_item_0027_Lore" "The envoy from the ground.\nWho is it on earth, and what's it target.\nThose questions are asked immediately in Okuu's little head." + "DOTA_Tooltip_ability_item_0028" "[SSR]Hakurei Reimu" + "DOTA_Tooltip_ability_item_0028_Description" "Shrine Maiden of the Hakurei Shrine,nominally the manager of Gensokyo\nShe has talented miraculous luck and sensitivity, and many abilities, but lack of practices.\nDon't believe 'efforts will pay off,' hate practicing, lack of sense of danger.\nEveryday she just cleans up the shrine and leisurely enjoys the tea.\nBut everytime something strange happens, she will hurry to investigate.\nShe will be serious when she is defeating the fairies, but she also treats youkais and humans in the same attitude when she doesn't need to work.\n[★]Spirit Sign「Fantasy Seal -Spread」\n[★]Bewitched Weapon「Merciless Purification Rod」\n[★★★]Holy Relic「Yin-Yang Demon God Orb」\n[★★★★★]「Fantasy Nature」" + "DOTA_Tooltip_ability_item_0029" "[SSR]Daiyousei" + "DOTA_Tooltip_ability_item_0029_Description" "Daiyousei is a greater fairy who lives around the Misty Lake near the Scarlet Devil Mansion. Like other fairies, she's cheerful and mischievous, simple and emotional.\n[★]「Kind Heart of Yousei」\n[★]「Yousei Garden」\n[★★★]「Revelution」\n[★★★★★]「Beyond The World」" + "DOTA_Tooltip_ability_item_0030" "[SSR]Remilia Scarlet" + "DOTA_Tooltip_ability_item_0031" "[SSR]Komeiji Koishi" + "DOTA_Tooltip_ability_ability_touhoutd_release_tower" "Recycle the Shikigami" + "DOTA_Tooltip_ability_ability_touhoutd_release_tower_Description" "Recycle a shikigami to transform it back to card" + "DOTA_Tooltip_ability_ability_touhoutd_blink" "Blink" + "DOTA_Tooltip_ability_ability_touhoutd_blink_Description" "Blink to the target point" + "DOTA_Tooltip_ability_ability_touhoutd_kill" "「Fantasy Seal」" + "DOTA_Tooltip_ability_ability_touhoutd_kill_Description" "Kill an enemy immediately" + "DOTA_Tooltip_ability_ability_touhoutd_buy_normal_card" "Use normal card" + "DOTA_Tooltip_ability_ability_touhoutd_buy_normal_card_Description" "Use normal card by SHORTCUT" + "DOTA_Tooltip_ability_ability_touhoutd_buy_senior_card_Description" "Use senior card by SHORTCUT。" + "DOTA_Tooltip_ability_ability_touhoutd_buy_senior_card" "Use senior card by SHORTCUT" + "DOTA_Tooltip_ability_ability_touhoutd_shop_buy_normal_card" "Buy normal card" + "DOTA_Tooltip_ability_ability_touhoutd_shop_buy_normal_card_Description" "Buy items and drop them to Reimu's slots." + "DOTA_Tooltip_ability_ability_touhoutd_shop_buy_senior_card" "Buy senior card" + "DOTA_Tooltip_ability_ability_touhoutd_shop_buy_senior_card_Description" "Buy items and drop them to Reimu's slots." + "DOTA_Tooltip_ability_ability_touhoutd_shop_buy_egg_level_1" "Buy senior nostrum Lv1" + "DOTA_Tooltip_ability_ability_touhoutd_shop_buy_egg_level_1_Description" "Buy items and drop them to Reimu's slots." + "DOTA_Tooltip_ability_ability_touhoutd_shop_buy_egg_level_2" "Buy senior nostrum Lv2" + "DOTA_Tooltip_ability_ability_touhoutd_shop_buy_egg_level_2_Description" "Buy items and drop them to Reimu's slots." + "DOTA_Tooltip_ability_ability_touhoutd_shop_buy_egg_level_3" "Buy senior nostrum Lv3" + "DOTA_Tooltip_ability_ability_touhoutd_shop_buy_egg_level_3_Description" "Buy items and drop them to Reimu's slots." + "DOTA_Tooltip_ability_ability_touhoutd_shop_buy_egg_level_4" "Buy senior nostrum Lv4" + "DOTA_Tooltip_ability_ability_touhoutd_shop_buy_egg_level_4_Description" "Buy items and drop them to Reimu's slots." + "DOTA_Tooltip_ability_ability_touhoutd_close_star" "Close/Open Star Display" + "DOTA_Tooltip_ability_ability_touhoutd_close_star_Description" "Close/Open Star Display.(After reconnected, you can click twice to look up)" + "DOTA_Tooltip_ability_ability_touhoutd_star_up" "Star-Up the card" + "DOTA_Tooltip_ability_ability_touhoutd_star_up_Description" "You can promote shikigami cards' star number which has reach max level by feeding shikigamies and cards'meterial heroes are carrying.\nPromote to ★★ needs 1 ★ max level material\nPromote to ★★★ needs 2 ★★ max level material.\nPromote to ★★★★ needs 3 ★★★ max level material.\nPromote to ★★★★★ needs 4 ★★★★ max level material." + "DOTA_Tooltip_ability_ability_touhoutd_exp_up" "Card feeding" + "DOTA_Tooltip_ability_ability_touhoutd_exp_up_Description" "Can promote cards' exp by feeding first cell's material of shikigami's equipment slot.\nThe same type cards feeding can promote special skills' level." + "DOTA_Tooltip_ability_thtd_lily_01" "Spring Sign「Spring Declaration」" + "DOTA_Tooltip_ability_thtd_lily_02" "Spring Sign「Surprise Spring」" + "DOTA_Tooltip_ability_thtd_lily_01_Description" "Lily White put Spring power into friendly units'bodies in the area,promote their exp\n\nPromotion Value:Star Parameters*POWER POINTs*6.5\n\nStar Parameters:1,1.8,2.4,3.2,4" + "DOTA_Tooltip_ability_thtd_lily_02_Description" "Lily White opens the barrier, units in the range of barrier's cause 125% damages to enemies." + "DOTA_Tooltip_ability_thtd_lily_02_duration" "DURATION:" + "DOTA_Tooltip_modifier_lily_outgoing_damage" "Spring Sign「Surprise Spring」" + "DOTA_Tooltip_modifier_lily_outgoing_damage_Description" "Being influenced by Spring Power, Promote 50% damages to enemies." + "DOTA_Tooltip_ability_thtd_nazrin_01" "Search Sign「Gold Detector」" + "DOTA_Tooltip_ability_thtd_nazrin_01_Description" "Every attack, Nazrin has posible to steal targets some money.\n\nSteal Chance:50%%\n\nAmount of Stealing:Star Parameter+POWER POINTs*0.02\n\nStar Parameter:2.4,8.8,21.6,43.2,170.4" + "DOTA_Tooltip_ability_thtd_minoriko_01" "Plenty Sign「Warm Color Harvest」" + "DOTA_Tooltip_ability_thtd_minoriko_01_Description" "Although Minoriko can't promote star levels by normal ways, she can promote by time.\n\nEvery(270/540/900/1260)seconds will promote a star level." + "DOTA_Tooltip_ability_thtd_minoriko_02" "Bumper Crop「Promise of the Wheat God」" + "DOTA_Tooltip_ability_thtd_minoriko_02_Description" "exchange star levels of the target with Minoriko's star levels.(The maximum exchange of 3 times)" + "DOTA_Tooltip_ability_thtd_mugiyousei_01" "POISONED WEAPON" + "DOTA_Tooltip_ability_thtd_mugiyousei_01_Description" "Graveyard Fairies' attacks apply poison that deals damage over time." + "DOTA_Tooltip_ability_thtd_shanghainingyou_01" "CRITICAL STRIKE" + "DOTA_Tooltip_ability_thtd_shanghainingyou_01_Description" "Shanghai Dolls' attacks have a certain chance to critically strike." + "DOTA_Tooltip_ability_thtd_shanghainingyou_01_crit_chance" "CHANCE" + "DOTA_Tooltip_ability_thtd_shanghainingyou_01_crit_mult" "MULTIPLE" + "DOTA_Tooltip_ability_thtd_hourainingyou_01" "THUMP" + "DOTA_Tooltip_ability_thtd_hourainingyou_01_Description" "Hourai Dolls' attacks have a certain chance to deal additional damage and stun the target." + "DOTA_Tooltip_ability_thtd_hanadayousei_01" "MULTI-SHOT" + "DOTA_Tooltip_ability_thtd_hanadayousei_01_Description" "Flower Field Fairies can attack up to 3 units at the same time." + "DOTA_Tooltip_ability_thtd_cirno_01" "Frost Sign「Frost Columns」" + "DOTA_Tooltip_ability_thtd_cirno_01_Description" "Reduce enemies around Cirno 30% movement speed.\n\n[Combination promotion - Letty]\nMovement Speed reduction promote from 30% to 50%." + "DOTA_Tooltip_ability_thtd_cirno_01_move_slow" "MOVEMENT SPEED REDUCTION:" + "DOTA_Tooltip_modifier_cirno_01_slow_buff" "Frost Sign「Frost Columns」" + "DOTA_Tooltip_modifier_cirno_01_slow_buff_Description" "be influenced by Cirno, this units' Movement Speed reduces." + "DOTA_Tooltip_ability_thtd_cirno_02" "Freeze Sign「Perfect Freeze」" + "DOTA_Tooltip_ability_thtd_cirno_02_Description" "To the target and units around it cause 8 times damages, and has chance to freeze them.\n\n[Damage Multiplier ]DAMAGE:POWER POINTs * Star levels * 2 per time" + "DOTA_Tooltip_ability_thtd_cirno_02_stun_time" "Freeze Time:" + "DOTA_Tooltip_modifier_cirno_frozen_unit" "Freeze Sign「Perfect Freeze」" + "DOTA_Tooltip_modifier_cirno_frozen_unit_Description" "be influenced by Cirno,this unit is being freezed." + "DOTA_Tooltip_ability_thtd_cirno_03" "Blowing Ice「Ice Tornado」" + "DOTA_Tooltip_ability_thtd_cirno_03_Description" "Cirno's every attack will cause damage to the target and units around it.\n\n[Damage Multiplier]Damage:POWER POINTs * Star levels" + "DOTA_Tooltip_ability_thtd_cirno_04" "Ice Sign「Ultimate Blizzard」" + "DOTA_Tooltip_ability_thtd_cirno_04_Description" "Cirno every 5 times attack will cause Damage Over Time to target area.\n\n[Damage Multiplier]Damage:POWER POINTs * Star levels * 4 per second" + "DOTA_Tooltip_ability_thtd_letty_01" "Winter Sign「Flower Wither Away」" + "DOTA_Tooltip_ability_thtd_letty_01_Description" "Letty summon 2 blizzards, cause damage to units in the target area.\n\n[Damage Multiplier]Damage:POWER POINT*1/per blizzard\n\n[Combination Promotion - Cirno]\nThe number of blizzards promote at least 3" + "DOTA_Tooltip_ability_thtd_letty_02" "Cold Sign「Lingering Cold」" + "DOTA_Tooltip_ability_thtd_letty_02_Description" "Reduce units around Letty's Magic Resistance." + "DOTA_Tooltip_ability_thtd_letty_02_magic_armor" "Resistance Reduction:" + "DOTA_Tooltip_modifier_letty_02_magic_armor_buff" "Cold Sign「Lingering Cold」" + "DOTA_Tooltip_modifier_letty_02_magic_armor_buff_Description" "Be influenced by Letty, this unit's Magic Resistance reduces" + "DOTA_Tooltip_ability_thtd_kogasa_01" "Halo「Karakasa Surprising Flash」" + "DOTA_Tooltip_ability_thtd_kogasa_01_Description" "Kogasa shocks the target and units around it, cause damage to them and reduce the movement speed.\n\n[Damage Multiplier]Initial Damage:60/120/240/480/960\n\n[Damage Multiplier]Damage Over Time:15/30/60/120/240 per second" + "DOTA_Tooltip_ability_thtd_kogasa_01_debuff_time" "Debuff DURATION:" + "DOTA_Tooltip_ability_thtd_kogasa_01_move_slow" "Movement Speed Reduction:" + "DOTA_Tooltip_modifier_kogasa_debuff" "Halo「Karakasa Surprising Flash」" + "DOTA_Tooltip_modifier_kogasa_debuff_Description" "Be shocked by Karakasa,the unit reduces the Movement Speed and causes Damage Over Time." + "DOTA_Tooltip_ability_thtd_kogasa_02" "Rain Sign「A Rainy Night's Ghost Story」" + "DOTA_Tooltip_ability_thtd_kogasa_02_Description" "Reduce units around Kogasa's Armor." + "DOTA_Tooltip_ability_thtd_kogasa_02_armor" "ARMOR REDUCTION:" + "DOTA_Tooltip_modifier_kogasa_02_armor_buff" "Rain Sign「A Rainy Night's Ghost Story」" + "DOTA_Tooltip_modifier_kogasa_02_armor_buff_Description" "Be influenced by Karakasa, This unit's armors reduce." + "DOTA_Tooltip_ability_thtd_lyrica_01" "Nether Keys「Fazioli Nether Performance」" + "DOTA_Tooltip_ability_thtd_lyrica_01_Description" "Lyrica causes damage to the target and units around it\n\n[Damage Multiplier]Damage:POWER POINTs*Star levels\n\n[Combination Promotion - lunasa - Merlin]\nPromote 50% damages." + "DOTA_Tooltip_ability_thtd_lyrica_02" "Key Spirit「B?sendorfer Divine Performance」" + "DOTA_Tooltip_ability_thtd_lyrica_02_Description" "When Lyrica's skill causes damages, Each note in the target will cause each extra damages. \n\n[Damage Multiplier]Damage:POWER POINTs*Star-levels*0.5\n\n[Combination Promotion - Lunasa - Merlin]\nPromote 50% damages." + "DOTA_Tooltip_ability_thtd_lunasa_01" "String Performance「Guarneri del Gesù」" + "DOTA_Tooltip_ability_thtd_lunasa_01_Description" "Lunasa causes Damage Over Time and reduces Movement Speed to the target and units around it,and attaching a [ensemble]note\n\n[Damage Multiplier]Damage:40/100/200/400/800 per second" + "DOTA_Tooltip_modifier_lunasa_01_debuff" "Note - [Sadness]" + "DOTA_Tooltip_modifier_lunasa_01_debuff_Description" "The music of violin makes people sad." + "DOTA_Tooltip_ability_thtd_lunasa_02" "Fake Strings「Pseudo Stradivarius」" + "DOTA_Tooltip_ability_thtd_lunasa_02_Description" "Lunatha's normal attack will cause damage to the target, and attaching a [ensemble]note.\n\n[Damage Multiplier]Damage:200/400/800 per second" + "DOTA_Tooltip_ability_thtd_merlin_01" "Trumpet Spirit「Hino Phantasm」" + "DOTA_Tooltip_ability_thtd_merlin_01_Description" "Merlin plays trumpet to cause damage and reduce the Movement Speed to units in the range, and attaching a [maniac]note\n\n[Damage Multiplier]Damage: 40/100/200/400/800 Per second" + "DOTA_Tooltip_ability_thtd_merlin_01_move_slow" "Movement Speed Reduction:" + "DOTA_Tooltip_modifier_merlin_01_debuff" "Trumpet Spirit「Hino Phantasm」" + "DOTA_Tooltip_modifier_merlin_01_debuff_Description" "Passionate Trumpet music makes people mad." + "DOTA_Tooltip_ability_thtd_merlin_02" "Trumpet Spirit「Ghost Clifford」" + "DOTA_Tooltip_ability_thtd_merlin_02_Description" "Merlin's normal attack will cause damages to the target, and attaching a [maniac] note\n\n[Damage Multiplier]Damage:200/400/800 Per second" + "DOTA_Tooltip_ability_thtd_rumia_01" "「Is~It~Like~That!」" + "DOTA_Tooltip_ability_thtd_rumia_01_Description" "Rumia's attack attach extra damage, every unit Rumia kills will promote herself's POWER POINTs.\n\n[Damage Multiplier]Max POWER POINT Promotion:50/100/200/400/600" + "DOTA_Tooltip_ability_thtd_rumia_01_max_bonus" "Max POWER POINTs:" + "DOTA_Tooltip_ability_thtd_rumia_02" "Darkness Sign「Demarcation」" + "DOTA_Tooltip_ability_thtd_rumia_02_Description" "Rumia's every 10 normal attacks will shoot arc Danmakus, units which touch Danmakus will be hurt.\n\n[Damage Multiplier]Damage: POWER POINTs*1/every barrage" + "DOTA_Tooltip_ability_thtd_satori_01" "Recollection「Terrible Souvenir」" + "DOTA_Tooltip_ability_thtd_satori_01_Description" "Reducing units around Satori's Movement Speed, during 3s.\n\n[Damage Multiplier]Movement Speed Reduction:35/40/45/50/55%%" + "DOTA_Tooltip_ability_thtd_satori_01_move_slow" "Movement Speed Reduction:" + "DOTA_Tooltip_modifier_satori_01_debuff" "Recollection「Terrible Souvenir」" + "DOTA_Tooltip_modifier_satori_01_debuff_Description" "Be influenced by Satori, this unit's Movement Speed reduces." + "DOTA_Tooltip_ability_thtd_satori_02_Description" "Units enter terrible souvenir' HP will be recorded, they will get damage which base on the damage in these 3s again after 3s. \n\n[Damage Multiplier]Damage:40%%/100%%\n\n[Combination Promotion - Komeiji Koishi]\nUnits in terrible Hypnotism area will get 120% physical damages" + "DOTA_Tooltip_ability_thtd_satori_02" "Recollection「Terrifying Hypnotism」" + "DOTA_Tooltip_ability_thtd_iku_01" "Thunder Sign「Lightning Fish」" + "DOTA_Tooltip_ability_thtd_iku_01_Description" "Iku's every 8 attacks will cause extra damages and Paralysis 0.5s to the target and units in that area around the target.\n\n[Damage Multiplier]Damage:50 * 2^star-levels\n\n[Combination Promotion - Tenshi Hinanawi]\nParalysis time will promote 1s." + "DOTA_Tooltip_modifier_iku_01_debuff" "Thunder Sign「Lightning Fish」" + "DOTA_Tooltip_modifier_iku_01_debuff_Description" "be attacked by Iku Nagae, this unit paralysises." + "DOTA_Tooltip_ability_thtd_iku_02" "Fish Sign「Dragonfish Drill」" + "DOTA_Tooltip_ability_thtd_iku_02_Description" "Iku uses Drill to cause Damage Over Time to front area.\n\n[Damage Multiplier]Damage: Star-levels * POWER POINTs * 3 per second" + "DOTA_Tooltip_ability_thtd_mystia_01" "Vocal Sign「Hooting in the Night」" + "DOTA_Tooltip_ability_thtd_mystia_01_Description" "Promote surrounding friendly units' physical strike ability.\n\n[Damage Multiplier]Strike Values:10/20/30/40/60" + "DOTA_Tooltip_ability_thtd_mystia_01_penetration" "Strike Value" + "DOTA_Tooltip_modifier_mystia_01_buff" "Vocal Sign「Hooting in the Night」" + "DOTA_Tooltip_modifier_mystia_01_buff_Description" "Be influenced by night sparrow's voice, this units' physical strike promotes." + "DOTA_Tooltip_ability_thtd_mystia_02" "Vocal Sign「Howl of the Horned Owl」" + "DOTA_Tooltip_ability_thtd_mystia_02_Description" "Promote surrounding units' normal attack damages.\n\n[Damage Multiplier]Normal attack damage promotion:50/100/200" + "DOTA_Tooltip_ability_thtd_mystia_02_critdamage" "Normal attack damage Promotion:" + "DOTA_Tooltip_modifier_mystia_02_buff" "Vocal Sign「Howl of the Horned Owl」" + "DOTA_Tooltip_modifier_mystia_02_buff_Description" "Be influenced by night sparrow's voice, this units' attack damage promotes." + "DOTA_Tooltip_ability_thtd_marisa_01" "Love Sign「Master Spark」" + "DOTA_Tooltip_ability_thtd_marisa_01_Description" "Marisa shoots Magicannon to front, cause large Damage Over Time to enemies on straight line.\n\n[Damage Multiplier]Damage:POWER POINTs*Star levels*3.5 per second\n\n[Combination Promotion - Hakurei Reimu]\nDuration of Magic Connon promotes to 7s." + "DOTA_Tooltip_ability_thtd_marisa_01_damage_width" "WIDTH OF MAGICANNON:" + "DOTA_Tooltip_ability_thtd_marisa_01_damage_lenth" "LENGTH OF MAGICANNON:" + "DOTA_Tooltip_ability_thtd_marisa_01_channel_time" "DURATION:" + "DOTA_Tooltip_modifier_thdots_marisa01_think_interval" "Magicannon「Final Spark」" + "DOTA_Tooltip_modifier_thdots_marisa01_think_interval_Description" "Marisa is shooting Magicannon." + "DOTA_Tooltip_ability_thtd_marisa_03_Description" "Marisa shoots magicannon to front, cause large Damage Over Time to enemies on straight line.\n\n[Damage Multiplier]Damage:POWER POINTs*Star level*7.0 per second\n\n[Combination Promotion - Hakurei Reimu]\nDuration of Magic Connon promotes to 7s." + "DOTA_Tooltip_ability_thtd_marisa_03" "Magicannon「Final Spark」" + "DOTA_Tooltip_ability_thtd_marisa_03_damage_width" "WIDTH OF MAGICANNON:" + "DOTA_Tooltip_ability_thtd_marisa_03_damage_lenth" "LENGTH OF MAGICANNON:" + "DOTA_Tooltip_ability_thtd_marisa_03_channel_time" "DURATION:" + "DOTA_Tooltip_ability_thtd_marisa_02" "Magic Sign「Stardust Reverie」" + "DOTA_Tooltip_ability_thtd_marisa_02_Description" "When Marisa attacks or use skills,Starlike Danmakus will be shooted, enemies are killed by Danmakus will make Marisa's MP recover." + "DOTA_Tooltip_ability_thtd_tenshi_01" "Heaven Sign「Sword of Divine Justice」" + "DOTA_Tooltip_ability_thtd_tenshi_01_Description" "causing damage to a small range to the units in target area. \n\n[Damage Multiplier]Damage:POWER POINTs*Star-levels*1.5" + "DOTA_Tooltip_ability_thtd_tenshi_02" "Non-Perception「Sword of Neither Perception nor Non-Perception」" + "DOTA_Tooltip_ability_thtd_tenshi_02_Description" "Effect 1:\nTenshi's attack has chance to attach Quadruple Critical Strike.\nEffect 2:\nTenshi's attack will attach a small range cleave effect." + "DOTA_Tooltip_ability_thtd_tenshi_02_crit_mult" "CRITICAL DAMAGE:" + "DOTA_Tooltip_ability_thtd_tenshi_02_crit_chance" "CRITICAL CHANCE:" + "DOTA_Tooltip_modifier_thtd_tenshi_02_cleave" "Sword of Scarlet Perception[CLEAVE]" + "DOTA_Tooltip_modifier_thtd_tenshi_02_crit_chance" "Sword of Scarlet Perception[CRITICAL]" + "DOTA_Tooltip_ability_thtd_tenshi_03" "Earth Sign「Sword of Unletting Soil」" + "DOTA_Tooltip_ability_thtd_tenshi_03_Description" "Effect 1:Tenshi's EVERY 15 TIMES attack will shoot a STRAIGHT-LINE WAVE to the target,it will cause huge damages.\n\nEffect 2:Promote surrounding units 20% ATTACK SPEED.\n\n[Damage Multiplier]Damage:POWER POINTs*Star-levels*2.5\n\n[Combination Promotion - Iku Nagae]\nAttack times for triggering the wave REDUCE TO 8 TIMES." + "DOTA_Tooltip_ability_thtd_tenshi_03_attack_speed" "ATTACK SPEED Promotion" + "DOTA_Tooltip_modifier_tenshi_03_attack_speed_buff" "Earth Sign「Sword of Unletting Soil」" + "DOTA_Tooltip_modifier_tenshi_03_attack_speed_buff_Description" "Be influenced by Tenshi, this unit's ATTACK SPEED promotes" + "DOTA_Tooltip_ability_thtd_patchouli_01" "Fire Water Wood Metal Earth Sign「Philosopher's Stone」" + "DOTA_Tooltip_ability_thtd_patchouli_01_Description" "Patchouli can switch elements, use different kinds of magic:\n\nFire Sign「Agni Shine」\n\nCause large amount of damage to the target area.\n[Damage Multiplier]Damage:POWER POINTs*2^Star levels\n\nWater Sign「Bury In Lake」\n\nCause Damage Over Time to the target area, and if enemies' HP is less than 30% of the total HP, they will directly die.\n[Damage Multiplier]Damage:POWER POINTs*Star-levels per second\n\nMetal& Water Sign「Mercury poison」\n\nAttaching Posion to units in the target area, cause Damage Over Time and reduce Armors and resistance.\n[Damage Multiplier]Damage:POWER POINTs*Star-levels Per Second\n[Damage Multiplier]Resistance Reduction:10/20/30/40/60" + "DOTA_Tooltip_ability_thtd_patchouli_01_armor" "" + "DOTA_Tooltip_modifier_patchouli_01_mercury_poison_debuff" "Metal & Water Sign「Mercury poison」" + "DOTA_Tooltip_modifier_patchouli_01_mercury_poison_debuff_Description" "Be effected by Mercury poison, this unit is getting Damage Over Time and reducing the resistance." + "DOTA_Tooltip_ability_thtd_patchouli_02" "「Philosopher's Stone」" + "DOTA_Tooltip_ability_thtd_patchouli_02_Description" "Switch Philosopher's Stone's effects" + "DOTA_Tooltip_ability_thtd_patchouli_03" "Moon Sign「Silent Selene」" + "DOTA_Tooltip_ability_thtd_patchouli_03_Description" "Promote friendly units around Patchouli 30% Magic Damages." + "DOTA_Tooltip_modifier_patchouli_03_buff" "Moon Sign「Silent Selene」" + "DOTA_Tooltip_modifier_patchouli_03_buff_Description" "Be influenced by Patchouli, this unit's Magic Damage promotes." + "DOTA_Tooltip_ability_thtd_reisen_01" "Weak Heart「Demotivation」" + "DOTA_Tooltip_ability_thtd_reisen_01_Description" "Reisen's attack will knockback the target, this skill only can trigger one time to one target." + "DOTA_Tooltip_ability_thtd_reisen_02" "Illusion Rabbit「Parallel Cross」" + "DOTA_Tooltip_ability_thtd_reisen_02_Description" "Reisen's attack has chance to create an illusion, at most have 3 illusions.\n\n[Combination Promotion - Youmu Konpaku]\nThe max illusions promotes to 5 illusions." + "DOTA_Tooltip_ability_thtd_reisen_03" "「Lunatic Red Eyes」" + "DOTA_Tooltip_ability_thtd_reisen_03_Description" "Reisen causes damage and knockback units in the target area.\n\n[Damage Multiplier]Damage: POWER POINTs*5" + "DOTA_Tooltip_ability_thtd_yuyuko_01" "Deadly Butterfly「Eternal Sleep in Dreamland」" + "DOTA_Tooltip_ability_thtd_yuyuko_01_Description" "Yuyuko use light butterfly to track surrouding units and cause damages\n\n[Damage Multiplier]Damage:POWER POINTs*0.6" + "DOTA_Tooltip_ability_thtd_yuyuko_02" "Deadly Dance「Law of Mortality」" + "DOTA_Tooltip_ability_thtd_yuyuko_02_Description" "The Damage from Yuyuko has 5% chance to directly kill units (max damage: power * star * 100).\n\n[Combination Promotion - Youmu Konpaku]\nChance of directly killing promotes to 10%%." + "DOTA_Tooltip_ability_thtd_yuyuko_03" "Death Sign「Life of Drunk, Dream of Death」" + "DOTA_Tooltip_ability_thtd_yuyuko_03_Description" "Yuyuko opens barrier, if units in target area's HP less than 30%%, they will be DIRECTLY KILLED." + "DOTA_Tooltip_modifier_thdots_yuyuko04_think_interval" "Death Sign「Life of Drunk, Dream of Death」" + "DOTA_Tooltip_modifier_thdots_yuyuko04_think_interval_Description" "Yuyuko is opening the barrier." + "DOTA_Tooltip_ability_thtd_youmu_01" "Sword Skill「Cherry Blossom Flashing」" + "DOTA_Tooltip_ability_thtd_youmu_01_Description" "Youmu's every 8 times attack will shoot a Swordkee, cause damage to units on the straight line.\n\n[Damage Multiplier]Damage:POWER POINTs*Star-levels*2\n\n[Combination Promotion - Yuyuko Saigyouji]\nATTACK SPEED promotes 50%%." + "DOTA_Tooltip_ability_thtd_youmu_02" "Konpaku「Dharma of Gumonji Wisdom of the Living and Dead」" + "DOTA_Tooltip_ability_thtd_youmu_02_Description" "When Youmu use Sword Skill「Cherry Blossom Flashing」or Six Realms Sword「A Single Thought and the Infinite Kalpas」,have 30% chance to summon half spirit to do an extra kill hit.\n\n[Combination Promotion - Reisen]\nChance to trigger promote to 70%%." + "DOTA_Tooltip_ability_thtd_youmu_03" "Six Realms Sword「A Single Thought and the Infinite Kalpas」" + "DOTA_Tooltip_ability_thtd_youmu_03_Description" "Effect 1:Youmu Konpaku's every attack will recover 1 MP.\n\nEffect 2:Youmu Konpaku waves her double swords to hit units in the target area continously.\n\n[Damage Multiplier]Damage:POWER POINTs*Sta-levels*5, total 10 hits" + "DOTA_Tooltip_ability_thtd_rin_01" "Youkai「Blazing Wheel」" + "DOTA_Tooltip_ability_thtd_rin_01_Description" "Rin creates a wheel to cause damage to the target and units behind it, and attaching a [inferno] effect.\n\n[Damage Multiplier]Damage:POWER POINTs\n\n[Combination Promotion - Reiuji Utsuho]\nPromote surrounding units 20%% physical damage." + "DOTA_Tooltip_modifier_utsuho_rin_buff" "「Blazing ground」" + "DOTA_Tooltip_modifier_utsuho_rin_buff_Description" "Be influenced by ground youseis, this unit's physical damage promotes." + "DOTA_Tooltip_modifier_rin_01_debuff" "Youkai「Blazing Wheel」" + "DOTA_Tooltip_modifier_rin_01_debuff_Description" "Bumped by the wheel, this unit is under the inferno effect." + "DOTA_Tooltip_ability_thtd_rin_02" "「Rekindling of Dead Ashes」" + "DOTA_Tooltip_ability_thtd_rin_02_Description" "If units attached [inferno] effect are killed, the surrounding units of the target will get HP-percent damage. \n\n[Damage Multiplier]Damage:4%%/6%%/15%%" + "DOTA_Tooltip_ability_thtd_utsuho_01_Description" "Utsuho's every attack will cause damage to the target and units around it.\n\n[Damage Multiplier]Damage: POWER POINTs*1\n\n[Combination Promotion - Rin Kaenbyou]\nPromote surrounding units 20% physical damage." + "DOTA_Tooltip_ability_thtd_utsuho_01" "Explosion Sign「Petit Flare」" + "DOTA_Tooltip_ability_thtd_utsuho_02" "Explosion Sign「Giga Flare」" + "DOTA_Tooltip_ability_thtd_utsuho_02_Description" "Utsuho's every 6 times attack will cause huge damage to the target and units around it.\n\n[Damage Multiplier]Damage:POWER POINTs * Star-levels" + "DOTA_Tooltip_ability_thtd_utsuho_03" "「Hell's Artificial Sun」" + "DOTA_Tooltip_ability_thtd_utsuho_03_Description" "Utsuho makes artificial sun to the target area, cause tractive effort to surrouding units, and cause damage to units in the area when the skill finishes.\n\n[Damage Multiplier]Damage:POWER POINTs * Star-levels * 24" + "DOTA_Tooltip_ability_thtd_reimu_01" "Spirit Sign「Fantasy Seal-Spread-」" + "DOTA_Tooltip_ability_thtd_reimu_01_Description" "Reimu's every 6 attacks will throw many spirit signs to the target.\n\n[Damage Multiplier]Damage:POWER POINTs*Star*2.0 Every Spirit Sign\n\n[Combination Promotion - Rumia]\nAttack times for triggering the wave REDUCE TO 3 TIMES." + "DOTA_Tooltip_ability_thtd_reimu_02" "Bewitched Weapon「Merciless Purification Rod」" + "DOTA_Tooltip_ability_thtd_reimu_02_Description" "Reimu's skill has 20% chance to cause double damage.\n\n[Combination Promotion - Marisa Kirisame]\nThe chance will promote to 50%." + "DOTA_Tooltip_ability_thtd_reimu_03" "Holy Relic「Yin-Yang Demon God Orb」" + "DOTA_Tooltip_ability_thtd_reimu_03_Description" "Reimu throw a huge Yin-Yang Orb.\n\nYin-Yang orb will cleave to smaller Yin-Yang orbs and reduce the damage when dropping the floor.\n\nUnits that are punched by Yin-Ynag orb will get damage and stun. \n\n[Damage Multiplier]Damage:POWER POINTs*Star*3 every time." + "DOTA_Tooltip_ability_thtd_reimu_04" "「Fantasy Nature」" + "DOTA_Tooltip_ability_thtd_reimu_04_Description" "Everytime Reimu trigger Bewitched Weapon「Merciless Purification Rod」's effect, a Yin-Yang orb will be counted.\n\nWhen 7 Yin-Yang orbs are triggered, Yin-Yang orbs will automatically track and attack around enemies, cause damage to units in the target area.\n\n[Damage Multiplier]Damage:POWER POINTs*Star-levels*5 every attack \n\n[Combination Promotion - Yukari]\n\The damage will promote to 150%." + "DOTA_Tooltip_ability_thtd_daiyousei_01" "「Kind Heart of Yousei」" + "DOTA_Tooltip_ability_thtd_daiyousei_01_Description" "Daiyousei manipulate yousei's power, promote target's level\n\n[Damage Multiplier]level Promotion:Star-levels*1" + "DOTA_Tooltip_ability_thtd_daiyousei_02" "「Yousei Garden」" + "DOTA_Tooltip_ability_thtd_daiyousei_02_Description" "Daiyousei manipulate yousei's power,Recovering surrounding units 10 MP." + "DOTA_Tooltip_ability_thtd_daiyousei_03" "「Revelution」" + "DOTA_Tooltip_ability_thtd_daiyousei_03_Description" "Daiyousei links with the target unit, transform its skill damage to magic damage, and promote its skill damage.\n\n[Damage Multiplier]Damage Promotion:30%%/40%%/60%%\n\n[Combination Promotion - Cirno]\nWhen linking with Cirno,The damage promotes to 45%%/60%%/90%%." + "DOTA_Tooltip_modifier_daiyousei_03" "「Revelution」" + "DOTA_Tooltip_modifier_daiyousei_03_Description" "Linking with Daiyousei, this unit's skill damage is transformed to magic damage, and promotes skill damage." + "DOTA_Tooltip_ability_thtd_daiyousei_04" "「Beyond The World」" + "DOTA_Tooltip_ability_thtd_daiyousei_04_Description" "Daiyousei can release Cirno's hiding power.(This Cirno must be ★★★★★, this skill only can use one time.)" + "DOTA_Tooltip_ability_ability_common_attack_speed_buff" "Special Skill - ATTACK SPEED Promotion" + "DOTA_Tooltip_ability_ability_common_attack_speed_buff_Description" "Promote this unit's ATTACK SPEED.\n\nThis skill can upgrade by CARD FEEDING." + "DOTA_Tooltip_ability_ability_common_attack_speed_buff_attack_speed" "ATTACK SPEED Promotion:" + "DOTA_Tooltip_ability_ability_common_power_buff_Description" "Promote this unit's POWER POINTs.\n\nThis skill can upgrade by CARD FEEDING.\n\n[Power Promotion]:20%%/40%%/60%%/80%%" + "DOTA_Tooltip_ability_ability_common_power_buff" "Special Skill - Power Promotion" + "DOTA_Tooltip_ability_ability_common_power_buff_power_tooltips" "POWER PROMOTION:" + "DOTA_Tooltip_ability_ability_common_mana_regen_buff" "Special Skill - MP Recovery Promotion" + "DOTA_Tooltip_ability_ability_common_mana_regen_buff_Description" "Promote this unit's MP RECOVERY SPEED.\n\nThis skill can upgrade by CARD FEEDING." + "DOTA_Tooltip_ability_ability_common_mana_regen_buff_mana_regen" "MP RECOVERY SPEED:" + "DOTA_Tooltip_common_thdots_base_power_buff" "POWER POINT" + "DOTA_Tooltip_common_thdots_base_power_buff_Description" "This unit's POWER POINTs, they can influence SKILL DAMAGES." + "DOTA_Tooltip_common_thdots_base_attack_buff" "ATTACK" + "DOTA_Tooltip_common_thdots_base_attack_buff_Description" "This unit's EXTRA ATTACK" + "DOTA_Tooltip_ability_ability_common_attack_buff" "CLOSE/OPEN AI" + "DOTA_Tooltip_ability_ability_common_attack_buff_Description" "Close/Open this unit's AI(When it is active,close this unit's AI)" + "minoriko_shop" "MinoriKonbini" + "lily" "Lily White" + "nazrin" "Nazrin" + "minoriko" "Aki Minoriko" + "mugiyousei" "Mugiyousei" + "shanghainingyou" "Shanghainingyou" + "hourainingyou" "Hourainingyou" + "hanadayousei" "Hanadayousei" + "maidyousei" "Maidyousei" + "cirno" "Cirno" + "letty" "Letty Whiterock" + "kogasa" "Tatara Kogasa" + "lyrica" "Lyrica Prismriver" + "lunasa" "Lunasa Prismriver" + "merlin" "Merlin Prismriver" + "rumia" "Rumia" + "satori" "Komeiji Satori" + "iku" "Nagae Iku" + "mystia" "Mystia Lorelei" + "marisa" "Kirisame Marisa" + "tenshi" "Hinanawi Tenshi" + "patchouli" "Patchouli Knowledge" + "reisen" "Reisen Udongein Inaba" + "yuyuko" "Saigyouji Yuyuko" + "youmu" "Konpaku Youmu" + "rin" "Kaenbyou Rin" + "utsuho" "Reiuji Utsuho" + "reimu" "Hakurei Reimu" + "daiyousei" "Daiyousei" + "DOTA_Tooltip_ability_item_0032" "[SSR]Flandre Scarlet" + "DOTA_Tooltip_ability_item_0032_Description" "Flandre has lived for at least 495 years.\n She is young sister of the host of Scarlet Devil Mansion.Like her sister-Remilia Scarlet, she also has a lolita body shape.\nShe seems to has abnormal mentality and thought, and she has uncontrollable collapsing force, so she is shutted in Scarlet Devil Mansion by her sister, not allowed to going out, even hardly ever join parties.\nHuman being is her dessert which she usually have, although she doesn't know at all.\nMany Spell cards of hers have [Taboo] meanings' words.\nThe crystal wings in her back are her biggest feature.\n\n[★][Taboo]Four of a Kind\n[★]Taboo「L?vatein」\n[★★★]Taboo「Kagome, Kagome」\n[★★★★★]Secret Barrage「And Then Will There Be None?」" + "DOTA_Tooltip_ability_item_0032_Lore" "Sometimes diving Scarlet Devil Mansion aboveboard, would meet young sister. it can pass save without stimulating her. It is rarely for me to dive in, wish not to meet her.(Kirisame Marisa)" + "DOTA_Tooltip_ability_item_0031_Description" "The young sister of Master of Palace of the Earth Spirits. The same as Satori, she also has mind-reading ability.\nBut she knows people hate this ability, so she closes her third-eye which can read minds, makes herself cannot read other people's minds.\nRelatively she gains the ability to manipulate the level of subconciousness, but actually her mind-reading ability isn't disappear.\nShe also often acts under subconciousness, makes people cannot find her out.\nShe normally rambles in the earth or Palace of the Earth Spirits.\nSometimes she will pop up on the earth, but due to her own abilities, even looking at her,while you have a distraction, you will forget her soon.\nActually there are also many youkaies in underworld feel self-condemned about Koishi's current situation.\n\n[★]「Rose Hell」\n[★]「Philosophy of a Hated Person」\n[★★★] Instinct「Release of the Id」\n[★★★★★]「Subterranean Rose」" + "DOTA_Tooltip_ability_item_0030_Description" "Remilia's a 500-year-old vampire lord, king of night.\nShe is the host of Scarlet Devil Mansion, the old sister of Flandre.\nShe has a lolita body shape,wearing a pink dress.\nAs the host of Scarlet Devil Mansion, she really pays attention to majesty and dignity like ordinary nobilities. \nBut her character is like her appearance, very wilful and childish.\nShe has「Ability of manipulating the fate」, seems to be able to make people which are affected have high chance to meet something precious.\n\n[★]「Red Magic」\n[★]Night Lord「Dracula Cradle」\n[★★★] Divine Spear「Spear the Gungnir」\n[★★★★★]Scarlet Sign「Red the Nightless Castle」" + "remilia" "Remilia Scarlet" + "flandre" "Flandre Scarlet" + "sakuya" "Izayoi Sakuya" + "koishi" "Komeiji Koishi" + "koakuma" "Koakuma" + "meirin" "Hong Meiling" + "yuuka" "Kazami Yuuka" + "DOTA_Tooltip_ability_item_0033" "[R]Little Devil" + "DOTA_Tooltip_ability_item_0033_Description" "The devil is a powerful race in Gensoukyou, like Magicians and vampires.\nBut relative to others, little devils are still weak.\n Similar with fairies, her life is light-hearted, her character is so naughty and usually looks really free\n\n[★]「Pyro Match」\n[★★★]「Taboo Grimoire Index」" + "DOTA_Tooltip_ability_item_0034" "[R]Hong Meiling" + "DOTA_Tooltip_ability_item_0034_Description" "Chinese youkai,the guard of Scarlet Devil Mansion.\n She is also a Kungfu master, as first line of defense to against intruders.\nThe appearance is just like human.\nHer ability is very comprehensive, without obvious weaknesses,causes when she compares with youkais that reinforced some skills specificly, she will be not outstanding enough.\nBut only of intruding rudely,she is so kind to human and hardly ever attack human.\nDuring she is doing the guard, she also managing the garden of Scarlet Devil Mansion, being the gardener of Scarlet Devil Mansion.\n\n[★]Flowery Sign「Colorful Light Lotus Flower Palm」\n[★★★]Three Blasts「Colorful Ultimate Mountain Breaker」" + "DOTA_Tooltip_ability_item_0034_Lore" "「A...abasolutely don't laze any more.」" + "DOTA_Tooltip_ability_item_0033_Lore" "Living in Scarlet Devil Mansion at ordinary time, also not be allocated some work, are a group of free characters." + "DOTA_Tooltip_ability_item_0035" "[SSR]Kazami Yuuka" + "DOTA_Tooltip_ability_item_0035_Description" "The youkai lives in Gensokyo. Has ability to control flowers.\nReally like flowers open seasonally, Spring flowers on Spring,\nSummer flowers on Summer,Autumn flowers on Autumn,\n and there are still a few Winter flowers on Winter\nas having flowers open in all year to the goal to work hard.\nLiving around flowers in all year, if human or youkai intrude to bother her, she will use her powerful power to kill them without any explaining.\nAs a flower youkai, she is more like the incarnation of nature. Differ from fairies, She is much more dangerous than all youkaies that had been introduced until now.\nAt ordinary time she lives in the place surrounding by flowers, looks like a kind man but in fact she is no mercy to others.\n\n[★]Flower Sign「Blossoming of Gensokyo」\n[★]「Fantastic Spring Flowers」\n[★★★]Fantasy「The Beauties of Nature」\n[★★★★★]Extremity「Double Spark」" + "DOTA_Tooltip_ability_thtd_remilia_01" "「Red Magic」" + "DOTA_Tooltip_ability_thtd_remilia_01_Description" "Remilia causes one time of damage to units in target areas.\n\n[Damage Multiplier]DAMAGE:POWER POINT*STAR-LEVEL*1" + "DOTA_Tooltip_ability_thtd_remilia_02" "Night Lord「Dracula Cradle」" + "DOTA_Tooltip_ability_thtd_remilia_02_Description" "When Remilia's skills cause damage, she will absorb targets'power,promote herself 1%% magic damage.(max to promote 50%%)\n\n[COOPERATION PROMOTION -Flandre]\n\nPROMOTE DAMAGES BECOME TO 2%%." + "DOTA_Tooltip_ability_thtd_remilia_03" "Divine Spear「Spear the Gungnir」" + "DOTA_Tooltip_ability_thtd_remilia_03_Description" "Remilia flings out the divine spear, causes damage to enemies in the straight line.\n\n[Damage Multiplier]DAMAGE:POWER POINTS*STAR LEVEL*3" + "DOTA_Tooltip_ability_thtd_remilia_04_Description" "While the divine spear pierces targets, there is 5%% CHANCE to cause targets attaching a [Fate]Sign.\n\nMake targets' HP REDUCE 5%%, and REDUCING 1000 PHYSICAL RESISTANCES AND MAGIC RESISTANCES.\n\nAfter targets dead,it will perform[Nightless Castle] in dead place,causes damage over time to units around the target. \n\n[Relative to Star Level]Nightless Castle DAMAGE:POWER POINTS*STAR LEVEL*7 PER SECOND\n\n[COOPERATION PROMOTION - Sakuya Izayoi]\n\nACTIVATION CHANCE BECOME TO 10%%." + "DOTA_Tooltip_ability_thtd_remilia_04" "Scarlet Sign「Red the Nightless Castle」" + "DOTA_Tooltip_ability_thtd_flandre_01" "Taboo「Four of a Kind」" + "DOTA_Tooltip_ability_thtd_flandre_01_Description" "Flandre creates 3 replications, WHEN FLANDRE CAUSES SKILL DAMAGES, REPLICATIONS WILL ALSO CAUSE DAMAGES." + "DOTA_Tooltip_ability_thtd_flandre_02" "Taboo「L?vatein」" + "DOTA_Tooltip_ability_thtd_flandre_02_Description" "WHEN FLANDRE IS DOING NORMAL ATTACKS, THEY WILL CAUSE EXTRA DAMAGES TP TARGETS, AND ABSORB POWER TO PROMOTE HERSELF 1%% PHYSICAL DAMAGES.(MAX TO PROMOTE 50%%)\n\nIF FLANDRE'S SKILL DAMAGES KILL THE TARGET, THE OVERFLOW DAMAGES WILL TRANSFER TO SURROUNDDING UNITS.\n\n[RELATIVE TO STAR LEVEL]DAMAGE:POWER POINT*STAR LEVEL/4\n\n[COOPERATION PROMOTION - Remilia Scarlet]\n\nPROMOTE DAMAGE BECOME TO 2%%." + "DOTA_Tooltip_ability_thtd_flandre_03" "Taboo「Kagome, Kagome」" + "DOTA_Tooltip_ability_thtd_flandre_03_Description" "When Flandre causes damage to targets, TARGETS' LOWER HP WILL CAUSE HIGHER DAMAGES. h\n\n TARGETS REDUCE EACH 1%% HP, THE DAMAGE WILL PROMOTE 1%%." + "DOTA_Tooltip_ability_thtd_flandre_04" "Secret Barrage「And Then Will There Be None?」" + "DOTA_Tooltip_ability_thtd_flandre_04_Description" "Flandre catches targets' weakness, CAUSES HUGE SINGLE DAMAGE TO THE TARGET.\n\n[RELATIVE TO STAR LEVEL]DAMAGE:POWER POINT*STAR LEVEL*24/4" + "DOTA_Tooltip_modifier_flandre_02_buff" "Taboo「L?vatein」" + "DOTA_Tooltip_modifier_flandre_02_buff_Description" "Flandre holds Sword of Fire[L?vatein]." + "DOTA_Tooltip_ability_item_0022_Description" "The only human in Scarlet Devil Mansion,the maid manager there. \nHaving the highest level of ability relative to human: ability of manipulating time.\nAt ordinary time she serves Remilia and manages daily routines in Scarlet Devil Mansion.\nBut due to work is so heavy, she often needs to use ability to help her complete work.\nHaving absolute loyalty to Madam, but sometimes her thinking ways seem to a little be natural dullness.\nbeing able to play magic show, using throwing knives to be danmuku, and her knife-throwing skill is excellent.\nThe actual spokesperson in Scarlet Devil Mansion.\n\n[★]Buriallusion「Phantom Killer in Night Mist」\n[★★★]Time Sign「Sakuya's Special Stopwatch」\n[★★★★]Time Sign「Private Square」" + "DOTA_Tooltip_ability_item_0022_Lore" "「Thd World!」" + "DOTA_Tooltip_ability_ability_dummy_unit" "" + "DOTA_Tooltip_ability_thtd_sakuya_01_Description" "Sakuya throws a row of throwing knives, causes damage to enemies in the sector areas.\n\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*1 /EACH KNIFE" + "DOTA_Tooltip_ability_thtd_sakuya_01" "Buriallusion「Phantom Killer in Night Mist」" + "DOTA_Tooltip_ability_thtd_sakuya_02" "Time Sign「Sakuya's Special Stopwatch」" + "DOTA_Tooltip_ability_thtd_sakuya_02_Description" "REFRESH A UNIT'S TIME, REGEN ITS SKILL'S FREEZING TIME, AND REGEN ITS MP IS USED(NOT USEFUL TO SOME SKILLS).\n\nA UNIT ONLY CAN HAVE ONE REFRESH IN 15S.\n\n[COOPERATION PROMOTION - Remilia Scarlet]\n\nWHEN REFRESHING REMILIA'S TIME, THIS SKILL'S FREEZING TIME REDUCE TO A HALF, AND REFRESHING TIME ALSO REDUCE TO A HALF." + "DOTA_Tooltip_modifier_sakuya_02_buff" "Time Sign「Sakuya's Special Stopwatch」" + "DOTA_Tooltip_modifier_sakuya_02_buff_Description" "THIS UNIT HAS GOT REFRESH EFFECT." + "DOTA_Tooltip_ability_thtd_sakuya_03" "Time Sign「Private Square」" + "DOTA_Tooltip_ability_thtd_sakuya_03_Description" "Sakuya enter private time, open a forbidden barrier, ALL ENEMIES STOP THEIR TIME IN THIS BARRIER, DURING 2 SECONDS.\n\nDURING THIS TIME SAKUYA'S Buriallusion「Phantom Killer in Night Mist」WILL NOT EXPEND MP, BUT DAMAGE REDUCE 75%%.\n\n[COOPERATION PROMOTION - Hong Meiling]\nDAMAGE REDUCTION REDUCES TO 50%%." + "DOTA_Tooltip_modifier_sakuya_03_time_pause_debuff" "Time Sign「Private Square」" + "DOTA_Tooltip_modifier_sakuya_03_time_pause_debuff_Description" "THIS UNIT'S TIME IS STOPPED BY SAKUYA." + "DOTA_Tooltip_ability_thtd_koishi_01_Description" "Koishi Komeiji'S ATTACK WILL ATTACK ALL UNITS IN ATTACK RANGES IN SAME TIME.\n\nAND HAS 30% CHANCE TO ATTACH EXTRA DAMAGES.\n\n[RELATIVE TO STAR LEVEL]DAMAGE:POWER POINT*STAR LEVEL*1" + "DOTA_Tooltip_ability_thtd_koishi_01" "「Rose Hell」" + "DOTA_Tooltip_ability_thtd_koishi_02" "「Philosophy of a Hated Person」" + "DOTA_Tooltip_ability_thtd_koishi_02_Description" "Koishi Komeiji's EACH ATTACK WILL PROMOTE 5% ATTACK SPEED, MAX TO STACK 10 BUFFS." + "DOTA_Tooltip_modifier_koishi_02_attack_speed" "「Philosophy of a Hated Person」" + "DOTA_Tooltip_modifier_koishi_02_attack_speed_Description" "Koishi Komeiji's attack speed promotes." + "DOTA_Tooltip_ability_thtd_koishi_03" "Instinct「Release of the Id」" + "DOTA_Tooltip_ability_thtd_koishi_03_Description" "Koishi Komeiji PROMOTES TARGET UNITS' POWER POINTS. DURING 10 SECONDS.\n\n[RELATIVE TO STAR LEVEL]POWER PROMOTION:200/400/1000\n\n[COOPERATION PROMOTION - Koishi Komeiji]\n\nDURATION PROMOTES TO 20 SECONDS." + "DOTA_Tooltip_ability_thtd_koishi_04" "「Subterranean Rose」" + "DOTA_Tooltip_ability_thtd_koishi_04_Description" "Koishi Komeiji enter mental closing status, PROMOTE HER OWN POWER POINTS HUGELY, AND MAKES ATTACK STYLE TO BE MELEE-ATTACK. \n\nIN THE DURATION,「Philosophy of a Hated Person」BUFF CAN STACK MAX TO 20." + "DOTA_Tooltip_ability_thtd_koakuma_01" "「Pyro Match」" + "DOTA_Tooltip_ability_thtd_koakuma_01_Description" "Little devil throws a fire ball to the target, THE FIRE BALL WILL BOUNCE IN THE TARGET AND ITS AROUND UNITS, MAX TO BOUNCE 25 TIMES.\n\n[RELATIVE TO STAR LEVEL]DAMAGE:POWER POINT*STAR LEVEL*1\n\n[COOPERATION PROMOTION - Patchouli Knowledge]\n\nFIRE BALLS GET EXTRA 35%% RANGE DAMAGES." + "DOTA_Tooltip_ability_thtd_koakuma_02" "「Taboo Grimoire Index」" + "DOTA_Tooltip_ability_thtd_koakuma_02_Description" "Little devil promotes her surrounding units' MAGEC PENETRATION.\n\n[RELATIVE TO STAR LEVEL]PENETRATION PROMOTION:10/20/40" + "DOTA_Tooltip_modifier_koakuma_02_buff" "「Taboo Grimoire Index」" + "DOTA_Tooltip_modifier_koakuma_02_buff_Description" "Influencing by little devil, this unit's magic penetration has been promoted." + "DOTA_Tooltip_ability_thtd_meirin_01" "Flowery Sign「Colorful Light Lotus Flower Palm」" + "DOTA_Tooltip_ability_thtd_meirin_01_Description" "Hong Meiling doesn't have normal attack way, but if there are units go through her, she will do continous attack to her front side.\n\nFirst Trick:Rainbow Sign「Intense Rainbow Fist」\nCausing (power points *1) DAMAGES TO THE TARGETS IN FRONT STRAIGHT-LINE AREAS.\nSecond Trick:Chi Sign「Earth Dragon Sky Dragon Kick」\nCausing (POWER POINTS*1) DAMAGES TO UNITS IN FRONT SECTOR AREAS.\nThird Trick:Flower Sign「Gorgeous Sweet Flower」\nCausing (POWER POINTS*STAR LEVEL*1) DAMAGES TO UNITS IN FRONT CIRCLE AREAS, AND REDUCING MOVEMENT SPEED." + "DOTA_Tooltip_modifier_meirin_01_pause" "Flowery Sign「Colorful Light Lotus Flower Palm」" + "DOTA_Tooltip_modifier_meirin_01_slow_buff" "Flowery Sign「Colorful Light Lotus Flower Palm」" + "DOTA_Tooltip_modifier_meirin_01_pause_Description" "Meiling is releasing Colorful Light Lotus Flower Palm." + "DOTA_Tooltip_modifier_meirin_01_slow_buff_Description" "Affecting by Colorful Light Lotus Flower Palm, this unit's movement speed is reduced." + "DOTA_Tooltip_ability_thtd_meirin_02" "Three Blasts「Colorful Ultimate Mountain Breaker」" + "DOTA_Tooltip_ability_thtd_meirin_02_Description" "After Hong Meiling release 「Colorful Light Lotus Flower Palm」, HAVE 50% CHANCE TO RELEASE ADVANCED 4 KUNGFU TRICKS.\n\nFourth Trick[★★★Unlock]:Chi Sign「Fierce Tiger Energy Release」\nCause (POWER POINTS*2) DAMAGE TO UNITS IN FRONT SECTOR AREAS.\nFifth Trick[★★★Unlock]:Flowery Sign「Mountain Breaker」\nCause (POWER POINTS*STAR LEVEL*2) DAMAGE TO UNITS IN FRONT CIRCLE AREAS, AND STUN ENEMIES 0.5 SECOND.\nSixth Trick[★★★★★Unlock]:Colorful Flower「Rainbow Taijiquan」\nCause (POWER POINTS*4) DAMAGES TO UNITS IN FRONT STRAIGHT LINE AREAS.\nSeventh Trick[★★★★★Unlock]:Three Blasts「Colorful Ultimate Mountain Breaker」\nCausing (POWER POINTS*STAR LEVEL*4) DAMAGE TO UNITS IN FRONT CIRCLE AREAS, AND STUN ENEMIES 1.0 SECOND.\n\n[COOPERATION PROMOTION- Izayoi Sakuya]\nACTIVATION CHANCE PROMOTES TO 75%%." + "yukari" "Yakumo Yukari" + "ran" "Yakumo Ran" + "chen" "Chen" + "eirin" "Yagokoro Eirin" + "mokou" "Fujiwara no mokou" + "DOTA_Tooltip_ability_thtd_yuuka_01" "Flower Sign「Blossoming of Gensokyo」" + "DOTA_Tooltip_ability_thtd_yuuka_03" "Fantasy「The Beauties of Nature」" + "DOTA_Tooltip_ability_thtd_yuuka_02" "「Fantastic Spring Flowers」" + "DOTA_Tooltip_ability_thtd_yuuka_03_Description" "Creating a illusion of Yuuka in the target point, at the same time FLOWER FIELD WILL APPEAR BETWEEN YUUKA AND ILLUSION.\n\nUNITS GO CROSS THE FLOWER FIELD WILL GET DAMAGE OVER TIME, IF UNITS DIE IN FLOWER FIELD, IT WILL PROMOTE YUUKA 0.5%% SKILL DAMAGES AND 0.5%% FLOWER ATTACK DAMAGES.\n\n[Relative to Star level]DAMAGE:POWER POINT*STAR LEVEL*1 /PER SEC\n[Relative to Star level]MAX DAMAGE PROMOTION:50%%/100%%/200%%" + "DOTA_Tooltip_ability_thtd_yuuka_02_Description" "Creating a flower field in front of Yuuka.\n\nThe flower field will constantly sow.\n\n[Relative to Star level]FLOWER ATTACK DAMAGE:Yuuka ATTACK DAMAGE*1" + "DOTA_Tooltip_ability_thtd_yuuka_01_Description" "Causing a damage to enemies near Yuuka.\n\nIf there are seeds in the area, the seeds will bloom and attack nearby enemies. \n\n[Relative to Star level]DAMAGE:POWER POINT*STAR LEVEL*1" + "DOTA_Tooltip_modifier_yuuka_03_kill" "Fantasy「The Beauties of Nature」" + "DOTA_Tooltip_modifier_thtd_yuuka_03_death" "Fantasy「The Beauties of Nature」" + "DOTA_Tooltip_modifier_thtd_yuuka_03_death_Description" "This unit intrude the flower field, will become fertilizers soon." + "DOTA_Tooltip_modifier_yuuka_03_kill_Description" "Due to the fertilizers,Yuuka's power promotes." + "DOTA_Tooltip_ability_thtd_yuuka_04" "Extremity「Double Spark」" + "DOTA_Tooltip_ability_thtd_yuuka_04_Description" "Yuuka control the power of nature, release devastating magic cannon with her replication.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*7 /PER SECOND" + "DOTA_Tooltip_modifier_thdots_yuuka04_think_interval" "Extremity「Double Spark」" + "DOTA_Tooltip_modifier_thdots_yuuka04_think_interval_Description" "This unit is releasing magic cannon." + "DOTA_Tooltip_ability_thtd_yukari_01" "Evil Spirits「Yukari Yakumo's Spiriting Away」" + "DOTA_Tooltip_ability_thtd_yukari_01_Description" "Yukari manipulates space crack to hide the target.\n\n[COOPERATION PROMOTION - Hakurei Reimu]\n\nSTORAGE NUMBER PROMOTES TO 5." + "DOTA_Tooltip_modifier_yukari_01_hidden_Description" "This unit is in the space crack." + "DOTA_Tooltip_modifier_yukari_01_hidden" "Evil Spirits「Yukari Yakumo's Spiriting Away」" + "DOTA_Tooltip_ability_thtd_yukari_02" "Barrier「Balance of Motion and Stillness」" + "DOTA_Tooltip_ability_thtd_yukari_02_Description" "Yukari throw units in space crack into target point. CAUSING DAMAGE AND STUN TO TARGET POINTS.\n\n[Relative to Star level]DAMAGE:POWER POINT*STAR LEVEL*1" + "DOTA_Tooltip_ability_thtd_yukari_03" "「Profound Danmaku Barrier -Phantasm, Foam and Shadow-」" + "DOTA_Tooltip_ability_thtd_yukari_03_Description" "Yukari CHANNEL 1 SECOND, TELEPORT TO TARGET POINT.\n\nAFTER 3 SECONDS TELEPORT BACK BY 1 SECOND CHANNEL.\n\n[COOPERATION PROMOTION - Ran Yakumo,Chen]\n\nRan and Chen will be teleported together" + "DOTA_Tooltip_ability_thtd_yukari_04" "Abandoned Line「Aimless Journey to the Abandoned Station」" + "DOTA_Tooltip_modifier_yukari_04_speed" "Abandoned Line「Aimless Journey to the Abandoned Station」" + "DOTA_Tooltip_modifier_yukari_04_speed_Description" "This unit is galloping." + "DOTA_Tooltip_ability_thtd_yukari_04_Description" "Yukari summons abandoned trolley bus, galloping from enemies'starting point in the path.\n\nCAUSING DAMAGE TO UNITS ARE CRASHED BY TROLLEY BUS AND STUN.TROLLEY BUS'S DURATION IS 30 SECONDS.\n\n[Relative to Star level]DAMAGE:POWER POINT*STAR LEVEL*10 /PER SEC\n\n[COOPERATION PROMOTION - Ran Yakumo, Chen]\n\nADD 5 MORE CARRIAGES FOR TROLLEY BUS." + "DOTA_Tooltip_ability_thtd_ran_01" "Shikigami's Radiance「Fox-Tanuki Youkai Laser」" + "DOTA_Tooltip_ability_thtd_ran_01_Description" "Ran shoots laser to a target, and bounces in the target and random targets around the first target.\n\n[Relative to Star level]DAMAGE:POWER POINT*STAR LEVEL*2 /EACH TIME" + "DOTA_Tooltip_ability_thtd_ran_02" "Shikigami's Shot「Ultimate Buddhist」" + "DOTA_Tooltip_ability_thtd_ran_02_Description" "Ran rotates large Sign, CAUSING MOVEMENT SPEED REDUCTION TO ENEMIES TOUCHED THE SIGN. DURING 3.4 SECONDS.\n\n[Relative to Star level]MOVEMENT SPEED REDUCTION:20%%/35%%/50%%/65%%/80%%" + "DOTA_Tooltip_modifier_thdots_ran02_debuff_Description" "Due to Ran's influence, this unit's movement speed is reduced." + "DOTA_Tooltip_modifier_thdots_ran02_debuff" "Shikigami's Shot「Ultimate Buddhist」" + "DOTA_Tooltip_aura_thdots_ran02_debuff" "Shikigami's Shot「Ultimate Buddhist」" + "DOTA_Tooltip_ability_thtd_ran_03" "Illusion God「Descent of Izuna Gongen」" + "DOTA_Tooltip_ability_thtd_ran_03_Description" "Every time when there are units release skills and expand MP around Ran, Ran will shoot a Shikigami's Radiance「Fox-Tanuki Youkai Laser」to surrounding random units.\n\n[COOPERATION PROMOTION - Yukari Yakumo,Chen]\n\nWhen activate this skill, it will regen the target this skill's 25% MP expense." + "DOTA_Tooltip_modifier_ran_03_spell_buff" "Illusion God「Descent of Izuna Gongen」" + "DOTA_Tooltip_modifier_ran_03_spell_buff_Description" "Getting Ran's supports." + "DOTA_Tooltip_ability_thtd_chen_01" "Yin Yang「Large Pentagram Crest」" + "DOTA_Tooltip_ability_thtd_chen_01_Description" "PASSIVE: EACH TIME CHEN MOVES, CAUSING A SHOCKING ATTACK, SHOCKING ATTACK WILL PROMOTES RANGES AND DAMAGES BY MOVEMENT DISTANCES PROMOTION.\n\nACTIVE:Chen roll to target point.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*0.7 / PER 100 DISTANCE (MAX TO PROMOTE TO *5)\n\n[COOPERATION PROMOTION - Ran Yakumo,Yukari Yakumo]\n\nPER 100 DISTANCE CHANGE TO PER 75 DISTANCE(MAX TO PROMOTE TO *20)" + "DOTA_Tooltip_ability_thtd_eirin_01_Description" "WHEN EIRIN IS ATTACKING, WILL ATTACH A DANMUKU ATTACK AROUND UNITS RANDOMLY, AND REDUCE 10 MP.\n\nWHEN RELEASING DANMUKU, HAVE CHANCE TO REGEN SELF 40% MP.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*0.5\n[Relative to star level]CHANCE TO REGEN:10%%/20%%/30%%/40%%/50%%" + "DOTA_Tooltip_ability_thtd_eirin_01" "Revival「Seimei Yūgi -Life Game-」" + "DOTA_Tooltip_ability_thtd_eirin_02" "「Heaven Spider's Butterfly-Capturing Web」" + "DOTA_Tooltip_ability_thtd_eirin_02_Description" "Every time there is unit attack near Eirin, she will release a Revival「Seimei Yūgi -Life Game-」to around random targets." + "DOTA_Tooltip_modifier_eirin_02_spell_buff" "「Heaven Spider's Butterfly-Capturing Web」" + "DOTA_Tooltip_modifier_eirin_02_spell_buff_Description" "This unit get Eirin's support." + "DOTA_Tooltip_ability_thtd_eirin_03" "Medicine Sign「Large Galaxy in a Pot」" + "DOTA_Tooltip_ability_thtd_eirin_03_Description" "Creating an unescapable barrier in target point." + "DOTA_Tooltip_ability_thtd_eirin_04" "God Sign「Genealogy of the Celestials」" + "DOTA_Tooltip_ability_thtd_eirin_04_Description" "Eirin shoots danmuku to around in target point, DANMUKU WILL REBOUNCE WHEN CRACK THE BARRIER, EACH REBOUNCE WILL PROMOTE 20% DAMAGE, MAX TO PROMOTE 5 TIMES.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*0.1 /EACH DANMUKU" + "DOTA_Tooltip_ability_thtd_mokou_01" "Hourai「South Wind, Clear Sky -Fujiyama Volcano-」" + "DOTA_Tooltip_ability_thtd_mokou_01_Description" "Fujiwara no Mokou's attack HAS 10%% CHANCE TO CRIT.\n\nAND EACH ATTACK WILL PROMOTE 5%% CRIT CHANCE\n\n[Relative to Star level]MAX CRIT CHANCE:30%%/40%%/50%%/60%%/70%%" + "DOTA_Tooltip_passive_mokou_01_crit" "Hourai「South Wind, Clear Sky -Fujiyama Volcano-」" + "DOTA_Tooltip_passive_mokou_01_crit_Description" "This unit's crit chance promotes." + "DOTA_Tooltip_ability_thtd_mokou_02" "Forgiveness「Honest Man's Death」" + "DOTA_Tooltip_ability_thtd_mokou_02_Description" "Fujiwara no Mokou's EACH CRIT WILL PROMOTE HERSELF DOUBLE CRIT DAMAGE.\n\nIF THIS ATTACK DOESN'T CRIT, THE MULTIPLE WILL BE CLEARED.\n\n[Relative to star level]MAX CRIT DAMAGE:2/4/8/16/32 TIMNES." + "DOTA_Tooltip_ability_item_0035_Lore" "Don't have some special target, just enjoy life: sleeping, waking up,apprecationg flowers,and sleeping repeatedly." + "DOTA_Tooltip_ability_item_0036" "[SSR]Yukari Yakumo" + "DOTA_Tooltip_ability_item_0037" "[SR]Ran Yakumo" + "DOTA_Tooltip_ability_item_0038" "[R]cHEN" + "DOTA_Tooltip_ability_item_0039" "[SSR]Eirin Yagokoro" + "DOTA_Tooltip_ability_item_0040" "[SR]Fujiwara no Mokou" + "DOTA_Tooltip_ability_item_0036_Lore" "I am purple mother so what?\nPoped up behind me, Caught my head and pressed to the keyboard if you could anghhkjl;l'klhjhgfsdfhjkl;' lkhjfcxsdffhjkhl;lkjhgfsdhjkl;" + "DOTA_Tooltip_ability_item_0036_Description" "Experience and power are both powerful, has high intelligence, always looks like understand everything.\nShe is called Youkai Oracle, t Before thousands of years one of the Gensokyo's founders.\nAs one of a few youkaies know the essence of Gensokyo, she also extremely cherishes Gensokyo.\nGap Youkai, this race only constitutes by herself, at ordinary time she stays in her gap.\nTwice Lunar War's originator.\n\n[★]Evil Spirits「Yukari Yakumo's Spiriting Away」\n[★]Barrier「Balance of Motion and Stillness」\n[★★★]「Profound Danmaku Barrier -Phantasm, Foam and Shadow-」\n[★★★★★]Abandoned Line「Aimless Journey to the Abandoned Station」" + "DOTA_Tooltip_ability_item_0037_Description" "Ran Yakumo is a Kyuubi, herself has been powerful,and being shikigami of Yukari Yakumo for a long time makes her abilities more powerful than normal youkaies.\nDue to most of time Yukari Yakumo sleeps, the barrier's daily maintenance work is also belongs to her.\nBeing able to work independently and has her own Shikigami(Chen), so she is The Most Powerful Monster.\n\n[★]Shikigami's Radiance「Fox-Tanuki Youkai Laser」\n[★]Shikigami's Shot「Ultimate Buddhist」\n[★★★★]\"Illusion God「Descent of Izuna Gongen」" + "DOTA_Tooltip_ability_item_0037_Lore" "When I am working busily, my own lord is keeping sleeping." + "DOTA_Tooltip_ability_item_0038_Description" "A youkai cat lives in Mayohiga, and also she is Ran Yakumo's shikigami.\nHaving quick action, youkai power will promote in shikigami state, but still scared to water.\nLooks so smart, but actually her IQ is only like nearby human children.\n\n[★]Yin Yang「Large Pentagram Crest」" + "DOTA_Tooltip_ability_item_0039_Description" "The oracle of Lunar Capital. Her appearance looks young, and knowledgeable. But her speaking style, facial expressions, acts and so on all have unapproachable atmosphere seems like immortal exclusively have.\nShe called herself Forever Person, treats Remilia(500 years old) like treating a child.\nHer age has beyonded billions.\nPharmacology and archery are both excellent,\can use magic medicine and archery to knit the barrier.\nBut the really powerful of her is magic and wisdom.\n\n[★]Revival「Seimei Yūgi -Life Game-」\n[★]「Heaven Spider's Butterfly-Capturing Web」\n[★★★]Medicine Sign「Large Galaxy in a Pot」\n[★★★★★]God Sign「Genealogy of the Celestials」" + "kaguya" "Houraisan Kaguya" + "aya" "Shameimaru Aya" + "DOTA_Tooltip_ability_thtd_mokou_03" "Inextinguishable「Phoenix's Tail」" + "DOTA_Tooltip_ability_thtd_mokou_03_Description" "Fujiwara no Mokou releases phoenix's power,promotes self's ATTACK DAMAGE, and RELEASE Undying「Fire Bird -Flying Phoenix-」IN CRIT.\n\n[Relative to star level]ATTACK DAMAGE PROMOTION:500/2000" + "DOTA_Tooltip_ability_thtd_kaguya_01" "Impossible Request「Bullet Branch of Hourai -Rainbow Danmaku-」" + "DOTA_Tooltip_ability_thtd_kaguya_01_Description" "Kaguya RELEASE 3 TIMES DANMUKU TO THE TARGET POINT, DANMUKU WILL NARROW GRADUALLY.\n\n[Relative to Star level]DAMAGE:POWER POINT*STAR LEVEL*0.5" + "DOTA_Tooltip_ability_thtd_kaguya_02_Description" "The ability of kaguya: manipulates forever and moment, makes surrounding units' speed change constantly. \n\nEACH 2 SECONDS SWITCH 1 TIME, MAKES AROUND UNITS SPEED UP OR SPEED DOWN, WHEN SPEED UP, UNITS GET MORE DAMAGES, WHEN SPEED DOWN, UNITS GET LESS DAMAGES.\n\n[Relative to Star level]SPEED UP/DOWN EFFECT:50%%\n[Relative to Star level]More/LESS DAMAGE EFFECT:15%%/20%%/25%%/30%%/50%%(LESS-DAMAGE EFFECT IS ONLY HALF OF THE MORE-DAMAGE EFFECT)" + "DOTA_Tooltip_ability_thtd_kaguya_02" "「End of Imperishable Night」" + "DOTA_Tooltip_modifier_thdots_kaguya02_debuff" "「End of Imperishable Night」" + "DOTA_Tooltip_modifier_thdots_kaguya02_debuff_Description" "Affected by Forever And Moment Ability, this unit's speed decreases, but the damages it get also decrease." + "DOTA_Tooltip_modifier_thdots_kaguya02_buff_Description" "Affected by Forever And Moment ability, this units' speed promotes, but damages it gets also increase." + "DOTA_Tooltip_modifier_thdots_kaguya02_buff" "「End of Imperishable Night」" + "DOTA_Tooltip_ability_thtd_aya_01" "Wind Sign「Wind God's Fan」" + "DOTA_Tooltip_ability_thtd_aya_01_Description" "Aya Shameimaru's attack has 12%% CHANCE TO RELEASE A HURRICANE, CAUSE DAMAGE AND SPEED REDUCTION TO TARGETS AND UNITS AROUND IT.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*0.5" + "DOTA_Tooltip_ability_thtd_aya_01_move_slow" "MOVEMENT SPEED REDUCTION EFFECT:" + "DOTA_Tooltip_modifier_aya01_slow" "Wind Sign「Wind God's Fan」" + "DOTA_Tooltip_modifier_aya01_slow_Description" "Due to Aya's affection, this units' movement speed is reduced." + "DOTA_Tooltip_ability_ability_common_decrease_armor_buff" "Special skill - Armor Reduction" + "DOTA_Tooltip_ability_ability_common_decrease_armor_buff_Description" "Promote this unit's ARMOR REDUCTION.\n\nThis skill can upgrade by SPELL CARDS FEEDING." + "DOTA_Tooltip_ability_ability_common_decrease_armor_buff_armor" "ARMOR REDUCTION:" + "DOTA_Tooltip_ability_ability_common_decrease_magic_armor_buff_Description" "Promote this unit's MAGIC RESISTANCE REDUCTION.\n\nThis skill can upgrade by SPELL CARDS FEEDING." + "DOTA_Tooltip_ability_ability_common_decrease_magic_armor_buff" "SPECIAL SKILL - MAGIC RESISTANCE REDUCTION" + "DOTA_Tooltip_ability_ability_common_decrease_magic_armor_buff_magic_armor" "MAGIC RESISTANCE REDUCTION:" + "DOTA_Tooltip_ability_item_2001_Description" "CLEAR ALL ENEMIES(ESCAPE FROM YOUR HAND) IN THE MAP(CONSUMABLES)" + "DOTA_Tooltip_ability_item_2001" "Four Dimensional Bomb" + "DOTA_Tooltip_ability_item_2002" "Hakurei Gohei" + "DOTA_Tooltip_ability_item_2002_Description" "Choose a SSR card from your deck and draw it out(consumables)" + "DOTA_Tooltip_ability_item_2003_Description" "Choose a SR card from your deck and draw it out(consumable)" + "DOTA_Tooltip_ability_item_2003" "Wind Priest Gohei" + "DOTA_Tooltip_ability_item_2004_Description" "Choose a R card from your deck and draw it out(consumable)" + "DOTA_Tooltip_ability_item_2004" "Gohei" + "DOTA_Tooltip_ability_item_2005_Description" "[Single Item Effect]PROMOTE 10%% ATTACK DAMAGE\n\n[Double Item Effect]PROMOTE 30% ATTACK DAMAGE\n\n[Quadruple Item Effect]PROMOTE UNITS 50%% ATTACK DAMAGE IN 1000 DISTANCES." + "DOTA_Tooltip_ability_item_2005" "Bloody Parasol" + "DOTA_Tooltip_ability_item_2006_Description" "[Single Item Effect]PROMOTE 4%% MP REGEN\n\n[Double Item Effect]PROMOTE 10%% MP REGEN\n\n[Quadruple Item Effect]PROMOTE UNITS 20%% MP REGEN IN 1000 DISTANCES" + "DOTA_Tooltip_ability_item_2006" "Moonlight Secret Mineral" + "DOTA_Tooltip_ability_item_2007" "Lord Of Calamity Ningyou" + "DOTA_Tooltip_ability_item_2007_Description" "[Single Item Effect]PROMOTE 4%% MP REGEN\n\n[Double Item Effect]PROMOTE 10%% MP REGEN\n\n[Quadruple Item Effect]REDUCE ENEMIES 10%% MOVEMENT SPEED IN 1000 DISTANCES" + "DOTA_Tooltip_ability_item_2008" "Shinigami's Oar" + "DOTA_Tooltip_ability_item_2008_Description" "[Single Item Effect]PROMOTE 5%% CHANCE OF CRIT\n\n[Double Item Effect]PROMOTE 10%% CHANCE OF CRIT\n\n[Quadruple Item Effect]PROMOTE 100%% CRIT DAMAGE" + "DOTA_Tooltip_ability_item_2009" "Reality Ripper" + "DOTA_Tooltip_ability_item_2009_Description" "[Single Item Effect]+2%% POWER POINT +2%% Magic Damage\n\n[Set of 2] +6%% POWER POINT +10%% Magic Damage\n\n[Set of 4]Deals 50% more Damage to enemy over 70%% health." "DOTA_Tooltip_ability_item_2026" "Reaper’s Scythe" + "DOTA_Tooltip_ability_item_2010" "" + "DOTA_Tooltip_ability_item_2010_Description" "[Single Item Effect]+2%% POWER POINT +2%% Physical Damage\n\n[Set of 2] +6%% POWER POINT 10%% Physical Damage\n\n[Set of 4]Deals 50% more Damage to enemy under 30%% health" "DOTA_Tooltip_ability_thtd_byakuren_03" "「Yugyou Hijiri」" + "DOTA_Tooltip_ability_item_2011" "Moon Rabbit Smashing Blade" + "DOTA_Tooltip_ability_item_2011_Description" "[Single Item Effect]PROMOTE 5%% ATTACK DAMAGE, 2%% POWER POINTS\n\n[Double Item Effect]PROMOTE 15%% ATTACK DAMAGE 6%% POWER POINT\n\n[Quadruple Item Effect]PROMOTE 10%% CHANCE TO STUN UNITS 1.0 SECOND." + "DOTA_Tooltip_ability_item_2012" "Mini-Hakkero" + "DOTA_Tooltip_ability_item_2012_Description" "[Single Item Effect]PROMOTE 4%% MAGIC SKILL DAMAGE\n\n[Double Item Effect]PROMOTE 20%% MAGIC SKILL DAMAGE\n\n[Quadruple Item Effect]ENEMIES IN 1000 DISTANCES GET 110% MAGIC SKILL DAMAGES" + "DOTA_Tooltip_ability_item_2013" "L?vateinn" + "DOTA_Tooltip_ability_item_2013_Description" "[Single Item Effect]PROMOTE 4%% PHYSICAL DAMAGE\n\n[Double Item Effect]PROMOTE 20%% PHYSICAL DAMAGE\n\n[Quadruple Item Effect]ENEMIES IN 1000 DISTANCES GET 110%% PHYSICAL DAMAGES." + "DOTA_Tooltip_ability_item_2014" "Spear Gungnir" + "DOTA_Tooltip_ability_item_2014_Description" "[Single Item Effect]PROMOTE 3%% DAMAGE\n\n[Double Item Effect]PROMOTE 15%% DAMAGE\n\n[Quadruple Item Effect]ENEMIES IN 1000 DISTANCES GET 107.5%% DAMAGES." + "DOTA_Tooltip_ability_item_2015" "Mind-WRAITH's Hooks" + "DOTA_Tooltip_ability_item_2015_Description" "[Single Item Effect]PROMOTE 5%% CHANCE OF CRIT.\n\n[Double Item Effect]PROMOTE 10%% CHANCE OF CRIT.\n\n[Quadruple Item Effect]PROMOTE 25%% CHANCE OF CRIT" + "DOTA_Tooltip_ability_item_2016" "Eutectic Karyogamy Stick" + "DOTA_Tooltip_ability_item_2016_Description" "[Single Item Effect]PROMOTE 2%% MAGIC SKILL DAMAGE AND 2%% MP REGEN\n\n[Double Item Effect]PROMOTE 10%% MAGIC SKILL DAMAGE AND 5%% MP REGEN\n\n[Quadruple Item Effect]REDUCE 25% SKILL FREEZING TIME." + "DOTA_Tooltip_ability_item_2017" "Devil's Baby Teeth" + "DOTA_Tooltip_ability_item_2017_Description" "[Single Item Effect]PROMOTE 4%% ATTACK SPEED\n\n[Double Item Effect]PROMOTE 20%% ATTACK SPEED.\n\n[Quadruple Item Effect]PROMOTE 25%% ATTACK SPEED." + "DOTA_Tooltip_ability_item_2018" "Moon Crossbow" + "DOTA_Tooltip_ability_item_2018_Description" "[Single Item Effect]PROMOTE 5%% ATTACK DAMAGE AND 2%% POWER POINTS\n\n[Double Item Effect]PROMOTE 15%% ATTACK DAMAGE AND 6%% POWER POINTS\n\n[Quadruple Item Effect]PROMOTE 200 ATTACK RANGE." + "DOTA_Tooltip_ability_item_2019" "Yin-yang Orb for Tax Payment" + "DOTA_Tooltip_ability_item_2019_Description" "[Single Item Effect]PROMOTE 4%% POWER POINTS\n\n[Double Item Effect]PROMOTE 12%% POWER POINTS\n\n[Quadruple Item Effect]PROMOTE 200 POWER POINTS" + "DOTA_Tooltip_ability_item_2020" "Hi-Tech Camera" + "DOTA_Tooltip_ability_item_2020_Description" "[Single Item Effect]PROMOTE 4%% POWER POINTS\n\n[Double Item Effect]PROMOTE 12%% POWER POINTS\n\n[Quadruple Item Effect]WHEN SKLLS CAUSE DAMAGE TO UNITS, UNITS GET EXTRA 1*POWER POINTS DAMAGE." + "DOTA_Tooltip_ability_item_2021_Description" "GIVE 100 POWER." + "DOTA_Tooltip_ability_item_2021" "DRINK(cannot sell)" + "DOTA_Tooltip_ability_item_2022_Description" "PROMOTE A UNIT TO MAX LEVEL." + "DOTA_Tooltip_ability_item_2022" "Hakurei Shrine's Amulet(cannot sell)" + "DOTA_Tooltip_ability_item_0042" "[SR]Shameimaru Aya" + "hatate" "Himekaidou Hatate" + "momiji" "Inubashiri Momiji" + "DOTA_Tooltip_ability_thtd_patchouli_04" "Sun Sign「Royal Flare」" + "DOTA_Tooltip_ability_thtd_patchouli_04_Description" "Patchouli through guide Sun Sign「Royal Flare」,enemies in 1000 distance get huge damages and stun,For two seconds.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*0.5 /EACH TIME\n\n[COOPERATION PROMOTION - Koakuma]\nNeed five stars and Koakuma on the court." + "DOTA_Tooltip_ability_thtd_kaguya_03_attack_speed" "Attack speed increased:" + "DOTA_Tooltip_ability_thtd_kaguya_03_attack_percent" "Attack increased:" + "DOTA_Tooltip_ability_thtd_kaguya_03_outgoing_percent" "Damage increased:" + "DOTA_Tooltip_ability_thtd_kaguya_03_penetration" "Physical Penetration increased:" + "DOTA_Tooltip_ability_thtd_kaguya_03_move_slow" "Movement Speed reduced:" + "DOTA_Tooltip_ability_thtd_kaguya_03_armor" "Armor reduced:" + "DOTA_Tooltip_ability_thtd_kaguya_03_incoming_percent" "Injured damage increased:" + "DOTA_Tooltip_ability_thtd_kaguya_03_Description" "Kaguya summon Divine Treasures,Inflicts damage on impacted enemies,Adds bonus effect to allied forces.\nActive release will Stop rotating.\n\nDivine Treasures「Brilliant Dragon Bullet」\nFor friendly units:Increase Attack speed\nFor enemy units:Reduce Movement Speed\nDivine Treasures「Buddhist Diamond」\nFor friendly units:Increase Attack\nFor enemy units:Double up Divine Treasures Damage\nDivine Treasures「Salamander Shield」\nFor friendly units:Increase Damage\nFor enemy units:Increase enemy units injured damage\nDivine Treasures「Life Spring Infinity」\nFor friendly units:Increase Physical Penetration\nFor enemy units:Reduce Armor\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*3.5 Per second" + "DOTA_Tooltip_ability_thtd_kaguya_03" "「Divine Treasure」" + "DOTA_Tooltip_modifier_kaguya_03_4_debuff" "Divine Treasures「Life Spring Infinity」" + "DOTA_Tooltip_modifier_kaguya_03_4_buff" "Divine Treasures「Life Spring Infinity」" + "DOTA_Tooltip_modifier_kaguya_03_1_buff" "Divine Treasures「Brilliant Dragon Bullet」" + "DOTA_Tooltip_modifier_kaguya_03_2_buff" "Divine Treasures「Buddhist Diamond」" + "DOTA_Tooltip_modifier_kaguya_03_3_buff" "Divine Treasures「Salamander Shield」" + "DOTA_Tooltip_modifier_kaguya_03_3_debuff" "Divine Treasures「Salamander Shield」" + "DOTA_Tooltip_modifier_kaguya_03_1_debuff" "Divine Treasures「Brilliant Dragon Bullet」" + "DOTA_Tooltip_modifier_kaguya_03_1_buff_Description" "Affected by Kaguya's Divine Treasures,this unit's Attack Speed increased." + "DOTA_Tooltip_modifier_kaguya_03_2_buff_Description" "Affected by Kaguya's Divine Treasures,this unit's Attack increased." + "DOTA_Tooltip_modifier_kaguya_03_3_buff_Description" "Affected by Kaguya's Divine Treasures,this unit's Damage increased." + "DOTA_Tooltip_modifier_kaguya_03_4_buff_Description" "Affected by Kaguya's Divine Treasures,this unit's Physical Penetration increased." + "DOTA_Tooltip_modifier_kaguya_03_4_debuff_Description" "Affected by Kaguya's Divine Treasures,this unit's Armor reduced." + "DOTA_Tooltip_modifier_kaguya_03_3_debuff_Description" "Affected by Kaguya's Divine Treasures,this unit's Injured damage increased" + "DOTA_Tooltip_modifier_kaguya_03_1_debuff_Description" "Affected by Kaguya's Divine Treasures,this unit's Movement Speed reduced." + "DOTA_Tooltip_ability_thtd_aya_02" "「Illusionary Dominance」" + "DOTA_Tooltip_ability_thtd_aya_02_Description" "Shameimaru Aya fly to the destination,Injuries the enemy units that collided.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*0.5\n\n[COOPERATION PROMOTION - Himekaidou Hatate]\nwith「Kakashi Spirit News」sharing information." + "DOTA_Tooltip_ability_thtd_aya_03" "「Peerless Wind God」" + "DOTA_Tooltip_ability_thtd_aya_03_Description" "When Shameimaru Aya trigger Wind Sign 「Wind God's Fan」,「Illusionary Dominance」freezing time will refresh,moreover incidental once attack on the enemy unit." + "DOTA_Tooltip_ability_thtd_hatate_01" "Reporting 「Hatate Himekaidou's Reporting Training」" + "DOTA_Tooltip_ability_thtd_hatate_02" "Far-sightedness 「Tengu Psychography」" + "DOTA_Tooltip_modifier_aya01_news_buff" "「Bunbunmaru Newspaper」" + "DOTA_Tooltip_modifier_aya01_news_buff_Description" "This unit photographed by Aya." + "DOTA_Tooltip_ability_thtd_momiji_02" "Tengu「Shield of the Guardian」" + "DOTA_Tooltip_ability_thtd_hatate_01_Description" "Himekaidou Hatate injury to the target area and attach all enemy units「Kakashi Spirit News」。\nAll attach「Kakashi Spirit News」units will be harmed once damage\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*1\n\n[COOPERATION PROMOTION - Shameimaru Aya]\nwith「Bunbunmaru Newspape」sharing information." + "DOTA_Tooltip_modifier_hatate01_news_buff" "「Kakashi Spirit News」" + "DOTA_Tooltip_ability_thtd_hatate_02_Description" "Himekaidou Hatate make sustained damage to the enemy units in own area,attach all enemy units「Kakashi Spirit News」,for 5 seconds。\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*4 /per second" + "DOTA_Tooltip_modifier_hatate01_news_buff_Description" "This unit photographed by Hatate." + "DOTA_Tooltip_modifier_thdots_hatate02_think_interval" "「Kakashi Spirit News」" + "DOTA_Tooltip_modifier_thdots_hatate02_think_interval_Description" "Himekaidou Hatate thoughtography now" + "DOTA_Tooltip_modifier_momiji_02" "Tengu 「Guardian of Shield」" + "DOTA_Tooltip_modifier_momiji_02_Description" "Affected by Momiji,this unit's Skill damage change to physical type." + "DOTA_Tooltip_ability_thtd_momiji_02_Description" "Make traget friendly unit's skill damage change to physical type and increase 30%%/40%%/60%%。\n\n[COOPERATION PROMOTION - Shameimaru Aya]\nWhen Momiji guard Shameimaru Aya,Aya attack inner circle enemy units will take 50%% effect,attack outer ring enemy units will ignore target unit's Armor." + "DOTA_Tooltip_ability_item_0041" "[SR]Houraisan Kaguya" + "DOTA_Tooltip_ability_item_0043" "[R]Himekaidou Hatate" + "DOTA_Tooltip_ability_item_0044" "[R]Inubashiri Momiji" + "DOTA_Tooltip_ability_item_0041_Description" "Houraisan Kaguya is the main antagonist of Imperishable Night.\nShe was once a princess of the Lunarians, a race of people living on the Moon. Due to illegally creating the Hourai Elixir with Eirin Yagokoro, they ended up living on Earth and what would eventually be Gensokyo.\n She is currently the princess of Eientei.\n\n[★]Impossible Request「Bullet Branch of Hourai -Rainbow Danmaku-」\n[★]「End of Imperishable Night」\n[★★★★]「Divine Treasure」" + "DOTA_Tooltip_ability_item_0040_Description" "Fujiwara no Mokou was formerly an ordinary human, but she became an immortal being after drinking the Hourai Elixir about 1300 years ago. \nNot close to humans,but it will secretly help humanity.she has the ability to manipulate the flame。\nNow she is never able to die, though she still feels the pain of injuries as normal.\nShe's considered to be very powerful, given her long life, the power she earned through her life, and her immortal status since she can keep fighting until she can no longer stand the pain.\n\n[★]Hourai「South Wind, Clear Sky -Fujiyama Volcano-」\n[★]Forgiveness「Honest Man's Death」\n[★★★★]Inextinguishable「Phoenix's Tail」" + "DOTA_Tooltip_ability_item_0042_Description" "Aya is unrelenting when it comes to getting sensationalist news stories, and she frequently twists the truth in her writing to her own advantage. It is her policy as a reporter to only report the truth, but there have been many instances where she has written blatant lies. \n It is said that she will come politely asking interviews of humans and youkai alike if she sees them as worth writing an article about, but will forcefully drive away any who interfere. \n \nHowever, Aya has shown a serious side as well. She can be thoughtful about the effect her stories will have on those who read them. She resents the rigid tengu caste system, as even though she works hard, she is unable to advance in rank due to being a crow tengu. \n\n[★]Wind Sign 「Wind God's Fan」\n[★★★★]「Illusionary Dominance」\n[★★★★]「Peerless Wind God」" + "DOTA_Tooltip_ability_item_0043_Description" "Himekaidou Hatate is a tengu reporter who produces the Kakashi Spirit News. \nUnlike her colleague Aya Shameimaru, she never goes outside for her newspaper research. Instead, she uses her ability called thoughtography.\nAfter reading Aya's Bunbunmaru Newspaper, she decided to observe Aya's way of gathering for her articles.\n\n[★]Reporting 「Hatate Himekaidou's Reporting Training」\n[★★★★] Far-sightedness 「Tengu Psychography」" + "DOTA_Tooltip_ability_item_0044_Description" "Inubashiri Momiji is a white wolf tengu whose duty is to patrol the Youkai Mountain. \nHer good sense of smell and sight are helpful for this duty.\nIt is usually idle, and Kappa is a friend and often plays chess together.\n\n[★]White wolf「Tengu Guardian」\n[★★★] Tengu 「Guardian of Shield」" + "minoriko_max_change" "Minoriko Aki can only exchange up to three times!" + "DOTA_Tooltip_ability_thtd_sanae_01" "Miracle「Daytime Guest Stars」" + "DOTA_Tooltip_ability_thtd_sanae_02" "Great Miracle 「Yasaka's Divine Wind」" + "DOTA_Tooltip_ability_thtd_sanae_03" "Sea Opening 「The Day the Sea Split」" + "DOTA_Tooltip_ability_thtd_sanae_01_Description" "Sanae miracle to the target,Increase the power point of the target,and transfer(1/times)effect to next unit。\n\n[Relative to star level]attribute increased:25/50/100/200/500" + "DOTA_Tooltip_ability_thtd_sanae_02_Description" "Sanae hurricane blowing at the target,Inflicts damage to nearby units and slows them down.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*2 /per second\n[Relative to star level]slow down:15%%/25%%/35%%/50%%" + "DOTA_Tooltip_modifier_sanae_debuff" "Great Miracle 「Yasaka's Divine Wind」" + "DOTA_Tooltip_modifier_sanae_debuff_Description" "Affected by Sanae,the unit was decelerated." + "DOTA_Tooltip_ability_thtd_sanae_03_Description" "Sanae randomly drop lightning at the target area,Each lightning strike damages the target and stun 0.5 seconds。\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL\n\n[Special Effects - Beliefs]\n\nincrease(1+Belief value/250)multiple stun time,and improve(1+Belief value/250)multiple damage." + "DOTA_Tooltip_ability_thtd_kanako_01" "Divine Festival「Expanded Onbashira」" + "DOTA_Tooltip_ability_thtd_kanako_01_Description" "Kanako fire a Onbashira toward the target's direction,Damage units and constantly repelled(Each unit will only be knocked back once),Lasts 2.5 seconds.\n\n[Relative to star level]DAMAGE:POWER POINT*5 /per second" + "DOTA_Tooltip_ability_thtd_kanako_02" "Onbashira「descent」" + "DOTA_Tooltip_ability_thtd_kanako_03" "Onbashira「recover」" + "DOTA_Tooltip_ability_thtd_kanako_02_Description" "Drop a Onbashira at the target location,Onbashira can connect with other Onbashira,Touching the linked unit will injured damage.\n\nMaximum descent(2/4/6)Onbashiras。\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*(5/6/8) /times\n\n[Special Effects - Beliefs]\n\nimprove(1+Belief value/1000)multiple damage." + "DOTA_Tooltip_ability_thtd_kanako_03_Description" "recover target Onbashira." + "DOTA_Tooltip_ability_thtd_kanako_03_unit" "Onbashira「link」" + "DOTA_Tooltip_ability_thtd_kanako_03_unit_Description" "Connect with the target Onbashira." + "DOTA_Tooltip_ability_thtd_suwako_01" "Divine Tool「Moriya's Iron Ring」" + "DOTA_Tooltip_ability_thtd_suwako_01_Description" "Suwako attack will come with an iron wheel,Repel hit targets 150distances and cause damage。(Each unit will only be knocked back once)\n\n[Relative to star level]DAMAGE:POWER POINT*1\n\n[Special Effects - Beliefs]\n\nimprove(1+Belief value/500)multiple knocked back distance." + "DOTA_Tooltip_ability_thtd_minamitsu_02" "Captain「spinach」" + "DOTA_Tooltip_ability_thtd_minamitsu_02_Description" "Minamitsu eat the ancestral spinach,improve50%%power point in 7 seconds,and Attacks can cause power point-based splash damage to the target area。\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*1\n\n[COOPERATION PROMOTION - Houjuu Nue]\n\npower point improve to 75%%。" + "DOTA_Tooltip_modifier_thdots_minamitsu03_bonus" "Captain「spinach」" + "DOTA_Tooltip_modifier_thdots_minamitsu03_bonus_Description" "Minamitsu is a big deal!" + "DOTA_Tooltip_ability_thtd_nue_01" "「Nightmare of Heiankyou」" + "DOTA_Tooltip_ability_thtd_nue_02" "Grudge Bow 「The Bow of Genzanmi Yorimasa」" + "DOTA_Tooltip_ability_thtd_nue_03" "「Stars ○□△× bug」" + "DOTA_Tooltip_ability_thtd_nue_01_Description" "Nue Can impose a nightmare on anyone,Damage adds additional spell damage。When you take the initiative, the effect will double.\nAttack:Add 1x damage to this skill damage\nPositive judgment:Added 2x damage to this skill damage\nThe Bow of Genzanmi Yorimasa:Added 3x damage to this skill damage\n\nRelative to star level]DAMAGE:POWER POINT*1\n\n[COOPERATION PROMOTION - Murasa Minamitsu]\n\nWhen causing damage to enemies in the waters,increased damage50%%。" + "DOTA_Tooltip_ability_thtd_nue_01_duration" "duration:" + "DOTA_Tooltip_passive_nue01_attack" "「Nightmare of Heiankyou」" + "DOTA_Tooltip_passive_nue01_attack_Description" "Houjuu Nue's damage will take extra damage." + "DOTA_Tooltip_modifier_nue_01_extradamage" "「Nightmare of Heiankyou」" + "DOTA_Tooltip_modifier_nue_01_extradamage_Description" "「Nightmare of Heiankyou」the number of overlays." + "DOTA_Tooltip_ability_thtd_nue_02_Description" "Shoot a powerful arrow that full of hatred,The penetrated will receive a large amount of spell damage.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*1" + "DOTA_Tooltip_ability_thtd_nue_03_Description" "When nue kill a unit, it resets the skill cooldown." + "DOTA_Tooltip_modifier_thdots_nue_03" "「Stars ○□△× bug」" + "DOTA_Tooltip_modifier_thdots_nue_03_Description" "When nue kill a unit, it resets the skill cooldown." + "DOTA_Tooltip_ability_item_0046" "[SR]Kochiya Sanae" + "DOTA_Tooltip_ability_item_0046_Description" "Kochiya Sanae is a human, but is also a distant descendant of the goddess Suwako Moriya. \nHer role at the Moriya Shrine is similar to a shrine maiden, but with her inherited power Sanae has also become a minor deity herself. \nOriginally from the Outside World, Sanae migrated to Gensokyo with the shrine and its two resident goddesses, Kanako Yasaka and Suwako Moriya. As a result, she is rather knowledgeable about the outside world and modern living, although her attempts to explain scientific concepts usually just confuse the locals. \n\n[★]Miracle「Daytime Guest Stars\n[★]Great Miracle 「Yasaka's Divine Wind」\n[★★★★]Sea Opening 「The Day the Sea Split」" + "DOTA_Tooltip_ability_item_0047" "[SSR]Yasaka Kanako" + "DOTA_Tooltip_ability_item_0047_Description" "Yasaka Kanako is the main antagonist of Mountain of Faith. She's the current goddess of the Moriya Shrine after defeating its previous resident goddess Suwako Moriya in the Great Suwa War. \nShe desires to collect large amounts of faith, but since the humans of the Outside World no longer place much importance on gods, she has transported the shrine to Gensokyo.\nShe currently lives on top of the Youkai Mountain, where she has an uneasy relationship with the leaders of the tengu. \n\n[★]Divine Festival「Expanded Onbashira」\n[★★★]Onbashira「descent」\n[★★★]Onbashira「recover」\n[★★★★★]「Sacred Authority of the Gods」" + "DOTA_Tooltip_ability_item_0048" "[SR]Moriya Suwako" + "DOTA_Tooltip_ability_item_0048_Description" "Moriya Suwako is the original god of the Moriya Shrine.\nOfficially the shrine now belongs to Kanako Yasaka, but in Suwako's words she handles most of the divine services while Kanako handles the 'sales'. \n\n[★]Divine Tool「Moriya's Iron Ring」\n[★★★]Scourge God 「Mishaguchi-sama」\n[★★★★]「Hellish Heat Geyser」" + "DOTA_Tooltip_ability_item_0048_Note0" "" + "DOTA_Tooltip_ability_item_0049" "[SR]Murasa Minamitsu" + "DOTA_Tooltip_ability_item_0050" "[SR]Houjuu Nue" + "DOTA_Tooltip_ability_item_0050_Description" "Houjuu Nue is said to be one of the most mysterious and feared youkai in many years, yet has been defeated by humans many times. \nThere are many differing legends according to her appearance because she hides her \nAt some point, she was sealed underground, and because of the events of Subterranean Animism, she resurfaced back in Gensokyo. \n\n[★]「Nightmare of Heiankyou」\n[★★★]Grudge Bow 「The Bow of Genzanmi Yorimasa」\n[★★★★]「Stars ○□△× bug」" + "DOTA_Tooltip_ability_item_0049_Description" "Murasa Minamitsu is the spirit of a young drowning victim who afterwards became a notorious threat due to her power to sink ships. \nShe is currently the captain of the Palanquin Ship, searching for the fragments of the Flying Storage. \nShe meets the heroine as she is completing the preparations to travel to Makai. \n\n[★]Harbor Sign 「Eternally Anchored Phantom Ship」\n[★]Captain「spinach」\n[★★★★]Drowning Sign 「Sinkable Vortex」\n[★★★★★]Harbor Sign 「Phantom Ship's Port」" + "sanae" "Kochiya Sanae" + "kanako" "Yasaka Kanako" + "suwako" "Moriya Suwako" + "minamitsu" "Murasa Minamitsu" + "nue" "Houjuu Nue" + "kanako_gojou" "Onbashira" + "DOTA_Tooltip_ability_thtd_momiji_01" "White wolf「Tengu Guardian」」" + "DOTA_Tooltip_ability_thtd_momiji_01_Description" "Summon four white wolf to automatically attack the surrounding units,White Wolf Doesn't Leave momiji to Walk Over 600 Yards.\n\nRelative to star level]white wolf attack:POWER POINT*STAR LEVEL*1" + "DOTA_Tooltip_ability_ability_common_star_up_speed_Description" "Increase the growth rate of the unit.\n\nThis skill can be upgraded through card cultivation.\n\n[Growth rate increased]:10%%/20%%/30%%/40%%" + "DOTA_Tooltip_ability_ability_common_star_up_speed" "Special Skill - Growth rate increased" + "DOTA_Tooltip_ability_ability_common_star_up_speed_speed_tooltips" "Growth rate increased:" + "DOTA_Tooltip_ability_ability_touhoutd_ex_up" "Awakening" + "DOTA_Tooltip_ability_ability_touhoutd_ex_up_Description" "Can stimulate the hidden power of some units" + "DOTA_Tooltip_ability_item_0069" "[R]Toramaru Shou" + "DOTA_Tooltip_ability_item_0080" "[SSR]Shinki" + "DOTA_Tooltip_ability_item_0088" "[R]Aki Shizuha" + "sizuha" "Aki Shizuha" + "toramaru" "Toramaru Shou" + "shinki" "Shinki" + "DOTA_Tooltip_ability_thtd_sizuha_01" "Autumn SignFall in Blast」" + "DOTA_Tooltip_ability_thtd_sizuha_01_Description" "Shizuha Aalthough it is impossible to improve the star in a normal way,but it can grow through time.\n\nEvery(216/432/720/1008)seconds will raise one star。" + "DOTA_Tooltip_ability_thtd_sizuha_02" "Wilted Path「Lost Windrow」" + "DOTA_Tooltip_ability_thtd_sizuha_02_Description" "Shizuha can through reduce your own(1)star raise target (1)star,the star rating of the promotion goal cannot exceed Shizuha own star rating." + "DOTA_Tooltip_ability_thtd_toramaru_01" "Treasure Sign 「Dazzling Gold」" + "DOTA_Tooltip_ability_thtd_toramaru_01_Description" "Toramaru Shou inflicts damage on one unit and gains money,And at the end of each turn,Toramaru Shou will cause harm 1%%Tturn into money.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*1\n[Relative to star level]Harvest quantity:12/44/108/216/852" + "DOTA_Tooltip_ability_thtd_suwako_02" "Scourge God 「Mishaguchi-sama」" + "DOTA_Tooltip_ability_thtd_suwako_02_Description" "Suwako create one Mishaguchi at the target location,when the unit through Mishaguchi will chained for 1 second.\n\nUnits are not subject to two binding effects,Leave the Mishaguchi will refresh.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*2.5 /per second\n\n[Special Effects - Beliefs]\n\nimprove(1+Beliefs value/500)multiple damage." + "change_to_patchouli_agni_shine" "Switch to「Agni Shine」" + "change_to_patchouli_bury_in_lake" "Switch to「Bury In Lake」" + "change_to_patchouli_mercury_poison" "Switch to「Mercury poison」" + "DOTA_Tooltip_ability_thtd_suwako_03" "「Hellish Heat Geyser」" + "DOTA_Tooltip_ability_thtd_suwako_03_Description" "Suwako use Geyser to bounce all units,Bounce it to a random area within 200 yards and cause damage when landing.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*5.0" + "DOTA_Tooltip_ability_thtd_minamitsu_01" "Harbor Sign 「Eternally Anchored Phantom Ship」」" + "DOTA_Tooltip_ability_thtd_kanako_04" "「Mountain of Faith」" + "DOTA_Tooltip_ability_thtd_kanako_04_Description" "Kanako create a Suwa Foughten Field,All units entering and leaving the battlefield are subject to an injury,Units in the battlefield will continue to be harmed.\n\n[Relative to star level]entering/leaving damage:POWER POINT*STAR LEVEL*8\n[Relative to star level]Continuous damage:POWER POINT*STAR LEVEL*0.25 /per second\n\n[Special Effects - Beliefs]\n\nimprove(1+Belief value/1000)multiple damage." + "DOTA_Tooltip_modifier_thdots_kanako_04_buff" "「Mountain of Faith」" + "DOTA_Tooltip_modifier_thdots_kanako_04_buff_Description" "Suwa Foughten Field." + "DOTA_Tooltip_ability_thtd_sanae_04" "Divine Virtue 「Bumper Crop Rice Shower」" + "DOTA_Tooltip_ability_thtd_sanae_04_Description" "Sanae inspires all special effects for units that gain belief.\n\n[COOPERATION PROMOTION - Yasaka Kanako,Moriya Suwako]\n\nTurn on this skill.\n\nMake Sanae,Kanako and Suwako both can gain belief by killing units." + "DOTA_Tooltip_ability_thtd_toramaru_02" "Buddhist Art 「Most Valuable Vajra」" + "DOTA_Tooltip_ability_thtd_toramaru_02_Description" "Toramaru Shou Gather the power of money point,Make huge damage to single target.\n\nEnter Endless mode. This skill will have no cooldown,Increases damage to 4x.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*10" + "DOTA_Tooltip_ability_thtd_toramaru_03_Description" "Toramaru Shou Gather the power of money point,Make huge damage to all targets on the inner ring.\n\nEnter Endless mode. This skill will have no cooldown,Increases damage to 4x.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*5" + "DOTA_Tooltip_ability_thtd_toramaru_03" "Buddha's Light 「Vajra of Perfect Buddhism」" + "DOTA_Tooltip_ability_thtd_shinki_01" "「Makai gate」" + "DOTA_Tooltip_ability_thtd_shinki_01_Description" "At the end of each round,Randomly Summon X shikigami card(The shikigami card maybe not be in your card pool)And the consumption of this type of shikigami card will not return to the card pool(X=star level)\n1X:100%%Summon 1 N card\n2X:100%% 2 N cards\n3X:80%%Summon N card,20%%Summon R card,A total of 3\n4X:80%%Summon R cards,20%%Summon SR cards,5%%Summon SSR cards,A total of 1. 80%%Summon N card,20%%Summon R cards,A total of 3.\n5X:80%Summon R cards,20%%Summon SR cards,5%%Summon SSR,A total of 5." + "DOTA_Tooltip_ability_thtd_rumia_03" "「Dark Mastery」" + "DOTA_Tooltip_ability_thtd_rumia_03_Description" "Rumia attack have 10%% probability outstretched Dark Claws to70%%HP unit,this unit will be directly spiked." "DOTA_Tooltip_modifier_rumia_03_pause" "「Dark Mastery」" + "DOTA_Tooltip_modifier_rumia_03_pause" "" + "DOTA_Tooltip_ability_thtd_rumia_04" "「A story that has been forgotten by fantasy」" + "DOTA_Tooltip_ability_thtd_rumia_04_Description" "Rumia each attack creates a dark and damage to the target area.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL/3 /per Danmaku\n\n[COOPERATION PROMOTION - Hakurei Reimu]\n\nimprove50%%damage.。" + "DOTA_Tooltip_modifier_thtd_ss_faith" "Belief value" + "DOTA_Tooltip_ability_thtd_shinki_02" "「Enze earth」" + "DOTA_Tooltip_ability_thtd_shinki_02_Description" "When per unit upgrade around 2000 yards ,Then the unit gets(Shinki star level*1)extra power points." "DOTA_Tooltip_modifier_shinki_02_power_up_bonus_buff" "「Enze earth」" + "DOTA_Tooltip_modifier_shinki_02_power_up_bonus_buff" "" + "DOTA_Tooltip_ability_thtd_minamitsu_04" "Harbor Sign 「Phantom Ship's Port」」" + "DOTA_Tooltip_ability_thtd_minamitsu_03" "Drowning Sign 「Sinkable Vortex」" + "DOTA_Tooltip_ability_thtd_minamitsu_03_Description" "Minamitsu release a vortex to the target area,Involved in the surrounding unit and caused damage.Units in the whirlpool will be rolled out of the waters.(Each unit is rolled up at most once)\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*2.5 /per second" + "DOTA_Tooltip_ability_thtd_minamitsu_01_Description" "Minamitsu release a ghost ship in the opposite direction of the target,Where the ghost ship passes, water will be generated,Units in the waters will be slowed down." + "DOTA_Tooltip_ability_thtd_minamitsu_01_move_slow" "movement slow:" + "DOTA_Tooltip_modifier_minamitsu_01_slow_buff" "Harbor Sign 「Eternally Anchored Phantom Ship」" + "DOTA_Tooltip_modifier_minamitsu_01_slow_buff_Description" "Affected by Minamitsu,the unit was decelerated." + "DOTA_Tooltip_ability_thtd_minamitsu_04_Description" "Minamitsu from upstream waters summon a ghost ship,Crash into the waters downstream,enemy unit will be hurt.\n\nEveryone in the team「Undefined Fantastic Object」shikigami,Each character is additionally boosted by this skill 50%%damage.\n\n[Relative to star level]DAMAGE:POWER POINT*STAR LEVEL*10 /per impact" + "DOTA_Tooltip_modifier_shinki_02_power_up_bonus_buff_Description" "Affected by Shinki,the unit's extra power point has increased." + "DOTA_Tooltip_ability_item_0080_Description" "Shinki is the creator of Makai.Shinki has light-blue eyes with white hair and wears red robes. \nShe's able to summon six white wings, which can turn purple with red markings. " + "DOTA_Tooltip_ability_item_0069_Description" "Toramaru Shou is a disciple of the god Bishamonten.\nAlong with Minamitsu Murasa and the other youkai aboard the Palanquin Ship, she seeks to revive Byakuren Hijiri after she had been sealed away in Makai by humans.\n\n[★]Treasure Sign 「Dazzling Gold」\n[★★★]Buddhist Art 「Most Valuable Vajra」」\n[★★★★★]Buddha's Light 「Vajra of Perfect Buddhism」" "DOTA_Tooltip_ability_item_0088_Description" "Aki Shizuha is the goddess of Autumn, the old sister of Minoriko Aki.\nShe rules over Gensokyo’s Autumn together with Minoriko Aki. Although not a great combatant, Aki Shizuha will punish those disrespectful of Autumn.\nShe thinks Maples are the most beautiful in Autumn, always indulges in herself's sueriority when she gives her sister to look beautiful maples.\nBut she also becomes sorrow when Winter comes.\n\n[★]Autumn Sign「Fall in Blast」\n[★★]Wilted Path「Lost Windrow」" + "DOTA_Tooltip_ability_item_0088_Description" "" + "DOTA_Tooltip_ability_thtd_byakuren_03" "" + "DOTA_Tooltip_ability_thtd_byakuren_01" "Good Omen「Nirvana's Cloudy Way in Purple」I" + "DOTA_Tooltip_ability_thtd_byakuren_01_Description" "-0.1 Attack Interval,decrease spell damage.\nAttack Interval cannot be smaller than 0.2s.\nWhen Attack Interval is greater than 1.0s, this spell deals Magic Damage.\nWhen Attack Interval is equal to 1.0s, deals Pure Damage.\nWhen Attack Interval Is less than 1.0s, deals Physical Damage.\n\nEach attack will damage the target and all surrounding units.\n\n[Damage Multiplier]Damage Multiplier: Power Point* Star * (1+ 0.1*Number of believers) " + "DOTA_Tooltip_ability_thtd_byakuren_02" "Good Omen「Nirvana's Cloudy Way in Purple」II" + "DOTA_Tooltip_ability_thtd_byakuren_02_Description" "+0.1 Attack Interval,decrease spell damage.\nAttack Interval cannot be smaller than 0.2s.\nWhen Attack Interval is greater than 1.0s, this spell deals Magic Damage.\nWhen Attack Interval is equal to 1.0s, deals Pure Damage.\nWhen Attack Interval Is less than 1.0s, deals Physical Damage.\n\nEach attack will damage the target and all surrounding units.\n\n[Damage Multiplier]Damage Multiplier: Power Point* Star * (1+ 0.1*Number of believers)" + "DOTA_Tooltip_ability_thtd_byakuren_03_Description" "With any other 'Seirensen' Unit, Byakuren will preach them into believers,increasing Religious Point over time. \nWhen Religious point reaches 6000, the unit turns into a Believer.\nBelievers can accelerate the preaching process,\nBelievers gain additional abilities and enhences Byakuren’s Damage\n\nNazrin:In Endless Mode, attacks deals additional damage to target and surrounding units. Damage= Rank *0.2* Current Gold. \nToramaru Shou:Spell gold cost reduced by 50%.\nTatara Kogasa: [Karakasa Surprising]reduces 50%% movement speed and deals more damage.\nHoujuu Nue: Instantly kill units damaged by her abilities that are under 10% health.\nMurasa Minamitsu: 'Phantom Ship's Port' 's cooldown to 15s." + "DOTA_Tooltip_modifier_byakuren_03_aura" "Yugyou Hijiri" + "DOTA_Tooltip_modifier_byakuren_03_buff" "Yugyou Hijiri" + "DOTA_Tooltip_modifier_byakuren_03_aura_Description" "Byakuren is preaching." + "DOTA_Tooltip_modifier_byakuren_03_buff_Description" "This unit is a Believer of Byakuren." + "DOTA_Tooltip_ability_thtd_byakuren_04" "Superhuman[Byakuren Hijiri]/Heaven Sign[Brilliance of Mahavairocana]/Great Magic[Devil's Recitation]" + "DOTA_Tooltip_ability_thtd_byakuren_04_Description" "When Byakuren’s attack interval is <1.0s, uses uperhuman[Byakuren Hijiri].\nEach attack has a 10% chance to increase Power Point after channeling, increasing attack speed to maximum. \n[Damage Multiplie]Power Point Multiplier: Power Point * Believer *0.2.\n\nWhen Byakuren’s attack interval is 1.0s, uses Heaven Sign [Brilliance of Mahavairocana].\nEvery (6/ (1+believer*0.2)) attack will also damage surrounding units.\n\nWhen Byakuren’s attack interval is >1.0s, uses Great Magic [Devil's Recitation].\nIncrease Magic Penetration by 50, each attack releases 4 laser that deals damage to a random surrounding units.\n[Damage Multiplier] Power Point Multiplier: Power Point * Number of Believer*6*(1+ Number of Believer*0.1)" + "DOTA_Tooltip_modifier_byakuren_04_physical_buff" "superhuman [Byakuren Hijiri]" + "DOTA_Tooltip_modifier_byakuren_04_physical_buff_Description" "Byakuren uses magic to vastly enhance her strength." + "DOTA_Tooltip_modifier_byakuren_04_pose_Description" "Byakuren’s energy is charging." + "DOTA_Tooltip_modifier_byakuren_04_pose" "superhuman [Byakuren Hijiri]" + "DOTA_Tooltip_modifier_byakuren_04_magic_buff" "Great Magic[Devil's Recitation]" + "DOTA_Tooltip_modifier_byakuren_04_magic_buff_Description" "Byakuren channels magic to increase her magic penetration." + "DOTA_Tooltip_ability_thtd_byakuren_04_penetration" "Magic Penetration:" + "DOTA_Tooltip_ability_item_0051" "[SSR]Byakuren Hijiri" + "DOTA_Tooltip_ability_item_0051_Description" "After Myouren dies, Byakuren fears the mortality of life and seeks immortality.\nFailing to achieve immortality through the way of the Buddha, Byakuren turns to magic and sorcery. \nIn her contact wit youkai , she realizes that only the strong can survival. “Survival of the fittest” became her cornerstone. \nOn the one hand, she accepts to beat off youkaies, on the other hand, she helps youkaies, this is the 'balance' she thinks.\nAs mankind rejects her, Byakuren was banished to devil's world --- where Palanquin Ship sails towards.\n\n[★]Good Omen [Nirvana's Cloudy Way in Purple]I\n[★]Good Omen [Nirvana's Cloudy Way in Purple]II\n[★★★] [Yugyou Hijiri]\n[★★★★★]Superhuman [Byakuren Hijiri]/Heaven Sign [Brilliance of Mahavairocana]/Great Magic [Devil's Recitation]" + "byakuren" "Hijiri Byakuren" + "soga" "Soga no Tojiko" + "futo" "Mononobe no Futo" + "miko" "Toyosatomimi no Miko" + "DOTA_Tooltip_ability_thtd_soga_02" "Thunder Arrow [Gagouji's Tornado]" + "DOTA_Tooltip_ability_thtd_soga_01" "Vengeful Spirit [Iruka's Thunder]" + "DOTA_Tooltip_ability_thtd_soga_01_Description" "Deals damage to enemies in a straight line, and deals 1s stun.\n\n After releasing, a ball lightning will be created in the track, next time triggering this skill will create ball lightning again in the track.\n\n[Damage Multiplier]Damage:POWER POINT * STAR LEVEL" + "DOTA_Tooltip_ability_thtd_soga_02_Description" "Deals 1 time of damage to units in target areas.\n\nAfter releasing, a ball lightning will be created in the track, next time triggering this skill will create ball lightning again in the track.\n\n[Damage Multiplier]Damage: POWER POINT * STAR LEVEL*4" + "DOTA_Tooltip_ability_thtd_soga_03" "Thunder Arrow [Gagouji's Tornado]" + "DOTA_Tooltip_ability_thtd_soga_03_Description" "After a short-time delay, deals a huge damage to units in target areas.\n\nAfter releasing, a ball lightning will be created in the track,next time triggering this skill will create ball lightning again in the track.\n\n[Damage Multiplier]Damage: POWER POINT * Star Level * 10\n\n[COOPERATION PROMOTION - Mononobe no Futo]\n\n+20%% Magic Damage to units are hitted, during 10s." + "DOTA_Tooltip_ability_thtd_futo_01" "Throwing Dishes [Mononobe's Eighty Sake Cups]" + "DOTA_Tooltip_ability_thtd_futo_01_Description" "Each attack will randomly change a dish, each dish deals different effect.\nGreen Deals 1 time of (POWER POINT * Star Level) damage to all units behind the target.\nOrange Throwes dishes to all surrounding units and deals (POWER POINT * Star Level) damage.\nGreen Inflicting poison to units in target areas and decreasing HP over time.\nRed makes a flame burst to deal (POWER POINT * Star Level * 4) damage to enemies in the area.\nYellow Deals 0.5s stun to enemies in the area.\nBlue Deals critical strike( x 32) to enemies in ther area(this critical strike damage is MAGIC DAMAGE.)" + "DOTA_Tooltip_ability_thtd_futo_02" "Saint Girl [Sun Goddess's Sacrifice]" + "DOTA_Tooltip_ability_thtd_futo_02_Description" "Each time kill unit, deals self 10%% more magic damage.\n\nAt most overlay 10 times, during 10s.\n\n[COOPERATION PROMOTION - Soga no Tojiko]\n\nOverlay times increase from 10 to 15." + "DOTA_Tooltip_ability_thtd_futo_03" "Blaze Sign [Sakuraiji in Flames]" + "DOTA_Tooltip_ability_thtd_futo_03_Description" "Sets big fire to the area, deals damage to enemies in the area over time.\n\n[Damage Multiplier]Damage:POWER POINT * Star Level * 2.5 /Per-sec" "DOTA_Tooltip_ability_item_0052" "[SSR]Toyosatomimi no Miko" + "DOTA_Tooltip_ability_item_0052" "" + "DOTA_Tooltip_ability_item_0094" "[SR]Soga no Tojiko" + "DOTA_Tooltip_ability_item_0095" "[SR]Mononobe no Futo" + "extra_bonus_minoriko_limit" "Minoriko's Gift: Aki Minoriko's exchange time refreshes." + "extra_bonus_nazrin" "Nazrin's Gift: Get 3500 gold." + "extra_bonus_lily" "Lily White's Gift: Promote all Shikigamis'level to Max." + "extra_bosses_minoriko" "Boss Mission: Aki Minoriko: Each 10s regen 30% HP." + "extra_bosses_keine" "Boss Mission: Kamishirasawa Keine: When HP < 70%, record current HP and recover after 5s." + "extra_bosses_aya" "Boss Mission: Shameimaru Aya: Immune most of movement speed decreasing." + "extra_bosses_kisume" "Boss Mission: Kisume: Reduce self 2000 damage." + "extra_bosses_alice" "Boss Mission: Alice: After she died, she will split into 3 ningyous, each ningyou has 30% HP, food spawns will be occupied when ningyous enter the circle." + "extra_bosses_kaguya" "Boss Mission: Houraisan Kaguya: Resurrection" + "extra_bosses_yuugi" "Boss Mission: Hoshiguma Yuugi: Have double HP" + "extra_bosses_mokou" "Boss Mission: Fujiwara no mokou: IMMUNE ITEM'S CRITICAL STRIKE effect." + "extra_bosses_hina" "Boss Mission: giyama Hina: When she gets hurt, if damage > (the source of damage * 4 * Star Level * POWER POINT), this damage will decrease a half." + "extra_bosses_marisa" "Boss Mission: Kirisame Marisa: Each 3s she will rush 0.3s." + "extra_bosses_rumia" "Boss Mission: Rumia: Each 3s will have 1s Invincibility." + "DOTA_Tooltip_ability_thtd_miko_04" "[Newborn Divine Spirit]" + "DOTA_Tooltip_ability_thtd_miko_02" "Hermit Sign [Emperor of the Land of the Rising Sun]" + "DOTA_Tooltip_ability_thtd_miko_03" "Honor [Colors of Twelve Levels]" + "DOTA_Tooltip_ability_thtd_miko_01" "[Cipangu the Golden Sword]" + "DOTA_Tooltip_ability_thtd_miko_01_Description" "Miko releases 3 golden swords to target direction, units hit by golden swords will get damage, the damage will attach Miko (POWER POINT * 1)'s' damage.\n\n[Damage Multiplier]Damage: POWER POINT * Star Level * 4" + "DOTA_Tooltip_modifier_miko_01_pose" "[Cipangu the Golden Sword]" + "DOTA_Tooltip_modifier_miko_01_debuff" "[Cipangu the Golden Sword]" + "DOTA_Tooltip_modifier_miko_01_debuff_Description" "This unit is hitted by golden swords." + "DOTA_Tooltip_ability_thtd_miko_02_Description" "Each time there is 1 'Divine Spirit Mausoleum' unit, it will be 'Listen' by Miko\nEach time 'Listen a unit, Religious Point will increase constantly.'\nWhen Religious Points reach 6000, Miko can do 'Teach' to every 'Divine Spirit Mausoleum' unit.\nUnits success to be 'Teach' will get extra ability.\n\nSoga no Tojiko: [Iruka's Thunder] Cooldown time reduces to 4s, [Gagouji's Tornado] Cooldown time reduces to 10s.\nMononobe no Futo: [Sakuraiji in Flames]Deals 25%% more damage.\nMiyako Yoshika: Attack attaches an extra [poison] buff." + "DOTA_Tooltip_modifier_miko_02_aura" "Hermit Sign [Emperor of the Land of the Rising Sun]" + "DOTA_Tooltip_modifier_miko_02_buff" "Hermit Sign [Emperor of the Land of the Rising Sun]" + "DOTA_Tooltip_modifier_miko_02_buff_Description" "This unit has been 'Taught'." + "DOTA_Tooltip_modifier_miko_02_aura_Description" "Miko is 'Listening'." + "DOTA_Tooltip_ability_thtd_miko_03_Description" "Each 0.3s Miko will release a colorful light ball to attack surrounding random targets.\n\nEach 'Be Taught' unit there will cause release 1 extra light ball.\n\n[Damage Multiplier]Damage: POWER POINT * Star Level" + "DOTA_Tooltip_ability_thtd_miko_04_Description" "Miko asks all 'Be Taught' units there to release 'Meteor Shower' to inner enemies with itself together.\n\n[Damage Multiplier]Damage: POWER POINT * Star Level * 2.5/Per Meteor Shower." + "DOTA_Tooltip_modifier_thdots_miko04_think_interval" "[Newborn Divine Spirit]" + "DOTA_Tooltip_modifier_miko_04_pose" "[Newborn Divine Spirit]" + "DOTA_Tooltip_ability_thtd_yoshika_01" "poison Nail[Undead Murderer]" + "DOTA_Tooltip_ability_thtd_yoshika_01_Description" "Miyako's every attack will attach a [poison] buff to units in target area, and decrease their movement speed, during 5s.\n\n[Damage Multiplier]Damage: POWER POINT * Star Level *1/Per-Sec." + "DOTA_Tooltip_ability_thtd_yoshika_02_Description" "Depends on the number of [poison] buff,Miyako deals damage to units are attaching [poison] in inner circle.\n(This [poison] includes other units' poisoned Spell cards.)\n\n[Damage Multiplier]Damage:POWER POINT * Star Level * 0.5 * Num of Buff" + "DOTA_Tooltip_ability_thtd_yoshika_02" "Poison Nail [Poison Murder]" + "DOTA_Tooltip_modifier_yoshika_01_slow" "Poison Nail [Undead Murderer]" + "DOTA_Tooltip_modifier_yoshika_01_slow_Description" "This unit affects by [Poison], movement speed decreases." + "DOTA_Tooltip_ability_item_0097" "[R]Yoshika Miyako" + "DOTA_Tooltip_ability_item_0052_Description" "The saint Wakes up from sleeping eternally, when she was born she has got unbelievable gift, has beyond the mankind a lot.\nShe can undersatnd 10 people's spoken at the same time and give correct answers. It is said when she was a child, she used phus to make Four King's Shapes and built Four King Temple.On another hand, although there are some stories said she was born in the barn, they seems like jokes.\nNow she has become an immortal.But she still has not broken off with mankind's world, sometimes she even meddles in mankind's stuff. It perhaps is a habit was left due to be an Emperor before.\nHer character is so kind and humorous. However if you are meet face by face, you would make fault easily, even felt you have no secret now, so people mostly revered her.\n\n[★][Cipangu the Golden Sword]\n[★]Hermit Sign[Emperor of the Land of the Rising Sun]\n[★★★]Honor[Colors of Twelve Levels]\n[★★★★★][Newborn Divine Spirit]" + "DOTA_Tooltip_ability_item_0094_Description" "Ancients' spirit. Serving Toyosatomimi no Miko with Mononobe no Futo together.\nshe becomes a spirit due to be cheated by Futo, but she is not mind now.\nShe has the ability to fall the thunder.\n\n[★]Vengeful Spirit[Iruka's Thunder]\n[★★★]Thunder Arrow[Gagouji's Cyclone]\n[★★★★]Thunder Arrow[Gagouji's Tornado]" + "DOTA_Tooltip_ability_item_0095_Description" "The ancient keeps sleeping by cursing self in a long time.\nShe trys reaching immortal by using death to divide into Metempsychosis wheel.\nBut in fact it is not that simple, finally she was still found out by Death god.\nComparing with Toyosatomimi no Miko who lives until now, she seems not really like Gensokyo, perhaps it is because she is not suitable.\nThis can be found out some from her past.\nWhen she was alive, she didn't accept Buddhism preached from the mainland, oppositely believed Tao near the ancient Shintoism.\nHence Her magic and style of using magic are not really old. It can say it is her personal style.\n\n[★]Throwing Dishes[Mononobe's Eighty Sake Cups]\n[★★★]Saint Girl[Sun Goddess's Sacrifice]\n[★★★★]Blaze Sign[Sakuraiji in Flames]" + "DOTA_Tooltip_ability_item_0097_Description" "The corpses that are revived and controlled Kaku Seiga.\nThey are never feeling pain and exhausted,so they can break out huge power,\nand they are Loyal but a little bit stupid.\n\n[★]Poison Nail[Poison Murder]\n[★★★]Poison Nail[Undead Murderer]" + "yoshika" "Miyako Yoshika" + "DOTA_Tooltip_ability_thtd_seiga_01" "Evil Sign[Yang Xiaogui]" + "DOTA_Tooltip_ability_thtd_seiga_01_Description" "Each unit dies around Seiga have chance to produce a [zombie].\n\n[★]1%% probability to produce 1 [★]zombie.\n[★★]2%% probability to produce 1 [★]zombie,\n[★★★]2%% probability to produce 1 [★]zombie,1%% probability to produce 1 [★★] zombie.\n[★★★★]2%% probability to produce a [★★] zombie,1%% probability to produce 1 [★★★] zombie.\n[★★★★★]3%% probability to produce 1 [★★★] zombie, 1%% probability to produce 1 [★★★★] zombie." + "DOTA_Tooltip_ability_thtd_seiga_02_Description" "increase a units' attack speed, during 10s." + "DOTA_Tooltip_ability_thtd_seiga_02" "Demonify[Zouhuo Rumo]" + "DOTA_Tooltip_ability_thtd_seiga_02_attack_speed" "Attack Speed Increase:" + "DOTA_Tooltip_modifier_seiga_02_attack_speed_buff" "Demonify[Zouhuo Rumo]" + "DOTA_Tooltip_modifier_seiga_02_attack_speed_buff_Description" "Affecting by Kaku Seiga, this unit's attack speed increases." + "DOTA_Tooltip_ability_thtd_seiga_03" "Necromancy[Corpse Tongji]" + "DOTA_Tooltip_ability_thtd_seiga_03_Description" "Each unit dies near her, other units around the dead unit will be hurt by amount of [Poison] buffs in dead units near her.\n\n[Damage Multiplier]Damage:Power Point*Star Level*0.5*amount of buffs" + "DOTA_Tooltip_ability_item_0096" "[SR]Kaku Seiga" + "seiga" "Kaku Seiga" + "DOTA_Tooltip_ability_item_1011" "Zombie Lv1" + "DOTA_Tooltip_ability_item_1011_Description" "Can replace any 1 [★] Shikigami." + "DOTA_Tooltip_ability_item_1012" "Zombie Lv2" + "DOTA_Tooltip_ability_item_1012_Description" "Can replace any 1 [★★] Shikigami." + "DOTA_Tooltip_ability_item_1013" "Zombie Lv3" + "DOTA_Tooltip_ability_item_1013_Description" "Can replace any 1 [★★★] Shikigami." + "DOTA_Tooltip_ability_item_1014" "Zombie Lv4" + "DOTA_Tooltip_ability_item_1014_Description" "Can replace any 1 [★★★★] Shikigami." + "change_to_keine_04_jade" "Switch to [Three Sacred Treasures] - Orb" + "change_to_keine_04_mirror" "Switch to [Three Sacred Treasures] - Mirror" + "change_to_keine_04_sword" "Switch to [Three Sacred Treasures] - Sword" + "change_to_keine_04_shrine" "Switch to [Three Sacred Treasures] - Country" + "change_to_keine_shirasawa" "" + "change_to_keine_humen" "" + "keine" "Kamishirasawa Keine" + "change_to_close_ai" "" + "change_to_open_ai" "" + "medicine" "Medicine Melancholy" + "luna" "Luna Child" + "sunny" "Sunny Milk" + "star" "Star Sapphire" + "DOTA_Tooltip_ability_thtd_keine_01" "Spiritual Birth [First Pyramid]" + "DOTA_Tooltip_ability_thtd_keine_01_Description" "Human Form: Increase a unit's attack damage, during 10s.\n\n[Damage Multiplier] Attack Increase:100/200/400/800/2000\n\nKeine Form: Ambition Sign [General Headquarters Crisis]\n\nAttack has 25%% Chance to stun units in target area 1s, and cause extra damage.\n\n[Damage Multiplier] Damage: Power Point*Star Level*1.0" + "DOTA_Tooltip_ability_thtd_keine_02" "Switch [Human]/[Keine] Form" + "DOTA_Tooltip_ability_thtd_keine_02_Description" "Switch to Human or Keine Form." + "DOTA_Tooltip_ability_thtd_keine_03_Description" "Human Form: Each attack has 20%% chance to devour target units [History],make Keine record this unit's current position and HP.\n\nKeine Form:Each attack has 20%% chance to create target units' [History], this unit will be back to the position and HP in devoured [History] recording.\n\nActive Use:\nHuman Form: Devour all units' [History] in target area.\n\nKeine Form: Create all units' [History] in target area.\n\n[Cooperation Promotion - Fujiwara no mokou]\n\nChance increases to 50%%." + "DOTA_Tooltip_ability_thtd_keine_03" "Pseudo-History [The Legend of Gensokyo]" + "DOTA_Tooltip_thtd_keine_03_debuff" "Pseudo-History [The Legend of Gensokyo]" + "DOTA_Tooltip_thtd_keine_03_debuff_Description" "This unit is devoured [History]." + "DOTA_Tooltip_ability_thtd_keine_04" "Land Sign [Three Sacred Treasures]" + "DOTA_Tooltip_ability_thtd_keine_04_Description" "When Keine creates [History], [History]'s effect can be changed by current treasure. \n\nLand Sign [Three Sacred Treasures - Sword]: Shoot a sword to target, cause Power Point*Star Level*5 damage to the target.\n\n[Three Sacred Treasures] - Orb: Cause damage bases of distances between current position and creating [History].\n\n[Three Sacred Treasures] - Mirror: make target units' HP become (Current HP - HP when Devouring [History ])*0.5." + "DOTA_Tooltip_ability_thtd_medicine_01" "Poison Sign[Poison Breath]" + "DOTA_Tooltip_ability_thtd_medicine_01_Description" "Medicine attacks targets will cause targets enter [Lost] Form and decrease movement speed, during 1.0s, then cause damage over time to them.\n\n[Damage Multiplier]Damage: Power Point*Star Level*1.0/per-sec" + "DOTA_Tooltip_ability_thtd_medicine_01_move_slow" "Movement speed Decrease Effect:" + "DOTA_Tooltip_modifier_medicine_01_slow" "Poison Sign[Poison Breath]" + "DOTA_Tooltip_modifier_medicine_01_slow_Description" "This unit's movement speed is decreased, because Medicine's posion attack." + "DOTA_Tooltip_ability_thtd_medicine_02" "Fog Sign[Gassing Garden]" + "DOTA_Tooltip_ability_thtd_medicine_02_Description" "Release gas to target area, attract nearby units, and cause damage over time.\n\n[Damage Multiplier]Damage:Power Point*Star Level*4.0/per-sec" + "DOTA_Tooltip_ability_thtd_star_01" "Shooting Star[Petit Comet]" + "DOTA_Tooltip_ability_thtd_star_02" "Star Sign[Starlight Rain]" + "DOTA_Tooltip_ability_thtd_star_01_Description" "Star releases shooting star in target position, cause damage to target and decrease the movement speed.\n\n[Damage Multiplier]Damage:Power Point*Star Level*1.0\n\n[Cooperation Promotion - Sunny Milk, Luna Child]\n\nUnits in fairies' area will gain 1 shooting star attack." + "DOTA_Tooltip_ability_thtd_star_01_move_slow" "Movement Speed Decrease effect:" + "DOTA_Tooltip_modifier_star_01_slow" "Shooting Star[Petit Comet]" + "DOTA_Tooltip_modifier_star_01_slow_Description" "This unit's movement speed is decreased because Star's influence." + "DOTA_Tooltip_ability_thtd_star_02_Description" "Release 20 times shooting star in target area, each time will increase 5%% damage.\n\n[Damage Multiplier] Damage:Power Point*Star Level*5\n\n[Cooperation Promotion - Sunny Milk, Luna Child]\n\nUnits in fairies' area will also get 1 time shooting star attack." + "DOTA_Tooltip_ability_thtd_sunny_01" "Rainbow Light[Prism Flash]" + "DOTA_Tooltip_ability_thtd_sunny_01_Description" "Shoot laser to target to make laser reflect to 2 units, each reflection increase 100%% damage.\n\n[Damage Multiplier] Damage: Power Point*Star Level*1.0\n\n[Cooperation Promotion - Star Sapphire, Luna Child]\n\nUnits in fairies' area will also gain 1 laser effect." + "DOTA_Tooltip_ability_thtd_sunny_02_Description" "Switch damage which units in target area gain to pure damage, and make units in the area gain 110%%/115%%/125%% pure damage.\n\n[Cooperation Promotion - Star Sapphire, Luna Child]\n\nUnits in fairies' area will also get same effect." + "DOTA_Tooltip_ability_thtd_sunny_02" "Light Sign[Yellow Deflection]" + "DOTA_Tooltip_ability_thtd_luna_02" "Light Sign[Full Moon Night]" + "DOTA_Tooltip_ability_thtd_luna_01" "Moonlight[Moon Stillness]" + "DOTA_Tooltip_ability_thtd_luna_01_Description" "Luna's each attack will summon a moonlight to target and 2 units around it, and cause damage.Damage to surrounding units will increase 100%%.\n\n[Cooperation Promotion]Damage:Power Point*Star Level*1.0\n\n[Cooperation Promotion - Sunny Milk, Star Sapphire]\n\nUnits in fairies' area will also gain a moonlight attack." + "DOTA_Tooltip_ability_thtd_luna_02_Description" "Shooting to target position, every time shoot a unit will increase self's Power Points.\n\n[Damage Multiplier]Damage: Power Point*Star Level*5.0\n[Damage Multiplier]Power Point Increase: 100/250/500 /per-unit\n\n[Cooperation Promotion - Sunny Milk, Star Sapphire]\n\nUnits in faries' area will also increase Luna's Power Points." + "DOTA_Tooltip_modifier_sunny_02_debuff" "Light Sign[Yellow Deflection]" + "DOTA_Tooltip_modifier_sunny_02_debuff_Description" "Skill damage this unit gains will be switched to Pure Damage." + "DOTA_Tooltip_ability_item_0092" "[R]Medicine Melancholy" + "DOTA_Tooltip_ability_item_0056" "[R]Star Sapphire" + "DOTA_Tooltip_ability_item_0057" "[R]Sunny Milk" + "DOTA_Tooltip_ability_item_0058" "[R]Luna Child" + "DOTA_Tooltip_ability_item_0061" "[SR]Kamishirasawa Keine" + "DOTA_Tooltip_ability_thtd_suika_01" "Ghastly Atmosphere[Dense Fog Labyrinth]/Oni Sign[Ooeyama Complete Massacre]" + "DOTA_Tooltip_ability_thtd_suika_01_Description" "Using her ability to manipulate density and sparsity, Suika splits herself into Tiny Suikas. The Tiny Suikas inherit the main body's attack damage and abilities, however, they deal less damage and have reduced range.\n\nOni Sign[Ooeyama Complete Massacre]\n\nSuika's attacks have a 25%% chance to deal damage to units around the target and slow them.\n\n[Star Level Correlation]Damage: POWER*Star Level*1.0" + "DOTA_Tooltip_ability_thtd_suika_01_move_slow" "Slow:" + "DOTA_Tooltip_modifier_suika_01_slow_debuff" "Oni Sign[Ooeyama Complete Massacre]" + "DOTA_Tooltip_modifier_suika_01_slow_debuff_Description" "Due to Suika's doing this unit's movement speed has been reduced." + "DOTA_Tooltip_ability_thtd_suika_02" "Oni God[Missing Purple Power]" + "DOTA_Tooltip_ability_thtd_suika_02_Description" "Using her ability to manipulate density and sparsity, Suika turns into GIANT SUIKA.\n\n GIANT SUIKA deals more damage and has increased range, however, she has a lower chance to proc [Ooeyama Complete Massacre]." + "DOTA_Tooltip_ability_thtd_suika_03" "Onibi[Super-High-Density Phosphor Calamity Technique]" + "DOTA_Tooltip_ability_thtd_suika_03_Description" "Suika throws a fireball at the targeted location, damaging all enemies within the impact area." + "DOTA_Tooltip_ability_thtd_suika_04" "Drunken Dream[Segaki Binding Technique]" + "DOTA_Tooltip_ability_thtd_suika_04_Description" "Suika uses her chain to pull a targeted unit, preventing her from moving away from Suika any more than 800 units while receiving damage over time. If the target tries to break free, she will receive double damage.\n\n[Star Level Correlation]Damage: POWER * Star Level * 1.0" + "DOTA_Tooltip_ability_thtd_yuugi_01" "Shackle Sign[Shackles A Criminal Can't Take Off]" + "DOTA_Tooltip_ability_thtd_yuugi_01_Description" "Yuugi stamps on the ground, dealing damage to all enemies within 1000 units around her. The more enemies around her, the higher the chance to deal increased damage.\n\n[Star Level Correlation]Damage: POWER * Star Level * (5-15)" + "DOTA_Tooltip_ability_thtd_yuugi_02" "Feat of Strength[Ooeyama Storm]" + "DOTA_Tooltip_ability_thtd_yuugi_02_Description" "Yuugi's attack have a 30%% chance to slam the ground around the target, dealing damage and knocking back all enemies within that area.\n\n[Star Level Correlation]Damage: POWER * Star Level * 2" + "DOTA_Tooltip_ability_thtd_yuugi_03" "Secret Technique of the Four Heavenly Kings[Three Step Kill]" + "DOTA_Tooltip_ability_thtd_yuugi_03_Description" "Yuugi stops any enemy movement in the targeted area for 2 seconds. If an enemy leaves the targeted area, she will receive a great amount of damage after taking three steps. \n\n[Star Level Correlation]Damage: POWER * Star Level * 20" + "DOTA_Tooltip_modifier_yuugi_03_pause_unit" "Secret Technique of the Four Heavenly Kings[Three Step Kill]" + "DOTA_Tooltip_modifier_yuugi_03_pause_unit_Description" "Omae wa mou shindeiru!" + "DOTA_Tooltip_modifier_yuugi_02_pause_unit" "Feat of Strength[Ooeyama Storm]" + "DOTA_Tooltip_modifier_yuugi_02_pause_unit_Description" "This unit has been knocked back by Yuugi." + "DOTA_Tooltip_ability_item_0054" "【SR】Hoshiguma Yuugi" + "DOTA_Tooltip_ability_item_0055" "【SR】Ibuki Suika" + "suika" "Ibuki Suika" + "yuugi" "Hoshiguma Yuugi" + "DOTA_Tooltip_ability_item_0073" "【SSR】Junko" + "DOTA_Tooltip_ability_item_0073_Lore" "This vengeance will be repeated forever." + "DOTA_Tooltip_ability_item_0073_Description" "Hou Yi's imperial concubine has strong hatred for Chang'e. The husband had killed his son, which was the first resentment, but the resentment had been purified. Pure fox purifies her hatred so that her identity is no longer important. Now anger and hatred are the only motive force that drives her to act, that is, where her heart exists." + "junko" "Junko" + "DOTA_Tooltip_ability_thtd_junko_01" "Shackle Sign「purification」" + "DOTA_Tooltip_ability_thtd_junko_01_Description" "Pure fox releases its pure power, so that the target has the same ability to purify itself. \n[Purified Damage] Skills directly cause the final damage according to the skill damage. They don't eat any other additions or subtractions, including the explosion and special effects of items, and ignore the enemy's damage reduction. Equipments only have basic attributes and energy to be useful." + "DOTA_Tooltip_ability_thtd_junko_02" "Shackle Sign「pure light」" + "DOTA_Tooltip_ability_thtd_junko_02_Description" "Pure fox transforms its resentment into an arrow of light, injure the target and add mental damage.\nDamage: energy point * star * 3. Mental injury: the highest superposition is to the 10 level." + "DOTA_Tooltip_ability_thtd_junko_03" "Shackle Sign「Kill the meaning」" + "DOTA_Tooltip_ability_thtd_junko_03_Description" "Pure fox transforms the killing around it into pure power, causing damage to the target, and adds additional effects according to the number of wound layers of the target.\nStar related injury: energy point * star * 5. Additional effects: The number of wound layers increasing the damage of this skill by 10% per layer; the number of wound layers is equal to 10 layers, stunning target for 2 second; and the effect of the wound will be removed." + "DOTA_Tooltip_ability_item_0074" "【SSR】Hecatia Lapislazuli" + "DOTA_Tooltip_ability_item_0074_Lore" "There is resentment against Chang'e because the husband of Chang'e is the one who shot down the sun (Apollo)." + "DOTA_Tooltip_ability_item_0074_Description" "The mysterious spirit of the moon, the earth and the outer boundary. She has the body in three worlds at the same time, and can freely come and go in different worlds. By the way, dreams are equivalent to different worlds." + "hecatia" "Hecatia Lapislazuli" + "DOTA_Tooltip_ability_thtd_hecatia_01" "earth" + "DOTA_Tooltip_ability_thtd_hecatia_01_Description" "Hcartiya releases the sphere representing the earth floating around, and the body transforms every second.\nThe ball hits the enemy to launch the following effects according to its own form. If the form is Earth, the first effect will be launched, otherwise the second effect will be launched.\n1. foul play: damage to target and wound for 1 second, damage: energy * star *2. Each enemy can only be hit in 2 seconds, range: 350.\n2. Rainfall in Hell: Each rainfall will damage the target, range: 500, damage: energy * STAR * 3." + "DOTA_Tooltip_ability_thtd_hecatia_02" "Moon" + "DOTA_Tooltip_ability_thtd_hecatia_02_Description" "Hcartiya releases the sphere that represents the moon floating around, and the body transforms every second.\n\nWhen the ball collides with the enemy, it launches the following effects according to its own form. If the form is the moon, it launches the first effect, otherwise the second effect.\n1. Apollo mirror: from the body to the moon, reflecting to the surrounding units, damage: energy * STAR * 4.5, range: 350.\n2. month frenzy impact: each hit the enemy will cause damage and repulse, damage: energy * star *4.5. Each enemy can only be hit in 2 seconds, range: 250" + "DOTA_Tooltip_ability_thtd_hecatia_03" "Alien border" + "DOTA_Tooltip_ability_thtd_hecatia_03_Description" "Hcartiya releases the sphere that represents the other side floating around, and the body transforms every second.\n\nThe ball hits the enemy to launch the following effects according to its own form. If the form is different, the first effect will be launched, otherwise the second effect will be launched.\n1. Dusk and dusk: leaving fog, causing sustained damage and attracting targets, damage: energy * star, activation range: 350, attraction range: 500, duration: 3 seconds.\n2. the non ideal barrage of Hell: Launch 12 barrage, damage: energy * star *3, range: 350." + "DOTA_Tooltip_ability_thtd_hecatia_04" "Three-in-one" + "DOTA_Tooltip_ability_thtd_hecatia_04_Description" "Hcartiya manipulated three spheres to launch the trinity of Rhapsody.\n\nOntology will constantly change shape. When the shape sphere hits the target release skill, it will produce a triangle. When it forms three triangles, it will link three triangles and use laser to scan the surrounding units.\nDamage: energy * star *5, lasts 5 seconds." + "DOTA_Tooltip_modifier_earthshock_debuff_datadriven" "shockwave" + "DOTA_Tooltip_modifier_earthshock_debuff_datadriven_Description" "Affected by the shock wave of the devil, the speed is reduced." + "DOTA_Tooltip_ability_thtd_shinki_04" "「Return of the devil」" + "DOTA_Tooltip_ability_thtd_shinki_04_Description" "Goddess summons the Devil King as the Lord of the Devil World, so that the great Devil King lost in time and space can return. The great Devil King's attack power is a star-rated energy of the Devil King.\nThe great devil has three skills:\nDevouring: Devouring an enemy every 30 seconds and growing up. Each 5%% increase in attack requires digestion before it can devour the next one. When the enemy is digested, it suffers pure damage with the same attack power per second. When the size grows to the extreme, it does not grow.\nStrike: The Devil's attack has a 50%% chance of stunning an enemy 300 yards around the target and causing 5 times the pure damage of a normal attack.\nWrath: The Great Devil gets angry and slams the ground, causing a wide range of shocks, hitting the affected enemy hard and slowing down by 60%%, causing pure damage in double attacks.\nAt the same time, there is only one big devil." + "DOTA_Tooltip_ability_item_0059" "【SR】Alice Margatroid" + "DOTA_Tooltip_ability_item_0059_Lore" "As a collector, he often meets magic, and the relationship between the two is incompatible with fire and water." + "DOTA_Tooltip_ability_item_0059_Description" "Alice Margaret Loyd is a magical manipulator who can manipulate dolls with magic and make them vivid and artistic. Alice is also a collector. He has a hobby of collecting magic books and other things." + "alice" "Alice Margatroid" + "DOTA_Tooltip_ability_thtd_alice_01" "Magic operation 「puppet ambush」" + "DOTA_Tooltip_ability_thtd_alice_01_Description" "Alice placed a doll in a fixed place. The doll remained in a latent state. When the target approached, the doll exploded, causing range damage and increasing subsequent damage to the target for 2 minutes.\n\nStar related injury: energy * star *5\nDamage increased: 3%% 6%% 9%% 12%% 18%%\nDuration: 3 seconds.\nDetonation range: 150, damage range: 300" + "DOTA_Tooltip_ability_thtd_alice_02" "Curse the 「Falanxi Doll」" + "DOTA_Tooltip_ability_thtd_alice_02_Description" "Alice calls on elaborate dolls to fight instead of herself, and observes the command in the rear." + "DOTA_Tooltip_ability_thtd_alice_03" "War symbol 「small military force」" + "DOTA_Tooltip_ability_thtd_alice_03_Description" "Alice placed the doll in front of her to protect herself closely, and sent a laser across the front, causing a lot of damage.\n[star correlation] damage: energy * star *7, times: 10" + "DOTA_Tooltip_modifier_alice_01_debuff" "Puppet ambush" + "DOTA_Tooltip_modifier_alice_01_debuff_Description" "Influenced by the explosion of the puppet soldiers, they were hurt." + "DOTA_Tooltip_modifier_alice_shanghainingyou_crit_chance" "strike a deadly blow" + "DOTA_Tooltip_modifier_alice_shanghainingyou_crit_chance_Description" "Standing near the Shanghai doll, the explosion increased." + "DOTA_Tooltip_modifier_alice_hourainingyou_buff" "Heavy blow" + "DOTA_Tooltip_modifier_alice_hourainingyou_buff_Description" "Standing near the Penglai dolls, there is a chance to cause a heavy blow." + + "kokoro" "秦心" + "DOTA_Tooltip_ability_item_0053" "【SR】秦心" + "DOTA_Tooltip_ability_item_0053_Lore" "猿乐之祖秦河胜使用的面具历经漫长的时间后化作的妖怪" + "DOTA_Tooltip_ability_item_0053_Description" "表情丰富的扑克脸,每个面具都代表固定的感情,戴上面具后感情就会变化,感情也会影响到在附近的人。" + "DOTA_Tooltip_ability_thtd_kokoro_01" "凭依「喜怒哀乐附体」" + "DOTA_Tooltip_ability_thtd_kokoro_01_Description" "秦心操纵感情的力量,将喜怒哀乐化成面具攻击目标,并降低目标基础护甲和持续造成伤害。\n【星级相关】伤害: 能量*星级*5 每秒\n【星级相关】护甲降低:10 20 30 40 60 (与水银之毒不叠加)" + "DOTA_Tooltip_ability_thtd_kokoro_02" "怒面「吼怒的妖狐面」" + "DOTA_Tooltip_ability_thtd_kokoro_02_Description" "戴上狐面,将面具化成灵气变成狐狸扑向目标并咬住目标,造成伤害并晕眩目标1.5秒。\n【星级相关】伤害: 能量*星级*5。" + "DOTA_Tooltip_ability_thtd_kokoro_03" "喜符「狂喜的火男面」" + "DOTA_Tooltip_ability_thtd_kokoro_03_Description" "戴上火男面具,从面具和心洋溢出来的喜悦的感情撒向周围,提升物理伤害。\n【星级相关】物理伤害提升: 30%%" + "DOTA_Tooltip_ability_thtd_kokoro_04" "特技「表情丰富的扑克脸」" + "DOTA_Tooltip_ability_thtd_kokoro_04_Description" "她能将感情车转轮换,但是自身却始终是面无表情。使用技能后心会释放「喜」「忧」「怒」三种感情,在这些感情有效的期间增强对应的技能。\n「喜」: 狂喜的火男面效果提高50%%。\n「忧」: 喜怒哀乐伤害提高50%%。\n「怒」: 吼怒的妖狐面冷却加快50%%。" + "DOTA_Tooltip_modifier_kokoro_01_debuff" "喜怒哀乐附体" + "DOTA_Tooltip_modifier_kokoro_01_debuff_Description" "造成持续伤害并降低护甲" + "DOTA_Tooltip_modifier_kokoro_03_buff" "狂喜的火男面" + "DOTA_Tooltip_modifier_kokoro_03_buff_Description" "物理伤害提高了" + "DOTA_Tooltip_modifier_kokoro_04_buff_1" "「忧」" + "DOTA_Tooltip_modifier_kokoro_04_buff_1_Description" "喜怒哀乐附体附加了减速" + "DOTA_Tooltip_modifier_kokoro_04_buff_2" "「怒」" + "DOTA_Tooltip_modifier_kokoro_04_buff_2_Description" "吼怒的妖狐面效果提高了" + "DOTA_Tooltip_modifier_kokoro_04_buff_3" "「喜」" + "DOTA_Tooltip_modifier_kokoro_04_buff_3_Description" "狂喜的火男面效果提高了" + + "hina" "键山雏" + "DOTA_Tooltip_ability_item_0091" "【R】键山雏" + "DOTA_Tooltip_ability_item_0091_Lore" "收集厄运,是因为厄运可以成为她的力量。厄运的负面能量本身是使她行动的原动力。疫病神虽然名字里有个神字,但却不追求信仰。她并非普通的神明,而是妖怪的一种。" + "DOTA_Tooltip_ability_item_0091_Description" "收集厄运的神明,但她本人却完全没有恶意,倒不如说她是个待人友好的神明,收集厄运的本意也只是为了不让厄运转移到人类身上。" + "DOTA_Tooltip_ability_thtd_hina_01" "创符「痛苦之流」" + "DOTA_Tooltip_ability_thtd_hina_01_Description" "降低周围单位的移速。\n【星级相关】移速减少:20/30/40/50/65%%" + "DOTA_Tooltip_ability_thtd_hina_01_move_slow" "移速降低:" + "DOTA_Tooltip_ability_thtd_hina_02" "厄符「厄运」" + "DOTA_Tooltip_ability_thtd_hina_02_Description" "对「痛苦之流」影响的单位施加厄运,每4秒造成伤害,目标在受到纯粹伤害时会附加额外伤害:当超过伤害来源的星级*能量*4时,附加星级*能量*4的伤害,低于时40%%概率伤害提高40%%。\n【星级相关】伤害: 能量*星级*4" + "DOTA_Tooltip_modifier_hina_01_slow_debuff" "创符「痛苦之流」" + "DOTA_Tooltip_modifier_hina_01_slow_debuff_Description" "该单位受到键山雏「痛苦之流」影响" + + "DOTA_Tooltip_modifier_touhoutd_extra_gold" "超过上限金钱" + "DOTA_Tooltip_modifier_touhoutd_extra_gold_Description" "超过上限金钱已记录,将在下次获取金钱时补入到当前金钱中,每层代表1000金钱。" + "DOTA_Tooltip_modifier_item_2011_stun_lock" "月兔粉碎巨刃" + "DOTA_Tooltip_modifier_item_2011_stun_lock_Description" "月兔粉碎巨刃晕眩效果处于冷却中" + "DOTA_Tooltip_modifier_touhoutd_luck" "幸运日" + "DOTA_Tooltip_modifier_touhoutd_luck_Description" "今天捡到四叶草,全身充满正能量!每层提高1%%的伤害输出!" + "DOTA_Tooltip_modifier_touhoutd_unluck" "特殊日" + "DOTA_Tooltip_modifier_touhoutd_unluck_Description" "今天日子特殊,这个...那个...,心情不佳!每层降低1%%的伤害输出!" + + "kagerou" "今泉影狼" + "DOTA_Tooltip_ability_item_0045" "【SR】今泉影狼" + "DOTA_Tooltip_ability_item_0045_Lore" "因为比较在意满月之夜的时候全身体毛会变多,所以平常都遮住皮肤,一个人静静的生活。" + "DOTA_Tooltip_ability_item_0045_Description" "她是在外面的世界已经绝种的日本狼的狼女。有着狼的特征,会在满月变成狼,毛发会变多,但是依旧能保持理智。\n因为她自己比较在意体毛变多这件事,平常都是遮住皮肤,独自生活在迷途竹林里。\n因为被万宝槌的魔力所影响,正当她变得凶暴之时就被灵梦等人狠狠的教训了一顿。如今又再度变得温顺了。\n【★】特质「奔狼之血」\n【★】爪符「刚猛利爪」\n【★】咆哮「陌生的咆哮」\n【★★★】变身「星形齿」" + "DOTA_Tooltip_ability_thtd_kagerou_01" "link_DOTA_Tooltip_ability_sven_great_cleave" + "DOTA_Tooltip_ability_thtd_kagerou_02" "link_DOTA_Tooltip_ability_lycan_howl" + "DOTA_Tooltip_ability_thtd_kagerou_03" "link_DOTA_Tooltip_ability_lycan_shapeshift" + "DOTA_Tooltip_ability_lycan_feral_impulse" "特质「奔狼之血」" + "DOTA_Tooltip_ability_lycan_feral_impulse_Description" "提升影狼及周围队友的攻击力,影狼普通攻击会额外附加 能量点*星级*系数 的伤害。" + "DOTA_Tooltip_ability_lycan_feral_impulse_Lore" "奔狼之血强化了她的反应能力和强度。" + "DOTA_Tooltip_ability_lycan_feral_impulse_radius" "攻击范围:" + "DOTA_Tooltip_ability_lycan_feral_impulse_bonus_hp_regen" "伤害附加系数:" + "DOTA_Tooltip_modifier_lycan_feral_impulse" "奔狼之血" + "DOTA_Tooltip_modifier_lycan_feral_impulse_Description" "攻击力加成:%dMODIFIER_PROPERTY_BASEDAMAGEOUTGOING_PERCENTAGE%%%。" + "DOTA_Tooltip_ability_sven_great_cleave" "爪符「刚猛利爪」" + "DOTA_Tooltip_ability_sven_great_cleave_Description" "影狼以利爪攻击,对所有附近的敌方单位造成分裂攻击伤害。" + "DOTA_Tooltip_ability_sven_great_cleave_Lore" "影狼有着锋利的利爪,横扫前面敌人。" + "DOTA_Tooltip_ability_sven_great_cleave_Note0" "分裂伤害会计算护甲。" + "DOTA_Tooltip_ability_sven_great_cleave_Note1" "分裂伤害无视技能免疫。" + "DOTA_Tooltip_ability_sven_great_cleave_Note2" "" + "DOTA_Tooltip_ability_lycan_howl" "咆哮「陌生的咆哮」" + "DOTA_Tooltip_ability_lycan_howl_Lore" "毛骨悚然的狼嚎让敌人明白影狼就在它们之中。" + "DOTA_Tooltip_ability_lycan_howl_Description" "给予影狼和所有友方单位攻击速度加成,影狼额外获得攻击造成%hp_regen%倍伤害并附带能量点*星级*%armor%的伤害。" + "DOTA_Tooltip_ability_lycan_howl_armor" "额外伤害(能量点*星级):" + "DOTA_Tooltip_ability_lycan_howl_hp_regen" "攻击伤害倍数:" + "DOTA_Tooltip_modifier_lycan_howl" "咆哮「陌生的咆哮」" + "DOTA_Tooltip_modifier_lycan_howl_Description" "获得%dMODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT%攻击速度。" + "DOTA_Tooltip_modifier_lycan_howl_aura" "陌生的咆哮" + "DOTA_Tooltip_modifier_lycan_howl_aura_Description" "玩家控制的单位获得咆哮效果。" + "DOTA_Tooltip_ability_lycan_shapeshift" "变身「星形齿」" + "DOTA_Tooltip_ability_lycan_shapeshift_Lore" "影狼接受了永恒的狼人诅咒,拥抱了她的野性。" + "DOTA_Tooltip_ability_lycan_shapeshift_Description" "影狼展现出她的凶狼形态,获得致命一击的能力。每次攻击有%crit_chance%%%的几率造成%crit_multiplier%%%的致命一击伤害。\n凶狼形态在夜晚持续时间较长。" + "DOTA_Tooltip_ability_lycan_shapeshift_Note0" "" + "DOTA_Tooltip_ability_lycan_shapeshift_Note1" "" + "DOTA_Tooltip_ability_lycan_shapeshift_speed" "夜晚持续时间加成:" + "DOTA_Tooltip_ability_lycan_shapeshift_bonus_night_vision" "额外夜间视野:" + "DOTA_Tooltip_modifier_lycan_shapeshift_Description" "获得致命一击。" + "DOTA_Tooltip_modifier_lycan_shapeshift_speed_Description" "变身在夜间持续时间比白天要长。" + "DOTA_Tooltip_ability_life_stealer_feast" "爪符「刚猛利爪」" + "DOTA_Tooltip_ability_life_stealer_feast_Lore" "影狼有着锋利的利爪,能够造成流血的致命伤害。" + "DOTA_Tooltip_ability_life_stealer_feast_Description" "影狼每次攻击时还会根据目标最大生命值造成额外伤害。" + "DOTA_Tooltip_ability_life_stealer_feast_hp_leech_percent" "%额外伤害:" + "DOTA_Tooltip_ability_life_stealer_feast_Note0" "" + "DOTA_Tooltip_ability_life_stealer_feast_Note1" "" + "DOTA_Tooltip_ability_life_stealer_feast_Note2" "" + "DOTA_Tooltip_ability_life_stealer_feast_Note3" "" + + "wriggle" "莉格露·奈特巴格" + "DOTA_Tooltip_ability_item_0060" "【R】莉格露·奈特巴格" + "DOTA_Tooltip_ability_item_0060_Lore" "当发现莉格露身边没有虫子并且看起来很有自信的话,那时是最危险的。说不定在她的身边,已集满了恙虫。" + "DOTA_Tooltip_ability_item_0060_Description" "莉格露被称为虫之妖怪,更准确的说法是萤火虫妖怪。她伴随着大群昆虫出现,让昆虫自由地活动。\n她身边总是围绕着很多虫子。大量集结的萤火虫之所以能分秒不差,整齐地同时闪烁,正是因为当中存在着她这样的命令中枢。不要以为只是藐小的虫子而已,一旦被大量的虫子袭击绝不会好受。特别于她发怒而使出真正实力的时候,召唤出来的恙虫大军,可会令人高烧致死。\n【★】蠢符「小虫风暴」\n【★★★】萤符「地上的恒星」" + "DOTA_Tooltip_ability_thtd_wriggle_01" "link_DOTA_Tooltip_ability_death_prophet_exorcism" + "DOTA_Tooltip_ability_thtd_wriggle_02" "link_DOTA_Tooltip_ability_keeper_of_the_light_will_o_wisp" + "DOTA_Tooltip_modifier_weaver_swarm_debuff" "蠢符「小虫风暴」" + "DOTA_Tooltip_modifier_weaver_swarm_debuff_Description" "正在造成伤害并削弱护甲。" + "DOTA_Tooltip_ability_death_prophet_exorcism" "蠢符「小虫风暴」" + "DOTA_Tooltip_ability_death_prophet_exorcism_Lore" "莉格露身边总是围绕着很多虫子听从号令。" + "DOTA_Tooltip_ability_death_prophet_exorcism_Description" "莉格露释放虫群攻击敌人。" + "DOTA_Tooltip_ability_death_prophet_exorcism_Note0" "作用范围代表莉格露周围的虫群寻找目标的范围。" + "DOTA_Tooltip_ability_death_prophet_exorcism_Note1" "虫群的伤害为物理技能伤害。" + "DOTA_Tooltip_ability_death_prophet_exorcism_radius" "作用范围:" + "DOTA_Tooltip_ability_death_prophet_exorcism_spirits" "虫群数量:" + "DOTA_Tooltip_ability_death_prophet_exorcism_heal_percent" "伤害(莉格露的能量点*星级):" + "DOTA_Tooltip_ability_death_prophet_exorcism_average_damage" "虫群移动速度:" + "DOTA_Tooltip_modifier_death_prophet_exorcism" "蠢符「小虫风暴」" + "DOTA_Tooltip_modifier_death_prophet_exorcism_description" "?" + "DOTA_Tooltip_ability_keeper_of_the_light_will_o_wisp" "萤符「地上的恒星」" + "DOTA_Tooltip_ability_keeper_of_the_light_will_o_wisp_Description" "在目标区域大量集结变异的萤火虫,施放强光,每秒交替闪亮和闪灭。闪亮时将使附近所有敌人被蛊惑,强制凝视萤火虫群。" + "DOTA_Tooltip_ability_keeper_of_the_light_will_o_wisp_radius" "作用范围:" + "DOTA_Tooltip_ability_keeper_of_the_light_will_o_wisp_on_count" "闪亮次数:" + "DOTA_Tooltip_ability_keeper_of_the_light_will_o_wisp_hit_count" "被蛊惑时移速:" + "DOTA_Tooltip_ability_keeper_of_the_light_will_o_wisp_off_duration" "闪灭持续时间:" + "DOTA_Tooltip_ability_keeper_of_the_light_will_o_wisp_on_duration" "闪亮持续时间:" + "DOTA_Tooltip_modifier_keeper_of_the_light_will_o_wisp" "被蛊惑" + "DOTA_Tooltip_modifier_keeper_of_the_light_will_o_wisp_Description" "" + "DOTA_Tooltip_modifier_keeper_of_the_light_will_o_wisp_aura" "蛊惑光环" + "DOTA_Tooltip_modifier_keeper_of_the_light_will_o_wisp_aura_Description" "作用范围内敌人被闪亮的光源蛊惑。" + + "inaba" "因幡帝" + "DOTA_Tooltip_ability_item_0062" "【R】因幡帝" + "DOTA_Tooltip_ability_item_0062_Lore" "于竹林里迷路的人,偶然会看到她的身影。据说只要见到她就必定能够找到出路,所以人们都将她看成是竹林的引路人。" + "DOTA_Tooltip_ability_item_0062_Description" "她懂人话,而且能变成人的样子。虽说是妖怪兔,但她别名是幸运的白兔,据说见到她的人能得到幸运。不过她常常在迷失竹林,而且身法敏捷,可不容易看得到。\n性格喜欢捉弄人,受惊吓会立刻逃跑,很狡猾。喜怒哀乐鲜明,和妖精性情相似。\n【★】爆头「幸运之击」\n【★】兔符「开运大纹」" + "DOTA_Tooltip_ability_thtd_inaba_01" "link_DOTA_Tooltip_ability_sniper_headshot" + "DOTA_Tooltip_ability_thtd_inaba_02" "link_DOTA_Tooltip_ability_ogre_magi_bloodlust" + "DOTA_Tooltip_ability_ember_spirit_sleight_of_fist" "脱兔「逃脱之击」" + "DOTA_Tooltip_ability_ember_spirit_sleight_of_fist_Lore" "顷刻之间,无影无踪。" + "DOTA_Tooltip_ability_ember_spirit_sleight_of_fist_Description" "因幡帝以最擅长的逃脱的速度横冲直撞,攻击目标区域内所有敌人,随后返回所在位置,并在此期间提高自己造成的伤害。" + "DOTA_Tooltip_ability_ember_spirit_sleight_of_fist_radius" "作用范围:" + "DOTA_Tooltip_ability_ember_spirit_sleight_of_fist_bonus_hero_damage" "伤害(因幡帝的能量点*星级):" + "DOTA_Tooltip_ability_ember_spirit_sleight_of_fist_attack_interval" "攻击间隔:" + "DOTA_Tooltip_ability_ember_spirit_sleight_of_fist_creep_damage_penalty" "%伤害提升:" + "DOTA_Tooltip_ability_ember_spirit_sleight_of_fist_Note0" "在施放技能时作用的目标就已决定。" + "DOTA_Tooltip_ability_ember_spirit_sleight_of_fist_Note1" "对目标的攻击每次间隔0.2秒。" + "DOTA_Tooltip_ability_ember_spirit_sleight_of_fist_Note2" "拥有的攻击特效(如致命一击、重击、分裂等效果)在技能攻击期间都能生效。" + "DOTA_Tooltip_ability_ember_spirit_sleight_of_fist_Note3" "施放时间可以使用其他技能和物品。" + "DOTA_Tooltip_modifier_ember_spirit_sleight_of_fist_charge_counter" "脱兔「逃脱之击」能量点数" + "DOTA_Tooltip_ability_sniper_headshot" "爆头「幸运之击」" + "DOTA_Tooltip_ability_sniper_headshot_Lore" "童年时对潜行兽的胡乱射击现在被练就成攻击敌人的技术。" + "DOTA_Tooltip_ability_sniper_headshot_Description" "因幡帝提高她的精确度,每次攻击根据目标最大生命值造成额外伤害,并有一定概率造成短暂的移动停滞。" + "DOTA_Tooltip_ability_sniper_headshot_Note0" "额外伤害基于目标最大生命值,没有上限限制。" + "DOTA_Tooltip_ability_sniper_headshot_proc_chance" "%停滞概率:" + "DOTA_Tooltip_ability_sniper_headshot_knockback_distance" "击退距离:" + "DOTA_Tooltip_ability_sniper_headshot_slow_duration" "%额外伤害:" + "DOTA_Tooltip_modifier_sniper_headshot_slow" "爆头停滞" + "DOTA_Tooltip_modifier_sniper_headshot_slow_Description" "因幡帝的爆头使其停滞!" + "DOTA_Tooltip_ability_ogre_magi_bloodlust" "兔符「开运大纹」" + "DOTA_Tooltip_ability_ogre_magi_bloodlust_Description" "将运气带给一个友方单位,增加其攻击速度和提升伤害。" + "DOTA_Tooltip_ability_ogre_magi_bloodlust_Lore" "幸运的白兔,据说见到她的人能得到幸运。" + "DOTA_Tooltip_ability_ogre_magi_bloodlust_duration" "持续时间:" + "DOTA_Tooltip_ability_ogre_magi_bloodlust_bonus_attack_speed" "额外攻击速度:" + "DOTA_Tooltip_ability_ogre_magi_bloodlust_bonus_movement_speed" "%爆击概率提升:" + "DOTA_Tooltip_ability_ogre_magi_bloodlust_self_bonus" "对己攻击速度加成:" + "DOTA_Tooltip_modifier_ogre_magi_bloodlust" "兔符「开运大纹」" + "DOTA_Tooltip_modifier_ogre_magi_bloodlust_description" "爆击概率提升%dMODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE%%%,攻击速度提升%dMODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT%。" + "DOTA_Tooltip_ability_ogre_magi_bloodlust_Note0" "爆击概率与物品叠加" + "DOTA_Tooltip_ability_ogre_magi_bloodlust_Note1" "" + "DOTA_Tooltip_ability_ogre_magi_bloodlust_Note2" "" + } +} diff --git a/resource/addon_schinese.txt b/resource/addon_schinese.txt new file mode 100755 index 0000000..e1c3877 Binary files /dev/null and b/resource/addon_schinese.txt differ diff --git a/resource/custom_game_whitelist.txt b/resource/custom_game_whitelist.txt new file mode 100755 index 0000000..df901d3 --- /dev/null +++ b/resource/custom_game_whitelist.txt @@ -0,0 +1 @@ +ʖōōȍЍҍԏԍ۽ՍڍڍڍލǶꀎՔ䉎ŋڌ䍎̉쪗ԙ􋚎ˡ꜎끞酢̢㐣ʦ䨎ᩎ祈ҪƄ׽ڽ;׿ÎÎĎĎǣŎŎȎʎʎʎ͎͎ΎڛώԎ֎֎Ըَ˟ڎڎڎێێێ܎ގߎǘږ߀و򔅏ɈàҨƪíﮏӶźƏΎǏȏʏʏʏʏʏˏϏяϢя֏؏ۏݏҵݏޏúߏȎۏ︕ІܘǚҞĠۣ̀ɽÐːՐאېۼᰃںǔӡ䄮ŰȲ۶ǹÑȑɑ͑ΑБёё̼֑֑בߑԒŕޛ힒حВ֒֞̯´皷վÓܑߞ񷢔Дєܔ盕Ѽŗԋ唘򾴙ⵙřԙƆƛ͛ıߓҐ갃ԟ㋲ȠӶաߢģ✪̟Ѭԭ秿ω歱бܬʆų؋㜵ɵްڵ䧌גב͉Ķ։Ѽ׋ūʧѻ鋼ڼțލꋢƿޠ޾Ҍ̾ѱʬ܏ŖǬΩ啛މ쫾ˑ՗ߚ䎼߯ҪځϙٛهÏʥܬ؋шԔ獗àݝIJ˷ǂꏐ쑣җ͗؋ŝŮ۽܈ف鄍ͶݑםܥН¸ۅթ쬋ޖ쀸ݴȬñْˀďȘϙиί蕬͎ɟ‘ҐѫюȔƕ˭ݩȵ˨֐ϮҦNJ͝߸ӑΓӺא׀űު̸ډĨܤϏڻՒ땖àľՂѾۛܠι˂͇ȍ̀㤔泖舰ࢴז’Ҵݗܼ͟ۃǑ҉ɌƍṠ߳ڈ݊㞋ۚɛֲݪɭѡެ׀ހڞįĨϻ˟ņل㤊̈ʳ٤ׂ޾ģͫζޏ֋ۻ˓ҴŝƽչͲƴψژձ܎ǐDžҡ˩ƧȀ̀ڥӀԂ򷘁爰ļہ޽ݛٛѮ洂֔łܒƂ͂ӡЂЖφӁܷуԃۃӄڄ܀ㆅƧӫ±̅хԭ몆Ȇφ˫Ƹև؇ۇ膈˪ʈЈЈЈЈЈބㄉ鄉ʉڍ᧠̃ͿȋɋΊ⤌ړʌیЗۆʗ̚ВŽ͎юܹ܏܀Őِߐ탑ὑąˑԑ̌ٿڿďТ䁜ɡ匜Џʢܶ㗾ΜӜǾ֝ȃžٔ䵚ǟΟݟ嗠ہװ ƠȠҠԊDzա֡吨諸IJǧŢǔ̥ϰܣߣꢤ󇱤ű֤£ѧʥݥ˼ҍӦԦʞŧʧЧҭѧ֧Ӷ׈Ҽߨݿʈʧ۩ݩхջέÚԪᬦ׫׫Ň攬̬僭Õؘ㴭̉৮꾻ȯѯ㼇հ徰ܰ󟇱堍̱бƃϚͭIJ貏񆕳ξгğ΁؂ꚪʴʴݒȵʵܩݵݵٚĂǂжՐД˦өಷ첷ǷɷҷѶǺղ؄椹鶹곹Ӻ͹ιչ֑ʺغٽɻڻ߻׷ռ﬽۰ӽؽ雾˥ը̾;Ծق旿ʿҲ킰ᎵۋǾײٟȤɭ±ƐߴҾҴ㩶ɋÚڲہƔݢ箝ͨʔӟ٤³гֵɬ튇˾ı·ĉԉɌЌЏȐۣ›蹜ߜϟ͉ԯڣɉجɭŰŊ۸ׄ¸ڿݍӖ̍əؐɝ‚ڪƊڌրɫʱ˧˲ę߃݄ΝԼڀՅ˓ֿՄΓʰԊӴ؆؍ڻď蹡ںƘ߶Ȣ̏Ԛֻʍɞ܇Α̎Րѿڲ賘îЀ븫߃ӛґ滛ӀȬՆܧˏөҝȿ١ȟӡꢱʄϧ鲿ħЃזʫįʀ֎ŋ⯁ֵҏ˂ׂێܲރͭЄׄ…υԅ϶ºɎ̆Ԇ؆LJ̛ڇֈ⟖کݓΉщ݉я͚ċNjߋ댌ڕ΋Ħϵ̍ࢎÎĎɎҎڎӏ׼Լɏ̏̓ۙ񘫐᱐ܑꞑᮑʑϑꨒʒƓܓ™̔䦕ŕޕۋ–Öǖ̖ϖٖԊЎӛꜗ̢Ӷ⁘ʜβĘȾϘΔŬҙәԙٙ툚°󖳚šƚȚΚКϔזƤ߮ʛϛ՛֛ޛ։«ƘӫџƜ̜ɯМ̼ރϝ筽ʝ΅ם咞ʵ۬ೞޞߞןɝ鯌ѐڡǠƇӖɻȢĕ禣ꮣ岾ȣУڣᧃڢ̤Ӥߤߤ쇥¥ǥ騦ԦâΕȧ񰊨̋ϋ擨˨̨۟뤩սüéʩҨөŸ˪Ҫ֪۪󲅫Эȫիիիիիի֫߫Ĭ̬ƃۄȟأ㿭ŭޭѐ׮ٺؕƯʔѯկݯޯĝİߏŧױߏԕ옲ۦϲîބ稳ܳȴմ˵ޝɵ侷ȷʈɷזǸɸ璹ҽѕ槺㥬୺ƼźغȑڈĻȻԐڻԔ詢ۼčνݽ؄ɲ۷èξԾݾݾɻӿ噂Ӎǫǁͤʉ݀ہ̤䄂ދ꧸ŝФ܈遟ߒգƉ볍ˣαˏ֡܇ۊщ΋֏ӼүšݩඁЁĂˑȂȂߖѡޝϦ㮷ÄƄDŽфʢԄ륗ӧՅ⽆Æ齻χ߇Ė֧҈ۈԉԉŊ͝놋ӻįגܲŋЋˏǛ޸йٹĘŌ硍ͺˍܕ𢊎ˎϞюۥںǏʏŞ䏐ෙ×Ɛِ܉뉑퉑ɑА萒槒’’̒͒뗓ٴ“ؓ࿁߇Š袔쯔ܼƔ̔ݔϧ˝򴭕ՁŕÁ֕ǻЖĆɛ闗ԫ΅ȗ̗α֙ʤܥأ͘ęՙ⋔ڸ纚Ú՚ȜǝܝȞОΑʠ֣ⱡءᲢޢۦݡѤ㍥蜥˥̥ޥůñҶѨܨ忩ĩɂϩƌʟĹɅǸޭٔ՘ƜͰĽɱ農݈캳󓁴ӒӋ޸됷綧Ϸ쎸Ǹ٤ָÒ䴹׽ܛݹ҂Ժۻ۔ʀμмΔռνؽիҭܾ޾Œ響ſԿܿÂݿѶɂ멻ѻϑюԈŞһ܌׎ӄᾫDžׯڢñ܉ހ֘ļؑ͛̀͘瑅ΉÀۘϾ͝ئڴ¾ף®˷׀僯Ə隈ـǷΉؕҒњǠȤ䈽͓٧˾ف۰ѱǚ٬Ѯπȁ؁˛蘂΂Į˶׆τ֗Džۺ煆ʆےˆݍފ̚쥋ݶލɐ܎ଏȏՏАԐԐّϒВВݡÂ蝨ɔ•ߕ殺ﻖꑗ옗ᴗΑ’ꀧ·䏚裚˾ӛӛœƞø՝ϩӈ࡙ԟߣС̠Ϡў㸡䁢鏠նԢբڣַȤڤō֮ͥͦʶġħ㗨Ѩڨɩݫ㙤¹ٌڭۭ겮ݿޮЮߑӯ֯Ӱ慱Қ觜˜⬵£ٲήٲ䄳ֵּ禪ַ޷׌ǨʸݸĻռּ׼Ϳɀǚ͝аݷڧי΢ąښƂŢˬђ풄ʦ۽͞܁Јڵ璼ԗ٧輮ۨɩ˹ꐿȓЉŨöʹўʹЙܥؚʖϟ݂Ŗάƨɍˢěטŧӳ˷ջЎLJؗȢǮϒִۢǷƅןإ奷Ɛ̡Ҽӵߙыځ؃ᘞѤ۩劳ؐӉܭÞٓæŻיΆ۰Ъ„¬ݮ䉼ûֺ͗րǍⰑך؛ǣܸȴҢᛀ囀گ´Ѐٰ۷ǁ΁сہ܁݁ơыՐ왕ލͪǂȂւނȉ̓紞ͻڰ”ɖ঄Ԯܱݻ҄گآڤ蟳ƕljרȆ҆݀Ԇㆇ뜇ԇԦևͦݜ̀׉Âٖޔ䪈߈쩉̀ĉƉÎ唄խͯŊԊ低ᐋǛ΢ݪNjɋەļűČȌՌ׌ƍɍǢզՎ؎ߎ̬Ǐ耐܋ђⓡʡʺùҐʏ⬌Ƨ̑Ց֑ڑǥޑꬒɕ≹ʸҬżʔ֨˔ԔǛåݞ䨕ʕٖؕ݀ڕߗۓĉ̍Ù؛ꦚšȚȚҚ쏛ڐ꬛չܹʾվ⩿ƛӛޛߛ¥зۮ̜ͭӜ΀ꊝНܯڈ̖žžӞžܺПҟǍҬְֶŠݭ㲲á١ߐ蠢Ƣ𗄣Œےդײգڅ˞٩ǵͤդѥܛ՗ɥͥͥՀڝڔ׭ȮۘǦ˦ܦϮȧ̧Чᵙ˯ꪰըŵƁ陥Щע֘궍ŽΣ㬫ՈܫʮǏؚìͬӮų׷ݻ˼ě‹ĝĢ㽮ٮ߮ڸ͸ۻ̯̯鍰ȫư˰ñϱڱ襲ֳܲۘӖƴԴۮѓ̵ɘا洶ݶ۵Ϸ׷ڷޏָʄ暹ȭӲٮѺźǺɺяҺݺǶ͊ʻ؏ռīۼ䏽فԳߗɽُϽŁ𵆾Ȩ賫⿾俾;Ӿؾ̘튧㱿¿ƿʿԃض˻ΛŤƖՇļٺȃՄԦΜ̫渓ԬʤҦ߯ݙЛҋ֡ѠׂÁ͋ˣ붥ֹ扝篹ޙɓ͡زщ‡ԟмꮃуϟʽʰϴʭ۷˭甐̵۶ڞܝϭƉNJ݊׋‹ƐդΆ٬رDz߿Ѩڐ۟غО޽왒ǖɉ۬إўւʼȩ̫К˳ˎâ횤σƭ߯ҕԧÒ³͟ӥՊ̇ϫ봸ǣގĒ̽җ떢ذߙɬՋ篝޸Н֭պկۈÍ蟩ڄѻ܌씃樃ƠЄфޓ땅입粅֤禆Ɛˇˆӗ뵉ߌڱ́ҊɿɋϹ׆놎ǸݎɂˑɐҐӰڑʽ셒͒ԒΓϫijۜ戝ߕ́ݏʘߘ얙Ùęϙқ諜Ĝɜߜȝ폞™גӞ͚ˇʍﱳšкݡ焞Ģјѥѥե֥٥ǃ۝뤦퍩グ’ـӟȧϫ׫؋çǛܧ˨ǖǜͪțϧۊĪʪѪǓɮԷڟثݫЕ౬ǬޒǮȭʭۭ绕ѯսűβϲ͖̽³ijݳ߳Č״ڴӮ柛䠰ҵȽĪŶǶǭ䓷֞Ҭɸƙ㴹ӻϹᆊһ׻Ǵ˯Ѷʽֽ׾޾ӒѸا돰IJރתٶ׌鑉ڥ΋ΉמŴիҺꈪ̷ϮɃ῟ԣזߠǎՔƗì뇞ÜЛ蕌ᄇ֒Ϲʢ۪Â߿ęܥ린ӆÇͼ蛟˂ʹӚδԩֶͤϰùΆ٦ꇐɌӛƢԼ熬຋ش̸ܻꙑж࿂Ƀͧ߄זٯ˅ޅʍƆԻˆ͆φۆ᫓̣։Υ纨Ċ궫ŋ̋“Ӌ֋ВٲöٌҨōԎݎǛˏ꧐䑑މǒΒ֒Бɹȓ֜ň՟槔۫йƾȕӕÙԖ⃗ƣްۗ㌘˅ˉܧԲřƙəʟުֳޚʛۛځ銜ΜÝٝſݿž̞ʛ韼ǟӟΉ˝ڠՙ󮜡ΡС䁢ɢޢ£ģӭǟςɦ°ﶨޗ㚣Ϗɫ܀ҤÕګ٬ǭԭ٭٭Ցߤ윰񃻰ְϑƁɱʲۮȳ̳γѳΌњتդ⣶Ԥ܁Œ趷۹溷ַƝǸɸ͸Ԝո뀝ʟ؊£Ǽϑگϳ嗾ǾͿտ߿̝ɟ၏ݥאֆȴė̡ݣĉȖԆƐՊȌߐӆڋשϐв͊ҘꉈϪŔؒȏƽɟߺمӇƒɥŊɎ݀ڒގϙ͘ζڹ瘵ъܢŽ风΀ݒη켳ŒӮ˦ἕ  Ȼ  ӱ ⼁ с с с ҁ Ӯ  Ꮒ Ν   ي ɇ ƒ 쀄   ޖ„  ř  Ѕ ҅    Ǣ ڲ ć  Ո   ʉ  Ө ʬۊ ʬ ċ ȋ Յ ̙  秌 Ì Ԍ ڌ  ܍     ʸ ʏ ͏ ُ  ד ܐ  œ Ɠ ɓ ⡔ ȥ  Ť ͖ Ǡ  × ݗ     ̤    ΍ 嫚  ך  풜 빜  Ӝ Ј  겝 ӽ  ̝  ̞ Ѐ  ǐڟ  Ǡ ˾Ԡ  ๡ ɡ   㔗  謣 ϣ      Թ å ڥ  𴻦   ڧ    ͂  ԩ ԩ ש    ¯ ๪ җƪ   ܋ ӫ   Ƒ  ̰ 릭 ާ ǭ    ٮ ʧ       Ϝ ܛ    DZ   舲  ࠲   ‚  ޳  ʧ    ̶    ʷ  ˤ  ϟظ ݜ۸      κ¼ ߼     񒫾  ೾ ʀ  ߿  Ϭ    ӏ           Ѱ   ݅     찚    ž ʔ         ͘ Ă ˉ    Ҙ  ͆ ز ض б    С    Ւ  ժ     왟     ƥ    ғ ۛ       ч          Ǣ    Ѣ    ӏ ͊  ș ޸       ܻ          Ȫ       \ No newline at end of file diff --git a/resource/flash3/custom_ui.txt b/resource/flash3/custom_ui.txt new file mode 100755 index 0000000..d2fde66 --- /dev/null +++ b/resource/flash3/custom_ui.txt @@ -0,0 +1,79 @@ +"CustomUI" +{ + // swf files should be published into the same folder as this file + + // Add a numbered block for each swf file to load when your addon starts + + + //"1" + //{ + // "File" "Example" + // "Depth" "50" + //} +} + +// ============================================= +// Depths of base Dota UI elements +// ============================================= +// hud_chat: 8, + +// error_msg: 10, + +// voicechat: 11, +// shop: 12, +// tutorial: 13, +// herodisplay: 14, +// actionpanel: 15, +// inventory: 16, +// channelbar: 17, + +// gameend: 19, +// chat_wheel: 20, +// survey: 21, +// quests: 22, +// questlog: 23, + +// ti_onstage_side: 30, + +// last_hit_challenge: 35, +// waitingforplayers: 36, +// highlight_reel: 37, +// stats_dropdown: 38, +// halloween: 39, +// killcam: 40, // and inspect +// scoreboard: 41, +// quickstats: 42, +// shared_units: 43, +// shared_content: 44, + +// holdout: 50, + +// spectator_items: 145, +// spectator_graph: 146, +// spectator_harvest: 147, +// spectator_player: 148, +// spectator_fantasy: 149, + +// heroselection: 250, +// spectate_heroselection: 251, +// shared_heroselectorandloadout : 252, + +// broadcaster: 364, + +// spectate: 365, +// coach: 366, + +// combat_log: 367, + +// guide_panel: 368, + +// loadgame: 380, + +// report_dialogue : 381, +// popups : 382, +// matchmaking_ready : 383, + +// ti_onstage_pods: 500, + +// overlay: 1000 +// ============================================= \ No newline at end of file diff --git a/resource/flash3/images/heroes/juggernaut.png b/resource/flash3/images/heroes/juggernaut.png new file mode 100755 index 0000000..349e27a Binary files /dev/null and b/resource/flash3/images/heroes/juggernaut.png differ diff --git a/resource/flash3/images/heroes/lina.png b/resource/flash3/images/heroes/lina.png new file mode 100755 index 0000000..b132802 Binary files /dev/null and b/resource/flash3/images/heroes/lina.png differ diff --git a/resource/flash3/images/heroes/selection/npc_dota_hero_juggernaut.png b/resource/flash3/images/heroes/selection/npc_dota_hero_juggernaut.png new file mode 100755 index 0000000..fc60ea8 Binary files /dev/null and b/resource/flash3/images/heroes/selection/npc_dota_hero_juggernaut.png differ diff --git a/resource/flash3/images/heroes/selection/npc_dota_hero_lina.png b/resource/flash3/images/heroes/selection/npc_dota_hero_lina.png new file mode 100755 index 0000000..77066d9 Binary files /dev/null and b/resource/flash3/images/heroes/selection/npc_dota_hero_lina.png differ diff --git a/resource/flash3/images/items/0001.png b/resource/flash3/images/items/0001.png new file mode 100755 index 0000000..3a5a8b0 Binary files /dev/null and b/resource/flash3/images/items/0001.png differ diff --git a/resource/flash3/images/items/0002.png b/resource/flash3/images/items/0002.png new file mode 100755 index 0000000..3ff0025 Binary files /dev/null and b/resource/flash3/images/items/0002.png differ diff --git a/resource/flash3/images/items/0003.png b/resource/flash3/images/items/0003.png new file mode 100755 index 0000000..46c807f Binary files /dev/null and b/resource/flash3/images/items/0003.png differ diff --git a/resource/flash3/images/items/0004.png b/resource/flash3/images/items/0004.png new file mode 100755 index 0000000..3056e8f Binary files /dev/null and b/resource/flash3/images/items/0004.png differ diff --git a/resource/flash3/images/items/0005.png b/resource/flash3/images/items/0005.png new file mode 100755 index 0000000..348aa8e Binary files /dev/null and b/resource/flash3/images/items/0005.png differ diff --git a/resource/flash3/images/items/0006.png b/resource/flash3/images/items/0006.png new file mode 100755 index 0000000..4312668 Binary files /dev/null and b/resource/flash3/images/items/0006.png differ diff --git a/resource/flash3/images/items/0007.png b/resource/flash3/images/items/0007.png new file mode 100755 index 0000000..65fe943 Binary files /dev/null and b/resource/flash3/images/items/0007.png differ diff --git a/resource/flash3/images/items/0008.png b/resource/flash3/images/items/0008.png new file mode 100755 index 0000000..0a516ba Binary files /dev/null and b/resource/flash3/images/items/0008.png differ diff --git a/resource/flash3/images/items/0009.png b/resource/flash3/images/items/0009.png new file mode 100755 index 0000000..16267fd Binary files /dev/null and b/resource/flash3/images/items/0009.png differ diff --git a/resource/flash3/images/items/0010.png b/resource/flash3/images/items/0010.png new file mode 100755 index 0000000..ce1612b Binary files /dev/null and b/resource/flash3/images/items/0010.png differ diff --git a/resource/flash3/images/items/0011.png b/resource/flash3/images/items/0011.png new file mode 100755 index 0000000..dc118c3 Binary files /dev/null and b/resource/flash3/images/items/0011.png differ diff --git a/resource/flash3/images/items/0012.png b/resource/flash3/images/items/0012.png new file mode 100755 index 0000000..1ee9465 Binary files /dev/null and b/resource/flash3/images/items/0012.png differ diff --git a/resource/flash3/images/items/0013.png b/resource/flash3/images/items/0013.png new file mode 100755 index 0000000..00382d0 Binary files /dev/null and b/resource/flash3/images/items/0013.png differ diff --git a/resource/flash3/images/items/0014.png b/resource/flash3/images/items/0014.png new file mode 100755 index 0000000..7feb53f Binary files /dev/null and b/resource/flash3/images/items/0014.png differ diff --git a/resource/flash3/images/items/0015.png b/resource/flash3/images/items/0015.png new file mode 100755 index 0000000..845261a Binary files /dev/null and b/resource/flash3/images/items/0015.png differ diff --git a/resource/flash3/images/items/0016.png b/resource/flash3/images/items/0016.png new file mode 100755 index 0000000..3098684 Binary files /dev/null and b/resource/flash3/images/items/0016.png differ diff --git a/resource/flash3/images/items/0017.png b/resource/flash3/images/items/0017.png new file mode 100755 index 0000000..23d5960 Binary files /dev/null and b/resource/flash3/images/items/0017.png differ diff --git a/resource/flash3/images/items/0018.png b/resource/flash3/images/items/0018.png new file mode 100755 index 0000000..d266470 Binary files /dev/null and b/resource/flash3/images/items/0018.png differ diff --git a/resource/flash3/images/items/0019.png b/resource/flash3/images/items/0019.png new file mode 100755 index 0000000..b94b419 Binary files /dev/null and b/resource/flash3/images/items/0019.png differ diff --git a/resource/flash3/images/items/0020.png b/resource/flash3/images/items/0020.png new file mode 100755 index 0000000..b7bbe82 Binary files /dev/null and b/resource/flash3/images/items/0020.png differ diff --git a/resource/flash3/images/items/0021.png b/resource/flash3/images/items/0021.png new file mode 100755 index 0000000..816fca3 Binary files /dev/null and b/resource/flash3/images/items/0021.png differ diff --git a/resource/flash3/images/items/0022.png b/resource/flash3/images/items/0022.png new file mode 100755 index 0000000..efd6d08 Binary files /dev/null and b/resource/flash3/images/items/0022.png differ diff --git a/resource/flash3/images/items/0023.png b/resource/flash3/images/items/0023.png new file mode 100755 index 0000000..41805a0 Binary files /dev/null and b/resource/flash3/images/items/0023.png differ diff --git a/resource/flash3/images/items/0024.png b/resource/flash3/images/items/0024.png new file mode 100755 index 0000000..be8684a Binary files /dev/null and b/resource/flash3/images/items/0024.png differ diff --git a/resource/flash3/images/items/0025.png b/resource/flash3/images/items/0025.png new file mode 100755 index 0000000..4b675e4 Binary files /dev/null and b/resource/flash3/images/items/0025.png differ diff --git a/resource/flash3/images/items/0026.png b/resource/flash3/images/items/0026.png new file mode 100755 index 0000000..953ddf5 Binary files /dev/null and b/resource/flash3/images/items/0026.png differ diff --git a/resource/flash3/images/items/0027.png b/resource/flash3/images/items/0027.png new file mode 100755 index 0000000..50beffc Binary files /dev/null and b/resource/flash3/images/items/0027.png differ diff --git a/resource/flash3/images/items/0028.png b/resource/flash3/images/items/0028.png new file mode 100755 index 0000000..fcd4197 Binary files /dev/null and b/resource/flash3/images/items/0028.png differ diff --git a/resource/flash3/images/items/0029.png b/resource/flash3/images/items/0029.png new file mode 100755 index 0000000..53911de Binary files /dev/null and b/resource/flash3/images/items/0029.png differ diff --git a/resource/flash3/images/items/0030.png b/resource/flash3/images/items/0030.png new file mode 100755 index 0000000..036f8c9 Binary files /dev/null and b/resource/flash3/images/items/0030.png differ diff --git a/resource/flash3/images/items/0031.png b/resource/flash3/images/items/0031.png new file mode 100755 index 0000000..bf7268b Binary files /dev/null and b/resource/flash3/images/items/0031.png differ diff --git a/resource/flash3/images/items/0032.png b/resource/flash3/images/items/0032.png new file mode 100755 index 0000000..9c8adad Binary files /dev/null and b/resource/flash3/images/items/0032.png differ diff --git a/resource/flash3/images/items/0033.png b/resource/flash3/images/items/0033.png new file mode 100755 index 0000000..b28ad3a Binary files /dev/null and b/resource/flash3/images/items/0033.png differ diff --git a/resource/flash3/images/items/0034.png b/resource/flash3/images/items/0034.png new file mode 100755 index 0000000..0c34524 Binary files /dev/null and b/resource/flash3/images/items/0034.png differ diff --git a/resource/flash3/images/items/0035.png b/resource/flash3/images/items/0035.png new file mode 100755 index 0000000..09871cd Binary files /dev/null and b/resource/flash3/images/items/0035.png differ diff --git a/resource/flash3/images/items/0036.png b/resource/flash3/images/items/0036.png new file mode 100755 index 0000000..84838fe Binary files /dev/null and b/resource/flash3/images/items/0036.png differ diff --git a/resource/flash3/images/items/0037.png b/resource/flash3/images/items/0037.png new file mode 100755 index 0000000..87f391d Binary files /dev/null and b/resource/flash3/images/items/0037.png differ diff --git a/resource/flash3/images/items/0038.png b/resource/flash3/images/items/0038.png new file mode 100755 index 0000000..35bff62 Binary files /dev/null and b/resource/flash3/images/items/0038.png differ diff --git a/resource/flash3/images/items/0039.png b/resource/flash3/images/items/0039.png new file mode 100755 index 0000000..3b3f36c Binary files /dev/null and b/resource/flash3/images/items/0039.png differ diff --git a/resource/flash3/images/items/0040.png b/resource/flash3/images/items/0040.png new file mode 100755 index 0000000..36d2a17 Binary files /dev/null and b/resource/flash3/images/items/0040.png differ diff --git a/resource/flash3/images/items/0041.png b/resource/flash3/images/items/0041.png new file mode 100755 index 0000000..48c1411 Binary files /dev/null and b/resource/flash3/images/items/0041.png differ diff --git a/resource/flash3/images/items/0042.png b/resource/flash3/images/items/0042.png new file mode 100755 index 0000000..6e2b512 Binary files /dev/null and b/resource/flash3/images/items/0042.png differ diff --git a/resource/flash3/images/items/0043.png b/resource/flash3/images/items/0043.png new file mode 100755 index 0000000..394e5f6 Binary files /dev/null and b/resource/flash3/images/items/0043.png differ diff --git a/resource/flash3/images/items/0044.png b/resource/flash3/images/items/0044.png new file mode 100755 index 0000000..032cf45 Binary files /dev/null and b/resource/flash3/images/items/0044.png differ diff --git a/resource/flash3/images/items/0045.png b/resource/flash3/images/items/0045.png new file mode 100755 index 0000000..91d6c53 Binary files /dev/null and b/resource/flash3/images/items/0045.png differ diff --git a/resource/flash3/images/items/0046.png b/resource/flash3/images/items/0046.png new file mode 100755 index 0000000..3af437e Binary files /dev/null and b/resource/flash3/images/items/0046.png differ diff --git a/resource/flash3/images/items/0047.png b/resource/flash3/images/items/0047.png new file mode 100755 index 0000000..d99468d Binary files /dev/null and b/resource/flash3/images/items/0047.png differ diff --git a/resource/flash3/images/items/0048.png b/resource/flash3/images/items/0048.png new file mode 100755 index 0000000..f63ebf8 Binary files /dev/null and b/resource/flash3/images/items/0048.png differ diff --git a/resource/flash3/images/items/0049.png b/resource/flash3/images/items/0049.png new file mode 100755 index 0000000..87df325 Binary files /dev/null and b/resource/flash3/images/items/0049.png differ diff --git a/resource/flash3/images/items/0050.png b/resource/flash3/images/items/0050.png new file mode 100755 index 0000000..689f4e7 Binary files /dev/null and b/resource/flash3/images/items/0050.png differ diff --git a/resource/flash3/images/items/0051.png b/resource/flash3/images/items/0051.png new file mode 100755 index 0000000..feeceb8 Binary files /dev/null and b/resource/flash3/images/items/0051.png differ diff --git a/resource/flash3/images/items/0052.png b/resource/flash3/images/items/0052.png new file mode 100755 index 0000000..07098e2 Binary files /dev/null and b/resource/flash3/images/items/0052.png differ diff --git a/resource/flash3/images/items/0053.png b/resource/flash3/images/items/0053.png new file mode 100755 index 0000000..ff2b8bf Binary files /dev/null and b/resource/flash3/images/items/0053.png differ diff --git a/resource/flash3/images/items/0054.png b/resource/flash3/images/items/0054.png new file mode 100755 index 0000000..b094b3e Binary files /dev/null and b/resource/flash3/images/items/0054.png differ diff --git a/resource/flash3/images/items/0055.png b/resource/flash3/images/items/0055.png new file mode 100755 index 0000000..5019e4b Binary files /dev/null and b/resource/flash3/images/items/0055.png differ diff --git a/resource/flash3/images/items/0056.png b/resource/flash3/images/items/0056.png new file mode 100755 index 0000000..5da1063 Binary files /dev/null and b/resource/flash3/images/items/0056.png differ diff --git a/resource/flash3/images/items/0057.png b/resource/flash3/images/items/0057.png new file mode 100755 index 0000000..ca8769e Binary files /dev/null and b/resource/flash3/images/items/0057.png differ diff --git a/resource/flash3/images/items/0058.png b/resource/flash3/images/items/0058.png new file mode 100755 index 0000000..d2b7b00 Binary files /dev/null and b/resource/flash3/images/items/0058.png differ diff --git a/resource/flash3/images/items/0059.png b/resource/flash3/images/items/0059.png new file mode 100755 index 0000000..db03ac4 Binary files /dev/null and b/resource/flash3/images/items/0059.png differ diff --git a/resource/flash3/images/items/0060.png b/resource/flash3/images/items/0060.png new file mode 100755 index 0000000..2ee95e9 Binary files /dev/null and b/resource/flash3/images/items/0060.png differ diff --git a/resource/flash3/images/items/0061.png b/resource/flash3/images/items/0061.png new file mode 100755 index 0000000..b8e80d5 Binary files /dev/null and b/resource/flash3/images/items/0061.png differ diff --git a/resource/flash3/images/items/0062.png b/resource/flash3/images/items/0062.png new file mode 100755 index 0000000..4eeb859 Binary files /dev/null and b/resource/flash3/images/items/0062.png differ diff --git a/resource/flash3/images/items/0063.png b/resource/flash3/images/items/0063.png new file mode 100755 index 0000000..855afd4 Binary files /dev/null and b/resource/flash3/images/items/0063.png differ diff --git a/resource/flash3/images/items/0064.png b/resource/flash3/images/items/0064.png new file mode 100755 index 0000000..c48b384 Binary files /dev/null and b/resource/flash3/images/items/0064.png differ diff --git a/resource/flash3/images/items/0065.png b/resource/flash3/images/items/0065.png new file mode 100755 index 0000000..57fb674 Binary files /dev/null and b/resource/flash3/images/items/0065.png differ diff --git a/resource/flash3/images/items/0066.png b/resource/flash3/images/items/0066.png new file mode 100755 index 0000000..cb2f96c Binary files /dev/null and b/resource/flash3/images/items/0066.png differ diff --git a/resource/flash3/images/items/0067.png b/resource/flash3/images/items/0067.png new file mode 100755 index 0000000..b4d248a Binary files /dev/null and b/resource/flash3/images/items/0067.png differ diff --git a/resource/flash3/images/items/0068.png b/resource/flash3/images/items/0068.png new file mode 100755 index 0000000..6e74f69 Binary files /dev/null and b/resource/flash3/images/items/0068.png differ diff --git a/resource/flash3/images/items/0069.png b/resource/flash3/images/items/0069.png new file mode 100755 index 0000000..1e59864 Binary files /dev/null and b/resource/flash3/images/items/0069.png differ diff --git a/resource/flash3/images/items/0070.png b/resource/flash3/images/items/0070.png new file mode 100755 index 0000000..6d5f53a Binary files /dev/null and b/resource/flash3/images/items/0070.png differ diff --git a/resource/flash3/images/items/0071.png b/resource/flash3/images/items/0071.png new file mode 100755 index 0000000..39c26ea Binary files /dev/null and b/resource/flash3/images/items/0071.png differ diff --git a/resource/flash3/images/items/0072.png b/resource/flash3/images/items/0072.png new file mode 100755 index 0000000..1597c70 Binary files /dev/null and b/resource/flash3/images/items/0072.png differ diff --git a/resource/flash3/images/items/0073.png b/resource/flash3/images/items/0073.png new file mode 100755 index 0000000..5e37200 Binary files /dev/null and b/resource/flash3/images/items/0073.png differ diff --git a/resource/flash3/images/items/0074.png b/resource/flash3/images/items/0074.png new file mode 100755 index 0000000..377a913 Binary files /dev/null and b/resource/flash3/images/items/0074.png differ diff --git a/resource/flash3/images/items/0075.png b/resource/flash3/images/items/0075.png new file mode 100755 index 0000000..5292a86 Binary files /dev/null and b/resource/flash3/images/items/0075.png differ diff --git a/resource/flash3/images/items/0076.png b/resource/flash3/images/items/0076.png new file mode 100755 index 0000000..e568ed8 Binary files /dev/null and b/resource/flash3/images/items/0076.png differ diff --git a/resource/flash3/images/items/0077.png b/resource/flash3/images/items/0077.png new file mode 100755 index 0000000..d28649e Binary files /dev/null and b/resource/flash3/images/items/0077.png differ diff --git a/resource/flash3/images/items/0078.png b/resource/flash3/images/items/0078.png new file mode 100755 index 0000000..ca25984 Binary files /dev/null and b/resource/flash3/images/items/0078.png differ diff --git a/resource/flash3/images/items/0079.png b/resource/flash3/images/items/0079.png new file mode 100755 index 0000000..e059987 Binary files /dev/null and b/resource/flash3/images/items/0079.png differ diff --git a/resource/flash3/images/items/0080.png b/resource/flash3/images/items/0080.png new file mode 100755 index 0000000..59b2082 Binary files /dev/null and b/resource/flash3/images/items/0080.png differ diff --git a/resource/flash3/images/items/0081.png b/resource/flash3/images/items/0081.png new file mode 100755 index 0000000..07d159c Binary files /dev/null and b/resource/flash3/images/items/0081.png differ diff --git a/resource/flash3/images/items/0082.png b/resource/flash3/images/items/0082.png new file mode 100755 index 0000000..6fd9773 Binary files /dev/null and b/resource/flash3/images/items/0082.png differ diff --git a/resource/flash3/images/items/0083.png b/resource/flash3/images/items/0083.png new file mode 100755 index 0000000..47c5053 Binary files /dev/null and b/resource/flash3/images/items/0083.png differ diff --git a/resource/flash3/images/items/0084.png b/resource/flash3/images/items/0084.png new file mode 100755 index 0000000..1fcdde4 Binary files /dev/null and b/resource/flash3/images/items/0084.png differ diff --git a/resource/flash3/images/items/0085.png b/resource/flash3/images/items/0085.png new file mode 100755 index 0000000..715334c Binary files /dev/null and b/resource/flash3/images/items/0085.png differ diff --git a/resource/flash3/images/items/0086.png b/resource/flash3/images/items/0086.png new file mode 100755 index 0000000..6b7a2ff Binary files /dev/null and b/resource/flash3/images/items/0086.png differ diff --git a/resource/flash3/images/items/0088.png b/resource/flash3/images/items/0088.png new file mode 100755 index 0000000..58e85fb Binary files /dev/null and b/resource/flash3/images/items/0088.png differ diff --git a/resource/flash3/images/items/0089.png b/resource/flash3/images/items/0089.png new file mode 100755 index 0000000..ffe822e Binary files /dev/null and b/resource/flash3/images/items/0089.png differ diff --git a/resource/flash3/images/items/0090.png b/resource/flash3/images/items/0090.png new file mode 100755 index 0000000..b5ecee4 Binary files /dev/null and b/resource/flash3/images/items/0090.png differ diff --git a/resource/flash3/images/items/0091.png b/resource/flash3/images/items/0091.png new file mode 100755 index 0000000..9c52528 Binary files /dev/null and b/resource/flash3/images/items/0091.png differ diff --git a/resource/flash3/images/items/0092.png b/resource/flash3/images/items/0092.png new file mode 100755 index 0000000..0a3a608 Binary files /dev/null and b/resource/flash3/images/items/0092.png differ diff --git a/resource/flash3/images/items/0093.png b/resource/flash3/images/items/0093.png new file mode 100755 index 0000000..f7e252f Binary files /dev/null and b/resource/flash3/images/items/0093.png differ diff --git a/resource/flash3/images/items/0094.png b/resource/flash3/images/items/0094.png new file mode 100755 index 0000000..c553a57 Binary files /dev/null and b/resource/flash3/images/items/0094.png differ diff --git a/resource/flash3/images/items/0095.png b/resource/flash3/images/items/0095.png new file mode 100755 index 0000000..c7b0244 Binary files /dev/null and b/resource/flash3/images/items/0095.png differ diff --git a/resource/flash3/images/items/0096.png b/resource/flash3/images/items/0096.png new file mode 100755 index 0000000..9509566 Binary files /dev/null and b/resource/flash3/images/items/0096.png differ diff --git a/resource/flash3/images/items/0097.png b/resource/flash3/images/items/0097.png new file mode 100755 index 0000000..95582fb Binary files /dev/null and b/resource/flash3/images/items/0097.png differ diff --git a/resource/flash3/images/items/0099.png b/resource/flash3/images/items/0099.png new file mode 100755 index 0000000..525501e Binary files /dev/null and b/resource/flash3/images/items/0099.png differ diff --git a/resource/flash3/images/items/0103.png b/resource/flash3/images/items/0103.png new file mode 100755 index 0000000..88a22af Binary files /dev/null and b/resource/flash3/images/items/0103.png differ diff --git a/resource/flash3/images/items/0104.png b/resource/flash3/images/items/0104.png new file mode 100755 index 0000000..7583af6 Binary files /dev/null and b/resource/flash3/images/items/0104.png differ diff --git a/resource/flash3/images/items/0105.png b/resource/flash3/images/items/0105.png new file mode 100755 index 0000000..e3e8821 Binary files /dev/null and b/resource/flash3/images/items/0105.png differ diff --git a/resource/flash3/images/items/0106.png b/resource/flash3/images/items/0106.png new file mode 100755 index 0000000..e2e075b Binary files /dev/null and b/resource/flash3/images/items/0106.png differ diff --git a/resource/flash3/images/items/0107.png b/resource/flash3/images/items/0107.png new file mode 100755 index 0000000..928f311 Binary files /dev/null and b/resource/flash3/images/items/0107.png differ diff --git a/resource/flash3/images/items/0108.png b/resource/flash3/images/items/0108.png new file mode 100755 index 0000000..0cd3aae Binary files /dev/null and b/resource/flash3/images/items/0108.png differ diff --git a/resource/flash3/images/items/0109.png b/resource/flash3/images/items/0109.png new file mode 100755 index 0000000..467e242 Binary files /dev/null and b/resource/flash3/images/items/0109.png differ diff --git a/resource/flash3/images/items/0110.png b/resource/flash3/images/items/0110.png new file mode 100755 index 0000000..bb06d88 Binary files /dev/null and b/resource/flash3/images/items/0110.png differ diff --git a/resource/flash3/images/items/0111.png b/resource/flash3/images/items/0111.png new file mode 100755 index 0000000..033c3e5 Binary files /dev/null and b/resource/flash3/images/items/0111.png differ diff --git a/resource/flash3/images/items/0113.png b/resource/flash3/images/items/0113.png new file mode 100755 index 0000000..9003a21 Binary files /dev/null and b/resource/flash3/images/items/0113.png differ diff --git a/resource/flash3/images/items/0114.png b/resource/flash3/images/items/0114.png new file mode 100755 index 0000000..2da755c Binary files /dev/null and b/resource/flash3/images/items/0114.png differ diff --git a/resource/flash3/images/items/0115.png b/resource/flash3/images/items/0115.png new file mode 100755 index 0000000..8e2e8ff Binary files /dev/null and b/resource/flash3/images/items/0115.png differ diff --git a/resource/flash3/images/items/0125.png b/resource/flash3/images/items/0125.png new file mode 100755 index 0000000..0121fdf Binary files /dev/null and b/resource/flash3/images/items/0125.png differ diff --git a/resource/flash3/images/items/0132.png b/resource/flash3/images/items/0132.png new file mode 100755 index 0000000..30fccf6 Binary files /dev/null and b/resource/flash3/images/items/0132.png differ diff --git a/resource/flash3/images/items/0135.png b/resource/flash3/images/items/0135.png new file mode 100755 index 0000000..2f74f3b Binary files /dev/null and b/resource/flash3/images/items/0135.png differ diff --git a/resource/flash3/images/items/0145.png b/resource/flash3/images/items/0145.png new file mode 100755 index 0000000..56e52bb Binary files /dev/null and b/resource/flash3/images/items/0145.png differ diff --git a/resource/flash3/images/items/0168.png b/resource/flash3/images/items/0168.png new file mode 100755 index 0000000..abc743d Binary files /dev/null and b/resource/flash3/images/items/0168.png differ diff --git a/resource/flash3/images/items/0169.png b/resource/flash3/images/items/0169.png new file mode 100755 index 0000000..07a7f20 Binary files /dev/null and b/resource/flash3/images/items/0169.png differ diff --git a/resource/flash3/images/items/1001.png b/resource/flash3/images/items/1001.png new file mode 100755 index 0000000..d58a8cd Binary files /dev/null and b/resource/flash3/images/items/1001.png differ diff --git a/resource/flash3/images/items/1002.png b/resource/flash3/images/items/1002.png new file mode 100755 index 0000000..2a7cf69 Binary files /dev/null and b/resource/flash3/images/items/1002.png differ diff --git a/resource/flash3/images/items/1003.png b/resource/flash3/images/items/1003.png new file mode 100755 index 0000000..66b9ff4 Binary files /dev/null and b/resource/flash3/images/items/1003.png differ diff --git a/resource/flash3/images/items/1004.png b/resource/flash3/images/items/1004.png new file mode 100755 index 0000000..d56d54f Binary files /dev/null and b/resource/flash3/images/items/1004.png differ diff --git a/resource/flash3/images/items/1005.png b/resource/flash3/images/items/1005.png new file mode 100755 index 0000000..dcbb9fb Binary files /dev/null and b/resource/flash3/images/items/1005.png differ diff --git a/resource/flash3/images/items/1006.png b/resource/flash3/images/items/1006.png new file mode 100755 index 0000000..870b941 Binary files /dev/null and b/resource/flash3/images/items/1006.png differ diff --git a/resource/flash3/images/items/2001.png b/resource/flash3/images/items/2001.png new file mode 100755 index 0000000..0e538d6 Binary files /dev/null and b/resource/flash3/images/items/2001.png differ diff --git a/resource/flash3/images/items/2002.png b/resource/flash3/images/items/2002.png new file mode 100755 index 0000000..acf7c0f Binary files /dev/null and b/resource/flash3/images/items/2002.png differ diff --git a/resource/flash3/images/items/2003.png b/resource/flash3/images/items/2003.png new file mode 100755 index 0000000..16e4cff Binary files /dev/null and b/resource/flash3/images/items/2003.png differ diff --git a/resource/flash3/images/items/2004.png b/resource/flash3/images/items/2004.png new file mode 100755 index 0000000..36914e0 Binary files /dev/null and b/resource/flash3/images/items/2004.png differ diff --git a/resource/flash3/images/items/2005.png b/resource/flash3/images/items/2005.png new file mode 100755 index 0000000..7dc8692 Binary files /dev/null and b/resource/flash3/images/items/2005.png differ diff --git a/resource/flash3/images/items/2006.png b/resource/flash3/images/items/2006.png new file mode 100755 index 0000000..a891219 Binary files /dev/null and b/resource/flash3/images/items/2006.png differ diff --git a/resource/flash3/images/items/2007.png b/resource/flash3/images/items/2007.png new file mode 100755 index 0000000..07e59a9 Binary files /dev/null and b/resource/flash3/images/items/2007.png differ diff --git a/resource/flash3/images/items/2008.png b/resource/flash3/images/items/2008.png new file mode 100755 index 0000000..b30c05e Binary files /dev/null and b/resource/flash3/images/items/2008.png differ diff --git a/resource/flash3/images/items/2009.png b/resource/flash3/images/items/2009.png new file mode 100755 index 0000000..ebf005c Binary files /dev/null and b/resource/flash3/images/items/2009.png differ diff --git a/resource/flash3/images/items/2010.png b/resource/flash3/images/items/2010.png new file mode 100755 index 0000000..e2df233 Binary files /dev/null and b/resource/flash3/images/items/2010.png differ diff --git a/resource/flash3/images/items/2011.png b/resource/flash3/images/items/2011.png new file mode 100755 index 0000000..cd7012b Binary files /dev/null and b/resource/flash3/images/items/2011.png differ diff --git a/resource/flash3/images/items/2012.png b/resource/flash3/images/items/2012.png new file mode 100755 index 0000000..dad8cd0 Binary files /dev/null and b/resource/flash3/images/items/2012.png differ diff --git a/resource/flash3/images/items/2013.png b/resource/flash3/images/items/2013.png new file mode 100755 index 0000000..0b7bfee Binary files /dev/null and b/resource/flash3/images/items/2013.png differ diff --git a/resource/flash3/images/items/2014.png b/resource/flash3/images/items/2014.png new file mode 100755 index 0000000..ea5a3df Binary files /dev/null and b/resource/flash3/images/items/2014.png differ diff --git a/resource/flash3/images/items/2015.png b/resource/flash3/images/items/2015.png new file mode 100755 index 0000000..b981e6e Binary files /dev/null and b/resource/flash3/images/items/2015.png differ diff --git a/resource/flash3/images/items/2016.png b/resource/flash3/images/items/2016.png new file mode 100755 index 0000000..65e15b4 Binary files /dev/null and b/resource/flash3/images/items/2016.png differ diff --git a/resource/flash3/images/items/2017.png b/resource/flash3/images/items/2017.png new file mode 100755 index 0000000..2431905 Binary files /dev/null and b/resource/flash3/images/items/2017.png differ diff --git a/resource/flash3/images/items/2018.png b/resource/flash3/images/items/2018.png new file mode 100755 index 0000000..4b0c23f Binary files /dev/null and b/resource/flash3/images/items/2018.png differ diff --git a/resource/flash3/images/items/2019.png b/resource/flash3/images/items/2019.png new file mode 100755 index 0000000..a517d01 Binary files /dev/null and b/resource/flash3/images/items/2019.png differ diff --git a/resource/flash3/images/items/2020.png b/resource/flash3/images/items/2020.png new file mode 100755 index 0000000..a72a31c Binary files /dev/null and b/resource/flash3/images/items/2020.png differ diff --git a/resource/flash3/images/items/2021.png b/resource/flash3/images/items/2021.png new file mode 100755 index 0000000..d7f38fe Binary files /dev/null and b/resource/flash3/images/items/2021.png differ diff --git a/resource/flash3/images/items/2022.png b/resource/flash3/images/items/2022.png new file mode 100755 index 0000000..8fc22f7 Binary files /dev/null and b/resource/flash3/images/items/2022.png differ diff --git a/resource/flash3/images/items/3011.png b/resource/flash3/images/items/3011.png new file mode 100755 index 0000000..9fd4b86 Binary files /dev/null and b/resource/flash3/images/items/3011.png differ diff --git a/resource/flash3/images/items/3012.png b/resource/flash3/images/items/3012.png new file mode 100755 index 0000000..e70fafc Binary files /dev/null and b/resource/flash3/images/items/3012.png differ diff --git a/resource/flash3/images/items/3013.png b/resource/flash3/images/items/3013.png new file mode 100755 index 0000000..96ecd77 Binary files /dev/null and b/resource/flash3/images/items/3013.png differ diff --git a/resource/flash3/images/items/3014.png b/resource/flash3/images/items/3014.png new file mode 100755 index 0000000..9e8ee3b Binary files /dev/null and b/resource/flash3/images/items/3014.png differ diff --git a/resource/flash3/images/items/3015.png b/resource/flash3/images/items/3015.png new file mode 100755 index 0000000..6ae9b73 Binary files /dev/null and b/resource/flash3/images/items/3015.png differ diff --git a/resource/flash3/images/items/3016.png b/resource/flash3/images/items/3016.png new file mode 100755 index 0000000..580456e Binary files /dev/null and b/resource/flash3/images/items/3016.png differ diff --git a/resource/flash3/images/items/3017.png b/resource/flash3/images/items/3017.png new file mode 100755 index 0000000..3a02cd9 Binary files /dev/null and b/resource/flash3/images/items/3017.png differ diff --git a/resource/flash3/images/items/3018.png b/resource/flash3/images/items/3018.png new file mode 100755 index 0000000..3ff67d2 Binary files /dev/null and b/resource/flash3/images/items/3018.png differ diff --git a/resource/flash3/images/items/3019.png b/resource/flash3/images/items/3019.png new file mode 100755 index 0000000..6d46b70 Binary files /dev/null and b/resource/flash3/images/items/3019.png differ diff --git a/resource/flash3/images/items/3020.png b/resource/flash3/images/items/3020.png new file mode 100755 index 0000000..b60200b Binary files /dev/null and b/resource/flash3/images/items/3020.png differ diff --git a/resource/flash3/images/items/3021.png b/resource/flash3/images/items/3021.png new file mode 100755 index 0000000..178d045 Binary files /dev/null and b/resource/flash3/images/items/3021.png differ diff --git a/resource/flash3/images/items/3022.png b/resource/flash3/images/items/3022.png new file mode 100755 index 0000000..a367079 Binary files /dev/null and b/resource/flash3/images/items/3022.png differ diff --git a/resource/flash3/images/items/3023.png b/resource/flash3/images/items/3023.png new file mode 100755 index 0000000..bd3fd0f Binary files /dev/null and b/resource/flash3/images/items/3023.png differ diff --git a/resource/flash3/images/items/3024.png b/resource/flash3/images/items/3024.png new file mode 100755 index 0000000..594fc07 Binary files /dev/null and b/resource/flash3/images/items/3024.png differ diff --git a/resource/flash3/images/items/3025.png b/resource/flash3/images/items/3025.png new file mode 100755 index 0000000..6dd6bed Binary files /dev/null and b/resource/flash3/images/items/3025.png differ diff --git a/resource/flash3/images/items/3026.png b/resource/flash3/images/items/3026.png new file mode 100755 index 0000000..615ba0b Binary files /dev/null and b/resource/flash3/images/items/3026.png differ diff --git a/resource/flash3/images/items/3027.png b/resource/flash3/images/items/3027.png new file mode 100755 index 0000000..baa09d4 Binary files /dev/null and b/resource/flash3/images/items/3027.png differ diff --git a/resource/flash3/images/items/3028.png b/resource/flash3/images/items/3028.png new file mode 100755 index 0000000..a11a2da Binary files /dev/null and b/resource/flash3/images/items/3028.png differ diff --git a/resource/flash3/images/items/3029.png b/resource/flash3/images/items/3029.png new file mode 100755 index 0000000..1a10ced Binary files /dev/null and b/resource/flash3/images/items/3029.png differ diff --git a/resource/flash3/images/items/3030.png b/resource/flash3/images/items/3030.png new file mode 100755 index 0000000..689ec7c Binary files /dev/null and b/resource/flash3/images/items/3030.png differ diff --git a/resource/flash3/images/items/3031.png b/resource/flash3/images/items/3031.png new file mode 100755 index 0000000..f16f33e Binary files /dev/null and b/resource/flash3/images/items/3031.png differ diff --git a/resource/flash3/images/items/3050.png b/resource/flash3/images/items/3050.png new file mode 100755 index 0000000..2de8ee3 Binary files /dev/null and b/resource/flash3/images/items/3050.png differ diff --git a/resource/flash3/images/items/3154.png b/resource/flash3/images/items/3154.png new file mode 100755 index 0000000..e446e43 Binary files /dev/null and b/resource/flash3/images/items/3154.png differ diff --git a/resource/flash3/images/items/chest_01.png b/resource/flash3/images/items/chest_01.png new file mode 100755 index 0000000..7c68f4a Binary files /dev/null and b/resource/flash3/images/items/chest_01.png differ diff --git a/resource/flash3/images/items/chest_02.png b/resource/flash3/images/items/chest_02.png new file mode 100755 index 0000000..7df9528 Binary files /dev/null and b/resource/flash3/images/items/chest_02.png differ diff --git a/resource/flash3/images/items/chest_03.png b/resource/flash3/images/items/chest_03.png new file mode 100755 index 0000000..f52641a Binary files /dev/null and b/resource/flash3/images/items/chest_03.png differ diff --git a/resource/flash3/images/items/custom/2019_consumables_bundle.png b/resource/flash3/images/items/custom/2019_consumables_bundle.png new file mode 100755 index 0000000..ba4d3c6 Binary files /dev/null and b/resource/flash3/images/items/custom/2019_consumables_bundle.png differ diff --git a/resource/flash3/images/items/custom/frosthaven_consumables_bundle.png b/resource/flash3/images/items/custom/frosthaven_consumables_bundle.png new file mode 100755 index 0000000..d6b519f Binary files /dev/null and b/resource/flash3/images/items/custom/frosthaven_consumables_bundle.png differ diff --git a/resource/flash3/images/items/custom/seasonal_decorate_tree.png b/resource/flash3/images/items/custom/seasonal_decorate_tree.png new file mode 100755 index 0000000..c278577 Binary files /dev/null and b/resource/flash3/images/items/custom/seasonal_decorate_tree.png differ diff --git a/resource/flash3/images/items/custom/seasonal_festive_firework.png b/resource/flash3/images/items/custom/seasonal_festive_firework.png new file mode 100755 index 0000000..15f42f6 Binary files /dev/null and b/resource/flash3/images/items/custom/seasonal_festive_firework.png differ diff --git a/resource/flash3/images/items/custom/seasonal_firecrackers.png b/resource/flash3/images/items/custom/seasonal_firecrackers.png new file mode 100755 index 0000000..50e8e6d Binary files /dev/null and b/resource/flash3/images/items/custom/seasonal_firecrackers.png differ diff --git a/resource/flash3/images/items/custom/seasonal_summon_cny_balloon.png b/resource/flash3/images/items/custom/seasonal_summon_cny_balloon.png new file mode 100755 index 0000000..f9c76b5 Binary files /dev/null and b/resource/flash3/images/items/custom/seasonal_summon_cny_balloon.png differ diff --git a/resource/flash3/images/items/custom/seasonal_summon_cny_tree.png b/resource/flash3/images/items/custom/seasonal_summon_cny_tree.png new file mode 100755 index 0000000..381112e Binary files /dev/null and b/resource/flash3/images/items/custom/seasonal_summon_cny_tree.png differ diff --git a/resource/flash3/images/items/custom/seasonal_summon_dragon.png b/resource/flash3/images/items/custom/seasonal_summon_dragon.png new file mode 100755 index 0000000..69db85b Binary files /dev/null and b/resource/flash3/images/items/custom/seasonal_summon_dragon.png differ diff --git a/resource/flash3/images/items/custom/seasonal_summon_snowman.png b/resource/flash3/images/items/custom/seasonal_summon_snowman.png new file mode 100755 index 0000000..1b4ce6c Binary files /dev/null and b/resource/flash3/images/items/custom/seasonal_summon_snowman.png differ diff --git a/resource/flash3/images/items/custom/seasonal_throw_snowball.png b/resource/flash3/images/items/custom/seasonal_throw_snowball.png new file mode 100755 index 0000000..b5c92d1 Binary files /dev/null and b/resource/flash3/images/items/custom/seasonal_throw_snowball.png differ diff --git a/resource/flash3/images/items/custom/seasonal_ti10_high_five.png b/resource/flash3/images/items/custom/seasonal_ti10_high_five.png new file mode 100755 index 0000000..2081d29 Binary files /dev/null and b/resource/flash3/images/items/custom/seasonal_ti10_high_five.png differ diff --git a/resource/flash3/images/items/custom/seasonal_ti10_soccer_ball.png b/resource/flash3/images/items/custom/seasonal_ti10_soccer_ball.png new file mode 100755 index 0000000..31c8f10 Binary files /dev/null and b/resource/flash3/images/items/custom/seasonal_ti10_soccer_ball.png differ diff --git a/resource/flash3/images/items/custom/seasonal_ti9_instruments.png b/resource/flash3/images/items/custom/seasonal_ti9_instruments.png new file mode 100755 index 0000000..f24d660 Binary files /dev/null and b/resource/flash3/images/items/custom/seasonal_ti9_instruments.png differ diff --git a/resource/flash3/images/items/ex_rumia.png b/resource/flash3/images/items/ex_rumia.png new file mode 100755 index 0000000..c03c891 Binary files /dev/null and b/resource/flash3/images/items/ex_rumia.png differ diff --git a/resource/flash3/images/items/fairyflower.png b/resource/flash3/images/items/fairyflower.png new file mode 100755 index 0000000..678ae34 Binary files /dev/null and b/resource/flash3/images/items/fairyflower.png differ diff --git a/resource/flash3/images/items/key_01.png b/resource/flash3/images/items/key_01.png new file mode 100755 index 0000000..5f4635d Binary files /dev/null and b/resource/flash3/images/items/key_01.png differ diff --git a/resource/flash3/images/items/nian.png b/resource/flash3/images/items/nian.png new file mode 100755 index 0000000..c46bdfe Binary files /dev/null and b/resource/flash3/images/items/nian.png differ diff --git a/resource/flash3/images/items/poweover.png b/resource/flash3/images/items/poweover.png new file mode 100755 index 0000000..c3bf9db Binary files /dev/null and b/resource/flash3/images/items/poweover.png differ diff --git a/resource/flash3/images/items/tianjian.png b/resource/flash3/images/items/tianjian.png new file mode 100755 index 0000000..390b8bb Binary files /dev/null and b/resource/flash3/images/items/tianjian.png differ diff --git a/resource/flash3/images/items/tianyu.png b/resource/flash3/images/items/tianyu.png new file mode 100755 index 0000000..a16e6a1 Binary files /dev/null and b/resource/flash3/images/items/tianyu.png differ diff --git a/resource/flash3/images/items/xuanyuan.png b/resource/flash3/images/items/xuanyuan.png new file mode 100755 index 0000000..eec5534 Binary files /dev/null and b/resource/flash3/images/items/xuanyuan.png differ diff --git a/resource/flash3/images/items/yuhun.png b/resource/flash3/images/items/yuhun.png new file mode 100755 index 0000000..9c33abb Binary files /dev/null and b/resource/flash3/images/items/yuhun.png differ diff --git a/resource/flash3/images/miniheroes/juggernaut.png b/resource/flash3/images/miniheroes/juggernaut.png new file mode 100755 index 0000000..9ee3984 Binary files /dev/null and b/resource/flash3/images/miniheroes/juggernaut.png differ diff --git a/resource/flash3/images/miniheroes/lina.png b/resource/flash3/images/miniheroes/lina.png new file mode 100755 index 0000000..259e796 Binary files /dev/null and b/resource/flash3/images/miniheroes/lina.png differ diff --git a/resource/flash3/images/spellicons/ability_collection_power.png b/resource/flash3/images/spellicons/ability_collection_power.png new file mode 100755 index 0000000..12c39e1 Binary files /dev/null and b/resource/flash3/images/spellicons/ability_collection_power.png differ diff --git a/resource/flash3/images/spellicons/down.png b/resource/flash3/images/spellicons/down.png new file mode 100755 index 0000000..cef8b17 Binary files /dev/null and b/resource/flash3/images/spellicons/down.png differ diff --git a/resource/flash3/images/spellicons/equal.png b/resource/flash3/images/spellicons/equal.png new file mode 100755 index 0000000..00c8999 Binary files /dev/null and b/resource/flash3/images/spellicons/equal.png differ diff --git a/resource/flash3/images/spellicons/gold.png b/resource/flash3/images/spellicons/gold.png new file mode 100755 index 0000000..146b469 Binary files /dev/null and b/resource/flash3/images/spellicons/gold.png differ diff --git a/resource/flash3/images/spellicons/item_2011.png b/resource/flash3/images/spellicons/item_2011.png new file mode 100755 index 0000000..fdb3e2a Binary files /dev/null and b/resource/flash3/images/spellicons/item_2011.png differ diff --git a/resource/flash3/images/spellicons/item_3011.png b/resource/flash3/images/spellicons/item_3011.png new file mode 100755 index 0000000..aebe6d7 Binary files /dev/null and b/resource/flash3/images/spellicons/item_3011.png differ diff --git a/resource/flash3/images/spellicons/item_3012.png b/resource/flash3/images/spellicons/item_3012.png new file mode 100755 index 0000000..b019a03 Binary files /dev/null and b/resource/flash3/images/spellicons/item_3012.png differ diff --git a/resource/flash3/images/spellicons/item_3013.png b/resource/flash3/images/spellicons/item_3013.png new file mode 100755 index 0000000..292c429 Binary files /dev/null and b/resource/flash3/images/spellicons/item_3013.png differ diff --git a/resource/flash3/images/spellicons/item_3014.png b/resource/flash3/images/spellicons/item_3014.png new file mode 100755 index 0000000..af1cb2b Binary files /dev/null and b/resource/flash3/images/spellicons/item_3014.png differ diff --git a/resource/flash3/images/spellicons/item_3015.png b/resource/flash3/images/spellicons/item_3015.png new file mode 100755 index 0000000..07febce Binary files /dev/null and b/resource/flash3/images/spellicons/item_3015.png differ diff --git a/resource/flash3/images/spellicons/item_3016.png b/resource/flash3/images/spellicons/item_3016.png new file mode 100755 index 0000000..8219a2e Binary files /dev/null and b/resource/flash3/images/spellicons/item_3016.png differ diff --git a/resource/flash3/images/spellicons/item_3017.png b/resource/flash3/images/spellicons/item_3017.png new file mode 100755 index 0000000..f3b59a7 Binary files /dev/null and b/resource/flash3/images/spellicons/item_3017.png differ diff --git a/resource/flash3/images/spellicons/item_3018.png b/resource/flash3/images/spellicons/item_3018.png new file mode 100755 index 0000000..7433c56 Binary files /dev/null and b/resource/flash3/images/spellicons/item_3018.png differ diff --git a/resource/flash3/images/spellicons/item_3019.png b/resource/flash3/images/spellicons/item_3019.png new file mode 100755 index 0000000..27f080e Binary files /dev/null and b/resource/flash3/images/spellicons/item_3019.png differ diff --git a/resource/flash3/images/spellicons/item_3020.png b/resource/flash3/images/spellicons/item_3020.png new file mode 100755 index 0000000..ab9bd1a Binary files /dev/null and b/resource/flash3/images/spellicons/item_3020.png differ diff --git a/resource/flash3/images/spellicons/item_3021.png b/resource/flash3/images/spellicons/item_3021.png new file mode 100755 index 0000000..92114bf Binary files /dev/null and b/resource/flash3/images/spellicons/item_3021.png differ diff --git a/resource/flash3/images/spellicons/item_3022.png b/resource/flash3/images/spellicons/item_3022.png new file mode 100755 index 0000000..146b469 Binary files /dev/null and b/resource/flash3/images/spellicons/item_3022.png differ diff --git a/resource/flash3/images/spellicons/item_3023.png b/resource/flash3/images/spellicons/item_3023.png new file mode 100755 index 0000000..22b20ee Binary files /dev/null and b/resource/flash3/images/spellicons/item_3023.png differ diff --git a/resource/flash3/images/spellicons/item_3024.png b/resource/flash3/images/spellicons/item_3024.png new file mode 100755 index 0000000..ed93a02 Binary files /dev/null and b/resource/flash3/images/spellicons/item_3024.png differ diff --git a/resource/flash3/images/spellicons/item_3025.png b/resource/flash3/images/spellicons/item_3025.png new file mode 100755 index 0000000..ec2c2e1 Binary files /dev/null and b/resource/flash3/images/spellicons/item_3025.png differ diff --git a/resource/flash3/images/spellicons/item_3026.png b/resource/flash3/images/spellicons/item_3026.png new file mode 100755 index 0000000..75e9262 Binary files /dev/null and b/resource/flash3/images/spellicons/item_3026.png differ diff --git a/resource/flash3/images/spellicons/item_3027.png b/resource/flash3/images/spellicons/item_3027.png new file mode 100755 index 0000000..5b6bd82 Binary files /dev/null and b/resource/flash3/images/spellicons/item_3027.png differ diff --git a/resource/flash3/images/spellicons/item_3028.png b/resource/flash3/images/spellicons/item_3028.png new file mode 100755 index 0000000..9e4b975 Binary files /dev/null and b/resource/flash3/images/spellicons/item_3028.png differ diff --git a/resource/flash3/images/spellicons/item_3029.png b/resource/flash3/images/spellicons/item_3029.png new file mode 100755 index 0000000..d0dad7f Binary files /dev/null and b/resource/flash3/images/spellicons/item_3029.png differ diff --git a/resource/flash3/images/spellicons/item_3030.png b/resource/flash3/images/spellicons/item_3030.png new file mode 100755 index 0000000..06d22db Binary files /dev/null and b/resource/flash3/images/spellicons/item_3030.png differ diff --git a/resource/flash3/images/spellicons/item_3031.png b/resource/flash3/images/spellicons/item_3031.png new file mode 100755 index 0000000..801d50c Binary files /dev/null and b/resource/flash3/images/spellicons/item_3031.png differ diff --git a/resource/flash3/images/spellicons/item_3050.png b/resource/flash3/images/spellicons/item_3050.png new file mode 100755 index 0000000..ccb2bde Binary files /dev/null and b/resource/flash3/images/spellicons/item_3050.png differ diff --git a/resource/flash3/images/spellicons/luck.png b/resource/flash3/images/spellicons/luck.png new file mode 100755 index 0000000..062cc55 Binary files /dev/null and b/resource/flash3/images/spellicons/luck.png differ diff --git a/resource/flash3/images/spellicons/random_boss_buff_attack_speed.png b/resource/flash3/images/spellicons/random_boss_buff_attack_speed.png new file mode 100755 index 0000000..2eaeeb6 Binary files /dev/null and b/resource/flash3/images/spellicons/random_boss_buff_attack_speed.png differ diff --git a/resource/flash3/images/spellicons/random_boss_buff_dead_heal.png b/resource/flash3/images/spellicons/random_boss_buff_dead_heal.png new file mode 100755 index 0000000..d113f73 Binary files /dev/null and b/resource/flash3/images/spellicons/random_boss_buff_dead_heal.png differ diff --git a/resource/flash3/images/spellicons/random_boss_buff_health.png b/resource/flash3/images/spellicons/random_boss_buff_health.png new file mode 100755 index 0000000..050270e Binary files /dev/null and b/resource/flash3/images/spellicons/random_boss_buff_health.png differ diff --git a/resource/flash3/images/spellicons/random_boss_buff_move_speed.png b/resource/flash3/images/spellicons/random_boss_buff_move_speed.png new file mode 100755 index 0000000..b7e3f66 Binary files /dev/null and b/resource/flash3/images/spellicons/random_boss_buff_move_speed.png differ diff --git a/resource/flash3/images/spellicons/skip_wave.png b/resource/flash3/images/spellicons/skip_wave.png new file mode 100755 index 0000000..06e588a Binary files /dev/null and b/resource/flash3/images/spellicons/skip_wave.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/ai_cast_point.png b/resource/flash3/images/spellicons/touhoutd/ai_cast_point.png new file mode 100755 index 0000000..42d21ee Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/ai_cast_point.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/attack_buff.png b/resource/flash3/images/spellicons/touhoutd/attack_buff.png new file mode 100755 index 0000000..fb558ac Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/attack_buff.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/blink.png b/resource/flash3/images/spellicons/touhoutd/blink.png new file mode 100755 index 0000000..2a99c5f Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/blink.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/buy_egg_level_1.png b/resource/flash3/images/spellicons/touhoutd/buy_egg_level_1.png new file mode 100755 index 0000000..6dc11ae Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/buy_egg_level_1.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/buy_egg_level_2.png b/resource/flash3/images/spellicons/touhoutd/buy_egg_level_2.png new file mode 100755 index 0000000..2b06afd Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/buy_egg_level_2.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/buy_egg_level_3.png b/resource/flash3/images/spellicons/touhoutd/buy_egg_level_3.png new file mode 100755 index 0000000..0019e9c Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/buy_egg_level_3.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/buy_egg_level_4.png b/resource/flash3/images/spellicons/touhoutd/buy_egg_level_4.png new file mode 100755 index 0000000..481088e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/buy_egg_level_4.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/buy_normal_card.png b/resource/flash3/images/spellicons/touhoutd/buy_normal_card.png new file mode 100755 index 0000000..e64e33b Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/buy_normal_card.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/buy_senior_card.png b/resource/flash3/images/spellicons/touhoutd/buy_senior_card.png new file mode 100755 index 0000000..310808b Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/buy_senior_card.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/close_star.png b/resource/flash3/images/spellicons/touhoutd/close_star.png new file mode 100755 index 0000000..8352d8c Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/close_star.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/exp_up.png b/resource/flash3/images/spellicons/touhoutd/exp_up.png new file mode 100755 index 0000000..15eea0d Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/exp_up.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/power_buff.png b/resource/flash3/images/spellicons/touhoutd/power_buff.png new file mode 100755 index 0000000..21133b2 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/power_buff.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/reimu_pet_01.png b/resource/flash3/images/spellicons/touhoutd/reimu_pet_01.png new file mode 100755 index 0000000..db777e0 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/reimu_pet_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/reimu_pet_02.png b/resource/flash3/images/spellicons/touhoutd/reimu_pet_02.png new file mode 100755 index 0000000..4e29790 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/reimu_pet_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/reimu_pet_03.png b/resource/flash3/images/spellicons/touhoutd/reimu_pet_03.png new file mode 100755 index 0000000..64e0a01 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/reimu_pet_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/reimu_pet_04.png b/resource/flash3/images/spellicons/touhoutd/reimu_pet_04.png new file mode 100755 index 0000000..61821e6 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/reimu_pet_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/reimu_pet_05.png b/resource/flash3/images/spellicons/touhoutd/reimu_pet_05.png new file mode 100755 index 0000000..a251b54 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/reimu_pet_05.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/reimu_pet_06.png b/resource/flash3/images/spellicons/touhoutd/reimu_pet_06.png new file mode 100755 index 0000000..7239d2b Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/reimu_pet_06.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/release_tower.png b/resource/flash3/images/spellicons/touhoutd/release_tower.png new file mode 100755 index 0000000..718fe96 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/release_tower.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/shop_roll.png b/resource/flash3/images/spellicons/touhoutd/shop_roll.png new file mode 100755 index 0000000..79a2668 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/shop_roll.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/sort_item.png b/resource/flash3/images/spellicons/touhoutd/sort_item.png new file mode 100755 index 0000000..19e4d46 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/sort_item.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/star_up.png b/resource/flash3/images/spellicons/touhoutd/star_up.png new file mode 100755 index 0000000..37597a1 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/star_up.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_alice_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_alice_01.png new file mode 100755 index 0000000..be71311 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_alice_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_alice_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_alice_02.png new file mode 100755 index 0000000..051492c Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_alice_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_alice_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_alice_03.png new file mode 100755 index 0000000..32243c9 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_alice_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_aya_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_aya_01.png new file mode 100755 index 0000000..dd4a9f8 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_aya_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_aya_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_aya_02.png new file mode 100755 index 0000000..f0db8d4 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_aya_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_aya_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_aya_03.png new file mode 100755 index 0000000..dbb3661 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_aya_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_byakuren_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_byakuren_01.png new file mode 100755 index 0000000..b4e8b84 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_byakuren_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_byakuren_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_byakuren_02.png new file mode 100755 index 0000000..1fe5519 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_byakuren_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_byakuren_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_byakuren_03.png new file mode 100755 index 0000000..2492d55 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_byakuren_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_byakuren_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_byakuren_04.png new file mode 100755 index 0000000..2fdf541 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_byakuren_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_chen_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_chen_01.png new file mode 100755 index 0000000..6957921 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_chen_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_cirno_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_cirno_01.png new file mode 100755 index 0000000..58d7b6f Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_cirno_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_cirno_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_cirno_02.png new file mode 100755 index 0000000..0294c3a Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_cirno_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_cirno_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_cirno_03.png new file mode 100755 index 0000000..90c373f Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_cirno_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_cirno_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_cirno_04.png new file mode 100755 index 0000000..2be6c6e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_cirno_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_clownpiece_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_clownpiece_01.png new file mode 100755 index 0000000..5c2d0f8 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_clownpiece_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_clownpiece_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_clownpiece_02.png new file mode 100755 index 0000000..f078aaf Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_clownpiece_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_clownpiece_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_clownpiece_03.png new file mode 100755 index 0000000..4c23b47 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_clownpiece_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_daiyousei_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_daiyousei_01.png new file mode 100755 index 0000000..16f4468 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_daiyousei_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_daiyousei_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_daiyousei_02.png new file mode 100755 index 0000000..797fc0a Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_daiyousei_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_daiyousei_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_daiyousei_03.png new file mode 100755 index 0000000..b04b701 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_daiyousei_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_daiyousei_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_daiyousei_04.png new file mode 100755 index 0000000..58313a2 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_daiyousei_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_eirin_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_eirin_01.png new file mode 100755 index 0000000..2a56444 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_eirin_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_eirin_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_eirin_02.png new file mode 100755 index 0000000..79407fd Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_eirin_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_eirin_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_eirin_03.png new file mode 100755 index 0000000..66925a1 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_eirin_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_eirin_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_eirin_04.png new file mode 100755 index 0000000..d190215 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_eirin_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_flandre_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_flandre_01.png new file mode 100755 index 0000000..3f3631e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_flandre_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_flandre_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_flandre_02.png new file mode 100755 index 0000000..2d711a1 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_flandre_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_flandre_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_flandre_03.png new file mode 100755 index 0000000..015b3ba Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_flandre_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_flandre_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_flandre_04.png new file mode 100755 index 0000000..b03d686 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_flandre_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_futo_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_futo_01.png new file mode 100755 index 0000000..0955e3b Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_futo_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_futo_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_futo_02.png new file mode 100755 index 0000000..1aec96c Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_futo_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_futo_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_futo_03.png new file mode 100755 index 0000000..0e838a8 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_futo_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_hanadayousei_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_hanadayousei_01.png new file mode 100755 index 0000000..62ffcd9 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_hanadayousei_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_hatate_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_hatate_01.png new file mode 100755 index 0000000..b378e84 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_hatate_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_hatate_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_hatate_02.png new file mode 100755 index 0000000..dedd404 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_hatate_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_hecatia_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_hecatia_01.png new file mode 100755 index 0000000..1e38dd3 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_hecatia_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_hecatia_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_hecatia_02.png new file mode 100755 index 0000000..f5aa211 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_hecatia_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_hecatia_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_hecatia_03.png new file mode 100755 index 0000000..e71f07a Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_hecatia_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_hecatia_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_hecatia_04.png new file mode 100755 index 0000000..1c99882 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_hecatia_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_hina_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_hina_01.png new file mode 100755 index 0000000..61652f5 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_hina_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_hina_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_hina_02.png new file mode 100755 index 0000000..e9b2ce0 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_hina_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_hourainingyou_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_hourainingyou_01.png new file mode 100755 index 0000000..6096dbd Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_hourainingyou_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_iku_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_iku_01.png new file mode 100755 index 0000000..f3942f0 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_iku_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_iku_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_iku_02.png new file mode 100755 index 0000000..92d7678 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_iku_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_inaba_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_inaba_02.png new file mode 100755 index 0000000..9d95934 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_inaba_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_junko_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_junko_01.png new file mode 100755 index 0000000..38410a2 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_junko_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_junko_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_junko_02.png new file mode 100755 index 0000000..c31f0e0 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_junko_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_junko_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_junko_03.png new file mode 100755 index 0000000..7dd6712 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_junko_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_junko_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_junko_04.png new file mode 100755 index 0000000..7ba6cb5 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_junko_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kaguya_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_kaguya_01.png new file mode 100755 index 0000000..f8be2a3 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kaguya_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kaguya_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_kaguya_02.png new file mode 100755 index 0000000..b2fef0e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kaguya_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kaguya_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_kaguya_03.png new file mode 100755 index 0000000..64a0afa Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kaguya_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kanako_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_kanako_01.png new file mode 100755 index 0000000..09ccbd8 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kanako_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kanako_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_kanako_02.png new file mode 100755 index 0000000..63384c2 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kanako_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kanako_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_kanako_03.png new file mode 100755 index 0000000..561d60a Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kanako_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kanako_03_unit.png b/resource/flash3/images/spellicons/touhoutd/thtd_kanako_03_unit.png new file mode 100755 index 0000000..d3e8f58 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kanako_03_unit.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kanako_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_kanako_04.png new file mode 100755 index 0000000..0008c25 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kanako_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_keine_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_keine_01.png new file mode 100755 index 0000000..a15ffd1 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_keine_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_keine_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_keine_02.png new file mode 100755 index 0000000..a2d59fd Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_keine_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_keine_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_keine_03.png new file mode 100755 index 0000000..ccb96cd Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_keine_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_keine_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_keine_04.png new file mode 100755 index 0000000..157b1cf Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_keine_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kisume_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_kisume_01.png new file mode 100755 index 0000000..7ac45ca Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kisume_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kisume_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_kisume_02.png new file mode 100755 index 0000000..055f2be Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kisume_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_koakuma_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_koakuma_01.png new file mode 100755 index 0000000..176b57e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_koakuma_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_koakuma_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_koakuma_02.png new file mode 100755 index 0000000..559c89a Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_koakuma_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kogasa_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_kogasa_01.png new file mode 100755 index 0000000..8c307a4 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kogasa_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kogasa_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_kogasa_02.png new file mode 100755 index 0000000..7af618e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kogasa_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_koishi_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_koishi_01.png new file mode 100755 index 0000000..a5d5b16 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_koishi_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_koishi_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_koishi_02.png new file mode 100755 index 0000000..6956246 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_koishi_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_koishi_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_koishi_03.png new file mode 100755 index 0000000..f28d3f4 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_koishi_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_koishi_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_koishi_04.png new file mode 100755 index 0000000..8441c1c Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_koishi_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kokoro_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_kokoro_01.png new file mode 100755 index 0000000..63fa74f Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kokoro_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kokoro_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_kokoro_02.png new file mode 100755 index 0000000..9267dd7 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kokoro_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kokoro_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_kokoro_03.png new file mode 100755 index 0000000..c7b29bf Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kokoro_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kokoro_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_kokoro_04.png new file mode 100755 index 0000000..2d5bd6d Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kokoro_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_komachi_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_komachi_01.png new file mode 100755 index 0000000..c4a881c Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_komachi_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_komachi_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_komachi_02.png new file mode 100755 index 0000000..9ab9839 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_komachi_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_komachi_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_komachi_03.png new file mode 100755 index 0000000..c364dda Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_komachi_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_komachi_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_komachi_04.png new file mode 100755 index 0000000..e9e31c4 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_komachi_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kyouko_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_kyouko_01.png new file mode 100755 index 0000000..a7a88ee Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kyouko_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_kyouko_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_kyouko_02.png new file mode 100755 index 0000000..ae7df0e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_kyouko_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_letty_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_letty_01.png new file mode 100755 index 0000000..c7e6a80 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_letty_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_letty_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_letty_02.png new file mode 100755 index 0000000..bdf77bf Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_letty_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_lily_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_lily_01.png new file mode 100755 index 0000000..a57f5a6 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_lily_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_lily_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_lily_02.png new file mode 100755 index 0000000..69306f0 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_lily_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_luna_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_luna_01.png new file mode 100755 index 0000000..50fb505 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_luna_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_luna_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_luna_02.png new file mode 100755 index 0000000..8a88892 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_luna_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_lunasa_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_lunasa_01.png new file mode 100755 index 0000000..9576b4d Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_lunasa_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_lunasa_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_lunasa_02.png new file mode 100755 index 0000000..40aa47c Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_lunasa_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_lyrica_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_lyrica_01.png new file mode 100755 index 0000000..7eea542 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_lyrica_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_lyrica_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_lyrica_02.png new file mode 100755 index 0000000..29c7049 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_lyrica_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_maidyousei_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_maidyousei_01.png new file mode 100755 index 0000000..c6feb92 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_maidyousei_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_marisa_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_marisa_01.png new file mode 100755 index 0000000..479f26f Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_marisa_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_marisa_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_marisa_02.png new file mode 100755 index 0000000..d6656a2 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_marisa_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_marisa_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_marisa_03.png new file mode 100755 index 0000000..01198a2 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_marisa_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_medicine_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_medicine_01.png new file mode 100755 index 0000000..9406691 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_medicine_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_medicine_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_medicine_02.png new file mode 100755 index 0000000..cb8d737 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_medicine_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_meirin_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_meirin_01.png new file mode 100755 index 0000000..83fed19 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_meirin_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_meirin_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_meirin_02.png new file mode 100755 index 0000000..9df38c9 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_meirin_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_merlin_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_merlin_01.png new file mode 100755 index 0000000..1bfa61d Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_merlin_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_merlin_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_merlin_02.png new file mode 100755 index 0000000..e9c3032 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_merlin_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_miko_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_miko_01.png new file mode 100755 index 0000000..1b83100 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_miko_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_miko_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_miko_02.png new file mode 100755 index 0000000..0231526 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_miko_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_miko_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_miko_03.png new file mode 100755 index 0000000..04375c3 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_miko_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_miko_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_miko_04.png new file mode 100755 index 0000000..855b577 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_miko_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_minamitsu_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_minamitsu_01.png new file mode 100755 index 0000000..8e86fd8 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_minamitsu_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_minamitsu_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_minamitsu_02.png new file mode 100755 index 0000000..f8566cd Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_minamitsu_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_minamitsu_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_minamitsu_03.png new file mode 100755 index 0000000..69d5ee0 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_minamitsu_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_minamitsu_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_minamitsu_04.png new file mode 100755 index 0000000..d3b15e1 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_minamitsu_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_minoriko_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_minoriko_01.png new file mode 100755 index 0000000..d52ff58 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_minoriko_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_minoriko_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_minoriko_02.png new file mode 100755 index 0000000..cd899da Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_minoriko_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_mokou_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_mokou_01.png new file mode 100755 index 0000000..380ab59 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_mokou_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_mokou_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_mokou_02.png new file mode 100755 index 0000000..473fcde Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_mokou_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_mokou_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_mokou_03.png new file mode 100755 index 0000000..fed88e2 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_mokou_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_momiji_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_momiji_01.png new file mode 100755 index 0000000..9dee625 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_momiji_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_momiji_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_momiji_02.png new file mode 100755 index 0000000..9f6083b Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_momiji_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_mugiyousei_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_mugiyousei_01.png new file mode 100755 index 0000000..72a07cd Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_mugiyousei_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_mystia_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_mystia_01.png new file mode 100755 index 0000000..99542cf Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_mystia_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_mystia_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_mystia_02.png new file mode 100755 index 0000000..707f63e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_mystia_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_nazrin_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_nazrin_01.png new file mode 100755 index 0000000..006b203 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_nazrin_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_nue_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_nue_01.png new file mode 100755 index 0000000..2e91790 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_nue_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_nue_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_nue_02.png new file mode 100755 index 0000000..cbf6328 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_nue_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_nue_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_nue_03.png new file mode 100755 index 0000000..8758b25 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_nue_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_patchouli_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_patchouli_01.png new file mode 100755 index 0000000..c897d8e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_patchouli_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_patchouli_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_patchouli_02.png new file mode 100755 index 0000000..005f99c Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_patchouli_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_patchouli_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_patchouli_03.png new file mode 100755 index 0000000..a4dfaeb Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_patchouli_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_patchouli_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_patchouli_04.png new file mode 100755 index 0000000..0137228 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_patchouli_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_ran_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_ran_01.png new file mode 100755 index 0000000..37bed64 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_ran_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_ran_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_ran_02.png new file mode 100755 index 0000000..b7b1c1a Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_ran_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_ran_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_ran_03.png new file mode 100755 index 0000000..5a532bd Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_ran_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_reimu_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_reimu_01.png new file mode 100755 index 0000000..be3bbd7 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_reimu_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_reimu_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_reimu_02.png new file mode 100755 index 0000000..69b16ae Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_reimu_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_reimu_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_reimu_03.png new file mode 100755 index 0000000..0bdcc7f Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_reimu_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_reimu_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_reimu_04.png new file mode 100755 index 0000000..50026b8 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_reimu_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_reisen_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_reisen_01.png new file mode 100755 index 0000000..ec07160 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_reisen_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_reisen_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_reisen_02.png new file mode 100755 index 0000000..14e0b7c Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_reisen_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_reisen_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_reisen_03.png new file mode 100755 index 0000000..6057afc Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_reisen_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_remilia_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_remilia_01.png new file mode 100755 index 0000000..823b4be Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_remilia_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_remilia_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_remilia_02.png new file mode 100755 index 0000000..bfb7dc6 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_remilia_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_remilia_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_remilia_03.png new file mode 100755 index 0000000..f8aaca5 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_remilia_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_remilia_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_remilia_04.png new file mode 100755 index 0000000..d31be8b Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_remilia_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_rin_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_rin_01.png new file mode 100755 index 0000000..15e7934 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_rin_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_rin_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_rin_02.png new file mode 100755 index 0000000..8f8f9f7 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_rin_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_rumia_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_rumia_01.png new file mode 100755 index 0000000..49d2428 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_rumia_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_rumia_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_rumia_02.png new file mode 100755 index 0000000..7b416e9 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_rumia_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_rumia_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_rumia_03.png new file mode 100755 index 0000000..2f966c6 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_rumia_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_rumia_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_rumia_04.png new file mode 100755 index 0000000..0ee2544 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_rumia_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_sakuya_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_sakuya_01.png new file mode 100755 index 0000000..01e46a9 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_sakuya_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_sakuya_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_sakuya_02.png new file mode 100755 index 0000000..ad4c9e6 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_sakuya_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_sakuya_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_sakuya_03.png new file mode 100755 index 0000000..63414e7 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_sakuya_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_sanae_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_sanae_01.png new file mode 100755 index 0000000..1e70119 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_sanae_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_sanae_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_sanae_02.png new file mode 100755 index 0000000..f31250e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_sanae_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_sanae_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_sanae_03.png new file mode 100755 index 0000000..71b00ed Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_sanae_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_sanae_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_sanae_04.png new file mode 100755 index 0000000..5230f47 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_sanae_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_satori_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_satori_01.png new file mode 100755 index 0000000..6c9118e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_satori_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_satori_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_satori_02.png new file mode 100755 index 0000000..633f498 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_satori_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_seiga_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_seiga_01.png new file mode 100755 index 0000000..b17d445 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_seiga_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_seiga_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_seiga_02.png new file mode 100755 index 0000000..0379e22 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_seiga_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_seiga_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_seiga_03.png new file mode 100755 index 0000000..270dbec Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_seiga_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_shanghainingyou_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_shanghainingyou_01.png new file mode 100755 index 0000000..8efabf8 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_shanghainingyou_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_shikieiki_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_shikieiki_01.png new file mode 100755 index 0000000..f2087b3 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_shikieiki_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_shikieiki_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_shikieiki_02.png new file mode 100755 index 0000000..bd9a6d2 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_shikieiki_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_shikieiki_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_shikieiki_03.png new file mode 100755 index 0000000..b0fffac Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_shikieiki_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_shikieiki_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_shikieiki_04.png new file mode 100755 index 0000000..e46fa6c Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_shikieiki_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_shinki_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_shinki_01.png new file mode 100755 index 0000000..5fde0cf Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_shinki_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_shinki_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_shinki_02.png new file mode 100755 index 0000000..0339e5c Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_shinki_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_shinki_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_shinki_03.png new file mode 100755 index 0000000..e650dd2 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_shinki_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_shinki_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_shinki_04.png new file mode 100755 index 0000000..f821322 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_shinki_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_sizuha_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_sizuha_01.png new file mode 100755 index 0000000..eb56783 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_sizuha_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_sizuha_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_sizuha_02.png new file mode 100755 index 0000000..5f3746e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_sizuha_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_soga_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_soga_01.png new file mode 100755 index 0000000..b0d101b Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_soga_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_soga_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_soga_02.png new file mode 100755 index 0000000..56840cd Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_soga_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_soga_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_soga_03.png new file mode 100755 index 0000000..1bdc1d1 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_soga_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_star_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_star_01.png new file mode 100755 index 0000000..0f1ca4a Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_star_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_star_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_star_02.png new file mode 100755 index 0000000..51e1b6a Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_star_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_suika_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_suika_01.png new file mode 100755 index 0000000..96fe93e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_suika_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_suika_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_suika_02.png new file mode 100755 index 0000000..2fd41df Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_suika_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_suika_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_suika_03.png new file mode 100755 index 0000000..01161cc Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_suika_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_suika_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_suika_04.png new file mode 100755 index 0000000..549dc89 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_suika_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_sunny_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_sunny_01.png new file mode 100755 index 0000000..52dcd5f Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_sunny_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_sunny_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_sunny_02.png new file mode 100755 index 0000000..0961f81 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_sunny_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_suwako_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_suwako_01.png new file mode 100755 index 0000000..ed9d441 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_suwako_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_suwako_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_suwako_02.png new file mode 100755 index 0000000..1b685ec Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_suwako_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_suwako_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_suwako_03.png new file mode 100755 index 0000000..34f6a1a Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_suwako_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_suwako_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_suwako_04.png new file mode 100755 index 0000000..4dd39e4 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_suwako_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_tenshi_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_tenshi_01.png new file mode 100755 index 0000000..77d41e9 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_tenshi_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_tenshi_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_tenshi_02.png new file mode 100755 index 0000000..236e1b0 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_tenshi_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_tenshi_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_tenshi_03.png new file mode 100755 index 0000000..ff0e608 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_tenshi_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_toramaru_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_toramaru_01.png new file mode 100755 index 0000000..43b1c89 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_toramaru_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_toramaru_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_toramaru_02.png new file mode 100755 index 0000000..4a906c5 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_toramaru_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_toramaru_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_toramaru_03.png new file mode 100755 index 0000000..1102dab Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_toramaru_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_toramaru_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_toramaru_04.png new file mode 100755 index 0000000..dc70e6b Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_toramaru_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_utsuho_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_utsuho_01.png new file mode 100755 index 0000000..e2787b5 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_utsuho_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_utsuho_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_utsuho_02.png new file mode 100755 index 0000000..271f113 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_utsuho_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_utsuho_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_utsuho_03.png new file mode 100755 index 0000000..478960a Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_utsuho_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yoshika_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_yoshika_01.png new file mode 100755 index 0000000..da05105 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yoshika_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yoshika_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_yoshika_02.png new file mode 100755 index 0000000..93b00b9 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yoshika_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_youmu_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_youmu_01.png new file mode 100755 index 0000000..007577a Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_youmu_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_youmu_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_youmu_02.png new file mode 100755 index 0000000..260b85b Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_youmu_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_youmu_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_youmu_03.png new file mode 100755 index 0000000..2084f0e Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_youmu_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yukari_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_yukari_01.png new file mode 100755 index 0000000..aa01da4 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yukari_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yukari_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_yukari_02.png new file mode 100755 index 0000000..99bdd74 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yukari_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yukari_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_yukari_03.png new file mode 100755 index 0000000..e03b6f2 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yukari_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yukari_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_yukari_04.png new file mode 100755 index 0000000..97a5ca4 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yukari_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yuugi_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_yuugi_01.png new file mode 100755 index 0000000..c83005a Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yuugi_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yuugi_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_yuugi_02.png new file mode 100755 index 0000000..6e018a1 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yuugi_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yuugi_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_yuugi_03.png new file mode 100755 index 0000000..ae96af9 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yuugi_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yuuka_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_yuuka_01.png new file mode 100755 index 0000000..f1fc6fc Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yuuka_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yuuka_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_yuuka_02.png new file mode 100755 index 0000000..183c096 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yuuka_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yuuka_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_yuuka_03.png new file mode 100755 index 0000000..be7192f Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yuuka_03.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yuuka_04.png b/resource/flash3/images/spellicons/touhoutd/thtd_yuuka_04.png new file mode 100755 index 0000000..1251767 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yuuka_04.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yuyuko_01.png b/resource/flash3/images/spellicons/touhoutd/thtd_yuyuko_01.png new file mode 100755 index 0000000..b3211c5 Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yuyuko_01.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yuyuko_02.png b/resource/flash3/images/spellicons/touhoutd/thtd_yuyuko_02.png new file mode 100755 index 0000000..5301bcc Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yuyuko_02.png differ diff --git a/resource/flash3/images/spellicons/touhoutd/thtd_yuyuko_03.png b/resource/flash3/images/spellicons/touhoutd/thtd_yuyuko_03.png new file mode 100755 index 0000000..1d92f5d Binary files /dev/null and b/resource/flash3/images/spellicons/touhoutd/thtd_yuyuko_03.png differ diff --git a/resource/flash3/images/spellicons/up.png b/resource/flash3/images/spellicons/up.png new file mode 100755 index 0000000..bb74a53 Binary files /dev/null and b/resource/flash3/images/spellicons/up.png differ diff --git a/resource/flash3/videos/portraits/npc_dota_hero_lina.usm b/resource/flash3/videos/portraits/npc_dota_hero_lina.usm new file mode 100755 index 0000000..42088fc Binary files /dev/null and b/resource/flash3/videos/portraits/npc_dota_hero_lina.usm differ diff --git a/resource/overviews/template_map.txt b/resource/overviews/template_map.txt new file mode 100755 index 0000000..e8e62c2 --- /dev/null +++ b/resource/overviews/template_map.txt @@ -0,0 +1,8 @@ +template_map +{ + material materials/overviews/template_map.vmat + pos_x -8192 + pos_y 8192 + scale 16.000 +} + diff --git a/resource/overviews/touhoutd.txt b/resource/overviews/touhoutd.txt new file mode 100755 index 0000000..a598a51 --- /dev/null +++ b/resource/overviews/touhoutd.txt @@ -0,0 +1,8 @@ +touhoutd +{ + material materials/overviews/touhoutd.vmat + pos_x -11840 + pos_y 11839 + scale 23.124 +} + diff --git a/resource/overviews/touhoutd_02.txt b/resource/overviews/touhoutd_02.txt new file mode 100755 index 0000000..61647d8 --- /dev/null +++ b/resource/overviews/touhoutd_02.txt @@ -0,0 +1,8 @@ +touhoutd_02 +{ + material materials/overviews/touhoutd_02.vmat + pos_x -11838 + pos_y 13216 + scale 24.748 +} + diff --git a/resource/word_filter_cache_1.dat b/resource/word_filter_cache_1.dat new file mode 100755 index 0000000..99744c8 --- /dev/null +++ b/resource/word_filter_cache_1.dat @@ -0,0 +1 @@ +q1L߹1L߹}EHXyJ];~[XZi1L߹1L߹EHXyuVudߜэ߼ќߜќܼѼߜѐKt5pK^K5`KtKx5ߜђ2^ey2c5i2^eyּѹ֜ѐִ߻ќ~ZB^hj@@hjB^~Z߼ѹuf0vuf߼ѹlrB_GRctEEҪ׼ѹ֏߃ߜќաߜђ՜ߜќ}S/}<{+v +{ + custom_net_tables = + [ + "TowerListInfo", + "CustomGameInfo", + ] +} diff --git a/scripts/npc/abilities/effect_abilities.kv b/scripts/npc/abilities/effect_abilities.kv new file mode 100755 index 0000000..873aa24 --- /dev/null +++ b/scripts/npc/abilities/effect_abilities.kv @@ -0,0 +1,1298 @@ +"DOTAAbilities" +{ + "e101" + { + "ID" "9040" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/shengjie/shengjie.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/shengjie/shengjie.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e102" + { + "ID" "9041" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "sm/ruby.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/ruby.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e103" + { + "ID" "9042" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/bianpao/bianpaofireworks.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/bianpao/bianpaofireworks.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e104" + { + "ID" "9043" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "particles/econ/courier/courier_crystal_rift/courier_ambient_crystal_rift.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "particles/econ/courier/courier_crystal_rift/courier_ambient_crystal_rift.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e107" + { + "ID" "9044" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "particles/econ/courier/courier_trail_hw_2012/courier_trail_hw_2012.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "particles/econ/courier/courier_trail_hw_2012/courier_trail_hw_2012.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e108" + { + "ID" "9045" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "particles/econ/courier/courier_trail_hw_2013/courier_trail_hw_2013.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "particles/econ/courier/courier_trail_hw_2013/courier_trail_hw_2013.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e111" + { + "ID" "9046" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "sm/hapi.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/hapi.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e112" + { + "ID" "9047" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "sm/baoshiguangze.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/baoshiguangze.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e113" + { + "ID" "9048" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "sm/wuwuwuwuwu.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/wuwuwuwuwu.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e114" + { + "ID" "9049" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "particles/econ/events/ti6/fountain_regen_ribbon_lvl3_a.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "particles/econ/events/ti6/fountain_regen_ribbon_lvl3_a.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e201" + { + "ID" "9050" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "particles/econ/courier/courier_trail_spirit/courier_trail_spirit.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "particles/econ/courier/courier_trail_spirit/courier_trail_spirit.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e202" + { + "ID" "9051" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "particles/units/heroes/hero_skeletonking/wraith_king_ghosts_ambient.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "particles/units/heroes/hero_skeletonking/wraith_king_ghosts_ambient.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e203" + { + "ID" "9052" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "particles/econ/courier/courier_polycount_01/courier_trail_polycount_01a.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "particles/econ/courier/courier_polycount_01/courier_trail_polycount_01a.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e205" + { + "ID" "9053" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "sm/mogu.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/mogu.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e210" + { + "ID" "9054" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "particles/econ/events/ti6/radiance_owner_ti6.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "particles/econ/events/ti6/radiance_owner_ti6.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e213" + { + "ID" "9055" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/ti8roshan/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/ti8roshan/1.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e214" + { + "ID" "9056" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/yuhuofenshen/1_2.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/yuhuofenshen/1_2.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e301" + { + "ID" "9057" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "particles/vr/player_light_godray.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "particles/vr/player_light_godray.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e302" + { + "ID" "9058" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "sm/ambient.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/ambient.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e303" + { + "ID" "9059" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/bingnv/ambient.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/bingnv/ambient.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e304" + { + "ID" "9060" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "sm/grass/03.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/grass/03.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e305" + { + "ID" "9061" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/lianhua/lianhua.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/lianhua/lianhua.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e306" + { + "ID" "9062" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/snow2012/1econ/courier/courier_trail_winter_2012/courier_trail_winter_2012.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e308" + { + "ID" "9063" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "precache" + { + "particle" "particles/gem/brewmaster_drunken_haze_debuff_bubbles_2.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "particles/gem/brewmaster_drunken_haze_debuff_bubbles_2.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e309" + { + "ID" "9064" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "precache" + { + "particle" "sm/ziyuanpurple/courier_greevil_purple_ambient_3.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/ziyuanpurple/courier_greevil_purple_ambient_3.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e311" + { + "ID" "9065" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "precache" + { + "particle" "sm/xiehuodefault.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/xiehuodefault.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e312" + { + "ID" "9066" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "precache" + { + "particle" "effect/jinbi/jinbigold.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/jinbi/jinbigold.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e313" + { + "ID" "9067" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "precache" + { + "particle" "sm/guanghuisuiyue.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/guanghuisuiyue.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e315" + { + "ID" "9068" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "precache" + { + "particle" "effect/emengchanrao/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/emengchanrao/1.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e316" + { + "ID" "9069" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "precache" + { + "particle" "sm/xingxingold.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/xingxingold.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e317" + { + "ID" "9070" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "sm/hongxin/ambient.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/hongxin/ambient.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e319" + { + "ID" "9071" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/ti7donkey/effect.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/ti7donkey/effect.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e320" + { + "ID" "9072" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/daxuanwo/xuanwoecon/items/kunkka/kunkka_immortal/kunkka_immortal_ghost_ship_marker.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e321" + { + "ID" "9073" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/lanhuo/motenai.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/lanhuo/motenai.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e322" + { + "ID" "9074" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/gewugu/flyup/ambient.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/gewugu/flyup/ambient.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e401" + { + "ID" "9075" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "sm/rongyanroushan.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/rongyanroushan.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e402" + { + "ID" "9076" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "sm/bingroushan.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/bingroushan.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e403" + { + "ID" "9077" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/golden_roshan/goldenambient.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/golden_roshan/goldenambient.vpcf" + "EffectAttachType" "follow_overhead" + "IsHidden" "1" + } + } + } + + "e404" + { + "ID" "9078" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "sm/lizizhiqiambient.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "sm/lizizhiqiambient.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e405" + { + "ID" "9079" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "particles/generic_gameplay/dropped_item_rapier.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "particles/generic_gameplay/dropped_item_rapier.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e406" + { + "ID" "9080" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/blue_gem/ti7.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/blue_gem/ti7.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e407" + { + "ID" "9081" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/huangsha/roushanbaby_roshan_desert_sands_ambient.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/huangsha/roushanbaby_roshan_desert_sands_ambient.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e408" + { + "ID" "9082" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/anyue/anyueflying.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/anyue/anyueflying.vpcf" + "EffectAttachType" "attach_origin" + "IsHidden" "1" + } + } + } + + "e409" + { + "ID" "9083" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/xuehuan/xuehuanecon/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e410" + { + "ID" "9084" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/puck_xuehua/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/puck_xuehua/1.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e451" + { + "ID" "9085" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/xuwuzhiyan/red/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/xuwuzhiyan/red/1.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e452" + { + "ID" "9086" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/xuwuzhiyan/orange/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/xuwuzhiyan/orange/1.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e453" + { + "ID" "9087" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/xuwuzhiyan/yellow/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/xuwuzhiyan/yellow/1.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e454" + { + "ID" "9088" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/xuwuzhiyan/green/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/xuwuzhiyan/green/1.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e455" + { + "ID" "9089" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/xuwuzhiyan/cyan/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/xuwuzhiyan/cyan/1.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e456" + { + "ID" "9090" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/xuwuzhiyan/blue/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/xuwuzhiyan/blue/1.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e457" + { + "ID" "9091" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/xuwuzhiyan/purple/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/xuwuzhiyan/purple/1.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e458" + { + "ID" "9092" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/xuwuzhiyan/white/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/xuwuzhiyan/white/1.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e459" + { + "ID" "9093" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/xuwuzhiyan/pink/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "EffectName" "effect/xuwuzhiyan/pink/1.vpcf" + "EffectAttachType" "follow_origin" + "IsHidden" "1" + } + } + } + + "e999" + { + "ID" "9094" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + "precache" + { + "particle" "effect/crown/1.vpcf" + } + "Modifiers" + { + "modifier_texiao_crown" + { + "Passive" "1" + "EffectName" "effect/crown/1.vpcf" + "EffectAttachType" "follow_head" + "IsHidden" "1" + } + } + } + + "e000" + { + "ID" "9095" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + + "Modifiers" + { + "modifier_texiao_star" + { + "Passive" "1" + "IsHidden" "1" + } + } + } + + "e998" + { + "ID" "9096" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "wisp_overcharge" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_HIDDEN | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "HotKeyOverride" "L" + + "Modifiers" + { + "modifier_texiao_crown" + { + "Passive" "1" + "IsHidden" "1" + "EffectName" "particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_idle_rare.vpcf" + "EffectAttachType" "follow_head" + } + } + } +} diff --git a/scripts/npc/abilities/lua_abilities.kv b/scripts/npc/abilities/lua_abilities.kv new file mode 100755 index 0000000..e45fb08 --- /dev/null +++ b/scripts/npc/abilities/lua_abilities.kv @@ -0,0 +1,204 @@ +"DOTAAbilities" +{ + "thtd_lily_01_lua" + { + "ID" "9001" + "BaseClass" "ability_lua" + "AbilityTextureName" "touhoutd/thtd_lily_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "5" + "AbilityCooldown" "1" + "AbilityManaCost" "100" + //"AbilityCastAnimation" "ACT_SPECIAL_ATTACK2" lua技能此条属性无效 + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "ScriptFile" "scripts/vscripts/abilities/ability_lua/lily.lua" + + "precache" + { + "particle" "particles/heroes/lily/ability_lily_01_ready.vpcf" + "particle" "particles/heroes/lily/ability_lily_01_a.vpcf" + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "600" + } + "02" + { + "var_type" "FIELD_FLOAT" + "power_factor" "60 120 180 240 300" + } + "03" + { + "var_type" "FIELD_FLOAT" + "effect_tick" "0.5" + } + } + } + + "thtd_lily_02_lua" + { + "ID" "9002" + "BaseClass" "ability_lua" + "AbilityTextureName" "touhoutd/thtd_lily_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityCooldown" "30 15" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "2" + "AbilityCastRange" "600 900" + + "ScriptFile" "scripts/vscripts/abilities/ability_lua/lily.lua" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_omniknight.vsndevts" + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "600 900" + } + "02" + { + "var_type" "FIELD_INTEGER" + "duration" "15" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up" "25" + } + } + } + + "thtd_nazrin_01_lua" + { + "ID" "9003" + "BaseClass" "ability_lua" + "AbilityTextureName" "touhoutd/thtd_nazrin_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "5" + + "ScriptFile" "scripts/vscripts/abilities/ability_lua/nazrin.lua" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_chance" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_gold" "10 20 40 80 320" + } + "03" + { + "var_type" "FIELD_INTEGER" + "power_percent" "30" + } + + } + } + + "thtd_mugiyousei_01_lua" + { + "ID" "9006" + "BaseClass" "ability_lua" + "AbilityTextureName" "touhoutd/thtd_mugiyousei_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "ScriptFile" "scripts/vscripts/abilities/ability_lua/mugiyousei.lua" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_FLOAT" + "damage_duration" "5.0" + } + } + } + + "thtd_hourainingyou_01_lua" + { + "ID" "9008" + "BaseClass" "ability_lua" + "AbilityTextureName" "touhoutd/thtd_hourainingyou_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "ScriptFile" "scripts/vscripts/abilities/ability_lua/hourainingyou.lua" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "chance" "40" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_time" "0.5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "lock_time" "2.0" + } + } + } + + "thtd_hanadayousei_01_lua" + { + "ID" "9009" + "BaseClass" "ability_lua" + "AbilityTextureName" "touhoutd/thtd_hanadayousei_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "ScriptFile" "scripts/vscripts/abilities/ability_lua/hanadayousei.lua" + } +} diff --git a/scripts/npc/abilities/tower_abilities.kv b/scripts/npc/abilities/tower_abilities.kv new file mode 100755 index 0000000..f14e963 --- /dev/null +++ b/scripts/npc/abilities/tower_abilities.kv @@ -0,0 +1,17048 @@ +"DOTAAbilities" +{ + "ability_common_ai" + { + "ID" "9296" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/attack_buff" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_TOGGLE" + "MaxLevel" "1" + "AbilityCooldown" "1" + + "precache" + { + "soundfile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + "soundfile" "soundevents/game_sounds/thdots_tower_sounds.vsndevts" + "soundfile" "soundevents/game_sounds/thdots_tower_sound_voice.vsndevts" + } + + "OnToggleOn" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCloseAI" + } + } + + "OnToggleOff" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCloseAI" + } + } + } + + "ability_common_power_buff" + { + "ID" "9291" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/power_buff" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "MaxLevel" "5" + + "OnUpgrade" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "AddPowerAttackPercentage" + "power_up" "%power_up" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_up" "0 15 30 45 60" + } + } + } + + "ability_common_attack_speed_buff" + { + "ID" "9297" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/power_buff" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "MaxLevel" "5" + + "OnUpgrade" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "AddAttackSpeed" + "attack_speed" "%attack_speed" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "0 20 40 60 80" + } + } + } + + "ability_common_mana_regen_buff" + { + "ID" "9292" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/power_buff" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "MaxLevel" "5" + + "OnUpgrade" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "AddManaRegenPercentage" + "mana_regen" "%mana_regen" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "mana_regen" "0 30 60 90 120" + } + } + } + + "ability_common_star_up_speed" + { + "ID" "9293" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/power_buff" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "MaxLevel" "5" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "speed_tooltips" "0 10 20 30 40" + } + } + } + + "ability_common_decrease_armor_buff" + { + "ID" "9294" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/power_buff" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "MaxLevel" "5" + + "Modifiers" + { + "modifier_decrease_armor_aura" + { + "Passive" "1" + "IsHidden" "1" + + "Aura" "modifier_decrease_armor_buff" + "Aura_Radius" "%radius" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_decrease_armor_buff" + { + "IsHidden" "1" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCreatedDecreaseArmor" + "armor" "%armor" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnDestroyDecreaseArmor" + "armor" "%armor" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "armor" "0 1 2 3 4" + } + } + } + + "ability_common_decrease_magic_armor_buff" + { + "ID" "9295" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/power_buff" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "MaxLevel" "5" + + "Modifiers" + { + "modifier_decrease_magic_armor_aura" + { + "Passive" "1" + "IsHidden" "1" + + "Aura" "modifier_decrease_magic_armor_buff" + "Aura_Radius" "%radius" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_decrease_magic_armor_buff" + { + "IsHidden" "1" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCreatedDecreaseMagicArmor" + "magic_armor" "%magic_armor" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnDestroyDecreaseMagicArmor" + "magic_armor" "%magic_armor" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "magic_armor" "0 3 6 9 12" + } + } + } + + "thtd_lily_01" + { + "ID" "9097" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_lily_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY | DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "5" + "AbilityCooldown" "1" + "AbilityManaCost" "100" + "AbilityCastPoint" "0.0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Sound_THTD.thtd_lily_01" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityLily.lua" + "Function" "OnLily01SpellStart" + "Target" "POINT" + "radius" "%radius" + "power_factor" "%power_factor" + "hp_damage" "%hp_damage" + } + } + + "Modifiers" + { + "modifier_lily_01_effect_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "0.25" + "Attributes" "MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityLily.lua" + "Function" "OnLily01EffectThink" + "mana_down" "%mana_down" + } + } + } + } + + "precache" + { + "particle" "particles/heroes/lily/ability_lily_01_ready.vpcf" + "particle" "particles/heroes/lily/ability_lily_01_a.vpcf" + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "600" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_factor" "60 120 180 240 300" + } + "03" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "04" + { + "var_type" "FIELD_INTEGER" + "hp_damage" "1 2 3 4 5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "mana_down" "90" + } + "06" + { + "var_type" "FIELD_FLOAT" + "effect_tick" "0.5" + } + } + } + + "thtd_lily_02" + { + "ID" "9098" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_lily_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityCooldown" "25 12.5" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "2" + "AbilityCastRange" "600" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_omniknight.vsndevts" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Sound_THTD.thtd_lily_02" + "Target" "CASTER" + } + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityLily.lua" + "Function" "OnLily02SpellStart" + "radius" "%radius" + "duration" "%duration" + } + } + + "Modifiers" + { + "modifier_lily_02_buff" + { + "Duration" "%duration" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityLily.lua" + "Function" "OnCreatedLily02Buff" + "damage_up" "%damage_up" + "self_crit" "%self_crit" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityLily.lua" + "Function" "OnDestroyLily02Buff" + } + } + } + } + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_omniknight.vsndevts" + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "600" + } + "02" + { + "var_type" "FIELD_INTEGER" + "duration" "15" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up" "25" + } + "04" + { + "var_type" "FIELD_INTEGER" + "self_crit" "4" + } + } + } + + "thtd_nazrin_01" + { + "ID" "9099" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_nazrin_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "5" + + "Modifiers" + { + "passive_nazrin_attack_gold" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityNazrin.lua" + "Function" "OnNazrin01AttackLanded" + "BonusChance" "%bonus_chance" + "BonusGold" "%bonus_gold" + "PowerPercent" "%power_percent" + "nazrin" "%nazrin" + "damage_up" "%damage_up" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_chance" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_gold" "8 16 32 64 256" + } + "03" + { + "var_type" "FIELD_INTEGER" + "power_percent" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "nazrin" "2" //与thtd_byakuren_03一致 + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage_up" "1" + } + } + } + + "thtd_minoriko_01" + { + "ID" "9100" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_minoriko_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "4" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "grow_time" "250 400 650 1000" + } + } + } + + "thtd_minoriko_02" + { + "ID" "9101" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_minoriko_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "2000" + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Sound_THTD.thtd_minoriko_02" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMinoriko.lua" + "Function" "OnMinoriko02StarChange" + "Target" "TARGET" + "max_count" "%max_count" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "max_count" "3" + } + } + } + + "thtd_mugiyousei_01" + { + "ID" "9102" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_mugiyousei_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "Modifiers" + { + "passive_mugiyousei_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityMugiyousei.lua" + "Function" "OnMugiyousei01AttackLanded" + "damage_duration" "%damage_duration" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_FLOAT" + "damage_duration" "5.0" + } + } + } + + "thtd_shanghainingyou_01" + { + "ID" "9103" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_shanghainingyou_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "Modifiers" + { + "modifier_shanghainingyou_crit_chance" + { + "Attributes" "MODIFIER_ATTRIBUTE_MULTIPLE" + "Passive" "1" + "IsHidden" "1" + "OnAttackStart" + { + "RemoveModifier" + { + "ModifierName" "modifier_shanghainingyou_crit" + "Target" "CASTER" + } + "Random" + { + "Chance" "%crit_chance" + "OnSuccess" + { + "FireSound" + { + "EffectName" "Sound_THTD.thtd_shanghainingyou_01" + "Target" "CASTER" + } + + "ApplyModifier" + { + "ModifierName" "modifier_shanghainingyou_crit" + "Target" "CASTER" + } + } + } + } + } + "modifier_shanghainingyou_crit" + { + "IsHidden" "1" + "Properties" + { + "MODIFIER_PROPERTY_PREATTACK_CRITICALSTRIKE" "%crit_mult" + } + "OnAttackLanded" + { + "RemoveModifier" + { + "ModifierName" "modifier_shanghainingyou_crit" + "Target" "CASTER" + } + } + } + } + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_mult" "300" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "40" + } + } + } + + "thtd_hourainingyou_01" + { + "ID" "9104" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_hourainingyou_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "Modifiers" + { + "passive_hourainingyou_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityHourainingyou.lua" + "Function" "OnHourainingyou01AttackLanded" + "chance" "%chance" + "stun_time" "%stun_time" + "lock_time" "%lock_time" + } + } + } + + "modifier_hourainingyou_01_stun_lock" + { + + } + + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "chance" "40" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_time" "0.5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "lock_time" "2.0" + } + } + } + + "thtd_hanadayousei_01" + { + "ID" "9105" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_hanadayousei_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "Modifiers" + { + "passive_hanadayousei_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttack" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityHanadayousei.lua" + "Function" "OnHanadayousei01Attack" + } + } + } + } + } + + "thtd_cirno_01" + { + "ID" "9106" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_cirno_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + "AbilityCastRange" "%radius" + + "Modifiers" + { + "modifier_cirno_01_aura" + { + "Passive" "1" + "IsHidden" "1" + "Aura" "modifier_cirno_01_slow_buff" + "Aura_Radius" "%radius" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_cirno_01_slow_buff" + { + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_slow" + } + } + + "modifier_cirno_suwako_aura" + { + "IsHidden" "1" + + "Aura" "modifier_cirno_suwako_buff" + "Aura_Radius" "1200" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_cirno_suwako_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCirno.lua" + "Function" "OnCreatedCirnoExBuff" + "damage_up" "%damage_up" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCirno.lua" + "Function" "OnDestroyCirnoExBuff" + } + } + } + } + + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + "02" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-30 -50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up" "20" + } + } + } + + "thtd_cirno_02" + { + "ID" "9107" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_cirno_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "1" + "AbilityManaCost" "50" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "800" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCirno.lua" + "Function" "OnCirno02SpellStart" + "Target" "TARGET" + "unit_max_count" "%unit_max_count" + "ice_count" "%ice_count" + "radius" "%radius" + } + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "true" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCirno.lua" + "Target" "TARGET" + "Function" "OnCirno02SpellHit" + "StunTime" "%stun_time" + "chance" "%chance" + "stun_up" "%stun_up" + } + } + + "Modifiers" + { + "modifier_cirno_frozen_unit" + { + "States" + { + "MODIFIER_STATE_FROZEN" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "unit_max_count" "25" + } + "03" + { + "var_type" "FIELD_INTEGER" + "ice_count" "8" + } + "04" + { + "var_type" "FIELD_INTEGER" + "chance" "33" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stun_time" "0.8" + } + "06" + { + "var_type" "FIELD_INTEGER" + "radius" "380" + } + "07" + { + "var_type" "FIELD_INTEGER" + "stun_up" "100" + } + } + } + + "thtd_cirno_03" + { + "ID" "9108" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_cirno_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "Modifiers" + { + "passive_cirno_03_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityCirno.lua" + "Function" "OnCirno03Attack" + "range" "%range" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "250" + } + } + } + + "thtd_cirno_04" + { + "ID" "9109" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_cirno_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/thtd_cirno/ability_cirno_04_circle.vpcf" + } + + "Modifiers" + { + "passive_cirno_04_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityCirno.lua" + "Function" "OnCirno04Attack" + "range" "%range" + "max_count" "%max_count" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_count" "5" + } + } + } + + "thtd_letty_01" + { + "ID" "9110" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_letty_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "2" + "AbilityCooldown" "1" + "AbilityManaCost" "40" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityLetty.lua" + "Function" "OnLetty01SpellStart" + "Target" "POINT" + "radius" "%radius" + "max_count" "%max_count" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "600" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_count" "2 3" + } + } + } + + "thtd_letty_02" + { + "ID" "9111" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_letty_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "3" + "AbilityCastRange" "%radius" + + "Modifiers" + { + "modifier_letty_02_aura" + { + "Passive" "1" + "IsHidden" "1" + + "Aura" "modifier_letty_02_magic_armor_buff" + "Aura_Radius" "%radius" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_letty_02_magic_armor_buff" + { + "IsHidden" "1" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityLetty.lua" + "Function" "OnCreatedLetty02Buff" + "magic_armor" "%magic_armor" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityLetty.lua" + "Function" "OnDestroyLetty02Buff" + "magic_armor" "%magic_armor" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "magic_armor" "9 18 36" + } + } + } + + "thtd_kogasa_01" + { + "ID" "9112" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kogasa_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "20" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "precache" + { + "particle" "particles/heroes/kogasa/ability_kogasa_01_debuff.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKogasa.lua" + "Function" "OnKogasa01SpellStart" + "Target" "POINT" + "radius" "%radius" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "modifier_kogasa_debuff" + { + "EffectName" "particles/heroes/kogasa/ability_kogasa_01_debuff.vpcf" + "EffectAttachType" "follow_origin" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "2.0" + } + } + } + + "thtd_kogasa_02" + { + "ID" "9113" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kogasa_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "3" + "AbilityCastRange" "%radius" + + "Modifiers" + { + "modifier_kogasa_02_aura" + { + "Passive" "1" + "IsHidden" "1" + + "Aura" "modifier_kogasa_02_armor_buff" + "Aura_Radius" "%radius" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_kogasa_02_armor_buff" + { + // "Properties" + // { + // "MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS" "-20" + // } + + "IsHidden" "1" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKogasa.lua" + "Function" "OnCreatedKogasa02Debuff" + "armor" "%armor" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKogasa.lua" + "Function" "OnDestroyKogasa02Debuff" + "armor" "%armor" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "armor" "4 8 16" + } + } + } + + "thtd_kogasa_03" + { + "ID" "9114" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/ai_cast_point" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCastPointAI" + "Target" "POINT" + } + } + } + + "thtd_lyrica_01" + { + "ID" "9115" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_lyrica_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "2" + "AbilityCooldown" "1" + "AbilityManaCost" "40" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityLyrica.lua" + "Function" "OnLyrica01SpellStart" + "Target" "POINT" + "radius" "%radius" + "damage_up" "%damage_up" + } + } + + "Modifiers" + { + "modifier_thtd_lyrica_01_aura" + { + "IsHidden" "1" + + "Aura" "modifier_lyrica_lunasa_merlin_combo" + "Aura_Radius" "2500" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_lyrica_lunasa_merlin_combo" + { + "IsHidden" "1" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage1" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up" "50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "power_damage2" "2" + } + "05" + { + "var_type" "FIELD_INTEGER" + "power_damage3" "4" + } + "06" + { + "var_type" "FIELD_INTEGER" + "open_aura_level" "2" + } + } + } + + "thtd_lyrica_02" + { + "ID" "9116" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_lyrica_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + } + + "thtd_lunasa_01" + { + "ID" "9117" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_lunasa_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "40" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityLunasa.lua" + "Function" "OnLunasa01SpellStart" + "Target" "POINT" + "radius" "%radius" + "duration_time" "%duration_time" + "stun_time1" "%stun_time1" + "stun_time2" "%stun_time2" + } + } + + "Modifiers" + { + "modifier_lunasa_01_debuff" + { + "Duration" "%duration_time" + "EffectName" "particles/heroes/lunasa/ability_lunasa_buff.vpcf" + "EffectAttachType" "follow_origin" + } + "modifier_lunasa_01_pause" + { + "OverrideAnimation" "ACT_DOTA_FLAIL" + "EffectName" "particles/heroes/lunasa/ability_lunasa_buff.vpcf" + "EffectAttachType" "follow_origin" + + "States" + { + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "01" + { + "var_type" "FIELD_FLOAT" + "duration_time" "5.0" + } + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "01" + { + "var_type" "FIELD_FLOAT" + "stun_time1" "1.0" + } + "01" + { + "var_type" "FIELD_FLOAT" + "stun_time2" "0.5" + } + } + } + + "thtd_lunasa_02" + { + "ID" "9118" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_lunasa_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "Modifiers" + { + "passive_lunasa_02_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityLunasa.lua" + "Function" "OnLunasa02AttackLanded" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + } + } + + "thtd_merlin_01" + { + "ID" "9119" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_merlin_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "5" + "AbilityCooldown" "1" + "AbilityManaCost" "40" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMerlin.lua" + "Function" "OnMerlin01SpellStart" + "Target" "POINT" + "radius" "%radius" + "mana_regen" "%mana_regen" + } + } + + "Modifiers" + { + "modifier_merlin_01_debuff" + { + "Duration" "%move_slow_duration" + + "EffectName" "particles/heroes/merlin/ability_merlin_buff.vpcf" + "EffectAttachType" "follow_origin" + + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_slow" + } + } + + "modifier_merlin_01_buff" + { + "Duration" "%duation_time" + + "EffectName" "particles/heroes/merlin/ability_merlin_buff.vpcf" + "EffectAttachType" "follow_origin" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMerlin.lua" + "Function" "OnMerlin01Created" + "outgoing_percent" "%outgoing_percent" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMerlin.lua" + "Function" "OnMerlin01Destroy" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-10 -20 -30 -40 -50" + } + "04" + { + "var_type" "FIELD_FLOAT" + "move_slow_duration" "5.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "outgoing_percent" "50" + } + "06" + { + "var_type" "FIELD_FLOAT" + "duation_time" "10.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "mana_regen" "40" + } + } + } + + "thtd_merlin_02" + { + "ID" "9120" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_merlin_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + + } + "Modifiers" + { + "passive_merlin_02_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityMerlin.lua" + "Function" "OnMerlin02AttackLanded" + } + } + } + } + + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + } + } + + "thtd_rumia_01" + { + "ID" "9121" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_rumia_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "5" + + "Modifiers" + { + "passive_rumia_01_kill" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityRumia.lua" + "Function" "OnRumia01AttackLanded" + } + } + + "OnKill" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityRumia.lua" + "Function" "OnRumia01Kill" + "max_bonus" "%max_bonus" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_bonus" "5 10 20 40 60" + } + } + } + + "thtd_rumia_02" + { + "ID" "9122" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_rumia_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/rumia/ability_rumia_02_ex_projectile.vpcf" + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "true" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityRumia.lua" + "Target" "TARGET" + "Function" "OnRumiaProjectileHit" + } + } + + "Modifiers" + { + "passive_rumia_02_attack_landed" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityRumia.lua" + "Function" "OnRumia02AttackLanded" + "max_count" "%max_count" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage1" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_damage2" "4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_count" "10" + } + } + } + + "thtd_rumia_03" + { + "ID" "9123" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_rumia_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/thtd_rumia/ability_rumia_03.vpcf" + } + + "Modifiers" + { + "passive_rumia_03_attack_landed" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityRumia.lua" + "Function" "OnRumia03AttackLanded" + "chance" "%chance" + } + } + } + + "modifier_rumia_03_pause" + { + "Duration" "1.5" + "States" + { + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + //"MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + "Properties" + { + "MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE" "-100" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chance" "10" + } + } + } + + "thtd_rumia_04" + { + "ID" "9124" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_rumia_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "precache" + { + "particle" "particles/heroes/thtd_rumia/ability_rumia_04.vpcf" + "particle" "particles/heroes/thtd_rumia/ability_rumia_04_explosion.vpcf" + } + + "Modifiers" + { + "passive_rumia_04_attack_landed" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityRumia.lua" + "Function" "Rumia04AttackTargetPoint" + "range" "%range" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2 3" + } + "02" + { + "var_type" "FIELD_FLOAT" + "range" "300" + } + } + } + + "thtd_satori_01" + { + "ID" "9125" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_satori_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "5" + "AbilityCooldown" "1" + "AbilityManaCost" "10" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "500" + "AOERadius" "%radius" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySatori.lua" + "Function" "OnSatori01SpellStart" + "Target" "POINT" + "radius" "%radius" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "modifier_satori_01_debuff" + { + "EffectName" "particles/heroes/satori/ability_satori_01.vpcf" + "EffectAttachType" "follow_origin" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySatori.lua" + "Function" "OnSatori01ModifierCreated" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySatori.lua" + "Function" "OnSatori01ModifierDestroy" + } + } + + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_slow" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "800" + } + "02" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-35 -40 -45 -50 -55" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "3.0" + } + } + } + + "thtd_satori_02" + { + "ID" "9126" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_satori_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "Modifiers" + { + "modifier_thtd_satori_02_combo_buff" + { + + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_percent" "40 100" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_up" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "has_combo_buff" "1" + } + } + } + + "thtd_iku_01" + { + "ID" "9127" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_iku_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "Modifiers" + { + "passive_iku_01_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityIku.lua" + "Function" "OnIku01AttackLanded" + "radius" "%radius" + "stun_time" "%stun_time" + "max_count" "%max_count" + } + } + } + + "modifier_iku_01_debuff" + { + "EffectName" "particles/heroes/iku/ability_iku_lightning.vpcf" + "EffectAttachType" "follow_origin" + + "States" + { + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + + "modifier_iku_01_debuff_lock" + { + "IsHidden" "1" + "Duration" "%lock_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_count" "6" + } + "04" + { + "var_type" "FIELD_FLOAT" + "stun_time" "0.5 1.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "lock_time" "1.5" + } + } + } + + "thtd_iku_02" + { + "ID" "9128" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_iku_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "30" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityIku.lua" + "Function" "OnIku02SpellStart" + "Target" "POINT" + "radius" "%radius" + "duration_time" "%duration_time" + "tick_time" "%tick_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration_time" "3.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "tick_time" "0.3" + } + } + } + + "thtd_mystia_01" + { + "ID" "9129" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_mystia_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "5" + "AbilityCastRange" "%radius" + + "Modifiers" + { + "modifier_mystia_01_aura" + { + "Passive" "1" + "IsHidden" "1" + + "Aura" "modifier_mystia_01_buff" + "Aura_Radius" "%radius" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_mystia_01_buff" + { + "IsHidden" "1" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMystia.lua" + "Function" "OnCreatedMystia01Debuff" + "penetration" "%penetration" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMystia.lua" + "Function" "OnDestroyMystia01Debuff" + "penetration" "%penetration" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "penetration" "1 2 4 7 13" + } + } + } + + "thtd_mystia_02" + { + "ID" "9130" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_mystia_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "3" + "AbilityCastRange" "1200" + + "Modifiers" + { + "modifier_mystia_02_aura" + { + "Passive" "1" + "IsHidden" "1" + + // "Aura" "modifier_mystia_02_buff" + // "Aura_Radius" "%radius" + // "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + // "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "ThinkInterval" "0.2" + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMystia.lua" + "Function" "OnThinkMystia02Buff" + "Target" "TARGET" + "radius" "%radius" + } + } + } + + "modifier_mystia_02_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMystia.lua" + "Function" "OnCreatedMystia02Buff" + "critdamage" "%critdamage" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMystia.lua" + "Function" "OnDestroyMystia02Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "critdamage" "50 100 200" + } + } + } + + "thtd_marisa_01" + { + "ID" "9131" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_marisa_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastPoint" "0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "AbilityCooldown" "1" + "AbilityManaCost" "40" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + "AbilityCastRange" "1000" + "AbilityChannelTime" "%channel_time" //类型必须为FIELD_FLOAT,否则施法动作无效 + + "precache" + { + "particle" "particles/thd2/heroes/marisa/marisa_04_spark.vpcf" + "particle" "particles/thd2/heroes/marisa/marisa_04_spark_wind_b.vpcf" + "particle" "particles/heroes/marisa/marisa_04_spark_circle.vpcf" + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "true" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Target" "TARGET" + "Function" "OnMarisa02SpellHit" + } + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Sound_THTD.thtd_marisa_01" + "Target" "CASTER" + } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Function" "OnMarisa01SpellStart" + "Caster" "CASTER" + "Target" "POINT" + "channel_time" "%channel_time" + } + "CreateThinker" + { + "ModifierName" "modifier_thdots_marisa01_think_interval" + "Target" "POINT" + } + } + "OnChannelInterrupted" + { + "RemoveModifier" + { + "Target" "CASTER" + "ModifierName" "modifier_thdots_marisa01_think_interval" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Function" "OnMarisa01SpellRemove" + "Caster" "CASTER" + } + } + "OnChannelFinish" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Function" "OnMarisa01SpellRemove" + "Caster" "CASTER" + } + } + "Modifiers" + { + "modifier_thdots_marisa01_think_interval" + { + "Duration" "%channel_time" + "ThinkInterval" "0.02" + "Attributes" "MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Function" "OnMarisa01SpellThink" + "Caster" "CASTER" + "Target" "TARGET" + "DamageWidth" "%damage_width" + "DamageLenth" "%damage_lenth" + } + } + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Function" "OnMarisa01SpellRemove" + "Caster" "CASTER" + } + } + } + } + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "power_damage" "3.5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_width" "320" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_lenth" "1440" + } + "04" + { + "var_type" "FIELD_FLOAT" + "channel_time" "5.0 7.0" + } + } + } + + "thtd_marisa_02" + { + "ID" "9132" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_marisa_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "precache" + { + "particle" "particles/heroes/thtd_marisa/ability_marisa_02.vpcf" + "particle" "particles/heroes/thtd_marisa/ability_marisa_02_pink.vpcf" + "particle" "particles/heroes/thtd_marisa/ability_marisa_02_blue.vpcf" + "particle" "particles/heroes/thtd_marisa/ability_marisa_02_normal.vpcf" + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "true" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Target" "TARGET" + "Function" "OnMarisa02SpellHit" + "mana" "%mana" + } + } + + "Modifiers" + { + "passive_marisa_02_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Function" "OnMarisa02AttackLanded" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "mana" "1" + } + } + } + + "thtd_marisa_03" + { + "ID" "9133" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_marisa_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastPoint" "0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "AbilityCooldown" "1" + "AbilityManaCost" "60" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + "AbilityCastRange" "1000" + "AbilityChannelTime" "%channel_time" //类型必须为FIELD_FLOAT,否则施法动作无效 + + "precache" + { + "particle" "particles/thd2/heroes/marisa/marisa_04_spark.vpcf" + "particle" "particles/thd2/heroes/marisa/marisa_04_spark_wind_b.vpcf" + "particle" "particles/heroes/marisa/marisa_04_spark_circle.vpcf" + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "true" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Target" "TARGET" + "Function" "OnMarisa02SpellHit" + } + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Sound_THTD.thtd_marisa_01" + "Target" "CASTER" + } + "FireSound" + { + "EffectName" "Voice_THTD.marisa.ability_03" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Function" "OnMarisa01SpellStart" + "Caster" "CASTER" + "Target" "POINT" + "channel_time" "%channel_time" + } + "CreateThinker" + { + "ModifierName" "modifier_thdots_marisa01_think_interval" + "Target" "POINT" + } + } + "OnChannelInterrupted" + { + "RemoveModifier" + { + "Target" "CASTER" + "ModifierName" "modifier_thdots_marisa01_think_interval" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Function" "OnMarisa01SpellRemove" + "Caster" "CASTER" + } + } + "OnChannelFinish" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Function" "OnMarisa01SpellRemove" + "Caster" "CASTER" + } + } + "Modifiers" + { + "modifier_thdots_marisa01_think_interval" + { + "Duration" "%channel_time" + "ThinkInterval" "0.02" + "Attributes" "MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Function" "OnMarisa01SpellThink" + "Caster" "CASTER" + "Target" "TARGET" + "DamageWidth" "%damage_width" + "DamageLenth" "%damage_lenth" + "power_up" "%power_up" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMarisa.lua" + "Function" "OnMarisa01SpellRemove" + "Caster" "CASTER" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_up" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_width" "320" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_lenth" "1440" + } + "05" + { + "var_type" "FIELD_FLOAT" + "channel_time" "5.0 7.0" + } + } + } + + "thtd_tenshi_01" + { + "ID" "9134" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_tenshi_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "1" + "AbilityManaCost" "45" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityTenshi.lua" + "Function" "OnTenshi01SpellStart" + "Target" "TARGET" + "range" "%range" + "bonus_attack_power" "%bonus_attack_power" + "duration_time" "%duration_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus_attack_power" "25" + } + "04" + { + "var_type" "FIELD_INTEGER" + "duration_time" "5" + } + } + } + + "thtd_tenshi_02" + { + "ID" "9135" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_tenshi_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "Modifiers" + { + "modifier_thtd_tenshi_02_aura" + { + "IsHidden" "1" + "ThinkInterval" "0.6" + + "OnAttackLanded" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityTenshi.lua" + "Function" "OnTenshi02AttackLanded" + "Target" "TARGET" + "range" "%range" + } + } + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityTenshi.lua" + "Function" "OnThinkTenshi02Buff" + "chance" "%chance" + "crit" "%crit" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityTenshi.lua" + "Function" "OnDestroyTenshi02Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chance" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crit" "400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "200" + } + "04" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "05" + { + "var_type" "FIELD_INTEGER" + "open_aura_level" "1" + } + } + } + + "thtd_tenshi_03" + { + "ID" "9136" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_tenshi_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + "AbilityCastRange" "1200" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_magnataur.vsndevts" + "particle" "particles/heroes/tenshi/ability_tenshi_03.vpcf" + "particle" "particles/units/heroes/hero_elder_titan/elder_titan_earth_splitter.vpcf" + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "false" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityTenshi.lua" + "Target" "TARGET" + "Function" "OnTenshiProjectileHit" + } + } + + "Modifiers" + { + "passive_tenshi_03_attack_landed" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityTenshi.lua" + "Function" "OnTenshi03AttackLanded" + "max_count" "%max_count" + } + } + } + + "modifier_thtd_tenshi_03_aura" + { + "IsHidden" "1" + + // "Aura" "modifier_tenshi_03_attack_speed_buff" + // "Aura_Radius" "%radius" + // "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + // "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + + "ThinkInterval" "0.2" + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityTenshi.lua" + "Function" "OnThinkTenshi03Buff" + "Target" "TARGET" + "radius" "%radius" + } + } + } + + "modifier_tenshi_03_attack_speed_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityTenshi.lua" + "Function" "OnCreatedTenshi03Buff" + "attack_speed" "%attack_speed" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityTenshi.lua" + "Function" "OnDestroyTenshi03Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "15 8" + } + "03" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + "04" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "20" + } + "05" + { + "var_type" "FIELD_INTEGER" + "open_aura_level" "1" + } + } + } + + "thtd_patchouli_01" + { + "ID" "9137" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_patchouli_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + "MaxLevel" "5" + "AbilityCooldown" "1" + "AbilityManaCost" "50" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%range1" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_kunkka.vsndevts" + "particle" "particles/econ/items/treant_protector/ti7_shoulder/treant_ti7_livingarmor.vpcf" + "particle" "particles/econ/items/treant_protector/ti7_shoulder/treant_ti7_crimson_livingarmor.vpcf" + "particle" "particles/econ/items/treant_protector/ti7_shoulder/treant_ti7_golden_livingarmor.vpcf" + } + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityPatchouli.lua" + "Function" "OnPatchouli01SpellStart" + "Target" "POINT" + "range1" "%range1" + "range2" "%range2" + "duration_time2" "%duration_time2" + "range3" "%range3" + "duration_time3" "%duration_time3" + + } + } + "Modifiers" + { + "modifier_patchouli_01_mercury_poison_debuff" + { + "Duration" "%duration_time3" + "ThinkInterval" "0.2" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityPatchouli.lua" + "Function" "OnPatchouli01MercuryPoisonThink" + "Target" "TARGET" + } + } + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityPatchouli.lua" + "Function" "OnPatchouli01MercuryPoisonCreated" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityPatchouli.lua" + "Function" "OnPatchouli01MercuryPoisonDestroy" + } + } + } + + "modifier_patchouli_01_buff_fire" + { + + } + + "modifier_patchouli_01_buff_water" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityPatchouli.lua" + "Function" "OnPatchouli01BuffWaterCreated" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityPatchouli.lua" + "Function" "OnPatchouli01BuffWaterDestroy" + } + } + } + + "modifier_patchouli_01_debuff_gold" + { + + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage1" "8" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range1" "350" + } + "03" + { + "var_type" "FIELD_INTEGER" + "power_damage2" "1" + } + "04" + { + "var_type" "FIELD_INTEGER" + "range2" "300" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration_time2" "10.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "power_damage3" "4" + } + "07" + { + "var_type" "FIELD_INTEGER" + "range3" "300" + } + "08" + { + "var_type" "FIELD_FLOAT" + "duration_time3" "10.0" + } + } + } + + "thtd_patchouli_02" + { + "ID" "9138" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_patchouli_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityCooldown" "1" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "1" + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityPatchouli.lua" + "Function" "OnPatchouli02SpellStart" + } + } + } + + "thtd_patchouli_03" + { + "ID" "9139" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_patchouli_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + "AbilityCastRange" "1200" + + "Modifiers" + { + "modifier_patchouli_03_aura" + { + "Passive" "1" + "IsPurgable" "0" + "IsHidden" "1" + + "Aura" "modifier_patchouli_03_buff" + "Aura_Radius" "1200" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_patchouli_03_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityPatchouli.lua" + "Function" "OnCreatedPatchouli03Buff" + "magic_outgoing" "%magic_outgoing" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityPatchouli.lua" + "Function" "OnDestroyPatchouli03Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "magic_outgoing" "30" + } + } + } + + "thtd_patchouli_04" + { + "ID" "9140" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_patchouli_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "MaxLevel" "2" + "AbilityCooldown" "20" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "800" + + "precache" + { + "particle" "particles/heroes/thtd_patchouli_04/ability_patchouli_04.vpcf" + } + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Voice_THTD.patchouli.ability_04" + "Target" "CASTER" + } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityPatchouli.lua" + "Function" "OnPatchouli04SpellStart" + "range" "%range" + "duration_time" "%duration_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "1000" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "0 2.0" + } + } + } + + "thtd_reisen_01" + { + "ID" "9141" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_reisen_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_sniper.vsndevts" + } + + "Modifiers" + { + "passive_reisen_01_attack_landed" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityReisen.lua" + "Function" "OnReisen01AttackLanded" + } + } + } + } + } + + "thtd_reisen_02" + { + "ID" "9142" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_reisen_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "Modifiers" + { + "passive_reisen_02_create_illusion" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityReisen.lua" + "Function" "OnReisen02AttackLanded" + "max_count" "%max_count" + "chance" "%chance" + } + } + } + + "modifier_reisen_02_illusion" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + } + "Properties" + { + "MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE" "-100" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chance" "60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "3 5" + } + } + } + + "thtd_reisen_03" + { + "ID" "9143" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_reisen_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCooldown" "1" + "AbilityManaCost" "60" + "AbilityCastRange" "1000" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityReisen.lua" + "Function" "OnReisen03SpellStart" + "range" "%range" + "damage_up" "%damage_up" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "450" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up" "100" + } + } + } + + "thtd_yuyuko_01" + { + "ID" "9144" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yuyuko_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCooldown" "1" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "30" + "MaxLevel" "2" + "AbilityCastRange" "1000" + + "OnProjectileHitUnit" + { + "DeleteOnHit" "1" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuyuko.lua" + "Target" "TARGET" + "Function" "OnYuyuko01SpellHit" + } + } + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityYuyuko.lua" + "Function" "OnYuyuko01SpellStart" + "max_count" "%max_count" + "tick_time" "%tick_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "1 2" + } + "03" + { + "var_type" "FIELD_FLOAT" + "tick_time" "0.2" + } + } + } + + "thtd_yuyuko_02" + { + "ID" "9145" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yuyuko_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chance" "10 15" + } + } + } + + "thtd_yuyuko_03" + { + "ID" "9146" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yuyuko_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + "AbilityCastPoint" "0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "OverrideAnimation" "ACT_DOTA_CHANNEL_ABILITY_4" + "AbilityCooldown" "20" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "AbilityChannelTime" "5.0" + "AbilityCastRange" "1000" + "AOERadius" "%damage_radius" + + "precache" + { + "particle" "particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect.vpcf" + "particle" "particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect_a.vpcf" + "particle" "particles/heroes/yuyuko/ability_yuyuko_04_effect_d.vpcf" + "soundfile" "soundevents/thdots_hero_sounds/thdots_yuyuko_sounds.vsndevts" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuyuko.lua" + "Function" "OnSpellStartYuyuko03" + "Caster" "CASTER" + "Target" "POINT" + "damage_radius" "%damage_radius" + } + + "ApplyModifier" + { + "ModifierName" "modifier_yuyuko_03_think" + "Target" "CASTER" + } + } + + "OnChannelInterrupted" + { + "RemoveModifier" + { + "Target" "CASTER" + "ModifierName" "modifier_yuyuko_03_think" + } + } + + "Modifiers" + { + "modifier_yuyuko_03_think" + { + "Duration" "%duration_time" + "ThinkInterval" "0.25" + "Attributes" "MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE" + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuyuko.lua" + "Function" "OnThinkYuyuko03" + "Target" "POINT" + "damage_radius" "%damage_radius" + "health_kill" "%health_kill" + } + } + } + + "modifier_yuyuko04_killed" + { + "Duration" "1.0" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "health_kill" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_radius" "550" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "5.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "max_count" "100" + } + } + } + + "thtd_youmu_01" + { + "ID" "9147" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_youmu_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "precache" + { + "particle" "particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect.vpcf" + "particle" "particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect_a.vpcf" + "particle" "particles/heroes/yuyuko/ability_yuyuko_04_effect_d.vpcf" + "soundfile" "soundevents/thdots_hero_sounds/thdots_yuyuko_sounds.vsndevts" + } + + "Modifiers" + { + "passive_youmu_01_attack_landed" + { + "Passive" "1" + "IsHidden" "1" + "EffectName" "particles/thd2/heroes/youmu/ability_youmu_soul.vpcf" + "EffectAttachType" "follow_origin" + + "Properties" + { + "MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT" "%attack_speed" + } + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityYoumu.lua" + "Function" "OnYoumu01AttackLanded" + "max_count" "%max_count" + "length" "%length" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "8" + } + "03" + { + "var_type" "FIELD_INTEGER" + "length" "1000" + } + "04" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "0 50" + } + } + } + + "thtd_youmu_02" + { + "ID" "9148" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_youmu_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chance" "40 70" + } + } + } + + "thtd_youmu_03" + { + "ID" "9149" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_youmu_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityManaCost" "15" + "AbilityCastRange" "1000" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "particle" "particles/thd2/heroes/youmu/youmu_04_sword_effect.vpcf" + "particle" "particles/heroes/youmu/youmu_04_circle.vpcf" + "particle" "particles/heroes/youmu/youmu_02_effect_explosion.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYoumu.lua" + "Function" "OnYoumu03SpellStart" + "Target" "POINT" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + } + } + + "thtd_rin_01" + { + "ID" "9150" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_rin_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityManaCost" "35" + "AbilityCastRange" "1000" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "OnProjectileHitUnit" + { + "DeleteOnHit" "false" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityRin.lua" + "Target" "TARGET" + "Function" "OnRin01ProjectileHit" + } + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityRin.lua" + "Function" "OnRin01SpellStart" + "Target" "TARGET" + } + } + + "Modifiers" + { + "modifier_rin_01_debuff" + { + "EffectName" "particles/heroes/rin/ability_rin_02_body_c.vpcf" + "EffectAttachType" "follow_origin" + + "OnDeath" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityRin.lua" + "Function" "OnRin01Death" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + } + } + + "thtd_rin_02" + { + "ID" "9151" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_rin_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "3" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_nevermore.vsndevts" + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "hp_damage" "4 8 15" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_damage" "48" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + } + } + + "thtd_utsuho_01" + { + "ID" "9152" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_utsuho_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + "AbilityCastRange" "1200" + + "Modifiers" + { + "modifier_thtd_utsuho_01_aura" + { + "IsHidden" "1" + + "Aura" "modifier_utsuho_rin_buff" + "Aura_Radius" "1200" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_utsuho_rin_buff" + { + "EffectName" "particles/heroes/rin/ability_rin_utsuho_buff.vpcf" + "EffectAttachType" "follow_origin" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityUtsuho.lua" + "Function" "OnCreatedUtsuhoRinBuff" + "damage_up" "%damage_up" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityUtsuho.lua" + "Function" "OnDestroyUtsuhoRinBuff" + } + } + } + + "passive_utsuho_01_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityUtsuho.lua" + "Function" "OnUtsuho01Attack" + "range" "%range" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "180" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "open_aura_level" "2" + } + } + } + + "thtd_utsuho_02" + { + "ID" "9153" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_utsuho_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + + "soundfile" "soundevents/game_sounds_heroes/game_sounds_invoker.vsndevts" + } + + "Modifiers" + { + "passive_utsuho_02_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityUtsuho.lua" + "Function" "OnUtsuho02Attack" + "range" "%range" + "max_count" "%max_count" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "360" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_count" "5" + } + } + } + + "thtd_utsuho_03" + { + "ID" "9154" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_utsuho_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCastPoint" "0.1" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "AbilityCooldown" "30 15" + "AbilityManaCost" "60 30" + "MaxLevel" "2" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityChannelTime" "%duration_time" + "AOERadius" "%radius" + + "precache" + { + "particle" "particles/thd2/heroes/utsuho/ability_utsuho04_effect.vpcf" + "particle" "particles/units/heroes/hero_phoenix/phoenix_supernova_reborn.vpcf" + "particle" "particles/thd2/heroes/utsuho/ability_utsuho04_end.vpcf" + "soundfile" "soundevents/thdots_hero_sounds/thdots_utsuho_sounds.vsndevts" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_phoenix.vsndevts" + } + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Voice_Thdots_Utsuho.AbilityUtsuho04" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityUtsuho.lua" + "Function" "OnUtsuho03SpellStart" + "Caster" "CASTER" + "Target" "POINT" + } + "DelayedAction" + { + "Delay" "0" + "Action" + { + "ApplyModifier" + { + "Target" "CASTER" + "ModifierName" "modifier_thdots_Utsuho04_think_interval" + } + } + } + } + "OnChannelInterrupted" + { + "RemoveModifier" + { + "Target" "CASTER" + "ModifierName" "modifier_thdots_Utsuho04_think_interval" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityUtsuho.lua" + "Function" "OnUtsuho03SpellRemove" + "Target" + { + "Types" "DOTA_UNIT_TARGET_BASIC | DOTA_UNIT_TARGET_HERO" + "Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Flags" "DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES" + "Center" "POINT" + "Radius" "%radius" + } + } + } + "OnChannelFinish" + { + "RemoveModifier" + { + "Target" "CASTER" + "ModifierName" "modifier_thdots_Utsuho04_think_interval" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityUtsuho.lua" + "Function" "OnUtsuho03SpellRemove" + "Target" + { + "Types" "DOTA_UNIT_TARGET_BASIC | DOTA_UNIT_TARGET_HERO" + "Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Flags" "DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES" + "Center" "POINT" + "Radius" "%radius" + } + } + } + "Modifiers" + { + "modifier_thdots_Utsuho04_think_interval" + { + "ThinkInterval" "%thinkInterval" + "Duration" "%duration_time" + "OverrideAnimation" "Act_DOTA_CAST_ABILITY_4" + "Attributes" "MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE" + + "OnCreated" + { + "FireSound" + { + "EffectName" "Hero_Phoenix.SuperNova.Cast" + "Target" "TARGET" + } + } + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityUtsuho.lua" + "Function" "OnUtsuho03SpellThink" + "Gravity" "%gravity" + "radius" "%radius" + } + } + + "OnDestroy" + { + "RemoveModifier" + { + "Target" "CASTER" + "ModifierName" "modifier_thdots_Utsuho04_think_interval" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityUtsuho.lua" + "Function" "OnUtsuho03SpellRemove" + "Target" + { + "Types" "DOTA_UNIT_TARGET_BASIC | DOTA_UNIT_TARGET_HERO" + "Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Flags" "DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES" + "Center" "POINT" + "Radius" "%radius" + } + } + + "FireSound" + { + "EffectName" "Hero_Phoenix.SuperNova.Explode" + "Target" "TARGET" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "7" + } + "02" + { + "var_type" "FIELD_FLOAT" + "thinkInterval" "0.05" + } + "03" + { + "var_type" "FIELD_INTEGER" + "gravity" "200" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius" "750" //与特效视觉匹配,不要改 + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration_time" "3.5" + } + } + } + + "thtd_utsuho_04" + { + "ID" "9155" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/ai_cast_point" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCastPointAI" + "Target" "POINT" + } + } + } + + "thtd_reimu_01" + { + "ID" "9156" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_reimu_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "precache" + { + "particle" "particles/heroes/thtd_reimu/ability_reimu_01_projectile.vpcf" + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "true" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityReimu.lua" + "Target" "TARGET" + "Function" "OnReimu01ProjectileHit" + } + } + + "Modifiers" + { + "passive_reimu_01_attack_landed" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityReimu.lua" + "Function" "OnReimu01AttackLanded" + "max_count" "%max_count" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "6 3" + } + } + } + + "thtd_reimu_02" + { + "ID" "9157" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_reimu_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chance" "25 50" + } + } + } + + "thtd_reimu_03" + { + "ID" "9158" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_reimu_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_3" + "AbilityManaCost" "30" + "AbilityCastRange" "1000" + "AbilityCooldown" "1" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/reimu/reimu_01_ball.vpcf" + "particle" "particles/heroes/reimu/reimu_01_effect.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityReimu.lua" + "Function" "OnReimu03SpellStart" + "Target" "POINT" + "range" "%range" + "stun_time" "%stun_time" + "max_count" "%max_count" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "6" + } + "02" + { + "var_type" "FIELD_FLOAT" + "stun_time" "0.6" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_count" "3" + } + "04" + { + "var_type" "FIELD_INTEGER" + "range" "600" + } + } + } + + "thtd_reimu_04" + { + "ID" "9159" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_reimu_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "precache" + { + "particle" "particles/heroes/thtd_reimu/ability_reimu_04_projectile.vpcf" + "particle" "particles/heroes/thtd_reimu/ability_reimu_04_explosion.vpcf" + "particle" "particles/heroes/thtd_reimu/ability_reimu_04.vpcf" + } + + "Modifiers" + { + "modifier_reimu_04_think" + { + "ThinkInterval" "0.02" + "Passive" "1" + "IsHidden" "1" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityReimu.lua" + "Function" "OnReimu04SpellThink" + "range" "%range" + "power_up" "%power_up" + } + } + + "OnDeath" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityReimu.lua" + "Function" "Reimu04ReleaseBall" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityReimu.lua" + "Function" "Reimu04ReleaseBall" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "9 12" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "power_up" "120" + } + } + } + + "thtd_reimu_05" + { + "ID" "9160" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/ai_cast_point" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCastPointAI" + "Target" "POINT" + } + } + } + + "thtd_daiyousei_01" + { + "ID" "9161" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_daiyousei_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "5" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "7.5" + "AbilityManaCost" "0" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1200" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_enchantress.vsndevts" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityDaiyousei.lua" + "Function" "OnDaiyousei01SpellStart" + "Target" "TARGET" + "level_up" "%level_up" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "level_up" "1 2 3 4 5" + } + } + } + + "thtd_daiyousei_02" + { + "ID" "9162" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_daiyousei_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityCooldown" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "15" + "MaxLevel" "1" + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityDaiyousei.lua" + "Function" "OnDaiyousei02SpellStart" + "mana_reg" "%mana_reg" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "mana_reg" "10" + } + } + + } + + "thtd_daiyousei_03" + { + "ID" "9163" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_daiyousei_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityDaiyousei.lua" + "Function" "OnDaiyousei03SpellStart" + "Target" "TARGET" + } + } + + "OnUpgrade" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityDaiyousei.lua" + "Function" "OnUpgradeDaiyousei03Buff" + "damage_up" "%damage_up" + "crino_up" "%crino_up" + } + } + + "Modifiers" + { + "modifier_daiyousei_03" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityDaiyousei.lua" + "Function" "OnCreatedDaiyousei03Buff" + "damage_up" "%damage_up" + "crino_up" "%crino_up" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityDaiyousei.lua" + "Function" "OnDestroyDaiyousei03Buff" + } + } + } + "modifier_thtd_daiyousei_03_combo_buff" + { + } + } + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_up" "30 40 60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crino_up" "45 60 90" + } + "03" + { + "var_type" "FIELD_INTEGER" + "has_combo_buff" "1" + } + } + } + + "thtd_daiyousei_04" + { + "ID" "9164" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_daiyousei_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/daiyousei/ability_daiyousei_03.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityDaiyousei.lua" + "Function" "OnDaiyousei04SpellStart" + "Target" "TARGET" + } + } + } + + "thtd_remilia_01" + { + "ID" "9165" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_remilia_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "1" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "30" + "MaxLevel" "1" + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/moluo/ability_moluo01_explosion_vip.vpcf" + "particle" "particles/heroes/moluo/abiilty_moluo_014.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_nightstalker.vsndevts" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Hero_Nightstalker.Void" + "Target" "CASTER" + } + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityRemilia.lua" + "Function" "OnRemilia01SpellStart" + "range" "%range" + "power_bonus" "%power_bonus" + "duration_time" "%duration_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "800" + } + "03" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "1" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10.0" + } + } + } + + "thtd_remilia_02" + { + "ID" "9166" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_remilia_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_up" "1 2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_up" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "duration_time" "20" + } + } + } + + "thtd_remilia_03" + { + "ID" "9167" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_remilia_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "8" + "AbilityManaCost" "0" + "AbilityCastRange" "2000" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/remilia/ability_remilia_01.vpcf" + "particle" "particles/heroes/thtd_remilia/ability_remilia_03_end.vpcf" + "particle" "particles/heroes/remilia/ability_remilia_03_spark.vpcf" + "particle" "particles/heroes/remilia/ability_remilia_04_laser.vpcf" + "particle" "particles/heroes/remilia/ability_remilia_04_laser_rocket.vpcf" + "particle" "particles/heroes/remilia/ability_remilia_01_explosion.vpcf" + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "false" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityRemilia.lua" + "Target" "TARGET" + "Function" "OnRemilia03SpellHit" + } + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Sound_THTD.thtd_remilia_03" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityRemilia.lua" + "Function" "OnRemilia03SpellStart" + "Target" "POINT" + "distance" "%distance" + } + } + "Modifiers" + { + "modifier_remilia_03_debuff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityRemilia.lua" + "Function" "OnRemilia03Created" + } + } + + "OnDeath" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityRemilia.lua" + "Function" "OnRemilia03Destroy" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "distance" "2500" + } + } + } + + "thtd_remilia_04" + { + "ID" "9168" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_remilia_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chance" "8 15" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_damage_03" "48" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up" "60" + } + "04" + { + "var_type" "FIELD_INTEGER" + "power_damage" "10" + } + "05" + { + "var_type" "FIELD_FLOAT" + "tick_time" "0.5" + } + "06" + { + "var_type" "FIELD_FLOAT" + "duration_time" "3.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "range" "500" + } + } + } + + "thtd_flandre_01" + { + "ID" "9169" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_flandre_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCooldown" "10" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "1" + "AbilityCastRange" "1000" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_phantom_lancer.vsndevts" + } + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityFlandre.lua" + "Function" "OnFlandre01SpellStart" + } + } + + "Modifiers" + { + "modifier_flandre_01_illusion" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + } + "Properties" + { + "MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE" "-100" + } + } + } + } + + "thtd_flandre_02" + { + "ID" "9170" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_flandre_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/thtd_flandre/ability_flandre_02_fire.vpcf" + "particle" "particles/heroes/thtd_flandre/abiilty_flandre_02_explosion.vpcf" + "particle" "particles/units/heroes/hero_bounty_hunter/bounty_hunter_track_trail.vpcf" + "particle" "particles/units/heroes/hero_bounty_hunter/bounty_hunter_track_shield.vpcf" + } + + "Modifiers" + { + "modifier_flandre_02_attack_start" + { + "IsHidden" "1" + "Passive" "1" + + "OnCreated" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityFlandre.lua" + "Function" "OnFlandre02Created" + } + } + + "OnAttackStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityFlandre.lua" + "Function" "OnFlandre02AttackStart" + } + } + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityFlandre.lua" + "Function" "OnFlandre02AttackLanded" + } + } + + "OnDestroy" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityFlandre.lua" + "Function" "OnFlandre02Destroy" + } + } + } + + "modifier_flandre_damage_lock" + { + "IsHidden" "1" + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityFlandre.lua" + "Function" "OnCreatedFlandreLock" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityFlandre.lua" + "Function" "OnDestroyFlandreLock" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_up" "1 2" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_up" "50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "duration_time" "20" + } + } + } + + "thtd_flandre_03" + { + "ID" "9171" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_flandre_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_up" "2" + } + } + } + + "thtd_flandre_04" + { + "ID" "9172" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_flandre_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCooldown" "6.0" + "AbilityCastPoint" "0.0" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "1" + "AbilityCastRange" "2000" + + "precache" + { + "particle" "particles/heroes/thtd_flandre/ability_flandre_04_start.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityFlandre.lua" + "Function" "OnFlandre04SpellStart" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "10" + } + } + } + + "thtd_sakuya_01" + { + "ID" "9173" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_sakuya_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "0.2" + "AbilityManaCost" "40" + "AbilityCastRange" "1000" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "particle" "particles/thd2/heroes/sakuya/ability_sakuya_01.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_bristleback.vsndevts" + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "false" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySakuya.lua" + "Target" "TARGET" + "Function" "OnSakuya01ProjectileHit" + } + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Hero_Bristleback.QuillSpray.Cast" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySakuya.lua" + "Function" "OnSakuya01SpellStart" + "Target" "POINT" + "max_count" "%max_count" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "6" + } + } + } + + "thtd_sakuya_02" + { + "ID" "9174" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_sakuya_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "2" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AbilityCooldown" "15" + "AbilityManaCost" "0" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/thd2/items/item_pocket_watch.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_faceless_void.vsndevts" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Hero_FacelessVoid.TimeDilation.Cast" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySakuya.lua" + "Function" "OnSakuya02SpellStart" + "Target" "TARGET" + "mana_reg" "%mana_reg" + } + } + + "Modifiers" + { + "modifier_sakuya_02_buff" + { + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "mana_reg" "300" + } + } + } + + "thtd_sakuya_03" + { + "ID" "9175" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_sakuya_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "20" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "2" + + "precache" + { + "particle" "particles/heroes/muyue/ability_muyue_014_aeons.vpcf" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Voice_THTD.sakuya.ability_03" + "Target" "CASTER" + } + "FireSound" + { + "EffectName" "Hero_FacelessVoid.Chronosphere" + "Target" "CASTER" + } + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilitySakuya.lua" + "Function" "OnSakuya03SpellStart" + "duration_time" "%duration_time" + "range" "%range" + "damage_down" "%damage_down" + } + } + + "Modifiers" + { + "modifier_sakuya_03_time_pause_debuff" + { + "States" + { + "MODIFIER_STATE_FROZEN" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration_time" "3.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "1000" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_down" "75 50" + } + } + } + + "thtd_koishi_01" + { + "ID" "9176" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_koishi_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "precache" + { + "particle" "particles/units/heroes/hero_dark_willow/dark_willow_bramble.vpcf" + } + + "Modifiers" + { + "passive_koishi_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttack" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityKoishi.lua" + "Function" "OnKoishi01Attack" + "chance" "%chance" + "range" "%range" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "chance" "40 70" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "800" + } + } + } + + "thtd_koishi_02" + { + "ID" "9177" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_koishi_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + + "Modifiers" + { + "passive_koishi_02_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttack" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityKoishi.lua" + "Function" "OnKoishi02AttackLanded" + "max_count" "%max_count" + "duration_time" "%duration_time" + "count_bonus" "%count_bonus" + } + } + } + + "modifier_koishi_02_attack_speed" + { + "Properties" + { + "MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT" "%attack_speed_bonus" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_speed_bonus" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "10" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "5.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "count_bonus" "20" //与四技能一致 + } + } + } + + "thtd_koishi_03" + { + "ID" "9178" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_koishi_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "25" + "AbilityManaCost" "0" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_ogre_magi.vsndevts" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKoishi.lua" + "Function" "OnKoishi03SpellStart" + "Target" "TARGET" + "power_bonus" "%power_bonus" + "duration_time" "%duration_time" + "combo_time" "%combo_time" + "self_crit" "%self_crit" + } + } + + "Modifiers" + { + "modifier_koishi_03_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKoishi.lua" + "Function" "OnCreatedKoishi03Buff" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKoishi.lua" + "Function" "OnDestroyKoishi03Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "30 60 120" + } + "02" + { + "var_type" "FIELD_INTEGER" + "self_crit" "2" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "9" + } + "04" + { + "var_type" "FIELD_FLOAT" + "combo_time" "18" + } + } + } + + "thtd_koishi_04" + { + "ID" "9179" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_koishi_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCooldown" "20" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "80" + "MaxLevel" "1" + + "precache" + { + "particle" "particles/econ/events/fall_major_2015/teleport_end_fallmjr_2015_lvl2_black.vpcf" + "particle" "particles/heroes/thtd_koishi/ability_koishi_04_attack_01.vpcf" + "particle" "particles/heroes/thtd_koishi/ability_koishi_04_attack_02.vpcf" + "particle" "particles/heroes/thtd_koishi/ability_koishi_04_attack_03.vpcf" + "particle" "particles/heroes/thtd_koishi/ability_koishi_04_attack_04.vpcf" + "particle" "particles/heroes/thtd_koishi/ability_koishi_04_attack_05.vpcf" + "particle" "particles/heroes/thtd_koishi/ability_koishi_04_attack_06.vpcf" + "particle" "particles/heroes/thtd_koishi/ability_koishi_04_attack_landed.vpcf" + "particle" "particles/units/heroes/hero_axe/axe_beserkers_call_owner.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_vengefulspirit.vsndevts" + "soundfile" "soundevents/thdots_hero_sounds/thdots_koishi_sounds.vsndevts" + } + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityKoishi.lua" + "Function" "OnKoishi04SpellStart" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "passive_koishi_04_attack" + { + "IsHidden" "1" + + "OnAttackStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityKoishi.lua" + "Function" "OnKoishi04AttackStart" + } + } + + "OnKill" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKoishi.lua" + "Function" "OnKoishi04Kill" + } + } + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKoishi.lua" + "Function" "OnCreatedKoishi04Buff" + "power_base" "%power_base" + "power_up" "%power_up" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKoishi.lua" + "Function" "OnDestroyKoishi04Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_base" "250" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_up" "300" + } + "03" + { + "var_type" "FIELD_INTEGER" + "count_bonus" "20" //与二技能一致 + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration_time" "12" + } + } + } + + "thtd_koakuma_01" + { + "ID" "9180" + "BaseClass" "ability_lua" + "AbilityTextureName" "touhoutd/thtd_koakuma_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "2" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "1" + "AbilityManaCost" "35" + "ScriptFile" "scripts/vscripts/abilities/abilityKoakuma" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "800" + + "precache" + { + "particle" "particles/units/heroes/hero_dragon_knight/dragon_knight_elder_dragon_fire.vpcf" + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "25" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range1" "500" + } + "04" + { + "var_type" "FIELD_INTEGER" + "range_damage" "0 35" + } + "05" + { + "var_type" "FIELD_INTEGER" + "range2" "300" + } + } + } + + "thtd_koakuma_02" + { + "ID" "9181" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_koakuma_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "3" + "AbilityCastRange" "%radius" + + "Modifiers" + { + "modifier_koakuma_02_aura" + { + "Passive" "1" + "IsHidden" "1" + + "Aura" "modifier_koakuma_02_buff" + "Aura_Radius" "%radius" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_koakuma_02_buff" + { + "IsHidden" "1" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKoakuma" + "Function" "OnCreatedKoakuma02Buff" + "penetration" "%penetration" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKoakuma" + "Function" "OnDestroyKoakuma02Buff" + "penetration" "%penetration" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + + "02" + { + "var_type" "FIELD_INTEGER" + "penetration" "6 10 18" + } + } + } + + "thtd_meirin_01" + { + "ID" "9182" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_meirin_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/thtd_meirin/ability_meirin_01.vpcf" + "particle" "particles/heroes/thtd_meirin/ability_meirin_01_step_1.vpcf" + "particle" "particles/heroes/thtd_meirin/ability_meirin_01_step_2.vpcf" + "particle" "particles/heroes/thtd_meirin/ability_meirin_01_step_3.vpcf" + "particle" "particles/heroes/thtd_meirin/ability_meirin_01_step_4.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_keeper_of_the_light.vsndevts" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_tusk.vsndevts" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_earthshaker.vsndevts" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_elder_titan.vsndevts" + } + + "Modifiers" + { + "passive_meirin_01_attack" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "0.1" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMeirin.lua" + "Function" "OnMeirin01AttackThink" + "damage_up" "%damage_up" + } + } + } + + "modifier_meirin_01_pause" + { + "States" + { + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + "modifier_meirin_01_slow_buff" + { + "Duration" "%slow_time" + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%slow" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_up" "1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "slow" "-50" + } + "04" + { + "var_type" "FIELD_FLOAT" + "slow_time" "0.5" + } + } + } + + "thtd_meirin_02" + { + "ID" "9183" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_meirin_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "2" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "level4_chance" "50 75" + } + "02" + { + "var_type" "FIELD_INTEGER" + "level6_chance" "50 75" + } + "03" + { + "var_type" "FIELD_FLOAT" + "level5_stun_time" "0.5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "level7_stun_time" "1.0" + } + } + } + + "thtd_yuuka_01" + { + "ID" "9184" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yuuka_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "800" + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/thtd_yuuka/ability_yuuka_01_spawn.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityYuuka.lua" + "Function" "OnYuuka01SpellStart" + "range" "%range" + "power_damage" "%power_damage" + "crit" "%crit" + "radius" "%radius" + } + } + + "Modifiers" + { + "modifier_yuuka_02_flower" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + } + "Properties" + { + "MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE" "-100" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "800" + } + "02" + { + "var_type" "FIELD_FLOAT" + "crit" "1.5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "300" + } + } + } + + "thtd_yuuka_02" + { + "ID" "9185" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yuuka_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + + "Modifiers" + { + "passive_yuuka_02_attack" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "0.5" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuuka.lua" + "Function" "OnIntervalThinkYuuka02" + } + } + } + } + } + + "thtd_yuuka_03" + { + "ID" "9186" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yuuka_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + "AbilityCastRange" "800" + "MaxLevel" "3" + + "precache" + { + "particle" "particles/heroes/thtd_yuuka/ability_yuuka_03.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_treant.vsndevts" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Hero_Treant.Overgrowth.Cast" + "Target" "CASTER" + } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuuka.lua" + "Function" "OnSpellStartYuuka03" + "Target" "POINT" + } + } + + "Modifiers" + { + "modifier_yuuka_03_illusion" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_COMMAND_RESTRICTED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + + "modifier_yuuka_03_kill" + { + "Passive" "1" + "ThinkInterval" "%tick" + "IsHidden" "1" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuuka.lua" + "Function" "OnThinkYuuka03" + "tick" "%tick" + } + } + } + + "modifier_thtd_yuuka_03_death" + { + "OnDeath" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuuka.lua" + "Function" "OnYuuka03Death" + "max_count" "%max_count" + "damage_up" "%damage_up" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_FLOAT" + "tick" "0.3" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up" "1" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_count" "50 100 200" + } + } + } + + "thtd_yuuka_04" + { + "ID" "9187" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yuuka_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_CHANNELLED" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCastPoint" "0.0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "AbilityCooldown" "15" + "AbilityManaCost" "20" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1500" + "AbilityChannelTime" "%channel_time" //类型必须为FIELD_FLOAT,否则施法动作无效 + + "precache" + { + "particle" "particles/heroes/thtd_yuuka/yuuka_04_spark_circle.vpcf" + "particle" "particles/heroes/thtd_yuuka/yuuka_04_spark.vpcf" + "particle" "particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind.vpcf" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Voice_THTD.yuuka.ability_04" + "Target" "CASTER" + } + "FireSound" + { + "EffectName" "Sound_THTD.thtd_yuuka_04" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuuka.lua" + "Function" "OnYuuka04SpellStart" + "Caster" "CASTER" + "Target" "POINT" + } + "CreateThinker" + { + "ModifierName" "modifier_thdots_yuuka04_think_interval" + "Target" "POINT" + } + } + + "OnChannelInterrupted" + { + "RemoveModifier" + { + "Target" "CASTER" + "ModifierName" "modifier_thdots_yuuka04_think_interval" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuuka.lua" + "Function" "OnYuuka04SpellRemove" + "Caster" "CASTER" + } + } + + "OnChannelFinish" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuuka.lua" + "Function" "OnYuuka04SpellRemove" + "Caster" "CASTER" + } + } + + "Modifiers" + { + "modifier_thdots_yuuka04_think_interval" + { + "Duration" "%channel_time" + "ThinkInterval" "0.02" + "Attributes" "MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuuka.lua" + "Function" "OnYuuka04SpellThink" + "Caster" "CASTER" + "Target" "TARGET" + "DamageWidth" "%damage_width" + "DamageLenth" "%damage_lenth" + "times" "%times" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuuka.lua" + "Function" "OnYuuka04SpellRemove" + "Caster" "CASTER" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "10" + } + "02" + { + "var_type" "FIELD_FLOAT" + "channel_time" "5.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "times" "5" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_width" "320" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage_lenth" "1440" + } + + } + } + + "thtd_yukari_01" + { + "ID" "9188" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yukari_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "2" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "1" + "AbilityManaCost" "20" + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/yukari/ability_yukari_02_vortex_2.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYukari.lua" + "Function" "OnYukari01SpellStart" + "Target" "TARGET" + "max_count" "%max_count" + "limit_count" "%limit_count" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "modifier_yukari_01_hidden" + { + "States" + { + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + + "Properties" + { + "MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE" "-100" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "max_count" "3 5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "limit_count" "2" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10.0" + } + } + } + + "thtd_yukari_02" + { + "ID" "9189" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yukari_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_2" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + "AbilityCastRange" "1000" + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/yukari/ability_yukari_02_body.vpcf" + "particle" "particles/heroes/yukari/ability_yukari_02_down.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYukari.lua" + "Function" "OnYukari02SpellStart" + "Target" "POINT" + "range" "%range" + "stun_time" "%stun_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_time" "0.5" + } + } + } + + "thtd_yukari_03" + { + "ID" "9190" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yukari_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + "AbilityCastRange" "99999" + "MaxLevel" "1" + "AbilityCastPoint" "0.0" + + "precache" + { + "particle" "particles/heroes/yukari/ability_yukari_04_magical.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_enigma.vsndevts" + "particle" "particles/econ/items/clockwerk/clockwerk_paraflare/clockwerk_para_rocket_flare_parachute.vpcf" + } + + "Modifiers" + { + "modifier_yukari_03_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "1.0" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYukari.lua" + "Function" "OnThinkYukari03" + "range" "%range" + } + } + } + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYukari.lua" + "Function" "OnYukari03SpellStart" + "Target" "POINT" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "600" + } + } + } + + "thtd_yukari_04" + { + "ID" "9191" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yukari_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "20" + "AbilityManaCost" "0" + + "precache" + { + "particle" "particles/heroes/thtd_yukari/ability_yukari_04_door.vpcf" + "particle" "particles/heroes/yukari/ability_yukari_04_boom.vpcf" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Voice_THTD.yukari.ability_04" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYukari.lua" + "Function" "OnYukari04SpellStart" + "Target" "POINT" + "max_count" "%max_count" + "duration_time" "%duration_time" + "stun_time" "%stun_time" + "damage_up" "%damage_up" + "tick" "%tick" + } + } + + "Modifiers" + { + "modifier_yukari_04_speed" + { + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT" "2000" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "10" + } + "02" + { + "var_type" "FIELD_FLOAT" + "tick" "0.2" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_count" "5 10" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_up" "50" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stun_time" "0.5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "duration_time" "20" + } + } + } + + "thtd_ran_01" + { + "ID" "9192" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_ran_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "1" + "AbilityManaCost" "20" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "%range" + "precache" + { + "particle" "particles/heroes/ran/ability_ran_03_laser.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_tinker.vsndevts" + } + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityRan.lua" + "Function" "Ran01_OnSpellStart" + "Caster" "CASTER" + "Target" "TARGET" + "JumpRadius" "%jump_radius" + "JumpCount" "%jump_count" + "JumpInterval" "%jump_interval" + } + } + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "jump_radius" "600" + } + "03" + { + "var_type" "FIELD_INTEGER" + "jump_count" "25" + } + "04" + { + "var_type" "FIELD_FLOAT" + "jump_interval" "0.2" + } + "05" + { + "var_type" "FIELD_INTEGER" + "range" "1000" + } + } + } + + "thtd_ran_02" + { + "ID" "9193" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_ran_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityCastPoint" "0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_2" + "AbilityCooldown" "11" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "AbilityCooldown" "5" + "AbilityCastRange" "%radius" + + "precache" + { + "particle" "particles/heroes/ran/ability_ran_02_new.vpcf" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Sound_THTD.thtd_ran_02" + "Target" "CASTER" + } + "ApplyModifier" + { + "Target" "CASTER" + "ModifierName" "aura_thdots_ran02_debuff" + } + } + "Modifiers" + { + "modifier_thdots_ran02_debuff" + { + "IsDebuff" "1" + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%slow_movement_pct" + } + } + "aura_thdots_ran02_debuff" + { + "IsHidden" "1" + "IsBuff" "1" + "Duration" "%duration" + "Aura" "modifier_thdots_ran02_debuff" + "Aura_Radius" "%radius" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "Aura_ApplyToCaster" "0" + "EffectName" "particles/heroes/ran/ability_ran_02_new.vpcf" + "EffectType" "attach_hitloc" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "800" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration" "3.5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "slow_movement_pct" "-20 -35 -50 -65 -80" + } + } + } + + "thtd_ran_03" + { + "ID" "9194" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_ran_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + "AbilityCastRange" "%radius" + + "precache" + { + "particle" "particles/heroes/ran/ability_ran_04_buff.vpcf" + + } + + "Modifiers" + { + "modifier_ran_03_aura" + { + "Passive" "1" + "IsHidden" "1" + + "Aura" "modifier_ran_03_spell_buff" + "Aura_Radius" "%radius" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_ran_03_spell_buff" + { + "OnAbilityExecuted" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityRan.lua" + "Function" "OnRan03SpellStart" + "mana_regen" "%mana_regen" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "mana_regen" "0 25" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "1000" + } + } + } + + "thtd_chen_01" + { + "ID" "9195" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_chen_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastRange" "800 900 1000 1100 1200" + "MaxLevel" "5" + "AbilityManaCost" "1" + "AbilityCooldown" "5 4 3 2 1" + + "precache" + { + "particle" "particles/heroes/thtd_chen/ability_chen_01.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityChen.lua" + "Function" "OnChen01SpellStart" + "Target" "POINT" + } + } + + "Modifiers" + { + "modifier_chen_01_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "0.15" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityChen.lua" + "Function" "OnChen01SpellThink" + } + } + } + "modifier_chen_01_pause" + { + "IsHidden" "1" + "States" + { + + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + } + } + + "thtd_eirin_01" + { + "ID" "9196" + "BaseClass" "ability_lua" + "AbilityTextureName" "touhoutd/thtd_eirin_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "2" + + "precache" + { + "particle" "particles/heroes/thtd_eirin/ability_eirin_03.vpcf" + "particle" "particles/addons_gameplay/morokai_orb_overhead_counter.vpcf" + "particle" "particles/units/heroes/hero_legion_commander/legion_commander_duel_victory.vpcf" + } + + "ScriptFile" "scripts/vscripts/abilities/abilityEirin" + + // 要与 thtd_eirin_02 相同 + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1 2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "mana_cost" "10" + } + "03" + { + "var_type" "FIELD_INTEGER" + "mana_chance" "5" + } + "04" + { + "var_type" "FIELD_INTEGER" + "mana_bonus" "40" + } + "05" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "10" + } + "06" + { + "var_type" "FIELD_INTEGER" + "crit_bonus" "5" + } + "07" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "1" + } + + } + } + + "thtd_eirin_02" + { + "ID" "9197" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_eirin_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + "AbilityCastRange" "1500" + + "Modifiers" + { + "modifier_eirin_02_aura" + { + "Passive" "1" + "IsPurgable" "0" + "IsHidden" "1" + + "Aura" "modifier_eirin_02_spell_buff" + "Aura_Radius" "1500" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_eirin_02_spell_buff" + { + "OnAttackLanded" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityEirin.lua" + "Function" "OnEirin02AttackLanded" + "mana_cost" "%mana_cost" + "mana_chance" "%mana_chance" + "mana_bonus" "%mana_bonus" + } + } + } + + "modifier_eirin_01_count" + { + "TextureName" "touhoutd/thtd_eirin_01" + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityEirin.lua" + "Function" "OnDestroyEirin01Count" + "power_bonus" "%power_bonus" + "crit_bonus" "%crit_bonus" + "crit_chance" "%crit_chance" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1 2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "mana_cost" "10" + } + "03" + { + "var_type" "FIELD_INTEGER" + "mana_chance" "11" + } + "04" + { + "var_type" "FIELD_INTEGER" + "mana_bonus" "40" + } + "05" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "10" //与一技能一致 + } + "06" + { + "var_type" "FIELD_INTEGER" + "crit_bonus" "5" //与一技能一致 + } + "07" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "1" //与一技能一致 + } + } + } + + "thtd_eirin_03" + { + "ID" "9198" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_eirin_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCastRange" "1000" + "MaxLevel" "1" + "AbilityManaCost" "30" + "AbilityCooldown" "10" + "AOERadius" "400" + + "precache" + { + "particle" "particles/heroes/thtd_eirin/ability_eirin_03.vpcf" + "particle" "particles/heroes/thtd_eirin/ability_eirin_03_aeons.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityEirin.lua" + "Function" "OnEirin03SpellStart" + "Target" "POINT" + "duration_time" "%duration_time" + "range" "%range" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration_time" "3.5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "400" + } + } + } + + "thtd_eirin_04" + { + "ID" "9199" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_eirin_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCastRange" "1000" + "MaxLevel" "1" + "AbilityManaCost" "0" + "AbilityCooldown" "10" + + "precache" + { + "particle" "particles/heroes/thtd_eirin/ability_eirin_04.vpcf" + "particle" "particles/heroes/thtd_eirin/ability_eirin_04_red.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityEirin.lua" + "Function" "OnEirin04SpellStart" + "Target" "POINT" + "damage_up" "%damage_up" + "up_count" "%up_count" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_up" "20" + } + } + } + + "thtd_eirin_05" + { + "ID" "9560" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/ai_cast_point" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCastPointAI" + "Target" "POINT" + } + } + } + + "thtd_mokou_01" + { + "ID" "9200" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_mokou_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "2" + + "precache" + { + "particle" "particles/thd2/heroes/mouko/ability_mokou_02_boom.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_ogre_magi.vsndevts" + } + + "Modifiers" + { + "passive_mokou_01_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMokou.lua" + "Function" "OnMokou01AttackLanded" + "attack_damage" "%attack_damage" + "base_chance" "%base_chance" + "bonus_chance" "%bonus_chance" + "max_chance" "%max_chance" + "range" "%range" + "duration_time" "%duration_time" + } + } + } + + "passive_mokou_01_crit" + { + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMokou.lua" + "Function" "OnMokou01Remove" + "base_chance" "%base_chance" + } + } + } + + "modifier_mokou_crit_buff" + { + "TextureName" "touhoutd/thtd_mokou_02" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "base_chance" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_chance" "5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_chance" "70 85" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "range" "150" + } + } + } + + "thtd_mokou_02" + { + "ID" "9201" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_mokou_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "5" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "base_crit" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_crit" "2 4 8 16 32" + } + } + } + + "thtd_mokou_03" + { + "ID" "9202" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_mokou_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCooldown" "20" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "2" + + "precache" + { + "particle" "particles/heroes/mouko/ability_mokou_01_boom.vpcf" + "particle" "particles/thd2/heroes/mouko/ability_mokou_04_wing.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_doombringer.vsndevts" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Hero_DoomBringer.ScorchedEarthAura" + "Target" "CASTER" + } + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityMokou.lua" + "Function" "OnMokou03SpellStart" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "modifier_mokou_03_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMokou.lua" + "Function" "OnCreatedMokou03Buff" + "bonus_attack" "%bonus_attack" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMokou.lua" + "Function" "OnDestroyMokou03Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_attack" "50 200" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_range" "150" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10.0" + } + } + + } + + "thtd_kaguya_01" + { + "ID" "9203" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kaguya_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityCastPoint" "0.0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "1" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "50" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCastRange" "1000" + "MaxLevel" "2" + + "precache" + { + "particle" "particles/thd2/heroes/kaguya/ability_kaguya01_light.vpcf" + "particle" "particles/thd2/heroes/kaguya/ability_kaguya01_light_green.vpcf" + "particle" "particles/thd2/heroes/kaguya/ability_kaguya01_light_red.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnKaguya01SpellStart" + "Target" "POINT" + "max_count" "%max_count" + "range" "%range" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "3 4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "150" + } + } + } + + "thtd_kaguya_02" + { + "ID" "9204" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kaguya_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_2" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/econ/items/windrunner/wr_ti8_immortal_shoulder/wr_ti8_shackleshot_pair_rope_target_glow.vpcf" + } + + + "Modifiers" + { + "modifier_kaguya_02_think" + { + "ThinkInterval" "0.2" + "Passive" "1" + "IsHidden" "1" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnKaguya02SpellThink" + } + } + } + + "modifier_kaguya_02_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnCreatedKaguya02_buff" + "bonus_chance" "%bonus_chance" + "bonus_crit" "%bonus_crit" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnRemoveKaguya02_buff" + "bonus_chance" "%bonus_chance" + "bonus_crit" "%bonus_crit" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_chance" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_crit" "100" + } + } + } + + "thtd_kaguya_03" + { + "ID" "9205" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kaguya_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY | DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "0.2" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/thtd_kaguya/thtd_kaguya_03_1.vpcf" + "particle" "particles/heroes/thtd_kaguya/thtd_kaguya_03_2.vpcf" + "particle" "particles/heroes/thtd_kaguya/thtd_kaguya_03_3.vpcf" + "particle" "particles/heroes/thtd_kaguya/thtd_kaguya_03_4.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnKaguya03SpellStart" + } + } + + "OnUpgrade" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnUpgradeKaguya03" + } + } + + "Modifiers" + { + "modifier_kaguya_03_1_buff" + { + "Properties" + { + "MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT" "%attack_speed" + } + } + "modifier_kaguya_03_2_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnCreatedKaguya03_2_buff" + "attack_percent" "%attack_percent" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnDestroyKaguya03_2_buff" + } + } + } + "modifier_kaguya_03_3_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnCreatedKaguya03_3_buff" + "outgoing_percent" "%outgoing_percent" + } + } + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnDestroyKaguya03_3_buff" + } + } + } + "modifier_kaguya_03_4_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnCreatedKaguya03_4_buff" + "penetration" "%penetration" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnDestroyKaguya03_4_buff" + } + } + } + "modifier_kaguya_03_1_debuff" + { + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_slow" + } + } + "modifier_kaguya_03_3_debuff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnCreatedKaguya03_3_debuff" + "incoming_percent" "%incoming_percent" + } + } + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnRemoveKaguya03_3_debuff" + } + } + } + "modifier_kaguya_03_4_debuff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnCreatedKaguya03_4_debuff" + "armor" "%armor" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnDestroyKaguya03_4_debuff" + "armor" "%armor" + } + } + } + "modifier_kaguya_03_think" + { + "ThinkInterval" "0.02" + "Passive" "1" + "IsHidden" "1" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnKaguya03SpellThink" + "damage_up" "%damage_up" + "range" "%range" + } + } + + "OnDeath" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnKaguya03ReleaseBall" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKaguya.lua" + "Function" "OnKaguya03ReleaseBall" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "10 20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-10 -20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "attack_percent" "25 50" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage_up" "25 50" + } + "06" + { + "var_type" "FIELD_INTEGER" + "outgoing_percent" "10 20" + } + "07" + { + "var_type" "FIELD_INTEGER" + "incoming_percent" "10 20" + } + "08" + { + "var_type" "FIELD_INTEGER" + "penetration" "15 30" + } + "09" + { + "var_type" "FIELD_INTEGER" + "armor" "7 13" + } + "10" + { + "var_type" "FIELD_INTEGER" + "range" "200" + } + } + } + + "thtd_aya_01" + { + "ID" "9206" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_aya_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + // Stats + // ---------------------------------------------------------------- + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + + "precache" + { + "particle" "particles/econ/items/windrunner/windrunner_cape_cascade/windrunner_windrun_cascade.vpcf" + "particle" "particles/thd2/heroes/aya/ability_aya_02_mark.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_brewmaster.vsndevts" + "particle" "particles/heroes/thtd_aya/ability_aya_01_news.vpcf" + "particle" "particles/heroes/thtd_aya/ability_aya_01.vpcf" + } + "Modifiers" + { + "passive_aya03_attack" + { + "Passive" "1" + "IsHidden" "1" + "OnAttackLanded" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityAya.lua" + "Function" "OnAya01AttackLanded" + "Target" "TARGET" + } + "Random" + { + "Chance" "%chance" + "OnSuccess" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityAya.lua" + "Function" "OnAya01RandomSuccess" + "Target" "TARGET" + } + "ApplyModifier" + { + "ModifierName" "modifier_aya01_slow" + "Target" + { + "Center" "TARGET" + "Radius" "%range" + "Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP | DOTA_UNIT_TARGET_MECHANICAL | DOTA_UNIT_TARGET_OTHER" + } + } + } + } + } + } + "modifier_aya01_slow" + { + "Duration" "%duration_time" + "IsDebuff" "1" + + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_slow" + } + } + "modifier_aya01_news_buff" + { + "Duration" "%buff_time" + "IsDebuff" "1" + "EffectName" "particles/thd2/heroes/aya/ability_aya_02_mark.vpcf" + "EffectAttachType" "follow_origin" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "chance" "20" + } + "03" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-10" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration_time" "1.5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + "06" + { + "var_type" "FIELD_FLOAT" + "buff_time" "10.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "damage_up" "1" //与下面花果子念报一致 thtd_hatate_01 + } + } + } + + "thtd_aya_02" + { + "ID" "9207" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_aya_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCastRange" "999999" + "MaxLevel" "1" + "AbilityManaCost" "0" + "AbilityCooldown" "1" + + "precache" + { + "particle" "particles/heroes/aya/ability_aya_01.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityAya.lua" + "Function" "OnAya02SpellStart" + "Target" "POINT" + } + } + "Modifiers" + { + "modifier_aya_02_pause" + { + "IsHidden" "1" + "EffectName" "particles/heroes/aya/ability_aya_01.vpcf" + "EffectAttachType" "follow_origin" + + "States" + { + + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + } + } + + "thtd_aya_03" + { + "ID" "9208" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_aya_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + + "Modifiers" + { + "modifier_aya03_think_interval" + { + "ThinkInterval" "0.1" + "Passive" "1" + "IsHidden" "1" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityAya.lua" + "Function" "OnAya03WingsSpellThink" + } + } + } + } + } + + "thtd_hatate_01" + { + "ID" "9209" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_hatate_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "10" + "AOERadius" "%range" + "AbilityCastRange" "1000" + "AbilityCooldown" "1" + "AbilityCastPoint" "0.0" + + "precache" + { + "particle" "particles/heroes/hatate/ability_hatate_01_mark.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityHatate.lua" + "Function" "OnHatate01SpellStart" + "Target" "POINT" + "range" "%range" + } + } + + "Modifiers" + { + "passive_hatate01_attack" + { + "Passive" "1" + "IsHidden" "1" + "OnAttackLanded" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityHatate.lua" + "Function" "OnHatate01AttackLanded" + "Target" "TARGET" + } + } + } + + "modifier_hatate01_news_buff" + { + "Duration" "%duration_time" + "IsDebuff" "1" + "EffectName" "particles/heroes/hatate/ability_hatate_01_mark.vpcf" + "EffectAttachType" "follow_origin" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "500" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_up" "1" //与上面文文新闻一致 thtd_aya_01 + } + } + } + + "thtd_hatate_02" + { + "ID" "9210" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_hatate_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCastPoint" "0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "OverrideAnimation" "Act_DOTA_CAST_ABILITY_4" + "AbilityCooldown" "30" + "AbilityManaCost" "0" + "AbilityChannelTime" "5.0" + + "precache" + { + "particle" "particles/heroes/thtd_hatate/ability_hatate_02.vpcf" + } + + "OnSpellStart" + { + "ApplyModifier" + { + "ModifierName" "modifier_thdots_hatate02_think_interval" + "Target" "CASTER" + } + } + + "OnChannelInterrupted" + { + "RemoveModifier" + { + "Target" "CASTER" + "ModifierName" "modifier_thdots_hatate02_think_interval" + } + } + + "Modifiers" + { + "modifier_thdots_hatate02_think_interval" + { + "Duration" "%duration_time" + "ThinkInterval" "%tick_time" + "EffectName" "particles/heroes/thtd_hatate/ability_hatate_02.vpcf" + "EffectAttachType" "follow_origin" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityHatate.lua" + "Function" "OnHatate02SpellStart" + "tick_time" "%tick_time" + } + } + } + + "modifier_hatate01_news_buff" + { + "Duration" "%news_duration_time" + "IsDebuff" "1" + "EffectName" "particles/thd2/heroes/aya/ability_aya_02_mark.vpcf" + "EffectAttachType" "follow_origin" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "5.0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "tick_time" "0.5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "news_duration_time" "10.0" + } + } + } + + "thtd_momiji_01" + { + "ID" "9211" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_momiji_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCastPoint" "0.1" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "30" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "precache" + { + "particle" "particles/units/heroes/hero_abaddon/abaddon_spawn.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_lycan.vsndevts" + } + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Hero_Lycan.SummonWolves" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMomiji.lua" + "Function" "OnMomiji01Spawn" + "wolf_attack" "%wolf_attack" + "max_count" "%max_count" + "range" "%range" + } + } + "Modifiers" + { + "modifier_momiji_01_buff" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + } + "Properties" + { + "MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE" "-100" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "wolf_attack" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "600" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_count" "4" + } + } + } + + "thtd_momiji_02" + { + "ID" "9212" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_momiji_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "3" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/thtd_momiji/ability_momiji_02.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMomiji.lua" + "Function" "OnMomiji02SpellStart" + "Target" "TARGET" + } + } + + "OnUpgrade" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMomiji.lua" + "Function" "OnUpgradeMomiji02Buff" + "damage_up" "%damage_up" + "aya_damage_up" "%aya_damage_up" + } + } + + "Modifiers" + { + "modifier_momiji_02" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMomiji.lua" + "Function" "OnCreatedMomiji02Buff" + "damage_up" "%damage_up" + "aya_damage_up" "%aya_damage_up" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMomiji.lua" + "Function" "OnDestroyMomiji02Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_up" "30 40 60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "aya_damage_up" "45 60 90" + } + } + } + + "thtd_sanae_01" + { + "ID" "9213" + "BaseClass" "ability_lua" + "AbilityTextureName" "touhoutd/thtd_sanae_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "5" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "1" + "AbilityManaCost" "32" + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/sanae/ability_sanae_01.vpcf" + "particle" "particles/heroes/sanae/ability_sanae_01_effect.vpcf" + } + + "ScriptFile" "scripts/vscripts/abilities/abilitySanae" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "10 20 30 40 60" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "5.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "down_percent" "50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "range" "400" + } + "05" + { + "var_type" "FIELD_INTEGER" + "max_count" "4" + } + } + } + + "thtd_sanae_02" + { + "ID" "9214" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_sanae_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "300" + + "precache" + { + "particle" "particles/heroes/thtd_sanae/ability_sanae_02.vpcf" + "particle" "particles/heroes/thtd_sanae/ability_sanae_02_p.vpcf" + } + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySanae.lua" + "Function" "OnSanae02SpellStart" + "Target" "POINT" + "duration_time" "%duration_time" + "range" "%range" + } + } + + "Modifiers" + { + "modifier_sanae_debuff" + { + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_slow" + } + } + "modifier_sanae_01_kill" + { + "Passive" "1" + "IsHidden" "1" + "OnKill" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySanae.lua" + "Function" "OnSanaeKill" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-15 -20 -25 -35 -50" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "5.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + } + } + + "thtd_sanae_03" + { + "ID" "9215" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_sanae_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "precache" + { + "particle" "particles/heroes/thtd_sanae_03/ability_sanae_03.vpcf" + "particle" "particles/thd2/items/item_tsundere.vpcf" + } + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySanae.lua" + "Function" "OnSanae03SpellStart" + "Target" "POINT" + "duration_time" "%duration_time" + "stun_time" "%stun_time" + "range" "%range" + "stun_up" "%stun_up" + "damage_up" "%damage_up" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "2.0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_time" "0.5" + } + "04" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stun_up" "0.4" + } + "06" + { + "var_type" "FIELD_FLOAT" + "damage_up" "0.4" + } + } + } + + "thtd_sanae_04" + { + "ID" "9216" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_sanae_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCastPoint" "0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "AbilityCooldown" "25" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "2" + + "precache" + { + "particle" "particles/heroes/sanae/ability_sanea_04_effect_b.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySanae.lua" + "Function" "OnSanae04SpellStart" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "modifier_sanae_04_buff" + { + "Duration" "%duration_time" + "EffectName" "particles/thd2/items/item_tsundere.vpcf" + "EffectAttachType" "follow_origin" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySanae.lua" + "Function" "OnCreatedSanae04Buff" + "power_bonus" "%power_bonus" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySanae.lua" + "Function" "OnDestroySanae04Buff" + } + } + } + + "modifier_thtd_sanae_04_aura" + { + "IsHidden" "1" + + "Aura" "modifier_sanae_04_switch_buff" + "Aura_Radius" "2500" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_sanae_04_switch_buff" + { + "IsHidden" "1" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySanae.lua" + "Function" "OnSanae04Created" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySanae.lua" + "Function" "OnSanae04Destroy" + } + } + } + + "modifier_sanae_04_combo_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySanae.lua" + "Function" "OnCreatedSanae04ComboBuff" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySanae.lua" + "Function" "OnDestroySanae04ComboBuff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration_time" "12.5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "open_aura_level" "2" + } + } + } + + "thtd_kanako_01" + { + "ID" "9217" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kanako_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "7.0" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "precache" + { + "particle" "particles/heroes/kanako/ability_kanako_01.vpcf" + "particle" "particles/heroes/thtd_kanako/ability_kanako_01_explosion.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKanako.lua" + "Function" "OnKanako01SpellStart" + "Target" "TARGET" + "duration_time" "%duration_time" + "tick" "%tick" + } + } + + "Modifiers" + { + "modifier_kanako_01_stun" + { + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + + "modifier_kanako_01_kill" + { + "Passive" "1" + "IsHidden" "1" + + "OnKill" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKanako.lua" + "Function" "OnKanakoKill" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "2.5" //与特效绑定 + } + "03" + { + "var_type" "FIELD_FLOAT" + "tick" "0.2" //与特效绑定 + } + } + } + + "thtd_kanako_02" + { + "ID" "9218" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kanako_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "3" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "2500" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKanako.lua" + "Function" "OnKanako02SpellStart" + "Target" "POINT" + "max_count" "%max_count" + } + } + + "Modifiers" + { + "modifier_kanako_rooted" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + } + } + + "modifier_kanako_03_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "0.1" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKanako.lua" + "Function" "OnKanako03Think" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "2 4 6" + } + } + } + + "thtd_kanako_03" + { + "ID" "9219" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kanako_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_BUILDING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "2500" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKanako.lua" + "Function" "OnKanako03SpellStart" + "Target" "TARGET" + } + } + } + + "thtd_kanako_03_unit" + { + "ID" "9220" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kanako_03_unit" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_BUILDING" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "2000" + + "precache" + { + "particle" "particles/heroes/thtd_kanako/ability_kanako_03_line.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKanako.lua" + "Function" "OnKanako03UnitSpellStart" + "Target" "TARGET" + } + } + } + + "thtd_kanako_04" + { + "ID" "9221" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kanako_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastPoint" "0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "AbilityCooldown" "15" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "precache" + { + "particle" "particles/heroes/kanako/ability_kanako_04.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKanako.lua" + "Function" "OnKanako04SpellStart" + "range" "%range" + "damage_up" "%damage_up" + "tick" "%tick" + "crit_chance" "%crit_chance" + } + } + + "Modifiers" + { + "modifier_kanako_04_effect" + { + "IsHidden" "1" + "EffectName" "particles/heroes/kanako/ability_kanako_04.vpcf" + "EffectAttachType" "follow_origin" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage1" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_damage2" "2" + } + "03" + { + "var_type" "FIELD_FLOAT" + "tick" "0.3" + } + "04" + { + "var_type" "FIELD_INTEGER" + "range" "600" //被特效绑定了不能修改 + } + "05" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "40" + } + "06" + { + "var_type" "FIELD_FLOAT" + "damage_up" "0.2" + } + } + } + + "thtd_suwako_01" + { + "ID" "9222" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_suwako_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "OnProjectileHitUnit" + { + "DeleteOnHit" "true" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySuwako.lua" + "Target" "TARGET" + "Function" "OnSuwako01SpellHit" + "kick_distance" "%kick_distance" + "up_percent" "%up_percent" + } + } + "Modifiers" + { + "passive_suwako_01_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilitySuwako.lua" + "Function" "OnSuwako01AttackLanded" + } + } + } + "modifier_suwako_01_kill" + { + "Passive" "1" + "IsHidden" "1" + "OnKill" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySuwako.lua" + "Function" "OnSuwakoKill" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "kick_distance" "150" + } + "03" + { + "var_type" "FIELD_FLOAT" + "up_percent" "0.2" + } + } + } + + "thtd_suwako_02" + { + "ID" "9223" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_suwako_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "precache" + { + "particle" "particles/heroes/thtd_suwako/ability_suwako_02.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySuwako.lua" + "Function" "OnSuwako02SpellStart" + "Target" "POINT" + "range" "%range" + } + } + + "Modifiers" + { + "modifier_suwako_rooted" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + "modifier_suwako_02_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "0.2" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySuwako.lua" + "Function" "OnSuwako02Think" + "range" "%range" + "stay_time" "%stay_time" + "root_time" "%root_time" + "up_percent" "%up_percent" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stay_time" "2.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "root_time" "1.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "up_percent" "0.2" + } + } + } + + "thtd_suwako_03" + { + "ID" "9224" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_suwako_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCastPoint" "0.1" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "10" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "precache" + { + "particle" "particles/econ/items/kunkka/kunkka_torrent_base/kunkka_spell_torrent_splash_econ.vpcf" + } + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySuwako.lua" + "Function" "OnSuwako03SpellStart" + "up_percent" "%up_percent" + } + } + "Modifiers" + { + "modifier_suwako_03_rooted" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "up_percent" "0.2" + } + } + } + + "thtd_suwako_04" + { + "ID" "9225" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_suwako_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AbilityCooldown" "25" + "AbilityManaCost" "80" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/thd2/items/item_pocket_watch.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_faceless_void.vsndevts" + "particle" "particles/econ/items/mirana/mirana_2021_immortal/mirana_2021_immortal_moonlight_recipient_golden.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySuwako.lua" + "Function" "OnSuwako04SpellStart" + "Target" "TARGET" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "modifier_suwako_04_buff" + { + "EffectName" "particles/econ/items/mirana/mirana_2021_immortal/mirana_2021_immortal_moonlight_recipient_golden.vpcf" + "EffectAttachType" "follow_origin" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySuwako.lua" + "Function" "OnCreatedSuwako04Buff" + "crit" "%crit" + "self_crit" "%self_crit" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySuwako.lua" + "Function" "OnDestroySuwako04Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit" "100" + } + "02" + { + "var_type" "FIELD_INTEGER" + "self_crit" "300" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "12.5" + } + } + } + + "thtd_minamitsu_01" + { + "ID" "9226" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_minamitsu_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "5" + "AbilityCastPoint" "0" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "25" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "2000" + "precache" + { + "particle" "particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship.vpcf" + "particle" "particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_water.vpcf" + } + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMinamitsu.lua" + "Function" "OnMinamitsu01SpellStart" + } + } + + "Modifiers" + { + "modifier_minamitsu_01_debuff_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "0.1" + "Attributes" "MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMinamitsu.lua" + "Function" "OnMinamitsu01DebuffThink" + } + } + } + "modifier_minamitsu_01_slow_buff" + { + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_slow" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-20 -25 -30 -40 -50" + } + } + } + + "thtd_minamitsu_02" + { + "ID" "9227" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_minamitsu_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCastPoint" "0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "15" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + "AbilityManaCost" "0" + + "precache" + { + "particle" "particles/heroes/minamitsu/ability_minamitsu_03.vpcf" + "particle" "particles/heroes/minamitsu/ability_minamitsu_03_body.vpcf" + "particle" "particles/econ/items/kunkka/divine_anchor/hero_kunkka_dafx_weapon/kunkka_spell_tidebringer_fxset.vpcf" + } + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Voice_Thdots_Minamitsu.AbilityMinamitsu03" + "Target" "CASTER" + } + "ApplyModifier" + { + "Target" "CASTER" + "ModifierName" "modifier_thdots_minamitsu03_bonus" + } + } + "Modifiers" + { + "modifier_thdots_minamitsu03_bonus" + { + "Duration" "%ability_duration" + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMinamitsu.lua" + "Function" "OnCreatedMinamitsu02Buff" + "ability_duration" "%ability_duration" + "power_bonus" "%power_bonus" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMinamitsu.lua" + "Function" "OnDestroyMinamitsu02Buff" + } + } + + "OnAttackLanded" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMinamitsu.lua" + "Function" "OnMinamitsu02AttackLanded" + "Radius" "%radius" + } + } + } + } + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "50 75" + } + "03" + { + "var_type" "FIELD_FLOAT" + "ability_duration" "7.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "radius" "300" + } + } + } + + "thtd_minamitsu_03" + { + "ID" "9228" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_minamitsu_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%range" + + "precache" + { + "particle" "particles/heroes/minamitsu/ability_minamitsu_02.vpcf" + "particle" "particles/heroes/minamitsu/ability_minamitsu_02_body.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMinamitsu.lua" + "Function" "OnMinamitsu03SpellStart" + "Target" "POINT" + "range" "%range" + } + } + + "Modifiers" + { + "modifier_minamitsu02_vortex_pause_target" + { + "IsHidden" "1" + "States" + { + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + } + } + "modifier_minamitsu02_vortex_target" + { + "IsHidden" "1" + "States" + { + // "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + // "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + // "MODIFIER_STATE_OUT_OF_GAME" "MODIFIER_STATE_VALUE_ENABLED" + // "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + // "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "500" + } + } + } + + "thtd_minamitsu_04" + { + "ID" "9229" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_minamitsu_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCastPoint" "0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "AbilityCooldown" "15" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + + "precache" + { + } + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMinamitsu.lua" + "Function" "OnMinamitsu04SpellStart" + "Target" "POINT" + "damage_up" "%damage_up" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_up" "50" + } + } + } + + "thtd_nue_01" + { + "ID" "9230" + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityTextureName" "touhoutd/thtd_nue_01" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + + // Stats + //---------------------------------------------------------------- + "AbilityManaCost" "0" + "AbilityCastPoint" "0" + "AbilityCooldown" "10" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + "precache" + { + "particle" "particles/heroes/nue/ability_nue_01_ball.vpcf" + "particle" "particles/units/heroes/hero_templar_assassin/templar_assassin_meld_hit.vpcf" + "soundfile" "soundevents/thdots_hero_sounds/thdots_nue_sounds.vsndevts" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Nue.AbilityNue01" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityNue.lua" + "Function" "OnNue01SpellStart" + "max_count" "%max_count" + } + } + + "Modifiers" + { + "passive_nue01_attack" + { + "Passive" "1" + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityNue.lua" + "Function" "OnNue01AttackLanded" + "damage_up" "%damage_up" + "attack_bonus" "%attack_bonus" + } + } + } + "modifier_nue_01_extradamage" + { + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityNue.lua" + "Function" "OnNue01Destroy" + } + } + } + "modifier_nue_killed" + { + + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "power_damage" "0.2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_bonus" "1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "spell_bonus" "3" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_count" "999" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_up" "50" + } + } + } + + "thtd_nue_02" + { + "ID" "9231" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_nue_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCastPoint" "0.2" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AbilityCooldown" "4" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1540" + "precache" + { + "particle" "particles/heroes/nue/ability_nue_01.vpcf" + "soundfile" "soundevents/thdots_hero_sounds/thdots_nue_sounds.vsndevts" + } + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Nue.AbilityNue02" + "Target" "CASTER" + } + "LinearProjectile" + { + "EffectName" "particles/heroes/nue/ability_nue_01.vpcf" + "MoveSpeed" "%move_speed" + "StartRadius" "%collision_radius" + "EndRadius" "%collision_radius" + "StartPosition" "attach_attack1" + "FixedDistance" "%max_lenth" + "TargetTeams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "TargetTypes" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "HasFrontalCone" "0" + "ProvidesVision" "1" + "VisionRadius" "300" + } + } + "OnProjectileHitUnit" + { + "DeleteOnHit" "false" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityNue.lua" + "Target" "TARGET" + "Function" "OnNue02SpellHit" + } + } + "Modifiers" + { + "modifier_nue_killed" + { + + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "move_speed" "3000" + } + "03" + { + "var_type" "FIELD_INTEGER" + "collision_radius" "140" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_lenth" "1540" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage_crit" "3" + } + } + } + + "thtd_nue_03" + { + "ID" "9232" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_nue_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "MaxLevel" "1" + + "precache" + { + } + "Modifiers" + { + "modifier_thdots_nue_03" + { + "Passive" "1" + "OnKill" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityNue.lua" + "Function" "OnNue03Kill" + } + } + } + } + } + + "thtd_sizuha_01" + { + "ID" "9233" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_sizuha_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "4" + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "grow_time" "200 300 500 800" + } + } + } + + "thtd_sizuha_02" + { + "ID" "9234" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_sizuha_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "2000" + + "precache" + { + + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Sound_THTD.thtd_minoriko_02" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySizuha.lua" + "Function" "OnSizuha02StarImprove" + "Target" "TARGET" + } + } + "Modifiers" + { + } + } + + "thtd_toramaru_01" + { + "ID" "9235" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_toramaru_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "5" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityToramaru.lua" + "Function" "OnToramaru01SpellStart" + "Target" "TARGET" + "BonusGold" "%bonus_gold" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_gold" "30 60 120 240 960" + } + "03" + { + "var_type" "FIELD_INTEGER" + "gold_damage_percent" "10" + } + } + } + + "thtd_toramaru_02" + { + "ID" "9236" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_toramaru_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + "AbilityCooldown" "2" + "AbilityManaCost" "0" + "AbilityGoldCost" "500" //不能使用变量,如 %cost_gold + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityToramaru.lua" + "Function" "OnToramaru02SpellStart" + "Target" "TARGET" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "48" + } + "02" + { + "var_type" "FIELD_INTEGER" + "cost_gold" "500" // 仅显示用,需要更改 AbilityGoldCost + } + } + } + + "thtd_toramaru_03" + { + "ID" "9237" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_toramaru_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCastPoint" "0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "AbilityCooldown" "2" + "AbilityManaCost" "0" + "AbilityGoldCost" "5000" //不能使用变量,如 %cost_gold + "AbilityChannelTime" "0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityToramaru.lua" + "Function" "OnToramaru03SpellStart" + "Target" "TARGET" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "cost_gold" "5000" // 仅显示用,需要更改 AbilityGoldCost + } + } + } + + "thtd_toramaru_04" + { + "ID" "9238" + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_toramaru_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + "AbilityCastRange" "1000" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + + "precache" + { + "particle" "particles/heroes/sunny/ability_sunny_01_laser.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityToramaru.lua" + "Function" "OnSpellStartToramaru04" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + } + } + + "thtd_shinki_01" + { + "ID" "9239" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_shinki_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + "AbilityCastRange" "1200" + + "precache" + { + "particle" "particles/heroes/thtd_shinki/ability_shinki_01.vpcf" + } + + "Modifiers" + { + "modifier_shinki_01_buff_kill" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShinki.lua" + "Function" "OnCreatedShinki01Buff" + "kill_bonus" "%kill_bonus" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShinki.lua" + "Function" "OnDestroyShinki01Buff" + } + } + } + + "modifier_shinki_01_think" + { + "ThinkInterval" "0.2" + "IsHidden" "1" + "Passive" "1" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShinki.lua" + "Function" "OnShinki01Think" + "modifier" "modifier_shinki_01_buff_kill" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "kill_bonus" "1" //同步在damage.lua中更改 + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "100" //同步在damage.lua中更改 + } + } + } + + "thtd_shinki_02" + { + "ID" "9240" + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_shinki_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + "MaxLevel" "1" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1200" + "AbilityCastPoint" "0.15" + + "precache" + { + "particle" "particles/econ/items/queen_of_pain/qop_arcana/qop_arcana_sonic_wave.vpcf" + "particle" "particles/econ/items/queen_of_pain/qop_arcana/qop_arcana_sonic_wave_v2.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShinki.lua" + "Function" "OnSpellStartShinki02" + "duration_time" "%duration_time" + "tick" "%tick" + } + } + + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "4.0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "tick" "0.25" + } + } + } + + "thtd_shinki_03" + { + "ID" "9241" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_shinki_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "MaxLevel" "2" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AbilityCooldown" "20" + "AbilityManaCost" "60" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1200" + "AbilityCastPoint" "0.15" + + "precache" + { + "particle" "particles/econ/items/terrorblade/terrorblade_back_ti8/terrorblade_sunder_ti8.vpcf" + "particle" "particles/units/heroes/heroes_underlord/abbysal_underlord_darkrift_ambient.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_nevermore.vsndevts" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_terrorblade.vsndevts" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShinki.lua" + "Function" "OnSpellStartShinki03" + "modifier" "modifier_shinki_03_buff_self" + } + } + + "Modifiers" + { + "modifier_shinki_03_buff_self" + { + "Duration" "%duration_time" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShinki.lua" + "Function" "OnCreatedShinki03Buff" + "power_bonus" "%power_bonus" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShinki.lua" + "Function" "OnDestroyShinki03Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10.0" + } + } + } + + "thtd_shinki_04" + { + "ID" "9242" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_shinki_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCastPoint" "0.1" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "25" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "precache" + { + "particle" "particles/units/heroes/hero_abaddon/abaddon_spawn.vpcf" + // "soundfile" "soundevents/game_sounds_heroes/game_sounds_lycan.vsndevts" + } + "OnSpellStart" + { + // "FireSound" + // { + // "EffectName" "Hero_Lycan.SummonWolves" + // "Target" "CASTER" + // } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShinki.lua" + "Function" "OnShinki04Spawn" + } + } + "Modifiers" + { + "modifier_shinki_04_buff" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + } + "Properties" + { + "MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE" "-100" + } + } + } + } + + "thtd_byakuren_01" + { + "ID" "9243" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_byakuren_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCooldown" "0.2" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "1" + + "precache" + { + "particle" "particles/units/heroes/hero_abaddon/abaddon_aphotic_shield_explosion.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityByakuren.lua" + "Function" "OnByakuren01SpellStartUp" + "base_tick" "%base_tick" + "min_tick" "%min_tick" + "max_tick" "%max_tick" + "extra_damage" "%extra_damage" + "tick_step" "%tick_step" + } + } + + "Modifiers" + { + "passive_byakuren_01_attack_landed" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityByakuren.lua" + "Function" "OnByakuren01AttackLanded" + "base_tick" "%base_tick" + "damage_up" "%damage_up" + "range" "%range" + } + } + } + + "modifier_byakuren_attack_up" + { + "TextureName" "up" + } + "modifier_byakuren_attack_down" + { + "TextureName" "down" + } + "modifier_byakuren_attack_equal" + { + "TextureName" "equal" + } + "modifier_byakuren_damage_percent" + { + "TextureName" "touhoutd/thtd_byakuren_01" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_up" "20" + } + "03" + { + "var_type" "FIELD_FLOAT" + "tick_step" "0.1" + } + "04" + { + "var_type" "FIELD_INTEGER" + "extra_damage" "15" + } + "05" + { + "var_type" "FIELD_FLOAT" + "min_tick" "0.7" + } + "06" + { + "var_type" "FIELD_FLOAT" + "max_tick" "1.7" + } + "07" + { + "var_type" "FIELD_FLOAT" + "base_tick" "1.2" + } + "08" + { + "var_type" "FIELD_INTEGER" + "range" "400" + } + } + } + + "thtd_byakuren_02" + { + "ID" "9244" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_byakuren_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityCooldown" "0.2" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "1" + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityByakuren.lua" + "Function" "OnByakuren01SpellStartDown" + "base_tick" "%base_tick" + "min_tick" "%min_tick" + "max_tick" "%max_tick" + "extra_damage" "%extra_damage" + "tick_step" "%tick_step" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_up" "20" + } + "03" + { + "var_type" "FIELD_FLOAT" + "tick_step" "0.1" + } + "04" + { + "var_type" "FIELD_INTEGER" + "extra_damage" "15" + } + "05" + { + "var_type" "FIELD_FLOAT" + "min_tick" "0.7" + } + "06" + { + "var_type" "FIELD_FLOAT" + "max_tick" "1.7" + } + "07" + { + "var_type" "FIELD_FLOAT" + "base_tick" "1.2" + } + "08" + { + "var_type" "FIELD_INTEGER" + "range" "400" + } + } + + } + + "thtd_byakuren_03" + { + "ID" "9245" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_byakuren_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + "AbilityCastRange" "1500" + + "Modifiers" + { + "modifier_byakuren_03_aura" + { + "EffectName" "particles/heroes/byakuren/ability_byakuren_04_circle.vpcf" + "EffectAttachType" "follow_origin" + "Passive" "1" + "ThinkInterval" "0.1" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityByakuren.lua" + "Function" "OnByakuren03SpellThink" + } + } + } + + "modifier_byakuren_03_buff" + { + "EffectName" "particles/heroes/byakuren/ability_byakuren_04_circle.vpcf" + "EffectAttachType" "follow_origin" + "ThinkInterval" "0.1" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityByakuren.lua" + "Function" "OnByakuren03SpellThink" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "nazrin" "2" //与thtd_nazrin_01一致 + } + "02" + { + "var_type" "FIELD_INTEGER" + "toramaru" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "kogasa" "2" + } + "04" + { + "var_type" "FIELD_INTEGER" + "nue" "10" + } + "05" + { + "var_type" "FIELD_INTEGER" + "minamitsu" "10" + } + "05" + { + "var_type" "FIELD_INTEGER" + "kyouko" "50" + } + } + } + + "thtd_byakuren_04" + { + "ID" "9246" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_byakuren_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/byakuren/ability_byakuren_04.vpcf" + "particle" "particles/heroes/thtd_byakuren/ability_byakuren_04_phy.vpcf" + "particle" "particles/heroes/byakuren/ability_byakuren_04_ult.vpcf" + "particle" "particles/heroes/thtd_byakuren/ability_byakuren_04_laser.vpcf" + "particle" "particles/heroes/thtd_byakuren/ability_byakuren_04_item.vpcf" + } + + "Modifiers" + { + "passive_byakuren_04_attack_landed" + { + "Passive" "1" + "IsHidden" "1" + "EffectName" "particles/heroes/byakuren/ability_byakuren_04.vpcf" + "EffectAttachType" "follow_origin" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityByakuren.lua" + "Function" "OnByakuren04AttackLanded" + "chance" "%chance" + "spell_time" "%spell_time" + "duration_time" "%duration_time" + "max_count" "%max_count" + "range" "%range" + "damage_count" "%damage_count" + "power_bonus" "%power_bonus" + } + } + } + + "modifier_byakuren_04_physical_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityByakuren.lua" + "Function" "OnCreatedByakuren04PhysicalBuff" + "duration_time" "%duration_time" + "attack_speed" "%attack_speed" + "attack_bonus" "%attack_bonus" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityByakuren.lua" + "Function" "OnDestroyByakuren04PhysicalBuff" + } + } + } + + "modifier_byakuren_04_pure_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityByakuren.lua" + "Function" "OnCreatedByakuren04PureBuff" + "crit_damage" "%crit_damage" + "crit_change" "%crit_change" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityByakuren.lua" + "Function" "OnDestroyByakuren04PureBuff" + } + } + } + + "modifier_byakuren_04_magic_buff" + { + "EffectName" "particles/heroes/byakuren/ability_byakuren_04_ult.vpcf" + "EffectAttachType" "follow_origin" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityByakuren.lua" + "Function" "OnCreatedByakuren04Buff" + "penetration" "%penetration" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityByakuren.lua" + "Function" "OnDestroyByakuren04Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "chance" "10" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "4.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "attack_bonus" "1000" + } + "05" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "300" + } + + + "06" + { + "var_type" "FIELD_INTEGER" + "max_count" "5" + } + "07" + { + "var_type" "FIELD_INTEGER" + "crit_change" "50" + } + "08" + { + "var_type" "FIELD_INTEGER" + "crit_damage" "500" + } + + "09" + { + "var_type" "FIELD_INTEGER" + "penetration" "50" + } + "10" + { + "var_type" "FIELD_INTEGER" + "damage_count" "4" + } + "11" + { + "var_type" "FIELD_INTEGER" + "power_damage" "10" + } + "12" + { + "var_type" "FIELD_INTEGER" + "range" "1000" + } + } + } + + "thtd_soga_01" + { + "ID" "9247" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_soga_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/thtd_soga/ability_soga_01.vpcf" + "particle" "particles/heroes/thtd_soga/ability_thtd_soga_lightning.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySoga.lua" + "Function" "OnSoga01SpellStart" + "Target" "POINT" + "stun_time" "%stun_time" + "length" "%length" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_FLOAT" + "stun_time" "1.0" + } + "03" + { + "var_type" "FIELD_FLOAT" + "length" "1000" + } + } + } + + "thtd_soga_02" + { + "ID" "9248" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_soga_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "20" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%range" + + "precache" + { + "particle" "particles/heroes/thtd_soga/ability_soga_02.vpcf" + } + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySoga.lua" + "Function" "OnSoga02SpellStart" + "Target" "POINT" + "range" "%range" + "damage_down" "%damage_down" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_down" "50" + } + } + } + + "thtd_soga_03" + { + "ID" "9249" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_soga_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "2" + "AbilityCooldown" "20" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%range" + + "precache" + { + "particle" "particles/heroes/thtd_soga/ability_soga_02.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySoga.lua" + "Function" "OnSoga03SpellStart" + "Target" "POINT" + "range" "%range" + "damage_down" "%damage_down" + "duration_time" "%duration_time" + "damage_up" "%damage_up" + } + } + + "Modifiers" + { + "modifier_soga_03_debuff" + { + "IsHidden" "1" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySoga.lua" + "Function" "OnCreatedSogaComboBuff" + "damage_up" "%damage_up" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySoga.lua" + "Function" "OnDestroySogaComboBuff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "500" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_down" "50" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_up" "0 45" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10" + } + } + } + + "thtd_futo_01" + { + "ID" "9250" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_futo_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/thtd_futo/ability_thtd_futo_01_fire.vpcf" + "particle" "particles/heroes/thtd_futo/ability_futo_base_attack_1.vpcf" + "particle" "particles/heroes/thtd_futo/ability_futo_base_attack_2.vpcf" + "particle" "particles/heroes/thtd_futo/ability_futo_base_attack_3.vpcf" + "particle" "particles/heroes/thtd_futo/ability_futo_base_attack_4.vpcf" + "particle" "particles/heroes/thtd_futo/ability_futo_base_attack_5.vpcf" + "particle" "particles/heroes/thtd_futo/ability_futo_base_attack_6.vpcf" + } + + "Modifiers" + { + "passive_futo_01_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityFuto.lua" + "Function" "OnFuto01AttackLanded" + "attack_damage" "%attack_damage" + "damage1" "%damage1" + "damage2" "%damage2" + "damage3" "%damage3" + "damage4" "%damage4" + "duration_time" "%duration_time" + "stun_time" "%stun_time" + "crit" "%crit" + "range" "%range" + } + } + } + + "modifier_futo_01_lock" + { + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage1" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage2" "1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage3" "2" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration_time" "3.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "damage4" "4" + } + "06" + { + "var_type" "FIELD_FLOAT" + "stun_time" "0.5" + } + "07" + { + "var_type" "FIELD_INTEGER" + "crit" "32" + } + "08" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + } + } + + "thtd_futo_02" + { + "ID" "9251" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_futo_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "2" + + "Modifiers" + { + "passive_futo_02_kill" + { + "Passive" "1" + "IsHidden" "1" + + "OnKill" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityFuto.lua" + "Function" "OnFuto02Kill" + "duration_time" "%duration_time" + "max_count" "%max_count" + } + } + } + + "modifier_futo_02_buff" + { + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_up" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "10 15" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10" + } + } + } + + "thtd_futo_03" + { + "ID" "9252" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_futo_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "20" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "500" + + "precache" + { + "particle" "particles/heroes/thtd_futo/ability_thtd_futo_03.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityFuto.lua" + "Function" "OnFuto03SpellStart" + "Target" "POINT" + "range" "%range" + "duration_time" "%duration_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "500" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "4.0" + } + } + } + + "thtd_miko_01" + { + "ID" "9253" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_miko_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "8.0" + "AbilityManaCost" "0" + "AbilityCastAnimation" "ACT_DOTA_CHANNEL_ABILITY_1" + + "precache" + { + "particle" "particles/heroes/thtd_miko/ability_miko_01.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMiko.lua" + "Function" "OnMiko01SpellStart" + "range" "%range" + "power_damage2" "%power_damage2" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "modifier_miko_01_pose" + { + "Duration" "%spell_time" + "OverrideAnimation" "ACT_DOTA_CAST_ABILITY_1_END" + + "States" + { + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + + "modifier_miko_01_debuff" + { + "Duration" "%duration_time" + "EffectName" "particles/heroes/thtd_miko/ability_miko_01.vpcf" + "EffectAttachType" "follow_origin" + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMiko.lua" + "Function" "OnDestroyMiko01DeBuff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage1" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_damage2" "1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "800" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration_time" "8.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "spell_time" "0.2" + } + } + } + + "thtd_miko_02" + { + "ID" "9254" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_miko_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1500" + + "precache" + { + "particle" "particles/heroes/thtd_miko/ability_miko_02_buff.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMiko.lua" + "Function" "OnMiko02SpellStart" + "Target" "TARGET" + "soga01_cd" "%soga01_cd" + "soga03_cd" "%soga03_cd" + "futo03_up" "%futo03_up" + "yoshika" "%yoshika" + "seiga" "%seiga" + } + } + + "Modifiers" + { + "modifier_miko_02_aura" + { + "Passive" "1" + "ThinkInterval" "0.1" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMiko.lua" + "Function" "OnMiko02SpellThink" + "bonus_power" "%bonus_power" + "bonus_chance" "%bonus_chance" + "bonus_crit" "%bonus_crit" + } + } + } + + "modifier_miko_02_buff" + { + "EffectName" "particles/heroes/thtd_miko/ability_miko_02_buff.vpcf" + "EffectAttachType" "follow_origin" + } + + "modifier_miko_02_ready" + { + "EffectName" "particles/heroes/thtd_miko/ability_miko_02_buff.vpcf" + "EffectAttachType" "follow_origin" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "soga01_cd" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "soga03_cd" "10" + } + "03" + { + "var_type" "FIELD_INTEGER" + "futo03_up" "100" + } + "04" + { + "var_type" "FIELD_INTEGER" + "yoshika" "1" + } + "05" + { + "var_type" "FIELD_FLOAT" + "seiga" "0.5" + } + "06" + { + "var_type" "FIELD_INTEGER" + "bonus_power" "100" + } + "07" + { + "var_type" "FIELD_INTEGER" + "bonus_chance" "5" + } + "08" + { + "var_type" "FIELD_INTEGER" + "bonus_crit" "50" + } + } + } + + "thtd_miko_03" + { + "ID" "9255" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_miko_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1200" + + "precache" + { + "particle" "particles/heroes/thtd_miko/ability_miko_03.vpcf" + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "true" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMiko.lua" + "Target" "TARGET" + "Function" "OnMiko03SpellHit" + } + } + + "Modifiers" + { + "passive_miko_03_damage" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "%tick" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMiko.lua" + "Function" "OnMiko03SpellThink" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "tick" "0.3" + } + } + } + + "thtd_miko_04" + { + "ID" "9256" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_miko_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastPoint" "0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "OverrideAnimation" "Act_DOTA_CAST_ABILITY_4" + "AbilityCooldown" "20" + "AbilityManaCost" "60" + "AbilityChannelTime" "8.0" + + "precache" + { + "particle" "particles/heroes/thtd_miko/ability_thtd_miko_04_starfall.vpcf" + "particle" "particles/heroes/thtd_miko/ability_thtd_miko_04_start.vpcf" + } + + "OnSpellStart" + { + "ApplyModifier" + { + "ModifierName" "modifier_thdots_miko04_think_interval" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMiko.lua" + "Function" "OnCreatedMiko04" + } + } + "OnChannelInterrupted" + { + "RemoveModifier" + { + "Target" "CASTER" + "ModifierName" "modifier_thdots_miko04_think_interval" + } + } + + "Modifiers" + { + "modifier_thdots_miko04_think_interval" + { + "Duration" "8" + "ThinkInterval" "0.4" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMiko.lua" + "Function" "OnMiko04SpellThink" + "damage_up" "%damage_up" + "max_damage_up" "%max_damage_up" + } + } + } + "modifier_miko_04_pose" + { + "OverrideAnimation" "ACT_DOTA_CAST_ABILITY_4" + "EffectName" "particles/heroes/thtd_miko/ability_thtd_miko_04_start.vpcf" + "EffectAttachType" "follow_origin" + } + "modifier_miko_04_pose_other" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "10" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "8.0" + } + } + } + + "thtd_yoshika_01" + { + "ID" "9257" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yoshika_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "5" + + "precache" + { + "particle" "particles/heroes/thtd_yoshika/ability_yoshika_01.vpcf" + "particle" "particles/heroes/thtd_yoshika/ability_yoshika_01_debuff.vpcf" + } + + "Modifiers" + { + "passive_yoshika_01_attack_landed" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityYoshika.lua" + "Function" "OnYoshika01AttackLanded" + "duration_time" "%duration_time" + "range" "%range" + } + } + } + "modifier_yoshika_01_slow" + { + "Duration" "%duration_time" + "IsDebuff" "1" + "EffectName" "particles/heroes/thtd_yoshika/ability_yoshika_01_debuff.vpcf" + "EffectAttachType" "follow_origin" + + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_slow" + } + } + "modifier_thtd_yoshika_01_combo_buff" + { + "Properties" + { + "MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT" "%attack_speed" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-20 -25 -30 -40 -50" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "5.0" + } + "04" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + "05" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "50" + } + "06" + { + "var_type" "FIELD_INTEGER" + "has_combo_buff" "1" + } + } + } + + "thtd_yoshika_02" + { + "ID" "9258" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yoshika_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + "AbilityCastAnimation" "ACT_DOTA_CHANNEL_ABILITY_2" + + "precache" + { + "particle" "particles/heroes/thtd_yoshika/ability_yoshika_02.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYoshika.lua" + "Function" "OnYoshika02SpellStart" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "power_damage" "0.5" + } + } + } + + "thtd_seiga_01" + { + "ID" "9259" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_seiga_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + "AbilityCastRange" "1500" + + "Modifiers" + { + "modifier_seiga_01_aura" + { + "Passive" "1" + "IsHidden" "1" + + "Aura" "modifier_seiga_01_destroy_buff" + "Aura_Radius" "1500" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_seiga_01_destroy_buff" + { + "IsHidden" "1" + "OnDeath" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySeiga.lua" + "Function" "OnSeiga01Death" + } + } + } + } + } + + "thtd_seiga_02" + { + "ID" "9260" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_seiga_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySeiga.lua" + "Function" "OnSeiga02SpellStart" + "Target" "TARGET" + } + } + "Modifiers" + { + "modifier_seiga_02_attack_speed_buff" + { + "Duration" "%duration_time" + "Properties" + { + "MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT" "%attack_speed" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "20 30 40 60 80" + } + "01" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10" + } + } + } + + "thtd_seiga_03" + { + "ID" "9261" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_seiga_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_AURA" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + "AbilityCastRange" "1500" + + "precache" + { + "particle" "particles/heroes/thtd_seiga/ability_seiga_03.vpcf" + } + "Modifiers" + { + "modifier_seiga_03_aura" + { + "Passive" "1" + "IsHidden" "1" + + "Aura" "modifier_seiga_03_destroy_buff" + "Aura_Radius" "1500" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_seiga_03_destroy_buff" + { + "IsHidden" "1" + "OnDeath" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySeiga.lua" + "Function" "OnSeiga03Death" + "range" "%range" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "power_damage" "0.5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + } + } + + "thtd_keine_01" + { + "ID" "9262" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_keine_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "5" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "15" + "AbilityManaCost" "0" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "soundfile" "particles/heroes/thtd_keine/ability_keine_01_buff.vpcf" + "soundfile" "particles/heroes/thtd_keine/ability_keine_01_stun.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKeine.lua" + "Function" "OnKeine01SpellStart" + "Target" "TARGET" + "bonus_time" "%bonus_time" + } + } + + "Modifiers" + { + "modifier_keine_01_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityKeine.lua" + "Function" "OnKeine01AttackLanded" + "chance" "%chance" + "stun_time" "%stun_time" + "lock_time" "%lock_time" + "range" "%range" + } + } + } + + "modifier_keine_01_lock" + { + + } + + "modifier_keine_01_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKeine.lua" + "Function" "OnCreatedKeine01Buff" + "attack_bonus" "%attack_bonus" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKeine.lua" + "Function" "OnDestroyKeine01Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_bonus" "10 20 40 80 200" + } + "02" + { + "var_type" "FIELD_FLOAT" + "bonus_time" "10.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + "04" + { + "var_type" "FIELD_INTEGER" + "chance" "40" + } + "05" + { + "var_type" "FIELD_FLOAT" + "stun_time" "1.0" + } + "06" + { + "var_type" "FIELD_FLOAT" + "lock_time" "1.5" + } + "07" + { + "var_type" "FIELD_FLOAT" + "range" "300" + } + } + } + + "thtd_keine_02" + { + "ID" "9263" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_keine_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityCooldown" "10" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "1" + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityKeine.lua" + "Function" "OnKeine02SpellStart" + } + } + } + + "thtd_keine_03" + { + "ID" "9264" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_keine_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "2" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%range" + + "precache" + { + "particle" "particles/heroes/thtd_keine/ability_keine_03.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKeine.lua" + "Function" "OnKeine03SpellStart" + "Target" "POINT" + "range1" "%range1" + "max_count" "%max_count" + } + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "true" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKeine.lua" + "Target" "TARGET" + "Function" "OnKeine04SwordHit" + } + } + + "Modifiers" + { + "thtd_keine_03_debuff" + { + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKeine.lua" + "Function" "OnKeine03Destroy" + } + } + } + + "modifier_keine_03_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityKeine.lua" + "Function" "OnKeine03AttackLanded" + "range2" "%range2" + "chance" "%chance" + "max_count" "%max_count" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chance" "25 50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range1" "1000" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range2" "300" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_count" "2" + } + } + + } + + "thtd_keine_04" + { + "ID" "9265" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_keine_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCooldown" "1" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/thtd_keine/ability_keine_04_sword.vpcf" + "particle" "particles/heroes/thtd_keine/ability_keine_04_mirror.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityKeine.lua" + "Function" "OnKeine04SpellStart" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "distance_damage" "1" + } + "03" + { + "var_type" "FIELD_FLOAT" + "hp_percent" "0.5" + } + } + } + + "thtd_medicine_01" + { + "ID" "9266" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_medicine_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "5" + + "Modifiers" + { + "passive_medicine_01_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityMedicine.lua" + "Function" "OnMedicine01AttackLanded" + "duration_time" "%duration_time" + "fear_time" "%fear_time" + "tick_time" "%tick_time" + } + } + } + + "modifier_medicine_01_slow" + { + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_slow" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-20 -30 -40 -50 -70" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "5.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "tick_time" "0.2" + } + } + } + + "thtd_medicine_02" + { + "ID" "9267" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_medicine_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + "AbilityCooldown" "10" + "AbilityManaCost" "15" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%range" + + "precache" + { + "particle" "particles/heroes/thtd_medicine/ability_medicine_02.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityMedicine.lua" + "Function" "OnMedicine02SpellStart" + "Target" "POINT" + "range" "%range" + "duration_time" "%duration_time" + "tick_time" "%tick_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "400" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "2.8" + } + "04" + { + "var_type" "FIELD_FLOAT" + "tick_time" "0.2" + } + } + } + + "thtd_medicine_03" + { + "ID" "9268" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/ai_cast_point" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCastPointAI" + "Target" "POINT" + } + } + } + + "thtd_star_01" + { + "ID" "9269" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_star_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "5" + "AbilityCooldown" "1" + "AbilityManaCost" "10" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%range" + + "precache" + { + "particle" "particles/heroes/thtd_star/ability_star_01.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityStar.lua" + "Function" "OnStar01SpellStart" + "Target" "POINT" + "range" "%range" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "modifier_star_01_slow" + { + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_slow" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + "03" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-20 -30 -40 -50 -70" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration_time" "3.5" + } + } + } + + "thtd_star_02" + { + "ID" "9270" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_star_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "300" + + "precache" + { + "particle" "particles/heroes/thtd_star/ability_star_01.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityStar.lua" + "Function" "OnStar02SpellStart" + "Target" "POINT" + "range" "%range" + "max_count" "%max_count" + "damage_up" "%damage_up" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_count" "20" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_up" "5" + } + } + } + + "thtd_sunny_01" + { + "ID" "9271" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_sunny_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "5" + "AbilityManaCost" "10" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/sunny/ability_sunny_01_laser.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySunny.lua" + "Function" "OnSunny01SpellStart" + "Target" "TARGET" + "range" "%range" + "max_count" "%max_count" + "damage_up" "%damage_up" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "1000" + } + "03" + { + "var_type" "FIELD_INTEGER" + "max_count" "2" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_up" "100" + } + } + } + + "thtd_sunny_02" + { + "ID" "9272" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_sunny_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "3" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%range" + + "precache" + { + "particle" "particles/heroes/sunny/ability_sunny_02.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySunny.lua" + "Function" "OnSunny02SpellStart" + "Target" "POINT" + "range" "%range" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "modifier_sunny_02_debuff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySunny.lua" + "Function" "OnCreatedSunny02Buff" + "damage_up" "%damage_up" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySunny.lua" + "Function" "OnDestroySunny02Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "range" "400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up" "10 15 25" + } + } + } + + "thtd_sunny_03" + { + "ID" "9273" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/ai_cast_point" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCastPointAI" + "Target" "POINT" + } + } + } + + "thtd_luna_01" + { + "ID" "9274" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_luna_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/thtd_luna/ability_luna_01.vpcf" + } + + "Modifiers" + { + "passive_luna_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityLuna.lua" + "Function" "OnLuna01Attack" + "max_count" "%max_count" + "range" "%range" + "damage_up" "%damage_up" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "2" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "1000" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_up" "100" + } + } + } + + "thtd_luna_02" + { + "ID" "9275" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_luna_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "3" + "AbilityCooldown" "20" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/thtd_luna/ability_luna_02_laser.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityLuna.lua" + "Function" "OnLuna02SpellStart" + "Target" "POINT" + "bonus_power" "%bonus_power" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "modifier_luna_02_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityLuna.lua" + "Function" "OnCreatedLuna02Buff" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityLuna.lua" + "Function" "OnDestroyLuna02Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bonus_power" "10 25 50" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "7.0" + } + } + } + + "thtd_suika_01" + { + "ID" "9276" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_suika_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCooldown" "0.2" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "5" + + "precache" + { + "particle" "particles/heroes/thtd_suika/ability_suika_01.vpcf" + "particle" "particles/heroes/thtd_suika/ability_suika_01_smoke.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilitySuika.lua" + "Function" "OnSuika01SpellStartUp" + } + } + "Modifiers" + { + "modifier_suika_02_illusion" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + } + "Properties" + { + "MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE" "-100" + } + } + "passive_suika_01_attack_landed" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilitySuika.lua" + "Function" "OnSuika01AttackLanded" + } + } + } + "modifier_suika_01_slow_debuff" + { + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_slow" + } + } + "modifier_suika_01_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "0.1" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySuika.lua" + "Function" "OnSuika01Think" + } + } + } + } + + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-25 -30 -35 -40 -60" + } + } + } + + "thtd_suika_02" + { + "ID" "9277" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_suika_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "AbilityCooldown" "0.2" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + "MaxLevel" "1" + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilitySuika.lua" + "Function" "OnSuika01SpellStartDown" + } + } + "Modifiers" + { + "modifier_suika_02_illusion" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + } + "Properties" + { + "MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE" "-100" + } + } + } + } + + "thtd_suika_03" + { + "ID" "9278" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_suika_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/thtd_suika/ability_suika_03.vpcf" + "particle" "particles/thd2/heroes/suika/ability_suika_04_effect.vpcf" + } + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySuika.lua" + "Function" "OnSuika03SpellStart" + "Target" "POINT" + } + } + + "Modifiers" + { + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + } + } + + "thtd_suika_04" + { + "ID" "9279" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_suika_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "15" + "AbilityManaCost" "0" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/thtd_suika/ability_suika_04.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilitySuika.lua" + "Function" "OnSuika04SpellStart" + "Target" "TARGET" + "range" "%range" + "duration_time" "%duration_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "7" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "4.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "800" + } + } + } + + "thtd_yuugi_01" + { + "ID" "9280" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yuugi_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + + "precache" + { + "particle" "particles/heroes/thtd_yuugi/ability_yuugi_01.vpcf" + } + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuugi.lua" + "Function" "OnYuugi01SpellStart" + "Target" "POINT" + "power_damage1" "%power_damage1" + "power_damage2" "%power_damage2" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage1" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_damage2" "15" + } + } + } + + "thtd_yuugi_02" + { + "ID" "9281" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yuugi_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/thtd_yuugi/ability_yuugi_02.vpcf" + } + + "Modifiers" + { + "passive_yuugi_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityYuugi.lua" + "Function" "OnYuugi02AttackLanded" + "chance" "%chance" + "range" "%range" + } + } + } + "modifier_yuugi_02_pause_unit" + { + "States" + { + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "chance" "45" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "250" + } + } + } + + "thtd_yuugi_03" + { + "ID" "9282" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_yuugi_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + "AbilityCooldown" "15" + "AbilityManaCost" "50" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/thtd_yuggi/ability_yuugi_03.vpcf" + "particle" "particles/thd2/heroes/yugi/yugi_slam.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityYuugi.lua" + "Function" "OnYuugi03SpellStart" + "Target" "POINT" + "duration_time" "%duration_time" + "range" "%range" + } + } + + "Modifiers" + { + "modifier_yuugi_03_pause_unit" + { + "States" + { + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration_time" "3.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "500" + } + } + } + + "thtd_junko_01" + { + "ID" "9283" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_junko_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "5" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/thtd_junko/ability_junko_01_buff.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityJunko.lua" + "Function" "OnJunko01SpellStart" + "Target" "TARGET" + "max_count" "%max_count" + } + } + + "OnUpgrade" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityJunko.lua" + "Function" "OnUpgradeJunko01Buff" + "damage_up" "%damage_up" + "hecatia_up" "%hecatia_up" + } + } + + "Modifiers" + { + "modifier_junko_01" + { + // "EffectName" "particles/heroes/thtd_junko/ability_junko_01_buff.vpcf" + // "EffectAttachType" "follow_origin" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityJunko.lua" + "Function" "OnCreatedJunko01Buff" + "damage_up" "%damage_up" + "hecatia_up" "%hecatia_up" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityJunko.lua" + "Function" "OnDestroyJunko01Buff" + } + } + } + + "modifier_thtd_junko_01_combo_buff" + { + + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_up" "10 20 30 40 60" + } + "02" + { + "var_type" "FIELD_INTEGER" + "hecatia_up" "15 30 45 60 90" + } + "03" + { + "var_type" "FIELD_INTEGER" + "has_combo_buff" "1" + } + } + } + + "thtd_junko_02" + { + "ID" "9284" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_junko_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + "AbilityCooldown" "10.0" + "AbilityManaCost" "0" + + "precache" + { + "particle" "particles/heroes/thtd_junko/ability_junko_02.vpcf" + } + + // "OnProjectileHitUnit" + // { + // "DeleteOnHit" "true" + // "RunScript" + // { + // "ScriptFile" "scripts/vscripts/abilities/abilityJunko.lua" + // "Target" "TARGET" + // "Function" "OnJunkoProjectileHit" + // "max_count" "%max_count" + // } + // } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityJunko.lua" + "Function" "OnJunko02SpellStart" + "duration_time" "%duration_time" + "tick" "%tick" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "tick" "0.25" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "5.0" + } + } + } + + "thtd_junko_03" + { + "ID" "9285" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_junko_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "2" + "AbilityCooldown" "10.0" + "AbilityManaCost" "20" + + "precache" + { + "particle" "particles/heroes/thtd_junko/ability_junko_03.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityJunko.lua" + "Function" "OnJunko03SpellStart" + "duration_time" "%duration_time" + "power_suck" "%power_suck" + } + } + + "Modifiers" + { + "modifier_junko_03_buff" + { + "Duration" "%duration_time" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityJunko.lua" + "Function" "OnCreatedJunko03Buff" + "damage_up" "%damage_up" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityJunko.lua" + "Function" "OnDestroyJunko03Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_up" "150 300" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_suck" "50 100" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "7.0" + } + } + } + + "thtd_junko_04" + { + "ID" "9286" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_junko_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/thtd_junko/ability_junko_04.vpcf" + "particle" "particles/heroes/thtd_junko/ability_junko_04_debuff.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityJunko.lua" + "Function" "OnJunko04SpellStart" + "Target" "POINT" + "range" "%range" + } + } + + "Modifiers" + { + "modifier_junko_04_debuff" + { + "EffectName" "particles/heroes/thtd_junko/ability_junko_04_debuff.vpcf" + "EffectAttachType" "attach_hitloc" + + "ThinkInterval" "%tick" + "Duration" "%duration_time" + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityJunko.lua" + "Function" "OnThinkJunko04Debuff" + "Target" "TARGET" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage1" "20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_damage2" "4" + } + "03" + { + "var_type" "FIELD_FLOAT" + "tick" "0.3" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration_time" "3.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "range" "500" + } + } + } + + "thtd_hecatia_01" + { + "ID" "9287" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_hecatia_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/thtd_hecatia/ability_hecatia_01_earth.vpcf" + "particle" "particles/heroes/thtd_hecatia/ability_hecatia_earth_rain.vpcf" + } + + // "OnProjectileHitUnit" + // { + // "DeleteOnHit" "false" + // "RunScript" + // { + // "ScriptFile" "scripts/vscripts/abilities/abilityHecatia.lua" + // "Target" "TARGET" + // "Function" "OnHecatiaProjectileHit" + // } + // } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityHecatia.lua" + "Function" "OnHecatia01SpellStart" + "Target" "POINT" + } + } + + "Modifiers" + { + "modifier_hecatia_01_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "0.03" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityHecatia.lua" + "Function" "OnHecatia01Think" + } + } + } + + "modifier_thtd_hecatia_01_debuff" + { + "EffectName" "particles/heroes/thtd_hecatia/ability_hecatia_earth_debuff.vpcf" + "EffectAttachType" "attach_hitloc" + "Duration" "%root_time" + + "States" + { + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + + "modifier_hecatia_01_earth_lock" + { + "Duration" "%lock_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_up" "20" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_damage1" "2" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range1" "400" + } + "04" + { + "var_type" "FIELD_FLOAT" + "root_time" "1.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "lock_time" "2.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "power_damage2" "3" + } + "07" + { + "var_type" "FIELD_INTEGER" + "range2" "600" + } + } + } + + "thtd_hecatia_02" + { + "ID" "9288" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_hecatia_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/thtd_hecatia/ability_hecatia_01_moon.vpcf" + "particle" "particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex.vpcf" + "particle" "particles/heroes/thtd_hecatia/ability_hecatia_moon_hit.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityHecatia.lua" + "Function" "OnHecatia02SpellStart" + "Target" "POINT" + } + } + + "Modifiers" + { + "modifier_hecatia_01_moon_lock" + { + "Duration" "%lock_time" + } + } + + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chance" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crit" "100" + } + "03" + { + "var_type" "FIELD_INTEGER" + "power_damage1" "1" + } + "04" + { + "var_type" "FIELD_INTEGER" + "range1" "350" + } + "05" + { + "var_type" "FIELD_INTEGER" + "back_distance" "100" + } + "06" + { + "var_type" "FIELD_FLOAT" + "lock_time" "2.0" + } + "07" + { + "var_type" "FIELD_INTEGER" + "power_damage2" "2" + } + "08" + { + "var_type" "FIELD_INTEGER" + "range2" "550" + } + } + } + + "thtd_hecatia_03" + { + "ID" "9289" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_hecatia_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/thtd_hecatia/ability_hecatia_01_otherworld.vpcf" + "particle" "particles/heroes/thtd_hecatia/ability_hecatia_otherworld.vpcf" + "particle" "particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityHecatia.lua" + "Function" "OnHecatia03SpellStart" + "Target" "POINT" + } + } + + "Modifiers" + { + "modifier_thtd_hecatia_03_combo_buff" + { + + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_up" "30" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_damage1" "3" + } + "03" + { + "var_type" "FIELD_INTEGER" + "active_range" "400" + } + "04" + { + "var_type" "FIELD_INTEGER" + "full_range" "700" + } + "05" + { + "var_type" "FIELD_FLOAT" + "suck_duration" "3.0" + } + "06" + { + "var_type" "FIELD_INTEGER" + "power_damage2" "5" + } + "07" + { + "var_type" "FIELD_INTEGER" + "range2" "700" + } + "08" + { + "var_type" "FIELD_INTEGER" + "has_combo_buff" "1" + } + } + } + + "thtd_hecatia_04" + { + "ID" "9290" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_hecatia_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_PASSIVE" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "precache" + { + "particle" "particles/heroes/thtd_hecatia/ability_hecatia_04_triangle.vpcf" + "particle" "particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf" + } + + "Modifiers" + { + "modifier_hecatia_04_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "1.0" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityHecatia.lua" + "Function" "OnHecatia04Think" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "10" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "200" + } + } + } + + //================================================================================================================= + // Doom Bringer: Devour + //================================================================================================================= + "shinki_dragon_01" + { + "ID" "9298" + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "AbilityTextureName" "doom_bringer_devour" + "AbilityCastPoint" "0" + "AbilityCooldown" "0" + "AbilityManaCost" "0" + "MaxLevel" "1" + "AbilityCastRange" "300" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_doombringer.vsndevts" + "particle" "particles/units/heroes/hero_doom_bringer/doom_bringer_devour.vpcf" + } + + "Modifiers" + { + "modifier_shinki_dragon_01_cooldown" + { + "IsHidden" "1" + } + } + + "OnSpellStart" + { + "FireSound" + { + "Target" "CASTER" + "EffectName" "Hero_DoomBringer.Devour" + } + + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityShinki.lua" + "Function" "OnShinkiDragon01SpellStart" + "damage_up" "%damage_up" + "max_count" "%max_count" + } + } + + "Modifiers" + { + "modifier_shinki_dragon_01_buff" + { + + } + + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "damage_up" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "100" + } + } + } + + "shinki_dragon_02" + { + "ID" "9299" + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "AbilityTextureName" "slardar_bash" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + // Precache + //------------------------------------------------------------------------------------------------------------- + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_slardar.vsndevts" + "particle" "particles/generic_gameplay/generic_stunned.vpcf" + } + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportBonus" "25" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "chance" "50" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_crit" "4" + } + "03" + { + "var_type" "FIELD_FLOAT" + "stun_time" "0.25" + } + "04" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + "05" + { + "var_type" "FIELD_INTEGER" + "aoe_crit" "2" + } + + } + "Modifiers" + { + "modifier_bash_stun_datadriven" + { + "IsDebuff" "1" + "IsHidden" "1" + "OverrideAnimation" "ACT_DOTA_DISABLED" + + "EffectName" "particles/generic_gameplay/generic_stunned.vpcf" + "EffectAttachType" "follow_overhead" + + "States" + { + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + + + "modifier_bash_datadriven" + { + "IsHidden" "1" + "Passive" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityShinki.lua" + "Function" "OnShinki02AttackLanded" + "chance" "%chance" + "stun_time" "%stun_time" + "range" "%range" + "damage_crit" "%damage_crit" + "aoe_crit" "%aoe_crit" + } + } + } + } + } + + "shinki_dragon_03" + { + "ID" "9300" + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_NO" + "FightRecapLevel" "1" + "AbilityTextureName" "ursa_earthshock" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastRange" "0" + "AbilityCastPoint" "0.2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "5" + "AbilityDuration" "4" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "shock_radius" "900" + } + "02" + { + "var_type" "FIELD_INTEGER" + "movement_slow" "-60" + } + // Extra variables + "03" + { + "var_type" "FIELD_INTEGER" + "debuff_duration" "3" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_times" "3" + } + } + + // Data driven + //------------------------------------------------------------------------------------------------------------- + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_ursa.vsndevts" + "particle" "particles/units/heroes/hero_ursa/ursa_earthshock.vpcf" + "particle" "particles/econ/items/ursa/ursa_ti10/ursa_ti10_earthshock.vpcf" + } + + "OnSpellStart" + { + "FireSound" + { + "Target" "CASTER" + "EffectName" "Hero_Ursa.Earthshock" + } + + "FireEffect" + { + "Target" "CASTER" + // "EffectName" "particles/units/heroes/hero_ursa/ursa_earthshock.vpcf" + "EffectName" "particles/econ/items/ursa/ursa_ti10/ursa_ti10_earthshock.vpcf" + "EffectAttachType" "start_at_origin" + "EffectRadius" "%shock_radius" + } + + "RunScript" + { + "Target" "CASTER" + "ScriptFile" "scripts/vscripts/abilities/abilityShinki.lua" + "Function" "OnShinkiDragon03SpellStart" + "RangeRadius" "%shock_radius" + "DamageTimes" "%damage_times" + } + } + + "Modifiers" + { + "modifier_earthshock_debuff_datadriven" + { + "IsHidden" "0" + "IsDebuff" "1" + + "Duration" "%debuff_duration" + + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%movement_slow" + } + } + } + } + + + //================================================================================================================= + // Alice + //================================================================================================================= + "thtd_alice_01" + { + "ID" "9301" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_alice_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "5" + "AbilityCooldown" "1" + "AbilityManaCost" "40" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%range2" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_techies.vsndevts" + "particle" "particles/units/heroes/hero_techies/techies_land_mine.vpcf" + "particle" "particles/units/heroes/hero_techies/techies_land_mine_explode.vpcf" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Hero_Techies.LandMine.Plant" + "Target" "CASTER" + } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityAlice.lua" + "Function" "OnAlice01SpellStart" + "Target" "POINT" + "range1" "%range1" + "range2" "%range2" + "stun_time" "%stun_time" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "modifier_alice_01_rooted" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + + "modifier_alice_boom_tracker" + { + "IsHidden" "1" + "IsPurgable" "0" + + "EffectName" "particles/units/heroes/hero_techies/techies_land_mine.vpcf" + "EffectAttachType" "follow_origin" + } + + "modifier_alice_power666" + { + + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range1" "200" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range2" "400" + } + "04" + { + "var_type" "FIELD_FLOAT" + "stun_time" "1.0" + } + "05" + { + "var_type" "FIELD_FLOAT" + "duration_time" "60" + } + } + } + + "thtd_alice_unit_kill" + { + "ID" "9302" + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityTextureName" "techies_remote_mines_self_detonate" + + "AbilityCastRange" "100" + "MaxLevel" "1" + + "OnSpellStart" + { + "FireEffect" + { + "EffectName" "particles/units/heroes/hero_techies/techies_land_mine_explode.vpcf" + "EffectAttachType" "follow_hitloc" + "Target" "CASTER" + } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityAlice.lua" + "Function" "OnAliceUnitKillSpellStart" + } + } + } + + "thtd_alice_02" + { + "ID" "9303" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_alice_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCastPoint" "0.1" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "30" + "AbilityManaCost" "0" + "MaxLevel" "2" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1500" + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Sound_THTD.thtd_set_tower" + "Target" "CASTER" + } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityAlice.lua" + "Function" "OnAlice02SpellStart" + } + } + + "Modifiers" + { + "modifier_alice_02" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + } + "Properties" + { + "MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE" "-100" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_up" "50" + } + } + } + + "thtd_alice_02_ningyou_01" + { + "ID" "9304" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_shanghainingyou_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + "AbilityCastRange" "200" + + "Modifiers" + { + "modifier_alice_shanghainingyou_crit_chance" + { + "Passive" "1" + "IsHidden" "1" + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityAlice.lua" + "Function" "OnAlice02Ningyou01AttackLanded" + "power_damage" "%power_damage" + "chance" "%chance" + "range" "%range" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "3" + } + "02" + { + "var_type" "FIELD_INTEGER" + "chance" "40" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "300" + } + } + } + + "thtd_alice_02_ningyou_02" + { + "ID" "9305" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_hourainingyou_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + "AbilityCastRange" "200" + + "Modifiers" + { + "modifier_alice_hourainingyou_buff" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityAlice.lua" + "Function" "OnAlice02Ningyou02AttackLanded" + "CritChance" "%crit_chance" + "CritHealth" "%health" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "5" + } + "02" + { + "var_type" "FIELD_FLOAT" + "health" "10" + } + } + } + + "thtd_alice_03" + { + "ID" "9306" + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityTextureName" "touhoutd/thtd_alice_03" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_2" + "MaxLevel" "2" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + + // Stats + //---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityManaCost" "0" + "AbilityCastPoint" "0.2" + "AbilityCooldown" "10 7" + + "precache" + { + "particle" "particles/heroes/alice/ability_alice_02.vpcf" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Voice_Thdots_Alice.AbilityAlice011" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityAlice.lua" + "Function" "OnAlice04SpellStart" + "Target" "TARGET" + "Radius" "%radius" + "Distance" "%distance" + "LaserRadius" "%laser_radius" + "max_count" "%max_count" + "damage_up" "%damage_up" + } + } + + "Modifiers" + { + "modifier_alice_04_rooted" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "10" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up" "1" + } + "04" + { + "var_type" "FIELD_FLOAT" + "radius" "400" + } + "05" + { + "var_type" "FIELD_INTEGER" + "distance" "1500" + } + "06" + { + "var_type" "FIELD_FLOAT" + "laser_radius" "150" + } + } + } + + "thtd_alice_04" + { + "ID" "9307" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/ai_cast_point" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCastPointAI" + "Target" "POINT" + } + } + } + + //================================================================================================================= + // kokoro + //================================================================================================================= + "thtd_kokoro_01" + { + "ID" "9308" + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kokoro_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + "MaxLevel" "1" + "AbilityCooldown" "1.0" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/units/heroes/hero_arc_warden/arc_warden_wraith_prj.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKokoro.lua" + "Function" "OnKokoro01SpellStart" + } + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "1" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKokoro.lua" + "Target" "TARGET" + "Function" "OnProjectileHitUnitKokoro01" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + } + } + + "thtd_kokoro_02" + { + "ID" "9309" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kokoro_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + // Stats + //---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityManaCost" "0" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "3.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKokoro.lua" + "Function" "OnKokoro02SpellStart" + "stun_time" "%stun_time" + } + } + + "Modifiers" + { + "modifier_kokoro_02_rooted" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "3" + } + "02" + { + "var_type" "FIELD_FLOAT" + "stun_time" "0.5" + } + } + } + + "thtd_kokoro_03" + { + "ID" "9310" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kokoro_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + "AbilityCastRange" "800" + "AbilityManaCost" "0" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "2.0" + + "precache" + { + //"particle" "particles/econ/items/mars/mars_fall20_immortal_shield/mars_fall20_immortal_shield_bash.vpcf" + "particle" "particles/econ/items/mars/mars_fall20_immortal_shield/mars_fall20_immortal_shield_bash_headmodel.vpcf" + "particle" "particles/units/heroes/hero_mars/mars_shield_bash_model.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKokoro.lua" + "Function" "OnKokoro03SpellStart" + "crit_mult" "%crit_mult" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_mult" "2" + } + } + } + + "thtd_kokoro_04" + { + "ID" "9311" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kokoro_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + "AbilityCastRange" "1200" + + "Modifiers" + { + "modifier_kokoro_04_buff_1" + { + "TextureName" "touhoutd/thtd_kokoro_01" + } + + "modifier_kokoro_04_buff_2" + { + "TextureName" "touhoutd/thtd_kokoro_02" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKokoro.lua" + "Function" "OnCreatedKokoro04Buff2" + "bonus" "%bonus" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKokoro.lua" + "Function" "OnDestroyKokoro04Buff2" + } + } + } + + "modifier_kokoro_04_buff_3" + { + "TextureName" "touhoutd/thtd_kokoro_03" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKokoro.lua" + "Function" "OnCreatedKokoro04Buff3" + "crit_damage" "%crit_damage" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKokoro.lua" + "Function" "OnDestroyKokoro04Buff3" + } + } + } + + "modifier_kokoro_04_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "1.0" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKokoro.lua" + "Function" "OnKokoro04Think" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "crit_damage" "100" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_up_base" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up_per" "1" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus" "100" + } + } + } + + "thtd_hina_01" + { + "ID" "9312" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_hina_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "5" + "AbilityCastRange" "%radius" + + "Modifiers" + { + "modifier_hina_01_aura" + { + "Passive" "1" + "IsHidden" "1" + "Aura" "modifier_hina_01_slow_debuff" + "Aura_Radius" "%radius" + "Aura_Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "Aura_Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + } + + "modifier_hina_01_slow_debuff" + { + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_slow" + } + } + } + + // Special + // ------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1200" + } + "02" + { + "var_type" "FIELD_INTEGER" + "move_slow" "-30 -35 -40 -45 -55" + } + } + } + + "thtd_hina_02" + { + "ID" "9313" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_hina_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + "AbilityCooldown" "10.0" + "AbilityManaCost" "0" + + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.1" + "AOERadius" "%range" + + "precache" + { + // "soundfile" "soundevents/game_sounds_heroes/game_sounds_troll_warlord.vsndevts" + "particle" "particles/econ/items/troll_warlord/troll_ti10_shoulder/troll_ti10_whirling_axe_melee.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityHina.lua" + "Function" "OnSpellStartHina02" + "Target" "POINT" + "range" "%range" + "duration" "%duration" + "tick" "%tick" + "chance" "%chance" + "bonus_crit" "%bonus_crit" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "250" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration" "5.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "tick" "0.4" + } + "05" + { + "var_type" "FIELD_INTEGER" + "chance" "70" + } + "06" + { + "var_type" "FIELD_INTEGER" + "bonus_crit" "40" + } + } + } + + "thtd_hina_03" + { + "ID" "9507" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/ai_cast_point" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCastPointAI" + "Target" "POINT" + } + } + } + + "reimu_pet_01" + { + "ID" "9315" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/reimu_pet_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + // Stats + //---------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityManaCost" "0" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "0.2" + + "Modifiers" + { + "modifier_reimu_pet_01_state" + { + "IsHidden" "1" + + "States" + { + // "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + // "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + // "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + } + } + + "modifier_reimu_pet_01_level" + { + + } + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityReimu_pet.lua" + "Function" "OnSpellStartReimuPet01" + } + } + } + + "reimu_pet_02" + { + "ID" "9316" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/reimu_pet_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + // Stats + //---------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityManaCost" "0" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "0.2" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityReimu_pet.lua" + "Function" "OnSpellStartReimuPet02" + } + } + } + + "reimu_pet_03" + { + "ID" "9317" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/reimu_pet_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + // Stats + //---------------------------------------------------------------- + "AbilityCastRange" "100" + "AbilityManaCost" "0" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "6.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityReimu_pet.lua" + "Function" "OnSpellStartReimuPet03" + } + } + } + + "reimu_pet_04" + { + "ID" "9319" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/reimu_pet_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "1" + + // Stats + //---------------------------------------------------------------- + "AbilityCastRange" "300" + "AbilityManaCost" "0" + "AbilityCastPoint" "0.0" + "AbilityCooldown" "1" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityReimu_pet.lua" + "Function" "OnSpellStartReimuPet04" + "point" "%point" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "point" "2" + } + } + } + + "reimu_pet_05" + { + "ID" "9320" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/reimu_pet_05" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + + "MaxLevel" "1" + "AbilityCooldown" "3.0" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + "AOERadius" "1200" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityReimu_pet.lua" + "Function" "OnSpellStartReimuPet05" + "Target" "POINT" + } + } + } + + "thtd_wriggle_02" + { + "ID" "9321" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "keeper_of_the_light_will_o_wisp" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "15" + "AbilityManaCost" "20" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + "AOERadius" "%range" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityWriggle.lua" + "Function" "OnSpellStartWriggle02" + "Target" "POINT" + "range" "%range" + "max_count" "%max_count" + } + } + + "Modifiers" + { + "modifier_wriggle02_speed" + { + "Duration" "1.0" + "IsDebuff" "1" + + "Properties" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%move_speed" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "range" "600" + } + "02" + { + "var_type" "FIELD_INTEGER" + "max_count" "1 2 3" + } + "03" //仅作显示 + { + "var_type" "FIELD_FLOAT" + "on_time" "1.0" + } + "04" //仅作显示 + { + "var_type" "FIELD_FLOAT" + "off_time" "0.5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "move_speed" "40" + } + } + } + + "thtd_wriggle_03" + { + "ID" "9322" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/ai_cast_point" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCastPointAI" + "Target" "POINT" + } + } + } + + "thtd_clownpiece_01" + { + "ID" "9323" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_clownpiece_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "5" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%range" + + "precache" + { + "particle" "particles/heroes/thtd_hecatia/ability_hecatia_01_moon.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityClownpiece.lua" + "Function" "OnSpellStartClownpiece01" + "Target" "POINT" + "range" "%range" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "300 400 500 600 800" + } + } + } + + "thtd_clownpiece_02" + { + "ID" "9324" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_clownpiece_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "10" + "AbilityManaCost" "30" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "precache" + { + "particle" "particles/heroes/kogasa/ability_kogasa_01_debuff.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityClownpiece.lua" + "Function" "OnSpellStartClownpiece02" + "Target" "POINT" + "radius" "%radius" + "duration_time" "%duration_time" + "damage_up_self" "%damage_up_self" + "damage_up_other" "%damage_up_other" + } + } + + "Modifiers" + { + "modifier_clownpiece_debuff" + { + "IsHidden" "1" + "EffectName" "particles/heroes/kogasa/ability_kogasa_01_debuff.vpcf" + "EffectAttachType" "follow_origin" + } + + "modifier_clownpiece_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityClownpiece.lua" + "Function" "OnCreatedClownpiece02Buff" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityClownpiece.lua" + "Function" "OnDestroyClownpiece02Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "400" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "5.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up_other" "1 5 10" + } + "04" + { + "var_type" "FIELD_INTEGER" + "damage_up_self" "3" + } + } + } + + "thtd_clownpiece_03" + { + "ID" "9325" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_clownpiece_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + "AbilityCooldown" "15" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "precache" + { + "particle" "particles/econ/items/jakiro/jakiro_ti8_immortal_head/jakiro_ti8_dual_breath_fire.vpcf" + "particle" "particles/econ/items/jakiro/jakiro_ti8_immortal_head/jakiro_ti8_dual_breath_ice.vpcf" + "particle" "particles/units/heroes/hero_jakiro/jakiro_liquid_fire_debuff.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_jakiro.vsndevts" + } + + "OnSpellStart" + { + // "FireSound" + // { + // "EffectName" "Hero_Jakiro.LiquidFire" + // "Target" "CASTER" + // } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityClownpiece.lua" + "Function" "OnSpellStartClownpiece03" + "Target" "POINT" + "distance" "%distance" + "duration_time" "%duration_time" + } + } + + "Modifiers" + { + "modifier_clownpiece_03_debuff" + { + // "EffectName" "particles/units/heroes/hero_jakiro/jakiro_liquid_fire_debuff.vpcf" + // "EffectAttachType" "follow_hitloc" + "EffectName" "sm/rongyanroushan.vpcf" + "EffectAttachType" "attach_origin" + "Attributes" "MODIFIER_ATTRIBUTE_MULTIPLE" + "ThinkInterval" "%tick" + + "States" + { + "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%speed_down" + } + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityClownpiece.lua" + "Function" "OnThinkClownpiece03" + "Target" "TARGET" + "tick" "%tick" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "distance" "1000" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "tick" "0.5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "speed_down" "-15" + } + } + } + + "thtd_inaba_01" + { + "ID" "9526" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "ogre_magi/arcana/ogre_magi_bloodlust_arcana" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "5" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1200" + "AbilityCastPoint" "0.2" + "AbilityCooldown" "15" + "AbilityManaCost" "18" + + "precache" + { + "particle" "particles/units/heroes/hero_ogre_magi/ogre_magi_bloodlust_buff.vpcf" + "particle" "particles/econ/items/ogre_magi/ogre_ti8_immortal_weapon/ogre_ti8_immortal_bloodlust_buff.vpcf" + "particle" "particles/units/heroes/hero_ogre_magi/ogre_magi_bloodlust_cast.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_ogre_magi.vsndevts" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityInaba.lua" + "Function" "OnSpellStartInaba01" + "Target" "TARGET" + "duration" "%duration" + } + } + + "Modifiers" + { + "modifier_inaba_01_buff" + { + "Duration" "%duration" + "EffectName" "particles/econ/items/ogre_magi/ogre_ti8_immortal_weapon/ogre_ti8_immortal_bloodlust_buff.vpcf" + "EffectAttachType" "follow_overhead" + + // "Properties" + // { + // "MODIFIER_PROPERTY_MANACOST_PERCENTAGE" "%mana_cost" + // "MODIFIER_PROPERTY_SPELL_AMPLIFY_PERCENTAGE" "13" //技能伤害加深,只对英雄有用 + // } + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityInaba.lua" + "Function" "OnCreatedInaba01Buff" + "chance" "%chance" + "attack_speed" "%attack_speed" + "mana_cost" "%mana_cost" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityInaba.lua" + "Function" "OnDestroyInaba01Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "10.0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "chance" "5 10 15 20 30" + } + "03" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "5 10 15 20 30" + } + "04" + { + "var_type" "FIELD_INTEGER" + "mana_cost" "5 10 15 20 30" + } + } + } + + "thtd_inaba_02" + { + "ID" "9326" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_inaba_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + // Stats + // ---------------------------------------------------------------- + + "precache" + { + "particle" "particles/econ/items/sniper/sniper_fall20_immortal/sniper_fall20_immortal_shrapnel.vpcf" + "particle" "particles/econ/items/sniper/sniper_fall20_immortal/sniper_fall20_immortal_crosshair.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_sniper.vsndevts" + } + + "Modifiers" + { + "modifier_inaba_02_passive" + { + "IsHidden" "1" + "Passive" "1" + + "OnAttackLanded" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityInaba.lua" + "Function" "OnAttackLandedInaba02" + "count1" "%count1" + "count2" "%count2" + "damage_up" "%damage_up" + "max_count" "%max_count" + "duration" "%duration" + "range" "%range" + } + } + } + + "modifier_inaba_02_buff" + { + + } + + "modifier_inaba_02_rabbit" + { + "IsHidden" "1" + + "States" + { + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + } + "Properties" + { + "MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE" "-100" + "MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE_MAX" "1500" + "MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE" "1500" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage1" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "power_damage2" "4" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "400" + } + "04" + { + "var_type" "FIELD_INTEGER" + "count1" "5" + } + "05" + { + "var_type" "FIELD_INTEGER" + "count2" "20" + } + "06" + { + "var_type" "FIELD_INTEGER" + "damage_up" "20" + } + "07" + { + "var_type" "FIELD_INTEGER" + "max_count" "25" + } + "08" + { + "var_type" "FIELD_FLOAT" + "duration" "7.0" + } + } + } + + "thtd_kisume_01" + { + "ID" "9327" + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kisume_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "5" + "AbilityCastRange" "1000" + "AbilityCooldown" "5 4 3 2 1" + "AbilityManaCost" "0" + + "precache" + { + "particle" "particles/units/heroes/heroes_underlord/abyssal_underlord_firestorm_wave.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKisume.lua" + "Function" "OnSpellStartKisume01" + "range" "%range" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "1000" + } + } + } + + "thtd_kisume_02" + { + "ID" "9328" + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kisume_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + + // Stats + // ---------------------------------------------------------------- + "MaxLevel" "3" + "AbilityCastRange" "1000" + "AbilityCooldown" "10" + "AbilityManaCost" "15" + + "precache" + { + "particle" "particles/units/heroes/hero_bane/bane_fiendsgrip_hands.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKisume.lua" + "Function" "OnSpellStartKisume02" + "Target" "TARGET" + } + } + + "Modifiers" + { + "modifier_kisume_02_debuff" + { + "IsHidden" "1" + "Duration" "%duration_time" + "EffectName" "particles/units/heroes/hero_bane/bane_fiendsgrip_hands.vpcf" + "EffectAttachType" "attach_hitloc" + "ThinkInterval" "%tick" + + "States" + { + "MODIFIER_STATE_FROZEN" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKisume.lua" + "Function" "OnKisume02Think" + "Target" "TARGET" + "damage_hp" "%damage_hp" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "01" + { + "var_type" "FIELD_INTEGER" + "damage_hp" "2 4 8" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "5.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "tick" "1.0" + } + } + } + + "thtd_komachi_01" + { + "ID" "9329" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_komachi_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "1" + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/komachi/ability_komachi_02.vpcf" + } + + "Modifiers" + { + "modifier_komachi_01_attack" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "0.3" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKomachi.lua" + "Function" "OnThinkKomachi01" + "crit_bonus" "%crit_bonus" + } + } + + "OnAttack" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKomachi.lua" + "Function" "OnAttackKomachi01" + } + } + + "OnAttackLanded" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKomachi.lua" + "Function" "OnAttackLandedKomachi01" + + // "Target" // local targets = keys.target_entities + // { + // "Center" "CASTER" + // "Radius" "%radius" + // "Teams" "DOTA_UNIT_TARGET_TEAM_ENEMY" + // "Types" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + // } + } + } + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKomachi.lua" + "Function" "OnCreatedKomachi01Buff" + "chance" "%chance" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_INTEGER" + "chance" "40" + } + "03" + { + "var_type" "FIELD_INTEGER" + "crit_bonus" "10" + } + } + } + + "thtd_komachi_02" + { + "ID" "9343" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_komachi_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "3" + "AbilityCooldown" "5" + "AbilityManaCost" "25" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "precache" + { + "particle" "particles/units/heroes/hero_dark_seer/dark_seer_vacuum.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKomachi.lua" + "Function" "OnSpellStartKomachi02" + "Target" "POINT" + "radius" "%radius" + "duration_time" "%duration_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "7" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "200 400 800" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "1.2" + } + } + } + + "thtd_komachi_03" + { + "ID" "9330" + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityTextureName" "touhoutd/thtd_komachi_03" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "MaxLevel" "2" + + // Stats + //---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityManaCost" "0" + "AbilityCastPoint" "0.2" + "AbilityCooldown" "10.0" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_3" + + "precache" + { + "particle" "particles/heroes/komachi/ability_komachi_03.vpcf" + "particle" "particles/heroes/komachi/ability_komachi_03_explosion_2.vpcf" + "soundfile" "soundevents/thdots_hero_sounds/thdots_nue_sounds.vsndevts" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKomachi.lua" + "Function" "OnSpellStartKomachi03" + "Target" "TARGET" + "max_count" "%max_count" + } + } + + "Modifiers" + { + "modifier_komachi_03_debuff" + { + "Duration" "%duration_time" + "EffectName" "particles/heroes/komachi/ability_komachi_03.vpcf" + "EffectAttachType" "follow_origin" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKomachi.lua" + "Function" "OnCreatedKomachi03Debuff" + "damage_up" "%damage_up" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKomachi.lua" + "Function" "OnDestroyKomachi03Debuff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "max_count" "2 4" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "7.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up" "25 50" + } + } + } + + "thtd_komachi_04" + { + "ID" "9332" + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityTextureName" "touhoutd/thtd_komachi_04" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + + // Stats + //---------------------------------------------------------------- + "AbilityManaCost" "60" + "AbilityCooldown" "20.0" + "AbilityCastPoint" "0.1" + "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL" + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/heroes/komachi/ability_komachi_04_circle.vpcf" + "particle" "particles/heroes/komachi/ability_komachi_04_start.vpcf" + "particle" "particles/heroes/komachi/ability_komachi_04_blink.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_axe.vsndevts" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKomachi.lua" + "Function" "OnSpellStartKomachi04" + "Target" "TARGET" + "hp_kill" "%hp_kill" + "duration_time" "%duration_time" + "bonus_power" "%bonus_power" + } + } + + "Modifiers" + { + "modifier_komachi_04" + { + "IsHidden" "1" + + "States" + { + // "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + // "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + // "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + // "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + + "modifier_komachi_04_kill_power_bonus" + { + } + + "modifier_komachi_04_buff" + { + "IsHidden" "1" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKomachi.lua" + "Function" "OnCreatedKomachi04Buff" + "attack_speed" "%attack_speed" + "damage_up" "%damage_up" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKomachi.lua" + "Function" "OnDestroyKomachi04Buff" + } + } + } + + // "modifier_komachi_04_debuff" + // { + // "IsDebuff" "1" + // "IsPurgable" "0" + // "Duration" "%duration" + // "Properties" + // { + // "MODIFIER_PROPERTY_DISABLE_HEALING" "1" + // } + // } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "hp_kill" "40" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "100" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_up" "300" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration_time" "12.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "bonus_power" "0" + } + } + } + + "thtd_komachi_05" + { + "ID" "9331" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/ai_cast_point" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "900" + "AbilityCastPoint" "0.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCastPointAI" + "Target" "POINT" + } + } + } + + "thtd_kagerou_01" + { + "ID" "9333" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "lycan_feral_impulse" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "MaxLevel" "5" + + "precache" + { + "particle" "particles/econ/items/sven/sven_ti7_sword/sven_ti7_sword_spell_great_cleave_gods_strength.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_lycan.vsndevts" + } + + "Modifiers" + { + "modifier_kagerou_01_attack" + { + "IsHidden" "1" + "Passive" "1" + "OnAttackLanded" + { + "CleaveAttack" + { + "CleavePercent" "%percent" + "CleaveRadius" "%range" + // "CleaveEffect" "particles/units/heroes/hero_sven/sven_spell_great_cleave.vpcf" + "CleaveEffect" "particles/econ/items/sven/sven_ti7_sword/sven_ti7_sword_spell_great_cleave_gods_strength.vpcf" + } + } + } + + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "range" "800" + } + "02" + { + "var_type" "FIELD_INTEGER" + "percent" "40 50 60 70 90" + } + } + } + + "thtd_kagerou_02" + { + "ID" "9334" + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING" + "AbilityTextureName" "lycan_howl" + "MaxLevel" "3" + + // Precache + //------------------------------------------------------------------------------------------------------------- + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_lycan.vsndevts" + "particle" "particles/units/heroes/hero_lycan/lycan_howl_cast.vpcf" + "particle" "particles/units/heroes/hero_lycan/lycan_howl_buff.vpcf" + } + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.2" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "10" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Hero_Lycan.Howl" + "Target" "CASTER" + } + + "FireEffect" + { + "EffectName" "particles/units/heroes/hero_lycan/lycan_howl_cast.vpcf" + "EffectAttachType" "start_at_customorigin" + + "ControlPointEntities" + { + "CASTER" "attach_origin" + "CASTER" "attach_hitloc" + "CASTER" "attach_hitloc" + } + } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKagerou.lua" + "Function" "OnSpellStartKagerou02" + "duration_time" "%duration_time" + } + + // "ApplyModifier" + // { + // "ModifierName" "modifier_kagerou_02_buff" + // "Target" "CASTER" + // "Duration" "%duration_time" + // } + } + + "Modifiers" + { + "modifier_kagerou_02_buff" + { + "IsBuff" "1" + + "EffectName" "particles/units/heroes/hero_lycan/lycan_howl_buff.vpcf" + "EffectAttachType" "attach_attack" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKagerou.lua" + "Function" "OnCreatedKagerou02Buff" + "bonus_attack" "%bonus_attack" + "attack_speed" "%attack_speed" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKagerou.lua" + "Function" "OnDestroyKagerou02Buff" + } + } + } + } + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "bonus_attack" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "attack_speed" "10 20 40" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10.0" + } + } + } + + "thtd_kagerou_03" + { + "ID" "9335" + // General + //------------------------------------------------------------------------------------------------------------- + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityTextureName" "lycan_shapeshift" + "MaxLevel" "3" + + // Precache + //------------------------------------------------------------------------------------------------------------- + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_lycan.vsndevts" + "particle" "particles/units/heroes/hero_lycan/lycan_shapeshift_buff.vpcf" + "particle" "particles/units/heroes/hero_lycan/lycan_shapeshift_cast.vpcf" + "particle" "particles/units/heroes/hero_lycan/lycan_shapeshift_revert.vpcf" + "model" "models/heroes/lycan/lycan_wolf.vmdl" + } + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "20" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "50" + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Hero_Lycan.Shapeshift.Cast" + "Target" "CASTER" + } + + "FireEffect" + { + "EffectName" "particles/units/heroes/hero_lycan/lycan_shapeshift_cast.vpcf" + "EffectAttachType" "follow_origin" + "Target" "CASTER" + } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKagerou.lua" + "Function" "OnSpellStartKagerou03" + "duration_time" "%duration_time" + "attack_up" "%attack_up" + } + } + + "Modifiers" + { + "modifier_kagerou_03_wolf" + { + "IsHidden" "1" + + "OnCreated" + { + "AttachEffect" + { + "EffectName" "particles/units/heroes/hero_lycan/lycan_shapeshift_buff.vpcf" + "EffectAttachType" "follow_origin" + "Target" "TARGET" + + "ControlPointEntities" + { + "TARGET" "attach_origin" + "TARGET" "attach_hitloc" + } + } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKagerou.lua" + "Function" "OnCreatedKagerou03wolf" + "crit_chance" "%crit_chance" + "crit_damage" "%crit_damage" + } + } + + "OnDestroy" + { + "FireEffect" + { + "EffectName" "particles/units/heroes/hero_lycan/lycan_shapeshift_revert.vpcf" + "EffectAttachType" "follow_origin" + "Target" "TARGET" + // "Target" + // { + // "Center" "TARGET" + // "Flags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES | DOTA_UNIT_TARGET_FLAG_DEAD" + // } + } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKagerou.lua" + "Function" "OnDestroyKagerou03wolf" + } + } + } + } + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "attack_up" "50 100" + } + "02" + { + "var_type" "FIELD_INTEGER" + "crit_chance" "60" + } + "03" + { + "var_type" "FIELD_INTEGER" + "crit_damage" "150 300" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10" + } + } + } + + "thtd_kyouko_01" + { + "ID" "9336" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kyouko_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "5" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.2" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_queenofpain.vsndevts" + "particle" "particles/units/heroes/hero_queenofpain/queen_sonic_wave.vpcf" + "particle" "particles/econ/items/queen_of_pain/qop_arcana/qop_arcana_sonic_wave.vpcf" + "particle" "particles/econ/items/queen_of_pain/qop_arcana/qop_arcana_sonic_wave_v2.vpcf" + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "0" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKyouko.lua" + "Target" "TARGET" + "Function" "OnProjectileHitUnitKyouko01" + } + } + + "OnSpellStart" + { + // "FireSound" + // { + // "EffectName" "Hero_QueenOfPain.SonicWave" + // "Target" "CASTER" + // } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKyouko.lua" + "Function" "OnSpellStartKyouko01" + "starting_aoe" "%starting_aoe" + "final_aoe" "%final_aoe" + "distance" "%distance" + "speed" "%speed" + "damage_up" "%damage_up" + } + } + + "Modifiers" + { + "modifier_thtd_kyouko_01_debuff" + { + "IsHidden" "0" + } + } + + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "1" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_up" "50" + } + "03" + { + "var_type" "FIELD_INTEGER" + "starting_aoe" "100" + } + "04" + { + "var_type" "FIELD_INTEGER" + "distance" "1000" + } + "05" + { + "var_type" "FIELD_INTEGER" + "final_aoe" "500" + } + "06" + { + "var_type" "FIELD_INTEGER" + "speed" "1100" + } + } + } + + "thtd_kyouko_02" + { + "ID" "9337" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_kyouko_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "MaxLevel" "1" + "AbilityCooldown" "15" + "AbilityManaCost" "20" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%range" + + "precache" + { + "particle" "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_start.vpcf" + "particle" "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_start_v2.vpcf" + "particle" "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_ground.vpcf" + "particle" "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_ground_v2.vpcf" + "particle" "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_proj.vpcf" + "particle" "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_proj_v2.vpcf" + "particle" "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_aftershock_screen.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKyouko.lua" + "Function" "OnSpellStartKyouko02" + "Target" "POINT" + "radius" "%radius" + "duration_time" "%duration_time" + "range" "%range" + "power_damage" "%power_damage" + } + } + + "OnProjectileHitUnit" + { + "DeleteOnHit" "0" + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityKyouko.lua" + "Target" "TARGET" + "Function" "OnProjectileHitUnitKyouko02" + "duration_time" "%duration_time" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "4" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "3.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "550" + } + } + } + + "thtd_kyouko_03" + { + "ID" "9338" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/ai_cast_point" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCastPointAI" + "Target" "POINT" + } + } + } + + "thtd_shikieiki_01" + { + "ID" "9339" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_shikieiki_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "5" + "AbilityCastPoint" "0.1" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_1" + "AbilityCooldown" "5 4 3 2 1" + "AbilityManaCost" "0" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1500" + "precache" + { + "particle" "particles/heroes/shikieiki/ability_shikieiki_01_guilty.vpcf" + "particle" "particles/heroes/shikieiki/ability_shikieiki_01_guilty_b.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_chen.vsndevts" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_chen.vsndevts" + } + "OnSpellStart" + { + // "FireSound" + // { + // "EffectName" "Hero_Chen.PenitenceCast" + // "Target" "CASTER" + // } + // "FireSound" + // { + // "EffectName" "Hero_Chen.PenitenceImpact" + // "Target" "CASTER" + // } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShikieiki.lua" + "Function" "OnSpellStartShikieiki01" + "modifier" "modifier_thtd_shikieiki_01_debuff" + "range" "%range" + } + } + "Modifiers" + { + "modifier_thtd_shikieiki_01_debuff" + { + "IsDebuff" "1" + "IsHidden" "0" + "IsPurgable" "1" + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShikieiki.lua" + "Function" "OnDestroyShikieiki01Debuff" + } + } + } + } + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "2" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "1500" //同步改 AbilityCastRange + } + } + } + + "thtd_shikieiki_02" + { + "ID" "9340" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_shikieiki_02" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "3" + "AbilityCastPoint" "0.2" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_2" + "AbilityCooldown" "5" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1500" + "precache" + { + "particle" "particles/units/heroes/hero_omniknight/omniknight_purification.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_omniknight.vsndevts" + } + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Hero_Omniknight.Purification" + "Target" "CASTER" + } + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShikieiki.lua" + "Function" "OnSpellStartShikieiki02" + "modifier" "modifier_thtd_shikieiki_01_debuff" + "damage_up" "%damage_up" + "power_bonus" "%power_bonus" + "range" "%range" + } + } + + "Modifiers" + { + "modifier_shikieiki_02_buff" + { + "IsHidden" "1" + "Duration" "%duration_time" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShikieiki.lua" + "Function" "OnCreatedShikieiki02Buff" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShikieiki.lua" + "Function" "OnDestroyShikieiki02Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "damage_up" "100" + } + "03" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "5" + } + "04" + { + "var_type" "FIELD_FLOAT" + "duration_time" "5.0" + } + "05" + { + "var_type" "FIELD_INTEGER" + "range" "1500" //同步改 AbilityCastRange + } + } + } + + "thtd_shikieiki_03" + { + "ID" "9341" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_shikieiki_03" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_AUTOCAST" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "2" + "AbilityCastPoint" "0.2" + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_4" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "precache" + { + "particle" "particles/heroes/shikieiki/ability_shikieiki_04.vpcf" + "soundfile" "soundevents/thdots_hero_sounds/thdots_shikieiki_sounds.vsndevts" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_oracle.vsndevts" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_oracle.vsndevts" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_doombringer.vsndevts" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Hero_Oracle.FatesEdict.Cast" + "Target" "CASTER" + } + + // "FireSound" + // { + // "EffectName" "Voice_Thdots_Shikieiki.AbilityShikieiki04" + // "Target" "CASTER" + // } + + "FireSound" + { + "EffectName" "Hero_Oracle.FatesEdict" + "Target" "CASTER" + } + + "ApplyModifier" + { + "Target" "TARGET" + "ModifierName" "modifier_thtd_shikieiki_03_debuff" + } + } + + "Modifiers" + { + "modifier_thtd_shikieiki_03_debuff" + { + "IsHidden" "0" + "Duration" "%duration_time" + "States" + { + "MODIFIER_STATE_SILENCED" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MUTED" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_PASSIVES_DISABLED" "MODIFIER_STATE_VALUE_ENABLED" + } + "ThinkInterval" "0.5" + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShikieiki.lua" + "Function" "OnIntervalThinkShikieiki03" + "hp_damage" "%hp_damage" + } + } + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShikieiki.lua" + "Function" "OnCreatedShikieiki03Debuff" + } + } + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShikieiki.lua" + "Function" "OnDestroyShikieiki03Debuff" + } + } + } + } + + "AbilitySpecial" + { + "02" + { + "var_type" "FIELD_INTEGER" + "hp_damage" "7" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "10" //不要改,和语音匹配 + } + } + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + } + + "thtd_shikieiki_04" + { + "ID" "9342" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/thtd_shikieiki_04" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + "AbilityCooldown" "15" + "AbilityManaCost" "50" + "AbilityCastPoint" "0.0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AOERadius" "%radius" + + "AbilityCastAnimation" "Act_DOTA_CAST_ABILITY_3" + + "precache" + { + "particle" "particles/econ/items/enigma/enigma_world_chasm/enigma_blackhole_ti5.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityShikieiki.lua" + "Function" "OnSpellStartShikieiki04" + "Target" "POINT" + "radius" "%radius" + "duration_time" "%duration_time" + "tick" "%tick" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "radius" "500" + } + "03" + { + "var_type" "FIELD_FLOAT" + "duration_time" "6.0" + } + "04" + { + "var_type" "FIELD_FLOAT" + "tick" "0.25" + } + } + } + + "thtd_shikieiki_05" + { + "ID" "9343" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/ai_cast_point" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "MaxLevel" "1" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + "AbilityCastPoint" "0.0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnCastPointAI" + "Target" "POINT" + } + } + } + +} diff --git a/scripts/npc/ability_table.txt b/scripts/npc/ability_table.txt new file mode 100755 index 0000000..d0b2fed --- /dev/null +++ b/scripts/npc/ability_table.txt @@ -0,0 +1,206 @@ +ability_table +{ + "1" "C5ACAE43AAE11984974561E7FA59A3A4A50A78D9CFC93FB77D34E6A9005EB8513C936AD583289FA976D9D4B2056DF59D2E3C594C9E8908F69293570D8C9FDA59224D49A1349A8A3E214045BE7EAA42648DC2E984F6FECB837A1FF56ACD6B433847D76D18A6D79F22AFCE62987CB86E6F0AC799B627DE8C8DD2B5CA46AA7BD95" + "2" "F3546FDDDAD6B26475119FEA9AC33C8D59AB3169CF6A13AF2F5211AD753BC4518E6702B40DF4BA37754139415D926D7D3DEABA730D6117565FCEB931C698ABA3CC93DF9B78F667046B210A7A6482A6EDD0B52285772FCB447A50E610748360D50A16AC3F587C3563E7DA53C917FF72EB2FDDB44E153A347D9AE5DE42CF0A2CB" + "3" "CBBF7CF53F1D44631F0A369F78B07FE977F6821307F0BD07D0560222863E2099EC629B2AED76C3578FC125796542F89D17C8C7CB73D2AC4B094677E68146FE4003C8537B1DAC62ABBC9511E3A86192DD909A16E0D0FEDBF27083B76EF90C4212FC1AE97112D6616763CCE9BA56253A4034BFEC16C317D1CACE040F83CCAEDCE" + "4" "5D0E78C72FC80F3216B431398E4FCF6BA66D6A63AE208F5576B4AE1F30F384C1120E3AF4F615143A1FE6BD7BBACB02F21CE8A44F268E68DB0726F6B9642E43CCF0852FD97C19B4A6C352220142AF5741A74AAF57AA83FDABAAAED0E45E15ADDF0E0C709D13E1D0DCD54E4E9E599CA3A8BA11A36D4D07EE4D14C147DBD496E9D" + "5" "FDA3C452B66372F66905F89BE54D551C4A3BA68AD5515526C604A0AFD6DAEA5C267938D10A2BB958B3E9DC8478B5A8D87C467F6F6322A819728D44C90A573906592347E936ECA26EEBA146628A9C35F379F2919809CC58BDCFA954E7A0DE3AF59610B56600C5AC8ADC0D7B17EECDACBF4E25F84E91AF4CC99734C9C58EFED1E" + "6" "6037D9007284B5ACB679A7B5CD801A45DD8165A07434812927ACB90B29F25670656AD0A8DB8E2BC49E6CB3FB987A681EBEFCA45030018E2A5A9F0F5214588715B8B3EEA0269CBE1B35F42D5E151AB38A0A0E1FB268FA5E7C38E6DD47063AEEFB7C8D3E6A6564291EA585337A30A9C932FDAA79800EFCEF971FEDBCA99E7E9D4" + "7" "7C0F541AD1473F4044B77D6D24E403E233E94FFB8E938CE9E72F7A5F97D71AD91E3C72C1EA50993A2FBF6C89F4EEA2F8E7D2837013742290EF2A56EB30AC4BBA867E2D52C606E8B7BB22D02BC849D49EB15226D1C0A9823703031779D047CEB6F1FF107AC616D67F9EF5A8360CE8C77F387202409954F80906A02BE20ACCB3A" + "8" "51F20BA70F8E487FEA07296CFF18D1BFE454892B466FD09A109A241FA235378B8F7D94AFD04A002AF428C0A93C466ECFEC520CED4369DCACA26A7615F8311B19ADC9E096B36CC7A16523F11BC273B558952AC7ABB96BBFC0F733C0657814AE989FC39F6F0978CE27636FA59FD9E9416831CBBA8A9AEAE192E272C86D1B75F6C" + "9" "F9D820B0A053A15AB14728D93BBB6D82AA569F13C406EEF3960F9C0BEAFB1DDCC93DA6BF304242370F371E562DC7005BEB69CC0D201AD18A209B17FC94C871510589F677214FEE263279792982D9CF7DAA1CD5D594E405F337695B038682CB80A8093CC7C33F1CF6213235BBB68EAE478F6CA77200E37F75968DB22574C0920" + "10" "7F39F63BBF3A40077D22E1AEEF37AA1575862BF2DF23ACA20D71AFE05C7BD0EF4237F9CAE198BBF0959C6EDC17ACBA492C81EA028F85566B73E998263F2A39CB9B7811C2F324203751E0B035887A2FBCE71001B539132801284A721914A2A4995E2A794A272E083E62102CCB09811A5B738A638DC521969C7830FC24145BFD0" + "11" "7A37689E620D9212B07568C840EC8200E04E0605EAF7D488FCF1A11E6C5D93D2CA87F554B54A9015C4874D4E9E70BB3DB824C1BA4999685E39F66D8F0D7E6056454B83F1EC215994B27CE1F937385FDD1FB6FF07F7F95F008007E7ED532B6FE217EA42E462E606F5116B2BCF7550BD0F14F7010CFFA77786A50FD8C31EE211D" + "12" "8156F26152BE420AC61F3C913C608DD96A0A9A4A1DB105B5D9C60D5F5581DE80E510FB7BEC55445CA3DB1A37E12E4629E1DFB2B6CFEE2D1681170F00C8C450D4E7B7243E816E0FC0649D44E3B7B4B4A8861B6688301EC0CC0AA683D9FA41A1C5F836797E15ED56B0B314AD5E2B82DCE6FE5F6326CDF52FFA87E3D310F57CF22" + "13" "A3124C7E3BF8696CC295BB14874BA37D18E843D57CB28A32CFCCBA5A265AC5348B405B799AE04A97C812A336880F25965F1FFEFF3E47EA81B5A31436A4761BA50A6772F3F3EEDA204AFBCB4114D2A8145CB1F72CD054074620B3429259304205E2079D563119D56CAA5AAC9EAC1B05DCD62895EA3FC8A24F9EBA5326A02A38D" + "14" "3C83A03A746F7D8EE8EE0B553946847BBD717D05532C4E965F685FB5166C10BD0B5B928F698AF6ED67A1C9ADE735CB87E12257075EF14EA0B552E15ED8435E9115A1F2C04166F7B784F30542A257C743A10231D8340A85A9836DD57C4E98BA5C865DEA2D9513E335340B5FD3D9ED55F0F1A3C2886033FB1243382451E9BF452" + "15" "63010DD173F383218420423B5520A8A513CF3A23E8FD2F3B8499E6F2D411BA34EA9DB485D46A569609C30FF6F4B02FF252134B07F610BBE9E21DA3F5B9078C68EC0DB9097A80625B2A005E1798C210E9F58A4606A4D87F86F792B5D5A11FB459E0FC09F2471BB14E7BCEE7A61BD094BA8311A3F8414D064F0303727EACA6AB5" + "16" "0B9F85792F7D589A3CFF4566ABEF891EFAD586628092E8DB9E0CEB422B21FB4BACA2D5D882552C725EBFD9E799CB84937BFCEAF939AAF0DEBCB1B711EA30EAE75891DD845964135052F209D682FE371A14D09E0717F58552ADA0ECEECA54F4196703CC5F1DC29D913AF835054456CF9B4B013C2D15F157D5C590DC932DECAE7" + "17" "D45FAF0242D111F7EC20BF7932CB11A8DB557DB1C438ACB00496D56F86882AC42F59E30D83A589B8CDB544166A6AACB10C71F095514AE24BAA770465F4A2165F46D44767C6BD46BA4152F81A1D959A17E84799DA910C315AC064FF1F0190F6F6F3DE0DDB3C7F3BF97DA5F0480314C89854FCE1823452C106B842D8785A3C31C" + "18" "F62B81923638C42C0368EEEC4666BA07DB1B13FDACE38652EE725069171A64DF6A424C12B83F313B9A2B09F1A73E631CB8BDFDBDF4C9C92C2540FD09C9245D92C10660D72835B227DEEEFC08B4AB10A2F3F9D74DB4B6B4B45350B825FEA19C1E1741619F4DC78217AB742B3ACDCDD7B458AA47969AF721C092E59BD2A2F76D8" + "19" "B2BA58A62635474267B952B840BFB80FB03C4283605A33DCC1A4505B5E0B765438340392E8DD57569622C6F44BE40DFA06CA054A341695B247BD8C6387153493D170F17B281F14E0C85990A45266738D820A58C04087DEEC62519F3725B4B73BC2E0083FE8EB8585D202C7EBE2ADD63C02EB2B01FB11A51987D7DF1F086DC37" + "20" "CEC2B5A58B8386A75DBF166685CF48615AE384014BBED8334A811D601AC13E57A5FE328CF56400D80DA6041F061005DB3C81FDA39504A2665D5B36994F44ECC73EFFA9E06F63A175F78C875ED5032AD63A433D653567627E8C1EA27C57F9B68A634EB69F0C1CEF11B029DBA7CA22D29BD240D3BED89239D65B8AD413EF91FF2" + "21" "579E8A384B9CD4773D335CDF4C6BBD64D412730A51BCAF79C8C721284E64004CA55F7A9698823E2DC065EA91B402EB00096DE8A5BE3730C72A56593352D332FD53E883AF2C4C3D6F24095D8A422723CC812BB3B00F9E59ECC8D14F61D2286CE4FFAA46A0158109031E9679860BB34973D8C152E79D546957BBCEE88DD6D0C71" + "22" "F1E563C19E5D4E1DA30918451332FC69B9A7CF89EDF78DDF7B42BD1C2839E927C7E34A3EA95CDB3735001F01AAB3A538D847B92B7E36FB58E8877DF716354A3D8B2AB66095B5A19ECF923FF75331D18D443944802101768206B2B5380942C602FD1902327B03A1CD01F1B81CCD31AE01005FA0AA36A6F50C73DF513BFE49701" + "23" "E6AA03821C7BE7EE85D325879F5FC432455E5A7D03692B7D3408540316E4AFD8AA2647A95474209D7E6408D9E05586D5CA423A14FE9056842388CA16EC5F8812BB4C7F5A85E2C7F325BCA9E9FEFBC6DB64BD54120118FEB0107DDF68E6B4388AFCCA61CF7DE1FAA1027A0952ACF8A891D7328FC430E95DBE15E484B96DB8779" + "24" "34BCF1E0BBD1AE9DBDE647AEBFEC01E708A57F9FA5DA76E0F6541272F4CB0B89CA06053F3133558A12262AE14E3AC69D10E716466520E3FE050CFA83A19B2B96CC6DB5F2CADCADC07EFAC8228FAFCD82D3B3D4949527FA0DE362D9EF1A1BDDD8E5664057F68FE2D0DDFC6557552C23D1CDC7519B80B327F6345752392F37E37" + "25" "1405F6BCA40CB11E8851C9722DDC2D37F5EE009321F3962DD496B9DCA7D55BCDB5DFD76641F4EA9492FBF2AA9773FF13412C240CCE0AFB2266C4D175E1400A5D1C2E6A21088B9DDFA945F4B3021C56D641F423BFCB4520EA110324156772B559E453D102D1A960778DA6C9D832639D4BA2D25CA31EA7D4CA34AAF1B116242FB" + "26" "A310CA7498F76EE29CA01D07A3C75EA25606EFEF3D13F586C2D6BBB934BFD25F7E206C63AC8849C68204258ADAB9CA22141DDE9B7DECA14CBA0A5456676F4B8108F248245C1FC357CE697BF5EA8564E58D916CB7C5A066677EBFAA402AB19A9BE074DFE1DF65054984E187CE759EBD6CE4020B967889C49776AE44A9AA5D741" + "27" "F20BD798CE3998B4844D87C23B43BB49B655D86A8AE8CB7F204C1E09B04B139DC742185A2FA54FDF4ACD1A4FE0A53CA283ADFA7982D5134A62AE9E83B5D320CB7833500D76C5DF2AE8AE5DB92ECC9B4E8D41364B0AF309E8DF5B89A1A53D8C879E6EEA89CB1FDB51C201D8B54D63B75025CEF241A61C8FC4C0E0469702AFC28" + "28" "9C729CB7C12FAC2E4449D0319490D76C2D8AA8B985DBF4D1E97DE8229B567FFFF1152C2CA9FBD01D890BD949B65DC2FCF66A2D87B49631D0E0B2FCBE13ACCB233B7CE6B64257A5EF1C71ACB5A42B44AFC09C55644289D41B670443C3329D8CFFAE5F6FC2CBB4104B4E29CAB3551208DA92FBCF9A3DA7D6463B42CFA35C04337" + "29" "03A9B10318F1FC7999C6AD3614229B3F971445E2CB6D4BE91CDCEE93F472525DE2D1A75695AAB9F1627C2B9DEA4004BA39CFB0E868FA8995856DAF6419ABD612FAF941F34F1C2FB18FE2E2A0C789482E4EC6D81A378DE675DEB09D7EA291948D4B37DF1796CDB7049F2BD58B47330706FEAB60E226F171CB931715D0DB8911F" + "30" "0BEB7CF215983ED16B548697C9D18A0472858A622D7B46E8AB8688656A7229C99F12A30C463C74041BE65E6E27320EAC17647022A0A4C54E76C0E9DCE1FD4229D565B0FDDC36AC5B960FB64CCE5754339AF6435C8D004C0D8DEE7EBDD97734C0EFCD78457035994D9AAF2ECF4500A26038C9312F03425359CE348E6709CE2DF" + "31" "171F15307B220D57D58D4317EE8F93F9E0B972224DF4ADB68D713FCE1D431884B924A1AF1015B35FAB3ADB56B6C45A9E5329DD2971857FFCA7ED5A3E9CB8B6BFB132C6648119AAE2A6AC6BF4448C1F466563568436501C3DF27D392229BB8AD0CAFF763B3EAA135770658427395AE13FCF919F6FF4D675D47B2715CF1FB8183" + "32" "1AFE740A02619A067E4282E96D0D3EECC3D8300F7CE5A8552CCB6E8A61A29A8AF071931AE33C32199596D74943738089AFD1343A17710C0C25319CA7D8472AE31A0CE8FA83E6A0BD931034E70B730A6293381732976908203FA72B56A77BD0D6C37358CB287555C3E63EC2B9355E5E8CC40C5D94B73304C2FC2EF2E9C5C3667" + "33" "CDDDE31CEF6A2D479C8B8E682E40E4E0E345A32E15C7D765CE8296C8F5CF854F4E92957B133F62ACC752F7207A65D94102CBA403FD2EBF88D6513DFE6A47ACC1E896D8610C9E02F82CD0BBB09221972F0ACBB58E4A4CDCC2C19DE6E4B06FBB051972C715C621340C8F078842309A411A913885E7D7C5E578D20209D6B0A1269" + "34" "B1899C2FFB79BE01B81C7CB145C34C4DCBAA58C26DDA8A3D1477B0B343F20A9BEA2E085FCF008B944D259513586A3A02796B98B39B2D00AB45BFCED147A80844295086A66F0D24524BFF492EA389EBB026777E3307569876565F285FD3F5CA79F76599196B2F01F24192780A923D8C610E4C27E26ECEE0F14DFAD524A134086" + "35" "E53E59DF68D36B125D855E09F27CB5BC47B107A28ACA0D081ABD8303F36BBDD373C66288CB86DBC18890F6DDAB376C7036885D840D849C7E2B4711119415A8B05DFB552DC578B68A812117EC5B5B71E6B828A422031B5FC3481B92B55114C544852E2FEAD5C5B33D3778DEFA49F5F38D5B7EF4FD4B8B00E6031961AA93BEFF8" + "36" "ED779D5187101AD9A6E96B51DB6306FC51C60771E65AD2F4969DBBBDBB287754F8DD71AE1484FBF5CE9ED8262638CEB44520BED4C9974E9C388B66DEAFE2DD513EA85578A88BE288DA3198DB862C436C37C05B94D298E3A1985A0714F39801A9790EA0E3E4E5FC3A6B6FE7686C86D36BED11174A1FB350828FE82E7256EEA08" + "37" "1736CFB4FE8080D80EB0529FC470B248268B148B6AAF0BB45F4AF566CD2AEC26BA764F3BC921D0936AC357346B52E63F7B05E78C7A461BAE628041EEA12B84208771BDA9C7EB064EFD39647D8DAC9CB7B30E4BBA14296508D97872E4F2E948E692AB52CA5CED147F69729657F742685487F4C0378980A5A01BF4A8330BD6466" + "38" "241B8DE18475865D44970E1E08BFFA0E76CFAD22944252E6618850DA4596C771CCC036F5D1D6E1F5A3315642C95D3516E14BA0886E9EDFB42CE8308F3ED37310F658DA14473AD797B33F590609D37739E952AD48357A35F29C1D742417A302A9FFE6DA471F345723BB73F1A9B05C7B5C1C36D28F461BDA52A9A353D46E4301D" + "39" "9C786E1B36EA8F756A8C8C1D3B2EB8BF8DABD5A790C2BB6B52FF431681A4AF6DB10C896EB5D859AE9BD9700F9429DDE6B99EE9C4FC1B46D3890437A7ED2811206B9EB99D6CF0C7616567E7B574432CD89E5E10F8869E3EEA41E5B61AC75DA2C70F42A135DD8152E58ABC8D77645098DC8F0C1BC4CCF424ABA85CDB7F93EAD8A" + "40" "F4C601C0202477083F5121D580AE121E149CC1D6ED02608A032C7B65F08CBFC0F684019AFEF6D14137E4D1E8EFB91ED2EF6AAB52E36A2820DB80B374207E066928D133733518AE1182956CED01D6A2EFA8EFF98A3C37C87B1C9BC030CEA5D4E2849997FD7DEBED99D45ECB59CDDDE9C119FFDFFD7B710111967CF333720B053" + "41" "85245591AFCB2BBAB56947146C35BCD820C41DDB5FAA780C0FDC9E96D8526CAC170D19DF71E81FD074D322365E4ED79A18D436FE3FBBE567F132AB43297E3CC4FDF057B117C8307C18CAA0D4D0B1F94B9A9C01BF288D2CE97EFBA80EC96A845634FBCD9F9AB4CDF47002FE7B538A2653CF20D61FF09863F203DE99AFB072277" + "42" "36B1307A50BE03D5EC3E26753FEB3865BDCED9A42282B1EE9D75590A273B5B5E0954E56B572E9C874D3BABC54160E9ED8B3F63515B3324269061A7132A2A8EEA705756B7056B285B9D9E0EA2A21EC89A896F1D5FA9557119B82B170278C0636292D032A09F1096777F95FB770D0E875965D7A37188687B2BD3AE5C5D83DBD80" + "43" "0510B7C0BF8E31DA27D9931C1A0136DBEE40FF53F814C898124212E43E17F08A0FE8872D3520E3A52BEE10E8FF1A40B8558C4B1F5A91F0269982B7EDB3E78741422006F74070DB6073263DAAEDBEF7BC0A3FA35F2A277933FCFAE61D2608C6FEB359CD0D5F7C473BB8CDCB152E56C76C91C3A4302322365B75B2B835F4743D7" + "44" "26F4B24C78E8ADA9DE49A62D9AC88128517C20BAF1E6988B14E95D94A5D440D1453AE12FC9203C273EFFAA86C5F0201A8457946099357A42AB16BAC50CFF0D30D52FE0AE33323423CC4A4C60CA64FF58E8576147F24BFAD22EE37BFA2780DC503CF49088AB92B69AFE9EF549D9F20D14F72EEF615A6A39D2838D32BE65E6519" + "45" "921FFEA99305113429539F004344B46BF0AF79148A0499892C25213B6550BA9186674F1B09D992670AFA095AD3DE4A310BD744BA0122741AFF24BE2C46ED16EEB8FDBB76DA157EE2E12715791023D134609DAD410C5306BB0EC83E1B271C043FFC3F441DC36A3308C0A168D22D92D3245EBDB1BB5F91A68190AAA0A1BEA271B" + "46" "77C7E9F12614882A9C40082DBF4F9D40FC033546E09840E8F11B6FB18E9FC1BE01BAC753CB8B07B4276257CB3F5D2F2900BD5A536891ED720490701A7347361555470C66F8D7451AF4C9E8A2B7B8914775103491625FB7A6BFA040B178BD2A1BF3A7C8E2BC914580F97EF4BB982998B391A95FA6F65D141F03434631E9D2D2C" + "47" "EBEA4A98C5F08B0809739855DD6BCA01CDB4C7E5A5BED03929E462BBEE6B69FABAE5B306995F9887F090B53DD83D3228F0042793ACBD07E579088B893671E7AFD9EF4025C06484A1E815270323465CAB128EAAFFB500E25F1ECAF04E0183FFF7A8F63E4232EF344D70FC1ECFDF364CBA9FABCA3AE6F5C7D6B7D24436F964BFE" + "48" "2B0ABAA2240E03ABA918592EC695A45F8ED8616886A8622A71A7C35DB2EB4C2026466570C8F60206ECE4BD7110F81ADCED4966FBBE77AF471C7C8ADDB76364E680FC7C49D479C4C0C3678AE4B3A337BA0F623CE4A943658C42F6F4B5B42544F6531077512E712B60A8096B7238C10B243EF7A6B74F30CFAC3BE3A75DC6B182B" + "49" "267999083F98D4FC5AEA76B6BA6047A903DB284864DC205C6A237830FDF84691EB22593ADEA46DE7E40DA125501DCA1843DC2164A9E5AD9A1E6905929181ABE2B85439F3371E57AC7C9965B960CF76D14B3E21E72F1AF90FED5001416795C022064EB6751F00224008794CCB9C5B47292001679DDE1C6C0478E36B9FBA73F2C" + "50" "31EA24D32BF89487C9029C1169452A5CB86C57D2DCFC723C0BF1090120CF738F65F736499A721EDFEBFC0525904CE3D66BA0B1109232E261B94F6848234988086BBC2575EE2C6B536C4D3C349396F007ED1496B029CE4AC0EC1BAA3F04634CB9B5CC768C172F5C886B83FFDD6C23BE916D0AE34D83D10D501D7DB97D1F4532F" + "51" "90B33126469393EB7B2DAF3E8ED9D26232E37F02BD564E4F30BFACC26CB68E0550D1ADE4CB10D0CEE7FF66D9894AE53A829C7E566B04165A49BDA86861396520065253523BA0CF03FCC61917E6A883099DAE7E53242D2B2EC01AC3BA2EE81E08E34AC2281A02C56C28194CDDDEB7EB4CAECBCC1490B7FD81D038EBF6C3CC071" + "52" "C6428ABB9C772C04E255FAECF2002AF8C40ACE5879C311C2E48D7691390D570BB42A8CD159EE2210D0D78A0FFED35E72897730015706C65AB5D2941D866BE0C56A5158F86C45330CF61213B4F1B88CD7645276E7D29166FF80E60F35759CC7769220F195B278BC8DDE72BB522A94B2E6E0EF7544FF8596F7F38BB7BD9EFD713" + "53" "EB9BF508D9AD17C0BAA09331AFC6E295EE0F91FE75AE2A8557FE3EC72AC09A7FDB574A235D203EE49093C2C1E33676A2A7A0A2A51D87305330487AAAAF25AFA8882789B519319021B280B381355DB936CBAC0DAD09889B7AD8AA179E46933AF879041195F79A513AE33EDEB15F733641CFEA85622A421F4578CE7EE028FADCE" + "54" "94BF7991B23AD8EDABE481DC0F080E6740154C349C965C5A2147EF6680298C1462F5621D487D26831CF2CA8C03757D40B9BEF53EB889B45985D326329B1BBABBDF656750802318E5B066AEB8D9291675DBDAF36D8C496EE52E0599B0F02AE6F27139CAF8C495687FBD75159BD83F7CDC7DA67FC90E87C0646DD67B122E93E9C" + "55" "2D68AB40C39F943D4A3FC5688433A28CEF71C41EB89D952C4E83C6AA66E2846902A51A6F3F319AB863EEFF8ADC05C25AD4C00CA9DE4A8BDD9F28763D1045DAD3FD658268A94402CDE00FA1725678B8939A00FFE8C975E95B869BD5072857D81FE8192A51A5152DA33C09E25218353C6341319D9C95F9372A56E71DAFDC2D88E" + "56" "45EDD86AE9BF611A7E438BB2A8280D2E45017C6133F18C07C532FCD7DFAC91CD5EAD460AD9F89EB346864CCBF050F690744295269F77EA6D5503462FB1B8367B2C9770EC98C77ABD9F4F84F8D02319D33D8B08C6572F1893148FCF3EDA1991453D53AB2A04A0BB8BD9F7AE1CCE752B2D8EE2AC46CA4CD30C5838B966BB26DDD" + "57" "20EC7009FB8EBF26FA4BE5E2F401D38902060604984580EC3FB0067765A5DC0582B7B916D947ACECC566BCF549F5A245C72D8AB1BF96F91ED2B3E88AF722EE5031B810A7A2C70F22DB7B4067415199910EE1531095F25E3366FE865A3371CE1C6BC85DE28EEE9C7EC3B34A6D572E39D44FD93797FDF5AFF42E4CA88F12B546F" + "58" "8596C336B565D5B8E9D644383712E15EB2CD2E8FA59C700D048592364C80E288EFF586B3751F626D4A3EA5CB0A3D4F18E52D11998DFCF5AEF23EEE14F72B8FBFCAF7BD291B5FD76A64314DC5085B5DCC5912A1BABF3FF66D27E28743458E18FD4A3117E94232E839D71248353DF657B92FD61D639ADC9F900F717839AB32F93" + "59" "C1B4D30A10C07BE177579BBD85BE1AFC5094C9ADA221C493F0655E83599B604EEEC7B6A5EAFBA3A92D9C408AEE44DB7DB49A811C678EADD4F72AEB2BCCF6428C6DD7AB154A6FB8DC46FDD5FF7B2A41793340BC8174FC42943822C6390D8DEC2829BF0819AC5EA51B83AA84AA97B917B19CA1ACEB889D4B2412D9C0DBE98EF96" + "60" "C6CA401B5B96BD4B86D094D5E86309F90553A0142063B6FCF22E1A486EB168B4DB75D047F1E220533902E28D71870ADC0FBF0A341199C3950546A26F59ECD2B934D3238FFA7B3CF60F353DBD2E164C9B1B171F092A2BF1976E62E906E730289BE697C3FD8AD6FE2F26EC7E0BA4D89DD3643E990CB58C2E0F02F85242A725B69" + "61" "5062A387B0AD70CA2A0C3F78C7FDAE9713ABC97A367C7133E44032205339E403CA228846CA9A49E119A091BBA427CAF2742A7ECC2CF0CE54F07D279F8BFFAF3D3EB579658350EE0846F38CAC17432ADD16324A720F7A011FB9E59529F8892DEC43CB6341E07AE0A48F5B5D34B60129018CB4D4BA227A7477C7D35FD148C5C45" + "62" "79F2C7F5DC5EC9FF489EE1A5320D96C011C25ACE2958678606F179A3BCCA70831AE3D11A43E1F86D2EA8ACC9DE08A43F14388AA173FD31347353DF65A32D4E65FB4BE5C233BE6467DC3FC74E6F5BC254B0082CAAF6B915AEE63EB7985510569D7E17B4389860E6409D250E1CBF15A0B82FDB8FBD344F90E69027A7CBB23E70D" + "63" "D396EB24BD7A00EA55B4AA1553E1618D6F9456B07BC40049EBF5ABB98A0BA3D584BD92CE9701E4964CAA33E12355A76E8CA8C3DFC6A381D5B038C20200C1E983F4ACD6B39E0D0D59B279B2AB6FE655C387B99F701896C91393128397FA2316963323DD3CC229DB111911AED01D8D18F323491A14EB41CA3F7CD664D0527797B" + "64" "F16E7E406261C0F936512F4DE032F8D52264AC53F5D2E52BC169EEB218778E84C68F091105E070055EB8E1895D04B51DE6935C92FC095770554F3A628518058663746262AAA4A050C55DF61F74891758C33E479C75998F39A0E0B033F4185D14AFFCA44F968A2430992C7CD93B1F2EA52AE55875119B8CC60AA4678868F2A7E" + "65" "413FB8518BFC50928265DE99D66CEBB6D759F321FF2F15E9E38FD13C4D945850F97844B88AE9C4CC34E0EDDE74BD7A6F7461CB7D37C80674C8E0A74C78AF5AD6F9227A826FE5CBCB8B6F0E5220192665E7F41C7CE30514A13B7AB1EB5367EB789967843F122C66AE0CD80ECE51BAEF0F30E1C67C993881F404D6C97627901D7" + "66" "AAA4385B2669FC1FC414A9FEBBFD8830A6F26F3461114D4FADE23F34F9553FC9004A95F4446D1980E594B0A3E6EE33A6CCD9325BA8190D48D5853DFBEC8D8537F19FE406DF9FAC87A2A86EC9DE5A3DC0AAE4630F94722DC6091C448A4939EE582915CBA0F0D3FF7EC9EBD8CE8C033CAB67E7C2E2CD6A00801AA3EC572759DE2" + "67" "3D026FF633F4F4E9150F008B73D4C406E4B0E1C58FE237C4EDCD66B9CB73C99C1B54D9D447E3990E67F0643841844F7622453918B3C0472134720926810096094F4F4C81C62B240BB9641050743647A4F948BF233977F42CC61ABCC7B428B354E1DEDDB6939A6518FA5727F8C401D5FFF726F99E0D9C7AEC64DE4310FD370AD" + "68" "12F2D89BFD77BB0EA023373565CEFA67EA6794C74275A9E6CBFA06F031FB7FE42AB757C86534B1753BB1334112E7B131CBDD0B45C3C47CA22488BE2128D51C8C3BB96277CF3C162C9E0702D91D29DB96ABE94B34BB4B6924A849517326FC1C0DA33567C0EA20D3065124CD4910FAD75844AA276052A2A5F945568877F47B475" + "69" "E57FBA625CF396CA2DEFDC160C72F87DFE3D0AD6D2160712B40C3620E085B8092433152A382CD9338CA719DF38D6F6EBB570E9677CF5F763A07ECC04406525DEDF022FD1295CC07B96796B0BD6FC5FA2F0625D41D3545C41C18679A5D36BE5667BAD6484AED608C8991F564B4E8DA9182E3C2703682167DC9D616CFFB53CE9A" + "70" "698BACA970A5F5E13A7AF404EB34A97C067625F8AC5F49F706885EE1D3733CCBDE744D02865FA4062432668B1C60CCF8E1C57C50C4A79757A1F31B0A99B3ECBB5996C7A1D048F4B3CD69F3DD2D1B2EC02F86FDFA867CFA725D378930180E1EB5ECA2E82E8F1EE47FB5BFA081F4F5CB6EC61171E1471F745602A261A61363FC7" + "71" "F0B68719486A429235DDEDC2F7F87FF727FF775831B0BD924CA3279A3FC79DC40B576B26058F1C38E72F07D6B3E9D0CBB485F7223DFC39AB2201C4CB182FDF6F0280FA2EB65AD5731F607A18BFB24384C3AE5010C3ED328FB5C468B8E6684F8A104E58CD0DEA87EDAE4D1D917E05CBFDBB8FD36D948A018B43F4DE30D0626C0" + "72" "06CFA4D90030F83BED5E7FC9D4262FE3F6EE0E26ACA36D5EEE6FDA3D389B4D42F907DB68954670553351C1AF8C98CE1E51861028B4280E8B3EEBF4EE1CCFE83CAB149053DD36EEFFBE7207D5E439E55AAF69BF3EBFDD047A062443FC61C319B00B7E9E35C797E578E0AB067BFFAEA94227EACBA840365A0F15EDBDA2A98B9BB" + "73" "0E5CE61FEA3F1AFCC917E7A55F2325F8340580EE4B3444C3708174808A77119ACE08C40517A28EE468CF99D5EE714789B0B6B8530C985B0485C6BA35A519533361AE98C1AAEEC418E748DE90EF1412AFEA4368D295CD943FE7F58B83A6521C3F68D1BFF60B292AEAAF57BB6DB2643E8A28E92788D123F43C4E46573BD55CF64" + "74" "B7D90DD885BE7919EFA0CE9DDAF3654C2150DAF50778E6146B7E38DF0FEA27E0062041C897A1459CC25A40C5441253306F160E6010156D7963B571A75472E76FD59D98DC0BC03E2229BF7D4461C9B1DB10DE20AED7509501CDF3CB9B8469AD83F3C25E710BE7E1CAEC14B9B1B31CF343EB1FFDD4273E8E51F328FC5E8F05F75" + "75" "DAF0CB97FFBC3E59580B776F7A34C89891C595E8A279154B19660349DD39EC2E2CC4C391613F54C0878604212F4A491EED8456AA3DEB96CB54D43DA8C72EA5DA8EA7344BB730E9B774F8954EEE9AF428EEE6CD719E74389379D4E446764DD253A6C93DD1440D8C3A46A6226CE76EB14E40CDE1DEB61AE331C4484476C94487B" + "76" "4C24188128873CC68903A1EB7F1FCB3FAF550EA7C4E13C2C604C961871DF78F8CC3818B612384A342B5F83C32E5D57DB74B68A1F091471F93C970C6131F7D4C72845440887C456C1478A62A7C06C946AD92C9A1E56E3594DED5C789147DFA588837D23FA2AC574C65C6C4AB40C412DAAA7706C0E1BA23DC89AC0223DD3EEAFB" + "77" "AC2F215323B298516F680B873E7412B24D17715ECAA12F08741C0D4D3E711F99FC515B038C86FED64D9E3C52C9B557A51D7E0A5ED2C612F0910C2EA0A1924723398EBCCF5072D2B5F6BB4533BCD7B6943A8713A6E9F2C7A5817C71CA2420CE621AFEE194FD0C97E4BBD35C0A33F53C820884884DFA41C4F9B1BACE648FEC7FC" + "78" "388FF4AA7F181E338B7D49FA5FC01D9FACBD2A78647F4E1C782D8E2DBA05188D8C8B9131025F67B91EBB4243FDC58C08A06C547A8D64FF0C4AB0406E93D47D5B02AF3E1CBC237C71ECD7D49EBC315D5E7264FABF9F986D24E3DD953312FA05811EBCCCA60A5FA49442C4A59ECC8B65F1AD4BE4DE91BCEA6A24A043CB237E5FC" + "79" "4B23505265B540DB30205451CDB7E32DA721AE757F4BA127CA324A872F88B605F07408A3FB46848C087F3A1B1FEA56B3F6A07521B2270BE32BD64C9206EDA018C291B81A9BE770C82555024712F50B03A29B12CE1B8481D0981BC6E1ABA9CF6E7295CC10234DFDAAC4F3A9B2D59523E423A9F7BCEDF65C5836504BCC59D3F3C" + "80" "1375AD91DEC6EABFFE68D8D126F87E21D5EFB4F5E19B9AC95EF5DFD2159AE2A169EEF77CFE0D90251CC4531C4259AA87789BCA872F316A5AB89729CF48C361BAEC1344B9CD557F4DC6CF223B5809825A34BD093E415B5618ED1B99D01D922A8272F945D01E734E093FC85E3E79E6FA87C5B90D46B5F106020AEC18C6A5AA961" + "81" "92C46EF5491137916E259A6F020A425865B3EF624C5E6DF3C498DF14D81A2E70BA3C52FCA8FECCEA661BA3A5919C1BB846BAB575E6C606EC2A5B816C91E4A7130EBB31FBC7B7767DA7A578DA046C21156C46B9A44F794F863971C9BD597A4F666B2B68A1C5B2D1FF0ED9055C995BF8C9BA6DD3AF4FB36E9CFA1CA16F015E406" + "82" "D3BB5F53D90297B8C6FBBA8407F2646971F000458D8B2159F085F5CE76CB5CFD39D4228B34F0548AA788CF18FA33C27776DAE98037D1A56A22A8446B55C21309133A435E794D3C5279D46C4FED3A3374D2DAF962DD9991ECB8759C0DEA28FF66A459262F1D114538305B3057705E63B1C44E18D1B1623C85B450E249FB0438A" + "83" "5C9945204E4EFAEA818ED1542B7D23DB8439FB879255AA3C711FFD888D3D21D72D96B837228CFD7868522366ECC16FDEACFB59FA18FC40A01F1B2E8634595EE1DB31604C14A9A1B3BFD1A9D69ACDCF13793E15DEA7B51D6C9448EB74F251148A278029389732450EF732E788CD1FBC7E6E2676CFF154BA57423F80FDDB9E42B" + "84" "76C66715380E1A3994B546C7D9F8F2486845124AFB05640E37A393EA314A635560CE925667670D0BD9E888E4ADEC246B191F4711F64B0007FB06D6D777D2BEF8FDE50920FF04E8AFD4E0DBA96003A1092FC0249EEDC94BBD9B01332C2209196B512EF0A38793072B30CB217E33D271713AE7C867E9AAEA861376D25B253FB13" + "85" "C1CA0A826A06A84E0AE496C6BB2416AB054BDA35AABC7D9B01940523C5E347C78B082EA5A2FC104D0F61C4FB05659AB0159BE9E89953460F02A9C1AFD939DDCBC21F1FBCE137CEBFFD09C6ABACA376EEBC7DB53BC3E2A6FC257F6A4E2736B8D50B5626A8B0624F9423AFDD3D3186A648C7780299CF2B91C48B21CCFD226A480" + "86" "067C1DBF1DEE73B08F76F4DCFD57D52DDBCE78B962BFED2AD2AEEBA54BA9362AC9F44A7F11C3DF153E1403BB47F16A1EF846282F5E8B8BDE548D5196E626EA2DF1C950175DC7191DCD9B97642CC2436E4CDB1F68215C40DA97FBF9F077B19763326EF1863E0ADEB0329186ECA98E46DB9C49D9B2A8C5E172EB21E98B3AA58F1" + "87" "BDE7C96B8EEA7593FAF84F6483C4984FCB576CA91FBE13FBF262BD7375399FED02DAB3ABF8DB01ED5B592F57FD8DCB39A388855B09F8EF5DF55F7E6945A32E12DEA33EFB72A47BAAEA7241ADCD647474FD1B0661D7B7284C45D893621DC1856105C0EA5B27BAADF15DCE50EFECF9ED1CECC93F28540EE840BDB13EABFF71A4B" + "88" "CC1C23F3FF6C52A605988C77D7FECAAEEF0B51FD7B5C35BFE4BC0BA40D29F3BB5E219A4819C7E2E9CEDD465EDE8B67CDCF30F73A93E4C82960F8BB5BC9A15CCD666D6D8721540C4A4D0B1F428A0D282BB3D23AF27E61976A72EF722D163C2A44EED12B6AC731D4FAC691572B196A764F56A66F2B7933D07A7F64244C1185711" + "89" "139988034CD1EA0AC3D5790BF17C6D85AA60E7477817A43422A8E5696B3DF608F3BD8D302713BE098AA91C08F3F9ABA95D28EBF0F8D20FFF8871F5BCDA471D63A6B5CA7BA5590E84D96FA15F82F56BABC78660DE6058E131E54FF02458B9A46F48F31F0AD06371BEA9143E1E91361AFF91869A221069A9BAA7B786265E3ECCC" + "90" "C4449674F4893FC87B9A34E2AD5032B804F697D2BE507842FAEB04A1A52F4A4585FE24DE1AD43A83EA6BBE233C608B670A23D6A72CE7E8FF85A482E3BB2FADD30F5EF561693838495534C96FE4F119EE24F6E30D8C50E0929392ED6C7E3C78BD58879932EFC8A7D0DB8FE1E23C9C0EAA12EA051787DB94FD3131C3969FAC493" + "91" "8AC38F44E4EB5663770260DA004709AB80999B5DDC2B7E2B7636D29F76B5E1A90F1A89D8EBBA1C3B5A6722A1C17365968AD33DA61E387B126E80028162807AC26DC2BC3A9C3AB112FCDA02325022EADF0CD0EF6728B22C242C2EAC5F961180B52C98AF2EC9856CAFA362CD13940A28D0AD24E58AEA9EBBF3F9E3686E751FA5F" + "92" "7AC0CF0F82F290433DED06840BDC898F64CC42BB4467091BA5D1427A074B2308C21E8603D6967E294501E2337FB688980B965206609B480E2A2EC3A1EB71367533D4AD5B4C0C05A1CC2AE0A07A243944B7366CE05887520D76FE73E507D4FBDF56C91AA6AAA637B414AAF524E741399DCC96F3E92E4CA35E5BC9A1B033605A2" + "93" "77246A85DA71EB7B25C1455C4F50E47B6D005F9740F5DE5EF8EA8A5F2771F8689B3BB120188FCCE6F275F3A0073005BE663FDDE5272D769E6B377F2DD16482274FFCC3FEEB61A0467B219D9DBE6B9A0DB54C34FF880940F5879F33D6C487DBC000323826EF1C841DBA0A8C589A582B614418DEF92E6A5C9BC5477FF48724D8D" + "94" "54E66F235B90AA30A83F0CAA98F428E8484C6F5B5A1FB25593FEE25DDAB213C25FBE984D6802482DBE6D20BE1687E8D2428EA747C41DFC79B4D4DF3969B6B782DE5C8F813089528066869464EBACB5A2964A14A516A3ACDA9E14C9BE1F4CA32B1598F3DC5A5C40B093BFE62CED892313CE1D04630BF73032491FE48D779B446" + "95" "EB7D61F69D0112CBDAC3EA922871DCF77DAE4DE08F5BB7D2684359A29370A08B05FAC3C7B514CF1637D453039974A3C4F9A149D51342CB4D15D4491DF05BCE6D7D29CD0C46432663F1A62AE315B1FDF8C1EB96162B2B7647FA4AB5F00CC1C02691162E4090BFC89FDAA7E25747E9FB35BE870E0231E8A22E28BF3BC01FFC07D" + "96" "5BF6B349E25115101305829E7165B611211EDCA5C604CF2A82947DE3B7504734F87ECF20650F3CD9A3F68A01599DC119A2FA899AA4FDCE48986A84B19D7045263049E30B83EA1DC43A9261B46A895BEC55D43032F231455E3DD156C0F15FD729FD9B97A5C7C73CE6494C04CE48DA9D1952164B65A813699EA0ADE363C02AB4A" + "97" "1F3AE09E89D13CEF844B67664C2F66F4138A2EFF266565CAFB9755990F1F46F1F4C4FF6842D371C6B95D6C3298C74A40F3D6F024EC4894E4D4C71B36AB370D62CD9013AA09BF3F30BE1676DDF76F895DDE981096121F5DAD3D71662413ECE637D22E0F4CC35C8CB2C10832653DCBA9355533D89196DFDDE8E178E5C63503B02" + "98" "C668FFD7A0DC0C40D59C5B6826BACB53644D63AA0412D3D12A532057C5C21F6352F6FD5895CD8361D2B6045A2458F3232FF385A7E1FF9652D8E7CF9D2D533560954D691FB4842F12ED1D38640AF86D144A307E639C9ABDEC6EF13CCE34AE85B56F0244F7F247CF81815660DFA23E17C120E0BFC29AB7CAB2DAC2E86689FD430" + "99" "A2EA2B205FAEE35989D584415C14C1AC21BD86952A5D300A2B11DEAFA022E2335FB1F5A4F547580774343E48808073580CC1FC700DE4A2DCA8E9072127B817C6ABD8687A053360DAE346733D7339FECBD1D700C960314342B0A47DBCB214D62ED7881F6916CBFE73033BE6B819719C3C83C9C97C619046C01326D8B5AB20ADA" + "100" "16D4C0F0505A10FC69239984BB2B73F25D3EE53C2C583570AF0736A93F54A357CDC9C88635BBDEF8A09BFF84B04133DC2EB8D2C127F2E571DE977C195905FF8D33FCF7B262F18670B7C2E811449011A387E40780D4A62593D92623387C1EB97B6652576F37CADBC96A73DDD51D58D5BBC278B98DF95841FF9E55EDE780217A9" + "101" "C965AA464A480344429D414B424E4151E86E83413C3337F93EA89BE09B58D15982128D84BF46563F8C169FE619766F2816EAD7240308A5862296AD5154195F70C524C60498B6B10969DBAC732D035D05297F02ACE5A3772041AD09DCE5EB71B09312AD53D22266FA93F38B91E3321794260190DB4D45319940E9DA29FB224CD" + "102" "9DFB3AE37286E601CBCE7F2DE04975240C52C04DAEC69AF5F26AC1E4150D85145AF378B2753564A309D041097E9D52D8574EB99D33CFE68912DC40F342E455C62934990F262E43C08D9C0F357B9ABF8E5FCC99EF64FA008DF22A23BF17B80C29D2F7E1E666C3410A47A0EC487642A4C28B5CDD83E5132DB10D39AB6B4EF8C45" + "103" "85FD1EDE115F302B4C1D2FEB2E091383C2FFA46935654BB961D0BD94A178073A3CC3F97904F5B741D0BC81DD2174F62F9B98A7596E4B57FF3E7680F0AD01ECA640FC51E28DB7D0BC255CDFF14575DAAB37546E276B29BCEC8F81F4C38BEF0DE72012D63DF82293679675D14CF0470108FFD7DBBC9CEDC51747C0920FD8CAE76" + "104" "73813F264A4A62B282FAD8ABDEAE1CDD41901A6A15297B925E6C5225810891B74852C9FCCF21E4BA7947F2CBD6A2AEFF19CB15F80BA00174B3A039C37794E6837FFE8FE4DDA7E64AE229A8912DF3312E232311EB7B19B8887E1F762737B6E15DEB1ADE34C0C44B8A930A2728B35662D10F5C2BDD9CB4125136642008B0E2983" + "105" "0224BE1202E14C65B6C8A92995FE556A8A74B34EF75B2FDA1A44B4D456876AF2CEC21BBC5102CC4E7897C6D92A2E49F09C354219FC40A4B2A0C4CAB84A7D1706BE1B489CFAECDB17409837940C4EF4EBD1DF9A33F3F23F95123A01F9673EEAE8B1FB677A3D246AC7CA43E136298176D61713BC7295FCD873A2E85747202126D" + "106" "CA3AD5DB48E0BDA417E048802CD9F7A6CF1B2B0785253EF96603C2FE29816D68EAB55E9B307E057CE835EC180AE1585E35098541E8C18E813062BA8709F00B5CA1275DA2F2853D16685386028D0F0B602EE7BE139ED82A3D18F959F6002ED9309323C1AA097761D44C430F5064196F82EAECCA85A497F52FEC5C31700708C91" + "107" "1A272A3E884F8EE8766CF0913C8E51693D0D0CB4F6BE845D620B013EC24BBB1CD8F5A124F9E43B87DF873AFBB41415FA6E5430C7E6BB29D91C2B86E917F1D3FA30877233321AC976CBA1549E909C72FADB2A67B5976C2F3EA9E37FD7CD9195D954E4B9803D5C1AE835EACE9BFC032C93DA35B94BBA88F76C9623BC080EE06CE" + "108" "06B72C33483E33C8B103F6D5597FC876EB1F7761AD0C475C6AE526E1277924C03D0D139726799424F072E06E6E8559DDD4AD6066FE52E3B033E1BEC071A15A5E7300C2AFDB141B61C91DD99E9434F1E1EC4B44352CE63B6377C5DAEB419A419ACDC1850874B779A2BA09E5DF59D78F2E9CA3CB9A54C43975D400A506B59F35D" + "109" "A76E2ECA1110A584899A36801E5A866399395F586A658CF6597E4590938CF56ADDE4F8D0025D39B4A2D03CEEE88372365CF6B20896104685DA7C8B9346C1B4BCCDBB00F14303825FB57FA0A64204A8AC986C96A197DA3CF2FD88D9B7B45731FE7C4047951C2679988968875590F704823E0A2F7628C8579159A05514EEF5F6F" + "110" "A94FAE74EF83627E238798C315639F334786AE2342DBF24CB9A12C413F770FA489EECAF8024CBC423BE5008043EF091B9E071C221AD0711592495A444C67F7F487DAF11E116AC5AC1EAE5F646B3DADE98A20F36324843B7A72D2864BC4D07B7771A772E899B781A38091B6A5B95F18375CD87221BBC3134BDAED8044904E223" + "111" "D366BFA190622A560FCD233BFA37C3A2C8419781733666AB75971BD8F25D3D52AF92326B66D4BE4743DB15C46FCEC29DBBA7489D4361913FCF1C973B4D6C661A459F4E7B4E428DF924669DA6FEE36990C2F6F1DE9BD4F2C5ACBE93607E20E70B4E5F2404F74F4F39955F719327348861FA7443706A76884488458725AFFCC31" + "112" "85C1F161D09A2B3F8CC8281E811E178504B063DDFAFCAF1CDB6120E1D5A6D58AD7B330F5FC7E19FCF540EE1C95D4DCD6AABCFDFDEE1585807803E4E04D6E79EFFA9FE6CD8FE1461F65B0D4033FEF7E0CD88E24014958A4AE6AAD133678B32C0E7B1BA310B05CF6070369259D25F02CE798F9316B745F3CE4ED5981B39E029B9" + "113" "06603EE5FDE7D2AA4DCC3672F613CC37002BADD3528946C547ED8A38178DD4EACC88390868E576302DCCA43CC2373DB2BF12AAF147E2C568636E54776DB3FD7E2776F8A3D4A01D692EBA4ED488902F29912EC638A0766D03EE9C37DA2F0FF5B07DAD00C1C0B2DF4FC39E381B528600509D65FF27FDDE299F891AB7EB06A4D9E" + "114" "162ADBE84BF7BF79277EAF55DC4E7ABA9BDFDFE2EF16267C34CE8730AAF5F8D91880F5B5F3A10E44511CC8C63FFC99AF27349C98283B8F6E9D33C84F614F736E67B95E49FF5F7615CCBFB19A91206D5B27E1079B90243EAAE1D2510B3BCA9FEDA8A62EF8279FE2C0554A7C7BA630689A78B31796EA654F0D9693B4E36F904A1" + "115" "BF194F8ACDBECB68E6BA3B5AF45596306B302D14D6B55B7C2CB41CF763D1E44DE3E62DE74E87D8E4F9F7B4DF1C64091EC1671E4118432EC315A3C76E0C4141F5BB6FDF0B0325258289E1CB5CC7AFEB7C8C30B211B9348FEE25AEF585FD120BC7C84192FFBF307DFD74FFB88D8C5A22A54CC3F1F18FA91A9A5F184F368454148" + "116" "3EAB4F580D3059B27CE55BF5D5853CFBFFAF5D704CFB29FF7F603B94E183F3E8F3BC176D0C4A5C71012E97D7B4E3EE1530F78197014CF7BD8854C73DB61A7FD00392D82970D1BA437160B96F7C6625DAB7DAE07C97B65F2BDE1E04C037D1B9F3E066385A7A768284ABF66A043BA5E07D851F29B01449942026600EF7E512940" + "117" "59BEC39F163B56DEF193BC8FDF9AA6207EE2AB9399BB1460E32E54B484D6998D17B49E9E78374809B1CC7AA5B6D4B452C5493A2523DBC184367C696F5658B1ED6F5BD132F02CE6A199193E317465B1BE9D785E7BA10D54356E22C1176F50EA460D3807DC0545DB944DD485958B5210EC2063D37FD5FE0D599489C0FC6D4FB13" + "118" "147E7173D8B8BAF41C46452A8721B0B8F042B45757CC81A4A8770FB7F3B9DD403E9B1967AAA4A08A3692398AB5ABCEB4E29CC3BCC7D4FF6232CC0DC4745B9224CDD737816AEB79217584C667DA8E86B02F0DCD1A6B2E83BFD061E229CAA282C1F1A9D05474388ECFBE5A1CA8C74CEAA6F63F9CCE9828B288F45082765EFBCF7" + "119" "11B4E9633C0F2D18FCA254BC66B7AE5352E5E73EC3DF312525D2E380E4297C0E4DD83A3E9FEE237BC531A08F74FCF84A8CB75F5C4F5A65F91834D1A6016F76D6A02956D2C01F6561A55A418CA292DCE2E313F5D61498C063434CB6FFB53E7FE4EB4E51FC170CF3543FE1137151F0BA3C292B85D36BB0DDBBBFDF6C31031D607" + "120" "A01AAB04DEDE02F8F046EC3FBFA408D3F24BB80300F60D674CFF318EA87AA531FE510D53187D4AF005EBE1965B062A22272513C981ABBDB0758B761DA022E6E9A30BEF43FE3180D4750B228A63A212E11DBC492C02F9C444CEC75A9811D0C4A73A9F95A99EB8DA4E4F1CF21565D553E35600BD5C93E51A2409FC57CC409148C" + "121" "CBDF110E686B3F17CDB5CB6C13EBEF114A59A43BAFBFF054EE33DDF9485DB2B754DFB8A8DDE7200D10A45E6B0E533917E28FED4122539F92C9B97830EAB1F7860DCE222F475C443443C7F64C5E256748A7991469FCD05552D08A8768FF7E99C786441C8ECE72333A53433056E1FEE7064C1F725A1E277C92008A3568A3D5A4B" + "122" "CEE5703285B2781441801F990F26038AF70ABA6E19E40DF628B3A7DA8988136612058F70E6A82BEA045DCEBBCB5E07ADF8BF2197E043CA6249F30DBF332736EB1ED1BEFE461E40E675D210C6B32E8CB0369FC6DE9D2FDC498558680B310AF84CB16F5A09FC273E91FAABFEFC680DD8CC5E3334956F3590BB8A3D942FEEE16AA" + "123" "00A290FDC32146B401FE1B0ED5A1DAE404AF1A79CA984D0E99D60CE0E84CFF37B1871009169E6319547E65C8B08C2DDE6F540ECC4852DCE576BE99D8E885B2025F9859B6F4ED920DA341090E87B707885B77BA08E7DE9567FD1AA8283ED1BBDC51993F4269EADE3CD3E9B14E4D40839DBA6CB37616A668BFD75A73F5AB9D72C" + "124" "8D1873EDCBBE0F13A584690FD5664B0B0F54C5016CF894D064D49BED41A3E1C7514566F49BA78B2D48506F0774755F37776AB81EC36ADC23253FC723C62203553B32E3DF8870443FCFD1768AF07FADF33D93DFE08890BFD4BBD04C423228271D300471F044036E207CF05C2F962A8D7012ECE84A21F010B573CF9C95AF245B4" + "125" "1C70142A7024353FEAFDC06A2F23DEC7B8A4BADD7BDBAEE680A60D11E6C069379F5A6F74F7973F6CDE4130B7F2913C49E543CD97BD61D6E74E8D35BC91E81ABE0E39BA8EA6794CCB937FF6F9129AEAF7E493E7E5E21C7815D21595BF354B217320CF7DE190D36A2471B9D4ED520E0A6BEF17540F4BA89A8904E96AB7128447B" + "126" "7D2F36507A19BA1C9E734270B67324FE97DB4A408D6AB5079E7B18DD695B5C13C7CE2949B9777568670F1597160D45F130E4EFF53E4C4B96FDDA6ACEED245B36BD5C2FF23D536A22B0C6257FF6A874EE89126CFF7A8795DA1B0EE467AF2570A97AE8DA70C364AA5E9FC5C40EEFDFAEDB77090855DA53D7131B79AAD67BEBF79" + "127" "55206F8591F27685929BFE70D98A5AA951094B318D385073A7529CBFB8C8CBDEB8330BEA4CA6A810C42C226B15641D03B48D99D8E11C8030E97D226D4356808EBBC913C9D2A7AEE8DF3DB319BDA7F8D21231781DCDE72B51AA73A34573CE05A8B13E3FDE85DE723A52B5F2B71E7E3C9FE35C1DAD6537159B6C8AED6BF6FB833" + "128" "57574E76BA98998A87167BE6B1B6AF2C8043DA6C2A9484F758F493902C7754B82F226A2349F3D8B3474531FCCA5D47AE176E12B599770EE6D2D411E2A8F99A2E28105C3EBAD7635FA55C698723D0E121A39FC0939253FF854F44B742FD87FDEB6DFB7F7DD262C905585A659EBBEFBF8BC26F802E656725FEBE3E1E7367FDFA2" + "129" "48E4B005502BF377A044756A263FEC5C29504BF92726E64CC16DD16CADCCA373655914C1340CE8D397376D1566F04B40726E655C0342ED80559A2733DF5DE74074491A387559535BAEDC779190FD5325B2A2C669F6ADD4DE288C05CBAD52844A313F9C08811BBE588DA064A41EE3481D6F345FE36C1E09880B879C63FCEF25F" + "130" "579BA116A57502C447C942402ED22C337D7C5EE17070A1F20DAD51EF1A35FE4F01C8A163EC7DA92C59696A6A0E0BFD63C0BC11D790F7C7F4E79981B3974E5E8BDFE3B5D244637AA7BE50AD221CF02E7DCF8CC7CCC6A24580F60309D85DB43CA52CFDB372E804353D2D73A4F44D1B9642542F78D8721262CB3E1C3C9F4454B00" + "131" "2F82C358C161EBFB04003A18875D86B01A1F19B9CA5AF89CE1FDAEF893866450418171CCCCFAD444676DBC821073793DA9E31CEDA169DA66025B1ACFA5E83ECBE1F3927DA04F90ADC1574DB6C61C037F3FEF379F68B71DFA6AB0A945A25002B8C4A9043D950EAA888C8CC826AFB3DE61FE29376832EB39E7D60ED1D212B8906" + "132" "1030AF0F6D8E49EDF908DEE681EED98870FE706EE1882B303F47B5EDE1DDA187114F02793E404AFCA99F02DD740C661B0A235EB1B5F29B1B142738433BCFC90A264A497D73E9079FBA73E9E06E437FC5537B8B18496FF0BE839D680CD0DC8CFC0C4AE93D26005D7A368B403719764FB6DE456173E70CD12ECD356B8F81209E9" + "133" "EAF2601FC2FD0C193AC946DB3BA03A5A6DD9EF6E1EFFD3D191A637DBA4EC629D4F41CD6C4F535B1B9830DBD1321E743D2A7CD9739F215F42583AF50856D51805E9C57393B59E10E8EDA36F4478EFE2F29B7661B44A21C0CB80741133AC24490DD3CE8DB9AA542D591F2838A3B851AF4670D3C3E9FAC669695D2D0EEE62313DD" + "134" "5B5A7061CBEFFBA28D36A844B9836109EAFBE38AAF422A607234C7406DD9AE6361817387EF2451FBA7F31403EA14B2FF61FD50C2E9676F4A6BA41690C05675A52869666B96F9CED1F78F5E52D69CA1370E95C989C553876A32DED674E8EA1BF8DEF24DF7F8E9DEDB643DFA1BF139CB7D957CE29AA54AEF6DB07AAC467F2B4A3" + "135" "E915299E7028196F32D8492641DE96F32C0A41F256397A9E1826921885955FB217088C8F2CFB4A853F0F4266E3093F2D3492E59B96A157AFD2C67DA8B799C54EB3D2AD837DB91077D3D794118EDC36B7557996485BCEFBD94091DAE8B2DA134078E12F080ED3EE920F4DDD63679CCEE0642F722C174E5DFC56FD38E7C9495BE" + "136" "CE979BEAB2760A70F9E927A00FA30761D85BDAA72E05D3E9E5BBF051A33B4071F1E0792D439CF7797C39985B371B4A7C7999946AB6EC1FC45D619C419CFA90129891C771A39924428D7CADFEECEA09FEDC5A814D408DE7C2C30D1660E4E3057055F9A10E42C0AC6BFD9A6F7B3AC6EB49D822AE5AA83F411CD27595DD58FD585" + "137" "3990D004EA289F177E76376AC00DB3134C4D0261512551633DEBCE00D05D0F1FA9A6D13FED97DEDAC79FDCA80FA7550BEEB0D7339A51FEC810576DB258E5000C5C5DA20E490F6645EFEB385BB6700B61F1DACAFA3E040238A5A0DF0D297DE4E2C1A2810C222E47F9508BB2BE24BC435D1F706B3C0ACD0659D031633064C69D4" + "138" "8DC42813EF171716B3E6AC29EB11DF93E0A11EDB077A4F6AC7F9CD2F6EE4BA0A247F0289E9E083A635278A4F450844207892A9FB0EED0002856C6AC9B115A225375B626E2B11B1B2FC5E4D98AC666DBE7407C09485C1944379A5A7734DED3C8D344B40089268268FB54B921D6AF18A72F0842809BA43870FA3595C25A16B5F3" + "139" "29D8EE373E738AF08A1A140EC7D34AC157549B5832325C038EB6F2DBB2B2008CF06C23972525FEAF1D360FE004DFC76EB9553A969269779DFB5FECF8F097AA0D69C5D5656F54DD3C31E97A86C2E67B0DAE18B9803E70EAD05A1045539CB4E37EB4EFA71A7956337AA2B1A046E9CB53EBE9BB7EA5323ED8F977D22ADD50C47EC" + "140" "A2FBB51AEBB1863B45619AFB69DD1E6FEE4841BD03753A39A64AC3E507AC8BA7AAE3EF179F6C18180B6055843680D242F5718FED17880D6D9C348107BEC7EFCB9EDDAAC637D81980AE6630EDE080019F719D07742E52243234EBF5651E2A28D1E06E3C9F096A83A76C9CCD5995ADAE13CE390BC38FA8F12AC9E2070C8DBBA89" + "141" "90AD4006997DE79F1C735FD39165BCF32FFA9ACC56225202410FEECA60831237C9BFB3A2E59E013B3BF8C41C022FDCC618D979CA654CB95A05A59D432CE34F9FBD0C1FD755A26E671140536F4F3268828BD6EF588888C299EF6979824A8E4BF45FDAAAF9CC9519200B87EFADD755D28C8325BE0E02D93EEA69D1B4768767735" + "142" "3AFF492227A9FB001467121DA10D95F3E78E297A89C1089AD26DB5FBEDD8130012138C4B65AB15B68DBC82C8439D152CB006E2E73D1E7ABACF3E54B8DD5C61D7504D8CCC855688FAE14583A5EE343E32FF5EF9EA9CB963005E9664D79AA0F6AF7F092F82C604CEFBB5154FAC253470FCC3F398AE17E028349BB42AFB741981A" + "143" "8A6247595CAF0034EFC10DA541CA4141CA35ACBCF5D9EE07FF5E8D6D6A5364DD80EF1E4E8755785DDE47EBBEFAC192313FB94DC8E3E655D579728B5481EC130592A0E2CBF8391D4EC090005A867692209F457F9B2AC72EFF8176CBD6ED68A6D147E718D6AB5AF55F1AA44ED33878093D0A9B8F30AF28A2676EBABF92FEC6E26" + "144" "2D39E49CF2CB5C8DEAAC58B8E4C0D5F6E37F0426124BDB8261EA4259A732FC67A12B94A5325B662BB3AB4D3B3033135F8EC622EE68BBC20EB1A4DD33B128AF265DDC7ED976F12B2A4D5E3C843E78FD44715F3B11AB68132ABCB4AC534A5E79B7C54BC9E799B68476DB6A8D9D8C0932BBE45416D4EDC5745109BA7993CDACBD2" + "145" "E3F67EE850EC000640D15AA33A3B6103886D83031A9F7D8F34006537F599DB01DD8F791476F92FE14BA8556754EF883D6F137E0D0D00C926A5790E5207099CB51ECD3AAE01213C134383ECF5760FDDB0B9631640E97A22EF294515164E8C7A2877208749BA38A049B205556A64BA9E4ED8D03B04118D697B8C85CE0FAA8D31E" + "146" "2A6A82E4663ADD0933D2B8DC63303A08BD64E210ED2B2F9A4CC513F700E3F9E0ABA5667CF7905B24E120B47C33A27B1E801E26861AA90C6863F5808E7CE4B0C4D4ED9D0705390BB48944603DE7B720399378FEB40B01C788A72E6030F54146D6E0BCA3FD8D4239D66F87EB9CE48288714B2D3632A3B490A15185F7BF410B1BF" + "147" "945C682109EC2F9842356254DB911EE9B052EDB1E6CE85075088A303C71CAE5B979219CA870B440778B8060A89C6239122946D418F3D9B53B9F8C3A9AB955BFAD7FCCDF5703D8D8CF503052BCCDDC09D8D385748909DEA5DECB7A483E869B5CAC689CF5A7696140E8AB628938ADF50E4E25D04E1B01A756F770D65AB571670B" + "148" "1546B4F7EBC0B9FDB95659A57BCF0C5612A5C86876239B7BCF40985F6922AC0C6E1B4FEEE5A0FA88CA36E8F4C7E715DB119B72B406C69EE08C398BC5ACADC5BAB447D6BA847F2B14CCD0797B90A1AC25E0961E005602F3FC50C60EC50D5BE94D1AE5092D18E430E5C75203B0AE7AD6FA13CB6949C3A0A3FE5BEBC5C243944F9" + "149" "4FE113CD8C7E0C68AAD1755EB70F4C269F864EB3672099A32A7A0A3959D2050A8CCAA3B507F4BA32B1D872BE511BFF1C6B2132E28C690118C81BF2CF3F852E43EB4DE52A5AA8F4DE255B24336229517D7E380CB690896F56AD74B16997F10A669997C27132ABC6D121D822C3EC4400AC2CC9F7C9CBF81D74232FC87621536BA" + "150" "E7980C2D497AEDAD458EA5335546E9AE40FEE6748C3133574402C20F6B031D5087EAB39DAA722810A7F3FCBFF2622C78BFABAEC2491F16801B9DC429A627974AF361674578F1F9C0807EBAB1BF32BDDB382262353645075F3BBC699D497B95BA412881CFDE1106917E00D2F4213A0F1FA35010623E6A3779355AB0E06E9594A" + "151" "4408AB5089117AB316B0B8D9B6EB4778BED21D2801FA1D112BC0008E3A5ECBF0E80C2CEEDAA42ED4AAEE291E9A5C62F06230CDC7A091BC5F39BF31DE736145F9391EC704A4874BCC653FE5345412603125A6B6B2914146D9F6C3441F5BEDA1696C55B38B84B6D4D039C225461ABBD0CEDDBE77863AE3C7258765951B9AECBBC" + "152" "4734B13911DE5892D2129D064C49C1C065FA5933F3598F44672D3F327B56BE190C97FC00E7659577A1E61C967FCB0C70B13075F782B57F5C8E25CB6309CCBC6A5176C84C6335A09A00412383462B0C661A6D108DB9E0D5B5DF7B119E231ADE3C0FF369D431F221582E420DB1F55FB350C5EBBB5C7BC7A004615D2D6B892E49C" + "153" "99DF8AE3B33D25FE26983B982CADCDF0D79C691413FA6985CEFC1D00DDD80E30BAA1B0A2DB5546D7404194DF1AD4EBBDF07DB4F42A052310CD93A5A9FF9872385FB5644AEFA91DE923734C2477678BCAA1EA3B8D0DAB473CAEC0C72B2467B97DB6B2DF883A6AD884EE3CC78C884C3DCA612186306215DEFF3C4971238A2C593" + "154" "F28CE3EEC315834455AE6B3A8B881B270BCBD98D7D210AF3AC1CF5DFE42CE6DF23E5D4CD6A3E173D47A7F9B007B60B4808D553F1B5C46EEE8BEF8A2E22A00F4743AEB3276D158E75431D2BBFC541592AE82F9A4BDB2E3A1BDF94D960622F2B49D2AC129A753C132CF56CDED19ECD640B420C66C957D8CFADA362DEB3F1CBFE2" + "155" "F8C831F71FEA603FB75D2718A8D6123D127863C57FAEDBB700D8EEF842A94523C554F85C49A0259C37ED24BC749E68B6DC46762B4C84CD0EE2B01174BC080839C9BD27CFFB197A4470344ED7AAFF9B33ED6936628D7EEA8834B019F54EE3DC135F63F2F527D133DD0B6613B462DDC94C0679D59FBCDAB7F362A7BC4A3321B4E" + "156" "B7A24D989242526BE8FE6AA26D873C3A8A49A0190935EB103F4677219DAB524C130597E5FDA5D8EC045ED907A43603F6DF85B0806758AE9C8344903B3FBBCA0537AC2C7BC10077976DEE41E8A5AEB21E4113CCFAB14066B2725D3D868660243290A3E6D5E808B9888DFE107B74A06139378D5E5786FA2AF77F2AF2CC135FB49" + "157" "49D1729348935DF791B0A4767B5751774073AF6B2BE1665DF26042FA9C4436C6431E12CA6E6416436ECBDB543DB0A00AA389EB36087804EE3368EAF7B5012F0E93CCC3E925849268CAF10EA817CD409FE7A84D30404A7FEBEBF53E5F65907F9A8079EE033B155E547D26D264FEE30CA1FAB71A927CE5C155CFD6320C3848993" + "158" "9C9CC5964442F70A3540E3962E693D7DD19D9D9E8D9FE9128F3310D534FD7841DD3CE6306AC5E3F203333FE0346AA34C40102CDE239A3D891353D43541DE898144774D5AB0C5B807F760CD28D79FEE237240D5E7503B42F04CF6E7D32FBE0313EA75E12689E1C30737522ED837BAD905A5DA33953FD96CF10EADF5299DE11B9" + "159" "C532A28A9C75D53173BC25324CD779F0471DFFA001A547C3604F629FBAC090DFE3CBBEFFFBE134CAA0E4922ED76A8CB9C257E1271C9300B2B79114AB2DB89D4344BF336B601F739A2C2F9F1D0D9A83F04D5A09158AF7A43C979F3DFFEE469D4C3EBEBEA2FAF7965303A5CCADF9FEBE899F337D673A9F2A100C065DB163A1AF3" + "160" "9D66212DF89B49AD563CB09A97CB51BEDBC0D64D34638AF68A98DC7A16F4D8698D9ADDD810F9B30D3A7558B4CC2C2C0E1CC0637C376D73469E466F87798E88B348962034F81D6BEFEBBF95412F16866757D1822BC1BA2EAE4CC06A4DE44D42D90ECAB1F43A85B8934BB88BDCC8D00C1F119BD425DDE96B14B2D9B4CAEF20F63" + "161" "A4167E1311AC15B1984C65CE9417E698B15D1B21496F44717591EB091182A6B96842980B588F22BE19ECC703A17ECA1FF22054038A7D1DF919537B05233C1F76ECAB5A5D59FEB3FBA70BA0690B83D13FECCF82D38EACF362968FF8D2665E6620727FC287A97E0F18E2E5F0FD42C174E075BA76BB7B7F0D259FC3256621E5912" + "162" "BBE7D6CC8E4DD98C112373AFB32605509E5CC7B1EF7B3C990BAB8DEEF6586446F046B5BB6B2F70845B066B41D70F18D505EE7979C9537B5647CC9A91E6E6AE5125E662DA353E2A8A163647049A09E60C60D285411BC5BC43550AA0D19FAD997B66031333ABC409E551D9F3114587DA97E352E625BD30FB3B7023C35366BE912" + "163" "97C035E801233FF6400AC0AC71AFE5381AD72EFD1BF4A82290874A49112613C7D61D37934EFC7E965DDCD30CCB9517D7DD4627470C4AEF80793FD2408DB2C517779BCC67780134345CEBD83A71E440B2682FFC6B0D082521FBD9F4EB1F2BBBB586150CBE542186E8FC64FB6060D1195606241CD930016D9F453DD8A65419DCD" + "164" "342947E2FE6F4ABF91AB45383015C2B64D4AF29D15225A8A054F2642DD5755A92AC67AC193F575E5F3CAC2960DDE3CC1CAF2EC68E6B737F987D6A0C3EED6123301F35BF9FD8D00B87161B439FA0123528754C9D5841185A8955357AB0C85FC7C6B387DB9CEA2A794A8D1DDC461BCFE48EFBFC1F547120B26434A4A4A9F023C5" + "165" "5908E7AE1858AC1BDA9D8BA2704DC134088FFBF3DC0F51BC6768A87B05C9976FEB6E6F5A8BC97E887DA150C6B20A06275EE0C1BC3A54844BDB8EBF561B8A63E18C69B524CC04F811385483C5195CFFAD434F7E03A8AD0F1CEF77C0B591A8DB188CB84BC3C59AF876AB88A4C294F3ED7A1867D8A54101C6B4412DB3A76E2D09B" + "166" "156BE369A6DF75F115F69B14CA1C97D60CC6396C1275BD5F1A20B6928E1B25EDCAF6FE406A5ACE193C5913E1E2020F365F9D30617FEB8257512CA91F135BCA0388A3FB6897E15907C503B0CF3B1E037B1AC9C3AB8E22C5C7B8995F327B85157381857ADF76D43FFAEC98920A94D34C3C7C27ADBCDAF03945E20192657CD0F72" + "167" "92E1459AEAB0324BB2A69DC9A4DA20C6672452DDEDDA98437865E45567C1A489E3C8E589AC1F4EBDF62D2B99B91A62D081ED20B4CE164555D740865396EA954C70E7DC5FFA640845305E19808840C6AA7596089860FE864F55A8906D7C66C2A3D6A0F0B3F025E2B27EA22700ECE590C7D2064B599F59883EB4CF18DFE7EE7C9" + "168" "E2F7BB4975E9FE8FAB8DEB6FA6690E376BFE609164DE13B1B26531EC7836A303D2C69B11D1F23D626E5878DCC197FDBEDAE7F3B1FADB36B13373E2DA863720121289BCBC5A923D7F815FEF82E7BE5C7B07AE887D139F4C5198E77E4C5CC53F6C23051D90AC0E5C69380500C0D701919226ACBBA5CE9521900F22E7615605451" + "169" "80071F0D2B6350CB4D1F665F49B602CCD40E89D07CF2785C8AEC9C4985EA1C4D3A9600B8274DB4B76623FFBF6C0A23180459C1A334330B054D49AA056D085449BAD0ACE5312996B43C682D7B10B1767EBB822256278F93A9D514ED6CBF7B2CFF9D2F2F6754D9542D35F3D815F96D377A63CE73031EC5A41B6135C66918B8C09" + "170" "A5099C2E6229C0D84C34881D341A6298E7A10304331201F1B1FC7255AF2FFB494B8A14CD71DC3A534FF381711D5BB9A3069CB5F75F03E848BF2FD974F8143473E8708669C701E0E70EAE11775339977734268482B576FD0B1FEDFCB59B1940BFE6BC05F97A7F55D8D5B1547C994B34EED260D73308843CF7BFECE8F24026415" + "171" "28032F63EAE3A6A57F878927927CA727077CEC1B97109A8E9A651773165FABC3F39F3C5F580B9C8E617B64B3CB3787948D310DF822EB6225B9655E3B8C01C6DDCA67E66B2AF8B11D30DBED2EF86F4822D964E7B17135D57FE909DF221822D469F81772D89C73DB096D04D8B738742C3E4285705ABB7EC31DC4B83D42E758EDC" + "172" "9302E2DE2306E0BF5FE26058B52A758647CDB685F9A577DFEE9EE5C9DFFF717EF9B6D395382A13D682026A10ACE9636179DA061C63FC0528835A2C6D35F5C2F34566192FA9EBE7ED9DD36EE9E09E35132A794090DE89C87CD380092880784375AE501A5BB60AF4894F8B222EE917D6E60FF50EB34DD7130F4F70B218C6EF5D8" + "173" "F0A176AE1329FD0454CF203E4705EA4B163E046C715E9216B5EBF468CD9E897DE76882480147B6A0BABC930649465944187D2FD2E8EC8FF073FDDF390D9B3260C8458C228F1E1EE0259CC728DCE9B5142744100F486395863784B7B85CE1B91DE80806FDB0767092ED30117362762310780318C52AF9E99021C12823B412893" + "174" "E04D558D8411EAC746B0AA67AD734D7B754DFA4676F8830C43E00C1176E40AE7CBFA0A6303033FADB00843DB9C9375C755628DEB421779A8B65471D218C7E12CA9755BC52A7D5BEF48B62AEE250AAAA9B85F6AAEA83D18AED2D7EDF45E14A398B0AB6DB081760F57B6454266933F1E7CD084CA57CAA0D2370FEAEE5B653EB0B" + "175" "781D255A29B517E3898B28A9E89357D57D79CA7D86BE990A54DA5DE3963BD89E7037913578FBA1E273D6D5D631A5DCB73CC2F7D9D5DAFAA73801FE5BDF295F4CB6DA5C0142A345F5E70407B6805171006F13090DF5C045C412C9E4D6ACB162F29CBB52C71A9DB45607C900CA8C02080682591DB247AB0BE0F84ED5BC73E986F" + "176" "496C75D3E59AD1A2079B9BEDF3C4F50E6F9868926DA490BE4A29E47AD8C96C9FC35E4E1BA7A1A20C26BAE52B17C9FDCEE8758B5F7B68CE0AA4D582F89134DD200E4979396611694217E7C31F422F9154E2ED7886E688C18F36F916C6CA3DE63BC1F4F6B85E940D869FDE0295E89A2FD1B3E62C46214EF4B379263138392093E" + "177" "373484B3C648D35F276EE0AB8D7C77656B16A3C896A7ECC676E65895D990ADAB558B0B17F4904184DD86A1FF0906E3D2964A774AA546E899C7FBDBC932C46562C93CF63D6D30BF8C9547D7813ACD5C88C58E428E4D30D6B49E74BC77DE5A3776AC15376272F9E94A1CA5BCF42E47232FF46DCEACFA355C3C35DD278E2EDAAC0" + "178" "80AFEA2869E8F514E5846EAA148468AFF537408B33F6A3B57467BB088F05EB74B8763F2B571FFEB9E91BF8ED3381AE9C23559C5A7BA641CD6CCAB7146C4533D0EBA1204045BD914AC2466714ACAB7319103DC1CA2D11BD1FBD5762073DC6CC4BDD9FDD3C199261DD983EF2D29B2B445E0828C7B472DAB05A5568F87F8589A95" + "179" "AC5C6C63274AD0978CF47FF36D3B2FF2DBBA8D6BDD758A6F17EEE9E12CF8B8A8AB3508E3F284021D9BBDDF2FFC0E13CDA0D8DBF5E8C19DC27AB8FEB35A81DE81C1C2998CB67349AF8E563AB26CBE551E766482505039D60F4C642033A5A5B41070F92D21177C31985EE877DD0156140651A5550A00C39CE3356596F9E3C1A49" + "180" "519F2899B9CDACBD8D58AC01BF917FCC23DF92B477FF727EBDF4767C8FEC4BCAB8380008BD8DAF72DF3D19790CD76A313A120BE811D63F833D94C1BC43B3271002910B5ABA694F5BCEFC702980E752E5E5057F0112FD5AE4666E27AF76506240C1B8CE95583A959FA6525710693B9EEEF1094CF522C95C6A521891E7B38C513" + "181" "029A76A748E38135380484A8B74B2867733F89CAB14EB3A52CA426B43EF5E2F549C3EA5D989CB51BD6680A596EE88376CDB4EB2D52F268C58DE77C1D3AD89E1CF0D00174F9A2B25C7D15C0669E6204F3C8515B87DF10C5C7AB58628E6C5B94EFC2422D6E0AE5E9CA3289F30736F343676C54C87AB240A0E5B895A3124534F6B" + "182" "16A7C2064B347A4B23F51DFCB6A53F557A557EF6D414B0C986329408DE22084FCC1E5F6AE64C0C084778BD1431222580336C32EE266DFBEB0704FC16ECCDF6FCC82FF349FD762F3F42D5E4D8869DBBA341852BBE601020F6DC3A9AEACB44426914EA02CBE4D024639DFCEC35DFD22461BF31D73C972188EF016C94589433C7B" + "183" "BE5068FF983622FC3367713EB15E6026888A131301F7C3A8CFF2E679B4AD2983899C9A24E21DD8FED096C5EE3D1AC125B1CCD07C90ADDCC27CE81860444A4E1A557ACE2E2144760C34F0ED008B0376AE687FBFB7A13AF80059252DFCA910B92045AA73D0B739095827C2C3A3C3EDF09234CE5A60345A0DE9BF3938E597CDEE5" + "184" "97D97962B76487361B42A25DBE3FF8178B1829D4DC05EF52E63FE37044E6B4632E4B8FD476EDC54B7BCEB44307C41C17862FCBB6C6879F586431E2D7A60061003A0E881418622BF7F6D6B4C5E7D60B04F0FE79359BB78646D59B0F71CE1174276C0B16F2B4D3770ECF761FC14E55CB21F186BC66644AEB66EBF0CB00A18287F" + "185" "EAB7FAF8B948E6C4A07DBB0D60EA098EAA80927F1AE1842F82E2957333B8862489B034A6379B528F53B219BDC60235F5EE6A5052D7D705928D250410A8C8A5F103181CAB82BED6FF2D4B6195930E3E4A9166CA22BC2477C3A1294A97C4C46D6EFFB39822E4A3ED5EC397E78851B3C572B95BF1D38D4B43B0C31E945234B428D" + "186" "7D9506301886DC65379E50FC6F406D14CDFC16597D0E0C57960E4A693352C6021788DF590696EB839122BD21967452FB215E3A0D438058C5E7C19678FD7023BD5C7C5DCA3A008959BD359283034649960371A8F55DB1516FB400C0790F256C8DA087BFB3425005B1625E6C1EB53A5727E6778CE7B9CDD6FFF72D98CDA30FCAB" + "187" "A6FE1893DC1E8E91CEFC2319AFC9336DB2C1515478D63D567B560E6BBE0C604ED815963A9C39C48A7398232B3597D0229EDB761D764638CA086CED643AC12C0E0D86A9EAD95D7F7AA8731FDCF03BE4467250DD6CF8F0461D0E6863705F17AB88A1B16B4A360CC3C87CFA065EFA61590D727C193B26C7183A038FF1EEA38CE14" + "188" "33F3A8E00513B9FFB329F622C03E4C98321BD86C7D76D202A96EEDB0D0E5E290996E48A32BE3C10F87C1C4FAEB8701D45C7C209E4CF0FC0FC4DCFC52D0B0452EF8436A29F85E59466DDE790B6D4A2728E24830990FD078AA354DEA0D9349F39C55F73AD333F9E9F05899B8EA5B717F5B0A6A9EF665D963F4E6CFF1757A4B0E6" + "189" "1E6568D20F21474146CE568F7AFD79B8732A7AD3BC308126ABC11574AB2A7928835BBD358952FC1A96E930426D390210735BE57529447697AA51303753662840268518D5B49F107CFD7F3438AA5E03C60288EBD0474F4852630199AFF2A74851E09123973359F8F1D0E3B12973251E921A62B44449A9D5C2F1B621610CE27EF" + "190" "9E932B4FD4C4C896F4C3AD41D0112DC66AF4A848216C9B0E5505B8BFAE2973340B949DCF113F5DDB19A4128ECB9B1A61C5B131444B18E175505E3DA2377AF8F262C9899437F23A2933D2DA9B658FE7CF578CACE015C13EFE64325B6B60FD39166BD9018B36BBDAD94FD81A8E7AAD81AE44EA91968A7E92D56A0508827F5E09E" + "191" "511E45532D6217DF9A16B8474E7D09A4F14330CDD2512D7F85EAC2B49D6281F92D1F61158C806C8055248E62699FB66A036FBE1C4271AE1C700B6476288DEE3C277341FE643BFEA7B7E4A7388D7F544720D60CC1F4C54ABB8D3E6D26A6EA209B714FBBB4451719CFE4BE4C0DEE18A4C7AED46360F1CE6FA8C9C4C55A8AD9933" + "192" "DA63B2157C69846F66D9711B7E1C8ED4697A1863008BF1ECAC54BF794DB0E220C608C484A101BA3E3CCE3B5AFE1064467CFC7F9DE3B6D0C3E914F1F5439378F4747323DFE96EAD599DB2444761325DAE22715D1E6FAC3B8C201EA08F54C6BD314F22C9AF09EC7C80E7F9123EEC6D6AE6EDE826FA687E65299F9ACE68BF7FA76" + "193" "9547F8EE098D3B88CED4E97224599EFDC631C67D6CB0035E424F87DFF1668C053177748817F71D38EDE6F612A42580FFF6B9AD29002D97D5DECB588D1313ABAA87B1EA0347ECC56241AA7627C5D5FF265E543E30216B3649FD3D08CB05185AF7BCF0486D31D0BC4EE3762FF7EC8475620B1317240B92B7FCFAD11A72971BAB2" + "194" "4DDBF46A5BD0BA021ADBB6C617A31BF60349A7F79E6D922DEBEB0219D251439E6FD490355A47EBE1380CC2C7A2862CE80F3F4C46E4FE224EE960C2DFA1111D13C92332E06467B80E80DF300F4C542A708798DC077FD21A0330C0AD8160A45042364EDE3E67D79172F280F3D9E8AB3FED5AEBB86C9D56A341EFD730FE8F9FEAA" + "195" "ECF8C17217AA40B23925C02B011FFE776FFF5CB2CCACA1C50576CA9F3EDBA1C7DD243EBA97823C1DDEA911371134BAB163ACE695F75A54227F2BD6AD94973C44205C06371C615F0E64A46F0C3A4AFB4ADEA494CBFA9D67545C83E9B9959FFEE7949B64557588036147B088E8888301F76A55E3E06C09A549EA9F6DB2CF6AE7A" + "196" "F26F3C4472EF25F4FA3CABBEB6CF2636EAA74B52F83C6235EDEC92C9A4016D7A9CAB4816786595B48FE2B3C95C331BFD6B2E7AEE878F0E3703413B2C5B5884F596FF5DE727899AAD819BCB6DCEEFA79B016192C26EAD493247FB809793BD507FF6A175B6A5D54C8A5261A2255F09B973BA5AE7191551471C500D02CA84BD0F7" + "197" "A46191F3FE32CA12669AB01C9FD0DFB4D0AB7DD072C1E38CFE9E26185D5D96C03EDD6F32685916882394A9844E6F5A21B57FCBE44385397F8E8330EA12518DA902A80A4305D7987D39471AAE966BEFE02F29C08379C3B42E0F1E79F854A9DD8CCABC1FEDC1C576A8A4F020E65F3EC27D43DCFC1C29D35AB6CB081C5BE821F20" + "198" "39DF83103D35680C0D2811032B86E1991E408C08B86403D55684D89ECC139620AF5FC35E89426193B33107B03C53D0C6E150EB99323D7896DF9246E0A4D283270F96FAB236486D94143971825E3D71ECCA04FD679BF08C62E1AE61E57697518CFFD0468957531656CCBAEDC2978AA1A819DE29463070A8382D069730FF844B0" + "199" "FA75B1202B76E34A110498B90A416BA337BEF3C2143A20DC2E3EB892203EB8F526DAA4F9AEDEF49FF6C63999B8439D1809A17EAE4AD255F29E3DAD9D2D14336169AB2D930FEAF5BB1EBA98B007ED15D2358C003B52E7EE3CE472E829B9B3EA1AC265E611F9BB600F6D8F1DB778A6A8ADD91355DE6AA3513A637CFC666C15E85" + "200" "2E25CB61BEDE6664FF5758CB46D5D53E1BC692CB8792FCDF2B6E2E9DEF55AFFE8E3B58E1E0970C78021334CA678CA4BF53A63A07C38D018C2E5DFD0F6102658588EC899EBCF7529D7493F981EFA62542288C3DF974AAB1E8E17B52AA5C25BE9EB409921220895D60251BAAC4C9650144F2759D3FCDD77200D553E3C8541D69D" + "201" "F911D04899ABE9BFD3C2C4EB00771C2624A45F2846ACD137721BBE54597CD708C6EAB19FF9B7139E29C13CFE04C4B1F10BCD24FF994941128B964936C342C51F5F4011AE71BD56113FE4B9B8CA2D9FFC66B9B648F8CA2A374114E449EFA18FC47B6AE6EDB65B6C421CA200FDDFC748A1ACA1309371E770B9F7A287477D2B93B" + "202" "4A6AA65FD54C88B0848F0ECEAF470E015F8858E993EF1E35A8EC5922A7E6BB8C7EFB262A4CC1D745C122D647F9033CE458173EADD9555CD92337525C493D3695E04213B5FFE0487C77EE6453514A0F7976F1084800BE47CCAC72A703401B62C518756B4AE1F50C9629BF46C0CAA0DAFD81744796FD6581899DE1D3CF1893B53" + "203" "77F5927CB7BF9C78E9B8FEFA5F3E1BE7B6E52484D2F4C3C294717C1177FE538F5FC007562C839ABA48C3852DB246FB213073CEFF4BA7" +} \ No newline at end of file diff --git a/scripts/npc/activelist.txt b/scripts/npc/activelist.txt new file mode 100755 index 0000000..414dc3d --- /dev/null +++ b/scripts/npc/activelist.txt @@ -0,0 +1,111 @@ +"whitelist" +{ + //"npc_dota_hero_ancient_apparition" "1" + //"npc_dota_hero_antimage" "1" + //"npc_dota_hero_axe" "1" + //"npc_dota_hero_bane" "1" + //"npc_dota_hero_beastmaster" "1" + //"npc_dota_hero_bloodseeker" "1" + //"npc_dota_hero_chen" "1" + //"npc_dota_hero_crystal_maiden" "1" + //"npc_dota_hero_dark_seer" "1" + //"npc_dota_hero_dazzle" "1" + //"npc_dota_hero_dragon_knight" "1" + //"npc_dota_hero_doom_bringer" "1" + //"npc_dota_hero_drow_ranger" "1" + //"npc_dota_hero_earthshaker" "1" + //"npc_dota_hero_enchantress" "1" + //"npc_dota_hero_enigma" "1" + //"npc_dota_hero_faceless_void" "1" + //"npc_dota_hero_furion" "1" + "npc_dota_hero_juggernaut" "1" + //"npc_dota_hero_kunkka" "1" + //"npc_dota_hero_leshrac" "1" + //"npc_dota_hero_lich" "1" + //"npc_dota_hero_life_stealer" "1" + "npc_dota_hero_lina" "1" + //"npc_dota_hero_lion" "1" + //"npc_dota_hero_mirana" "1" + //"npc_dota_hero_morphling" "1" + //"npc_dota_hero_necrolyte" "1" + //"npc_dota_hero_nevermore" "1" + //"npc_dota_hero_night_stalker" "1" + //"npc_dota_hero_omniknight" "1" + //"npc_dota_hero_puck" "1" + //"npc_dota_hero_pudge" "1" + //"npc_dota_hero_pugna" "1" + //"npc_dota_hero_rattletrap" "1" + //"npc_dota_hero_razor" "1" + //"npc_dota_hero_riki" "1" + //"npc_dota_hero_sand_king" "1" + //"npc_dota_hero_shadow_shaman" "1" + //"npc_dota_hero_slardar" "1" + //"npc_dota_hero_sniper" "1" + //"npc_dota_hero_spectre" "1" + //"npc_dota_hero_storm_spirit" "1" + //"npc_dota_hero_sven" "1" + //"npc_dota_hero_tidehunter" "1" + //"npc_dota_hero_tinker" "1" + //"npc_dota_hero_tiny" "1" + //"npc_dota_hero_vengefulspirit" "1" + //"npc_dota_hero_venomancer" "1" + //"npc_dota_hero_viper" "1" + //"npc_dota_hero_weaver" "1" + //"npc_dota_hero_windrunner" "1" + //"npc_dota_hero_witch_doctor" "1" + //"npc_dota_hero_zuus" "1" + //"npc_dota_hero_broodmother" "1" + //"npc_dota_hero_skeleton_king" "1" + //"npc_dota_hero_queenofpain" "1" + //"npc_dota_hero_huskar" "1" + //"npc_dota_hero_jakiro" "1" + //"npc_dota_hero_batrider" "1" + //"npc_dota_hero_warlock" "1" + //"npc_dota_hero_alchemist" "1" + //"npc_dota_hero_death_prophet" "1" + //"npc_dota_hero_ursa" "1" + //"npc_dota_hero_bounty_hunter" "1" + //"npc_dota_hero_silencer" "1" + //"npc_dota_hero_spirit_breaker" "1" + //"npc_dota_hero_invoker" "1" + //"npc_dota_hero_clinkz" "1" + //"npc_dota_hero_obsidian_destroyer" "1" + //"npc_dota_hero_shadow_demon" "1" + //"npc_dota_hero_lycan" "1" + //"npc_dota_hero_lone_druid" "1" + //"npc_dota_hero_brewmaster" "1" + //"npc_dota_hero_phantom_lancer" "1" + //"npc_dota_hero_treant" "1" + //"npc_dota_hero_ogre_magi" "1" + //"npc_dota_hero_chaos_knight" "1" + //"npc_dota_hero_phantom_assassin" "1" + //"npc_dota_hero_gyrocopter" "1" + //"npc_dota_hero_rubick" "1" + //"npc_dota_hero_luna" "1" + //"npc_dota_hero_wisp" "1" + //"npc_dota_hero_disruptor" "1" + //"npc_dota_hero_undying" "1" + //"npc_dota_hero_templar_assassin" "1" + //"npc_dota_hero_naga_siren" "1" + //"npc_dota_hero_nyx_assassin" "1" + //"npc_dota_hero_keeper_of_the_light" "1" + //"npc_dota_hero_visage" "1" + //"npc_dota_hero_meepo" "1" + //"npc_dota_hero_magnataur" "1" + //"npc_dota_hero_centaur" "1" + //"npc_dota_hero_slark" "1" + //"npc_dota_hero_shredder" "1" + //"npc_dota_hero_medusa" "1" + //"npc_dota_hero_troll_warlord" "1" + //"npc_dota_hero_tusk" "1" + //"npc_dota_hero_bristleback" "1" + //"npc_dota_hero_skywrath_mage" "1" + //"npc_dota_hero_elder_titan" "1" + //"npc_dota_hero_abaddon" "1" + //"npc_dota_hero_earth_spirit" "1" + //"npc_dota_hero_ember_spirit" "1" + //"npc_dota_hero_legion_commander" "1" + //"npc_dota_hero_phoenix" "1" + //"npc_dota_hero_terrorblade" "1" + //"npc_dota_hero_monkey_king" "1" +} \ No newline at end of file diff --git a/scripts/npc/attack_factor.txt b/scripts/npc/attack_factor.txt new file mode 100755 index 0000000..741e1f9 --- /dev/null +++ b/scripts/npc/attack_factor.txt @@ -0,0 +1,5 @@ +attack_factor +{ + "1" "C5ACAE5EA4FA4DB1C3194781EC03FEFC9A727ADDD3E567EF7D34E6A90230B37E73896FF0982A84D11BD6C3C10D71D3962612175397DA3194CAD6177EE789846B6A1110DD4ED3D364703377F2669A1939DFB88989BAFC85F4064CFB72C85A4E2157AF0014B0A4973FD8B22E8D73A9785F168BB1D425C0F0F789F0C305F67DC31" + "2" "A7307B5D9E379266D0641FEA9AC33CABB919C599DE68D26F1EF5977D845CF4D05C07B3B7E9151AE246D71CC509955BCC58997EE629225277DFDB8AA7E30CFFD56D554F986DB3B741CC376B0F97B6C6CCF0D52666426A3FD0BE620613B0C2C5156BB2F85B4CFC7022F69B22E9271B91DE6A3920FBB5B" +} \ No newline at end of file diff --git a/scripts/npc/combo_table.txt b/scripts/npc/combo_table.txt new file mode 100755 index 0000000..60201ad --- /dev/null +++ b/scripts/npc/combo_table.txt @@ -0,0 +1,12 @@ +combo_table +{ + "1" "C5ACAE4FA8E657B7F5557BDBA854AAF79C686A95DFFF7DEF344EF7BF4764F8502D8629F7C618CD8423869A83513CD7C2340C0B4197DA319480DF5037D1C7916D7E5B49DD608F893F3C7E0BA827AE552FC5EAB9C1D4A0D5B12E0EF339F40951744BE72844F4AD8E34F1F02C9F71A22D4D4FF7CB9E6585CCB783E0E818A44D974" + "2" "A7A6FA4F9E3772171064FB591B62EC3FCC8AA1789B5837FC2A71253971D821976F7293E7A8B5E946E553E9117C25EBADF82D1F67888233170B3B3D02F758FAE109828F2CDDF327F57F725A7A80C1027D0165D2A5644FAB65DAB0F2F3B52104B70A174DEEF88F3027A3BA33E9A7FEA29BAB4C111D50190129CFD79867EE4FCDE" + "3" "FFBF55A0305E7879050537DF3CF67AE26AEC9C4D15A9B91093143672C21C7597DC249D2BBE4FA15FC0D22E776056B6DF59DFD5D97DD59A5C454D71FCDB54BB483086786008BC52AABDD322B9BB2790DC908719F098A7A3B120D08521A1561345FC1AFB6C12DD616764CAE6FA637928093BA4FF008B4EA9899044339980FFFAE" + "4" "EF9B58A74F6B0F32B25735BC4C29AAAE97CD7AF0CE840B21F6B40D7AE4B386C004AE8811C664C5FAAFE72D1BEE49F7D05D9CB17DC20BECECC793C718B489C2A8C381AE38DF0CA26381C7E636702A76E1C79E9F72CBC73D9BDABD3195BE17494A0EFCC5EAD6A1C0BD7499CFFA6A9823191875F6C9CD23AA096764160F26037B9" + "5" "B1B5DA44B16742E17105DCD3BE007C52192EFEB5AD485F24C403909D879BA4727A6F49B75678A349BEDBC2CC3FFDB7D6511F3E291962B53F799D708F154A2003593849F63AF6A244B7F946628AD63EC331E7929900F214FE83B647FC9C8661A7A744A23777B9FF90CD044D10E8C79CAB4D1BA619C49756A58614C9C383E7DCD" + "6" "50173DC447D42699A3BD95404CE01A47DA45C4F1D5E5F2CA674CC96A3955D0A0A0AD75ADDE6D0E85CA9937C8780A089E1BAD836681346CAE1ECB7C159488F7052A172D8547D9EF7831A1C879B40BD6D8EFEE0F83DCC87A0F7C266C77645F1A8E3F08788B8134BA4A20B667EBC72939D2DCCBA822CBA96F900E4898FB0AEF29B" + "7" "75475056CA493E414381123068CC198E22C94FFB83899BDEE5673D178CD330CE503774DBB509A74236BE768CC6ECB9E0FD87B112586168A4BC7A46FF688419FCD338647A9E5AEEC0C771CB2ADB77DE888F66778C869FD0585C395E6CDD14F7D4EBA1025081459A4D84E9A3064AF2CE60330A4F1E8B6AA65944DA6BFF2CC7AB9" + "8" "65D3A8D7DE9D087F5A872D49DB8F77BF31234D6A86BE74AD24FA255CE721336C2E6CE14C74DF317F77DF41285D651B5A48322808022D6D0B65CEE720C9E21A38BD4AA587F3DB63443170357EF32636AF141B07289D3D6BA3E276F4F2BFB03FADAEA03FEE483F4FE6070CB0DAF869F10F460E8ADB8A38311391900D789E57B30" + "9" "EFA946ECF356B0579C4F3F9F48AC2CC49C1ED75EB85CB6C0C506AC01FCEF1D879D7395E726625337737D055536D67816B563F6547D58ABCA6C" +} \ No newline at end of file diff --git a/scripts/npc/config.txt b/scripts/npc/config.txt new file mode 100755 index 0000000..cee2a08 --- /dev/null +++ b/scripts/npc/config.txt @@ -0,0 +1,6 @@ +config +{ + "1" "C5ACAE4BA5F957B78D63279BEA1BFEE6F064288A8AAF38B5625FEFA01422B37E73927CE6B822849D028A878E1F00B5963D130A48CCD24398D5C91364929FC832314B5DC02BDEDA726A7E5CBC24A71338C1B8F8EFACB5D1B53828F27ACC13776E15FC325CE9E5D734AFCE629966A04D510EC9AF86798AC2B7C8D88A4DB9548A5" + "2" "B671DB6B3EA31622E4F19ECC2BF35DCB485F746D0BD9F23F0AF394B8811A21747FD35373CD464EC764220AD12CD008290BD97EE60DD176F36FCEB83333ACEE052D73EEFDC9C66380DB07CB8EF187B38824C52315034C2BF5FB31E341E1439172CAA458CF491F0753A7DB23E8B5CFF33BED7DD49EF01A14ACFE174AD6DB7A19F" + "3" "A1B639AC7D572A2541456FC02AE926BF26B7841A01AAB25B80083A6DF5227F87F3249B23BE6F" +} \ No newline at end of file diff --git a/scripts/npc/npc_abilities_custom.txt b/scripts/npc/npc_abilities_custom.txt new file mode 100755 index 0000000..6e5edb8 --- /dev/null +++ b/scripts/npc/npc_abilities_custom.txt @@ -0,0 +1,739 @@ +#base "abilities/tower_abilities.kv" +#base "abilities/effect_abilities.kv" +// Dota Heroes File +"DOTAAbilities" +{ + "Version" "1" + + "ability_dummy_unit" + { + "ID" "9001" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "custom/rubick_empty1" + "Modifiers" + { + "dummy_unit" + { + "Passive" "1" + "IsHidden" "1" + "States" + { + "MODIFIER_STATE_ATTACK_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_UNSELECTABLE" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + } + "Properties" + { + "MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE" "-100" + } + } + } + } + + "ability_shop" + { + "ID" "9002" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "custom/rubick_empty1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE | DOTA_ABILITY_BEHAVIOR_HIDDEN" + "AbilityType" "DOTA_ABILITY_TYPE_HIDDEN" + "MaxLevel" "1" + + // "Modifiers" + // { + // "shop_unit" + // { + // "Passive" "1" + // "IsHidden" "1" + // "States" + // { + // "MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + // "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + // "MODIFIER_STATE_NO_UNIT_COLLISION" "MODIFIER_STATE_VALUE_ENABLED" + // "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + // } + // } + // } + } + + "ability_touhoutd_release_tower" + { + "ID" "9003" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/release_tower" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "0" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/econ/items/clockwerk/clockwerk_paraflare/clockwerk_para_rocket_flare_explosion.vpcf" + "particle" "particles/heroes/alice/ability_alice_ex_release.vpcf" + "soundfile" "soundevents/thdots_hero_sounds/thdots_alice_sounds.vsndevts" + } + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Sound_THTD.ability_touhoutd_release_tower" + "Target" "CASTER" + } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnTouhouReleaseTowerSpellStart" + "Target" "TARGET" + } + } + } + + "ability_touhoutd_blink" + { + "ID" "9004" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/blink" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityManaCost" "0" + "MaxLevel" "1" + "AbilityCooldown" "0" + + "OnSpellStart" + { + "FireSound" + { + "EffectName" "Sound_THTD.ability_touhoutd_blink.Start" + "Target" "CASTER" + } + + "FireSound" + { + "EffectName" "Sound_THTD.ability_touhoutd_blink" + "Target" "CASTER" + } + + "RunScript" + { + "Target" "POINT" + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "BlinkToPoint" + } + } + } + + "ability_touhoutd_kill" + { + "ID" "9005" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "ability_collection_power" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY" + "AbilityUnitDamageType" "DAMAGE_TYPE_PURE" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "50.0" + "AbilityManaCost" "0" + + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnKillUnitSpellStart" + "Target" "TARGET" + } + } + } + + "ability_touhoutd_ex_up" + { + "ID" "9006" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/power_buff" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "MaxLevel" "1" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + "AbilityCooldown" "0" + "AbilityManaCost" "0" + // Stats + // ---------------------------------------------------------------- + "AbilityCastRange" "1000" + + "precache" + { + "particle" "particles/econ/items/clockwerk/clockwerk_paraflare/clockwerk_para_rocket_flare_explosion.vpcf" + } + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnTouhoutdExUp" + "Target" "TARGET" + } + } + + "Modifiers" + { + "modifier_hero_effect_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "9.0" + + "States" + { + //"MODIFIER_STATE_NOT_ON_MINIMAP" "MODIFIER_STATE_VALUE_ENABLED" + "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED" + } + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnIntervalThinkHeroEffect" + } + } + } + } + } + + "ability_touhoutd_buy_normal_card" + { + "ID" "9008" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/buy_normal_card" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCooldown" "0.3" + "MaxLevel" "1" + "AbilityManaCost" "0" + "AbilityGoldCost" "500" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "DrawNormalCard" + } + } + } + + "ability_touhoutd_buy_senior_card" + { + "ID" "9009" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/buy_senior_card" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCooldown" "0.3" + "MaxLevel" "1" + "AbilityManaCost" "0" + "AbilityGoldCost" "2500" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "DrawSeniorCard" + } + } + } + + "ability_touhoutd_sort_item" + { + "ID" "9509" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/sort_item" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityCooldown" "5.0" + "MaxLevel" "1" + "AbilityManaCost" "0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "SortItem" + } + } + } + + "ability_touhoutd_shop_wave_1" + { + "ID" "9010" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "item_3018" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityCooldown" "2.0" + "MaxLevel" "1" + "AbilityManaCost" "0" + "AbilityGoldCost" "10000" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "SkipWave" + "AddWave" "%add_wave" + "ItemName" "初级异变" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cost" "10000" + } + "02" + { + "var_type" "FIELD_INTEGER" + "add_wave" "20" + } + } + } + + "ability_touhoutd_shop_wave_2" + { + "ID" "9510" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "item_3031" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_AUTOCAST" + "AbilityCooldown" "2.0" + "MaxLevel" "2" + "AbilityManaCost" "0" + "AbilityGoldCost" "30000 0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "SkipWave" + "AddWave" "%add_wave" + "ItemName" "高级异变" + } + } + + "Modifiers" + { + "modifier_shop_wave_2_autocast_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "0.15" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnIntervalThinkAutoCast" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cost" "30000 0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "count" "0 1" + } + "03" + { + "var_type" "FIELD_INTEGER" + "add_wave" "100" + } + } + } + + "ability_touhoutd_shop_wave_3" + { + "ID" "9610" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "item_3011" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_AUTOCAST" + "AbilityCooldown" "2.0" + "MaxLevel" "2" + "AbilityManaCost" "0" + "AbilityGoldCost" "90000 0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "SkipWave" + "AddWave" "%add_wave" + "ItemName" "终级异变" + } + } + + "Modifiers" + { + "modifier_shop_wave_3_autocast_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "0.15" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnIntervalThinkAutoCast" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cost" "90000 0" + } + "02" + { + "var_type" "FIELD_INTEGER" + "count" "0 3" + } + "03" + { + "var_type" "FIELD_INTEGER" + "add_wave" "500" + } + } + } + + "ability_touhoutd_shop_roll" + { + "ID" "9511" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/shop_roll" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCooldown" "5.0" + "MaxLevel" "3" + "AbilityManaCost" "0" + "AbilityGoldCost" "2000" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "RollCard" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "card_count" "3 4 5" + } + "02" + { + "var_type" "FIELD_INTEGER" + "cost" "2000" + } + } + } + + "ability_touhoutd_shop_buy_egg_level_1" + { + "ID" "9012" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/buy_egg_level_1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCooldown" "0.3" + "MaxLevel" "1" + "AbilityManaCost" "0" + "AbilityGoldCost" "1000" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "BuyEgg" + "item_name" "item_1003" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cost" "1000" + } + } + } + + "ability_touhoutd_shop_buy_egg_level_2" + { + "ID" "9013" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/buy_egg_level_2" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCooldown" "0.3" + "MaxLevel" "1" + "AbilityManaCost" "0" + "AbilityGoldCost" "1800" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "BuyEgg" + "item_name" "item_1004" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cost" "1800" + } + } + } + + "ability_touhoutd_shop_buy_egg_level_3" + { + "ID" "9014" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/buy_egg_level_3" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCooldown" "0.3" + "MaxLevel" "1" + "AbilityManaCost" "0" + "AbilityGoldCost" "7200" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "BuyEgg" + "item_name" "item_1005" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cost" "7200" + } + } + } + + "ability_touhoutd_shop_buy_egg_level_4" + { + "ID" "9015" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/buy_egg_level_4" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCooldown" "0.3" + "MaxLevel" "1" + "AbilityManaCost" "0" + "AbilityGoldCost" "35000" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "BuyEgg" + "item_name" "item_1006" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "cost" "35000" + } + } + } + + "ability_touhoutd_close_star" + { + "ID" "9016" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/close_star" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCooldown" "1" + "MaxLevel" "1" + "AbilityManaCost" "0" + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "CloseStar" + } + } + } + + "ability_touhoutd_star_up" + { + "ID" "9017" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/star_up" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCooldown" "1" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "StarUp" + } + } + } + + "ability_touhoutd_exp_up" + { + "ID" "9018" + "BaseClass" "ability_datadriven" + "AbilityTextureName" "touhoutd/exp_up" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCooldown" "1" + // Stats + // ---------------------------------------------------------------- + "AbilityManaCost" "0" + + "OnSpellStart" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "ExpUp" + } + } + } + + "tt1" + { + "ID" "9032" + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + } + + "tt2" + { + "ID" "9033" + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + } + + "tt3" + { + "ID" "9034" + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + } + + "tt4" + { + "ID" "9035" + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + } + + "tt5" + { + "ID" "9036" + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + } + + "tt6" + { + "ID" "9037" + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + } + + "tt7" + { + "ID" "9038" + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + } + + "tt8" + { + "ID" "9039" + "BaseClass" "ability_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityType" "DOTA_ABILITY_TYPE_ATTRIBUTES" + } +} diff --git a/scripts/npc/npc_abilities_override.txt b/scripts/npc/npc_abilities_override.txt new file mode 100755 index 0000000..1d707c0 --- /dev/null +++ b/scripts/npc/npc_abilities_override.txt @@ -0,0 +1,436 @@ +"DOTAAbilities" +{ + // 不能附加原技能不存在的属性 + + //================================================================================================================= + // Luna: Moon Glaives + //================================================================================================================= + "luna_moon_glaive" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5223" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "AbilitySound" "Hero_Luna.MoonGlaive.Impact" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "range" "500" + } + "02" + { + "var_type" "FIELD_INTEGER" + "bounces" "6 6 6 6" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_reduction_percent" "35" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_2" + } + + //================================================================================================================= + // Death Prophet: Exorcism + //================================================================================================================= + "death_prophet_exorcism" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5093" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_NO" + "FightRecapLevel" "2" + "AbilitySound" "Hero_DeathProphet.Exorcism.Cast" + + // Casting + //------------------------------------------------------------------------------------------------------------- + "AbilityCastPoint" "0.2" + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_4" + + // Time + //------------------------------------------------------------------------------------------------------------- + "AbilityCooldown" "30" + "AbilityDuration" "30" + + // Cost + //------------------------------------------------------------------------------------------------------------- + "AbilityManaCost" "0" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "radius" "1000" + } + "02" + { + "var_type" "FIELD_INTEGER" + "spirits" "5 10 15 20 30" + "LinkedSpecialBonus" "special_bonus_unique_death_prophet" + } + "03" + { + "var_type" "FIELD_INTEGER" + "spirit_speed" "750" + } + "04" + { + "var_type" "FIELD_INTEGER" + "max_distance" "2000" + } + "05" + { + "var_type" "FIELD_INTEGER" + "give_up_distance" "2000" + } + "06" + { + "var_type" "FIELD_INTEGER" + "min_damage" "750" + } + "07" + { + "var_type" "FIELD_INTEGER" + "max_damage" "750" + } + "08" + { + "var_type" "FIELD_INTEGER" + "heal_percent" "4" + } + "09" + { + "var_type" "FIELD_INTEGER" + "average_damage" "750" + } + "10" + { + "var_type" "FIELD_FLOAT" + "ghost_spawn_rate" "0.15" + } + } + } + + + //================================================================================================================= + // Faceless Void: Time Lock + //================================================================================================================= + "faceless_void_time_lock" + { + // General + //------------------------------------------------------------------------------------------------------------- + "ID" "5184" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats. + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL" + "SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES" + "SpellDispellableType" "SPELL_DISPELLABLE_YES_STRONG" + "AbilitySound" "Hero_FacelessVoid.TimeLockImpact" + + // Stats + //------------------------------------------------------------------------------------------------------------- + "AbilityModifierSupportBonus" "25" + + // Special + //------------------------------------------------------------------------------------------------------------- + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_FLOAT" + "duration" "1.0" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_creep" "2.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "chance_pct" "5 10" + } + "04" + { + "var_type" "FIELD_INTEGER" + "bonus_damage" "20" + "LinkedSpecialBonus" "special_bonus_unique_faceless_void_3" + } + } + "AbilityCastAnimation" "ACT_DOTA_CAST_ABILITY_3" + } + + + "item_recipe_hand_of_midas" "REMOVE" + "item_mithril_hammer" "REMOVE" + "item_yasha" "REMOVE" + "item_diffusal_blade_2" "REMOVE" + "item_black_king_bar" "REMOVE" + "item_recipe_dagon_4" "REMOVE" + "item_wind_lace" "REMOVE" + "item_helm_of_the_dominator" "REMOVE" + "item_ogre_axe" "REMOVE" + "item_diffusal_blade" "REMOVE" + "item_relic" "REMOVE" + "item_recipe_satanic" "REMOVE" + "item_octarine_core" "REMOVE" + "item_recipe_vladmir" "REMOVE" + "item_lifesteal" "REMOVE" + "item_point_booster" "REMOVE" + "item_iron_talon" "REMOVE" + "item_dragon_lance" "REMOVE" + "item_sobi_mask" "REMOVE" + "item_magic_wand" "REMOVE" + "item_recipe_monkey_king_bar" "REMOVE" + "item_buckler" "REMOVE" + "item_tango_single" "REMOVE" + "item_recipe_veil_of_discord" "REMOVE" + "item_boots" "REMOVE" + "item_recipe_sheepstick" "REMOVE" + "item_recipe_crimson_guard" "REMOVE" + "item_recipe_ring_of_basilius" "REMOVE" + "item_river_painter4" "REMOVE" + "item_hurricane_pike" "REMOVE" + "item_cheese" "REMOVE" + "item_magic_stick" "REMOVE" + "item_wraith_band" "REMOVE" + "item_oblivion_staff" "REMOVE" + "item_recipe_ancient_janggo" "REMOVE" + "item_sphere" "REMOVE" + "item_invis_sword" "REMOVE" + "item_recipe_ward_dispenser" "REMOVE" + "item_dagon_4" "REMOVE" + "item_mantle" "REMOVE" + "item_recipe_rapier" "REMOVE" + "item_ethereal_blade" "REMOVE" + "item_recipe_helm_of_the_dominator" "REMOVE" + "item_dagon" "REMOVE" + "item_blades_of_attack" "REMOVE" + "item_tranquil_boots" "REMOVE" + "item_belt_of_strength" "REMOVE" + "item_recipe_iron_talon" "REMOVE" + "item_recipe_hood_of_defiance" "REMOVE" + "item_radiance" "REMOVE" + "item_recipe_travel_boots" "REMOVE" + "item_recipe_refresher" "REMOVE" + "item_blight_stone" "REMOVE" + "item_dagon_2" "REMOVE" + "item_greater_crit" "REMOVE" + "item_chainmail" "REMOVE" + "item_helm_of_iron_will" "REMOVE" + "item_recipe_heavens_halberd" "REMOVE" + "item_recipe_radiance" "REMOVE" + "item_guardian_greaves" "REMOVE" + "item_refresher" "REMOVE" + "item_recipe_abyssal_blade" "REMOVE" + "item_echo_sabre" "REMOVE" + "item_glimmer_cape" "REMOVE" + "item_bfury" "REMOVE" + "item_river_painter" "REMOVE" + "item_broadsword" "REMOVE" + "item_river_painter2" "REMOVE" + "item_vitality_booster" "REMOVE" + "item_cyclone" "REMOVE" + "item_recipe_sange" "REMOVE" + "item_recipe_necronomicon" "REMOVE" + "item_recipe_octarine_core" "REMOVE" + "item_headdress" "REMOVE" + "item_heavens_halberd" "REMOVE" + "item_recipe_bloodstone" "REMOVE" + "item_recipe_butterfly" "REMOVE" + "item_gloves" "REMOVE" + "item_arcane_boots" "REMOVE" + "item_null_talisman" "REMOVE" + "item_recipe_urn_of_shadows" "REMOVE" + "item_lesser_crit" "REMOVE" + "item_dust" "REMOVE" + "item_orb_of_venom" "REMOVE" + "item_blade_of_alacrity" "REMOVE" + "item_staff_of_wizardry" "REMOVE" + "item_sange" "REMOVE" + "item_recipe_aether_lens" "REMOVE" + "item_infused_raindrop" "REMOVE" + "item_reaver" "REMOVE" + "item_shadow_amulet" "REMOVE" + "item_dagon_5" "REMOVE" + "item_rod_of_atos" "REMOVE" + "item_ward_sentry" "REMOVE" + "item_necronomicon_2" "REMOVE" + "item_boots_of_elves" "REMOVE" + "item_hyperstone" "REMOVE" + "item_recipe_lesser_crit" "REMOVE" + "item_recipe_bracer" "REMOVE" + "item_cloak" "REMOVE" + "item_platemail" "REMOVE" + "item_energy_booster" "REMOVE" + "item_ward_observer" "REMOVE" + "item_recipe_maelstrom" "REMOVE" + "item_blade_mail" "REMOVE" + "item_recipe_rod_of_atos" "REMOVE" + "item_recipe_dagon_5" "REMOVE" + "item_crimson_guard" "REMOVE" + "item_flask" "REMOVE" + "item_recipe_ring_of_aquila" "REMOVE" + "item_travel_boots" "REMOVE" + "item_mystic_staff" "REMOVE" + "item_recipe_tranquil_boots" "REMOVE" + "item_recipe_phase_boots" "REMOVE" + "item_lotus_orb" "REMOVE" + "item_recipe_blade_mail" "REMOVE" + "item_bloodstone" "REMOVE" + "item_recipe_diffusal_blade_2" "REMOVE" + "item_recipe_vanguard" "REMOVE" + "item_recipe_magic_wand" "REMOVE" + "item_aether_lens" "REMOVE" + "item_demon_edge" "REMOVE" + "item_recipe_necronomicon_2" "REMOVE" + "item_void_stone" "REMOVE" + "item_recipe_black_king_bar" "REMOVE" + "item_clarity" "REMOVE" + "item_bracer" "REMOVE" + "item_butterfly" "REMOVE" + "item_pers" "REMOVE" + "item_aegis" "REMOVE" + "item_river_painter5" "REMOVE" + "item_recipe_shivas_guard" "REMOVE" + "item_soul_ring" "REMOVE" + "item_phase_boots" "REMOVE" + "item_bottle" "REMOVE" + "item_recipe_wraith_band" "REMOVE" + "item_recipe_poor_mans_shield" "REMOVE" + "item_river_painter3" "REMOVE" + "item_pipe" "REMOVE" + "item_sange_and_yasha" "REMOVE" + "item_faerie_fire" "REMOVE" + "item_ring_of_health" "REMOVE" + "item_recipe_ethereal_blade" "REMOVE" + "item_recipe_medallion_of_courage" "REMOVE" + "item_circlet" "REMOVE" + "item_ghost" "REMOVE" + "item_recipe_orchid" "REMOVE" + "item_recipe_echo_sabre" "REMOVE" + "item_recipe_basher" "REMOVE" + "item_ward_dispenser" "REMOVE" + "item_recipe_bloodthorn" "REMOVE" + //"item_courier" "REMOVE" + "item_talisman_of_evasion" "REMOVE" + "item_shivas_guard" "REMOVE" + "item_recipe_skadi" "REMOVE" + "item_recipe_silver_edge" "REMOVE" + "item_quarterstaff" "REMOVE" + "item_river_painter7" "REMOVE" + "item_assault" "REMOVE" + "item_recipe_invis_sword" "REMOVE" + "item_sheepstick" "REMOVE" + "item_river_painter6" "REMOVE" + "item_recipe_dagon_3" "REMOVE" + "item_robe" "REMOVE" + "item_recipe_force_staff" "REMOVE" + "item_smoke_of_deceit" "REMOVE" + "item_recipe_cyclone" "REMOVE" + "item_claymore" "REMOVE" + "item_dagon_3" "REMOVE" + "item_travel_boots_2" "REMOVE" + "item_recipe_diffusal_blade" "REMOVE" + "item_recipe_pipe" "REMOVE" + "item_vladmir" "REMOVE" + "item_urn_of_shadows" "REMOVE" + "item_heart" "REMOVE" + "item_recipe_glimmer_cape" "REMOVE" + "item_force_staff" "REMOVE" + "item_javelin" "REMOVE" + "item_recipe_guardian_greaves" "REMOVE" + "item_ring_of_regen" "REMOVE" + "item_blink" "REMOVE" + "item_branches" "REMOVE" + "item_recipe_null_talisman" "REMOVE" + "item_recipe_assault" "REMOVE" + "item_ring_of_protection" "REMOVE" + "item_eagle" "REMOVE" + "item_medallion_of_courage" "REMOVE" + "item_skadi" "REMOVE" + "item_recipe_yasha" "REMOVE" + "item_silver_edge" "REMOVE" + "item_recipe_dragon_lance" "REMOVE" + //"item_tpscroll" "REMOVE" + "item_tango" "REMOVE" + "item_recipe_pers" "REMOVE" + "item_recipe_travel_boots_2" "REMOVE" + "item_orchid" "REMOVE" + "item_ring_of_basilius" "REMOVE" + "item_ultimate_orb" "REMOVE" + "item_gauntlets" "REMOVE" + "item_bloodthorn" "REMOVE" + "item_recipe_soul_booster" "REMOVE" + "item_recipe_arcane_boots" "REMOVE" + "item_recipe_headdress" "REMOVE" + "item_recipe_soul_ring" "REMOVE" + "item_satanic" "REMOVE" + "item_recipe_mjollnir" "REMOVE" + //"item_flying_courier" "REMOVE" + "item_quelling_blade" "REMOVE" + //"item_enchanted_mango" "REMOVE" + "item_manta" "REMOVE" + "item_mjollnir" "REMOVE" + "item_recipe_necronomicon_3" "REMOVE" + "item_necronomicon_3" "REMOVE" + "item_recipe_power_treads" "REMOVE" + "item_poor_mans_shield" "REMOVE" + "item_moon_shard" "REMOVE" + "item_recipe_ultimate_scepter" "REMOVE" + "item_ultimate_scepter" "REMOVE" + "item_necronomicon" "REMOVE" + "item_power_treads" "REMOVE" + "item_recipe_sphere" "REMOVE" + "item_recipe_lotus_orb" "REMOVE" + "item_vanguard" "REMOVE" + "item_recipe_mekansm" "REMOVE" + "item_recipe_heart" "REMOVE" + "item_recipe_dagon" "REMOVE" + "item_veil_of_discord" "REMOVE" + "item_tome_of_knowledge" "REMOVE" + "item_recipe_hurricane_pike" "REMOVE" + "item_solar_crest" "REMOVE" + "item_soul_booster" "REMOVE" + "item_hood_of_defiance" "REMOVE" + "item_rapier" "REMOVE" + "item_mekansm" "REMOVE" + "item_mask_of_madness" "REMOVE" + "item_recipe_armlet" "REMOVE" + "item_recipe_buckler" "REMOVE" + "item_recipe_bfury" "REMOVE" + "item_hand_of_midas" "REMOVE" + "item_maelstrom" "REMOVE" + "item_recipe_desolator" "REMOVE" + "item_monkey_king_bar" "REMOVE" + "item_recipe_dagon_2" "REMOVE" + "item_gem" "REMOVE" + "item_armlet" "REMOVE" + "item_abyssal_blade" "REMOVE" + "item_recipe_sange_and_yasha" "REMOVE" + "item_recipe_greater_crit" "REMOVE" + "item_stout_shield" "REMOVE" + "item_recipe_mask_of_madness" "REMOVE" + "item_slippers" "REMOVE" + "item_basher" "REMOVE" + "item_recipe_manta" "REMOVE" + "item_ancient_janggo" "REMOVE" + "item_recipe_solar_crest" "REMOVE" + "item_recipe_oblivion_staff" "REMOVE" + "item_recipe_moon_shard" "REMOVE" + "item_desolator" "REMOVE" + "item_ring_of_aquila" "REMOVE" +} \ No newline at end of file diff --git a/scripts/npc/npc_heroes_custom.txt b/scripts/npc/npc_heroes_custom.txt new file mode 100755 index 0000000..3822def --- /dev/null +++ b/scripts/npc/npc_heroes_custom.txt @@ -0,0 +1,202 @@ +// Dota Heroes File +// NOTE: This is not for creating new heroes, this is for taking a currently existing hero as a template and overriding +// the specified key-value combinations. Use override_hero for this. +"DOTAHeroes" +{ + "npc_dota_hero_reimu" + { + "override_hero" "npc_dota_hero_lina" + "AbilityLayout" "1" + "Ability1" "ability_touhoutd_release_tower" + "Ability2" "ability_touhoutd_blink" + "Ability3" "ability_touhoutd_kill" + "Ability4" "ability_touhoutd_buy_normal_card" + "Ability5" "ability_touhoutd_buy_senior_card" + "Ability6" "ability_touhoutd_ex_up" + "Ability7" "ability_touhoutd_sort_item" + "Ability8" "ability_touhoutd_close_star" + "Ability9" "generic_hidden" + "Ability10" "generic_hidden" + "Ability11" "generic_hidden" + "Ability12" "generic_hidden" + "Ability13" "generic_hidden" + "Ability14" "generic_hidden" + "Ability15" "generic_hidden" + "Ability16" "generic_hidden" + "Ability17" "tt7" + "Ability18" "tt8" + "Ability19" "tt5" + "Ability20" "tt6" + "Ability21" "tt3" + "Ability22" "tt4" + "Ability23" "tt1" + "Ability24" "tt2" + + + //"Carry" "核心" + //"Support" "辅助" + //"Nuker" "爆发" + //"Disabler" "控制" + //"Jungler" "打野" + //"Durable" "耐久" + //"Escape" "逃生" + //"LaneSupport" "对线辅助" + //"Pusher" "推进" + //"Initiator" "先手" + //"Role" "Carry,Support,Nuker,Disabler,Jungler,Durable,Escape,LaneSupport,Pusher,Initiator" + + "Role" "Carry,Nuker,Disabler,Jungler,Escape,Pusher,Initiator" + "Rolelevels" "1,3,2,1,0,1,2" + "ModelScale" "1.4" + "HealthBarOffset" "320" + "MinimapIcon" "npc_dota_hero_lina" + + "Model" "models/new_touhou_model/reimu/reimu.vmdl" + + "AttackAnimationPoint" "0.1" + // 攻击前摇 + "AttackRate" "3.0" + // 攻击速度 + "ArmorPhysical" "0" + // 物理护甲 + "AttackDamageMin" "4" + // 最大攻击力 + "AttackDamageMax" "5" + // 最小攻击力 + "AttributeBaseStrength" "1" + // 基础力量 + "AttributeStrengthGain" "0" + // 每级增加的力量,力量成长 + "AttributeBaseAgility" "1" + // 基础敏捷 + "AttributeAgilityGain" "0" + // 每级增加的敏捷,敏捷成长 + "AttributeBaseIntelligence" "1" + // 基础智力 + "AttributeIntelligenceGain" "0" + // 每级增加的智力,智力成长 + "MovementSpeed" "550" + // 基础移动速度 + "MovementTurnRate" "1.0" + // 转身速度 + "StatusHealth" "135" + // 基础生命值 + "StatusHealthRegen" "2.0" + // 基础生命恢复 + "StatusMana" "60" + // 基础魔法值 + "StatusManaRegen" "0.9" + // 基础魔法恢复 + "VisionDaytimeRange" "1050" + // 白天视野大小 + "VisionNighttimeRange" "700" + // 晚上视野大小 + "DisableWearables" "1" + + } + + "npc_dota_hero_reimu2" + { + "override_hero" "npc_dota_hero_juggernaut" + "AbilityLayout" "1" + "Ability1" "ability_touhoutd_release_tower" + "Ability2" "ability_touhoutd_blink" + "Ability3" "ability_touhoutd_kill" + "Ability4" "ability_touhoutd_buy_normal_card" + "Ability5" "ability_touhoutd_buy_senior_card" + "Ability6" "ability_touhoutd_ex_up" + "Ability7" "ability_touhoutd_sort_item" + "Ability8" "ability_touhoutd_close_star" + "Ability9" "generic_hidden" + "Ability10" "generic_hidden" + "Ability11" "generic_hidden" + "Ability12" "generic_hidden" + "Ability13" "generic_hidden" + "Ability14" "generic_hidden" + "Ability15" "generic_hidden" + "Ability16" "generic_hidden" + "Ability17" "tt7" + "Ability18" "tt8" + "Ability19" "tt5" + "Ability20" "tt6" + "Ability21" "tt3" + "Ability22" "tt4" + "Ability23" "tt1" + "Ability24" "tt2" + + //"Carry" "核心" + //"Support" "辅助" + //"Nuker" "爆发" + //"Disabler" "控制" + //"Jungler" "打野" + //"Durable" "耐久" + //"Escape" "逃生" + //"LaneSupport" "对线辅助" + //"Pusher" "推进" + //"Initiator" "先手" + //"Role" "Carry,Support,Nuker,Disabler,Jungler,Durable,Escape,LaneSupport,Pusher,Initiator" + + "Role" "Carry,Nuker,Disabler,Jungler,Escape,Pusher,Initiator" + "Rolelevels" "1,3,2,1,0,1,2" + "ModelScale" "1.4" + + "MinimapIcon" "npc_dota_hero_juggernaut" //无效 + + "AttackAnimationPoint" "0.1" + // 攻击前摇 + "AttackRate" "3.0" + // 攻击速度 + "ArmorPhysical" "0" + // 物理护甲 + "AttackDamageMin" "4" + // 最大攻击力 + "AttackDamageMax" "5" + // 最小攻击力 + "AttributeBaseStrength" "1" + // 基础力量 + "AttributeStrengthGain" "0" + // 每级增加的力量,力量成长 + "AttributeBaseAgility" "1" + // 基础敏捷 + "AttributeAgilityGain" "0" + // 每级增加的敏捷,敏捷成长 + "AttributeBaseIntelligence" "1" + // 基础智力 + "AttributeIntelligenceGain" "0" + // 每级增加的智力,智力成长 + "MovementSpeed" "550" + // 基础移动速度 + "MovementTurnRate" "1.0" + // 转身速度 + "StatusHealth" "135" + // 基础生命值 + "StatusHealthRegen" "2.0" + // 基础生命恢复 + "StatusMana" "60" + // 基础魔法值 + "StatusManaRegen" "0.9" + // 基础魔法恢复 + "VisionDaytimeRange" "1050" + // 白天视野大小 + "VisionNighttimeRange" "700" + // 晚上视野大小 + "DisableWearables" "1" + + // 边界设置 + //---------------------------------------------------------------- + "BoundsHullName" "DOTA_HULL_SIZE_SMALL" // 碰撞边界类型,以下为单位尺寸参数: + // 值 Hammer中的单位半径 + // DOTA_HULL_SIZE_SMALL 8 + // DOTA_HULL_SIZE_REGULAR 16 + // DOTA_HULL_SIZE_SIEGE 16 + // DOTA_HULL_SIZE_HERO 24 + // DOTA_HULL_SIZE_HUGE 80 + // DOTA_HULL_SIZE_BUILDING 81 + // DOTA_HULL_SIZE_FILLER 96 + // DOTA_HULL_SIZE_BARRACKS 144 + // DOTA_HULL_SIZE_TOWER 144 + "RingRadius" "60" // 选择圈半径 + "HealthBarOffset" "320" // 血条高度,缺省值为 "-1",意味着使用默认的模型高度 + + } +} diff --git a/scripts/npc/npc_items_custom.txt b/scripts/npc/npc_items_custom.txt new file mode 100755 index 0000000..b3172ac --- /dev/null +++ b/scripts/npc/npc_items_custom.txt @@ -0,0 +1,4907 @@ +"DOTAAbilities" +{ + + //------------------------------------------------------------------------------------------------------------- + // 破碎的符咒 + "item_1001" + { + "ID" "8001" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_1001" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityCooldown" "0.2" + "ItemStackable" "1" + "ItemInitialCharges" "1" + "ItemCost" "500" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "DrawNormalCard" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 神秘的符咒 + "item_1002" + { + "ID" "8002" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_1002" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityCooldown" "0.2" + "ItemStackable" "1" + "ItemInitialCharges" "1" + "ItemCost" "2500" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "DrawSeniorCard" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 一星福蛋 + "item_1003" + { + "ID" "8003" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_1003" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "1000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + } + + //------------------------------------------------------------------------------------------------------------- + // 二星福蛋 + "item_1004" + { + "ID" "8004" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_1004" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "1800" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + } + + //------------------------------------------------------------------------------------------------------------- + // 三星福蛋 + "item_1005" + { + "ID" "8005" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_1005" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "7200" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + } + + //------------------------------------------------------------------------------------------------------------- + // 四星福蛋 + "item_1006" + { + "ID" "8006" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_1006" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "35000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + } + + //------------------------------------------------------------------------------------------------------------- + // 一星僵尸 + "item_1011" + { + "ID" "8007" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0097" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "1000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + } + + //------------------------------------------------------------------------------------------------------------- + // 二星僵尸 + "item_1012" + { + "ID" "8008" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0097" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "1800" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + } + + //------------------------------------------------------------------------------------------------------------- + // 三星僵尸 + "item_1013" + { + "ID" "8009" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0097" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "7200" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + } + + //------------------------------------------------------------------------------------------------------------- + // 四星僵尸 + "item_1014" + { + "ID" "8010" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0097" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "35000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + } + + //------------------------------------------------------------------------------------------------------------- + // 四次元爆弹 + "item_2001" + { + "ID" "8011" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2001" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityCooldown" "1" + "ItemCost" "5000" + "ItemSellable" "0" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnItem2001_SpellStart" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 博丽御币 + "item_2002" + { + "ID" "8012" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2002" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityCooldown" "1" + "ItemCost" "10000" + "ItemSellable" "1" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnItem2002_SpellStart" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 风祝御币 + "item_2003" + { + "ID" "8013" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2003" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityCooldown" "1" + "ItemCost" "5000" + "ItemSellable" "1" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnItem2003_SpellStart" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 御币 + "item_2004" + { + "ID" "8014" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2004" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "AbilityCooldown" "1" + "ItemCost" "2000" + "ItemSellable" "1" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnItem2004_SpellStart" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 血染的太阳伞 + "item_2005" + { + "ID" "8015" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2005" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "2000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + + // "Modifiers" + // { + // "modifier_equip_item" + // { + // "Passive" "1" + // "IsHidden" "0" + // "Attributes" "MODIFIER_ATTRIBUTE_MULTIPLE" + + // "OnCreated" + // { + // "RunScript" + // { + // "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + // "Function" "OnEquipItem" + // } + // } + + // "OnDestroy" + // { + // "RunScript" + // { + // "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + // "Function" "OnUnequipItem" + // } + // } + // } + // } + + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 月耀秘石 + "item_2006" + { + "ID" "8016" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2006" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "2000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 灾厄之主人形 + "item_2007" + { + "ID" "8017" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2007" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "2000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 死神渡河船桨 + "item_2008" + { + "ID" "8018" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2008" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "2000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 割夺真实之刃 + "item_2009" + { + "ID" "8019" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2009" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "5000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 死神的大镰刀 + "item_2010" + { + "ID" "8020" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2010" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "5000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 月兔粉碎巨刃 + "item_2011" + { + "ID" "8021" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2011" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "5000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 迷你八卦炉 + "item_2012" + { + "ID" "8022" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2012" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "10000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 莱瓦汀 + "item_2013" + { + "ID" "8023" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2013" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "10000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 神枪冈格尼尔 + "item_2014" + { + "ID" "8024" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2014" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "10000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 念缚灵的船勾 + "item_2015" + { + "ID" "8025" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2015" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "5000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 速融的核融合棒 + "item_2016" + { + "ID" "8026" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2016" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "5000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 恶魔的乳牙 + "item_2017" + { + "ID" "8027" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2017" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "5000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 月面之弩 + "item_2018" + { + "ID" "8028" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2018" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "ItemCost" "2000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 纳税用阴阳玉 + "item_2019" + { + "ID" "8029" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2019" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "2000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 高科技相机 + "item_2020" + { + "ID" "8030" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2020" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "AbilityCooldown" "1" + "ItemCost" "10000" + "ItemSellable" "1" + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + "OnEquip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnEquipItem" + } + } + + "OnUnequip" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnUnequipItem" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 千年佳酿 + "item_2021" + { + "ID" "8031" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2021" + "ItemStackable" "1" + "ItemInitialCharges" "1" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityCooldown" "10.0" + "ItemCost" "2000" + "ItemSellable" "0" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnItem2021_SpellStart" + "Target" "TARGET" + "duration_max" "%duration_max" + "duration_min" "%duration_min" + "step" "%step" + } + } + + "Modifiers" + { + "modifier_item_2021_buff" + { + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnCreatedItem2021Buff" + "bonus" "%bonus" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnRemoveItem2021Buff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "duration_max" "10" + } + "02" + { + "var_type" "FIELD_INTEGER" + "duration_min" "5" + } + "03" + { + "var_type" "FIELD_INTEGER" + "bonus" "25" + } + "04" + { + "var_type" "FIELD_INTEGER" + "step" "1" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 博丽神社护身符 + "item_2022" + { + "ID" "8032" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_2022" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "AbilityCooldown" "30" + "ItemCost" "5000" + "ItemSellable" "0" + "MaxLevel" "1" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnItem2022_SpellStart" + "Target" "TARGET" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 莉莉白 + "item_0001" + { + "ID" "8033" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0001" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/lily_white/item/item_lily_white.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 纳兹琳 + "item_0002" + { + "ID" "8034" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0002" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/nazrin/item/item_nazrin.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //--------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 秋穣子 + "item_0003" + { + "ID" "8035" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0003" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/minoriko/item/item_minoriko.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 墓地妖精 + "item_0004" + { + "ID" "8036" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0004" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "500" + "Model" "models/thd_hero/mugiyousei/item/item_mujiyousei.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 上海人形 + "item_0005" + { + "ID" "8037" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0005" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "500" + "Model" "models/thd_hero/shanghainingyou/item/item_shanghainingyou.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 蓬莱人形 + "item_0006" + { + "ID" "8038" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0006" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "500" + "Model" "models/thd_hero/hourainingyou/item/item_hourainingyou.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 花田妖精 + "item_0007" + { + "ID" "8039" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0007" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "500" + "Model" "models/thd_hero/hanadayousei/item/item_hanadayousei.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 女仆妖精 + "item_0008" + { + "ID" "8040" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0008" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "500" + "Model" "models/thd_hero/maidyousei/item/item_maidyousei.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 琪露诺 + "item_0009" + { + "ID" "8041" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0009" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/new_touhou_model/cirno/cirno.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 多多良小伞 + "item_0010" + { + "ID" "8042" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0010" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/kogasa/item/item_kogasa.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 蕾蒂·霍瓦特洛克 + "item_0011" + { + "ID" "8043" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0011" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/letty/item/item_letty.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 莉莉卡·普莉兹姆利巴 + "item_0012" + { + "ID" "8044" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0012" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/lyrica_prismriver/item/item_lyrica.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 露娜萨·普莉兹姆利巴 + "item_0013" + { + "ID" "8045" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0013" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/lunasa_prismriver/item/item_lunasa.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 梅露兰·普莉兹姆利巴 + "item_0014" + { + "ID" "8046" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0014" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/merlin_prismriver/item/item_merlin.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 露米娅 + "item_0015" + { + "ID" "8047" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0015" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/rumia/item/item_rumia.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 古明地觉 + "item_0016" + { + "ID" "8048" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0016" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/new_touhou_model/satori/satori.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 永江依玖 + "item_0017" + { + "ID" "8049" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0017" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/iku/item/item_iku.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 米斯蒂娅·萝蕾拉 + "item_0018" + { + "ID" "8050" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0018" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/mystia/item/item_mystia.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 雾雨魔理沙 + "item_0019" + { + "ID" "8051" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0019" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/new_touhou_model/marisa/marisa.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 比那民居天子 + "item_0020" + { + "ID" "8052" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0020" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/new_touhou_model/tenshi/tenshi.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 帕秋莉·诺蕾姬 + "item_0021" + { + "ID" "8053" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0021" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/new_touhou_model/patchouli/patchouli.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 十六夜咲夜 + "item_0022" + { + "ID" "8054" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0022" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/new_touhou_model/sakuya/sakuya.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 铃仙·优昙华院·因幡 + "item_0023" + { + "ID" "8055" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0023" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/reisen/item/item_reisen.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 西行寺幽幽子 + "item_0024" + { + "ID" "8056" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0024" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/yuyuko/item/item_yuyuko.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 魂魄妖梦 + "item_0025" + { + "ID" "8057" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0025" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/new_touhou_model/youmu/youmu.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 火焰猫鳞 + "item_0026" + { + "ID" "8058" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0026" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/rin/item/item_rin.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 灵乌路空 + "item_0027" + { + "ID" "8059" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0027" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/utsuho/item/item_utsuho.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 博丽灵梦 + "item_0028" + { + "ID" "8060" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0028" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/new_touhou_model/reimu/reimu.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 大妖精 + "item_0029" + { + "ID" "8061" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0029" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/thd_hero/daiyousei/item/item_daiyousei.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 蕾米莉亚·斯卡雷特 + "item_0030" + { + "ID" "8062" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0030" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/new_touhou_model/remilia/remilia.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + + } + + //------------------------------------------------------------------------------------------------------------- + // 古明地恋 + "item_0031" + { + "ID" "8063" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0031" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/heroes/bane/bane.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 芙兰朵露 + "item_0032" + { + "ID" "8064" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0032" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/new_touhou_model/flandre/flandre.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 小恶魔 + "item_0033" + { + "ID" "8065" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0033" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/koakuma/item/item_koakuma.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 红美铃 + "item_0034" + { + "ID" "8066" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0034" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/meirin/item/item_meirin.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 风见幽香 + "item_0035" + { + "ID" "8067" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0035" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/new_touhou_model/yuuka/yuuka.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 八云紫 + "item_0036" + { + "ID" "8068" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0036" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/new_touhou_model/yukari/yukari.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 八云蓝 + "item_0037" + { + "ID" "8069" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0037" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/ran/item/item_ran.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + //------------------------------------------------------------------------------------------------------------- + // 橙 + "item_0038" + { + "ID" "8070" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0038" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/chen/item/item_chen.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + //------------------------------------------------------------------------------------------------------------- + // 八意永琳 + "item_0039" + { + "ID" "8071" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0039" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/thd_hero/eirin/item/item_eirin.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + //------------------------------------------------------------------------------------------------------------- + // 藤原妹红 + "item_0040" + { + "ID" "8072" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0040" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/mokou/item/item_mokou.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + //------------------------------------------------------------------------------------------------------------- + // 蓬莱山辉夜 + "item_0041" + { + "ID" "8073" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0041" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/kaguya/item/item_kaguya.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + //------------------------------------------------------------------------------------------------------------- + // 射命丸文 + "item_0042" + { + "ID" "8074" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0042" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/new_touhou_model/aya/aya.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + //------------------------------------------------------------------------------------------------------------- + // 姬海棠羽立 + "item_0043" + { + "ID" "8075" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0043" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/hatate/item/item_hatate.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + //------------------------------------------------------------------------------------------------------------- + // 犬走椛 + "item_0044" + { + "ID" "8076" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0044" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/momiji/item/item_momiji.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 今泉影狼 + "item_0045" + { + "ID" "8077" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0045" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/kagerou/item/item_kagerou.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 东风谷早苗 + "item_0046" + { + "ID" "8078" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0046" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/sanae/item/item_sanae.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + //------------------------------------------------------------------------------------------------------------- + // 八坂神奈子 + "item_0047" + { + "ID" "8079" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0047" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/thd_hero/kanako/item/item_kanako.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 泄矢诹访子 + "item_0048" + { + "ID" "8080" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0048" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/suwako/item/item_suwako.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 村纱水蜜 + "item_0049" + { + "ID" "8081" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0049" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/minamitsu/item/item_minamitsu.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 封兽鵺 + "item_0050" + { + "ID" "8082" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0050" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/nue/item/item_nue.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 圣白莲 + "item_0051" + { + "ID" "8083" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0051" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/thd_hero/byakuren/item/item_byakuren.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 丰聪耳神子 + "item_0052" + { + "ID" "8084" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0052" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/thd_hero/miko/item/item_miko.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 秦心 + "item_0053" + { + "ID" "8085" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0053" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/kokoro/kokoro.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 星熊勇仪 + "item_0054" + { + "ID" "8086" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0054" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/yuugi/item/item_yuugi.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 伊吹萃香 + "item_0055" + { + "ID" "8087" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0055" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/suika/item/item_suika.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 斯塔·萨菲雅 + "item_0056" + { + "ID" "8088" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0056" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/star/item/item_star.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 桑妮·米尔克 + "item_0057" + { + "ID" "8089" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0057" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/sunny/item/item_sunny.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 露娜·切露德 + "item_0058" + { + "ID" "8090" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0058" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/luna/item/item_luna.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 爱丽丝·玛格特罗依德 + "item_0059" + { + "ID" "8091" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0059" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/alice/item/item_alice.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 莉格露·奈特巴格 + "item_0060" + { + "ID" "8092" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0060" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/wiggle/item/item_wiggle.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 上白泽慧音 + "item_0061" + { + "ID" "8093" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0061" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/keine/item/item_keine.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 因幡帝 + "item_0062" + { + "ID" "8094" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0062" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/tei/tei2.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 琪斯美 + "item_0063" + { + "ID" "8095" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0063" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/kisume/item/item_kisume.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 四季映姬·亚玛萨那度 + "item_0064" + { + "ID" "8096" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0064" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/thd2/shikieiki/shikieiki_mmd.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 小野塚小町 + "item_0068" + { + "ID" "8097" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0068" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/komachi/komachi.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 寅丸星 + "item_0069" + { + "ID" "8098" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0069" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/toramarushou/item/item_toramarushou.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 纯狐 + "item_0073" + { + "ID" "8099" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0073" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + // "Model" "models/items/courier/jin_yin_white_fox/jin_yin_white_fox.vmdl" + "Model" "models/new_touhou_model/junko/item/item_junko.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 赫卡提亚 + "item_0074" + { + "ID" "8100" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0074" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/new_touhou_model/hecatia/item/item_hecatia.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 克劳恩皮丝 + "item_0075" + { + "ID" "8101" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0075" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/new_touhou_model/clownpiece/clownpiece.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 神绮 + "item_0080" + { + "ID" "8102" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0080" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "10000" + "Model" "models/shinki/shinki.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 秋静叶 + "item_0088" + { + "ID" "8103" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0088" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/sizuha/item/item_sizuha.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 键山雏 + "item_0091" + { + "ID" "8104" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0091" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/hina/item/item_hina.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 梅蒂欣·梅兰可莉 + "item_0092" + { + "ID" "8105" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0092" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/medicine/item/item_medicine.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 幽谷响子 + "item_0093" + { + "ID" "8106" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0093" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/kyouko/item/item_kyouko.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 苏我屠自古 + "item_0094" + { + "ID" "8107" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0094" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/soga/item/item_soga.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 物部布都 + "item_0095" + { + "ID" "8108" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0095" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/futo/item/item_futo.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 霍青娥 + "item_0096" + { + "ID" "8109" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0096" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "5000" + "Model" "models/thd_hero/seiga/item/item_seiga.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + //------------------------------------------------------------------------------------------------------------- + // 宫古芳香 + "item_0097" + { + "ID" "8110" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "ItemDisassembleRule" "DOTA_ITEM_DISASSEMBLE_ALWAYS" + "AbilityTextureName" "item_0097" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastRange" "1000" + "ItemCost" "2000" + "Model" "models/thd_hero/yoshika/yoshika.vmdl" + + + "ItemShareability" "ITEM_PARTIALLY_SHAREABLE" + + //------------------------------------------------------------------------------------------------------------- + // Item Info + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "PutTowerToPoint" + "Target" "POINT" + } + } + } + + + "item_3001" + { + "ID" "8111" + "BaseClass" "item_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT_TARGET | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCastAnimation" "ACT_INVALID" + "Model" "models/props_gameplay/red_box.vmdl" + "Effect" "particles/generic_gameplay/dropped_item.vpcf" + "AbilityTextureName" "custom/seasonal_summon_cny_balloon" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPurchasable" "0" + "AbilityCastRange" "800" + "AbilityCastPoint" "0.2" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + "ItemCost" "0" + "ItemSellable" "0" + "ItemPurchasable" "0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnSpellStartCosmetic" + "Ability" "seasonal_summon_cny_balloon" + } + } + } + + "item_3002" + { + "ID" "8112" + "BaseClass" "item_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastAnimation" "ACT_INVALID" + "Model" "models/props_gameplay/red_box.vmdl" + "Effect" "particles/generic_gameplay/dropped_item.vpcf" + "AbilityTextureName" "custom/seasonal_ti10_high_five" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPurchasable" "0" + "AbilityCastRange" "350" + "AbilityCastPoint" "0.3" + "AbilityCooldown" "3" + "AbilityManaCost" "0" + "ItemCost" "0" + "ItemSellable" "0" + "ItemPurchasable" "0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnSpellStartCosmetic" + // "Ability" "seasonal_summon_dragon" + "Ability" "seasonal_ti10_high_five" + } + } + } + + "item_3003" + { + "ID" "8113" + "BaseClass" "item_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastAnimation" "ACT_INVALID" + "Model" "models/props_gameplay/red_box.vmdl" + "Effect" "particles/generic_gameplay/dropped_item.vpcf" + "AbilityTextureName" "custom/seasonal_ti10_soccer_ball" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPurchasable" "0" + "AbilityCastRange" "800" + "AbilityCastPoint" "0" + "AbilityCooldown" "5.0" + "AbilityManaCost" "0" + "ItemCost" "0" + "ItemSellable" "0" + "ItemPurchasable" "0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnSpellStartCosmetic" + "Ability" "seasonal_ti10_soccer_ball" + } + } + } + + "item_3004" + { + "ID" "8114" + "BaseClass" "item_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityCastAnimation" "ACT_INVALID" + "Model" "models/props_gameplay/red_box.vmdl" + "Effect" "particles/generic_gameplay/dropped_item.vpcf" + "AbilityTextureName" "custom/seasonal_firecrackers" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPurchasable" "0" + "AbilityCastPoint" "0" + "AbilityCooldown" "5.0" + "AbilityManaCost" "0" + "ItemCost" "0" + "ItemSellable" "0" + "ItemPurchasable" "0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnSpellStartCosmetic" + "Ability" "seasonal_firecrackers" + } + } + } + + "item_3005" + { + "ID" "8115" + "BaseClass" "item_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCastAnimation" "ACT_INVALID" + "Model" "models/props_gameplay/red_box.vmdl" + "Effect" "particles/generic_gameplay/dropped_item.vpcf" + "AbilityTextureName" "custom/seasonal_throw_snowball" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPurchasable" "0" + "AbilityCastRange" "600" + "AbilityCastPoint" "0.2" + "AbilityCooldown" "0.5" + "AbilityManaCost" "0" + "ItemCost" "0" + "ItemSellable" "0" + "ItemPurchasable" "0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnSpellStartCosmetic" + "Ability" "seasonal_throw_snowball" + } + } + } + + "item_3006" + { + "ID" "8116" + "BaseClass" "item_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityCastAnimation" "ACT_INVALID" + "Model" "models/props_gameplay/red_box.vmdl" + "Effect" "particles/generic_gameplay/dropped_item.vpcf" + "AbilityTextureName" "custom/seasonal_summon_snowman" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPurchasable" "0" + "AbilityCastRange" "350" + "AbilityCastPoint" "0.3" + "AbilityCooldown" "10" + "AbilityManaCost" "0" + "ItemCost" "0" + "ItemSellable" "0" + "ItemPurchasable" "0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnSpellStartCosmetic" + "Ability" "seasonal_summon_snowman" + } + } + } + + "item_3007" + { + "ID" "8117" + "BaseClass" "item_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_TREE" + "AbilityCastAnimation" "ACT_INVALID" + "Model" "models/props_gameplay/red_box.vmdl" + "Effect" "particles/generic_gameplay/dropped_item.vpcf" + "AbilityTextureName" "custom/seasonal_decorate_tree" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPurchasable" "0" + "AbilityCastRange" "165" + "AbilityCastPoint" "0" + "AbilityCooldown" "3.0" + "AbilityManaCost" "0" + "ItemCost" "0" + "ItemSellable" "0" + "ItemPurchasable" "0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnSpellStartCosmetic" + "Ability" "seasonal_decorate_tree" + } + } + } + + "item_3008" + { + "ID" "8118" + "BaseClass" "item_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_DIRECTIONAL | DOTA_ABILITY_BEHAVIOR_POINT" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_BOTH" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityCastAnimation" "ACT_INVALID" + "Model" "models/props_gameplay/red_box.vmdl" + "Effect" "particles/generic_gameplay/dropped_item.vpcf" + "AbilityTextureName" "custom/seasonal_festive_firework" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "ItemPurchasable" "0" + "AbilityCastRange" "1200" + "AbilityCastPoint" "0" + "AbilityCooldown" "1.5" + "AbilityManaCost" "0" + "ItemCost" "0" + "ItemSellable" "0" + "ItemPurchasable" "0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnSpellStartCosmetic" + "Ability" "seasonal_festive_firework" + } + } + } + + "item_3009" + { + "ID" "8119" + "BaseClass" "item_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityCastAnimation" "ACT_INVALID" + "Model" "models/props_gameplay/red_box.vmdl" + "Effect" "particles/generic_gameplay/dropped_item.vpcf" + "AbilityTextureName" "custom/2019_Consumables_Bundle" + "AbilityCastPoint" "0" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + "ItemSellable" "0" + "ItemKillable" "0" + "ItemPurchasable" "0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnSpellStartBundle" + "Item1" "item_3001" + "Item2" "item_3002" + "Item3" "item_3003" + "Item4" "item_3004" + } + } + } + + "item_3010" + { + "ID" "8120" + "BaseClass" "item_datadriven" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE" + "AbilityCastAnimation" "ACT_INVALID" + "Model" "models/props_gameplay/red_box.vmdl" + "Effect" "particles/generic_gameplay/dropped_item.vpcf" + "AbilityTextureName" "custom/Frosthaven_Consumables_Bundle" + "AbilityCastPoint" "0" + "AbilityCooldown" "1" + "AbilityManaCost" "0" + "ItemSellable" "0" + "ItemKillable" "0" + "ItemPurchasable" "0" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityCommon.lua" + "Function" "OnSpellStartBundle" + "Item1" "item_3005" + "Item2" "item_3006" + "Item3" "item_3007" + "Item4" "item_3008" + } + } + } + + + "item_3011" + { + "ID" "8121" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3011" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3012" + { + "ID" "8122" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3012" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3013" + { + "ID" "8123" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3013" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3014" + { + "ID" "8124" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3014" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3015" + { + "ID" "8125" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3015" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3016" + { + "ID" "8126" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3016" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3017" + { + "ID" "8127" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3017" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3018" + { + "ID" "8128" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3018" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3019" + { + "ID" "8129" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3019" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3020" + { + "ID" "8130" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3020" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3021" + { + "ID" "8131" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3021" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3022" + { + "ID" "8132" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3022" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3023" + { + "ID" "8133" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3023" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3024" + { + "ID" "8134" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3024" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3025" + { + "ID" "8135" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3025" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3026" + { + "ID" "8136" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3026" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3027" + { + "ID" "8137" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3027" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3028" + { + "ID" "8138" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3028" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3029" + { + "ID" "8139" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3029" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3030" + { + "ID" "8140" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3030" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3031" + { + "ID" "8141" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3031" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + "item_3050" + { + "ID" "8142" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_3050" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + } + + + "item_3101" + { + "ID" "8143" + //物品ID + //基类 + // "BaseClass" "item_lua" + //文件路径 + // "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "BaseClass" "item_datadriven" + //图标 + "AbilityTextureName" "item_chest_01" + //物品行为 + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + //品质 + "ItemQuality" "common" + //永久物品 + "ItemPermanent" "0" + //叠加数量 + "ItemInitialCharges" "0" + //消耗金钱 + "ItemCost" "500" + //在商店售卖 + "ItemPurchasable" "0" + //可被卖出 + "ItemSellable" "1" + //可被摧毁 + "ItemKillable" "0" + //共享设置 + "ItemShareability" "ITEM_FULLY_SHAREABLE" + //模型 + "Model" "models/imagine_assets/props/chest/chest_01_bronze.vmdl" + // "Model" "models/props_gameplay/treasure_chest_gold.vmdl" //官方的 + + } + + "item_3102" + { + "ID" "8144" + //物品ID + //基类 + // "BaseClass" "item_lua" + //文件路径 + // "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "BaseClass" "item_datadriven" + //图标 + "AbilityTextureName" "item_chest_02" + //物品行为 + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + //品质 + "ItemQuality" "rare" + //永久物品 + "ItemPermanent" "0" + //叠加数量 + "ItemInitialCharges" "0" + //消耗金钱 + "ItemCost" "1000" + //在商店售卖 + "ItemPurchasable" "0" + //可被卖出 + "ItemSellable" "1" + //可被摧毁 + "ItemKillable" "0" + //共享设置 + "ItemShareability" "ITEM_FULLY_SHAREABLE" + //模型 + "Model" "models/imagine_assets/props/chest/chest_01_silver.vmdl" + } + + "item_3103" + { + "ID" "8145" + //物品ID + //基类 + // "BaseClass" "item_lua" + //文件路径 + // "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "BaseClass" "item_datadriven" + //图标 + "AbilityTextureName" "item_chest_03" + //物品行为 + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + //品质 + "ItemQuality" "artifact" + //永久物品 + "ItemPermanent" "0" + //叠加数量 + "ItemInitialCharges" "0" + //消耗金钱 + "ItemCost" "6000" + //在商店售卖 + "ItemPurchasable" "0" + //可被卖出 + "ItemSellable" "1" + //可被摧毁 + "ItemKillable" "0" + //共享设置 + "ItemShareability" "ITEM_FULLY_SHAREABLE" + //模型 + "Model" "models/imagine_assets/props/chest/chest_01_gold.vmdl" + //特效 + // "Effect" "particles/generic_gameplay/dropped_item_lava.vpcf" + } + + "item_3121" + { + "ID" "8146" + //模型,会发生Error,禁用 + // "Model" "models/imagine_assets/props/chest/chest_key_01_gold.vmdl" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_key_01" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "ItemStackable" "1" + "ItemInitialCharges" "1" + "ItemCost" "0" + "ItemSellable" "0" + "ItemShareability" "ITEM_NOT_SHAREABLE" + } + + "item_3149" + { + "ID" "8155" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_poweover" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET" + "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" + "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_FRIENDLY" + "ItemSellable" "0" + "MaxLevel" "1" + "ItemStackable" "0" + "ItemInitialCharges" "0" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "Effect" "particles/generic_gameplay/dropped_item_lava.vpcf" + + "OnSpellStart" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnItem3146_SpellStart" + "Target" "TARGET" + "point" "%point" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "point" "999" + } + } + } + + "item_3150" + { + "ID" "8156" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_yuhun" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET" + "ItemSellable" "0" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + // "AbilityCooldown" "10" + // "AbilityCastRange" "%radius" + "AbilityCastRange" "%radius" + "Model" "models/props_gameplay/divine_rapier.vmdl" + "Effect" "particles/generic_gameplay/dropped_item_lava.vpcf" + "ItemIsNeutralDrop" "1" + + "precache" + { + "particle" "particles/units/heroes/hero_riki/riki_tricks.vpcf" + "particle" "particles/units/heroes/hero_riki/riki_tricks_cast.vpcf" + "particle" "particles/units/heroes/hero_riki/riki_tricks_end.vpcf" + "particle" "particles/units/heroes/hero_riki/riki_backstab.vpcf" + "soundfile" "soundevents/game_sounds_heroes/game_sounds_riki.vsndevts" + "particle" "particles/units/heroes/hero_riki/riki_backstab.vpcf" + } + + "Modifiers" + { + "modifier_item3150_think" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "%damage_interval" + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnItem3150_SpellStart" + "power_damage" "%power_damage" + } + } + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnCreatedItem3150" + "power_bonus" "%power_bonus" + } + } + + + "OnDestroy" + { + "FireEffect" + { + "Target" "CASTER" + "EffectName" "particles/units/heroes/hero_riki/riki_tricks_end.vpcf" + "EffectAttachType" "attach_origin" + } + + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnDestroyItem3150" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "100" + } + "02" + { + "var_type" "FIELD_FLOAT" + "damage_interval" "2" + } + "03" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "300" + } + } + } + + "item_3151" + { + "ID" "8157" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_tianjian" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "ItemSellable" "0" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "AbilityCooldown" "2.0" + "Model" "models/props_gameplay/divine_rapier.vmdl" + "Effect" "particles/generic_gameplay/dropped_item_lava.vpcf" + "ItemIsNeutralDrop" "1" + + "precache" + { + "soundfile" "soundevents/game_sounds_heroes/game_sounds_spirit_breaker.vsndevts" + "particle" "particles/dzz/qingshanjiansheng_yjzcs.vpcf" + // "particle" "particles/units/heroes/hero_monkey_king/monkey_king_jump_armor_debuff.vpcf" //减甲特效 + } + + "Modifiers" + { + "passive_item_3151_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnItem3151_SpellStart" + "power_damage" "%power_damage" + "range" "%range" + } + } + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnCreatedItem3151" + "power_bonus" "%power_bonus" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnDestroyItem3151" + } + } + } + + "modifier_item_3151_debuff" + { + "IsDebuff" "1" + "EffectName" "particles/units/heroes/hero_monkey_king/monkey_king_jump_armor_debuff.vpcf" + "EffectAttachType" "follow_overhead" + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "100" + } + "02" + { + "var_type" "FIELD_INTEGER" + "range" "400" + } + "03" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "300" + } + + } + } + + "item_3152" + { + "ID" "8158" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_tianyu" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "ItemSellable" "0" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "AbilityCooldown" "2.0" + "Model" "models/props_gameplay/divine_rapier.vmdl" + "Effect" "particles/generic_gameplay/dropped_item_lava.vpcf" + "ItemIsNeutralDrop" "1" + + "precache" + { + "particle" "particles/econ/items/queen_of_pain/qop_ti8_immortal/queen_ti8_golden_shadow_strike_debuff.vpcf" + "particle" "particles/econ/items/queen_of_pain/qop_ti8_immortal/queen_ti8_golden_shadow_strike_debuff_creep.vpcf" + "particle" "particles/econ/items/queen_of_pain/qop_ti8_immortal/queen_ti8_golden_shadow_strike_debuff_crow.vpcf" + "particle" "particles/econ/items/queen_of_pain/qop_ti8_immortal/queen_ti8_golden_shadow_strike_debuff_crowrotating_b.vpcf.vpcf" + "particle" "particles/econ/items/queen_of_pain/qop_ti8_immortal/queen_ti8_golden_shadow_strike_debuff_crowrotating.vpcf" + } + + "Modifiers" + { + "passive_item_3152_attack" + { + "Passive" "1" + "IsHidden" "1" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnItem3152_SpellStart" + "power_damage" "%power_damage" + "range" "%range" + } + } + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnCreatedItem3152" + "power_bonus" "%power_bonus" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnDestroyItem3152" + } + } + } + + "modifier_item_3152_debuff" + { + "IsDebuff" "1" + "Duration" "%duration_time" + "States" + { + "MODIFIER_STATE_ROOTED" "MODIFIER_STATE_VALUE_ENABLED" + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "100" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "1.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "range" "400" + } + "04" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "300" + } + + } + } + + "item_3153" + { + "ID" "8159" + //------------------------------------------------------------------------------------------------------------- + // General + "BaseClass" "item_datadriven" + "ItemKillable" "0" + "ItemPurchasable" "0" + "AbilityTextureName" "item_xuanyuan" + "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE" + "ItemSellable" "0" + "ItemShareability" "ITEM_FULLY_SHAREABLE" + "AbilityCooldown" "2.0" + "Model" "models/props_gameplay/divine_rapier.vmdl" + "Effect" "particles/generic_gameplay/dropped_item_lava.vpcf" + "ItemIsNeutralDrop" "1" + + "precache" + { + "particle" "particles/econ/items/monkey_king/mk_ti9_immortal/mk_ti9_immortal_army_ring.vpcf" + "particle" "particles/units/heroes/hero_omniknight/omniknight_purification.vpcf" + } + + "Modifiers" + { + "passive_item_3153_attack" + { + "Passive" "1" + "IsHidden" "1" + "ThinkInterval" "10.0" + + "OnAttackLanded" + { + "RunScript" + { + "Target" "TARGET" + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnItem3153_SpellStart" + "power_damage" "%power_damage" + } + } + + "OnIntervalThink" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnCreatedItem3153" + } + } + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnCreatedItem3153" + "power_bonus" "%power_bonus" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnDestroyItem3153" + } + } + } + + "modifier_item_3153_debuff" + { + "IsHidden" "1" + "IsDebuff" "1" + "Duration" "%duration_time" + + "OnCreated" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnCreatedItem3153Debuff" + "damage_debuff" "%damage_debuff" + } + } + + "OnDestroy" + { + "RunScript" + { + "ScriptFile" "scripts/vscripts/abilities/abilityItem.lua" + "Function" "OnDestroyItem3153Debuff" + } + } + } + } + + "AbilitySpecial" + { + "01" + { + "var_type" "FIELD_INTEGER" + "power_damage" "100" + } + "02" + { + "var_type" "FIELD_FLOAT" + "duration_time" "3.0" + } + "03" + { + "var_type" "FIELD_INTEGER" + "damage_debuff" "100" + } + "04" + { + "var_type" "FIELD_INTEGER" + "power_bonus" "300" + } + } + } + +} diff --git a/scripts/npc/npc_units_custom.txt b/scripts/npc/npc_units_custom.txt new file mode 100755 index 0000000..9afd016 --- /dev/null +++ b/scripts/npc/npc_units_custom.txt @@ -0,0 +1,1381 @@ +#base "units/tower.kv" +#base "units/creeps.kv" + +"DOTAUnits" +{ + "minoriko_shop" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/minoriko/minoriko.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_shop_buy_egg_level_1" + "Ability2" "ability_touhoutd_shop_buy_egg_level_2" + "Ability3" "ability_touhoutd_shop_buy_egg_level_3" + "Ability4" "ability_touhoutd_shop_buy_egg_level_4" + "Ability5" "ability_touhoutd_shop_roll" + "Ability6" "ability_touhoutd_shop_wave_1" + "Ability7" "ability_touhoutd_shop_wave_2" + "Ability8" "ability_touhoutd_shop_wave_3" + "Ability9" "ability_shop" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + + // 圣诞树 + "christmas_tree" + { + // General + //---------------------------------------------------------------- + "Model" "models/props_frostivus/frostivus_ancient/frostivus_ancient.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "0" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "npc_dummy_unit" + { + "BaseClass" "npc_dota_creep_neutral" + "Model" "models/development/invisiblebox.vmdl" + "SoundSet" "Creep_Good_Range" + "Level" "0" + "UnitLabel" "healing_ward" + "Ability1" "ability_dummy_unit" + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "npc_dota2x_unit_marisa04_spark" + { + "model" "models/thd2/masterspark.vmdl" + "ModelScale" "1.6" + "BaseClass" "npc_dota_base_additive" + "Ability1" "ability_dummy_unit" + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + "HasInventory" "0" + "WakesNeutrals" "0" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "npc_dota2x_unit_yuuka04_spark" + { + "model" "models/thd2/yuukaspark.vmdl" + "ModelScale" "1.6" + "BaseClass" "npc_dota_base_additive" + "Ability1" "ability_dummy_unit" + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "VisionDaytimeRange" "1000" + "VisionNighttimeRange" "1000" + "HasInventory" "0" + "WakesNeutrals" "0" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "npc_dota2x_unit_yuyuko_04" + { + "model" "models/thd2/yuyuko_fan.vmdl" + "BaseClass" "npc_dota_base_additive" + "Ability1" "ability_dummy_unit" + "ModelScale" "30.0" + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "VisionDaytimeRange" "100" + "VisionNighttimeRange" "100" + "HasInventory" "0" + "WakesNeutrals" "0" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "npc_thdots_unit_yukari01_unit" + { + "BaseClass" "npc_dota_base_additive" + "Model" "models/thd2/yukari/yukari_mmd_w.vmdl" + "SoundSet" "Creep_Good_Range" + "Level" "0" + "UnitLabel" "healing_ward" + "ModelScale" "0.6" + "Ability1" "ability_dummy_unit" + "Ability2" "" + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_FLY" + "VisionDaytimeRange" "100" + "VisionNighttimeRange" "100" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "yukari_train" + { + // General + // ---------------------------------------------------------------- + // Model. + "Model" "models/other/tram_1/tram_1.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "ability_dummy_unit" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "0" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "35" + // Damage range max. + "AttackDamageMax" "35" + // Speed of attack. + "AttackRate" "1.2" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "300" + // Gold earned min. + "BountyGoldMin" "10" + // Gold earned max. + "BountyGoldMax" "10" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "2000" + "MovementTurnRate" "100.0" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "35" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "reisen_illusion" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/reisen/reisen.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Reisen" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.6" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + "ProjectileModel" "particles/heroes/reisen/ability_reisen_base_attack.vpcf" + "ProjectileSpeed" "3000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + } + + "flandre_illusion" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/flandre/flandre.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.85" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "yuuka_flower" + { + // General + //---------------------------------------------------------------- + "Model" "models/heroes/enchantress/enchantress_flower.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "3.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "400" + "AttackRange" "400" + "ProjectileModel" "particles/units/heroes/hero_shadowshaman/shadow_shaman_ward_base_attack.vpcf" + "ProjectileSpeed" "1500" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + } + + "yuuka_illusion" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/yuuka/yuuka.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "30" + "StatusManaRegen" "2" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "kanako_gojou" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd2/kanako/kanako_mmd_gojou.vmdl" + "BaseClass" "npc_dota_building" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "thtd_kanako_03_unit" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "30" + "StatusManaRegen" "2" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + } + + "momiji_wolf" + { + "Model" "models/items/lycan/wolves/icewrack_pack/icewrack_pack.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Lycan_Wolf" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.0" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "1" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + // Damage range min. + "AttackDamageMin" "2" + // Damage range max. + "AttackDamageMax" "2" + // Speed of attack. + "AttackRate" "0.8" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.3" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "100" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "32" + // Gold earned min. + "BountyGoldMin" "20" + // Gold earned max. + "BountyGoldMax" "25" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "522" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "300" + // Health regeneration rate. + "StatusHealthRegen" "3.5" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "400" + // Range of vision at night time. + "VisionNighttimeRange" "400" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "shinki_dragon" + { + // "Model" "models/creeps/roshan/roshan.vmdl" + // "ModelScale" "0.5" + "Model" "models/courier/baby_rosh/babyroshan_winter18.vmdl" //姜饼肉山宝宝,要同步改技能的基础模型比例 + "ModelScale" "1" + "BaseClass" "npc_dota_creature" + "SoundSet" "Roshan" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "shinki_dragon_01" + // Ability 2 + "Ability2" "shinki_dragon_02" + // Ability 3 + "Ability3" "shinki_dragon_03" + // Ability 4 + "Ability4" "" + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "1" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + // Damage range min. + "AttackDamageMin" "2" + // Damage range max. + "AttackDamageMax" "2" + // Speed of attack. + "AttackRate" "0.9" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.3" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "150" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "32" + // Gold earned min. + "BountyGoldMin" "20" + // Gold earned max. + "BountyGoldMax" "25" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "522" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "300" + // Health regeneration rate. + "StatusHealthRegen" "3.5" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "800" + // Range of vision at night time. + "VisionNighttimeRange" "800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "tiny_suika" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/suika/suika.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "alice_boom" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/alice/alice.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "0.8" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "thtd_alice_unit_kill" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "30" + "StatusManaRegen" "2" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + } + + "alice_falanxi_ningyou" + { + // General + //---------------------------------------------------------------- + "Model" "models/alice/falanxi.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.2" + "IsAncient" "1" + "SoundSet" "Hero_Rattletrap" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_rattletrap.vsndevts" + + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "thtd_alice_02_ningyou_01" + // Ability 2 + "Ability2" "thtd_alice_02_ningyou_02" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "1" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + // Damage range min. + "AttackDamageMin" "2" + // Damage range max. + "AttackDamageMax" "2" + // Speed of attack. + "AttackRate" "0.9" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.3" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "100" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "32" + // Gold earned min. + "BountyGoldMin" "20" + // Gold earned max. + "BountyGoldMax" "25" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "522" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "100" + // Health regeneration rate. + "StatusHealthRegen" "3.5" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "400" + // Range of vision at night time. + "VisionNighttimeRange" "400" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "kokoro_jin_yin" + { + // General + //---------------------------------------------------------------- + "Model" "models/items/courier/jin_yin_white_fox/jin_yin_white_fox.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "30" + "StatusManaRegen" "2" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + } + + "npc_unit_aya_03_wings" + { + "model" "models/new_touhou_model/aya/aya_wing.vmdl" + "BaseClass" "npc_dota_creature" + "Ability1" "ability_dummy_unit" + "ModelScale" "1.0" + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_NONE" + "VisionDaytimeRange" "100" + "VisionNighttimeRange" "100" + "HasInventory" "0" + "WakesNeutrals" "0" + "Ability2" "" + "Ability3" "" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "reimu_pet" + { + // General + //---------------------------------------------------------------- + "Model" "models/pets/icewrack_wolf/icewrack_wolf.vmdl" + // "Model" "models/items/courier/jin_yin_white_fox/jin_yin_white_fox.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Furion_Treant" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "reimu_pet_01" + "Ability2" "reimu_pet_02" + "Ability3" "reimu_pet_03" + "Ability4" "reimu_pet_04" + "Ability5" "reimu_pet_05" + "Ability6" "" + "Ability7" "" + "Ability8" "" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "522" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "inaba_rabbit" + { + "Model" "models/items/courier/arneyb_rabbit/arneyb_rabbit.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Lycan_Wolf" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.6" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "1" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "0" + // Damage range max. + "AttackDamageMax" "0" + // Speed of attack. + "AttackRate" "1.7" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.3" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "100" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "0" + // Gold earned max. + "BountyGoldMax" "0" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "522" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "1" + // Health regeneration rate. + "StatusHealthRegen" "0.0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "400" + // Range of vision at night time. + "VisionNighttimeRange" "400" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_BASIC" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + +} diff --git a/scripts/npc/portraits.txt b/scripts/npc/portraits.txt new file mode 100755 index 0000000..1f17a0d --- /dev/null +++ b/scripts/npc/portraits.txt @@ -0,0 +1,644 @@ +"Portraits" +{ + "Version" "1" + "DefaultActivity" "ACT_DOTA_IDLE" + "default" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "170.0 -74.0 130.0" + "PortraitAngles" "0.0 155.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/thd_hero/lily_white/lily_white.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "210.0 -95.0 250.0" + "PortraitAngles" "30.0 155.0 10.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/reimu/reimu.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "140.0 -63.0 187.0" + "PortraitAngles" "0.0 155.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/flandre/flandre.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "150.0 -37.0 170.0" + "PortraitAngles" "5.0 165.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/remilia/remilia.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "140.0 -33.0 153.0" + "PortraitAngles" "5.0 165.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/marisa/marisa.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "135.0 -42.0 200.0" + "PortraitAngles" "10.0 160.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/cirno/cirno.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "140.0 -20.0 190.0" + "PortraitAngles" "8.0 170.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/cirno/ex/ex_cirno.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "140.0 -25.0 150.0" + "PortraitAngles" "8.0 170.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/sakuya/sakuya.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "130.0 -55.0 190.0" + "PortraitAngles" "10.0 155.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/youmu/youmu.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "130.0 -21.0 150.0" + "PortraitAngles" "5.0 170.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/tenshi/tenshi.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "140.0 -15.0 165.0" + "PortraitAngles" "10.0 170.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/patchouli/patchouli.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "130.0 -33.0 175.0" + "PortraitAngles" "10.0 165.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/yuuka/yuuka.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "130.0 -29.0 180.0" + "PortraitAngles" "10.0 165.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/junko/junko.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "150.0 -50.0 235.0" + "PortraitAngles" "5.0 160.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/hecatia/hecatia.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "130.0 -20.0 245.0" + "PortraitAngles" "10.0 170.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/hecatia/hecatia_moon/hecatia_moon.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "130.0 -20.0 245.0" + "PortraitAngles" "10.0 170.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/hecatia/hecatia_earth/hecatia_earth.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "130.0 -20.0 245.0" + "PortraitAngles" "10.0 170.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/yukari/yukari.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "130.0 5.0 188.0" + "PortraitAngles" "10.0 180.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/satori/satori.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "130.0 -45.0 150.0" + "PortraitAngles" "8.0 160.0 0.0" + "PortraitFOV" "16" + } + } + } + + "models/new_touhou_model/aya/aya.vmdl" + { + "PortraitLightPosition" "202.70 -23.15 308.17" + "PortraitLightAngles" "54.79 171.70 0.00" + "PortraitLightFOV" "88" + "PortraitLightDistance" "343" + "PortraitLightColor" "190 190 190" + "PortraitShadowColor" "74 74 74" + "PortraitShadowScale" "5.000000" + "PortraitAmbientColor" "79 108 108" + "PortraitAmbientScale" "5.000000" + "PortraitSpecularColor" "251 74 84" + "PortraitBackgroundTexture" "materials/vgui/hud/heroportraits/portraitbackground_moon.vmat" + "PortraitBackgroundColor1" "1 1 1" + "PortraitBackgroundColor2" "1 1 1" + "PortraitBackgroundColor3" "1 1 1" + "PortraitBackgroundColor4" "1 1 1" + "PortraitLightScale" "4.500000" + "PortraitGroundShadowScale" "1.500000" + "PortraitAmbientDirection" "-79.070 -84.150 -25.320" + "PortraitAnimationActivity" "ACT_DOTA_IDLE" + "cameras" + { + "default" + { + "PortraitPosition" "110.0 -52.0 205.0" + "PortraitAngles" "10.0 155.0 0.0" + "PortraitFOV" "16" + } + } + } +} diff --git a/scripts/npc/power_table.txt b/scripts/npc/power_table.txt new file mode 100755 index 0000000..f9b0067 --- /dev/null +++ b/scripts/npc/power_table.txt @@ -0,0 +1,9 @@ +power_table +{ + "1" "C5ACAE78E6C903A2D10A368DA001B0E1F979209C8FEB23FD6F59F7AA5129E41C6CCB3CA4DF3EC68D74D8C0C30B20F59D0E401D51849303F69E80050F81D58632334E18D668DDD266766200AE3AC5427A9EE2F8CFBAE585F46816B1659A001C7F04F52005DAADEC46CFD962B129B771004F9C91C56CDC87E092A9CC5AFD10830" + "2" "72602B5B2B92C28284D18A489BD59C3DDEFE023D5E98566B5B103069E46D5541BE6702B2DCC13F87E1C37CC4D9855D39FD58DA839CF66676CE9B3AC644EC6925E8274EDC6832A2140AF7EACE45D677B89511F70172EEFFF45F24B6A6808610D3AB12687B3CDA9582B30907C9477F02FA9FAD752A97BC10C93B82CE860A1F581" + "3" "BCA975B1304837210A4723C93CE06BAB65A9C95B15F8CE6CC605306DD62E6D90C262B27FE269A908D6DD67653F17BDC1038ADB84288BC006141A1BE88417E6467494152B5CE408A5A9D824A3AC6997CADEA94CE2C4BDA8F03C889160F85D5D148B46AC29569E0A6927D6B6EA0B68665371AAB85B9A4EB887820F09999CBFC8A" + "4" "AEEE7BA20EC94B7627E630298AC97FDFD738EB954B957B20C6409C5F2092A3D196CE38F5B210F1BF3DC7D948BE4B0351397DF3CCA2DF1FCD62E6035CE14C67BDB500DA3CBE387027A582F3D0C0CFE7B4337FB8624BA78CEFBF1841241BB7ACC9ABA8613F8701A049E6D86F9F1C4897A99D25134C3A170A8D16C0239E5113EBF" + "5" "BAB79E0AF12018BB71599692E34D3846437F89C9F34F4F2AC05192CD9D92FB2D293538F11E6FFD1FAA9ACCDA23EAF6835E5A3679092AB55123DA64DD4A0961547B3504D97ECD9E63FCCD5C44CC9B359A23AA82DF5DBF00AF88BD17B8CFC23AAFE756B47D6ECEED9F84121748B78AF5B05C56935AC59B0B8DD30EC9ECDBF1CE8" + "6" "844238644211529CA28915D50C54DF50AF800025E4A0036C8399182BDDC217047108454D4FBCCF754A9E2669D97FFC6B6E089610004138CE5B5A79F3601CC3142F82EB45E3395BB91430AC1885AB62286FAE8" +} \ No newline at end of file diff --git a/scripts/npc/shops.txt b/scripts/npc/shops.txt new file mode 100755 index 0000000..c2ce3cc --- /dev/null +++ b/scripts/npc/shops.txt @@ -0,0 +1,60 @@ +"dota_shops" +{ + "consumables" + { + } + + "attributes" + { + } + + "weapons_armor" + { + } + + "misc" + { + } + + "basics" + { + } + + "support" + { + } + + "magics" + { + } + + "weapons" + { + } + + "defense" + { + } + + + "artifacts" + { + } + + "sideshop1" + { + + } + + "sideshop2" + } + + "secretshop" + { + + } + + "pregame" + { + } +} \ No newline at end of file diff --git a/scripts/npc/spawner.txt b/scripts/npc/spawner.txt new file mode 100755 index 0000000..572249a --- /dev/null +++ b/scripts/npc/spawner.txt @@ -0,0 +1,414 @@ +"Spawner" +{ + "Attacking" + { + "Wave1" + { + "Unit" "creature_01" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave2" + { + "Unit" "creature_02" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave3" + { + "Unit" "creature_03" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave4" + { + "Unit" "creature_04" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave5" + { + "Unit" "creature_05" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave6" + { + "Unit" "creature_06" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave7" + { + "Unit" "creature_07" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave8" + { + "Unit" "creature_08" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave9" + { + "Unit" "creature_09" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave10" + { + "Unit" "creature_10" + "Times" "21" + "Count" "1" + "Interval" "1.6" + "BreakTime" "21" + } + "Wave11" + { + "Unit" "creature_11" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave12" + { + "Unit" "creature_12" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave13" + { + "Unit" "creature_13" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave14" + { + "Unit" "creature_14" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave15" + { + "Unit" "creature_15" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave16" + { + "Unit" "creature_16" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave17" + { + "Unit" "creature_17" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave18" + { + "Unit" "creature_18" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave19" + { + "Unit" "creature_19" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave20" + { + "Unit" "creature_20" + "Times" "21" + "Count" "1" + "Interval" "1.6" + "BreakTime" "21" + } + "Wave21" + { + "Unit" "creature_21" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave22" + { + "Unit" "creature_22" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave23" + { + "Unit" "creature_23" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave24" + { + "Unit" "creature_24" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave25" + { + "Unit" "creature_25" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave26" + { + "Unit" "creature_26" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave27" + { + "Unit" "creature_27" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave28" + { + "Unit" "creature_28" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave29" + { + "Unit" "creature_29" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave30" + { + "Unit" "creature_30" + "Times" "21" + "Count" "1" + "Interval" "1.6" + "BreakTime" "21" + } + "Wave31" + { + "Unit" "creature_31" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave32" + { + "Unit" "creature_32" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave33" + { + "Unit" "creature_33" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave34" + { + "Unit" "creature_34" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave35" + { + "Unit" "creature_35" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave36" + { + "Unit" "creature_36" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave37" + { + "Unit" "creature_37" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave38" + { + "Unit" "creature_38" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave39" + { + "Unit" "creature_39" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave40" + { + "Unit" "creature_40" + "Times" "21" + "Count" "1" + "Interval" "1.6" + "BreakTime" "21" + } + "Wave41" + { + "Unit" "creature_41" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave42" + { + "Unit" "creature_42" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave43" + { + "Unit" "creature_43" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave44" + { + "Unit" "creature_44" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave45" + { + "Unit" "creature_45" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave46" + { + "Unit" "creature_46" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave47" + { + "Unit" "creature_47" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave48" + { + "Unit" "creature_48" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave49" + { + "Unit" "creature_49" + "Times" "42" + "Count" "1" + "Interval" "0.8" + "BreakTime" "21" + } + "Wave50" + { + "Unit" "creature_50" + "Times" "21" + "Count" "1" + "Interval" "1.6" + "BreakTime" "100" + } + "Wave51" + { + "Unit" "creature_unlimited" + "Times" "20" + "Count" "1" + "Interval" "0.5" + "BreakTime" "15" + } + } +} \ No newline at end of file diff --git a/scripts/npc/tower.txt b/scripts/npc/tower.txt new file mode 100755 index 0000000..7659eef --- /dev/null +++ b/scripts/npc/tower.txt @@ -0,0 +1,79 @@ +tower +{ + "1" "C5ACAE43B5F15386980E2B84FA70F6AB9A7279D3C9C060EF390CFCC51163FE49278222D1CD208B84228592825D7AD58C720E0A5D9BA25E99CAC0057EE78995656C2C0A88679C8323313871E86D941E25CFB38F93FAA7D1B4341FE439F409182E1ED37A40F5EFCF4CB3A575DE3391374B388B848864BAC4B98CE09037EC548C5" + "2" "E381EC2A5A761217C0F49B491B65FD9A9D3A6049AFB9074B5DB59428407B1175BEF2E31728C18963E443E881B8022C0938C97F6688E33754CA9AD8A6F5BC6A6179C6281DA82623F1CC376FB8E072361C9355C285A7EB58E03BE09333F59165168E76CCFEF82F1407141F67C9477F52FFCBFE71AE6478F2787FB74AB7CE4FA97" + "3" "CDA57CEF3E1C374B501A2D997CB862FE39C5D85E15A9B91088053A72E8713CD28662B27FE249BB4C86D31D716440F4D4239BC6D370D49657634649BAC25FBC5A358A004E54EF54ACB19920B6F030CA94D5AF56F1DEF8D4AD33D09832A10549349A5BFC7515D7124F2CDCF2BC522D27577A8CB65CD14ED5DD965737D3A2E391F" + "4" "DBBE7BA20ECB4A6262D6D788CF6C4B4E9539FB617FC02B2633E46DFB15A71704174E8A955325458AECE759FFC98E5281F8DEE0CDD21A4C082213C5EDF52C922C54F66A889EBCA15221C6636654CE17D5E5BE9C365A239EAF8F58108509B3A9B9ABA8313F94F060CDA559CDFB794C424979B065CD4EE22A799795264B01A57FF" + "5" "B1B5DA56A57E44E1717982CEB4125E544C27A08FE34E1D109402BD8583C596266A3D75E6442BA80B8A8B83963F81FDDE571320170E2FA85479AB229525182503751E47EB3AFBEA6CE6E4134AD281428F3DE78B8803F25EB7839B1BAF948169B3B84CA26600C5B083DB394B0EF5D4A2A4555D9540C280049D9734C9C093EBD9D" + "6" "01C6BDC35671678D70E9A4F158C11D716B3001D486A1136A232C89EB3A6153E5414D76A81E0CBEE58A2E47C858DBB8EEAFCC87F14690298F4ECB2CF7550C72964F33DE41A56D6FC981D109BC84BC7298FF5E0F67EB0DDFDD9846ECF6B45B980ADA793FB805D50BEA8416473F766C4DB1988AEAC78B79EAD7AAC8385A7E7C081" + "7" "7C197E14927777514A9A293762D45BF4428F4FE4898683C3E121361CBE9F2D885E4B408EAF0EA3742FF045D0DFF7B8F6A4FBCB5E562769A4A6620CCB21C511F7A438637B9E10CCDCAC638E78F12BCEBCF7657791B19BD6644A7F6D30CC41DF8CBCDD56469756954CC2A8E14A76A18878284C111ED450EF50408E46BC0594BA9" + "8" "F5120F559A1CF94F2A401FDDBA7A547A20067CCE753B45F83448007CC670432BAFAD9579E048957A07DF4038BD66FB3A68118D4B876C5C3E464FF520C842FA287D3A0543D36CC7A01131D45BC262E16FA68F27385D5D9B4203A7E4B65D219DCC0EC14E2ECDA88F53664C608A597C14A8506FDBDF191D61123231EE9D2A03165" + "9" "EFA946EC8F1CBD5F9D703ED107EE78F8CA0DCF53EC44B6C0C508A218F7F423819D3DA6BF26520B252679041975F87852F37BC3526149FED678C36B86DDD477403FC4D4310F0ABD6D0630312284C38968F223ADDD99E0379C367E370990A28BD7A80923D4D90E14F327704FDBF093940C8861FF4D78F76C6E9584BF2D4ED7FD1" + "10" "D89CB38E28FAF3F35DB3B01E1EC7ABA55516EBF55CA7FD120C116A133C79146A4323A938C19A2EA4F40B5C1947AD8A693F271A028E92F06BA6999826FF6B1BEBE81920B671F171273340B576CD2A2F3CF78492703C668F154F8F23C9719624DC5F8AF809571F7A8A4724CE5AAF4008AE229A675F31D376CD48016DE5D16BD88" + "11" "312536A62C178B5080176B855CA4FE7AA95D2946DDE1D5B7F4FFAE1E14309C81E5CFA254B54A9711D7974B708367F310ED66D88C428E754531F039CE710435034B3797D8BF275089A204CBB62A2D4DD456B2E844A5C50E5AD825E7D40B7866A613BD59FF77E33CB17E3C67875A0EAF275EB83D429CB563C99B0FE6960FFE43E" + "12" "0044F7A2D6DE22CB664C1CF5CFE5BA5DFE4F78CF7854A5B7DE02FC0EE7C16C5194B0BB095D2385FE372F6BB7E3298349F14E32647E4ADE93B7D3DED70F6114A563A562AFF52BFAF3F2BCC7D797D7509EF298236D25B9D4AFDEC70268EEC1E5854877BACBF0E9F5311590A8FA7976FDA5FA2AB777CA543DFF44D7B36374CD909" + "13" "A81C506769FA643B84A4F540874BA37805FD4BE371A4D80287A1F7455A209170C276233CC2A51CEFEC40AD00DA2160C5142BB7B76436ACE8BE8C5B21A15B06A41E67628B9EE2DA3F18A4926976C1A74745C2D564CC4D17744FB055FC56273363BE28D24A3435FA6CB654BCE6C11456F39E7CC49D63F0E44992A05614BC62108" + "14" "39A035FF70FCE97BA8597C900947D50B4C10AD14A26F2AD718CE5B2133FFF00FFFABC39C88DA96FC2281E97D8292DDE68067D6E439750B24E075631BF8A03BB260B5D5D36423D32043579482C3446210E422D09AE14F51CA86ECB26A2E98CACC86EF3B2910808616411F48A0FD1905042081328AF563FA70E2FC16B549FDE03" + "15" "3E4F24956582E5348D646D78632DA2BD218A5526EFFD2F3BCEEE9ABDC10A983FDC87BED7E4227DD44E817E90E2AE33AC6D5A531FE65C87F39859ADFB8549DF2CC34E8E117CA5664801420B59B1D87DF8DADF470BFCE7078EF786B2DD8A56A12380F245F2471BAC526AC7E7EF5E96CFFC811CE9843B1856100E4B6F75BDE5A91" + "16" "4AAEC5080CDC9E1A3F1A81473FCE2A7ADFE6D2F6B243295A5E7C68A35AA63CEEF9B7256C0234EC120DDF0CC51CAAD6472E8C5A989DAF637A0D6077C5DA14AEF7DCE27A01CD30305672E3CF67A7CD638BE4957FD65676F65738A4CB48CA8540C81587E9DC28F2EE718BE985A587F7B90AECA5D9A9C6A5561554407FF25CCC6E3" + "17" "C027B36B42E44DB59014EA7928DE1C83857D35BCC40BEFE40F90CF2FDFB261D93354A00FC7E181FFF7CD1D51285ACEB2416CB8E92B03F164E9401C63D7A61E6313C73D079DEC0692030ACB491AAB9106F34D95E086632B209421B62979D6AEB3A4A658F56E7C3BD51DFBA5614C448DB754D5B4903161CB16E1729E561F6E7AF" + "18" "B2BF3435225E3189805DDE3EF7A738A26E0D739C9B4582344EC1640964FBD40CAB876E97D84CD4FF8E0C1F90C3CDC64DB8DCAD2E512B4DA8E463589CAD43FC8461B554B75BB403456E5FBDC940CB307686AB52CC46D31166B730B9E45F219C1E13C106E888F79217B8571F7F28DB76C2A90821F7EF25C5A112F59A0521E3E85" + "19" "FFBE4FF4601A1E1D7BF84CC43AF6F739BB0D5B854B5C0BCB8EAF56410753481E136C47C58F967F058C26D1AD0DCA66A412851B364E5F9BA74F91853AB25308C29133C2277456689A811687A8686421CFB8720090148A8CAF6B0F850576E78272D2CD112FAAD1FDC49544F6BFA4F8AA464BB12249FF5AB90383E5B01E1F03C96" + "20" "ACC3A5A58B8246372E9C1637E57B28418E86D684CA49AFF70BD0BC60B9212F53363813F8C1073179DFC3A05CA353D53B3D51EDA7779500023FAE66899AC71B46FFBE99B1CE31C003062A635F0274EE363A92AED3E0B2662A6EFB603AE69D454E853A85BB4D081D8423B91B77DAE7213C5775F6ED4DA728D2CE4AB5B6DF81FF3" + "21" "65ACD97A13D89204562613E3020AFE4D87147A1741C49F25DCCF3E3A74786A4C89172AD6AAD13362E93C8681F92BA51A1C57B5C9A85A3DC470271F132E802BFC56DB87BA270213334A15348A7C7B6084B46DAABD5CA73BA6EBCC4867C0323BB2FF8A57CA1EB35A121BBD2DE953E21C4796DB56F0C612473CE4DAA793AAAA8E1" + "22" "10B5E1011A8FDAFCA30BCD00D751F9E8DEB1AF884C2699E84826DCBCA83AFA23E3B619FBED0C6B569501BF11BD80C158E98699F81A725B58E8875DF714328EDD8BFB25D67060B5FA2D77FDB1E264B30881ED1675C43222176181D15919C2D651E80CC615DD03617C957019CCBF222EA560ABF22E55C2B068D3FFA12F0AB9C07" + "23" "FCBC3DC11D79FDD68F9D1BDFC379A273505A5D7C705F697A3C19590312D6FACED0465DF10C4A6AB624205EB4AA1CB99BC14A2721CED210D11FDC8E4C9D19B554A3576E1281A8D3E22DB3A9F3E283ABD7709D457B0A2AADA115568907BBE97BBEA2D8548D4AB0BBD0302E5A4AA7DECED0C23688C543DF1FB91DF589B9698A228" + "24" "531AF0451E524A3F084202E8CB489213E815FE4CF6DE5285A591562753DF685DAB87B42BB177F4CB02A6DAE0EFFD404DD1B517509593C6CF155E4FE5545EEFA5898C96A6E9A9B9D76DDF8D030F1DABE6C2E394E482149E2D93E3C93F1A58F88982C041F2330C0672685820013188B0252D77D048D3B703936792166C8D36F0A" + "25" "5205F0B7E924F748A00DDE6002827E02BCB822D30FBA9E2AD0A4D6DDB0BD51DBC4B98B490EE8EFB8A8E1F5A88135FD1E07790C54D22CF03A5C91C173F4493016347D2C211CBAC397A93492A5462602F246F23392C6593AAC3F5F0F572030C43FF35F8818E6E76066DE9FAB863A21A71FAAF909FF66CAD9CD21D68BF8050B6C8" + "26" "D3C0A9F479574D43EA51BEB26617BA372606EE9FAD73F69613560FDBD178561A9B73A966A96AA9C3013115493B4B9A33246CED7EE98CA14CBE5AA1C780188EB098E21B140C0EB7352BAFAF243D42C1A1D9020B33A0243370FDAB2B138FF1097FD6305CA43A20A7489735E62F155B4E887041CF6789DA6036625CD13E2BEC64D" + "27" "EC318BF7CF3D98C5E25BC3F86F67BC4FA678CB6697BCF32C191D405D885A7996ED100D5E32B5698A72995A57A2A12BF8D095AA16CFC950296287CB8C8AAB3ACF62165A0A4A90C95088E71DE010C7B4019A441B5D01FB17E8965984B4F109CBC3DA54EAD1F84CD76FC334DEB45C7F890962CEF241E213D6DAB79C158E03AAF19" + "28" "2D6399F4441978FF938E7575E003B0E8480EFDDE072E75F36D5D8BC6AD12FCBA14559C4D08DB419CFAAE3AAD575D833F438F09243530E5D05190089F80D8AE65DF78C2E4C677C60B2A652E41304F978AF5AF01F46168357BA2F7A751D6C8B84CEACBEF72AA10111ECDDE4B0245D3EB7F740BEFBA3DA7D2E45BF3FC061E2442A" + "29" "0493E43B4CF6EB62A3DAC7362A7EDC77A2525CEF985429BC09D4E995F2421703ACABB63C9E99FFF65A673DB6EA4404BD7BFCD2AC29A8B184EF37A33D23E0D409E4BF6FAF5B3C3E91D3D0B1B1C2A21E41149F98267997E26287F6B315FCD4ACCF18029615A8CAAB06D20393B716734435A2F678E9009771D68F061CD082D647A" + "30" "7EAFACB3600C5C37BEB1646298819A0042A0EAF24DAB46AF9D37DD07EFB7E88C1F3564A8D38CE0845F263F5E66D1E85C17659784A061B54E770079AFC2FD62E9F107553F6812D87C806ED7A81EC4A0A2CAA7576CA864CCAD8DFEFC78C81784A14A59AAC20184394CF94F0F7B46C44332EC9C419F62E663DD1F47AB57DD3CB86" + "31" "7B09560C3D38186D88E3567AE38798FFFAB6417141CAB58F85792FCA652E17C58575E1B74162CF1BA727D457A28E6284756FA167718866C7CAB0056CD4E1B2A8EB74E809DF4785B7B3AD6BB746DC164C66656C985C503075A23D0B7124F4A389A6EF350B76B638022E1DEB2A3B17EA19A9CDB020E8D359EF7B2519DF67D5177" + "32" "093B601E95165F36CF13E1595DED5E49E3F8E16B9E702D921A5A1AEFE4961ACE500132D8B038166CC653930CE467E35DCE50852E9735ADEDC5D00FC39CF72AE31A79FF8D46D6B0BD80331132BE873DE443FDD75332FDDAA72E173A26B0F8D5F61392CA0E79829266032E363866FAFF983699CA14F683E4E05AFEF2C8D262708" + "33" "C6EEA51BD7713B6C83858C737C42E9B7A574ED7A15C7D760D3979EFEECD9C97D06FFD8646F4536E9DF13D34B6D2484123BA9B237B129ABA4B00C73C03255DDA7BB90C570449A48F426CDAA81C37DD5556AC7BEA61851DFD782EED0ACB361BD0A4633943A9A7A3D56FE61DB5D2A92042BDF6EADBBC0D7CA268137408192E012D" + "34" "11887CECDD89AF77789D1BA72001B8BC0BF89B726D9A2AC9F45764D611778B598A9F8BFA9E00EAC4DE8136365C8BBBC15CFE98B48D4C64E8E0FD8EA126AAD88448C465D32DB900266CE9285E661848C4C6766B0091736952457BF85D66A00DFF27B5A8EEAC8B90C0B5A108CB518DEC51ADED5113CC5A14B0CDF8D2E0E065A96" + "35" "EF0059D522E73C5C70D0065DCA2FA3BC47B11BAB8DFE3D1701A28B00EE13D0DC20E92ADF9AF187EBDA85F2C0BB11264266D24AC10993C42D13177F0FFF02E9FF74A2711B8D7DBE93BE114EBD192111E8A334E40A415A6D8A4A1789A54C008F7C9F0869969BC5BE240C1583A312B3B2BF0865E0D12BD555CF4C4924859397AA9" + "36" "CD24ACB14333BE7826F84AC2BF27A6FC51C62266919FE2E4968E98982ECD72A01A49914E55F13F97282B2C75A21DFDE0D4226F540DB4EA3C99DB77CDBAF7297698A890DCA8A97669AAA4AC5BC28C539D14103BF4A2EB0635C85A0710967AE58CFA3B91B14425AC4B3A2B05FC88F4F2AD6D1253DF4BA311D6CA6C2A4273EF83D" + "37" "5133C7B3DB9AB68B5FB0529F923D851C37CF3BC856A310BE5046F17799028E31E125776BA76ECCD805C30F07385ED8214204F495615301AF1AED4DAF9D7AC469F00DEEB0C6EE354AE02E224DD9EA92EEB71911E92C790A14B26F30ABDBB06CD0DCAD52D463F60E695365FF4DCC1E340BB9FFEF789E8588A91CFBA43B45FF083" + "38" "076E7994D7B0C3AC00B6CC3A88AB0F8D814FFDA347527356619913BE04F1617479943471F455D4C4F1919612B80C71F475AFE2A9A81EDCF0B9AC20CE6A96E754C67DDB37135A8717C16EFA633CC37739EC367E3D746E7706AFDDB594B753C2E8EAA45C666A8164A6BD97006D16EC7EDF2906116EA58BCB633812027479C5D11" + "39" "DD443F5D7F9DF326738D892E3F33AFF9BDFF92A9C9C6AC3101C713789DCFBB28FE25D04A83965FAE85E66B158213CA8FA3B7A680B56C3A808211219CEE20122421AAF0C972C09E202A53FDA8521968E2CA651EE4938730A468FF905CE808A3CA577DD92FC98E5FE7919A9A187E39D8C0F87055C4C1ED1FC4F30F8D39A5B8FCC" + "40" "45A2F204C650442C7E45D340121F835EA04FC555281604B936E9AFF237282B30969761FBBA620245B491C5EF9C9DEA921BBB89A2E1FF7821B92057A7741FA7CACD14864174BE7F077730EFD83104120F6BFAEC3F8A86BEBABEFDA1548D0096C2F549E459BE2EDCC845FD6A9F3DDE0C053D7C8B9CEBA43287B2BC3323B22B565" + "41" "923B29EBFA9A25C6A14014126528ACA0169807C841A00B671A8AB6CA851743F24438508953AF25997CCC2804314DC0F717C247986394AA7BF41E964D2E7C328CFFFD05F72686657C18CAB7DDD6B1C841969747897AF575AE3CCBCA0D8476CD2A3FD482839F98F6FA6C17E77565CE3329AF7B855FD8DA3BC150CBB3A5BD75326" + "42" "123110AA051915B4886CD254AC9F7D2318EABA91E381F66B182019BF02AFA8BE0BC1B56A358E7854195B2B2794253D8E8EBE01504EF0809740D0B324192EEE8A71D4A5B3210E7B9ED9EEBEC3021F688A9E5C193E5815D12ADC6F970278C04675E51502B09F03B5326A709E838D2E53AEA272F67478BCFAFB62BA6C78E3AB28D" + "43" "1D1AC4ABABCA0D9572CA8F5D24011983A045EF17C45DDA826E493DAB2212DCA805F39E2A0B79A3A52BEE54B6D158188B0699610C5391E92AE1EFB8FE93F6ED4A707317F26B24B42427680DE2C9D5E1F33671C41C1863687CD5A3DF0E2F12CEA7B74E9D4B70251927F9D3B76F6719D86DA7DFA47E620C4E0320E6B567B62C143" + "44" "4725777FEEC8CCD81ECC366CEEFDA2ED44F9A29AF373CCFA83DBC9B4A44543F7B52B976F48472A42FC0B5B46973260BA84B693E649D16987BF273AC70B3B4C61742F434FC336D7274BCF2875F9455E9F9F939016400B48024F93FBBA30060CA50E0015C8AB92B6CB2FCE7629B836EE1071EA3EB69DCF7D8610EAB6FBE1E3061" + "45" "BD47EC9FC13240745861CB525B4F920DA3A96405C200CC8F243A300A3409F8EBE66A442B4FCA8F6A0F8257649DDB5E1D6B8A11934E723135FF0DEB2C50C701A78AB7BF5C8B4830CBA531641F042A951B23ABAB41086142D40ECD3E1B27562234F6110205C26A2E70EFF9359303EA80710B84E2EB1EAFA6A8C5F98691A2B26B9" + "46" "F6E46885D6A4E98F19C3EC8F0ACBD8061950B007827FC56DF45BDA940A6C21BC94EBE700FB9B03E7424192DF2B6E1AECC138FD4508902DF38534842897F72277B3964CF40D86150AF0F9CC73E7D9F19347F48513C74A33442BE137A719EDBE590794A8A2FD0280150D3B005BB8FD3F74356D1B7582BD150A30D562053B26927" + "47" "E5ED429FFBADDD0809738F3BE922CB1AFCB7FFB2B9E6E8762FE56BBFEE6B6BE9D4FFDF46CE7FE4C8E58B9736EE2E367BCE513C94B5B1748E6A4CB7C66233DDE5C8A0697CB87C84A1EA092D51637424F342DAA7ADF558CB1903D6A3776387ECF6AEB20A102FF30A112AAF3AD5B22725E0C7989937CDE0CBFDE48A1973B250DDA" + "48" "9D9AB9F7E02CB79A8A9C7C1D920587BE4FF9759BB22902FBC2122609116AEAF131835460A886C163983649311018791C8F9D22CFDD333E000A19BABC6677E4A3F1FC6C699419D59423475AE114B556DE5D961D77DD26236856946154876064B6D1D61285CD94AA02A918B8D688B1DEA7C97696B72F40AF4DBB77477D1785602" + "49" "7E24EA6128DD8DAF12EE21BFAF707FA904C333763D99205C6A713507A9E902BEA80C5C3AC6AE71F1B63CF5491D02B66217996852D1A1F5D7491128CE9EB9E4E5AC4B06C36E4F15D61C956CE76EF17DFE042924CA3B15EC01E018291029A189795478E4631F00225C017E78FB9E4E412B211A35AC8A372E403A920D8DE75DB4D" + "50" "B1FA2504A92D50E62D41D93138968F8A791A8792EC4C139CF8C439C2C0FC023FC547936A8F30AAFB9FDB1344F1AD26359F30615007D54460182E8BBCC23999A87C3826515F3F8F6548CFC8A0B745D532DE4007B2F85E8EC2CB9FBE7B677608E9F57E10ED47BB1E7C58E27F1D7E454E91DC6D454D56A10D51DDEDCA5E1F15926" + "51" "CEB13C7100A2DDBC2A5AF306C8DFDE7837D1764C8C1236176BF690D870C1F24A45CA89EFE608CBC3F7D471B59363AA7C9A9C5E2A3D051F424496BD26507D086D182E29067EE9F97BBA9E5C479E99D71EBFD6260370267973DE539FBC34FA1710F470821A5118FB2E7E50708D89BCED56FDCACC15A284A6DD9853FCEBBFB6524" + "52" "86A05E890946AD4493A17D4AF7B18B8A402F4D6D4891B17374FC87F6BFDDB639B53C3C627CDF324265917F2BAA403B50CFC604F293E0A269919380EF13F87074FB81BCC82D30276E0387E767959DBF83F060B6C6129166980120AF362058E5A2A2B204C4E268B8BDFB02AA93CA338457A58DF0813BD76312C0DF22BFBA9F95A" + "53" "E980CF55B2BA7ACABFAB952BA0F5B199D016B2FF77A2109238E4059B779FA474F4185D26702E25EB9699BAACEF3648F3FAAAE0AE2FC5275E63007EE7B22AB797B865CEE02565D42AB49AB39B345CCA0799B313A33AD1DB24A2CA1A81609815B764142B92DDC40A648D29B1AB79152005F5BEA76537452508509D61FD02AFC19" + "54" "531A9CB146BB8B490AF0734998886F66E1E42BB55A165F0FE5602C23D0282D44B041B098798CF4264D750D28C721AE3459BFE00D2EAC34DDA6D7A556DE6F1A9B0F74D1D082B6481647E68FF90AF91510EE9AF36D8968AAE5ADE52B44015AB42290893A986313B89FBE01905FAB7F795F4896BC289CD7D1F5DF036EC71935E90" + "55" "7541F95187B0D713552BC76A9F15B5E3F5188403CFE1DB2C439AFDC53CAEDE2530C751053F04C6FE48FCBAB29E51F70ECED910EBAF2CD7C5A57D663B054CE087C831CB70AF7C53D8EB09BB2A1B50CF888000E9D6D369A768D086F8427E5CDE05A940101AB80920E03E47B9465A0572550560D79E98F92D4956CE48A0E35593E" + "56" "D44E582AEA7A307DD8463EB3BDD9EA598031CD3050405C9785863F91FED9054E5B687249F9FD1D867645ACC870313761C7A701569F77EE28B7E763AC848964DA0CD7714DBC275A6D9AE89299A471EDF2AEFF5D80B30BEBD6258CE8BACE5DF2507903EB9862C1DE08ECC7DDFCDEB55BDDEE252A963A4D2629ADAA3F478BD3EC4" + "57" "53C43F09E180BB26FA48F689EE6CC2A97E5506118F4C9CED35BB4A4307F3894EACEFA561A503B9F6D56C82EB44BB91138901DBEEF9AEE303F4B8FBB0A306E956219502A6BF8E3976F039072530378FCC20A74B1195EF261D33A4951D0109975B29F83FE392878C2DF6FA5569032E31C972DF01C4ACF5AFF478019FDB03F169B" + "58" "B657E296656575FB48A0859F9396B1BB23FE6E8A26A940CEE48612578D71516D7B9586B3714A80896FBD90FA589C6F58E48C3579AD2CF009E45FBA46030A1CCB8FB1293DE81AE66943B4C89048EE7848AAF2A32FEE1FA55D2736D417852DFCD81EA2D2EC0790E92E13F279B42CA2B36EE8734CC31A681FF1CF112B583ED01DA" + "59" "DCA7F95F0DBC01AD331AACF385AF49C532CBCDF28D6FCCB8A53A26EE549F2545C8A1EA8AA5E7A685168A5A9DE202D970E3DCB052308EADD4E023ED2BFDFA569A3EE3F76D0928E8E010A28FFF5B560E6C2864B7AC6DF750892564C43448D8C47036C8744FAD57BD16A8BEDA84DEE30BC2F7B4E2C2D0C1693859BBD088DCC7E66" + "60" "826B513B28665E2EB39094D5ED47DA8C4447E2E013A3764D838E9A8BCFC799137F3000A3B0C124360D4016BE0147A8EDBE0E58E1041CF43305C320FA78F8904D0632A20E0BAAED7189E5CCEF2F00C93A5E94FBABEF3E14B2AE62E906E537EC6AB725E34EEBD6BABCE36ECA2FC0FF8BB210CD3C5DB5ED7E9CA7BB9776C726D2B" + "61" "0B2BD996DAA6438C2D34246EECFCAE9006E9CB777629596BF8374E765230FC0EE128CE7596CB6BFD73A0A5F2F037B9B81F3C3E8305A9EA7CB662339BB8A6E86344D5747DF42CBD0353E5B7B117402E9F143F5F173D294640A7A58666F1C129B84BD16749E07AE4B3E6413025967D7A0199A3DDA62A777035C5DE0897798B930" + "62" "6E870471BC3E085F1BBF85C607C9B5E44486B88B0D0D9462E3C53B578FBB51A0FA02A3AE66D51AFC8849BF1DBF89152B947DCBA0C3FDA2503783DF65A33859123E7BF5C2209CA172397A10C8BF9E023515B9E95825FDF4DE330D21B82421E6D9EE56C13CFA9573B44E412B2FEB8193884F2B7BD9A40EE542F2C1727E50CB218" + "63" "D296A826F36F1CFE55C7C10605C93DD12ABB08E34E8D566BB4CFE2B19B31FEBB93D09AC9CD70A2B630F933F4345CBB6681AC81DDCBE4D4FDE825B57E44D4F393FE92C8B7D7315521E924FE9920BC5EB4FBEA9F650F99D500890187A1BE306CF67A608402C9069414082FB1D807955AF12E4B40658D53DE3635E01C8C0731D1E" + "64" "16C87A2267A2F49945B09F9E20A6DA41B2B678068562848EF5BB7A83B8E61E93459A8C2174633451DADF409FF8A0F4BF61E2ED32FD6AB721407DAE20313C71A1751517B04EC52040C48A750AF0F98208824BC2AFF09F6BE8640610316148AEE32FBCE43DB7E94105E92C7CDC4FCC5BE43EA7AC46D14AFDC7AB2742D90F54A64" + "65" "123BF541A5A94194D12DDAD2DB79EC9FE71BB574C37B53E2E595D1264C952B67BB7D45A0B9B081924E80E19725EA7A6F697DDA743794533188BEA54131D32083AB7D77CA72EEDA88893E1F542105550EF1B02033B61608E0057A95A30D7FE565D253D763452C66B205DF3AFE5ABBE41B32FABE11956BAEBC50D6C976228D087" + "66" "29C4E89EC4EC99CDE5D229FDFF68DC20E7862A907521690F4FC71F041B935A1DE3AF1496457DEB15C480F257D52FB3D71D699278096FCCEF71C0E86889A8B17505AC9586BD0E0D16107D7B6CE9FC3D152871421BD6861F26C85D154BB85E6888D857CAB65577AF8D2D496D4AC905B949E3A721E64E1F14A70986A953B09E7AB" + "67" "21047ECC66DAAAFF1F123BD5219EFC1C89A19D899AE422CBDD933F9B9970C7B07B098CFD08B38D563BF67E385B854E0500173118B9C371657C7209268151E1751C4E4C80F40D6142FA3C5852797E3BDEAC18E02E716AFF3D8518F8D4AC31AB5E92B5C8F2AFD5300BB74119F8ED5486F0C12CF98A1DD039E87387053E906D54F" + "68" "E7A3888BF9479F4EB09337D1558F8E42C9A28142C055AB739F9B91C214DA7FF4CA9757C8440230D3FFB15436D617F0938BBD7F06426618C1F0E93F903C5558AC9A88D2D4DA29D20B3807C26A1948EB46CB5BEF10E9DF89474C7F65F1D26838DE860054947B22020694C7E9DBF4AF83EB003EB7D03306D4ACC6A108B6250B044" + "69" "8A7FBC7726939ACC5AB3EF500B4CE370C23D44F9861E394EF64E4746F6CA825C34350023026EED7CC2A83F8E2CDDF0F1ED3DC11067EFF7759E72D15174360E9C9E405EB73E01EE3D8E786B16AEC40BE3E420595688076411AFCB65EDBD6BCC3374921C89A6D737C9AF4C024B4E8DEC46007E7F303B2659CB907D64FC8F2B87B" + "70" "CE2FE8ECE3A190D5788EC774AA96891DC4C200AC4ECEEF26147D0EF106F0CB4A9FB57D52F4EB35518232F24E0B150FDDD0D52EE58252C2B2F2B6294C28D71F7FBFE2F485915C06265EF9B38D3DDF0E815A829F0F138829167804DDA42B7E5EC4DC721A4B7B0BA7FAF4CFA081F5355B1D85100031479F06E77453C213D6B318E" + "71" "A7B6871C557F4AA424CDB8F6A49632EA5B85231D7886C5D614E57AE2079394F642603A6674BD486AAE537D9FAFEFC1F1FDB7A22832D16DF164319CDD6949DF7F0B9DE71EA640C2735613110DF08E0DE5D1A1083985F733DF899273EDCE3018AA6C1859C415E7ACE7FC6741CE6C76A0EEF5A68B30E7E316CF18A7E752D84C3C0" + "72" "966E644CF594BBBA4B8F6C1DB5A79EF776AB4F47CD939D4D0BBAAA3D389A39100D26481CF000845016E2656FFF7CF80AD37284197078F94C9A7B15BE9E0E8DAE6F7531F038F33BCDFFD4D6C3619C666F9FBB0E5F3D5811CFB045351DC3A578C448DBDC15B64796DDA22FA72A6E0D0884B7E92E6C64B50E6E85388E348CCA1A5" + "73" "0156E429AE7D4886D87DBDE1450B52E32E0596D0513514FF269A59C5DB7C17808F51FE4E0ABE83A76A81DFDFA3410FBFF4E0F2510198476785EFEF3A9A61482765999CC796BBD16287138ED0C7564A9CB94456D384D49439ED8DE68FA66240677184ABD85F382BB9E753EF70A476058A05AD61CEE56AE34D2807423FD25D856" + "74" "32F96C98258D1D5D4FA0CE9DDFE412891140DAE625BCB2611ECAB8FFDB7DE0455325B11C1671F488F27EA0D51552B7002E632A02E5809CBD7252B603C082D60CB4DCB96C4F040E635C7B1FA2B42C532E418E30AAE77475119CB32FABC51D88A036D7DBF32BE5749E8D838B3492FDA3A3CB1FFDF5517F2890E12F396E8E5487C" + "75" "C6ECDF93B38E5C0F08405937671292D7AB9084F2B061180363061951CF10A535639CFCE97C2A54E5809B2F637F046004819579FF3CE6CEF42CD03CBADE2FBEFC99C92E24F72C9ECB3AF89857D5F5B16AA9B4F823BA1F2DDC459A83543355EC538F9C3DC76E1DD41214AD2C41B331F77E18DB90B8B61DE32CCB7E546BD158C8F" + "76" "7C656D354A61E9336BF6F0BB6F1BFB1B2F551EA710D17D58556F530DF14A2D38AD9C19E68" +} \ No newline at end of file diff --git a/scripts/npc/units/creeps.kv b/scripts/npc/units/creeps.kv new file mode 100755 index 0000000..58deffe --- /dev/null +++ b/scripts/npc/units/creeps.kv @@ -0,0 +1,5886 @@ +"DOTAUnits" +{ + "creature_01" + { + // General + // ---------------------------------------------------------------- + // Model. + "Model" "models/thd_hero/rumia/rumia.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Furion_Treant" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "0" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "5" + // Damage range max. + "AttackDamageMax" "5" + // Speed of attack. + "AttackRate" "1.0" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "400" + // Gold earned min. + "BountyGoldMin" "15" + // Gold earned max. + "BountyGoldMax" "15" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "30" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + // Creature Data + // ---------------------------------------------------------------------------------------------------------------------- + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_02" + { + // General + // ---------------------------------------------------------------- + // Model. + "Model" "models/thd_hero/kogasa/kogasa.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Furion_Treant" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.0" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "0" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "10" + // Damage range max. + "AttackDamageMax" "10" + // Speed of attack. + "AttackRate" "2.0" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "400" + // Gold earned min. + "BountyGoldMin" "20" + // Gold earned max. + "BountyGoldMax" "20" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "40" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + // Creature Data + // ---------------------------------------------------------------------------------------------------------------------- + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_03" + { + // Model. + "Model" "models/thd_hero/daiyousei/daiyousei.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "n_creep_Ranged" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "0" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "15" + // Damage range max. + "AttackDamageMax" "15" + // Speed of attack. + "AttackRate" "2.0" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "400" + // Gold earned min. + "BountyGoldMin" "25" + // Gold earned max. + "BountyGoldMax" "25" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "50" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_04" + { + // Model. + "Model" "models/thd_hero/wiggle/wriggle.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "0" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "20" + // Damage range max. + "AttackDamageMax" "20" + // Speed of attack. + "AttackRate" "1.8" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "400" + // Gold earned min. + "BountyGoldMin" "35" + // Gold earned max. + "BountyGoldMax" "35" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "70" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_05" + { + // Model. + "Model" "models/thd_hero/mystia/mystia.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Windrunner" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_windrunner.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "0" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "25" + // Damage range max. + "AttackDamageMax" "25" + // Speed of attack. + "AttackRate" "1.8" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "600" + // Particle system model for projectile. + "ProjectileModel" "particles/units/heroes/hero_windrunner/windrunner_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "1500" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "400" + // Gold earned min. + "BountyGoldMin" "40" + // Gold earned max. + "BountyGoldMax" "40" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "100" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_06" + { + // Model. + "Model" "models/thd_hero/minoriko/minoriko.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Undying_Zombie" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_undying.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "0" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "30" + // Damage range max. + "AttackDamageMax" "30" + // Speed of attack. + "AttackRate" "0.9" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "400" + // Gold earned min. + "BountyGoldMin" "45" + // Gold earned max. + "BountyGoldMax" "45" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "140" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_07" + { + // Model. + "Model" "models/thd_hero/sizuha/sizuha.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Enigma" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_enigma.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "0" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "35" + // Damage range max. + "AttackDamageMax" "35" + // Speed of attack. + "AttackRate" "1.8" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "400" + // Gold earned min. + "BountyGoldMin" "50" + // Gold earned max. + "BountyGoldMax" "50" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "180" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_08" + { + // Model. + "Model" "models/thd_hero/kisume/kisume.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Magnataur" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_magnataur.vsndevts" + "Level" "1" + "ModelScale" "1.0" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "0" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "40" + // Damage range max. + "AttackDamageMax" "40" + // Speed of attack. + "AttackRate" "1.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "400" + // Gold earned min. + "BountyGoldMin" "60" + // Gold earned max. + "BountyGoldMax" "60" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "240" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_09" + { + // Model. + "Model" "models/thd_hero/yamame/yamame.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Ursa" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_ursa.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "0" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "45" + // Damage range max. + "AttackDamageMax" "45" + // Speed of attack. + "AttackRate" "1.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "400" + // Gold earned min. + "BountyGoldMin" "65" + // Gold earned max. + "BountyGoldMax" "65" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "300" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_10" + { + // Model. + "Model" "models/thd_hero/momiji/momiji.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Venomancer" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_venomancer.vsndevts" + "Level" "1" + "ModelScale" "1.5" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "0" + "MagicalResistance" "0" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "50" + // Damage range max. + "AttackDamageMax" "50" + // Speed of attack. + "AttackRate" "1.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "600" + // Particle system model for projectile. + "ProjectileModel" "particles/units/heroes/hero_venomancer/venomancer_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "1500" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "400" + // Gold earned min. + "BountyGoldMin" "125" + // Gold earned max. + "BountyGoldMax" "125" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "800" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_11" + { + // Model. + "Model" "models/thd_hero/nazrin/nazrin.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_PhantomLancer" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_phantom_lancer.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "1" + "MagicalResistance" "5" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "55" + // Damage range max. + "AttackDamageMax" "55" + // Speed of attack. + "AttackRate" "0.8" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "600" + // Gold earned min. + "BountyGoldMin" "70" + // Gold earned max. + "BountyGoldMax" "70" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "400" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_12" + { + // Model. + "Model" "models/thd_hero/toramarushou/toramarushou.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_ShadowDemon" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_shadow_demon.vsndevts" + "Level" "1" + "ModelScale" "1.4" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "1" + "MagicalResistance" "5" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "60" + // Damage range max. + "AttackDamageMax" "60" + // Speed of attack. + "AttackRate" "1.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "600" + // Gold earned min. + "BountyGoldMin" "75" + // Gold earned max. + "BountyGoldMax" "75" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "500" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_13" + { + // Model. + "Model" "models/thd_hero/kyouko/kyouko.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_ancient_apparition" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_ancient_apparition.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "1" + "MagicalResistance" "5" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "65" + // Damage range max. + "AttackDamageMax" "65" + // Speed of attack. + "AttackRate" "1.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "600" + // Particle system model for projectile. + "ProjectileModel" "particles/units/heroes/hero_ancient_apparition/ancient_apparition_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "1500" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "600" + // Gold earned min. + "BountyGoldMin" "85" + // Gold earned max. + "BountyGoldMax" "85" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "600" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_14" + { + // Model. + "Model" "models/thd_hero/yoshika/yoshika.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "hero_Crystal" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_crystalmaiden.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "2" + "MagicalResistance" "10" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "70" + // Damage range max. + "AttackDamageMax" "70" + // Speed of attack. + "AttackRate" "1.4" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "600" + // Particle system model for projectile. + "ProjectileModel" "particles/units/heroes/hero_crystalmaiden/maiden_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "1500" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "600" + // Gold earned min. + "BountyGoldMin" "90" + // Gold earned max. + "BountyGoldMax" "90" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "700" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_15" + { + // Model. + "Model" "models/thd_hero/wakasagihime/wakasagihime.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_warlock.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "2" + "MagicalResistance" "10" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "75" + // Damage range max. + "AttackDamageMax" "75" + // Speed of attack. + "AttackRate" "1.4" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "600" + // Gold earned min. + "BountyGoldMin" "95" + // Gold earned max. + "BountyGoldMax" "95" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "800" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_16" + { + // Model. + "Model" "models/new_touhou_model/clownpiece/clownpiece.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_DarkSeer" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_dark_seer.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "2" + "MagicalResistance" "10" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "80" + // Damage range max. + "AttackDamageMax" "80" + // Speed of attack. + "AttackRate" "0.7" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "600" + // Gold earned min. + "BountyGoldMin" "100" + // Gold earned max. + "BountyGoldMax" "100" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "1000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_17" + { + // Model. + "Model" "models/thd_hero/letty/letty.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Morphling" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_morphling.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "3" + "MagicalResistance" "15" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "85" + // Damage range max. + "AttackDamageMax" "85" + // Speed of attack. + "AttackRate" "1.4" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "600" + // Gold earned min. + "BountyGoldMin" "110" + // Gold earned max. + "BountyGoldMax" "110" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "1200" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_18" + { + // Model. + "Model" "models/thd_hero/chen/chen.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Beastmaster" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_beastmaster.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "3" + "MagicalResistance" "15" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "90" + // Damage range max. + "AttackDamageMax" "90" + // Speed of attack. + "AttackRate" "1.4" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "600" + // Gold earned min. + "BountyGoldMin" "115" + // Gold earned max. + "BountyGoldMax" "115" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "1400" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_19" + { + // Model. + "Model" "models/thd_hero/meirin/meirin.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Rubick" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_rubick.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "3" + "MagicalResistance" "15" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "95" + // Damage range max. + "AttackDamageMax" "95" + // Speed of attack. + "AttackRate" "1.2" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "600" + // Particle system model for projectile. + "ProjectileModel" "particles/units/heroes/hero_warlock/warlock_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "1500" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "600" + // Gold earned min. + "BountyGoldMin" "120" + // Gold earned max. + "BountyGoldMax" "120" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "1600" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_20" + { + // Model. + "Model" "models/thd_hero/nue/nue.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_ShadowShaman" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_shadowshaman.vsndevts" + "Level" "1" + "ModelScale" "1.5" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "4" + "MagicalResistance" "19" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "100" + // Damage range max. + "AttackDamageMax" "100" + // Speed of attack. + "AttackRate" "1.2" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "600" + // Particle system model for projectile. + "ProjectileModel" "particles/units/heroes/hero_shadowshaman/shadowshaman_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "1500" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "600" + // Gold earned min. + "BountyGoldMin" "250" + // Gold earned max. + "BountyGoldMax" "250" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "4250" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_21" + { + // Model. + "Model" "models/thd_hero/alice/alice.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_TemplarAssassin" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_templar_assassin.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "4" + "MagicalResistance" "19" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "105" + // Damage range max. + "AttackDamageMax" "105" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "750" + // Gold earned min. + "BountyGoldMin" "135" + // Gold earned max. + "BountyGoldMax" "135" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "2000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_22" + { + // Model. + "Model" "models/thd_hero/lily_white/lily_white.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_PhantomAssassin" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_phantom_assassin.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "5" + "MagicalResistance" "23" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "110" + // Damage range max. + "AttackDamageMax" "110" + // Speed of attack. + "AttackRate" "1.2" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "750" + // Gold earned min. + "BountyGoldMin" "140" + // Gold earned max. + "BountyGoldMax" "140" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "2400" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_23" + { + // Model. + "Model" "models/thd_hero/lyrica_prismriver/lyrica.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_VengefulSpirit" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_vengefulspirit.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "6" + "MagicalResistance" "26" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "115" + // Damage range max. + "AttackDamageMax" "115" + // Speed of attack. + "AttackRate" "1.0" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "600" + // Particle system model for projectile. + "ProjectileModel" "particles/units/heroes/hero_vengeful/vengeful_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "1500" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "750" + // Gold earned min. + "BountyGoldMin" "145" + // Gold earned max. + "BountyGoldMax" "145" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "2800" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_24" + { + // Model. + "Model" "models/thd_hero/merlin_prismriver/merlin.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Spectre" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_spectre.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "7" + "MagicalResistance" "30" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "120" + // Damage range max. + "AttackDamageMax" "120" + // Speed of attack. + "AttackRate" "1.0" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "750" + // Gold earned min. + "BountyGoldMin" "150" + // Gold earned max. + "BountyGoldMax" "150" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "3200" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_25" + { + // Model. + "Model" "models/thd_hero/lunasa_prismriver/lunasa.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Abaddon" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_abaddon.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "8" + "MagicalResistance" "32" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "125" + // Damage range max. + "AttackDamageMax" "125" + // Speed of attack. + "AttackRate" "0.8" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "750" + // Gold earned min. + "BountyGoldMin" "160" + // Gold earned max. + "BountyGoldMax" "160" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "3600" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_26" + { + // Model. + "Model" "models/thd_hero/keine/keine.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_StormSpirit" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_stormspirit.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "9" + "MagicalResistance" "35" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "130" + // Damage range max. + "AttackDamageMax" "130" + // Speed of attack. + "AttackRate" "0.3" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "750" + // Gold earned min. + "BountyGoldMin" "165" + // Gold earned max. + "BountyGoldMax" "165" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "4000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_27" + { + // Model. + "Model" "models/tei/tei2.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_Lich" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_lich.vsndevts" + "Level" "1" + "ModelScale" "0.85" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "10" + "MagicalResistance" "38" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "135" + // Damage range max. + "AttackDamageMax" "135" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "600" + // Particle system model for projectile. + "ProjectileModel" "particles/units/heroes/hero_lich/lich_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "1500" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "750" + // Gold earned min. + "BountyGoldMin" "170" + // Gold earned max. + "BountyGoldMax" "170" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "4400" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_28" + { + // Model. + "Model" "models/thd_hero/medicine/medicine.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "11" + "MagicalResistance" "40" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "140" + // Damage range max. + "AttackDamageMax" "140" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "750" + // Gold earned min. + "BountyGoldMin" "175" + // Gold earned max. + "BountyGoldMax" "175" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "4800" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_29" + { + // Model. + "Model" "models/thd_hero/hina/hina.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_QueenOfPain" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_queenofpain.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "12" + "MagicalResistance" "42" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "145" + // Damage range max. + "AttackDamageMax" "145" + // Speed of attack. + "AttackRate" "0.5" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "750" + // Gold earned min. + "BountyGoldMin" "185" + // Gold earned max. + "BountyGoldMax" "185" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "5200" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_30" + { + // Model. + "Model" "models/thd_hero/kaguya/kaguya.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.5" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "13" + "MagicalResistance" "44" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "150" + // Damage range max. + "AttackDamageMax" "150" + // Speed of attack. + "AttackRate" "0.5" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "750" + // Gold earned min. + "BountyGoldMin" "375" + // Gold earned max. + "BountyGoldMax" "375" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "14000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_31" + { + // Model. + "Model" "models/thd_hero/nitori/nitori.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "14" + "MagicalResistance" "46" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "155" + // Damage range max. + "AttackDamageMax" "155" + // Speed of attack. + "AttackRate" "0.25" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "950" + // Gold earned min. + "BountyGoldMin" "195" + // Gold earned max. + "BountyGoldMax" "195" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "6000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_32" + { + // Model. + "Model" "models/thd_hero/parsee/parsee.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "15" + "MagicalResistance" "47" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "160" + // Damage range max. + "AttackDamageMax" "160" + // Speed of attack. + "AttackRate" "0.5" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "600" + // Particle system model for projectile. + "ProjectileModel" "particles/units/heroes/hero_pugna/pugna_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "1500" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "950" + // Gold earned min. + "BountyGoldMin" "200" + // Gold earned max. + "BountyGoldMax" "200" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "6600" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_33" + { + // Model. + "Model" "models/thd_hero/yuugi/yuugi.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "16" + "MagicalResistance" "49" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "165" + // Damage range max. + "AttackDamageMax" "165" + // Speed of attack. + "AttackRate" "0.5" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "600" + // Particle system model for projectile. + "ProjectileModel" "particles/units/heroes/hero_enchantress/enchantress_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "1500" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "950" + // Gold earned min. + "BountyGoldMin" "210" + // Gold earned max. + "BountyGoldMax" "210" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "7200" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_34" + { + // Model. + "Model" "models/thd_hero/kumoi/kumoi.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "17" + "MagicalResistance" "50" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "170" + // Damage range max. + "AttackDamageMax" "170" + // Speed of attack. + "AttackRate" "0.5" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "950" + // Gold earned min. + "BountyGoldMin" "215" + // Gold earned max. + "BountyGoldMax" "215" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "7800" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_35" + { + // Model. + "Model" "models/thd_hero/minamitsu/minamitsu.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "18" + "MagicalResistance" "52" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "175" + // Damage range max. + "AttackDamageMax" "175" + // Speed of attack. + "AttackRate" "0.5" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "950" + // Gold earned min. + "BountyGoldMin" "220" + // Gold earned max. + "BountyGoldMax" "220" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "8400" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_36" + { + // Model. + "Model" "models/thd_hero/seiga/seiga.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "19" + "MagicalResistance" "53" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "180" + // Damage range max. + "AttackDamageMax" "180" + // Speed of attack. + "AttackRate" "0.25" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "950" + // Gold earned min. + "BountyGoldMin" "225" + // Gold earned max. + "BountyGoldMax" "225" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "9000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_37" + { + // Model. + "Model" "models/thd_hero/soga/soga.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "20" + "MagicalResistance" "55" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "185" + // Damage range max. + "AttackDamageMax" "185" + // Speed of attack. + "AttackRate" "0.5" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "600" + // Particle system model for projectile. + "ProjectileModel" "particles/units/heroes/hero_obsidian_destroyer/obsidian_destroyer_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "1500" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "950" + // Gold earned min. + "BountyGoldMin" "235" + // Gold earned max. + "BountyGoldMax" "235" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "9600" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_38" + { + // Model. + "Model" "models/thd_hero/kagerou/kagerou.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "21" + "MagicalResistance" "56" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "190" + // Damage range max. + "AttackDamageMax" "190" + // Speed of attack. + "AttackRate" "0.5" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "950" + // Gold earned min. + "BountyGoldMin" "240" + // Gold earned max. + "BountyGoldMax" "240" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "10200" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_39" + { + // Model. + "Model" "models/thd_hero/rin/rin.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "22" + "MagicalResistance" "57" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "195" + // Damage range max. + "AttackDamageMax" "195" + // Speed of attack. + "AttackRate" "0.5" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "950" + // Gold earned min. + "BountyGoldMin" "245" + // Gold earned max. + "BountyGoldMax" "245" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "10800" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_40" + { + // Model. + "Model" "models/thd_hero/kanako/kanako.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Hero_WarlockGolem" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.5" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "23" + "MagicalResistance" "58" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "200" + // Damage range max. + "AttackDamageMax" "200" + // Speed of attack. + "AttackRate" "0.5" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.4" + // Range within a target can be acquired. + "AttackAcquisitionRange" "800" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "950" + // Gold earned min. + "BountyGoldMin" "500" + // Gold earned max. + "BountyGoldMax" "500" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "28800" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_41" + { + // Model. + "Model" "models/thd_hero/koakuma/koakuma.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.0" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "24" + "MagicalResistance" "59" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "205" + // Damage range max. + "AttackDamageMax" "205" + // Speed of attack. + "AttackRate" "1.2" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "1150" + // Gold earned min. + "BountyGoldMin" "260" + // Gold earned max. + "BountyGoldMax" "260" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "12000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_42" + { + // Model. + "Model" "models/thd_hero/reisen/reisen.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "7" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "25" + "MagicalResistance" "60" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "210" + // Damage range max. + "AttackDamageMax" "210" + // Speed of attack. + "AttackRate" "1.2" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "1150" + // Gold earned min. + "BountyGoldMin" "265" + // Gold earned max. + "BountyGoldMax" "265" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "13000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_43" + { + // Model. + "Model" "models/thd_hero/suika/suika.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "26" + "MagicalResistance" "61" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "215" + // Damage range max. + "AttackDamageMax" "215" + // Speed of attack. + "AttackRate" "0.5" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "600" + // Particle system model for projectile. + "ProjectileModel" "particles/econ/items/crystal_maiden/ti7_immortal_shoulder/cm_ti7_immortal_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "900" + + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "400" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "1150" + // Gold earned min. + "BountyGoldMin" "330" + // Gold earned max. + "BountyGoldMax" "330" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "14000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_44" + { + // Model. + "Model" "models/thd_hero/eirin/eirin.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "8" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "27" + "MagicalResistance" "62" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "220" + // Damage range max. + "AttackDamageMax" "220" + // Speed of attack. + "AttackRate" "1.0" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "1150" + // Gold earned min. + "BountyGoldMin" "275" + // Gold earned max. + "BountyGoldMax" "275" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "300" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "15000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_45" + { + // Model. + "Model" "models/thd_hero/sanae/sanae.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "8" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "28" + "MagicalResistance" "63" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "225" + // Damage range max. + "AttackDamageMax" "225" + // Speed of attack. + "AttackRate" "1.0" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "300" + // Particle system model for projectile. + "ProjectileModel" "particles/units/heroes/hero_crystalmaiden/maiden_base_attack.vpcf" + // Speed of projectile. + "ProjectileSpeed" "900" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "1150" + // Gold earned min. + "BountyGoldMin" "285" + // Gold earned max. + "BountyGoldMax" "285" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "16000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_46" + { + // Model. + "Model" "models/thd_hero/utsuho/utsuho.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "9" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "29" + "MagicalResistance" "64" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "230" + // Damage range max. + "AttackDamageMax" "230" + // Speed of attack. + "AttackRate" "0.8" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "1150" + // Gold earned min. + "BountyGoldMin" "290" + // Gold earned max. + "BountyGoldMax" "290" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "17000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_47" + { + // Model. + "Model" "models/heroes/bane/bane.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "1" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "30" + "MagicalResistance" "65" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "235" + // Damage range max. + "AttackDamageMax" "235" + // Speed of attack. + "AttackRate" "0.4" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "400" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "1150" + // Gold earned min. + "BountyGoldMin" "295" + // Gold earned max. + "BountyGoldMax" "295" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "18000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_48" + { + // Model. + "Model" "models/thd_hero/yuyuko/yuyuko.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "9" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "31" + "MagicalResistance" "65" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "240" + // Damage range max. + "AttackDamageMax" "240" + // Speed of attack. + "AttackRate" "0.8" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "1150" + // Gold earned min. + "BountyGoldMin" "300" + // Gold earned max. + "BountyGoldMax" "300" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "19000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_49" + { + // Model. + "Model" "models/thd_hero/suwako/suwako.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "9" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "32" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "245" + // Damage range max. + "AttackDamageMax" "245" + // Speed of attack. + "AttackRate" "0.8" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "1150" + // Gold earned min. + "BountyGoldMin" "310" + // Gold earned max. + "BountyGoldMax" "310" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "20000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_50" + { + // Model. + "Model" "models/thd_hero/miko/miko.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.5" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "250" + // Damage range max. + "AttackDamageMax" "250" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "1150" + // Gold earned min. + "BountyGoldMin" "625" + // Gold earned max. + "BountyGoldMax" "625" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "190" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "53000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_unlimited" + { + // Model. + "Model" "models/thd2/yukkuri/yukkuri.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.3" //30只时为0.8 + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "330" + // Damage range max. + "AttackDamageMax" "330" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "1" + // Gold earned max. + "BountyGoldMax" "1" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "480" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "6000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_bosses_alice" + { + // Model. + "Model" "models/thd_hero/alice/alice.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + "Ability1" "" + "Ability2" "" + "Ability3" "" + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "330" + // Damage range max. + "AttackDamageMax" "330" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "1" + // Gold earned max. + "BountyGoldMax" "1" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "480" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "6000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_bosses_aya" + { + // Model. + "Model" "models/thd_hero/aya/aya.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "330" + // Damage range max. + "AttackDamageMax" "330" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "1" + // Gold earned max. + "BountyGoldMax" "1" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "550" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "6000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_bosses_hina" + { + // Model. + "Model" "models/thd_hero/hina/hina.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "330" + // Damage range max. + "AttackDamageMax" "330" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "1" + // Gold earned max. + "BountyGoldMax" "1" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "480" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "7500" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_bosses_kaguya" + { + // Model. + "Model" "models/thd_hero/kaguya/kaguya.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "330" + // Damage range max. + "AttackDamageMax" "330" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "1" + // Gold earned max. + "BountyGoldMax" "1" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "480" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "6000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_bosses_keine" + { + // Model. + "Model" "models/thd_hero/keine/keine.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "330" + // Damage range max. + "AttackDamageMax" "330" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "1" + // Gold earned max. + "BountyGoldMax" "1" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "480" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "7500" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_bosses_kisume" + { + // Model. + "Model" "models/thd_hero/kisume/kisume.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "330" + // Damage range max. + "AttackDamageMax" "330" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "1" + // Gold earned max. + "BountyGoldMax" "1" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "480" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "6000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_bosses_marisa" + { + // Model. + "Model" "models/new_touhou_model/marisa/marisa.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "330" + // Damage range max. + "AttackDamageMax" "330" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "1" + // Gold earned max. + "BountyGoldMax" "1" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "480" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "6000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_bosses_minoriko" + { + // Model. + "Model" "models/thd_hero/minoriko/minoriko.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "330" + // Damage range max. + "AttackDamageMax" "330" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "1" + // Gold earned max. + "BountyGoldMax" "1" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "480" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "6000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_bosses_mokou" + { + // Model. + "Model" "models/thd_hero/mokou/mokou.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "330" + // Damage range max. + "AttackDamageMax" "330" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "1" + // Gold earned max. + "BountyGoldMax" "1" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "480" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "7500" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_bosses_rumia" + { + // Model. + "Model" "models/thd_hero/rumia/rumia.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "330" + // Damage range max. + "AttackDamageMax" "330" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "1" + // Gold earned max. + "BountyGoldMax" "1" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "480" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "6000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } + + "creature_bosses_yuugi" + { + // Model. + "Model" "models/thd_hero/yuugi/yuugi.vmdl" + "BaseClass" "npc_dota_creature" + "SoundSet" "Creep_Good_Range" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + "Level" "10" + "ModelScale" "1.3" + // Abilities + // ---------------------------------------------------------------- + // Ability 1 + "Ability1" "" + // Ability 2 + "Ability2" "" + // Ability 3 + "Ability3" "" + // Ability 4 + "Ability4" "" + // Armor + // ---------------------------------------------------------------- + // Physical protection. + "ArmorPhysical" "33" + "MagicalResistance" "66" + // Attack + // ---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + // Damage range min. + "AttackDamageMin" "330" + // Damage range max. + "AttackDamageMax" "330" + // Speed of attack. + "AttackRate" "0.6" + // Normalized time in animation cycle to attack. + "AttackAnimationPoint" "0.2" + // Range within a target can be acquired. + "AttackAcquisitionRange" "400" + // Range within a target can be attacked. + "AttackRange" "120" + // Bounds + // ---------------------------------------------------------------- + "RingRadius" "40" + "HealthBarOffset" "170" + // Bounty + // ---------------------------------------------------------------- + // Experience earn. + "BountyXP" "0" + // Gold earned min. + "BountyGoldMin" "1" + // Gold earned max. + "BountyGoldMax" "1" + // Movement + // ---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + // Speed. + "MovementSpeed" "480" + // Status + // ---------------------------------------------------------------- + // Base health. + "StatusHealth" "9000" + // Health regeneration rate. + "StatusHealthRegen" "0" + // Base mana. + "StatusMana" "0" + // Mana regeneration rate. + "StatusManaRegen" "0.0" + // Vision + // ---------------------------------------------------------------- + // Range of vision during day light. + "VisionDaytimeRange" "1800" + // Range of vision at night time. + "VisionNighttimeRange" "1800" + // Team + // ---------------------------------------------------------------- + // Team name. + "TeamName" "DOTA_TEAM_NEUTRALS" + "CombatClassAttack" "DOTA_COMBAT_CLASS_ATTACK_PIERCE" + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "Ability5" "" + "Ability6" "" + "Ability7" "" + "Ability8" "" + "Ability9" "" + "Ability10" "" + "Ability11" "" + "Ability12" "" + "Ability13" "" + "Ability14" "" + "Ability15" "" + "Ability16" "" + } +} \ No newline at end of file diff --git a/scripts/npc/units/tower.kv b/scripts/npc/units/tower.kv new file mode 100755 index 0000000..b117f90 --- /dev/null +++ b/scripts/npc/units/tower.kv @@ -0,0 +1,5433 @@ +"DOTAUnits" +{ + "lily" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/lily_white/lily_white.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Furion_Treant" + "GameSoundsFile" "soundevents/game_sounds_creeps.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_lily_01" + "Ability4" "thtd_lily_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.4" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "100" + "StatusManaRegen" "2.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "nazrin" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/nazrin/nazrin.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Nazrin" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_nazrin_01" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "4" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1400" + "AttackRange" "1400" + "ProjectileModel" "particles/heroes/nazrin/nazrin_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "minoriko" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/minoriko/minoriko.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_minoriko_01" + "Ability4" "thtd_minoriko_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_star_up_speed" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.4" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "mugiyousei" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/mugiyousei/mugiyousei.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Venomancer" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_venomancer.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_mugiyousei_01" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.8" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + "ProjectileModel" "particles/units/heroes/hero_viper/viper_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "shanghainingyou" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/shanghainingyou/shanghainingyou.vmdl" + // "Model" "models/creeps/nian/nian_creep.vmdl" //test + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + // "ModelScale" "1.3" //test + "IsAncient" "1" + "SoundSet" "Hero_Shanghai" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_shanghainingyou_01" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.8" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1100" + "AttackRange" "1100" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "hourainingyou" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/hourainingyou/hourainingyou.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Sniper" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_sniper.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_hourainingyou_01" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.8" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1100" + "AttackRange" "1100" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "hanadayousei" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/hanadayousei/hanadayousei.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Puck" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_puck.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_hanadayousei_01" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/econ/items/keeper_of_the_light/kotl_weapon_arcane_staff/keeper_base_attack_arcane_staff.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "maidyousei" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/maidyousei/maidyousei.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Luna" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_luna.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "luna_moon_glaive" + "Ability4" "" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.8" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_luna/luna_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "cirno" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/cirno/cirno.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Cirno" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_cirno_01" + "Ability4" "thtd_cirno_02" + "Ability5" "thtd_cirno_03" + "Ability6" "thtd_cirno_04" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + + "AbilityLayout" "8" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/neutral_fx/black_dragon_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "90" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "letty" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/letty/letty.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Crystal" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_crystalmaiden.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_letty_01" + "Ability4" "thtd_letty_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_decrease_magic_armor_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_lich/lich_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "kogasa" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/kogasa/kogasa.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Kogasa" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_kogasa_01" + "Ability4" "thtd_kogasa_02" + "Ability5" "" + "Ability6" "ability_common_decrease_armor_buff" + "Ability7" "thtd_kogasa_03" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.05" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "20" + "StatusManaRegen" "2.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "lyrica" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/lyrica_prismriver/lyrica.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Lyrica" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_lyrica_01" + "Ability4" "thtd_lyrica_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "900" + "AttackRange" "900" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "6.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "lunasa" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/lunasa_prismriver/lunasa.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Lunasa" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_lunasa_01" + "Ability4" "thtd_lunasa_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "900" + "AttackRange" "900" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "6.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "merlin" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/merlin_prismriver/merlin.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Merlin" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_merlin_01" + "Ability4" "thtd_merlin_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "900" + "AttackRange" "900" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "6.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "rumia" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/rumia/rumia.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_ShadowDemon" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_shadow_demon.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_rumia_01" + "Ability4" "thtd_rumia_02" + "Ability5" "thtd_rumia_03" + "Ability6" "thtd_rumia_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.05" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + "ProjectileModel" "particles/econ/items/shadow_fiend/sf_desolation/sf_base_attack_desolation.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "satori" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/satori/satori.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Bane" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_bane.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_satori_01" + "Ability4" "thtd_satori_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_dark_willow/dark_willow_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "20" + "StatusManaRegen" "3.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "iku" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/iku/iku.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_StormSpirit" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_bane.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_iku_01" + "Ability4" "thtd_iku_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "600" + "AttackRange" "600" + "ProjectileModel" "particles/units/heroes/hero_disruptor/disruptor_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "3.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "mystia" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/mystia/mystia.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_BloodSeeker" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_bloodseeker.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_mystia_01" + "Ability4" "thtd_mystia_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "marisa" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/marisa/marisa.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Marisa" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_marisa_01" + "Ability4" "thtd_marisa_02" + "Ability5" "thtd_marisa_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.85" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "750" + "AttackRange" "750" + "ProjectileModel" "particles/heroes/thtd_marisa/ability_marisa_02_normal.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "80" + "StatusManaRegen" "4.5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "tenshi" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/tenshi/tenshi.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Axe" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_axe.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_tenshi_01" + "Ability4" "thtd_tenshi_02" + "Ability5" "thtd_tenshi_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.85" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "750" + "AttackRange" "750" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "5.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "patchouli" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/patchouli/patchouli.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Invoker" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_invoker.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_patchouli_01" + "Ability4" "thtd_patchouli_02" + "Ability5" "thtd_patchouli_03" + "Ability6" "thtd_patchouli_04" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_oracle/oracle_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "80" + "StatusManaRegen" "8.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "reisen" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/reisen/reisen.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Reisen" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_reisen_01" + "Ability4" "thtd_reisen_02" + "Ability5" "thtd_reisen_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + "ProjectileModel" "particles/heroes/reisen/ability_reisen_base_attack.vpcf" + "ProjectileSpeed" "3000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "80" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "yuyuko" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/yuyuko/yuyuko.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Necrolyte" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_necrolyte.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_yuyuko_01" + "Ability4" "thtd_yuyuko_02" + "Ability5" "thtd_yuyuko_03" + "Ability6" "" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_necrolyte/necrolyte_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "50" + "StatusManaRegen" "6.5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "youmu" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/youmu/youmu.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.1" + "IsAncient" "1" + "SoundSet" "Hero_Youmu" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_youmu_01" + "Ability4" "thtd_youmu_02" + "Ability5" "thtd_youmu_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.8" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "20" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "rin" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/rin/rin.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Lina" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_lina.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_rin_01" + "Ability4" "thtd_rin_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_lina/lina_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "utsuho" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/utsuho/utsuho.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Utsuho" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_utsuho_01" + "Ability4" "thtd_utsuho_02" + "Ability5" "thtd_utsuho_03" + "Ability6" "ability_common_power_buff" + "Ability7" "thtd_utsuho_04" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.95" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1600" + "AttackRange" "1600" + "ProjectileModel" "particles/units/heroes/hero_phoenix/phoenix_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "80" + "StatusManaRegen" "2.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "reimu" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/reimu/reimu.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Reimu" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_reimu_01" + "Ability4" "thtd_reimu_02" + "Ability5" "thtd_reimu_03" + "Ability6" "thtd_reimu_04" + "Ability7" "ability_common_power_buff" + "Ability8" "thtd_reimu_05" + "Ability9" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/heroes/thtd_reimu/ability_reimu_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "30" + "StatusManaRegen" "6.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "daiyousei" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/daiyousei/daiyousei.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Wisp" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_wisp.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_daiyousei_01" + "Ability4" "thtd_daiyousei_02" + "Ability5" "thtd_daiyousei_03" + "Ability6" "thtd_daiyousei_04" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/econ/items/keeper_of_the_light/kotl_weapon_arcane_staff/keeper_base_attack_arcane_staff.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "20" + "StatusManaRegen" "1.5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "remilia" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/remilia/remilia.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Nevermore" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_nevermore.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_remilia_01" + "Ability4" "thtd_remilia_02" + "Ability5" "thtd_remilia_03" + "Ability6" "thtd_remilia_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/econ/items/shadow_fiend/sf_desolation/sf_base_attack_desolation_fire_arcana.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "30" + "StatusManaRegen" "5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "flandre" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/flandre/flandre.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_DoomBringer" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_doombringer.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_flandre_01" + "Ability4" "thtd_flandre_02" + "Ability5" "thtd_flandre_03" + "Ability6" "thtd_flandre_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.85" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "sakuya" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/sakuya/sakuya.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_QueenOfPain" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_queenofpain.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_sakuya_01" + "Ability4" "thtd_sakuya_02" + "Ability5" "thtd_sakuya_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_queenofpain/queen_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "40" + "StatusManaRegen" "4" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "koishi" + { + // General + //---------------------------------------------------------------- + "Model" "models/heroes/bane/bane.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Leshrac" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_leshrac.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_koishi_01" + "Ability4" "thtd_koishi_02" + "Ability5" "thtd_koishi_03" + "Ability6" "thtd_koishi_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.85" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/econ/items/leshrac/leshrac_tormented_staff/leshrac_base_attack_tormented.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "80" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "koakuma" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/koakuma/koakuma.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Lina" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_lina.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_koakuma_01" + "Ability4" "thtd_koakuma_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_lina/lina_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "3.5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "meirin" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/meirin/meirin.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_meirin_01" + "Ability4" "thtd_meirin_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.55" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "yuuka" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/yuuka/yuuka.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Tiny" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_tiny.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_yuuka_01" + "Ability4" "thtd_yuuka_02" + "Ability5" "thtd_yuuka_03" + "Ability6" "thtd_yuuka_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "20" + "StatusManaRegen" "4" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "yukari" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/yukari/yukari.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_ObsidianDestroyer" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_obsidian_destroyer.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_yukari_01" + "Ability4" "thtd_yukari_02" + "Ability5" "thtd_yukari_03" + "Ability6" "thtd_yukari_04" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_obsidian_destroyer/obsidian_destroyer_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "3.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "ran" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/ran/ran.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.3" + "IsAncient" "1" + "SoundSet" "Hero_Puck" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_puck.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_ran_01" + "Ability4" "thtd_ran_02" + "Ability5" "thtd_ran_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/econ/items/puck/puck_alliance_set/puck_base_attack_aproset.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "3.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "chen" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/chen/chen.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Chen" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_chen_01" + "Ability4" "thtd_chen_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "1" + "StatusManaRegen" "1" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "eirin" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/eirin/eirin.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.3" + "IsAncient" "1" + "SoundSet" "Hero_Mirana" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_mirana.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_eirin_01" + "Ability4" "thtd_eirin_02" + "Ability5" "thtd_eirin_03" + "Ability6" "thtd_eirin_04" + "Ability7" "ability_common_power_buff" + "Ability8" "thtd_eirin_05" + "Ability9" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "900" + "AttackRange" "900" + "ProjectileModel" "particles/units/heroes/hero_mirana/mirana_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "100" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "mokou" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/mokou/mokou.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_ChaosKnight" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_chaos_knight.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_mokou_01" + "Ability4" "thtd_mokou_02" + "Ability5" "thtd_mokou_03" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.8" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "kaguya" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/kaguya/kaguya.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.3" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_kaguya_01" + "Ability4" "thtd_kaguya_02" + "Ability5" "thtd_kaguya_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/econ/items/puck/puck_alliance_set/puck_base_attack_aproset.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "80" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "aya" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/aya/aya.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.1" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_aya_01" + "Ability4" "thtd_aya_02" + "Ability5" "thtd_aya_03" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.7" + "AttackAnimationPoint" "0.25" + "AttackAcquisitionRange" "1200" + "AttackRange" "1200" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "hatate" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/hatate/hatate.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "0.8" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_hatate_01" + "Ability4" "thtd_hatate_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.75" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "20" + "StatusManaRegen" "2.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "momiji" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/momiji/momiji.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "0.8" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_momiji_01" + "Ability4" "thtd_momiji_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.8" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "sanae" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/sanae/sanae.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_sanae_01" + "Ability4" "thtd_sanae_02" + "Ability5" "thtd_sanae_03" + "Ability6" "thtd_sanae_04" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.15" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_lion/lion_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "kanako" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/kanako/kanako.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_kanako_01" + "Ability4" "thtd_kanako_02" + "Ability5" "thtd_kanako_03" + "Ability6" "thtd_kanako_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.15" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_zuus/zuus_base_attack.vpcf" + "ProjectileSpeed" "3000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "suwako" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/suwako/suwako.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "0.8" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_suwako_01" + "Ability4" "thtd_suwako_02" + "Ability5" "thtd_suwako_03" + "Ability6" "thtd_suwako_04" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "80" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "minamitsu" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/minamitsu/minamitsu.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.2" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_minamitsu_01" + "Ability4" "thtd_minamitsu_02" + "Ability5" "thtd_minamitsu_03" + "Ability6" "thtd_minamitsu_04" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.85" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "nue" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/nue/nue.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_nue_01" + "Ability4" "thtd_nue_02" + "Ability5" "thtd_nue_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.85" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "sizuha" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/sizuha/sizuha.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "0.9" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_sizuha_01" + "Ability4" "thtd_sizuha_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_star_up_speed" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "0" + "AttackDamageMax" "0" + "AttackRate" "1.4" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "0" + "AttackRange" "0" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "byakuren" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/byakuren/byakuren.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_byakuren_01" + "Ability4" "thtd_byakuren_02" + "Ability5" "thtd_byakuren_03" + "Ability6" "thtd_byakuren_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.2" + "AttackAcquisitionRange" "1200" + "AttackRange" "1200" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "toramaru" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/toramarushou/toramarushou.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.3" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_toramaru_01" + "Ability4" "thtd_toramaru_04" + "Ability5" "thtd_toramaru_02" + "Ability6" "thtd_toramaru_03" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1200" + "AttackRange" "1200" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "shinki" + { + // General + //---------------------------------------------------------------- + "Model" "models/shinki/shinki.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_shinki_01" + "Ability4" "thtd_shinki_02" + "Ability5" "thtd_shinki_03" + "Ability6" "thtd_shinki_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/heroes/thtd_reimu/ability_reimu_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "60" + "StatusManaRegen" "6.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "soga" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/soga/soga.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_soga_01" + "Ability4" "thtd_soga_02" + "Ability5" "thtd_soga_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.2" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + "ProjectileModel" "particles/units/heroes/hero_arc_warden/arc_warden_base_attack.vpcf" + "ProjectileSpeed" "2000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "50" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "futo" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/futo/futo.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_futo_01" + "Ability4" "thtd_futo_02" + "Ability5" "thtd_futo_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.85" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "1200" + "AttackRange" "1200" + "ProjectileModel" "particles/heroes/thtd_futo/ability_futo_base_attack_6.vpcf" + "ProjectileSpeed" "1500" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "50" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "miko" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/miko/miko.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_miko_01" + "Ability4" "thtd_miko_02" + "Ability5" "thtd_miko_03" + "Ability6" "thtd_miko_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.2" + "AttackAcquisitionRange" "1200" + "AttackRange" "1200" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "100" + "StatusManaRegen" "6.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "yoshika" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/yoshika/yoshika.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "0.8" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_yoshika_01" + "Ability4" "thtd_yoshika_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.2" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "seiga" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/seiga/seiga.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "0.8" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_seiga_01" + "Ability4" "thtd_seiga_02" + "Ability5" "thtd_seiga_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + "ProjectileModel" "particles/units/heroes/hero_leshrac/leshrac_base_attack.vpcf" + "ProjectileSpeed" "1500" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "50" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "keine" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/keine/keine.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "0.8" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_keine_01" + "Ability4" "thtd_keine_02" + "Ability5" "thtd_keine_03" + "Ability6" "thtd_keine_04" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "medicine" + { + // General + //---------------------------------------------------------------- + // "Model" "models/thd_hero/medicine/medicine.vmdl" + "Model" "models/medicine/medicine.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "0.8" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_medicine_01" + "Ability4" "thtd_medicine_02" + "Ability5" "" + "Ability6" "ability_common_power_buff" + "Ability7" "thtd_medicine_03" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + "ProjectileModel" "particles/heroes/thtd_medicine/ability_medicine_base_attack.vpcf" + "ProjectileSpeed" "1500" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "20" + "StatusManaRegen" "2.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "luna" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/luna/luna.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_luna_01" + "Ability4" "thtd_luna_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.8" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "10" + "StatusManaRegen" "2.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "sunny" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/sunny/sunny.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_sunny_01" + "Ability4" "thtd_sunny_02" + "Ability5" "" + "Ability6" "ability_common_power_buff" + "Ability7" "thtd_sunny_03" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "10" + "StatusManaRegen" "2.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "star" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/star/star.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_star_01" + "Ability4" "thtd_star_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_mana_regen_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + "ProjectileModel" "particles/base_attacks/ranged_tower_good.vpcf" + "ProjectileSpeed" "1500" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "10" + "StatusManaRegen" "2.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "suika" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/suika/suika.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_suika_01" + "Ability4" "thtd_suika_02" + "Ability5" "thtd_suika_03" + "Ability6" "thtd_suika_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "yuugi" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/yuugi/yuugi.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_yuugi_01" + "Ability4" "thtd_yuugi_02" + "Ability5" "thtd_yuugi_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "80" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "junko" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/junko/junko.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1" + "IsAncient" "1" + "SoundSet" "Hero_Invoker" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_invoker.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_junko_01" + "Ability4" "thtd_junko_02" + "Ability5" "thtd_junko_03" + "Ability6" "thtd_junko_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "900" + "AttackRange" "900" + "ProjectileModel" "particles/units/heroes/hero_oracle/oracle_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "100" + "StatusManaRegen" "6.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "hecatia" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/hecatia/hecatia.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1" + "IsAncient" "1" + "SoundSet" "Hero_Invoker" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_invoker.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_hecatia_01" + "Ability4" "thtd_hecatia_02" + "Ability5" "thtd_hecatia_03" + "Ability6" "thtd_hecatia_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "900" + "AttackRange" "900" + "ProjectileModel" "particles/units/heroes/hero_oracle/oracle_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "100" + "StatusManaRegen" "10.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "alice" + { + // General + //---------------------------------------------------------------- + "Model" "models/alice/alice.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_alice_01" + "Ability4" "thtd_alice_02" + "Ability5" "thtd_alice_03" + "Ability6" "ability_common_power_buff" + "Ability7" "thtd_alice_04" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" //DOTA_UNIT_CAP_MELEE_ATTACK + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "80" + "StatusManaRegen" "5.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "kokoro" + { + // General + //---------------------------------------------------------------- + "Model" "models/kokoro/kokoro.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.2" + "IsAncient" "1" + "SoundSet" "Hero_Youmu" + "GameSoundsFile" "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_kokoro_01" + "Ability4" "thtd_kokoro_03" + "Ability5" "thtd_kokoro_02" + "Ability6" "thtd_kokoro_04" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "900" + "AttackRange" "900" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "hina" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/hina/hina.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Bane" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_shadow_demon.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_hina_01" + "Ability4" "thtd_hina_02" + "Ability5" "thtd_hina_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.3" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + "ProjectileModel" "particles/units/heroes/hero_shadow_demon/shadow_demon_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "0" + "StatusManaRegen" "0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "kagerou" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/kagerou/kagerou.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Lycan" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_lycan.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_kagerou_01" + "Ability4" "thtd_kagerou_02" + "Ability5" "thtd_kagerou_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "800" + "AttackRange" "800" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "80" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + + "precache" + { + "model" "models/heroes/lycan/lycan_wolf.vmdl" + } + } + + "wriggle" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/wiggle/wriggle.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.4" + "IsAncient" "1" + "SoundSet" "Hero_Weaver" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_weaver.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "death_prophet_exorcism" + "Ability4" "thtd_wriggle_02" + "Ability5" "" + "Ability6" "ability_common_power_buff" + "Ability7" "thtd_wriggle_03" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "50" + "StatusManaRegen" "1.5" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "inaba" + { + // General + //---------------------------------------------------------------- + "Model" "models/tei/tei2.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.3" + "IsAncient" "1" + "SoundSet" "Hero_Sniper" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_sniper.vsndevts" + "ProjectileModel" "particles/econ/items/sniper/sniper_fall20_immortal/sniper_fall20_immortal_base_attack.vpcf" + "ProjectileSpeed" "2000" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_inaba_01" + "Ability4" "thtd_inaba_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_attack_speed_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_MELEE_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "50" + "StatusManaRegen" "2.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "clownpiece" + { + // General + //---------------------------------------------------------------- + "Model" "models/new_touhou_model/clownpiece/clownpiece.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1" + "IsAncient" "1" + "SoundSet" "Hero_Invoker" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_skywrath_mage.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_clownpiece_01" + "Ability4" "thtd_clownpiece_02" + "Ability5" "thtd_clownpiece_03" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + "ProjectileModel" "particles/units/heroes/hero_skywrath_mage/skywrath_mage_base_attack.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "70" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "kisume" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/kisume/kisume.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_Bane" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_bane.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_kisume_01" + "Ability4" "thtd_kisume_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_NO_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + "ProjectileModel" "particles/units/heroes/hero_bane/bane_projectile.vpcf" + "ProjectileSpeed" "1000" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "50" + "StatusManaRegen" "2.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "komachi" + { + // General + //---------------------------------------------------------------- + "Model" "models/komachi/komachi.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1" + "IsAncient" "1" + // "SoundSet" "Hero_Necrolyte" + // "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_necrolyte.vsndevts" //紫色弹道 + "SoundSet" "Hero_Magnataur" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_magnataur.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_komachi_01" + "Ability4" "thtd_komachi_02" + "Ability5" "thtd_komachi_03" + "Ability6" "thtd_komachi_04" + "Ability7" "ability_common_power_buff" + "Ability8" "thtd_komachi_05" + "Ability9" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.1" + "AttackAnimationPoint" "0.5" + "AttackAcquisitionRange" "900" + "AttackRange" "900" + // "ProjectileModel" "particles/units/heroes/hero_necrolyte/necrolyte_base_attack.vpcf" + // "ProjectileSpeed" "1200" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "80" + "StatusManaRegen" "8.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "kyouko" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd_hero/kyouko/kyouko.vmdl" + // "Model" "models/heroes/juggernaut/juggernaut.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.0" + "IsAncient" "1" + "SoundSet" "Hero_QueenOfPain" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_queenofpain.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_kyouko_01" + "Ability4" "thtd_kyouko_02" + "Ability5" "" + "Ability6" "" + "Ability7" "ability_common_power_buff" + "Ability8" "thtd_kyouko_03" + "Ability9" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "1.0" + "AttackAnimationPoint" "0.4" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + "ProjectileModel" "particles/econ/events/ti10/attack_modifier_ti10.vpcf" + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "20" + "StatusManaRegen" "2.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + + "shikieiki" + { + // General + //---------------------------------------------------------------- + "Model" "models/thd2/shikieiki/shikieiki_mmd.vmdl" + "BaseClass" "npc_dota_creature" + "Level" "1" + "ModelScale" "1.2" + "IsAncient" "1" + "SoundSet" "Hero_Lion" + "GameSoundsFile" "soundevents/game_sounds_heroes/game_sounds_lion.vsndevts" + + // Abilities + //---------------------------------------------------------------- + "Ability1" "ability_touhoutd_star_up" + "Ability2" "ability_touhoutd_exp_up" + "Ability3" "thtd_shikieiki_01" + "Ability4" "thtd_shikieiki_02" + "Ability5" "thtd_shikieiki_03" + "Ability6" "thtd_shikieiki_04" + "Ability7" "ability_common_power_buff" + "Ability8" "thtd_shikieiki_05" + "Ability9" "ability_common_ai" + + // Armor + //---------------------------------------------------------------- + "ArmorPhysical" "0" + + // Attack + //---------------------------------------------------------------- + "AttackCapabilities" "DOTA_UNIT_CAP_RANGED_ATTACK" + "AttackDamageMin" "2" + "AttackDamageMax" "2" + "AttackRate" "0.9" + "AttackAnimationPoint" "0.55" + "AttackAcquisitionRange" "1000" + "AttackRange" "1000" + "ProjectileModel" "particles/econ/events/ti10/attack_modifier_ti10.vpcf" //particles/units/heroes/hero_lion/lion_base_attack.vpcf + "ProjectileSpeed" "1400" + + // Bounds + //---------------------------------------------------------------- + "RingRadius" "100" + "HealthBarOffset" "128" + + // Movement + //---------------------------------------------------------------- + "MovementCapabilities" "DOTA_UNIT_CAP_MOVE_GROUND" + "MovementSpeed" "0" + + // Status + //---------------------------------------------------------------- + "StatusHealth" "100" + "StatusHealthRegen" "0.0" + "StatusMana" "80" + "StatusManaRegen" "4.0" + + // Vision + //---------------------------------------------------------------- + "VisionDaytimeRange" "800" + "VisionNighttimeRange" "800" + + // Team + //---------------------------------------------------------------- + "TeamName" "DOTA_TEAM_NEUTRALS" + + "CombatClassDefend" "DOTA_COMBAT_CLASS_DEFEND_BASIC" + "UnitRelationshipClass" "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT" + + "ConsideredHero" "1" + } + +} \ No newline at end of file diff --git a/scripts/shops.txt b/scripts/shops.txt new file mode 100755 index 0000000..b8df9e1 --- /dev/null +++ b/scripts/shops.txt @@ -0,0 +1,64 @@ +"dota_shops" +{ + "consumables" + { + } + + "attributes" + { + } + + "weapons_armor" + { + } + + "misc" + { + } + + // Level 1 - Green Recipes + "basics" + { + } + + // Level 2 - Blue Recipes + "support" + { + } + + "magics" + { + } + + // Level 3 - Purple Recipes + "defense" + { + } + + "weapons" + { + } + + // Level 4 - Orange / Orb / Artifacts + "artifacts" + { + } + + "sideshop1" + { + } + + "sideshop2" + { + } + + "secretshop" + { + "item" "item_1001" + "item" "item_1002" + "item" "item_1003" + "item" "item_1004" + "item" "item_1005" + "item" "item_1006" + } +} \ No newline at end of file diff --git a/scripts/vscripts/abilities/ability_lua/hanadayousei.lua b/scripts/vscripts/abilities/ability_lua/hanadayousei.lua new file mode 100755 index 0000000..155cfed --- /dev/null +++ b/scripts/vscripts/abilities/ability_lua/hanadayousei.lua @@ -0,0 +1,7 @@ +thtd_hanadayousei_01 = class({}) + +LinkLuaModifier("modifier_hanadayousei_01", "abilities/ability_lua/modifier_hanadayousei_01", LUA_MODIFIER_MOTION_NONE) + +function thtd_hanadayousei_01:GetIntrinsicModifierName() + return "modifier_hanadayousei_01" +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/ability_lua/hourainingyou.lua b/scripts/vscripts/abilities/ability_lua/hourainingyou.lua new file mode 100755 index 0000000..e266d62 --- /dev/null +++ b/scripts/vscripts/abilities/ability_lua/hourainingyou.lua @@ -0,0 +1,8 @@ +thtd_hourainingyou_01 = class({}) + +LinkLuaModifier("modifier_hourainingyou_01", "abilities/ability_lua/modifier_hourainingyou_01", LUA_MODIFIER_MOTION_NONE) +LinkLuaModifier("modifier_hourainingyou_01_stun_lock", "abilities/ability_lua/modifier_hourainingyou_01_stun_lock", LUA_MODIFIER_MOTION_NONE) + +function thtd_hourainingyou_01:GetIntrinsicModifierName() + return "modifier_hourainingyou_01" +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/ability_lua/lily.lua b/scripts/vscripts/abilities/ability_lua/lily.lua new file mode 100755 index 0000000..1391750 --- /dev/null +++ b/scripts/vscripts/abilities/ability_lua/lily.lua @@ -0,0 +1,83 @@ +thtd_lily_01 = class({}) + +LinkLuaModifier("modifier_lily_01_effect_think", "abilities/ability_lua/modifier_lily_01_effect_think", LUA_MODIFIER_MOTION_NONE) + +function thtd_lily_01:GetIntrinsicModifierName() + return "modifier_lily_01_effect_think" +end + +function thtd_lily_01:GetAOERadius() + return self:GetSpecialValueFor("radius") +end + +function thtd_lily_01:OnSpellStart() + if SpawnSystem.IsUnLimited then return end + if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE then return end + local caster = self:GetCaster() + local ability = self + local targetPoint = self:GetCursorPosition() + + local targets = + FindUnitsInRadius( + caster:GetTeamNumber(), + targetPoint, + nil, + ability:GetSpecialValueFor("radius"), + ability:GetAbilityTargetTeam(), + ability:GetAbilityTargetType(), + ability:GetAbilityTargetFlags(), + FIND_CLOSEST, + false + ) + + local exp = 1000 + caster:THTD_GetPower() * ability:GetSpecialValueFor("power_factor") + + for k,v in pairs(targets) do + if v ~= nil and v:IsNull() == false and v:THTD_IsTower() and v ~= caster and v:GetOwner() == caster:GetOwner() and v:THTD_GetLevel() < THTD_MAX_LEVEL then + v:THTD_AddExp(exp) + end + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/lily/ability_lily_01_a.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + + +thtd_lily_02 = class({}) + +LinkLuaModifier("modifier_lily_02_buff", "abilities/ability_lua/modifier_lily_02_buff", LUA_MODIFIER_MOTION_NONE) + +function thtd_lily_02:OnSpellStart() + local caster = self:GetCaster() + + caster:EmitSound("Sound_THTD.thtd_lily_02") + + self.radius = self:GetSpecialValueFor("radius") + self.duration = self:GetSpecialValueFor("duration") + self.damage_up = self:GetSpecialValueFor("damage_up") + + local targets = + FindUnitsInRadius( + caster:GetTeamNumber(), + caster:GetOrigin(), + nil, + self.radius, + self:GetAbilityTargetTeam(), + self:GetAbilityTargetType(), + self:GetAbilityTargetFlags(), + FIND_CLOSEST, + false + ) + + for k,v in pairs(targets) do + if not v:HasModifier("modifier_lily_02_buff") then + v:AddNewModifier(caster, self, "modifier_lily_02_buff", {Duration = self.duration}) + end + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/lily/ability_lily_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(self.radius,self.radius,self.radius)) + ParticleManager:DestroyParticleSystemTime(effectIndex,self.duration) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/ability_lua/modifier_hanadayousei_01.lua b/scripts/vscripts/abilities/ability_lua/modifier_hanadayousei_01.lua new file mode 100755 index 0000000..101f836 --- /dev/null +++ b/scripts/vscripts/abilities/ability_lua/modifier_hanadayousei_01.lua @@ -0,0 +1,61 @@ +modifier_hanadayousei_01 = class({}) + +local public = modifier_hanadayousei_01 + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_hanadayousei_01" +end + +-------------------------------------------------------------------------------- + +function public:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_ATTACK, + } + return funcs +end + +function public:OnAttack( params ) + if IsServer() then + if params.attacker ~= self:GetParent() or self:GetParent():IsIllusion() then return end + if self:GetParent():PassivesDisabled() then return end + + local caster = params.attacker + local target = params.target + + if caster.__hanadayousei_lock ~= true then + caster.__hanadayousei_lock = true + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),800) + local count = 1 + for i=1,#targets do + local unit = targets[i] + if unit~=nil and unit:IsNull()==false and unit~=target and unit:IsAlive() then + caster:PerformAttack(unit,true,false,true,false,true,false,true) + count = count + 1 + end + if count > 3 then + break + end + end + caster.__hanadayousei_lock = false + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/ability_lua/modifier_hourainingyou_01.lua b/scripts/vscripts/abilities/ability_lua/modifier_hourainingyou_01.lua new file mode 100755 index 0000000..291e0ec --- /dev/null +++ b/scripts/vscripts/abilities/ability_lua/modifier_hourainingyou_01.lua @@ -0,0 +1,61 @@ +modifier_hourainingyou_01 = class({}) + +local public = modifier_hourainingyou_01 + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_hourainingyou_01" +end + +-------------------------------------------------------------------------------- + +function public:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_ATTACK_LANDED, + } + return funcs +end + +function public:OnAttackLanded( params ) + if IsServer() then + if params.attacker ~= self:GetParent() or self:GetParent():IsIllusion() then return end + if self:GetParent():PassivesDisabled() then return end + + local caster = params.attacker + local target = params.target + local ability = self:GetAbility() + + if RollPercentage(ability:GetSpecialValueFor("chance")) then + if not target:HasModifier("modifier_hourainingyou_01_stun_lock") then + target:AddNewModifier(caster, ability, "modifier_hourainingyou_01_stun_lock", {Duration = ability:GetSpecialValueFor("lock_time")}) + UnitStunTarget(caster,target,ability:GetSpecialValueFor("stun_time")) + end + local DamageTable = { + ability = ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(ability), + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/ability_lua/modifier_hourainingyou_01_stun_lock.lua b/scripts/vscripts/abilities/ability_lua/modifier_hourainingyou_01_stun_lock.lua new file mode 100755 index 0000000..9f96405 --- /dev/null +++ b/scripts/vscripts/abilities/ability_lua/modifier_hourainingyou_01_stun_lock.lua @@ -0,0 +1,27 @@ +modifier_hourainingyou_01_stun_lock = class({}) + +local public = modifier_hourainingyou_01_stun_lock + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_hourainingyou_01" +end + +-------------------------------------------------------------------------------- diff --git a/scripts/vscripts/abilities/ability_lua/modifier_lily_01_effect_think.lua b/scripts/vscripts/abilities/ability_lua/modifier_lily_01_effect_think.lua new file mode 100755 index 0000000..1042f00 --- /dev/null +++ b/scripts/vscripts/abilities/ability_lua/modifier_lily_01_effect_think.lua @@ -0,0 +1,50 @@ +modifier_lily_01_effect_think = class({}) + +local public = modifier_lily_01_effect_think + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE +end + +function public:OnIntervalThink() + if IsServer() then + local caster = self:GetParent() + local ability = self:GetAbility() + + if ability:IsCooldownReady() and ability:IsFullyCastable() and SpawnSystem.IsUnLimited == false then + if caster.thtd_lily_01_effectIndex == nil then + caster.thtd_lily_01_effectIndex = ParticleManager:CreateParticle("particles/heroes/lily/ability_lily_01_ready.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(caster.thtd_lily_01_effectIndex , 0, caster, 5, "follow_origin", Vector(0,0,0), true) + end + elseif caster.thtd_lily_01_effectIndex ~= nil then + ParticleManager:DestroyParticleSystem(caster.thtd_lily_01_effectIndex,true) + caster.thtd_lily_01_effectIndex = nil + end + end +end + +function public:OnCreated(kv) + if IsServer() then + self:StartIntervalThink(self:GetAbility():GetSpecialValueFor("effect_tick")) + end +end + + +function public:OnDestroy(kv) + if IsServer() then + self:StartIntervalThink(-1) + end +end + diff --git a/scripts/vscripts/abilities/ability_lua/modifier_lily_02_buff.lua b/scripts/vscripts/abilities/ability_lua/modifier_lily_02_buff.lua new file mode 100755 index 0000000..db1e089 --- /dev/null +++ b/scripts/vscripts/abilities/ability_lua/modifier_lily_02_buff.lua @@ -0,0 +1,51 @@ +modifier_lily_02_buff = class({}) + +local public = modifier_lily_02_buff + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_lily_02" +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + local target = self:GetParent() + local ability_damage_up = self:GetAbility():GetSpecialValueFor("damage_up") + + local playerid = self:GetCaster():GetPlayerOwnerID() + local crit = 1.0 + if GameRules.player_bb_buff[playerid]["item_3029"] > 0 then + crit = 1 + GameRules.player_bb_buff[playerid]["item_3029"]/100 + end + + local bonus = math.floor(ability_damage_up * crit) + target:AddDamageOutgoingAll(bonus, "thtd_lily_02_damage_up") + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + self:GetParent():AddDamageOutgoingAll("thtd_lily_02_damage_up") + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/ability_lua/modifier_mugiyousei_01.lua b/scripts/vscripts/abilities/ability_lua/modifier_mugiyousei_01.lua new file mode 100755 index 0000000..c9d1d27 --- /dev/null +++ b/scripts/vscripts/abilities/ability_lua/modifier_mugiyousei_01.lua @@ -0,0 +1,74 @@ +modifier_mugiyousei_01 = class({}) + +local public = modifier_mugiyousei_01 + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_mugiyousei_01" +end + +-------------------------------------------------------------------------------- + +function public:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_ATTACK_LANDED, + } + return funcs +end + +function public:OnAttackLanded( params ) + if IsServer() then + if params.attacker ~= self:GetParent() or self:GetParent():IsIllusion() then return end + if self:GetParent():PassivesDisabled() then return end + + local caster = params.attacker + local target = params.target + local ability = self:GetAbility() + + local damage = caster:THTD_GetAbilityPowerDamage(ability) + + local time = ability:GetSpecialValueFor("damage_duration") + target:AddPoison(1, caster) + target:SetContextThink(DoUniqueString("thtd_mugiyousei01_attack"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 or THTD_IsValid(target) == false then + if target ~= nil and target:IsNull() == false then + target:AddPoison(-1) + end + return nil + end + + local DamageTable = { + ability = ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + time = time - 1.0 + return 1.0 + end, + 0) + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/ability_lua/modifier_nazrin_01.lua b/scripts/vscripts/abilities/ability_lua/modifier_nazrin_01.lua new file mode 100755 index 0000000..a6abce9 --- /dev/null +++ b/scripts/vscripts/abilities/ability_lua/modifier_nazrin_01.lua @@ -0,0 +1,102 @@ +modifier_nazrin_01 = class({}) + +local public = modifier_nazrin_01 + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_nazrin_01" +end + +-------------------------------------------------------------------------------- + +function public:DeclareFunctions() + local funcs = { + MODIFIER_EVENT_ON_ATTACK_LANDED, + } + return funcs +end + +function public:OnAttackLanded( params ) + if IsServer() then + -- 必须加下下面判断,否则会对所有单位攻击都有效,因lua这个是按事件处理,和KV的不同,只要是攻击这个行为就会触发事件,所以尽量不要使用lua的OnXXX事件方式 + if params.attacker ~= self:GetParent() or self:GetParent():IsIllusion() then return end + if self:GetParent():PassivesDisabled() then return end + + -- PrintTable(params) + -- [VScript] attacker: + -- [VScript] basher_tested: false + -- [VScript] cost: 0 + -- [VScript] damage: 4 + -- [VScript] damage_category: 1 + -- [VScript] damage_flags: 0 + -- [VScript] damage_type: 1 + -- [VScript] diffusal_applied: false + -- [VScript] distance: 0 + -- [VScript] do_not_consume: false + -- [VScript] fail_type: 0 + -- [VScript] gain: 0 + -- [VScript] heart_regen_applied: false + -- [VScript] ignore_invis: false + -- [VScript] issuer_player_index: 0 + -- [VScript] mkb_tested: false + -- [VScript] new_pos: Vector 0000000003530FA8 [0.000000 0.000000 0.000000] + -- [VScript] no_attack_cooldown: false + -- [VScript] order_type: 0 + -- [VScript] original_damage: 4 + -- [VScript] process_procs: true + -- [VScript] ranged_attack: true + -- [VScript] record: 1 + -- [VScript] reincarnate: false + -- [VScript] stout_tested: false + -- [VScript] target: + + local caster = params.attacker + local target = params.target + local ability = self:GetAbility() + + if SpawnSystem.IsUnLimited then + if caster:HasModifier("modifier_byakuren_03_buff") then + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),400) + local damage = caster:GetGold()*caster:THTD_GetStar()*caster.thtd_byakuren_buff_nazrin + for k,v in pairs(targets) do + local DamageTable = { + ability = ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + return + end + + if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE then return end + + if RollPercentage(ability:GetSpecialValueFor("bonus_chance")) then + local gold = math.floor(caster:THTD_GetPower() * ability:GetSpecialValueFor("power_percent")/100 + ability:GetSpecialValueFor("bonus_gold")) + THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), gold , true, DOTA_ModifyGold_CreepKill) + SendOverheadEventMessage(caster:GetPlayerOwner(), OVERHEAD_ALERT_GOLD, target, gold, caster:GetPlayerOwner() ) + caster:EmitSound("Sound_THTD.thtd_nazrin_01") + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/ability_lua/mugiyousei.lua b/scripts/vscripts/abilities/ability_lua/mugiyousei.lua new file mode 100755 index 0000000..167ea15 --- /dev/null +++ b/scripts/vscripts/abilities/ability_lua/mugiyousei.lua @@ -0,0 +1,7 @@ +thtd_mugiyousei_01 = class({}) + +LinkLuaModifier("modifier_mugiyousei_01", "abilities/ability_lua/modifier_mugiyousei_01", LUA_MODIFIER_MOTION_NONE) + +function thtd_mugiyousei_01:GetIntrinsicModifierName() + return "modifier_mugiyousei_01" +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/ability_lua/nazrin.lua b/scripts/vscripts/abilities/ability_lua/nazrin.lua new file mode 100755 index 0000000..ccf1048 --- /dev/null +++ b/scripts/vscripts/abilities/ability_lua/nazrin.lua @@ -0,0 +1,7 @@ +thtd_nazrin_01 = class({}) + +LinkLuaModifier("modifier_nazrin_01", "abilities/ability_lua/modifier_nazrin_01", LUA_MODIFIER_MOTION_NONE) + +function thtd_nazrin_01:GetIntrinsicModifierName() + return "modifier_nazrin_01" +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityalice.lua b/scripts/vscripts/abilities/abilityalice.lua new file mode 100755 index 0000000..9c099f5 --- /dev/null +++ b/scripts/vscripts/abilities/abilityalice.lua @@ -0,0 +1,395 @@ + +function OnAlice01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local unit = CreateUnitByName( + "alice_boom", + targetPoint, + false, + caster:GetOwner(), + caster:GetOwner(), + caster:GetTeam() + ) + if (unit == nil) then return end + unit.thtd_spawn_unit_owner = caster + unit:SetControllableByPlayer(caster:GetPlayerOwnerID(), true) + FindClearSpaceForUnit(unit, targetPoint, false) + keys.ability:ApplyDataDrivenModifier(caster, unit, "modifier_alice_01_rooted", {}) + keys.ability:ApplyDataDrivenModifier(caster, unit, "modifier_alice_boom_tracker", {}) + unit:AddNewModifier(unit, nil, "modifier_invisible", nil) + + local ability = unit:FindAbilityByName("thtd_alice_unit_kill") + if ability then + ability:SetLevel(1) + end + local time = keys.duration_time + caster:SetContextThink(DoUniqueString("thtd_alice_01"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if unit==nil or unit:IsNull() or unit:IsAlive()==false then + return nil + end + if caster==nil or caster:IsNull() or caster:IsAlive()==false or caster:THTD_IsHidden() or time <= 0 then + unit:AddNoDraw() + unit:ForceKill(false) + return nil + end + + local enemies = THTD_FindUnitsInRadius(caster, targetPoint, keys.range1) + if #enemies > 0 then + enemies = THTD_FindUnitsInRadius(caster, targetPoint, keys.range2) + if ability then + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (caster.thtd_alice03_damage_up or 1) + if caster:HasModifier("modifier_alice_power666") then + damage = damage * 3 + end + + for k,v in pairs(enemies) do + local d = GetDistanceBetweenTwoVec2D(targetPoint, v:GetAbsOrigin()) + local factor = 1.0 + if d <= keys.range1 then + factor = 5 + else + factor = keys.range2 / d + end + if v~=nil and v:IsNull()==false and v:IsAlive() then + UnitStunTarget(caster,v,keys.stun_time * math.min(2.0, factor)) + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage * factor, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + unit:CastAbilityNoTarget(ability, caster:GetPlayerOwnerID()) + unit:EmitSound("Hero_Techies.LandMine.Detonate") + return nil + end + end + time = time - 0.2 + return 0.2 + end, + 0) +end + +function OnAliceUnitKillSpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + caster:SetContextThink(DoUniqueString("thtd_alice_unit"), + function() + local owner = caster.thtd_spawn_unit_owner + if owner:IsPower666() then + local modifier = owner:FindModifierByName("modifier_alice_power666") + if modifier == nil then + owner:FindAbilityByName("thtd_alice_01"):ApplyDataDrivenModifier(owner, owner, "modifier_alice_power666", {Duration=10.0}) + else + modifier:SetDuration(10.0, false) + end + end + caster:AddNoDraw() + caster:ForceKill(false) + return nil + end, + 0.5) +end + +function OnAlice02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + local unit = CreateUnitByName( + "alice_falanxi_ningyou" + ,caster:GetOrigin() + caster:GetForwardVector() * 500 + ,false + ,caster:GetOwner() + ,caster:GetOwner() + ,caster:GetTeam() + ) + if unit == nil then + keys.ability:EndCooldown() + return + end + Margatroid_CreateLine(caster, unit) + FindClearSpaceForUnit(unit, unit:GetOrigin(), false) + unit:SetControllableByPlayer(caster:GetPlayerOwnerID(), false) + unit:SetHasInventory(false) + unit.thtd_spawn_unit_owner = caster + + local oldSwpanUnit = caster.thtd_summon_unit + if oldSwpanUnit ~=nil and oldSwpanUnit:IsNull() == false then + oldSwpanUnit:AddNoDraw() + oldSwpanUnit:ForceKill(false) + end + caster.thtd_summon_unit = unit + + keys.ability:ApplyDataDrivenModifier(caster, unit, "modifier_alice_02", nil) + + local powerStack = 0 + local pv = caster:GetAbilityPowerValue("thtd_alice_02") + if pv ~= nil then + powerStack = pv[1] + end + + local hero = caster:GetOwner() + if GameRules.player_bb_buff[hero.thtd_player_id]["item_3016"] > 0 or powerStack > 0 then + unit:AddNewModifier(unit, nil, "modifier_bb_buff_3016_effect", nil):SetStackCount(GameRules.player_bb_buff[hero.thtd_player_id]["item_3016"] + powerStack) + end + + -- local ability = unit:FindAbilityByName("doom_bringer_infernal_blade") + unit:SetContextThink(DoUniqueString("modifier_alice_02"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if caster==nil or caster:IsNull() or caster:IsAlive()==false or caster:THTD_IsHidden() then + ParticleManager:DestroyParticleSystem(unit.effect_line, true) + unit:AddNoDraw() + unit:ForceKill(false) + caster.thtd_summon_unit = nil + return nil + end + + unit:SetBaseDamageMax(caster:THTD_GetAttack()) + unit:SetBaseDamageMin(caster:THTD_GetAttack()) + + if GetDistanceBetweenTwoVec2D(caster:GetOrigin(), unit:GetOrigin()) > 1000 then + local forward = (unit:GetAbsOrigin() - caster:GetAbsOrigin()):Normalized() + unit:MoveToPosition(caster:GetOrigin() + forward*1000) + end + + return 0.3 + end, + 0) +end + +function OnAlice02Ningyou01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local owner = caster.thtd_spawn_unit_owner + local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_techies/techies_land_mine_explode.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(particle,0,target:GetOrigin()+Vector(0,0,64)) + ParticleManager:DestroyParticleSystem(particle,false) + + local targets = THTD_FindUnitsInRadius(owner, target:GetOrigin(), keys.range) + local damage = owner:THTD_GetStarDamage() * keys.power_damage * (owner.thtd_alice03_damage_up or 1) + if owner:HasModifier("modifier_alice_power666") then + damage = damage * 3 + end + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = owner, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE, + } + UnitDamageTarget(DamageTable) +end + +function OnAlice02Ningyou02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) --buff提供者 + local target = keys.target -- 被攻击目标 + + if RollPercentage(keys.CritChance) then + UnitDamageHpRemove(caster.thtd_spawn_unit_owner, target, keys.CritHealth) + end +end + +function OnAlice04SpellStart(keys) + local caster=keys.caster + local caster_pos=caster:GetOrigin() + local direction=(keys.target:GetOrigin()-caster_pos):Normalized() + local base_pos=caster_pos-direction*keys.Radius + + caster:MoveToTargetToAttack(keys.target) + caster.thtd_alice03_damage_up = keys.damage_up + + local dolls_and_pos={} -- [doll,start_pos] + + local start_pos=base_pos + local doll0=Margatroid_CreateDoll(caster,caster_pos+(start_pos-caster_pos):Normalized()*20,direction) + keys.ability:ApplyDataDrivenModifier(caster, doll0, "modifier_alice_04_rooted", {}) + dolls_and_pos[1]={doll=doll0,start_pos=start_pos} + + local rotate_angle=QAngle(0,35,0) + local start_pos=RotatePosition(caster_pos,rotate_angle,base_pos) + local doll=Margatroid_CreateDoll(caster,caster_pos+(start_pos-caster_pos):Normalized()*20,direction) + keys.ability:ApplyDataDrivenModifier(caster, doll, "modifier_alice_04_rooted", {}) + dolls_and_pos[2]={doll=doll,start_pos=start_pos} + + local rotate_angle=QAngle(0,-35,0) + local start_pos=RotatePosition(caster_pos,rotate_angle,base_pos) + local doll=Margatroid_CreateDoll(caster,caster_pos+(start_pos-caster_pos):Normalized()*20,direction) + keys.ability:ApplyDataDrivenModifier(caster, doll, "modifier_alice_04_rooted", {}) + dolls_and_pos[3]={doll=doll,start_pos=start_pos} + + local rotate_angle=QAngle(0,70,0) + local start_pos=RotatePosition(caster_pos,rotate_angle,base_pos) + local doll=Margatroid_CreateDoll(caster,caster_pos+(start_pos-caster_pos):Normalized()*20,direction) + keys.ability:ApplyDataDrivenModifier(caster, doll, "modifier_alice_04_rooted", {}) + dolls_and_pos[4]={doll=doll,start_pos=start_pos} + + local rotate_angle=QAngle(0,-70,0) + local start_pos=RotatePosition(caster_pos,rotate_angle,base_pos) + local doll=Margatroid_CreateDoll(caster,caster_pos+(start_pos-caster_pos):Normalized()*20,direction) + keys.ability:ApplyDataDrivenModifier(caster, doll, "modifier_alice_04_rooted", {}) + dolls_and_pos[5]={doll=doll,start_pos=start_pos} + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_alice_03") + if pv ~= nil then + powerDamage = pv[1] + end + + for _,tab in pairs(dolls_and_pos) do + local OnDollFinshMove= + function (hDoll) + local doll_pos=hDoll:GetOrigin() + local target_dir=direction + hDoll:SetForwardVector(target_dir) + local time = (keys.max_count - 1) * 0.4 + local caster = hDoll.thtd_spawn_unit_owner + + hDoll:SetContextThink( + DoUniqueString("margatroid02_action_delay"), + function () + if caster==nil or caster:IsNull() or caster:IsAlive()==false or caster:THTD_IsHidden() or time <= 0 then + ParticleManager:DestroyParticleSystem(hDoll.effect_line ,false) + hDoll:AddNoDraw() + hDoll:ForceKill(false) + if caster ~= nil then caster.thtd_alice03_damage_up = nil end + return nil + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/alice/ability_alice_02.vpcf", PATTACH_CUSTOMORIGIN, hDoll) + ParticleManager:SetParticleControl(effectIndex, 0, hDoll:GetAttachmentOrigin(hDoll:ScriptLookupAttachment("attach_attack1"))+Vector(0,0,30)) + ParticleManager:SetParticleControl(effectIndex, 1, hDoll:GetOrigin()+hDoll:GetForwardVector()*keys.Distance) + ParticleManager:SetParticleControl(effectIndex, 9, hDoll:GetAttachmentOrigin(hDoll:ScriptLookupAttachment("attach_attack1"))+Vector(0,0,30)) + hDoll:EmitSound("Voice_Thdots_Alice.AbilityAlice011") + + -- local angles=VectorToAngles(target_dir) + -- angles.y=-angles.y + -- --print("x0="..tostring(target_dir.x).." y0="..tostring(target_dir.y).." z0="..tostring(target_dir.z)) + -- --print("x1="..tostring(angles.x).." y1="..tostring(angles.y).." z1="..tostring(angles.z)) + -- local rotate_angle=angles + -- local enemies=FindUnitsInRadius( + -- caster:GetTeamNumber(), + -- doll_pos+target_dir*keys.Distance*0.5, + -- nil, + -- keys.Distance, + -- DOTA_UNIT_TARGET_TEAM_ENEMY, + -- DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + -- DOTA_UNIT_TARGET_FLAG_NONE, + -- FIND_ANY_ORDER, + -- false) + -- local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + -- for __,enemy in pairs(enemies) do + -- local after_rotate_pos=RotatePosition(doll_pos,rotate_angle,enemy:GetOrigin()) + -- if math.abs(after_rotate_pos.y-doll_pos.y) 0 then + caster:FindAbilityByName("thtd_aya_02"):EndCooldown() + end +end + +function OnAya01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local entities = THTD_FindUnitsAll(caster) + for k,v in pairs(entities) do + local modifier = v:FindModifierByName("modifier_aya01_news_buff") + if modifier == nil then + modifier = v:FindModifierByName("modifier_hatate01_news_buff") + end + if modifier ~= nil then + local count = modifier:GetStackCount() + if count < 999 then + modifier:SetStackCount(count + 1) + end + end + end + + local damage_table = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAttack() * GetAyaBuffCrit(caster, target), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) +end + +function GetAyaBuffCrit(caster, target) + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_aya_01") + if pv ~= nil then + powerDamage = pv[2] + end + + local damage_up = caster:GetAbilityValue("thtd_aya_01", "damage_up") + powerDamage + if caster:IsPower999() then + damage_up = damage_up + 4 + end + + local crit = 1.0 + local modifier = target:FindModifierByName("modifier_aya01_news_buff") + if modifier == nil then + modifier = target:FindModifierByName("modifier_hatate01_news_buff") + end + if modifier ~= nil then + crit = crit + modifier:GetStackCount() * damage_up / 100 + end + if caster:IsPower666() then + crit = crit * 4 + end + return crit +end + +function OnAya02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + local rad = GetRadBetweenTwoVec2D(caster:GetOrigin(),targetPoint) + + caster:StartGesture(ACT_DOTA_CAST_ABILITY_2) + caster:SetForwardVector(Vector(math.cos(rad),math.sin(rad),0)) + + keys.ability:ApplyDataDrivenModifier(caster,caster,"modifier_aya_02_pause", nil) + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_aya_02") + if pv ~= nil then + powerDamage = pv[1] + end + + caster.last_start_point = caster:GetAbsOrigin() + local count = 0 + caster:SetContextThink(DoUniqueString("ability_aya_02_move"), + function () + if GameRules:IsGamePaused() then return 0.03 end + if GetDistanceBetweenTwoVec2D(caster:GetOrigin(), targetPoint) >= 90 and GetDistanceBetweenTwoVec2D(caster:GetOrigin(), targetPoint) < keys.ability:GetCastRange() + and caster:HasModifier("modifier_touhoutd_release_hidden") == false then + local vOrgin = caster:GetOrigin() + local vCurrent = vOrgin + Vector(math.cos(rad),math.sin(rad),0)*90 + caster:SetAbsOrigin(vCurrent) + count = count + 1 + if count >= 5 then + count = 0 + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster.last_start_point, + vCurrent, + nil, + 200, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + caster.last_start_point = vCurrent + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage() + for _,v in pairs(targets) do + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage * GetAyaBuffCrit(caster, v), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + + if caster:FindAbilityByName("thtd_aya_03"):GetLevel() > 0 then + OnAyaAttack(keys,v) + end + end + end + else + local vCurrent = caster:GetAbsOrigin() + FindClearSpaceForUnit(caster, vCurrent, false) + caster:THTD_DestroyLevelEffect() + caster:THTD_CreateLevelEffect() + caster:RemoveGesture(ACT_DOTA_CAST_ABILITY_2) + caster:RemoveModifierByName("modifier_aya_02_pause") + if count > 0 then + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster.last_start_point, + vCurrent, + nil, + 200, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage() + for _,v in pairs(targets) do + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage * GetAyaBuffCrit(caster, v), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + + if caster:FindAbilityByName("thtd_aya_03"):GetLevel() > 0 then + OnAyaAttack(keys,v) + end + end + end + return nil + end + return 0.03 + end, + 0.03) +end + +function OnAyaAttack(keys,target) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster:HasModifier("modifier_eirin_02_spell_buff") then + local eirin = caster:FindModifierByName("modifier_eirin_02_spell_buff"):GetCaster() + if eirin ~= nil then + OnAyaLinkToEirin01(eirin,target,caster) + end + end + + if caster:HasModifier("modifier_item_2011_attack_stun") then + --todo + end + + -- 基本上可叠 300 - 700 层 + local entities = THTD_FindUnitsAll(caster) + for k,v in pairs(entities) do + local modifier = v:FindModifierByName("modifier_aya01_news_buff") + if modifier == nil then + modifier = v:FindModifierByName("modifier_hatate01_news_buff") + end + if modifier ~= nil then + local count = modifier:GetStackCount() + if count < 999 then + modifier:SetStackCount(count + 1) + end + end + end + + local damage_table = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAttack() * GetAyaBuffCrit(caster, target), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + + if RollPercentage(caster:GetAbilityValue("thtd_aya_01", "chance")) then + OnAya01AttackEffectSuccess(keys,caster,target) + end +end + +function OnAya03WingsSpellThink(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if keys.ability:GetLevel() < 1 then + if caster.thtd_aya_03_wings~=nil and caster.thtd_aya_03_wings:IsNull()==false then + caster.thtd_aya_03_wings:RemoveSelf() + caster.thtd_aya_03_wings = nil + end + return + end + + if caster.thtd_aya_03_wings == nil then + caster.thtd_aya_03_wings = CreateUnitByName( + "npc_unit_aya_03_wings", + caster:GetOrigin(), + false, + caster, + caster, + caster:GetTeam() + ) + caster.thtd_aya_03_wings:FollowEntity( caster, true ) + end +end + +function OnAyaLinkToEirin01(caster,target,attacker) + local ability = caster:FindAbilityByName("thtd_eirin_01") + local manaCost = ability:GetSpecialValueFor("mana_cost") + local manaBonus = ability:GetSpecialValueFor("mana_bonus")/100 + local manaChance = ability:GetSpecialValueFor("mana_chance") + if caster:GetMana() >= manaCost then + if RollPercentage(caster:THTD_GetStar() * manaChance) then + caster:SetMana(math.min(caster:GetMaxMana(), caster:GetMana() - manaCost + caster:GetMaxMana() * manaBonus)) + else + caster:SetMana(caster:GetMana() - manaCost) + end + + local now = GameRules:GetGameTime() + if now - (target.thtd_eirin_01_project or 0) < 1 then + local delay = GetDistanceBetweenTwoVec2D(caster:GetAbsOrigin(), target:GetAbsOrigin()) / 1400 + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if IsValidAlive(target) then + local damage = caster:THTD_GetAbilityPowerDamage(ability) + local DamageTable = { + ability = ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + Eirin01HitCount(caster) + end + return nil + end, + delay) + return + end + target.thtd_eirin_01_project = now + + caster:StartGesture(ACT_DOTA_CAST_ABILITY_1) + local info = + { + Target = target, + Source = caster, + Ability = ability, + EffectName = "particles/heroes/thtd_eirin/ability_eirin_01.vpcf", + iMoveSpeed = 1400, + vSourceLoc= caster:GetAbsOrigin(), -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, -- Optional + iVisionRadius = 400, -- Optional + iVisionTeamNumber = caster:GetTeamNumber(), -- Optional + ExtraData = { -- 注意,只支持简单类型,不支持 table数据 + attacker_entindex = attacker:GetEntityIndex() + } + } + local projectile = ProjectileManager:CreateTrackingProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + end +end + +-- 同abilityeirin.lua +function Eirin01HitCount(caster) + if caster.thtd_eirin_01_count_lock == true then + return + end + + if not caster:HasModifier("modifier_eirin_01_count") then + caster:FindAbilityByName("thtd_eirin_02"):ApplyDataDrivenModifier(caster, caster, "modifier_eirin_01_count", {duration = SpawnSystem.CurTime}) + local effectName = "particles/addons_gameplay/morokai_orb_overhead_counter.vpcf" + local effectIndex = ParticleManager:CreateParticle(effectName, PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin() + Vector(0, 0, 410)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(1, 0, 0)) + caster.thtd_eirin_01_count_effect = effectIndex + end + + caster.thtd_eirin_01_count = (caster.thtd_eirin_01_count or 0) + 1 + if caster.thtd_eirin_01_count > 500 then + caster.thtd_eirin_01_count = 500 + return + end + + local one = math.floor(caster.thtd_eirin_01_count/100) + local two = math.floor((caster.thtd_eirin_01_count - one * 100)/10) + local three = caster.thtd_eirin_01_count - one * 100 - two * 10 + if three == 0 then three = 1 end + ParticleManager:SetParticleControl(caster.thtd_eirin_01_count_effect, 2, Vector(three, two, one)) +end + diff --git a/scripts/vscripts/abilities/abilitybyakuren.lua b/scripts/vscripts/abilities/abilitybyakuren.lua new file mode 100755 index 0000000..b2908d3 --- /dev/null +++ b/scripts/vscripts/abilities/abilitybyakuren.lua @@ -0,0 +1,371 @@ +function OnByakuren01SpellStartUp(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + --解决浮点数精度问题 + local tick_step = math.floor(keys.tick_step * 100 + 0.5) / 100 + local min_tick = math.floor(keys.min_tick * 100 + 0.5) / 100 + local max_tick = math.floor(keys.max_tick * 100 + 0.5) / 100 + local base_tick = math.floor(keys.base_tick * 100 + 0.5) / 100 + + if caster.thtd_byakuren_01_attack_time == nil then + caster.thtd_byakuren_01_attack_time = base_tick + end + + if caster.thtd_byakuren_01_extra_damage == nil then + caster.thtd_byakuren_01_extra_damage = 100 + end + + if caster.thtd_byakuren_01_attack_time > min_tick then + caster.thtd_byakuren_01_attack_time = caster.thtd_byakuren_01_attack_time - tick_step + caster.thtd_byakuren_01_extra_damage = caster.thtd_byakuren_01_extra_damage - keys.extra_damage + local modifier = caster:FindModifierByName("modifier_attack_time") or caster:AddNewModifier(caster, nil, "modifier_attack_time", {}) + if modifier ~= nil then + if caster.thtd_byakuren_01_attack_time <= min_tick then + modifier:SetStackCount((caster.thtd_byakuren_01_attack_time+tick_step)*10) + else + modifier:SetStackCount(caster.thtd_byakuren_01_attack_time*10) + end + end + end + + ByakurenUpdateBuff(caster) +end + +function OnByakuren01SpellStartDown(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + --解决浮点数精度问题 + local tick_step = math.floor(keys.tick_step * 100 + 0.5) / 100 + local min_tick = math.floor(keys.min_tick * 100 + 0.5) / 100 + local max_tick = math.floor(keys.max_tick * 100 + 0.5) / 100 + + if caster.thtd_byakuren_01_attack_time == nil then + caster.thtd_byakuren_01_attack_time = base_tick + end + + if caster.thtd_byakuren_01_extra_damage == nil then + caster.thtd_byakuren_01_extra_damage = 100 + end + + if caster.thtd_byakuren_01_attack_time < max_tick then + caster.thtd_byakuren_01_attack_time = caster.thtd_byakuren_01_attack_time + tick_step + caster.thtd_byakuren_01_extra_damage = caster.thtd_byakuren_01_extra_damage + keys.extra_damage + local modifier = caster:FindModifierByName("modifier_attack_time") or caster:AddNewModifier(caster, nil, "modifier_attack_time", {}) + if modifier ~= nil then + modifier:SetStackCount(caster.thtd_byakuren_01_attack_time*10) + end + end + + ByakurenUpdateBuff(caster) +end + +function ByakurenUpdateBuff(caster) + local ability = caster:FindAbilityByName("thtd_byakuren_01") + local base_tick = math.floor(ability:GetSpecialValueFor("base_tick") * 100 + 0.5) / 100 + + if caster.thtd_byakuren_01_attack_time == nil then + caster.thtd_byakuren_01_attack_time = base_tick + end + + if caster.thtd_byakuren_01_extra_damage == nil then + caster.thtd_byakuren_01_extra_damage = 100 + end + + if caster.thtd_byakuren_01_attack_time > base_tick then + caster:RemoveModifierByName("modifier_byakuren_attack_down") + caster:RemoveModifierByName("modifier_byakuren_attack_equal") + ability:ApplyDataDrivenModifier(caster, caster, "modifier_byakuren_attack_up", {}) + elseif caster.thtd_byakuren_01_attack_time == base_tick then + caster:RemoveModifierByName("modifier_byakuren_attack_down") + caster:RemoveModifierByName("modifier_byakuren_attack_up") + ability:ApplyDataDrivenModifier(caster, caster, "modifier_byakuren_attack_equal", {}) + elseif caster.thtd_byakuren_01_attack_time < base_tick then + caster:RemoveModifierByName("modifier_byakuren_attack_up") + caster:RemoveModifierByName("modifier_byakuren_attack_equal") + ability:ApplyDataDrivenModifier(caster, caster, "modifier_byakuren_attack_down", {}) + end + local modifier = caster:FindModifierByName("modifier_byakuren_damage_percent") or ability:ApplyDataDrivenModifier(caster, caster, "modifier_byakuren_damage_percent", {}) + if modifier ~= nil then + modifier:SetStackCount(caster.thtd_byakuren_01_extra_damage) + end + + local ability = caster:FindAbilityByName("thtd_byakuren_04") + if ability:GetLevel() > 0 then + if caster.thtd_byakuren_01_attack_time > base_tick then + if caster:HasModifier("modifier_byakuren_04_magic_buff") == false then + ability:ApplyDataDrivenModifier(caster,caster,"modifier_byakuren_04_magic_buff", nil) + end + if caster:HasModifier("modifier_byakuren_04_physical_buff") then + caster:RemoveModifierByName("modifier_byakuren_04_physical_buff") + end + if caster:HasModifier("modifier_byakuren_04_pure_buff") then + caster:RemoveModifierByName("modifier_byakuren_04_pure_buff") + end + elseif caster.thtd_byakuren_01_attack_time == base_tick then + if caster:HasModifier("modifier_byakuren_04_pure_buff") == false then + ability:ApplyDataDrivenModifier(caster,caster,"modifier_byakuren_04_pure_buff", nil) + end + if caster:HasModifier("modifier_byakuren_04_magic_buff") then + caster:RemoveModifierByName("modifier_byakuren_04_magic_buff") + end + if caster:HasModifier("modifier_byakuren_04_physical_buff") then + caster:RemoveModifierByName("modifier_byakuren_04_physical_buff") + end + elseif caster.thtd_byakuren_01_attack_time < base_tick then + if caster:HasModifier("modifier_byakuren_04_magic_buff") then + caster:RemoveModifierByName("modifier_byakuren_04_magic_buff") + end + if caster:HasModifier("modifier_byakuren_04_pure_buff") then + caster:RemoveModifierByName("modifier_byakuren_04_pure_buff") + end + end + else + if caster:HasModifier("modifier_byakuren_04_physical_buff") then + caster:RemoveModifierByName("modifier_byakuren_04_physical_buff") + end + if caster:HasModifier("modifier_byakuren_04_pure_buff") then + caster:RemoveModifierByName("modifier_byakuren_04_pure_buff") + end + if caster:HasModifier("modifier_byakuren_04_magic_buff") then + caster:RemoveModifierByName("modifier_byakuren_04_magic_buff") + end + end +end + +function OnByakuren01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster.thtd_byakuren_01_extra_damage == nil then + caster.thtd_byakuren_01_extra_damage = 100 + end + + local factor = 1 + THTD_GetStarLotusBuffedTowerCount(caster) * keys.damage_up / 100 + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * factor * caster.thtd_byakuren_01_extra_damage / 100 + + for k,v in pairs(targets) do + local damage_table = { + victim = v, + attacker = caster, + damage = damage, + ability = keys.ability, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE, + } + local base_tick = math.floor(keys.base_tick * 100 + 0.5) / 100 + if caster.thtd_byakuren_01_attack_time == base_tick then + damage_table.damage_type = DAMAGE_TYPE_PURE + elseif caster.thtd_byakuren_01_attack_time > base_tick then + damage_table.damage_type = DAMAGE_TYPE_MAGICAL + elseif caster.thtd_byakuren_01_attack_time < base_tick then + damage_table.damage_type = DAMAGE_TYPE_PHYSICAL + end + UnitDamageTarget(damage_table) + end + + local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_abaddon/abaddon_aphotic_shield_explosion.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(particle,0,target:GetOrigin()+Vector(0,0,64)) + ParticleManager:DestroyParticleSystem(particle,false) +end + +function OnByakuren03SpellThink(keys) + if GameRules:IsGamePaused() then return end + if keys.ability == nil or keys.ability:GetLevel() < 1 then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local targets = THTD_FindFriendlyUnitsInRadius(caster,caster:GetOrigin(),2500) + + for k,v in pairs(targets) do + if v:HasModifier("modifier_byakuren_03_buff") == false then + if THTD_IsStarLotusTower(v) then + if v.thtd_byakuren_03_religious_count == nil then + v.thtd_byakuren_03_religious_count = 0 + end + v.thtd_byakuren_03_religious_count = v.thtd_byakuren_03_religious_count + 1 + SendOverheadEventMessage(v:GetPlayerOwner(), OVERHEAD_ALERT_BONUS_POISON_DAMAGE, v, v.thtd_byakuren_03_religious_count, v:GetPlayerOwner() ) + if v.thtd_byakuren_03_religious_count > 6000 then + local unitName = v:GetUnitName() + if unitName == "nazrin" then + v.thtd_byakuren_buff_nazrin = keys.ability:GetSpecialValueFor("nazrin") + elseif unitName == "toramaru" then + v.thtd_byakuren_buff_toramaru = keys.ability:GetSpecialValueFor("toramaru") + elseif unitName == "kogasa" then + v.thtd_byakuren_buff_kogasa = keys.ability:GetSpecialValueFor("kogasa") + elseif unitName == "nue" then + v.thtd_byakuren_buff_nue = keys.ability:GetSpecialValueFor("nue") + elseif unitName == "minamitsu" then + v.thtd_byakuren_buff_minamitsu = keys.ability:GetSpecialValueFor("minamitsu") + elseif unitName == "kyouko" then + v.thtd_byakuren_buff_kyouko = keys.ability:GetSpecialValueFor("kyouko") + end + keys.ability:ApplyDataDrivenModifier(caster,v,"modifier_byakuren_03_buff", nil) + end + end + end + end +end + +local thtd_byakuren_04_point = +{ + [1] = Vector(-340,-145,32), + [2] = Vector(340,-145,32), + [3] = Vector(-185,220,32), + [0] = Vector(185,220,32), +} + +function OnByakuren04AttackLanded(keys) + if keys.ability:GetLevel() < 1 then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster.thtd_byakuren_04_init ~= true then + caster.thtd_byakuren_04_init = true + ByakurenUpdateBuff(caster) + end + + local base_tick = math.floor(caster:GetAbilityValue("thtd_byakuren_01", "base_tick") * 100 + 0.5) / 100 + + if caster.thtd_byakuren_01_attack_time == nil then + caster.thtd_byakuren_01_attack_time = base_tick + end + + if caster.thtd_byakuren_01_extra_damage == nil then + caster.thtd_byakuren_01_extra_damage = 100 + end + + + local buffedCount = THTD_GetStarLotusBuffedTowerCount(caster) + local buffedBonus = keys.power_bonus + + if caster.thtd_byakuren_01_attack_time > base_tick then + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),keys.range) + if #targets > 0 then + local count = 1 + local outCount = math.floor((keys.damage_count + buffedCount - 1)/#targets) + 1 + local damageCount = {} + for iOut=1,outCount do + for i=1,#targets do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_byakuren/ability_byakuren_04_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()+thtd_byakuren_04_point[count%4]) + ParticleManager:SetParticleControl(effectIndex, 1, targets[i]:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 3, targets[i]:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 9, caster:GetOrigin()+thtd_byakuren_04_point[count%4]) + ParticleManager:DestroyParticleSystemTime(effectIndex,2.0) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_byakuren/ability_byakuren_04_item.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()+thtd_byakuren_04_point[count%4]) + ParticleManager:DestroyParticleSystemTime(effectIndex,1.0) + + damageCount[i] = (damageCount[i] or 0) + 1 + count = count + 1 + if count > (keys.damage_count + buffedCount) then + break + end + end + if count > (keys.damage_count + buffedCount) then + break + end + end + -- PrintTable(damageCount) + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (caster.thtd_byakuren_01_extra_damage/100) * (1 + buffedCount * buffedBonus/100) + for i=1,#targets do + if damageCount[i] ~= nil then + local damage_table = { + victim = targets[i], + attacker = caster, + damage = damage * damageCount[i], + ability = keys.ability, + damage_type = DAMAGE_TYPE_MAGICAL, + damage_flags = DOTA_DAMAGE_FLAG_NONE, + } + UnitDamageTarget(damage_table) + end + end + end + return + end + + if caster.thtd_byakuren_01_attack_time == base_tick then + if caster.thtd_byakuren_04_attack_count == nil then + caster.thtd_byakuren_04_attack_count = 0 + end + caster.thtd_byakuren_04_attack_count = caster.thtd_byakuren_04_attack_count + 1 + if caster.thtd_byakuren_04_attack_count >= keys.max_count / (1 + buffedCount * buffedBonus/100) then + caster.thtd_byakuren_04_attack_count = 0 + + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + buffedCount * buffedBonus/100) + for k,v in pairs(targets) do + local damage_table = { + victim = v, + attacker = caster, + damage = damage, + ability = keys.ability, + damage_type = DAMAGE_TYPE_PURE, + damage_flags = DOTA_DAMAGE_FLAG_NONE, + } + UnitDamageTarget(damage_table) + local particle = ParticleManager:CreateParticle("particles/heroes/byakuren/ability_byakuren_02.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(particle,0,v:GetOrigin()) + ParticleManager:SetParticleControl(particle,1,v:GetOrigin()) + ParticleManager:DestroyParticleSystem(particle,false) + end + end + return + end + + if caster.thtd_byakuren_01_attack_time < base_tick then + if RollPercentage(keys.chance) and caster:HasModifier("modifier_byakuren_04_physical_buff") == false then + caster.byakuren_04_power_bonus = buffedCount * buffedBonus + keys.ability:ApplyDataDrivenModifier(caster,caster,"modifier_byakuren_04_physical_buff", {Duration = keys.duration_time}) + end + end +end + +function OnCreatedByakuren04PhysicalBuff(keys) + local target = keys.target + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_byakuren/ability_byakuren_04_phy.vpcf",PATTACH_CUSTOMORIGIN,target) + ParticleManager:SetParticleControl(effectIndex,0,target:GetOrigin()+Vector(0,0,32)) + ParticleManager:DestroyParticleSystemTime(effectIndex, keys.duration_time) + target.thtd_byakuren_04_physical_buff_effect = effectIndex + + local bonus = target.byakuren_04_power_bonus + target:THTD_AddPowerPercentage(bonus, "thtd_byakuren_04_physical_buff") + target:THTD_AddAttackPercentage(bonus, "thtd_byakuren_04_physical_buff") + target:THTD_AddAttackSpeed(keys.attack_speed, "thtd_byakuren_04_physical_buff") + target:THTD_AddBaseAttack(keys.attack_bonus, "thtd_byakuren_04_physical_buff") + target:THTD_AddBasePower(keys.attack_bonus, "thtd_byakuren_04_physical_buff") +end + +function OnDestroyByakuren04PhysicalBuff(keys) + local target = keys.target + ParticleManager:DestroyParticleSystem(target.thtd_byakuren_04_physical_buff_effect, true) + target:THTD_AddPowerPercentage("thtd_byakuren_04_physical_buff") + target:THTD_AddAttackPercentage("thtd_byakuren_04_physical_buff") + target:THTD_AddAttackSpeed("thtd_byakuren_04_physical_buff") + target:THTD_AddBaseAttack("thtd_byakuren_04_physical_buff") + target:THTD_AddBasePower("thtd_byakuren_04_physical_buff") +end + +function OnCreatedByakuren04PureBuff(keys) + local target = keys.target + target:THTD_AddCritDamage(keys.crit_damage, "thtd_byakuren_04_pure_buff") + target:THTD_AddCritChance(keys.crit_change, "thtd_byakuren_04_pure_buff") +end + +function OnDestroyByakuren04PureBuff(keys) + local target = keys.target + target:THTD_AddCritDamage("thtd_byakuren_04_pure_buff") + target:THTD_AddCritChance("thtd_byakuren_04_pure_buff") +end + + +function OnCreatedByakuren04Buff(keys) + keys.target:AddDamageOutgoingMagical(keys.penetration, "thtd_byakuren_04_damage_up") +end + +function OnDestroyByakuren04Buff(keys) + keys.target:AddDamageOutgoingMagical("thtd_byakuren_04_damage_up") +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitychen.lua b/scripts/vscripts/abilities/abilitychen.lua new file mode 100755 index 0000000..1cf8b92 --- /dev/null +++ b/scripts/vscripts/abilities/abilitychen.lua @@ -0,0 +1,64 @@ +function OnChen01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + local rad = GetRadBetweenTwoVec2D(caster:GetOrigin(),targetPoint) + + caster.thtd_chen_01_last_origin = caster:GetOrigin() + caster:StartGesture(ACT_DOTA_CAST_ABILITY_1) + + keys.ability:ApplyDataDrivenModifier(caster,caster,"modifier_chen_01_pause", nil) + caster:SetContextThink(DoUniqueString("ability_chen_01_move"), + function () + if GameRules:IsGamePaused() then return 0.03 end + if GetDistanceBetweenTwoVec2D(caster:GetOrigin(), targetPoint)>=30 and GetDistanceBetweenTwoVec2D(caster:GetOrigin(), targetPoint) 30 and caster:THTD_IsHidden()==false then + caster.thtd_chen_01_vector = caster:GetOrigin() + caster:EmitSoundParams("Sound_THTD.thtd_chen_01",1.0,0.2*(1+(dis/caster.thtd_chen_01_distance_increase)/8),2.0) + local increase = GetDistanceBetweenTwoVec2D(caster.thtd_chen_01_vector, caster.thtd_chen_01_last_origin)/caster.thtd_chen_01_distance_increase + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),400*(1+increase/8)) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * increase + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_chen/ability_chen_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(400*(1+increase/8),400*(1+increase/8),400*(1+increase/8))) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitycirno.lua b/scripts/vscripts/abilities/abilitycirno.lua new file mode 100755 index 0000000..6b9142b --- /dev/null +++ b/scripts/vscripts/abilities/abilitycirno.lua @@ -0,0 +1,265 @@ +function OnCirno02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local damagedGroup = {} + + Cirno02PassToNextUnit(keys,target,damagedGroup) +end + +function Cirno02PassToNextUnit(keys,target,damagedGroup) + if keys.ability == nil or keys.ability:IsNull() then + damagedGroup = {} + return + end + local caster = EntIndexToHScript(keys.caster_entindex) + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.radius) + + local powerCount = 0 + local powerDamage = 1 + local pv = caster:GetAbilityPowerValue("thtd_cirno_02") + if pv ~= nil then + powerDamage = pv[1] + powerCount = pv[2] + end + + caster.thtd_cirno02_power_crit = powerDamage + + if targets[1]==nil or #damagedGroup >= keys.unit_max_count then + damagedGroup = {} + return + end + if #damagedGroup == 0 then + table.insert(damagedGroup,target) + local count = keys.ice_count + powerCount + caster:SetContextThink(DoUniqueString("thtd_cirno02_projectile"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local info = + { + Target = target, + Source = caster, + Ability = keys.ability, + EffectName = "particles/heroes/thtd_cirno/ability_cirno_02.vpcf", + iMoveSpeed = 1400, + vSourceLoc= caster:GetAbsOrigin(), -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, -- Optional + iVisionRadius = 400, -- Optional + iVisionTeamNumber = caster:GetTeamNumber() -- Optional + } + local projectile = ProjectileManager:CreateTrackingProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + if count > 0 then + count = count - 1 + return 0.05 + end + return nil + end, + 0.05) + caster:SetContextThink(DoUniqueString("thtd_cirno02_projectile"), + function() + if GameRules:IsGamePaused() then return 0.03 end + Cirno02PassToNextUnit(keys,target,damagedGroup) + return nil + end, + 0.5) + else + for k,v in pairs(targets) do + if v~=nil and v:IsNull()==false and THTD_IsUnitInGroup(v,damagedGroup) == false then + table.insert(damagedGroup,v) + local count = keys.ice_count + powerCount + caster:SetContextThink(DoUniqueString("thtd_cirno02_projectile"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local info = + { + Target = v, + Source = target, + Ability = keys.ability, + EffectName = "particles/heroes/thtd_cirno/ability_cirno_02.vpcf", + iMoveSpeed = 1400, + vSourceLoc= caster:GetAbsOrigin(), -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, -- Optional + iVisionRadius = 400, -- Optional + iVisionTeamNumber = caster:GetTeamNumber() -- Optional + } + projectile = ProjectileManager:CreateTrackingProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + if count > 0 then + count = count - 1 + return 0.05 + end + return nil + end, + 0.05) + caster:SetContextThink(DoUniqueString("thtd_cirno02_projectile"), + function() + if GameRules:IsGamePaused() then return 0.03 end + Cirno02PassToNextUnit(keys,v,damagedGroup) + return nil + end, + 0.1) + end + end + end +end + +function OnCirno02SpellHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * caster.thtd_cirno02_power_crit + if caster:IsPower999() then + damage = damage * 9 + end + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + if RollPercentage(keys.chance) then + local stuntime = keys.StunTime + if caster:THTD_IsTowerEx() == true then + stuntime = stuntime * (1 + keys.stun_up/100) + end + keys.ability:ApplyDataDrivenModifier(caster,target,"modifier_cirno_frozen_unit", {Duration = stuntime}) + end + + if target.thtd_ability_cirno_02_damaged ~= true then + target.thtd_ability_cirno_02_damaged = true + + target:SetContextThink(DoUniqueString("thtd_ability_cirno_02_damaged"), + function() + if GameRules:IsGamePaused() then return 0.03 end + target.thtd_ability_cirno_02_damaged = false + return nil + end, + 3.0) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/cirno/ability_cirno_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + caster:EmitSound("Sound_THTD.thtd_cirno_02") + end +end + +function OnCirno03Attack(keys) + if keys.ability:GetLevel() < 1 then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/cirno/ability_cirno_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + if caster:IsPower666() then + damage = damage + 69 * caster:THTD_GetStarDamage() + end + if caster:IsPower999() then + damage = damage * 9 + end + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + for k,v in pairs(targets) do + -- caster:PerformAttack(v,true,false,true,false,false,false,true) 造成攻击但不显示弹道 + if caster:IsPower666() then + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_crystalmaiden/maiden_freezing_field_explosion.vpcf", PATTACH_CUSTOMORIGIN, v) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end +end + +function OnCirno04Attack(keys) + if keys.ability:GetLevel() < 1 then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local targetPoint = target:GetOrigin() + + if caster.thtd_cirno_04_attack_count == nil then + caster.thtd_cirno_04_attack_count = 0 + end + + caster.thtd_cirno_04_attack_count = caster.thtd_cirno_04_attack_count + 1 + + if caster.thtd_cirno_04_attack_count >= keys.max_count then + caster.thtd_cirno_04_attack_count = 0 + local count = 1 + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_cirno/ability_cirno_04_circle.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local powerDamage = 1 + local pv = caster:GetAbilityPowerValue("thtd_cirno_04") + if pv ~= nil then + powerDamage = pv[1] + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * powerDamage + if caster:IsPower999() then + damage = damage * 9 + end + + caster:SetContextThink(DoUniqueString("thtd_cirno_04_spell_start"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if count%5 == 0 then + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage * 5 * 0.05, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + if count > 40 then + return nil + end + caster:EmitSound("Sound_THTD.thtd_cirno_04") + count = count + 1 + return 0.05 + end, + 0.05) + end +end + +function OnCreatedCirnoExBuff(keys) + keys.target:AddDamageOutgoingMagical(keys.damage_up, "thtd_cirno_ex_damage_up") +end + +function OnDestroyCirnoExBuff(keys) + keys.target:AddDamageOutgoingMagical("thtd_cirno_ex_damage_up") +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityclownpiece.lua b/scripts/vscripts/abilities/abilityclownpiece.lua new file mode 100755 index 0000000..a44a840 --- /dev/null +++ b/scripts/vscripts/abilities/abilityclownpiece.lua @@ -0,0 +1,219 @@ +function OnSpellStartClownpiece01(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster.thtd_clown_ball == nil then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_01_moon.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint + Vector(0,0,128)) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(0.3,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(150,0,0)) + + caster.thtd_clown_ball = + { + ["Vector"] = targetPoint + Vector(0,0,128), + ["EffectIndex"] = effectIndex + } + else + caster.thtd_clown_ball["Vector"] = targetPoint + Vector(0,0,128) + ParticleManager:SetParticleControl(effectIndex, 0, caster.thtd_clown_ball["Vector"]) + end + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then + powerDamage = pv[1]/100 + end + + local range = keys.range + local count = 1 + caster:SetContextThink(DoUniqueString("thtd_clownpiece_01_cast"), + function() + if GameRules:IsGamePaused() then return 0.03 end + count = count - 1 + if count < 0 then + ClownpieceRemoveAllBall(keys) + return nil + end + + for i=1,12 do + local forward1 = Vector(math.cos(i*math.pi/6),math.sin(i*math.pi/6),0) + local forward2 = Vector(math.cos(i*math.pi/6+math.pi/2),math.sin(i*math.pi/6+math.pi/2),0) + local startPoint = caster.thtd_clown_ball["Vector"] + local endPoint = caster.thtd_clown_ball["Vector"] + forward1 * range + Vector(0,0,128) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, startPoint) + ParticleManager:SetParticleControl(effectIndex , 1, endPoint) + ParticleManager:SetParticleControl(effectIndex , 9, startPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + local targets = THTD_FindUnitsInRadius(caster,caster.thtd_clown_ball["Vector"],range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + powerDamage) + + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + return 0.5 + end, + 0.3) +end + +function ClownpieceRemoveAllBall(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.thtd_clown_ball ~= nil then + local effectIndex = caster.thtd_clown_ball["EffectIndex"] + ParticleManager:DestroyParticleSystem(effectIndex,true) + caster.thtd_clown_ball = nil + end +end + +function OnSpellStartClownpiece02(keys) + local caster = keys.caster + local targetPoint = keys.target_points[1] + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_junko/ability_junko_03.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local powerRange = 0 + local powerDuration = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then + powerRange = pv[1] + powerDuration = pv[2] + end + + local radius = keys.radius + powerRange + local duration_time = keys.duration_time + powerDuration + local damage_up_other = keys.damage_up_other + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,radius) + local count = #targets + for k,v in pairs(targets) do + local modifier = v:FindModifierByName("modifier_clownpiece_debuff") + if modifier==nil then + keys.ability:ApplyDataDrivenModifier(caster,v,"modifier_clownpiece_debuff", {Duration = duration_time}) + else + modifier:SetDuration(duration_time,false) + end + end + + if count > 0 then + local powerDamageUp = 0 + local pv = caster:GetAbilityPowerValue("thtd_clownpiece_02") + if pv ~= nil then + powerDamageUp = pv[3] + end + local factor = powerDamageUp + keys.damage_up_self + caster.thtd_clownpiece_02_buff_bonus = count * keys.damage_up_other + caster.thtd_clownpiece_02_self_bonus = caster.thtd_clownpiece_02_buff_bonus * factor + + local hero = caster:GetOwner() + for k,v in pairs(hero.thtd_hero_tower_list) do + local unitName = v:GetUnitName() + if unitName == "clownpiece" or unitName == "lily" or unitName == "luna" or unitName == "star" or unitName == "sunny" or unitName == "cirno" or unitName == "daiyousei" or unitName == "mugiyousei" or unitName == "hanadayousei" or unitName == "maidyousei" then + v:RemoveModifierByName("modifier_clownpiece_buff") + keys.ability:ApplyDataDrivenModifier(caster,v,"modifier_clownpiece_buff", {Duration = duration_time}):SetStackCount(count) + end + end + end +end + +function OnCreatedClownpiece02Buff(keys) + if keys.target:GetUnitName() == "clownpiece" then + keys.target:AddDamageOutgoingAll(keys.caster.thtd_clownpiece_02_self_bonus or 0, "thtd_clownpiece_02_bonus") + else + keys.target:AddDamageOutgoingAll(keys.caster.thtd_clownpiece_02_buff_bonus or 0, "thtd_clownpiece_02_bonus") + end +end + +function OnDestroyClownpiece02Buff(keys) + keys.target:AddDamageOutgoingAll("thtd_clownpiece_02_bonus") +end + +function OnSpellStartClownpiece03(keys) + local caster = keys.caster + local targetPoint = keys.target_points[1] + local casterPoint = caster:GetAbsOrigin() + local forward = (targetPoint - casterPoint):Normalized() + + local powerDuration = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then + powerDuration = pv[2] + end + + if caster:IsPower666() then + for i=1,6 do + local forward1 = Vector(math.cos(i*math.pi/3),math.sin(i*math.pi/3),0) + local effectIndex = ParticleManager:CreateParticle("particles/econ/items/jakiro/jakiro_ti8_immortal_head/jakiro_ti8_dual_breath_fire.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, casterPoint) + ParticleManager:SetParticleControl(effectIndex, 1, forward1 * keys.distance) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + local targets = THTD_FindUnitsInRadius(caster,casterPoint,keys.distance + 100) + for k,v in pairs(targets) do + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_clownpiece_03_debuff", {Duration = keys.duration_time + powerDuration}) + end + else + local effectIndex = ParticleManager:CreateParticle("particles/econ/items/jakiro/jakiro_ti8_immortal_head/jakiro_ti8_dual_breath_fire.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, casterPoint) + ParticleManager:SetParticleControl(effectIndex, 1, forward * keys.distance) + ParticleManager:DestroyParticleSystem(effectIndex,false) + -- local effectIndex2 = ParticleManager:CreateParticle("particles/econ/items/jakiro/jakiro_ti8_immortal_head/jakiro_ti8_dual_breath_ice.vpcf", PATTACH_CUSTOMORIGIN, caster) + -- ParticleManager:SetParticleControl(effectIndex2, 0, casterPoint) + -- ParticleManager:SetParticleControl(effectIndex2, 1, (targetPoint - casterPoint):Normalized() * 1000) + -- ParticleManager:DestroyParticleSystem(effectIndex2,false) + + local targets = FindUnitsInLine( + caster:GetTeamNumber(), + casterPoint, + casterPoint + forward * (keys.distance + 100), + nil, + 300, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + + for k,v in pairs(targets) do + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_clownpiece_03_debuff", {Duration = keys.duration_time + powerDuration}) + end + end +end + +function OnThinkClownpiece03(keys) + local caster = keys.caster + local target = keys.target + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then + powerDamage = pv[1] + end + + if caster:IsPower666() then powerDamage = powerDamage + 30 end + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage() + if caster:IsPower999() then damage = damage * 3 end + damage = damage * keys.tick + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end diff --git a/scripts/vscripts/abilities/abilitycommon.lua b/scripts/vscripts/abilities/abilitycommon.lua new file mode 100755 index 0000000..3ee319a --- /dev/null +++ b/scripts/vscripts/abilities/abilitycommon.lua @@ -0,0 +1,1438 @@ +THTD_MAX_BONUS_TOWER = 3 + +local thtd_skin_list = +{ + ["suwako"] = + { + [1] = "models/thd_hero/suwako/cloth01/suwako_cloth01.vmdl", + }, + ["meirin"] = + { + [1] = "models/thd_hero/meirin/cloth01/meirin_cloth01.vmdl", + }, + ["sanae"] = + { + [1] = "models/thd_hero/sanae/cloth01/sanae_jk.vmdl", + }, + ["mystia"] = + { + [1] = "models/thd_hero/mystia/cloth01/mystia_cloth01.vmdl", + }, +} + +function OnTouhouReleaseTowerSpellStart(keys) + local caster = keys.caster + local target = keys.target + + if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="not_enough_item_slot"}) + EmitSoundOn("Sound_THTD.thtd_star_up_fail", caster) + return + end + + if target:THTD_IsTower() and target:GetOwner() == caster then + local item = target.thtd_item + if item == nil then return end + + if item.locked_by_player_id == nil then + target:THTD_DropItemAll() + end + target:AddNewModifier(caster, nil, "modifier_touhoutd_release_hidden", {}) + target:SetAbsOrigin(Vector(0,0,0)) + target:AddNoDraw() + target:THTD_DestroyLevelEffect() + target:RemoveModifierByName("modifier_hidden_bar") + target:THTD_ResetTowerDamage() + + item:THTD_UpdateItemStarLevel() + caster:AddItem(item) + + for k,v in pairs(caster.thtd_hero_tower_list) do + if v == target then + table.remove(caster.thtd_hero_tower_list,k) + break + end + end + + for k,v in pairs(caster.thtd_hero_tower_list) do + if v==nil or v:IsNull() or v:IsAlive()==false or v:THTD_IsHidden() then + table.remove(caster.thtd_hero_tower_list,k) + end + end + + caster.thtd_game_info["food_count"] = #caster.thtd_hero_tower_list + SetNetTableTowerList(caster) + + -- 取消相关buff + for k,v in pairs(caster.thtd_hero_tower_list) do + if v ~= target then + local modifiers = v:FindAllModifiers() + for _, modifier in pairs(modifiers) do + if modifier:GetCaster() == target and THTD_IsRemainBuff(modifier:GetName()) == false then modifier:Destroy() end + end + end + end + + local entities = Entities:FindAllByClassname("npc_dota_creature") + for k,v in pairs(entities) do + if v~=nil and v:IsNull()==false and v:IsAlive() and v.thtd_spawn_unit_owner~=nil and v.thtd_spawn_unit_owner==target then + v:AddNoDraw() + v:ForceKill(false) + end + end + + local unitName = target:GetUnitName() + + -- 取消来源本单位的buff + if unitName == "hatate" then + local inners = THTD_FindUnitsInner(target) + local outers = THTD_FindUnitsOuter(target) + for k,v in pairs(inners) do + if THTD_IsValid(v) and v:HasModifier("modifier_hatate01_news_buff") then + if v:FindModifierByName("modifier_hatate01_news_buff"):GetCaster() == target then + v:RemoveModifierByName("modifier_hatate01_news_buff") + end + end + end + for k,v in pairs(outers) do + if THTD_IsValid(v) and v:HasModifier("modifier_hatate01_news_buff") then + if v:FindModifierByName("modifier_hatate01_news_buff"):GetCaster() == target then + v:RemoveModifierByName("modifier_hatate01_news_buff") + end + end + end + end + + -- 取消辉夜buff + for i=1,4 do + local buff = "modifier_kaguya_03_"..i.."_buff" + if target:HasModifier(buff) then + target:RemoveModifierByName(buff) + end + end + + caster:THTD_HeroComboRefresh() + end +end + +function PutTowerToPoint(keys) + local caster = keys.caster + if caster:IsRealHero() == false then return end + local targetPoint = keys.target_points[1] + local itemName = keys.ability:GetAbilityName() + local tower = keys.ability.tower + local playerid = caster:GetPlayerOwnerID() + + if caster.thtd_game_info["food_count"] ~= #caster.thtd_hero_tower_list then + caster.thtd_game_info["food_count"] = #caster.thtd_hero_tower_list + SetNetTableTowerList(caster) + end + if caster.thtd_game_info["food_count"] >= GameRules.GameData.max_food then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "display_custom_error", {msg="not_enough_food"} ) + return + end + + if IsMaxCountCheckOK(caster, itemName) == false then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "display_custom_error", {msg="the_same_card_reach_to_limit"} ) + return + end + + if SpawnSystem.IsUnLimited == false and IsBonusTower(itemName) and GetBonusTowerCount(caster) >= THTD_MAX_BONUS_TOWER then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "show_message", {msg="bonus_tower_limit", duration=5, params={count=1}, color="#0ff"} ) + return + end + + if GameRules.GameData.new_card_list ~= "" and string.find(","..GameRules.GameData.new_card_list..",",","..keys.ability:THTD_GetCardName()..",") ~= nil and GameRules.PlayerData[caster:GetPlayerOwnerID()].vip == 0 and tostring(PlayerResource:GetSteamID(caster:GetPlayerOwnerID())) ~= GameRules.GameData.admin then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="new_card_test_tip"}) + return + end + + if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE and SpawnSystem.IsUnLimited == false and IsBonusTower(itemName) then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="funny_mode_bonus_no_use_tip"}) + end + + if tower == nil then + local spawnTowerName = towerNameList[itemName]["cardname"] + tower = CreateUnitByName( + spawnTowerName, + targetPoint, + false, + caster, + caster, + caster:GetTeam() + ) + + if (GameRules.GameData.is_open_day == 1 or GameRules.PlayerData[playerid].vip == 1 or tostring(PlayerResource:GetSteamID(playerid)) == GameRules.GameData.admin) and thtd_skin_list[spawnTowerName] ~= nil then + local skin_index = RandomInt(1, #thtd_skin_list[spawnTowerName]) + local model_name = thtd_skin_list[spawnTowerName][skin_index] + + tower:SetModel(model_name) + tower:SetOriginalModel(model_name) + end + + tower:SetControllableByPlayer(playerid, true) + tower:SetOwner(caster) + tower:SetHullRadius(50) + FindClearSpaceForUnit(tower, targetPoint, false) + + tower:SetForwardVector(Vector(0,-1,tower:GetForwardVector().z)) + keys.ability.tower = tower + else + if tower:GetOwner() ~= caster then + tower:SetOwner(caster) + tower:SetControllableByPlayer(playerid, true) + end + tower:SetAbsOrigin(targetPoint) + tower:SetContextThink(DoUniqueString("FindClearSpaceForUnit"), + function() + if GetDistanceBetweenTwoVec2D(tower:GetOrigin(),targetPoint) < 100 then + tower:RemoveModifierByName("modifier_touhoutd_release_hidden") + tower:RemoveNoDraw() + FindClearSpaceForUnit(tower, targetPoint, false) + tower:THTD_DestroyLevelEffect() + tower:THTD_CreateLevelEffect() + return nil + end + return 0.1 + end, + 0) + tower:SetForwardVector((Vector(0,0,128)-caster:GetAbsOrigin()):Normalized()) + end + + tower:SetHealth(1) + + if keys.ability:THTD_IsCardHasVoice() == true then + EmitSoundOn(THTD_GetVoiceEvent(towerNameList[itemName]["cardname"],"spawn"),tower) + end + + tower.thtd_item = keys.ability + caster:TakeItem(keys.ability) + tower:SetMana(0) + caster:EmitSound("Sound_THTD.thtd_set_tower") + + table.insert(caster.thtd_hero_tower_list,tower) + caster.thtd_game_info["food_count"] = #caster.thtd_hero_tower_list + SetNetTableTowerList(caster) + + tower:AddNewModifier(caster, nil, "modifier_touhoutd_building", {}) + tower:SetContextThink(DoUniqueString("thtd_modifier_touhoutd_building"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if tower:GetHealth() >= tower:GetMaxHealth() then + tower:AddNewModifier(tower, nil, "modifier_hidden_bar", {}) + tower:RemoveModifierByName("modifier_touhoutd_building") + + caster:THTD_HeroComboRefresh() + tower:SetLuckDay() + tower:EnableAi() + return nil + end + tower:SetHealth(tower:GetHealth()+4) + return 0.04 + end, + 0) + + if tower.isFirstSpawn ~= true then + tower.isFirstSpawn = true + tower:THTD_InitExp() + tower:AddNewModifier(caster, nil, "modifier_touhoutd_root", {}) + else + tower:THTD_DestroyLevelEffect() + tower:THTD_CreateLevelEffect() + end + + local modifiers = tower:FindAllModifiers() + for _, modifier in pairs(modifiers) do + if THTD_IsRemainBuff(modifier:GetName()) == false and modifier:GetCaster() ~= tower and THTD_IsValid(modifier:GetCaster()) == false then + modifier:Destroy() + end + end + + local powerLevelFromItem = tower.thtd_power_from_item or 0 + local powerLevelFromCard = 0 + if GameRules.PlayerData[playerid]["level_list"] ~= nil then + powerLevelFromCard = GameRules.PlayerData[playerid]["level_list"][itemName] or 0 + end + local count = math.min(999, powerLevelFromItem + powerLevelFromCard) + local modifier = tower:FindModifierByName("modifier_fairy_count") + if modifier == nil then + if count > 0 then + tower:AddNewModifier(tower, nil, "modifier_fairy_count", nil):SetStackCount(count) + end + elseif count ~= modifier:GetStackCount() then + if count > 0 then + modifier:SetStackCount(count) + else + tower.thtd_power_level = nil + target:RemovePowerBonus() + tower:RemoveAbility("e316") + tower:RemoveModifierByName('modifier_texiao_star') + end + end + + if tower:HasModifier("modifier_fairy_count") then + if towerNameList[itemName]["quality"] == 1 then + tower.thtd_power_level = tower:FindModifierByName("modifier_fairy_count"):GetStackCount() + tower:AddPowerBonus() + AddAbilityAndSetLevel(tower, "e316") + tower:EmitSound("Sound_THTD.thtd_star_up") + end + end +end + + +THTD_STAR_ITEM = +{ + [1] = "item_1003", + [2] = "item_1004", + [3] = "item_1005", + [4] = "item_1006", +} + +THTD_SEIGA_STAR_ITEM = +{ + [1] = "item_1011", + [2] = "item_1012", + [3] = "item_1013", + [4] = "item_1014", +} + +function StarUp(keys) + local caster = keys.caster + local player = caster:GetPlayerOwner() + local hero = player:GetAssignedHero() + local star = caster:THTD_GetStar() + + -- print("-----------this tower buffs:") + -- local modifiers = caster:FindAllModifiers() + -- for _, modifier in pairs(modifiers) do + -- print(modifier:GetName()) + -- end + -- print("-----------enemy buffs:") + -- local buffs = {} + -- local targets = THTD_FindUnitsAll(caster) + -- for k, v in pairs(targets) do + -- local modifiers = v:FindAllModifiers() + -- for _, modifier in pairs(modifiers) do + -- local name = modifier:GetName() + -- local isExist = false + -- for _, b in pairs(buffs) do + -- if b == name then + -- isExist = true + -- break + -- end + -- end + -- if not isExist then + -- table.insert(buffs, name) + -- print(name) + -- end + -- end + -- end + + -- local ens = Entities:FindAllInSphere(caster:GetAbsOrigin(), 3000) + -- for k,v in pairs(ens) do + -- print("---------------") + -- print(v:GetClassname()) + -- if v:GetClassname() == "dota_death_prophet_exorcism_spirit" then + -- -- print(v:GetUnitName()) + -- local f = v:GetOwner() + -- if f ~= nil then print(f:GetUnitName()) end + -- -- v:Kill() + -- -- UTIL_Remove(v) + -- end + -- end + + + + if caster:THTD_GetLevel() < THTD_MAX_LEVEL or star >= 5 then + if player then + EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster) + end + return + end + + composeItem = {} + + for item_slot = 0,5 do + local item = caster:GetItemInSlot(item_slot) + if item ~= nil and item.locked_by_player_id == nil then + local tower = item:THTD_GetTower() + if tower ~= nil and tower:THTD_GetStar() == star and tower:THTD_GetLevel() == THTD_MAX_LEVEL then + if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE and tower:GetUnitName() == "minoriko" then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="minoriko_cannot_be_material"}) + else + table.insert(composeItem,item) + end + end + if item:GetAbilityName() == THTD_STAR_ITEM[star] or item:GetAbilityName() == THTD_SEIGA_STAR_ITEM[star] then + table.insert(composeItem,item) + end + end + end + + for item_slot = 0,5 do + local item = hero:GetItemInSlot(item_slot) + if item ~= nil and item.locked_by_player_id == nil then + local tower = item:THTD_GetTower() + if tower ~= nil and tower:THTD_GetStar() == star and tower:THTD_GetLevel() == THTD_MAX_LEVEL then + if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE and tower:GetUnitName() == "minoriko" then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="minoriko_cannot_be_material"}) + else + table.insert(composeItem,item) + end + end + if item:GetAbilityName() == THTD_STAR_ITEM[star] or item:GetAbilityName() == THTD_SEIGA_STAR_ITEM[star] then + table.insert(composeItem,item) + end + end + end + + if (#composeItem >= star) then + for i=1,star do + OnItemDestroyed(caster, composeItem[i], false) + end + caster:THTD_StarUp() + else + EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster) + end + composeItem = {} +end + +function ExpUp(keys) + local caster = keys.caster + local player = caster:GetPlayerOwner() + local hero = player:GetAssignedHero() + + item = caster:GetItemInSlot(0) + + if item ~= nil then + if item:THTD_GetCardName() == nil or string.find(item:THTD_GetCardName(),"item_20") ~= nil then + EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster) + return + end + + if item.locked_by_player_id ~= nil then + EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster) + if player then + CustomGameEventManager:Send_ServerToPlayer(player , "display_custom_error", {msg="item_is_locked"} ) + end + return + end + + caster:EmitSound("Sound_THTD.thtd_exp_up") + local tower = item:THTD_GetTower() + local exp = 3000 + if tower ~= nil then + if tower:GetUnitName() == "minoriko" and GameRules:GetCustomGameDifficulty() >= FUNNY_MODE then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="minoriko_cannot_be_material"}) + EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster) + return + end + exp = (1000 + tower:THTD_GetExp()/5)*1500*(item:THTD_GetCardQuality()+1)/1000 + end + if item:THTD_GetCardName() == caster:GetUnitName() then + caster:THTD_SetAbilityLevelUp() + elseif item:THTD_GetCardName() == "BonusEgg" then + exp = (1000 + 5400/5)*1500*(item:THTD_GetCardQuality()+1)/1000 + end + caster:THTD_AddExp(exp) + OnItemDestroyed(caster, item, false) + else + EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster) + end +end + +function BlinkToPoint(keys) + local caster = keys.caster + local targetPoint = keys.target_points[1] + + -- 向量a点,b点,用b-a是a朝向b + -- local forward = (targetPoint - caster:GetAbsOrigin()):Normalized() + -- FindClearSpaceForUnit(caster, caster:GetAbsOrigin() + forward * 200, false) + + FindClearSpaceForUnit(caster, targetPoint, false) + caster:EmitSound("Sound_THTD.ability_touhoutd_blink.End") + + if RollPercentage(50) then + if caster:HasModifier("modifier_rainbow_tail") then + caster:RemoveModifierByName("modifier_rainbow_tail") + else + caster:AddNewModifier(caster, nil, "modifier_rainbow_tail", nil) + end + end +end + +function OnKillUnitSpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + -- PrintTable(keys.ability:GetAbilityKeyValues()) + caster:EmitSound("Sound_THTD.ability_touhoutd_kill") + local effectIndex = ParticleManager:CreateParticle("particles/econ/items/lina/lina_ti6/lina_ti6_laguna_blade.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()+Vector(0,0,128)) + ParticleManager:SetParticleControl(effectIndex, 1, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + if target.is_random_boss == nil or target:GetHealthPercent() <= 50 then + caster:NpcKill(target) + else + target:SetHealth(math.max(10, target:GetHealth() - target:GetMaxHealth() * 0.5)) + end +end + +function CloseStar(keys) + local caster = keys.caster + + if caster.thtd_close_star ~= true then + caster.thtd_close_star = true + else + caster.thtd_close_star = false + end + + for index,tower in pairs(caster.thtd_hero_tower_list) do + if tower ~= nil and tower:IsNull() == false then + if caster.thtd_close_star == true and tower.thtd_is_effect_open == true and caster.focusTarget ~= tower then + tower:THTD_DestroyLevelEffect() + elseif caster.thtd_close_star == false and tower.thtd_is_effect_open == false then + tower:THTD_CreateLevelEffect() + end + end + end +end + +function OnTouhoutdExUp(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if not target:THTD_IsTower() then + return + end + + if target:GetUnitName() == "rumia" and target:THTD_GetStar() == 5 and target:GetOwner() == caster and caster.thtd_ability_rumia_ex_lock ~= true then + target:EmitSound("Hero_Wisp.Tether") + caster.thtd_ability_rumia_ex_lock = true + target:THTD_UpgradeEx() + target:SetAttackCapability(DOTA_UNIT_CAP_MELEE_ATTACK) + target:SetModel("models/thd2/rumia_ex/rumia_ex.vmdl") + target:SetOriginalModel("models/thd2/rumia_ex/rumia_ex.vmdl") + target:SetModelScale(0.7) + local modifier = target:AddNewModifier(target, nil, "modifier_attack_time", {}) + modifier:SetStackCount(6) + + local attack_power_ability=target:FindAbilityByName("ability_common_power_buff") + if attack_power_ability ~= nil then + if attack_power_ability:GetLevel() < attack_power_ability:GetMaxLevel() then + attack_power_ability:SetLevel(5) + end + end + + return + end + + if caster:GetPlayerOwnerID() ~= target:GetPlayerOwnerID() then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="target_is_error"}) + return + end + + if tostring(PlayerResource:GetSteamID(caster:GetPlayerOwnerID())) == GameRules.GameData.admin then + if target.thtd_power_level == nil then + if caster.is_team_mode ~= true then + local unitName = target:GetUnitName() + if unitName ~= "minoriko" and unitName ~= "sizuha" and unitName ~= "lily" and unitName ~= "nazrin" then + caster.is_team_mode = true + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_chat_msg", {msg="team_rank_tip", params={player_name=PlayerResource:GetPlayerName(caster:GetPlayerOwnerID()),reason="潜能已激活"}}) + end + end + target.thtd_power_level = 10 + local modifier = target:FindModifierByName("modifier_fairy_count") or target:AddNewModifier(target, nil, "modifier_fairy_count", nil) + modifier:SetStackCount(10) + AddAbilityAndSetLevel(target, "e316") + target:EmitSound("Sound_THTD.thtd_star_up") + elseif target.thtd_power_level == 10 then + target.thtd_power_level = 50 + target:FindModifierByName("modifier_fairy_count"):SetStackCount(50) + target:EmitSound("Sound_THTD.thtd_star_up") + elseif target.thtd_power_level == 50 then + target.thtd_power_level = 100 + target:FindModifierByName("modifier_fairy_count"):SetStackCount(100) + target:EmitSound("Sound_THTD.thtd_star_up") + elseif target.thtd_power_level == 100 then + target.thtd_power_level = 666 + target:FindModifierByName("modifier_fairy_count"):SetStackCount(666) + target:EmitSound("Sound_THTD.thtd_star_up") + elseif target.thtd_power_level == 666 then + target.thtd_power_level = 999 + target:FindModifierByName("modifier_fairy_count"):SetStackCount(999) + target:EmitSound("Sound_THTD.thtd_star_up") + elseif target.thtd_power_level == 999 then + target.thtd_power_level = nil + target:RemoveModifierByName("modifier_fairy_count") + target:RemovePowerBonus() + target:RemoveAbility("e316") + target:RemoveModifierByName('modifier_texiao_star') + target:EmitSound("Sound_THTD.thtd_star_up_fail") + end + target:AddPowerBonus() + else + if target.thtd_power_level == nil and target:HasModifier("modifier_fairy_count") then + if caster.is_team_mode ~= true then + local unitName = target:GetUnitName() + if unitName ~= "minoriko" and unitName ~= "sizuha" and unitName ~= "lily" and unitName ~= "nazrin" then + caster.is_team_mode = true + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_chat_msg", {msg="team_rank_tip", params={player_name=PlayerResource:GetPlayerName(caster:GetPlayerOwnerID()),reason="潜能已激活"}}) + end + end + target.thtd_power_level = target:FindModifierByName("modifier_fairy_count"):GetStackCount() + target:AddPowerBonus() + AddAbilityAndSetLevel(target, "e316") + target:EmitSound("Sound_THTD.thtd_star_up") + end + end +end + +function OnIntervalThinkHeroEffect(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster:GetUnitName() ~= "npc_dota_hero_juggernaut" then return end + local effectFile = { + -- "particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_idle_rare.vpcf", + "particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_loadout_rare_model.vpcf" + } + local attachment = { + "attach_hitloc", + -- "blade_attachment", + -- "attach_sword" + } + + if caster.display_effect ~= nil then + ParticleManager:DestroyParticleSystem(caster.display_effect, true) + end + + local effectRandom = RandomInt(1, #effectFile) + local effectAttach = attachment[RandomInt(1, #attachment)] + -- print(effectRandom) + -- print(effectAttach) + local effectIndex = ParticleManager:CreateParticle(effectFile[effectRandom], PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, effectAttach, Vector(0,0,0), true) + caster.display_effect = effectIndex + -- if effectRandom == 1 then + -- ParticleManager:SetParticleControlEnt(effectIndex , 1, caster, 5, effectAttach, Vector(-70,-110,0), true) + -- ParticleManager:SetParticleControlEnt(effectIndex , 3, caster, 5, effectAttach, Vector(0,0,0), true) + -- else + -- ParticleManager:SetParticleControlEnt(effectIndex , 3, caster, 5, effectAttach, Vector(0,0,0), true) + -- end +end + +function DrawNormalCard(keys) + local caster = keys.caster + local playerid = caster:GetPlayerOwnerID() + + if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT or caster:IsRealHero() == false then + if keys.ability:IsItem()==false then + PlayerResource:ModifyGold(caster:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem) + end + local player = caster:GetPlayerOwner() + EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster) + if player then + if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then + CustomGameEventManager:Send_ServerToPlayer(player, "display_custom_error", {msg="not_enough_item_slot"}) + end + end + return + end + + local drawList = {} + drawList[1] = {} + drawList[2] = {} + + for k,v in pairs(towerPlayerList[caster.thtd_player_id+1]) do + if v["quality"] == 1 and v["itemName"] ~= "BonusEgg" then + for i=1,v["count"] do + table.insert(drawList[1],v["itemName"]) + end + elseif v["quality"] == 2 and v["itemName"] ~= "BonusEgg" then + for i=1,v["count"] do + table.insert(drawList[2],v["itemName"]) + end + end + end + + local rChance = 20 + local chance = RandomInt(1,100) + local itemName = nil + if chance <= rChance then + if #drawList[2] > 0 then + itemName = drawList[2][RandomInt(1,#drawList[2])] + else + THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), 1000 , true, DOTA_ModifyGold_SellItem) + end + else + if #drawList[1] > 0 then + itemName = drawList[1][RandomInt(1,#drawList[1])] + else + THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), 250 , true, DOTA_ModifyGold_SellItem) + end + end + if caster:THTD_AddCardPoolItem(itemName) == false then + if keys.ability:IsItem()==false then + PlayerResource:ModifyGold(caster:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem) + end + return + end + + if GameRules.player_bb_buff[playerid]["item_3012"] > 0 and RollPercentage(GameRules.player_bb_buff[playerid]["item_3012"]) then + local quality = towerNameList[itemName]["quality"] + local itemBonus = nil + if quality == 2 then + itemBonus = CreateItem("item_2004", nil, nil) + elseif quality == 3 then + itemBonus = CreateItem("item_2003", nil, nil) + elseif quality == 4 then + itemBonus = CreateItem("item_2002", nil, nil) + end + if itemBonus ~= nil then + itemBonus.owner_player_id = playerid + itemBonus:SetPurchaser(caster) + itemBonus:SetPurchaseTime(1.0) + + if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then + CreateItemOnPositionSync(caster:GetAbsOrigin(), itemBonus) + else + caster:AddItem(itemBonus) + end + end + end + + if keys.ability:IsItem() then + local charge = keys.ability:GetCurrentCharges() + if charge > 1 then + keys.ability:SetCurrentCharges(charge-1) + else + caster:RemoveItem(keys.ability) + end + else + if GameRules.player_bb_buff[playerid]["item_3018"] < 1 then + PlayerResource:ModifyGold(playerid, math.floor((keys.ability:GetGoldCost(keys.ability:GetLevel()-1)) * (1 - GameRules.player_bb_buff[playerid]["item_3018"])) , true, DOTA_ModifyGold_SellItem) + end + end + + drawList = {} +end + +function DrawSeniorCard(keys) + local caster = keys.caster + local playerid = caster:GetPlayerOwnerID() + + if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT or caster:IsRealHero() == false then + if keys.ability:IsItem()==false then + PlayerResource:ModifyGold(caster:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem) + end + EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster) + local player = caster:GetPlayerOwner() + if player then + if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then + CustomGameEventManager:Send_ServerToPlayer(player, "display_custom_error", {msg="not_enough_item_slot"}) + end + end + return + end + + local drawList = {} + drawList[2] = {} + drawList[3] = {} + drawList[4] = {} + + for k,v in pairs(towerPlayerList[caster:GetPlayerOwnerID()+1]) do + if v["quality"] == 2 and v["itemName"] ~= "BonusEgg" then + for i=1,v["count"] do + table.insert(drawList[2],v["itemName"]) + end + elseif v["quality"] == 3 and v["itemName"] ~= "BonusEgg" then + for i=1,v["count"] do + table.insert(drawList[3],v["itemName"]) + end + elseif v["quality"] == 4 and v["itemName"] ~= "BonusEgg" then + for i=1,v["count"] do + table.insert(drawList[4],v["itemName"]) + end + end + end + + local ssrChance = 5 + local srChance = 20 + + local chance = RandomInt(1,100) + if caster.thtd_chance_count["SSR"] == nil then + caster.thtd_chance_count["SSR"] = 0 + end + if caster.thtd_chance_count["SSR"] >= 100/ssrChance then + chance = 1 + end + if chance > ssrChance then + caster.thtd_chance_count["SSR"] = caster.thtd_chance_count["SSR"] + 1 + end + + local itemName = nil + if chance <= ssrChance then + caster.thtd_chance_count["SSR"] = 0 + if #drawList[4] > 0 then + itemName = drawList[4][RandomInt(1,#drawList[4])] + else + THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), 5000 , true, DOTA_ModifyGold_SellItem) + end + elseif chance <= (ssrChance + srChance) then + if #drawList[3] > 0 then + itemName = drawList[3][RandomInt(1,#drawList[3])] + else + THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), 2500 , true, DOTA_ModifyGold_SellItem) + end + else + if #drawList[2] > 0 then + itemName = drawList[2][RandomInt(1,#drawList[2])] + else + THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), 1000 , true, DOTA_ModifyGold_SellItem) + end + end + if caster:THTD_AddCardPoolItem(itemName) == false then + if keys.ability:IsItem()==false then + PlayerResource:ModifyGold(caster:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem) + end + return + end + + if GameRules.player_bb_buff[playerid]["item_3012"] > 0 and RollPercentage(GameRules.player_bb_buff[playerid]["item_3012"]) then + local quality = towerNameList[itemName]["quality"] + local itemBonus = nil + if quality == 2 then + itemBonus = CreateItem("item_2004", nil, nil) + elseif quality == 3 then + itemBonus = CreateItem("item_2003", nil, nil) + elseif quality == 4 then + itemBonus = CreateItem("item_2002", nil, nil) + end + if itemBonus ~= nil then + itemBonus.owner_player_id = playerid + itemBonus:SetPurchaser(caster) + itemBonus:SetPurchaseTime(1.0) + + if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then + CreateItemOnPositionSync(caster:GetAbsOrigin(), itemBonus) + else + caster:AddItem(itemBonus) + end + end + end + + if keys.ability:IsItem() then + local charge = keys.ability:GetCurrentCharges() + if charge > 1 then + keys.ability:SetCurrentCharges(charge-1) + else + caster:RemoveItem(keys.ability) + end + else + if GameRules.player_bb_buff[playerid]["item_3018"] < 1 then + PlayerResource:ModifyGold(playerid, math.floor((keys.ability:GetGoldCost(keys.ability:GetLevel()-1)) * (1 - GameRules.player_bb_buff[playerid]["item_3018"])) , true, DOTA_ModifyGold_SellItem) + end + end + + drawList = {} +end + +local itemReplaceOrigin = +{ + [1] = Vector(-2100,3540,144), + [2] = Vector(1830,3540,144), + [3] = Vector(1830,-2300,144), + [4] = Vector(-2100,-2300,144) +} + +function SortItem(keys) + local caster = keys.caster + local playerid = caster:GetPlayerOwnerID() + + -- 弹出储藏处物品 + if caster:GetNumItemsInStash() > 0 then + for i=THTD_MAX_ITEM_SLOT,THTD_ITEM_TPSCROLL_SLOT-1 do + local targetItem = caster:GetItemInSlot(i) + if targetItem ~= nil and targetItem:IsNull() == false then + caster:EjectItemFromStash(targetItem) + local box = targetItem:GetContainer() + if box ~= nil then + box:SetAbsOrigin(caster.spawn_position) + end + end + end + end + + local sortedItemPos = {} + local iH = 0 + local iV = 0 + local items = Entities:FindAllByClassname("dota_item_drop") + table.sort(items, function(a,b) + local aItem = a:GetContainedItem() + local bItem = b:GetContainedItem() + if aItem ~= nil and bItem == nil then return true end + if aItem == nil and bItem ~= nil then return false end + if aItem == nil and bItem == nil then return true end + if aItem:IsStackable() == true and bItem:IsStackable() == false then return true end + if aItem:IsStackable() == false and bItem:IsStackable() == true then return false end + local aName = aItem:GetAbilityName() + local bName = bItem:GetAbilityName() + if string.sub(aName,1,6) ~= "item_3" and string.sub(bName,1,6) == "item_3" then return true end + if string.sub(aName,1,6) == "item_3" and string.sub(bName,1,6) ~= "item_3" then return false end + if string.sub(aName,1,6) == "item_3" and string.sub(bName,1,6) == "item_3" then return tonumber(string.sub(aName,7,9)) < tonumber(string.sub(bName,7,9)) end + local aData = towerNameList[aName] + local bData = towerNameList[bName] + if aData ~= nil and bData == nil then return true end + if aData == nil and bData ~= nil then return false end + if aData == nil and bData == nil then return aName < bName end + if aData["cardname"] == "BonusEgg" and bData["cardname"] ~= "BonusEgg" then return true end + if aData["cardname"] ~= "BonusEgg" and bData["cardname"] == "BonusEgg" then return false end + if string.sub(aData["cardname"],1,5) == "item_" and string.sub(bData["cardname"],1,5) ~= "item_" then return true end + if string.sub(aData["cardname"],1,5) ~= "item_" and string.sub(bData["cardname"],1,5) == "item_" then return false end + return (aData["quality"] > bData["quality"]) + end) + for _,v in pairs(items) do + local containedItem = v:GetContainedItem() + if containedItem.locked_by_player_id == nil and (containedItem.owner_player_id == playerid or (containedItem:GetPurchaser() ~= nil and containedItem:GetPurchaser():GetPlayerOwnerID() == playerid)) then + local itemName = containedItem:GetAbilityName() + if sortedItemPos[itemName] == nil then + sortedItemPos[itemName] = GetSpawnLineOffsetVector(caster.spawn_index, itemReplaceOrigin[caster.spawn_index], iH * 200, iV * 200) + if iH < 9 then + iH = iH + 1 + else + iH = 0 + iV = iV + 1 + end + end + v:SetAbsOrigin(sortedItemPos[itemName]) + THTD_ItemSetScale(containedItem) + end + end + sortedItemPos = {} +end + +function OnIntervalThinkAutoCast(keys) + if keys.ability:GetAutoCastState() then + if keys.ability:GetLevel() ~= 2 then + keys.ability:SetLevel(2) + end + else + if keys.ability:GetLevel() ~= 1 then + keys.ability:SetLevel(1) + end + end +end + +function BuyEgg(keys) + local caster = keys.caster + local hero = caster:GetHero() + + if hero:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then + PlayerResource:ModifyGold(hero:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem) + CustomGameEventManager:Send_ServerToPlayer(hero:GetPlayerOwner(), "display_custom_error", {msg="not_enough_item_slot"}) + return + end + + caster:EmitSound("Sound_THTD.thtd_buy") + + local item = CreateItem(keys.item_name, hero, hero) + if item ~= nil then + item.owner_player_id = hero.thtd_player_id + hero:AddItem(item) + else + PlayerResource:ModifyGold(hero:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem) + end +end + +local roll_card_type = +{ + [1] = { + ["Level1"] = 1, + }, + [2] = { + ["Level1"] = 2, + }, + [3] = { + ["Level2"] = 3, + }, + [4] = { + ["Level2"] = 3, + ["Level3"] = 1, + }, + [5] = { + ["Level3"] = 5, + }, +} + +function RollCard(keys) + local caster = keys.caster + local hero = caster:GetHero() + local level = keys.ability:GetLevel() + 2 + + caster:EmitSound("UI.Xidd") + + if hero.is_game_over == true then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="hero_is_game_over"}) + return + end + + if caster.roll_card_count == nil then + caster.roll_card_count = 0 + end + + if caster.roll_card_count >= 50 then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="roll_card_reach_to_max"}) + PlayerResource:ModifyGold(caster:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem) + return + end + + if caster.roll_card_count >= SpawnSystem.CurWave then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="roll_card_reach_to_wave"}) + PlayerResource:ModifyGold(caster:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem) + return + end + + caster.roll_card_count = caster.roll_card_count + 1 + print("----- roll_card_count : ", caster.roll_card_count) + + local count = 0 + for k,v in pairs(roll_card_type[level]) do + if k == "Level1" then + local drawList = {} + + drawList[1] = {} + for k,v in pairs(towerNameList) do + if v["quality"] == 1 and v["cardname"] ~= "BonusEgg" then + table.insert(drawList[1],k) + end + end + + for i=1,v do + local item = CreateItem(drawList[1][RandomInt(1,#drawList[1])], nil, nil) + if item ~= nil then + item.owner_player_id = hero.thtd_player_id + item:SetPurchaser(hero) + item:SetPurchaseTime(1.0) + local origin = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, -150) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_shinki/ability_shinki_01.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, origin - Vector(0,0,750)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + caster:SetContextThink(DoUniqueString("thtd_shinki_01_effect_wait"), + function() + if GameRules:IsGamePaused() then return 0.03 end + CreateItemOnPositionSync(origin,item) + THTD_ItemSetScale(item) + return nil + end, + 3.0) + count = count + 1 + end + end + + elseif k == "Level2" then + local drawList = {} + + drawList[1] = {} + drawList[2] = {} + + for k,v in pairs(towerNameList) do + if v["quality"] == 1 and v["cardname"] ~= "BonusEgg" then + table.insert(drawList[1],k) + elseif v["quality"] == 2 and v["cardname"] ~= "BonusEgg" and v["cardname"] ~= "item_2021" then + table.insert(drawList[2],k) + end + end + + for i=1,v do + local chance = RandomInt(0,100) + local item = nil + if chance <=20 then + if #drawList[2] > 0 then + item = CreateItem(drawList[2][RandomInt(1,#drawList[2])], nil, nil) + end + elseif chance > 20 then + if #drawList[1] > 0 then + item = CreateItem(drawList[1][RandomInt(1,#drawList[1])], nil, nil) + end + end + + if item~=nil then + item.owner_player_id = hero.thtd_player_id + item:SetPurchaser(hero) + item:SetPurchaseTime(1.0) + local origin + if string.sub(item:GetAbilityName(), 1, 6) == "item_2" then + origin = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, 0) + else + origin = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, -150) + end + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_shinki/ability_shinki_01.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, origin - Vector(0,0,750)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + caster:SetContextThink(DoUniqueString("thtd_shinki_01_effect_wait"), + function() + if GameRules:IsGamePaused() then return 0.03 end + CreateItemOnPositionSync(origin,item) + THTD_ItemSetScale(item) + return nil + end, + 3.0) + count = count + 1 + end + end + + elseif k == "Level3" then + local drawList = {} + + drawList[2] = {} + drawList[3] = {} + drawList[4] = {} + + for k,v in pairs(towerNameList) do + if v["quality"] == 2 and v["cardname"] ~= "BonusEgg" and v["cardname"] ~= "item_2021" then + table.insert(drawList[2],k) + elseif v["quality"] == 3 and v["cardname"] ~= "BonusEgg" and v["cardname"] ~= "item_2022" and v["cardname"] ~= "item_2001" then + table.insert(drawList[3],k) + elseif v["quality"] == 4 and v["cardname"] ~= "BonusEgg" then + table.insert(drawList[4],k) + end + end + + for i=1,v do + local chance = RandomInt(1,100) + + if caster.thtd_chance_count == nil then + caster.thtd_chance_count = {} + end + if caster.thtd_chance_count["shinki_SSR"] == nil then + caster.thtd_chance_count["shinki_SSR"] = 0 + end + if caster.thtd_chance_count["shinki_SSR"] >= 20 then + chance = 0 + end + if chance > 5 then + caster.thtd_chance_count["shinki_SSR"] = caster.thtd_chance_count["shinki_SSR"] + 1 + end + + local item = nil + if chance <=5 then + caster.thtd_chance_count["shinki_SSR"] = 0 + if #drawList[4] > 0 then + item = CreateItem(drawList[4][RandomInt(1,#drawList[4])], nil, nil) + end + elseif chance <= 25 then + if #drawList[3] > 0 then + item = CreateItem(drawList[3][RandomInt(1,#drawList[3])], nil, nil) + end + elseif chance > 25 then + if #drawList[2] > 0 then + item = CreateItem(drawList[2][RandomInt(1,#drawList[2])], nil, nil) + end + end + + if item~=nil then + item.owner_player_id = hero.thtd_player_id + item:SetPurchaser(hero) + item:SetPurchaseTime(1.0) + local origin + if string.sub(item:GetAbilityName(), 1, 6) == "item_2" then + origin = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, 0) + else + if item:THTD_GetCardQuality() == 4 then + origin = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, -150*2) + else + origin = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, -150) + end + end + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_shinki/ability_shinki_01.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, origin - Vector(0,0,750)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + caster:SetContextThink(DoUniqueString("thtd_shinki_01_effect_wait"), + function() + if GameRules:IsGamePaused() then return 0.03 end + CreateItemOnPositionSync(origin,item) + THTD_ItemSetScale(item) + return nil + end, + 3.0) + count = count + 1 + end + end + end + end + + if caster.roll_card_count == 8 then + keys.ability:SetLevel(2) + elseif caster.roll_card_count == 16 then + keys.ability:SetLevel(3) + end +end + +function SkipWave(keys) + local caster = keys.caster + local hero = caster:GetHero() + + local goldCost = keys.ability:GetGoldCost(keys.ability:GetLevel()-1) + local keyCount = keys.ability:GetSpecialValueFor("count") + + if not SpawnSystem.IsUnLimited then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="only_unlimited_wave"}) + PlayerResource:ModifyGold(hero:GetPlayerOwnerID(), goldCost, true, DOTA_ModifyGold_SellItem) + return + end + if SpawnSystem.ReachToWave ~= nil then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="skip_wave_exist"}) + PlayerResource:ModifyGold(hero:GetPlayerOwnerID(), goldCost, true, DOTA_ModifyGold_SellItem) + return + end + + local count = 0 + local hTPSlotItem = hero:GetItemInSlot(DOTA_ITEM_TP_SCROLL) + if hTPSlotItem then + count = hTPSlotItem:GetCurrentCharges() + end + if keyCount > 0 then + if count < keyCount then + PlayerResource:ModifyGold(hero:GetPlayerOwnerID(), goldCost, true, DOTA_ModifyGold_SellItem) + CustomGameEventManager:Send_ServerToPlayer(hero:GetPlayerOwner(), "display_custom_error", {msg="not_enough_key_count"}) + return + end + count = count - keyCount + if count <= 0 then + hTPSlotItem:RemoveSelf() + else + hTPSlotItem:SetCurrentCharges(count) + end + Service:SaveKeyCount(hero.thtd_player_id) + end + + SpawnSystem.ReachToWave = SpawnSystem.CurWave - 50 + keys.AddWave + if SpawnSystem.CurWave <= 150 and SpawnSystem.ReachToWave > 100 then + SpawnSystem:RemoveBoss() + end + + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_chat_msg", {msg="skip_wave_tip", params={player_name=PlayerResource:GetPlayerName(caster:GetPlayerOwnerID()),item_name=keys.ItemName,wave=SpawnSystem.ReachToWave}}) + EmitAnnouncerSound("Quest.Completed") +end + +local bonus_tower_table = +{ + "minoriko", + "nazrin", + "lily", + "daiyousei", + "sizuha", + "toramaru", + "seiga", +} + +function IsBonusTower(itemName, isUnit) + local towerName + if isUnit == true then + towerName = itemName + else + towerName = towerNameList[itemName]["cardname"] + end + for k,v in pairs(bonus_tower_table) do + if v == towerName then + return true + end + end + return false +end + +function GetBonusTowerCount(hero) + local count = 0 + for k,v in pairs(hero.thtd_hero_tower_list) do + if IsBonusTower(v:GetUnitName(), true) then + count = count + 1 + end + end + return count +end + +function AddManaRegenPercentage(keys) + keys.caster:THTD_AddManaRegenPercentage(keys.mana_regen, "ability_common_mana_regen_bonus") +end + +function AddPowerAttackPercentage(keys) + keys.caster:THTD_AddPowerPercentage(keys.power_up, "ability_common_power_bonus") + keys.caster:THTD_AddAttackPercentage(keys.power_up, "ability_common_power_bonus") +end + +function AddAttackSpeed(keys) + keys.caster:THTD_AddAttackSpeed(keys.attack_speed, "ability_common_attack_speed", true) +end + +function OnEquipItem(keys) + local caster = keys.caster + local item = keys.ability + print() + print("-----"..caster:GetUnitName().." equip "..item:GetAbilityName()) + -- 不延时有bug + if caster:THTD_IsTower() then + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.06 end + caster:ItemEquipBonus(item) + return nil + end, + 0.15) + end +end + +function OnUnequipItem(keys) + local caster = keys.caster + local item = keys.ability + print() + print("-----"..caster:GetUnitName().." unequip "..item:GetAbilityName()) + if caster:THTD_IsTower() then + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.06 end + caster:ItemEquipBonus(item) + return nil + end, + 0.15) + end +end + +function OnCloseAI(keys) + local caster = keys.caster + + -- local base_power = caster.thtd_attack + -- local percentage = caster:THTD_GetAttackPercentage() + -- local bonus_power = math.floor(base_power * percentage/100) + -- print("----percentage : ", tostring(percentage).."%") + -- print("base attack : ", base_power) + -- print("bonus attack : ", bonus_power) + print("crit : ", caster:THTD_GetCritDamage()) + print("chance : ", caster:THTD_GetCritChance()) + + if caster.thtd_close_ai ~= true then + caster.thtd_close_ai = true + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="change_to_close_ai", duration=5, params={}, color="#0ff"} ) + else + caster.thtd_close_ai = false + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="change_to_open_ai", duration=5, params={}, color="#0ff"} ) + -- 神子和幽幽子,是否开启大招 + local unitName = caster:GetUnitName() + if unitName=="miko" then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "ai_skill_enable", {entity=caster:GetEntityIndex(), name=unitName, skill=4}) + -- thtd_miko_04_cast + elseif unitName=="yuyuko" then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "ai_skill_enable", {entity=caster:GetEntityIndex(), name=unitName, skill=3}) + -- thtd_yuyuko_03_cast + elseif unitName=="keine" then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "ai_skill_enable", {entity=caster:GetEntityIndex(), name=unitName, skill=2}) + -- thtd_keine_02_cast + elseif unitName=="patchouli" then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "ai_skill_enable", {entity=caster:GetEntityIndex(), name=unitName, skill=2}) + -- thtd_patchouli_02_cast + end + end +end + +-- 定点施放技能 +function OnCastPointAI(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + local range = GetDistanceBetweenTwoVec2D(caster:GetOrigin(), targetPoint) + if range <= 100 then + caster.thtd_last_cast_point = nil + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="change_to_close_cast_on_fixed_point", duration=5, params={}, color="#0ff"} ) + elseif range > keys.ability:GetCastRange() then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="cast_range_out"}) + else + caster.thtd_last_cast_point = targetPoint + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="change_to_open_cast_on_fixed_point", duration=5, params={}, color="#0ff"} ) + end +end + +-- 玩具 +function OnSpellStartCosmetic( event ) + local caster = event.caster + local abilityname = event.Ability + local ability = caster:AddAbility(abilityname) + -- 所有玩具技能清单在官方的PUI的images\spellicons\consumables下同名称 + ability:SetLevel(1) + ability:EndCooldown() + ability:SetHidden(true) + ability:CastAbility() + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + caster:RemoveAbility(abilityname) + return nil + end, + 0.3) +end + +-- 礼物包 +function OnSpellStartBundle( keys ) + local caster = keys.caster + local playerid = caster:GetPlayerOwnerID() + + if not caster:IsRealHero() then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="only_hero_use"}) + keys.ability:EndCooldown() + return + end + + if caster:GetNumItemsInInventory() > 6 then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="not_enough_item_slot"}) + return + end + + keys.ability:RemoveSelf() + -- caster:AddItemByName(keys.Item1) + -- caster:AddItemByName(keys.Item2) + -- caster:AddItemByName(keys.Item3) + -- caster:AddItemByName(keys.Item4) + for i=1,4 do + local item = CreateItem(keys["Item"..tostring(i)], nil, nil) + if item ~= nil then + item.owner_player_id = playerid + caster:AddItem(item) + end + end +end + +function IsMaxCountCheckOK(hero, itemName) + local towerName = towerNameList[itemName]["cardname"] + local quality = towerNameList[itemName]["quality"] + local maxCount = (5 - quality) * 2 + + maxCount = math.floor(maxCount * (1 + (GameRules.player_bb_buff[hero.thtd_player_id]["item_3020"] or 0)/100)) + + if quality > 1 then + local count = 0 + for k,v in pairs(hero.thtd_hero_tower_list) do + if v:GetUnitName() == towerName then + count = count + 1 + end + end + if count >= maxCount then + return false + else + return true + end + else + return true + end +end + +function OnCreatedDecreaseArmor(keys) + keys.target:AddPhysicalArmor(-keys.armor) +end + +function OnDestroyDecreaseArmor(keys) + keys.target:AddPhysicalArmor(keys.armor) +end + +function OnCreatedDecreaseMagicArmor(keys) + keys.target:AddMagicalResist(-keys.magic_armor) +end + +function OnDestroyDecreaseMagicArmor(keys) + keys.target:AddMagicalResist(keys.magic_armor) +end diff --git a/scripts/vscripts/abilities/abilitydaiyousei.lua b/scripts/vscripts/abilities/abilitydaiyousei.lua new file mode 100755 index 0000000..af2da9f --- /dev/null +++ b/scripts/vscripts/abilities/abilitydaiyousei.lua @@ -0,0 +1,227 @@ +function OnDaiyousei01SpellStart(keys) + if SpawnSystem.IsUnLimited then return end + if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if target:GetPlayerOwnerID() ~= caster:GetPlayerOwnerID() then return end + + caster:EmitSound("Hero_Enchantress.EnchantCreep") + + if target:THTD_IsTower() and target~=caster and target:THTD_GetLevel() 0 and v:THTD_IsTower() and v~=caster and v:THTD_GetLevel()= manaCost then + if RollPercentage(caster:THTD_GetStar() * manaChance) then + caster:SetMana(math.min(caster:GetMaxMana(), caster:GetMana() - manaCost + caster:GetMaxMana() * manaBonus)) + else + caster:SetMana(caster:GetMana() - manaCost) + end + + local now = GameRules:GetGameTime() + if now - (target.thtd_eirin_01_project or 0) < 1 then + local delay = GetDistanceBetweenTwoVec2D(caster:GetAbsOrigin(), target:GetAbsOrigin()) / 1400 + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if IsValidAlive(target) then + local ability = caster:FindAbilityByName("thtd_eirin_01") + local damage = caster:THTD_GetAbilityPowerDamage(ability) + local DamageTable = { + ability = ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + Eirin01HitCount(caster) + end + return nil + end, + delay) + return + end + target.thtd_eirin_01_project = now + + caster:StartGesture(ACT_DOTA_CAST_ABILITY_1) + local info = + { + Target = target, + Source = caster, + Ability = ability, + EffectName = "particles/heroes/thtd_eirin/ability_eirin_01.vpcf", + iMoveSpeed = 1400, + vSourceLoc= caster:GetAbsOrigin(), -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, -- Optional + iVisionRadius = 400, -- Optional + iVisionTeamNumber = caster:GetTeamNumber(), -- Optional + ExtraData = { -- 注意,只支持简单类型,不支持 table数据 + attacker_entindex = attacker:GetEntityIndex() + } + } + local projectile = ProjectileManager:CreateTrackingProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + end +end + +function OnDestroyEirin01Count(keys) + local caster = keys.caster + + caster.thtd_eirin_01_count_lock = true + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + caster.thtd_eirin_01_count_lock = nil + return nil + end, + 0.2) + + local factor = math.floor(caster.thtd_eirin_01_count/50) + if factor > 0 then + local power = keys.power_bonus * factor + local crit = keys.crit_bonus * factor + local chance = keys.crit_chance * factor + caster:THTD_AddBasePower(power) + caster:THTD_AddBaseAttack(power) + caster:THTD_AddCritChance(chance) + caster:THTD_AddCritDamage(crit) + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_legion_commander/legion_commander_duel_victory.vpcf", PATTACH_CUSTOMORIGIN, caster) --PATTACH_OVERHEAD_FOLLOW + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin() + Vector(0, 0, 410)) + local time = 25.0 + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if time < 0 then + caster:THTD_AddBasePower(-power) + caster:THTD_AddBaseAttack(-power) + caster:THTD_AddCritChance(-chance) + caster:THTD_AddCritDamage(-crit) + return nil + end + time = time - 0.2 + return 0.2 + end, + 0) + end + + + ParticleManager:DestroyParticleSystem(caster.thtd_eirin_01_count_effect, true) + caster.thtd_eirin_01_count_effect = nil + caster.thtd_eirin_01_count = 0 +end + +function Eirin01HitCount(caster) + if caster.thtd_eirin_01_count_lock == true then + return + end + + if not caster:HasModifier("modifier_eirin_01_count") then + caster:FindAbilityByName("thtd_eirin_02"):ApplyDataDrivenModifier(caster, caster, "modifier_eirin_01_count", {duration = SpawnSystem.CurTime}) + local effectName = "particles/addons_gameplay/morokai_orb_overhead_counter.vpcf" + local effectIndex = ParticleManager:CreateParticle(effectName, PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin() + Vector(0, 0, 410)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(1, 0, 0)) + caster.thtd_eirin_01_count_effect = effectIndex + end + + caster.thtd_eirin_01_count = (caster.thtd_eirin_01_count or 0) + 1 + if caster.thtd_eirin_01_count > 500 then + caster.thtd_eirin_01_count = 500 + return + end + + local one = math.floor(caster.thtd_eirin_01_count/100) + local two = math.floor((caster.thtd_eirin_01_count - one * 100)/10) + local three = caster.thtd_eirin_01_count - one * 100 - two * 10 + if three == 0 then three = 1 end + ParticleManager:SetParticleControl(caster.thtd_eirin_01_count_effect, 2, Vector(three, two, one)) +end + +function OnEirin02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local range = caster:Script_GetAttackRange() + + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),range) + if #targets > 0 then + local target = nil + local index = RandomInt(1, #targets) + for k,v in pairs(targets) do + index = index - 1 + if THTD_IsValid(v) and index == 0 then + target = v + break + end + end + local ability = caster:FindAbilityByName("thtd_eirin_01") + if target ~= nil and ability ~= nil then + OnEirin01TrackingProjectileToTarget(caster,target,keys.attacker) + end + end +end + +function OnEirin03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + local hero = caster:GetOwner() + + if hero.thtd_eirin_03_lock == nil then + hero.thtd_eirin_03_lock = false + end + + if hero.thtd_eirin_03_lock == true then + return + end + hero.thtd_eirin_03_lock = true + + + + caster:EmitSound("Sound_THTD.thtd_eirin_02") + + local time = keys.duration_time + local range = keys.range + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_eirin/ability_eirin_03.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(range,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(range,0,0)) + ParticleManager:SetParticleControl(effectIndex, 4, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 15, targetPoint) + + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/thtd_eirin/ability_eirin_03_aeons.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex2, 1, Vector(range,range,range)) + + + local hitblockTag = DoUniqueString("hitblock") + + local hitblock = { + circlePoint = targetPoint, + radius = range, + tag = hitblockTag, + } + table.insert(THTD_Custom_Hit_Block,hitblock) + + caster:SetContextThink(DoUniqueString("thtd_eirin_03_spell_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then + ParticleManager:DestroyParticleSystem(effectIndex,true) + ParticleManager:DestroyParticleSystem(effectIndex2,true) + for index,block in pairs(THTD_Custom_Hit_Block) do + if block.tag == hitblockTag then + table.remove(THTD_Custom_Hit_Block,index) + end + end + hero.thtd_eirin_03_lock = false + return nil + end + time = time - 0.1 + local targets = THTD_FindUnitsInRadius(caster,targetPoint,450) + + for k,v in pairs(targets) do + if GetDistanceBetweenTwoVec2D(targetPoint, v:GetOrigin()) > range then + local forward = (v:GetAbsOrigin() - targetPoint):Normalized() + v:SetAbsOrigin(targetPoint+forward*range) + end + end + return 0.1 + end, + 0.1) +end + +function OnEirin04SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = keys.target_points[1] + local targetPoint = keys.target_points[1] + local pointRad = 0 + + if GetHitCustomBlock(vecCaster,targetPoint) ~= nil then + return + end + + caster:EmitSound("Sound_THTD.thtd_eirin_04") + + local maxRad = math.pi*150/180 + + for i=0,36 do + local forwardVec = Vector(math.cos(pointRad-maxRad/2+maxRad/12*i)*1500,math.sin(pointRad-maxRad/2+maxRad/12*i)*1500,0):Normalized() + + local BulletTable = { + Ability = keys.ability, + EffectName = "particles/heroes/thtd_eirin/ability_eirin_04.vpcf", + vSpawnOrigin = vecCaster, + vSpawnOriginNew = vecCaster, + fDistance = 5000, + fStartRadius = 120, + fEndRadius = 120, + Source = caster, + bHasFrontalCone = false, + bRepalceExisting = false, + iUnitTargetTeams = "DOTA_UNIT_TARGET_TEAM_ENEMY", + iUnitTargetTypes = "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP", + iUnitTargetFlags = "DOTA_UNIT_TARGET_FLAG_NONE", + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = false, + vVelocity = forwardVec, + bProvidesVision = true, + iVisionRadius = 400, + iVisionTeamNumber = caster:GetTeamNumber(), + iReflexCount = 0, + bReflexByBlock = true, + } + + if i%2 == 0 then + BulletTable.EffectName = "particles/heroes/thtd_eirin/ability_eirin_04_red.vpcf" + end + + CreateProjectileMoveToTargetPoint(BulletTable,caster,2000,0,0, + function(v,vecProjectile,reflexCount) + if v:IsNull()==false and v~=nil then + local damage_table = { + victim = v, + attacker = caster, + ability = keys.ability, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + reflexCount * keys.damage_up / 100), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = keys.ability:GetAbilityTargetFlags() + } + UnitDamageTarget(damage_table) + end + end + ) + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityflandre.lua b/scripts/vscripts/abilities/abilityflandre.lua new file mode 100755 index 0000000..7c18e3d --- /dev/null +++ b/scripts/vscripts/abilities/abilityflandre.lua @@ -0,0 +1,217 @@ +function OnFlandre01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.thtd_flandre_illusion_table == nil then + caster.thtd_flandre_illusion_table = {} + end + + caster:EmitSound("Hero_PhantomLancer.Doppelganger.Appear") + + for i=1,3 do + local illusion = CreateUnitByName( + "flandre_illusion", + caster:GetOrigin() + Vector(math.cos(math.pi/2*(i+1)),math.sin(math.pi/2*(i+1)),0)*100, + false, + caster, + caster, + caster:GetTeam() + ) + illusion:SetControllableByPlayer(caster:GetPlayerOwnerID(), true) + illusion:MoveToPosition(illusion:GetOrigin()+Vector(0,-100,0)) + illusion:SetForwardVector(caster:GetForwardVector()) + keys.ability:ApplyDataDrivenModifier(caster, illusion, "modifier_flandre_01_illusion", nil) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_flandre/ability_flandre_02_fire.vpcf", PATTACH_CUSTOMORIGIN, illusion) + ParticleManager:SetParticleControlEnt(effectIndex , 0, illusion, 5, "attach_attack1", Vector(0,0,0), true) + + caster.thtd_flandre_illusion_table[i] = illusion + + local count = 0 + illusion:SetContextThink(DoUniqueString("thtd_flandre_01_illusion"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if count > 20 or THTD_IsValid(caster) == false then + illusion:AddNoDraw() + illusion:ForceKill(true) + return nil + elseif caster:IsAttacking()==false then + illusion:RemoveGesture(ACT_DOTA_ATTACK) + illusion:MoveToPosition(illusion:GetOrigin()+Vector(0,-100,0)) + end + count = count + 1 + return 0.5 + end, + 0) + end +end + +function OnFlandre02Created(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_flandre/ability_flandre_02_fire.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "attach_attack1", Vector(0,0,0), true) + + caster.thtd_flandre_02_effectIndex = effectIndex +end + +function OnFlandre02AttackStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster.thtd_flandre_illusion_table == nil then + caster.thtd_flandre_illusion_table = {} + end + + for k,v in pairs(caster.thtd_flandre_illusion_table) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + local forward = (target:GetOrigin() - v:GetOrigin()):Normalized() + v:StartGesture(ACT_DOTA_ATTACK) + v:MoveToTargetToAttack(target) + end + end +end + +function OnFlandre02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local ability4 = caster:FindAbilityByName("thtd_flandre_04") + if ability4:GetLevel() >= 1 then + if caster.lock_target ~= target then + if THTD_IsValid(caster.lock_target) then + caster.lock_target:RemoveModifierByName("modifier_flandre_damage_lock") + end + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_flandre_damage_lock", {duration = 2.0}) + caster.lock_target = target + else + local modifier = target:FindModifierByName("modifier_flandre_damage_lock") + if modifier ~= nil then + modifier:SetDuration(2.0, false) + else + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_flandre_damage_lock", {duration = 2.0}) + end + end + if ability4:IsCooldownReady() then + target.flandre_04_lock = true + else + target.flandre_04_lock = false + end + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 4 + local crit = 1 + local ability3 = caster:FindAbilityByName("thtd_flandre_03") + if ability3:GetLevel() > 0 then + crit = 1 + (100 - target:GetHealthPercent()) * ability3:GetSpecialValueFor("damage_up") / 100 + end + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage * crit, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + OnFlandre02SpellStart(caster) +end + +function OnFlandre02SpellStart(caster) + local step = caster:GetAbilityValue("thtd_flandre_02", "damage_up") * 4 + local maxUp = caster:GetAbilityValue("thtd_flandre_02", "max_up") + local duration = caster:GetAbilityValue("thtd_flandre_02", "duration_time") + + if caster.thtd_flandre_02_outgoing == nil then + caster.thtd_flandre_02_outgoing = 0 + end + + local count = math.min(step, maxUp - caster.thtd_flandre_02_outgoing) + if count > 0 then + caster:AddDamageOutgoingPhysical(count) + caster.thtd_flandre_02_outgoing = caster.thtd_flandre_02_outgoing + count + caster:SetContextThink(DoUniqueString("modifier_flandre_02_buff_count"), + function() + if GameRules:IsGamePaused() then return 0.03 end + caster:AddDamageOutgoingPhysical(-count) + caster.thtd_flandre_02_outgoing = caster.thtd_flandre_02_outgoing - count + return nil + end, + duration) + end +end + +function OnFlandre02Destroy(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + ParticleManager:DestroyParticleSystem(caster.thtd_flandre_02_effectIndex,false) +end + +function OnCreatedFlandreLock(keys) + local target = keys.target + + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_bounty_hunter/bounty_hunter_track_trail.vpcf", PATTACH_POINT_FOLLOW, target) + ParticleManager:SetParticleControlEnt(effectIndex , 0, target, PATTACH_ABSORIGIN_FOLLOW, "attach_hitloc", target:GetAbsOrigin(), true) + ParticleManager:SetParticleControlEnt(effectIndex , 1, target, PATTACH_POINT_FOLLOW, "attach_hitloc", target:GetAbsOrigin(), true) + target.flandre_damage_lock_effect1 = effectIndex + + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_bounty_hunter/bounty_hunter_track_shield.vpcf", PATTACH_OVERHEAD_FOLLOW, target) + target.flandre_damage_lock_effect2 = effectIndex + + target.flandre_damage_lock = true +end + +function OnDestroyFlandreLock(keys) + local target = keys.target + ParticleManager:DestroyParticleSystem(target.flandre_damage_lock_effect1,true) + ParticleManager:DestroyParticleSystem(target.flandre_damage_lock_effect2,true) + target.flandre_damage_lock = false +end + +function OnFlandre04SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local ability = keys.ability + + if caster:IsPower999() then + local bonusCastCount = 4 + caster:SetContextThink(DoUniqueString("thtd_flandre_04_power999"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if bonusCastCount <= 0 then return nil end + if THTD_IsValid(caster) and THTD_IsValid(target) then + Flandre04SpellCast(caster, target, ability) + bonusCastCount = bonusCastCount - 1 + return 0.25 + else + return nil + end + end, + 0) + else + Flandre04SpellCast(caster, target, ability) + end +end + +function Flandre04SpellCast(caster, target, ability) + -- target:StartGesture(ACT_DOTA_DIE) + caster:EmitSound("Hero_DoomBringer.LvlDeath") + + local damage = caster:THTD_GetAbilityPowerDamage(ability) * 4 + local crit = 1 + local ability3 = caster:FindAbilityByName("thtd_flandre_03") + if ability3:GetLevel() > 0 then + crit = 1 + (100 - target:GetHealthPercent()) * ability3:GetSpecialValueFor("damage_up") / 100 + end + + local DamageTable = { + ability = ability, + victim = target, + attacker = caster, + damage = damage * crit, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + OnFlandre02SpellStart(caster) +end + diff --git a/scripts/vscripts/abilities/abilityfuto.lua b/scripts/vscripts/abilities/abilityfuto.lua new file mode 100755 index 0000000..2117c25 --- /dev/null +++ b/scripts/vscripts/abilities/abilityfuto.lua @@ -0,0 +1,184 @@ +function OnFuto01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster.thtd_futo_01_effct_index == nil then + caster.thtd_futo_01_effct_index = 1 + end + + if caster.thtd_futo_01_effct_index == 1 then + local damage = caster:THTD_GetStarDamage() * keys.damage1 * (1 + GetFuto02Buff(caster)) + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + target:GetOrigin(), + target:GetOrigin() + 800 * -target:GetForwardVector(), + nil, + 200, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + elseif caster.thtd_futo_01_effct_index == 2 then + if caster.__foto_lock ~= true then + caster.__foto_lock = true + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),1200) + local damage = caster:THTD_GetStarDamage() * keys.damage2 * (1 + GetFuto02Buff(caster)) + for i=1,#targets do + local unit = targets[i] + if unit~=nil and unit:IsNull()==false and unit~=target and unit:IsAlive() then + caster:PerformAttack(unit,false,false,false,false,true,false,false) + local DamageTable = { + ability = keys.ability, + victim = unit, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + caster.__foto_lock = false + end + elseif caster.thtd_futo_01_effct_index == 3 then + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + local damage = caster:THTD_GetStarDamage() * keys.damage3 * 0.3 * (1 + GetFuto02Buff(caster)) + for k,v in pairs(targets) do + local time = keys.duration_time + v:AddPoison(1, caster) + v:SetContextThink(DoUniqueString("thtd_futo_01_damage_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then + v:AddPoison(-1) + return nil + end + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + time = time - 0.3 + return 0.3 + end, + 0.3) + end + elseif caster.thtd_futo_01_effct_index == 4 then + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + local damage = caster:THTD_GetStarDamage() * keys.damage4 * (1 + GetFuto02Buff(caster)) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_futo/ability_thtd_futo_01_fire.vpcf", PATTACH_CUSTOMORIGIN, target) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + elseif caster.thtd_futo_01_effct_index == 5 then + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + for k,v in pairs(targets) do + if not v:HasModifier("modifier_futo_01_lock") then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_futo_01_lock", {Duration = 1.0}) + UnitStunTarget(caster,v,keys.stun_time) + end + end + elseif caster.thtd_futo_01_effct_index == 6 then + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + local damage = keys.attack_damage * keys.crit * (1 + GetFuto02Buff(caster)) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + SendOverheadEventMessage(caster:GetPlayerOwner(), OVERHEAD_ALERT_CRITICAL, v, damage, caster:GetPlayerOwner() ) + end + end + + caster.thtd_futo_01_effct_index = RandomInt(1,6) + caster:SetRangedProjectileName("particles/heroes/thtd_futo/ability_futo_base_attack_"..caster.thtd_futo_01_effct_index..".vpcf") +end + +function OnFuto02Kill(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local modifier = caster:FindModifierByName("modifier_futo_02_buff") + if modifier==nil then + modifier = keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_futo_02_buff", {Duration = keys.duration_time}) + modifier:SetStackCount(1) + else + if modifier:GetStackCount() < keys.max_count then + modifier:SetStackCount(modifier:GetStackCount()+1) + end + modifier:SetDuration(keys.duration_time,false) + end +end + +function GetFuto02Buff(caster) + local modifier = caster:FindModifierByName("modifier_futo_02_buff") + if modifier~=nil then + return modifier:GetStackCount() * caster:GetAbilityValue("thtd_futo_02", "damage_up", true) + end + return 0 +end + +function OnFuto03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_futo/ability_thtd_futo_03.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local time = keys.duration_time + caster:SetContextThink(DoUniqueString("thtd_futo_03_spell_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then return nil end + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 * (1 + GetFuto02Buff(caster)) + if caster:HasModifier("modifier_miko_02_buff") and caster.thtd_miko_buff_futo03 ~= nil then + damage = damage * (1 + caster.thtd_miko_buff_futo03/100) + end + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + time = time - 0.2 + return 0.2 + end, + 0) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityhanadayousei.lua b/scripts/vscripts/abilities/abilityhanadayousei.lua new file mode 100755 index 0000000..3987693 --- /dev/null +++ b/scripts/vscripts/abilities/abilityhanadayousei.lua @@ -0,0 +1,31 @@ +function OnHanadayousei01Attack(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local powerCount = 0 + local powerRange = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then + powerCount = pv[1] + powerRange = pv[2] + end + + if caster.__hanadayousei_lock ~= true then + caster.__hanadayousei_lock = true + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(), 800 + powerRange) + local count = 0 + for i=1,#targets do + local unit = targets[i] + if unit~=nil and unit:IsNull()==false and unit~=target and unit:IsAlive() then + caster:PerformAttack(unit,true,false,true,false,true,false,true) + count = count + 1 + end + if powerCount ~= 99 then + if count >= (3 + powerCount) then + break + end + end + end + caster.__hanadayousei_lock = false + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityhatate.lua b/scripts/vscripts/abilities/abilityhatate.lua new file mode 100755 index 0000000..008452f --- /dev/null +++ b/scripts/vscripts/abilities/abilityhatate.lua @@ -0,0 +1,112 @@ +function OnHatate01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hatate/ability_hatate_01_news.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()+caster:GetForwardVector()*60) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + for _,v in pairs(targets) do + if v:HasModifier("modifier_hatate01_news_buff") == false and v:HasModifier("modifier_aya01_news_buff") == false then + + end + end + local deal_damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local modifier = v:FindModifierByName("modifier_hatate01_news_buff") + if modifier == nil then + modifier = v:FindModifierByName("modifier_aya01_news_buff") + end + if modifier == nil then + modifier = keys.ability:ApplyDataDrivenModifier(caster,v,"modifier_hatate01_news_buff", nil) + elseif modifier:GetStackCount() < 999 then + modifier:IncrementStackCount() + end + local crit = 1.0 + if modifier ~= nil then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hatate/ability_hatate_01.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + crit = crit + modifier:GetStackCount() * caster:GetAbilityValue("thtd_hatate_01", "damage_up", true) + end + + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = deal_damage * crit, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = 0 + } + UnitDamageTarget(damage_table) + end +end + +function OnHatate01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster.__thtd_hatate_01_lock == true then return end + caster.__thtd_hatate_01_lock = true + + local entities = THTD_FindUnitsAll(caster) + for k,v in pairs(entities) do + if v:HasModifier("modifier_hatate01_news_buff") or v:HasModifier("modifier_aya01_news_buff") then + local modifier = v:FindModifierByName("modifier_hatate01_news_buff") + if modifier == nil then + modifier = v:FindModifierByName("modifier_aya01_news_buff") + end + if modifier == nil then + modifier = keys.ability:ApplyDataDrivenModifier(caster,v,"modifier_hatate01_news_buff", nil) + elseif modifier:GetStackCount() < 999 then + modifier:IncrementStackCount() + end + end + end + + caster.__thtd_hatate_01_lock = false +end + +function OnHatate02SpellStart(keys) + if GameRules:IsGamePaused() then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local inners = THTD_FindUnitsInner(caster) + local outers = THTD_FindUnitsOuter(caster) + + for k,v in pairs(outers) do + table.insert(inners,v) + end + + local deal_damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * keys.tick_time + for k,v in pairs(inners) do + local modifier = v:FindModifierByName("modifier_hatate01_news_buff") + if modifier == nil then + modifier = v:FindModifierByName("modifier_aya01_news_buff") + end + if modifier == nil then + modifier = keys.ability:ApplyDataDrivenModifier(caster,v,"modifier_hatate01_news_buff", nil) + elseif modifier:GetStackCount() < 999 then + modifier:IncrementStackCount() + end + if RandomInt(1,5) == 1 then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hatate/ability_hatate_01.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + local crit = 1.0 + if modifier ~= nil then + crit = crit + modifier:GetStackCount() * caster:GetAbilityValue("thtd_hatate_01", "damage_up", true) + end + + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = deal_damage * crit, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = 0 + } + UnitDamageTarget(damage_table) + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityhecatia.lua b/scripts/vscripts/abilities/abilityhecatia.lua new file mode 100755 index 0000000..4d8ed27 --- /dev/null +++ b/scripts/vscripts/abilities/abilityhecatia.lua @@ -0,0 +1,890 @@ +local thtd_hecatia_model_list = +{ + [1] = "models/new_touhou_model/hecatia/hecatia_earth/hecatia_earth.vmdl", + [2] = "models/new_touhou_model/hecatia/hecatia_moon/hecatia_moon.vmdl", + [3] = "models/new_touhou_model/hecatia/hecatia.vmdl", +} + +local HECATIA_TYPE_EARTH = 1 +local HECATIA_TYPE_MOON = 2 +local HECATIA_TYPE_OTHERWORLD = 3 + +function OnHecatia01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster.thtd_hecatia_ball_table == nil then + caster.thtd_hecatia_ball_table = {} + caster.thtd_hecatia_ball_table["earth"] = nil + caster.thtd_hecatia_ball_table["moon"] = nil + caster.thtd_hecatia_ball_table["otherworld"] = nil + end + + caster.thtd_hecatia_01_think_count = 0 + + if caster.thtd_hecatia_ball_table["earth"] == nil then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_01_earth.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint + Vector(0,0,128)) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(0.4,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(200,0,0)) + + caster.thtd_hecatia_ball_table["earth"] = + { + ["Vector"] = targetPoint + Vector(0,0,128), + ["EffectIndex"] = effectIndex + } + else + caster.thtd_hecatia_ball_table["earth"]["Vector"] = targetPoint + Vector(0,0,128) + end +end + +function OnHecatia02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster.thtd_hecatia_ball_table == nil then + caster.thtd_hecatia_ball_table = {} + caster.thtd_hecatia_ball_table["earth"] = nil + caster.thtd_hecatia_ball_table["moon"] = nil + caster.thtd_hecatia_ball_table["otherworld"] = nil + end + + caster.thtd_hecatia_01_think_count = 0 + + if caster.thtd_hecatia_ball_table["moon"] == nil then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_01_moon.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint + Vector(0,0,128)) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(0.3,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(150,0,0)) + + caster.thtd_hecatia_ball_table["moon"] = + { + ["Vector"] = targetPoint + Vector(0,0,128), + ["EffectIndex"] = effectIndex + } + else + caster.thtd_hecatia_ball_table["moon"]["Vector"] = targetPoint + Vector(0,0,128) + end +end + +function OnHecatia03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster.thtd_hecatia_ball_table == nil then + caster.thtd_hecatia_ball_table = {} + caster.thtd_hecatia_ball_table["earth"] = nil + caster.thtd_hecatia_ball_table["moon"] = nil + caster.thtd_hecatia_ball_table["otherworld"] = nil + end + + caster.thtd_hecatia_01_think_count = 0 + + if caster.thtd_hecatia_ball_table["otherworld"] == nil then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_01_otherworld.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint + Vector(0,0,128)) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(0.4,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(200,0,0)) + + caster.thtd_hecatia_ball_table["otherworld"] = + { + ["Vector"] = targetPoint + Vector(0,0,128), + ["CurPoint"] = targetPoint + Vector(0,0,128), + ["EffectIndex"] = effectIndex + } + else + local hasCombo = caster:HasModifier("modifier_thtd_hecatia_03_combo_buff") + if not hasCombo then + caster.thtd_hecatia_ball_table["otherworld"]["Vector"] = targetPoint + Vector(0,0,128) + else + caster.thtd_hecatia_ball_table["otherworld"]["Vector"] = targetPoint + Vector(0,0,128) + caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] = targetPoint + Vector(0,0,128) + caster.thtd_hecatia_ball_midOrigin = targetPoint + Vector(0,0,128) + ParticleManager:SetParticleControl(caster.thtd_hecatia_ball_table["otherworld"]["EffectIndex"], 0, targetPoint + Vector(0,0,128)) + end + end +end + +function HecatiaRemoveAllBall(caster) + if caster.thtd_hecatia_ball_table == nil then + caster.thtd_hecatia_ball_table = {} + caster.thtd_hecatia_ball_table["earth"] = nil + caster.thtd_hecatia_ball_table["moon"] = nil + caster.thtd_hecatia_ball_table["otherworld"] = nil + end + + if caster.thtd_hecatia_ball_table["earth"] ~= nil then + local effectIndex = caster.thtd_hecatia_ball_table["earth"]["EffectIndex"] + ParticleManager:DestroyParticleSystem(effectIndex,true) + end + if caster.thtd_hecatia_ball_table["moon"] ~= nil then + local effectIndex = caster.thtd_hecatia_ball_table["moon"]["EffectIndex"] + ParticleManager:DestroyParticleSystem(effectIndex,true) + end + if caster.thtd_hecatia_ball_table["otherworld"] ~= nil then + local effectIndex = caster.thtd_hecatia_ball_table["otherworld"]["EffectIndex"] + ParticleManager:DestroyParticleSystem(effectIndex,true) + end + if caster.thtd_hecatia_ball_midOrigin ~= nil then + caster.thtd_hecatia_ball_midOrigin = nil + end + if caster.thtd_hecatia_01_think_count ~= nil then + caster.thtd_hecatia_01_think_count = nil + end + + caster.thtd_hecatia_ball_table = {} +end + +local MIN_RADIUS = 300 +function OnHecatia01Think(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster.thtd_hecatia_ball_table == nil then + caster.thtd_hecatia_ball_table = {} + caster.thtd_hecatia_ball_table["earth"] = nil + caster.thtd_hecatia_ball_table["moon"] = nil + caster.thtd_hecatia_ball_table["otherworld"] = nil + end + if caster.cast_factor == nil then + caster.cast_factor = 10 -- 卡顿优化,每0.3秒释放一次技能(原0.03) + end + + if caster.thtd_hecatia_01_think_count == nil then + caster.thtd_hecatia_01_think_count = 0 + end + + if caster.thtd_hecatia_01_think_count < 360 then + caster.thtd_hecatia_01_think_count = caster.thtd_hecatia_01_think_count + 1 + else + caster.thtd_hecatia_01_think_count = 0 + end + + if caster.thtd_hecatia_01_think_count_moon == nil then + caster.thtd_hecatia_01_think_count_moon = 0 + end + + local hasCombo = caster:HasModifier("modifier_thtd_hecatia_03_combo_buff") + if caster.thtd_hecatia_01_think_count_moon < 360 then + if hasCombo then + caster.thtd_hecatia_01_think_count_moon = caster.thtd_hecatia_01_think_count_moon + 2 + else + caster.thtd_hecatia_01_think_count_moon = caster.thtd_hecatia_01_think_count_moon + 1 + end + else + caster.thtd_hecatia_01_think_count_moon = 0 + end + + if caster==nil or caster:IsNull()==true or caster:IsAlive()==false or caster:THTD_IsHidden() then + HecatiaRemoveAllBall(caster) + end + + if caster:FindAbilityByName("thtd_hecatia_04"):GetLevel() >= 1 and caster.thtd_hecatia_04_lock ~= true then + OnHecatiaTriggerTriangle(caster) + end + + if caster.thtd_hecatia_ball_table ~= nil then + if caster.thtd_hecatia_ball_table["earth"] ~= nil then + if caster.thtd_hecatia_ball_table["otherworld"] ~= nil then + if not hasCombo then + local effectIndex = caster.thtd_hecatia_ball_table["earth"]["EffectIndex"] + local distance = math.max(MIN_RADIUS,GetDistanceBetweenTwoVec2D(caster.thtd_hecatia_ball_table["earth"]["Vector"], + caster.thtd_hecatia_ball_table["otherworld"]["Vector"])) + + local midOrigin = (caster.thtd_hecatia_ball_table["earth"]["Vector"] + caster.thtd_hecatia_ball_table["otherworld"]["Vector"])/2 + local point = midOrigin + + Vector( + math.cos(caster.thtd_hecatia_01_think_count * math.pi/180)*distance, + math.sin(caster.thtd_hecatia_01_think_count * math.pi/180)*distance, + 0) + + ParticleManager:SetParticleControl(effectIndex, 0, point) + caster.thtd_hecatia_ball_table["earth"]["CurPoint"] = point + if caster.thtd_hecatia_ball_midOrigin ~= midOrigin then + caster.thtd_hecatia_ball_midOrigin = midOrigin + end + else + local effectIndex = caster.thtd_hecatia_ball_table["earth"]["EffectIndex"] + local distance = math.max(MIN_RADIUS * 2, GetDistanceBetweenTwoVec2D(caster.thtd_hecatia_ball_table["earth"]["Vector"], + caster.thtd_hecatia_ball_table["otherworld"]["Vector"])) + local curPoint = caster.thtd_hecatia_ball_table["otherworld"]["Vector"] + + if caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] ~= nil then + curPoint = caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] + end + + local point = curPoint + + Vector( + math.cos(caster.thtd_hecatia_01_think_count * math.pi/90)*distance, + math.sin(caster.thtd_hecatia_01_think_count * math.pi/90)*distance, + 0) + + ParticleManager:SetParticleControl(effectIndex, 0, point) + caster.thtd_hecatia_ball_table["earth"]["CurPoint"] = point + + if caster.thtd_hecatia_ball_midOrigin ~= caster.thtd_hecatia_ball_table["otherworld"]["Vector"] then + caster.thtd_hecatia_ball_midOrigin = caster.thtd_hecatia_ball_table["otherworld"]["Vector"] + end + end + else + local effectIndex = caster.thtd_hecatia_ball_table["earth"]["EffectIndex"] + local distance = math.max(MIN_RADIUS,GetDistanceBetweenTwoVec2D(caster:GetOrigin(), caster.thtd_hecatia_ball_table["earth"]["Vector"])) + local point = caster:GetOrigin() + + Vector( + math.cos(caster.thtd_hecatia_01_think_count * math.pi/180)*distance, + math.sin(caster.thtd_hecatia_01_think_count * math.pi/180)*distance, + 128) + ParticleManager:SetParticleControl(effectIndex, 0, point) + caster.thtd_hecatia_ball_table["earth"]["CurPoint"] = point + end + if caster.cast_factor >= 10 then + OnHecatiaEarthHit(caster) + end + end + + if caster.thtd_hecatia_ball_table["moon"] ~= nil then + if caster.thtd_hecatia_ball_table["earth"] ~= nil then + local effectIndex = caster.thtd_hecatia_ball_table["moon"]["EffectIndex"] + local distance = math.max(MIN_RADIUS,GetDistanceBetweenTwoVec2D(caster.thtd_hecatia_ball_table["earth"]["Vector"], + caster.thtd_hecatia_ball_table["moon"]["Vector"])) + local curPoint = caster.thtd_hecatia_ball_table["earth"]["Vector"] + + if caster.thtd_hecatia_ball_table["earth"]["CurPoint"] ~= nil then + curPoint = caster.thtd_hecatia_ball_table["earth"]["CurPoint"] + end + + local point = curPoint + + Vector( + math.cos(caster.thtd_hecatia_01_think_count_moon * math.pi/90)*distance, + math.sin(caster.thtd_hecatia_01_think_count_moon * math.pi/90)*distance, + 0) + + ParticleManager:SetParticleControl(effectIndex, 0, point) + caster.thtd_hecatia_ball_table["moon"]["CurPoint"] = point + else + local effectIndex = caster.thtd_hecatia_ball_table["moon"]["EffectIndex"] + local distance = math.max(MIN_RADIUS,GetDistanceBetweenTwoVec2D(caster:GetOrigin(), caster.thtd_hecatia_ball_table["moon"]["Vector"])) + local point = caster:GetOrigin() + + Vector( + math.cos(caster.thtd_hecatia_01_think_count * math.pi/90)*distance, + math.sin(caster.thtd_hecatia_01_think_count * math.pi/90)*distance, + 128) + ParticleManager:SetParticleControl(effectIndex, 0, point) + caster.thtd_hecatia_ball_table["moon"]["CurPoint"] = point + end + if caster.cast_factor >= 10 then + OnHecatiaMoonHit(caster) + end + end + + if caster.thtd_hecatia_ball_table["otherworld"] ~= nil then + if not hasCombo then + if caster.thtd_hecatia_ball_table["earth"] ~= nil then + local effectIndex = caster.thtd_hecatia_ball_table["otherworld"]["EffectIndex"] + local distance = math.max(MIN_RADIUS,GetDistanceBetweenTwoVec2D(caster.thtd_hecatia_ball_table["earth"]["Vector"], + caster.thtd_hecatia_ball_table["otherworld"]["Vector"])) + + local midOrigin = (caster.thtd_hecatia_ball_table["earth"]["Vector"] + caster.thtd_hecatia_ball_table["otherworld"]["Vector"])/2 + local point = midOrigin + + Vector( + math.cos((caster.thtd_hecatia_01_think_count + 180) * math.pi/180)*distance, + math.sin((caster.thtd_hecatia_01_think_count + 180) * math.pi/180)*distance, + 0) + + ParticleManager:SetParticleControl(effectIndex, 0, point) + caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] = point + if caster.thtd_hecatia_ball_midOrigin ~= midOrigin then + caster.thtd_hecatia_ball_midOrigin = midOrigin + end + else + local effectIndex = caster.thtd_hecatia_ball_table["otherworld"]["EffectIndex"] + local distance = math.max(MIN_RADIUS,GetDistanceBetweenTwoVec2D(caster:GetOrigin(), caster.thtd_hecatia_ball_table["otherworld"]["Vector"])) + local point = caster:GetOrigin() + + Vector( + math.cos((caster.thtd_hecatia_01_think_count + 180) * math.pi/180)*distance, + math.sin((caster.thtd_hecatia_01_think_count + 180) * math.pi/180)*distance, + 128) + ParticleManager:SetParticleControl(effectIndex, 0, point) + caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] = point + end + else + if caster.thtd_hecatia_ball_table["earth"] ~= nil then + if caster.thtd_hecatia_ball_midOrigin ~= caster.thtd_hecatia_ball_table["otherworld"]["Vector"] then + caster.thtd_hecatia_ball_midOrigin = caster.thtd_hecatia_ball_table["otherworld"]["Vector"] + end + end + end + if caster.cast_factor >= 10 then + OnHecatiaOtherworldHit(caster) + end + end + end + + if caster.cast_factor >= 10 then + caster.cast_factor = 0 + RefreshBonus(caster) + else + caster.cast_factor = caster.cast_factor + 1 + end +end + +function RefreshBonus(caster) + if caster.thtd_hecatia_ball_table["earth"] ~= nil then + caster:THTD_AddPowerPercentage(caster:GetAbilityValue("thtd_hecatia_01", "power_up"), "thtd_hecatia_01_bonus") + else + caster:THTD_AddPowerPercentage("thtd_hecatia_01_bonus") + end + if caster.thtd_hecatia_ball_table["moon"] ~= nil then + caster:THTD_AddCritChance(caster:GetAbilityValue("thtd_hecatia_02", "chance"), "thtd_hecatia_02_bonus") + caster:THTD_AddCritDamage(caster:GetAbilityValue("thtd_hecatia_02", "crit"), "thtd_hecatia_02_bonus") + else + caster:THTD_AddCritChance("thtd_hecatia_02_bonus") + caster:THTD_AddCritDamage("thtd_hecatia_02_bonus") + end + if caster.thtd_hecatia_ball_table["otherworld"] ~= nil then + caster:AddDamageOutgoingAll(caster:GetAbilityValue("thtd_hecatia_03", "damage_up"), "thtd_hecatia_03_bonus") + else + caster:AddDamageOutgoingAll("thtd_hecatia_03_bonus") + end +end + +function OnHecatiaEarthHit(caster) + local earthOrigin = caster.thtd_hecatia_ball_table["earth"]["CurPoint"] + local ability = caster:FindAbilityByName("thtd_hecatia_01") + if caster.thtd_hecatia_change_type == HECATIA_TYPE_EARTH then + if caster.thtd_hecatia_triangle_count == nil or caster.thtd_hecatia_triangle_count == 0 then + OnHecatiaCreateTriangle(caster) + end + + local damage = caster:THTD_GetAbilityPowerDamage(ability, 1) + local range = ability:GetSpecialValueFor("range1") + + local targets = THTD_FindUnitsInRadius(caster,earthOrigin, range) + for k,v in pairs(targets) do + if not v:HasModifier("modifier_hecatia_01_earth_lock") then + ability:ApplyDataDrivenModifier(caster, v, "modifier_hecatia_01_earth_lock", {}) + ability:ApplyDataDrivenModifier(caster, v, "modifier_thtd_hecatia_01_debuff", {}) + local DamageTable = { + ability = ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE, + } + UnitDamageTarget(DamageTable) + end + end + else + local damage = caster:THTD_GetAbilityPowerDamage(ability, 2) + local range = ability:GetSpecialValueFor("range2") + + local targets = THTD_FindUnitsInRadius(caster,earthOrigin, range) + for k,v in pairs(targets) do + local targetOrigin = v:GetOrigin() + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_earth_rain.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, targetOrigin) + ParticleManager:DestroyParticleSystemTime(effectIndex,0.5) + + local DamageTable = { + ability = ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end +end + +function OnHecatiaMoonHit(caster) + local moonOrigin = caster.thtd_hecatia_ball_table["moon"]["CurPoint"] + local ability = caster:FindAbilityByName("thtd_hecatia_02") + + if caster.thtd_hecatia_change_type == HECATIA_TYPE_MOON then + if caster.thtd_hecatia_triangle_count == 1 then + OnHecatiaCreateTriangle(caster) + end + + local damage = caster:THTD_GetAbilityPowerDamage(ability, 1) + local range = ability:GetSpecialValueFor("range1") + local backDistance = ability:GetSpecialValueFor("back_distance") + + local targets = THTD_FindUnitsInRadius(caster,moonOrigin, range) + for k,v in pairs(targets) do + if not v:HasModifier("modifier_hecatia_01_moon_lock") then + ability:ApplyDataDrivenModifier(caster, v, "modifier_hecatia_01_moon_lock", {}) + + local forward = (v:GetAbsOrigin()-Vector(moonOrigin.x,moonOrigin.y,0)):Normalized() + v:SetAbsOrigin(v:GetOrigin()+forward*backDistance) + FindClearSpaceForUnit(v, v:GetOrigin(), false) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_moon_hit.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, moonOrigin+Vector(0,0,64)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local DamageTable = { + ability = ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE, + } + UnitDamageTarget(DamageTable) + end + end + else + local damage = caster:THTD_GetAbilityPowerDamage(ability, 2) + local range = ability:GetSpecialValueFor("range2") + + local targets = THTD_FindUnitsInRadius(caster,moonOrigin,range) + if #targets > 0 then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex , 1, moonOrigin+Vector(0,0,64)) + ParticleManager:SetParticleControl(effectIndex , 9, caster:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local targets = THTD_FindUnitsInRadius(caster,moonOrigin,range) + local damage = caster:THTD_GetAbilityPowerDamage(ability, 2) + for k,v in pairs(targets) do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_moon_reflex.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, caster.thtd_hecatia_ball_table["moon"]["CurPoint"]+Vector(0,0,64)) + ParticleManager:SetParticleControlEnt(effectIndex , 1, v, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControl(effectIndex , 9, caster.thtd_hecatia_ball_table["moon"]["CurPoint"]+Vector(0,0,64)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + local DamageTable = { + ability = ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + end +end + +function OnHecatiaOtherworldHit(caster) + local otherworldOrigin = caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] + local ability = caster:FindAbilityByName("thtd_hecatia_03") + + if caster.thtd_hecatia_change_type == HECATIA_TYPE_OTHERWORLD then + if caster.thtd_hecatia_triangle_count == 2 then + OnHecatiaCreateTriangle(caster) + end + + local damage = caster:THTD_GetAbilityPowerDamage(ability, 1) + local activeRange = ability:GetSpecialValueFor("active_range") + local fullRange = ability:GetSpecialValueFor("full_range") + local suckTime = ability:GetSpecialValueFor("suck_duration") + + local targetsFirst = THTD_FindUnitsInRadius(caster,otherworldOrigin, activeRange) + if #targetsFirst > 0 then + if caster.thtd_hecatia_otherworld_think_lock ~= true then + caster.thtd_hecatia_otherworld_think_lock = true + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_otherworld.vpcf", PATTACH_CUSTOMORIGIN, nil) + local time = suckTime + local clearGroup = {} + THTD_SetSpellLock(caster, "thtd_hecatia_03", suckTime) + caster:SetContextThink(DoUniqueString("ability_hecatia_otherworld_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 or caster==nil or caster:IsNull()==true or caster:IsAlive()==false or caster:THTD_IsHidden() then + for k,v in pairs(clearGroup) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + FindClearSpaceForUnit(v, v:GetOrigin(), false) + end + end + clearGroup = {} + caster.thtd_hecatia_otherworld_think_lock = false + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + + local cur_origin = caster.thtd_hecatia_ball_table["otherworld"]["CurPoint"] + local targets = THTD_FindUnitsInRadius(caster,cur_origin, fullRange) + clearGroup = targets + for k,v in pairs(targets) do + local forward = (Vector(cur_origin.x,cur_origin.y,0)-v:GetAbsOrigin()):Normalized() + v:SetAbsOrigin(v:GetOrigin()+forward*100) + UnitStunTarget(caster,v,0.2) + local DamageTable = { + ability = ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + ParticleManager:SetParticleControl(effectIndex , 0, cur_origin) + ParticleManager:SetParticleControl(effectIndex , 2, cur_origin) + time = time - 0.3 + return 0.3 + end, + 0) + end + end + else + local range = ability:GetSpecialValueFor("range2") + local targetsFirst = THTD_FindUnitsInRadius(caster,otherworldOrigin,range) + if #targetsFirst > 0 then + if caster.thtd_hecatia_otherworld_hit_lock ~= true then + caster.thtd_hecatia_otherworld_hit_lock = true + -- caster.thtd_hecatia_otherworld_hit_list = {} + caster:SetContextThink(DoUniqueString("ability_hecatia_hit_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + + local damage = caster:THTD_GetAbilityPowerDamage(ability, 2) + local targets = THTD_FindUnitsInRadius(caster,otherworldOrigin,range) + for k,v in pairs(targets) do + local DamageTable = { + ability = ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + caster.thtd_hecatia_otherworld_hit_lock = false + return nil + end, + 0.5) + + local hasCombo = caster:HasModifier("modifier_thtd_hecatia_03_combo_buff") + for i=1,12 do + local forward1 = Vector(math.cos(i*math.pi/6),math.sin(i*math.pi/6),0) + local forward2 = Vector(math.cos(i*math.pi/6+math.pi/2),math.sin(i*math.pi/6+math.pi/2),0) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile.vpcf", PATTACH_CUSTOMORIGIN, caster) + if hasCombo then + ParticleManager:SetParticleControl(effectIndex, 0, otherworldOrigin + Vector(0,0,128)) + else + ParticleManager:SetParticleControl(effectIndex, 0, otherworldOrigin + forward1 * 150 + Vector(0,0,128)) + end + ParticleManager:SetParticleControl(effectIndex, 1, forward2 * 800) + ParticleManager:DestroyParticleSystemTime(effectIndex, 0.9) + end + + -- for i=1,12 do + -- local forward1 = Vector(math.cos(i*math.pi/6),math.sin(i*math.pi/6),0) + -- local forward2 = Vector(math.cos(i*math.pi/6+math.pi/2),math.sin(i*math.pi/6+math.pi/2),0) + -- local info = + -- { + -- Ability = ability, + -- EffectName = "particles/heroes/thtd_hecatia/ability_hecatia_otherworld_projectile.vpcf", + -- vSpawnOrigin = otherworldOrigin + forward1 * 100 + Vector(0,0,128), + -- fDistance = range, + -- fStartRadius = 150, + -- fEndRadius = 150, + -- Source = caster, + -- bHasFrontalCone = false, + -- bReplaceExisting = false, + -- iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + -- iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + -- iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + -- fExpireTime = GameRules:GetGameTime() + 10.0, + -- bDeleteOnHit = false, + -- vVelocity = forward2 * 500, + -- bProvidesVision = true, + -- iVisionRadius = 1000, + -- iVisionTeamNumber = caster:GetTeamNumber() + -- } + -- local projectile = ProjectileManager:CreateLinearProjectile(info) + -- ParticleManager:DestroyLinearProjectileSystem(projectile,false) + -- end + end + end + end +end + +-- function OnHecatiaProjectileHit(keys) + -- local caster = EntIndexToHScript(keys.caster_entindex) + -- local target = keys.target + + -- for k,v in pairs(caster.thtd_hecatia_otherworld_hit_list) do + -- if v == target then + -- return + -- end + -- end + + -- local damage = caster:THTD_GetAbilityPowerDamage(caster:FindAbilityByName("thtd_hecatia_03"), 2) + -- local DamageTable = { + -- ability = keys.ability, + -- victim = target, + -- attacker = caster, + -- damage = damage, + -- damage_type = keys.ability:GetAbilityDamageType(), + -- damage_flags = DOTA_DAMAGE_FLAG_NONE, + -- } + -- UnitDamageTarget(DamageTable) + -- table.insert(caster.thtd_hecatia_otherworld_hit_list, target) +-- end + +function OnHecatia04Think(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster:GetTowerPowerLevel() >= 3 then + if caster.thtd_hecatia_change_list == nil or #caster.thtd_hecatia_change_list == 0 then + caster.thtd_hecatia_change_list = {HECATIA_TYPE_EARTH, HECATIA_TYPE_MOON, HECATIA_TYPE_OTHERWORLD, HECATIA_TYPE_EARTH, HECATIA_TYPE_MOON, HECATIA_TYPE_OTHERWORLD} + end + local index = RandomInt(1,#caster.thtd_hecatia_change_list) + local randomType = caster.thtd_hecatia_change_list[index] + table.remove(caster.thtd_hecatia_change_list, index) + caster:SetModel(thtd_hecatia_model_list[randomType]) + caster:SetOriginalModel(thtd_hecatia_model_list[randomType]) + caster.thtd_hecatia_change_type = randomType + return + end + + local randomType = RandomInt(1,3) + caster:SetModel(thtd_hecatia_model_list[randomType]) + caster:SetOriginalModel(thtd_hecatia_model_list[randomType]) + caster.thtd_hecatia_change_type = randomType + + -- local level = 1 + -- if GetHecatiaBallCount(caster) == 3 then + -- level = 2 + -- end + -- for i=1,4 do + -- local ability = caster:FindAbilityByName("thtd_hecatia_0"..tostring(i)) + -- if ability ~= nil and ability:GetLevel() ~= level then + -- ability:SetLevel(level) + -- end + -- end +end + +function OnHecatiaCreateTriangle(caster) + if caster.thtd_hecatia_ball_midOrigin == nil then + return + end + + if caster.thtd_hecatia_triangle_count == nil then + caster.thtd_hecatia_triangle_count = 0 + end + + if caster.thtd_hecatia_triangle_table == nil then + caster.thtd_hecatia_triangle_table = {} + end + + if caster.thtd_hecatia_triangle_angle == nil then + caster.thtd_hecatia_triangle_angle = RandomInt(0, 360) + end + + if caster.thtd_hecatia_triangle_count < 3 then + local radius = 900 + local point = RotatePosition(caster.thtd_hecatia_ball_midOrigin, QAngle(0,caster.thtd_hecatia_triangle_angle,0), caster.thtd_hecatia_ball_midOrigin + Vector(0, radius, 0)) + caster.thtd_hecatia_triangle_count = caster.thtd_hecatia_triangle_count + 1 + if caster.thtd_hecatia_triangle_count == 2 then + point = RotatePosition(caster.thtd_hecatia_ball_midOrigin, QAngle(0,120,0), point) + elseif caster.thtd_hecatia_triangle_count == 3 then + point = RotatePosition(caster.thtd_hecatia_ball_midOrigin, QAngle(0,240,0), point) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_04_triangle.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex , 0, point) + ParticleManager:SetParticleControl(effectIndex , 3, point) + + caster.thtd_hecatia_triangle_table[caster.thtd_hecatia_triangle_count] = {} + caster.thtd_hecatia_triangle_table[caster.thtd_hecatia_triangle_count]["EffectIndex"] = effectIndex + caster.thtd_hecatia_triangle_table[caster.thtd_hecatia_triangle_count]["Origin"] = point + end +end + +function OnHecatiaTriggerTriangle(caster) + if caster.thtd_hecatia_triangle_count == nil then + caster.thtd_hecatia_triangle_count = 0 + end + + if caster.thtd_hecatia_triangle_table == nil then + caster.thtd_hecatia_triangle_table = {} + end + + if caster.thtd_hecatia_triangle_count >= 3 and THTD_HasUnitsInRadius(caster, caster:GetAbsOrigin(), 1500) then + local ability = caster:FindAbilityByName("thtd_hecatia_04") + local duration = math.floor(ability:GetSpecialValueFor("duration_time") * 100 + 0.5)/100 + local power_bonus = ability:GetSpecialValueFor("power_bonus") + local durationDelay = 0 + local delayCount = 0 + local time = 0 + local count = 0 + local triangleTable = caster.thtd_hecatia_triangle_table + caster.thtd_hecatia_04_lock = true + + caster:SetContextThink(DoUniqueString("ability_hecatia_triangle_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time > duration + durationDelay or THTD_IsValid(caster) == false then + ParticleManager:DestroyParticleSystem(caster.thtd_hecatia_triangle_table[1]["EffectIndex"],true) + ParticleManager:DestroyParticleSystem(caster.thtd_hecatia_triangle_table[2]["EffectIndex"],true) + ParticleManager:DestroyParticleSystem(caster.thtd_hecatia_triangle_table[3]["EffectIndex"],true) + triangleTable = {} + caster.thtd_hecatia_triangle_table = {} + caster.thtd_hecatia_triangle_count = 0 + caster.thtd_hecatia_triangle_angle = nil + caster.thtd_hecatia_04_lock = false + return nil + end + -- 改为三角连接和中心发射同时进行 + count = count + 1 + if count > 3 then + count = 1 + end + local countNext = count + 1 + if countNext > 3 then + countNext = 1 + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, triangleTable[count]["Origin"]) + ParticleManager:SetParticleControl(effectIndex , 1, triangleTable[countNext]["Origin"]) + ParticleManager:SetParticleControl(effectIndex , 9, triangleTable[count]["Origin"]) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local distance = GetDistanceBetweenTwoVec2D(triangleTable[count]["Origin"], triangleTable[countNext]["Origin"]) + local speed = 3000 + local delayTime = distance / speed + time = time + delayTime + if delayCount < 3 then + delayCount = delayCount + 1 + durationDelay = delayTime + + if delayCount == 3 then + caster:THTD_AddBasePower(power_bonus, "thtd_hecatia_04_buff") + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if time > duration + durationDelay or THTD_IsValid(caster) == false then + caster:THTD_AddBasePower("thtd_hecatia_04_buff") + return nil + end + + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + local center,radius = GetCircleCenterAndRadius(triangleTable[1]["Origin"],triangleTable[2]["Origin"],triangleTable[3]["Origin"]) + local targets = THTD_FindUnitsInRadius(caster,center,radius) + local damage = caster:THTD_GetAbilityPowerDamage(ability) + for k,v in pairs(targets) do + if v ~= nil and v:IsNull() == false and v:IsAlive() and IsInTriangle(triangleTable[1]["Origin"],triangleTable[2]["Origin"],triangleTable[3]["Origin"],v:GetAbsOrigin()) then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, center) + ParticleManager:SetParticleControlEnt(effectIndex , 1, v, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControl(effectIndex , 9, center) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local DamageTable = { + ability = ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + return nil + end, + 0.3) + + return 0.5 + end, + 0) + end + + end + return delayTime + + -- 这个效果是三个三角依次连接后再从中心发射 + -- if count < 3 then + -- count = count + 1 + + -- local countNext = count + 1 + -- if countNext > 3 then + -- countNext = 1 + -- end + + -- local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) + + -- ParticleManager:SetParticleControl(effectIndex , 0, triangleTable[count]["Origin"]) + -- ParticleManager:SetParticleControl(effectIndex , 1, triangleTable[countNext]["Origin"]) + -- ParticleManager:SetParticleControl(effectIndex , 9, triangleTable[count]["Origin"]) + -- ParticleManager:DestroyParticleSystem(effectIndex,false) + + -- local distance = GetDistanceBetweenTwoVec2D(triangleTable[count]["Origin"], triangleTable[countNext]["Origin"]) + -- local speed = 3000 + -- local delayTime = distance / speed + -- time = time - delayTime + -- return delayTime + -- else + -- local center,radius = GetCircleCenterAndRadius(triangleTable[1]["Origin"],triangleTable[2]["Origin"],triangleTable[3]["Origin"]) + -- local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) + + -- ParticleManager:SetParticleControl(effectIndex , 0, triangleTable[1]["Origin"]) + -- ParticleManager:SetParticleControl(effectIndex , 1, caster.thtd_hecatia_ball_midOrigin) + -- ParticleManager:SetParticleControl(effectIndex , 9, triangleTable[1]["Origin"]) + -- ParticleManager:DestroyParticleSystem(effectIndex,false) + + -- local distance = GetDistanceBetweenTwoVec2D(triangleTable[1]["Origin"], caster.thtd_hecatia_ball_midOrigin) + -- local speed = 3000 + -- local delayTime = distance / speed + + -- caster:SetContextThink(DoUniqueString("ability_hecatia_04_delay"), + -- function() + -- if GameRules:IsGamePaused() then return 0.03 end + -- local damage = caster:THTD_GetAbilityPowerDamage(ability) + -- local targets = THTD_FindUnitsInRadius(caster,center,radius) + -- for k,v in pairs(targets) do + -- local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_hecatia/ability_hecatia_04_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) + -- ParticleManager:SetParticleControl(effectIndex , 0, caster.thtd_hecatia_ball_midOrigin) + -- ParticleManager:SetParticleControlEnt(effectIndex , 1, v, 5, "attach_hitloc", Vector(0,0,0), true) + -- ParticleManager:SetParticleControl(effectIndex , 9, caster.thtd_hecatia_ball_midOrigin) + -- ParticleManager:DestroyParticleSystem(effectIndex,false) + + -- local DamageTable = { + -- ability = ability, + -- victim = v, + -- attacker = caster, + -- damage = damage, + -- damage_type = ability:GetAbilityDamageType(), + -- damage_flags = DOTA_DAMAGE_FLAG_NONE + -- } + -- UnitDamageTarget(DamageTable) + -- end + -- return nil + -- end, + -- delayTime) + + -- count = 0 + + -- time = time - tick + -- return tick + -- end + end, + 0) + end +end + +function GetHecatiaBallCount(caster) + if caster.thtd_hecatia_ball_table == nil then return 0 end + local count = 0 + if caster.thtd_hecatia_ball_table["earth"] ~= nil then + count = count + 1 + end + if caster.thtd_hecatia_ball_table["moon"] ~= nil then + count = count + 1 + end + if caster.thtd_hecatia_ball_table["otherworld"] ~= nil then + count = count + 1 + end + return count +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityhina.lua b/scripts/vscripts/abilities/abilityhina.lua new file mode 100755 index 0000000..8fe5f44 --- /dev/null +++ b/scripts/vscripts/abilities/abilityhina.lua @@ -0,0 +1,143 @@ + +-- 特殊太卡,弃用 +function OnHina02Think(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if keys.ability:GetLevel() < 1 then return end + + -- caster:EmitSound("Hero_TrollWarlord.WhirlingAxes.Melee") + + local effect = "particles/econ/items/troll_warlord/troll_ti10_shoulder/troll_ti10_whirling_axe_melee.vpcf" + local damage = 1000 + local damage_tick = 0.1 + local damage_duration = 3.0 + local max_count = math.floor(damage_duration/damage_tick + 0.5) + local radius = 1000 - 200 + local elapsed_duration = 0 + local enemies_hit = {} + + local caster_pos = caster:GetAbsOrigin() + local caster_direction = caster:GetForwardVector() + local effectIndexList = {} + local effectPointList = {} + for i = 1,5 do + local axe_target_point = RotatePosition(caster_pos, QAngle(0, i * 72, 0), caster_pos + caster_direction * 175) + local effectIndex = ParticleManager:CreateParticle(effect, PATTACH_ABSORIGIN_FOLLOW, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster_pos + Vector(0, 0, 100)) + ParticleManager:SetParticleControl(effectIndex, 1, axe_target_point + Vector(0, 0, 100)) + ParticleManager:SetParticleControl(effectIndex, 4, Vector(damage_duration, 0, 0)) + effectIndexList[i] = effectIndex + effectPointList[i] = axe_target_point + end + + local count = 1 + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + + for i = 1,5 do + local axe_target_point = RotatePosition(caster_pos, QAngle(0, 360 * count/max_count, 0), effectPointList[i]) + axe_target_point = axe_target_point + (axe_target_point - caster_pos):Normalized() * radius * count/max_count + ParticleManager:SetParticleControl(effectIndexList[i], 1, axe_target_point + Vector(0, 0, 100)) + end + + local targets = THTD_FindUnitsInRadius(caster,caster_pos,1200) + local damage = 1200 + for k,v in pairs(targets) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + if enemies_hit[v:entindex()] ~= true then + enemies_hit[v:entindex()] = true + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + end + + -- If the duration is over, end + if count < max_count then + count = count + 1 + return damage_tick + else + for i = 1,5 do + ParticleManager:ReleaseParticleIndex(effectIndexList[i]) + end + return nil + end + end, + 0.1) +end + + +function OnSpellStartHina02(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local range = keys.range + local bonus_crit = keys.bonus_crit + local chance = keys.chance + local duration = math.floor(keys.duration * 100 + 0.5)/100 + local tick = math.floor(keys.tick * 100 + 0.5)/100 + + local effect = "particles/econ/items/troll_warlord/troll_ti10_shoulder/troll_ti10_whirling_axe_melee.vpcf" + local effectIndex = ParticleManager:CreateParticle(effect, PATTACH_ABSORIGIN_FOLLOW, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin() + Vector(0, 0, 100)) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint + Vector(0, 0, 100)) + ParticleManager:SetParticleControl(effectIndex, 4, Vector(duration + 4, 0, 0)) + + local powerChance = 0 + local pv = caster:GetAbilityPowerValue("thtd_hina_02") + if pv ~= nil then + powerChance = pv[1] + end + + local crit666 = 1 + if caster:IsPower666() then crit666 = 5 end + + local time = duration + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + time = time - tick + if time < 0 then + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local crit = 1 + v.thtd_hina_02_debuff_count = math.min(999, (v.thtd_hina_02_debuff_count or 0) + 1) + local count = v.thtd_hina_02_debuff_count + if caster:IsPower999() then + for _,tar in pairs(targets) do + if v ~= tar then + count = count + (tar.thtd_hina_02_debuff_count or 0) * 0.4 + end + end + end + if RollPercentage(chance + powerChance) then + crit = 1 + count * (bonus_crit + powerChance)/100 + end + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage * crit * crit666, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + return tick + end, + tick) + +end diff --git a/scripts/vscripts/abilities/abilityhourainingyou.lua b/scripts/vscripts/abilities/abilityhourainingyou.lua new file mode 100755 index 0000000..ff8da63 --- /dev/null +++ b/scripts/vscripts/abilities/abilityhourainingyou.lua @@ -0,0 +1,21 @@ +function OnHourainingyou01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if RollPercentage(keys.chance) then + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + if not target:HasModifier("modifier_hourainingyou_01_stun_lock") then + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_hourainingyou_01_stun_lock", {Duration = keys.lock_time}) + UnitStunTarget(caster,target,keys.stun_time) + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityiku.lua b/scripts/vscripts/abilities/abilityiku.lua new file mode 100755 index 0000000..3b68ab6 --- /dev/null +++ b/scripts/vscripts/abilities/abilityiku.lua @@ -0,0 +1,95 @@ +function OnIku01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local targetPoint = target:GetOrigin() + + if caster.thtd_iku_01_attack_count == nil then + caster.thtd_iku_01_attack_count = 0 + end + + caster.thtd_iku_01_attack_count = caster.thtd_iku_01_attack_count + 1 + + if caster.thtd_iku_01_attack_count >= keys.max_count then + caster.thtd_iku_01_attack_count = 0 + caster:EmitSound("Sound_THTD.thtd_iku_01") + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius) + for k,v in pairs(targets) do + if v:HasModifier("modifier_iku_01_debuff_lock") == false then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_iku_01_debuff", {Duration = keys.stun_time}) + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_iku_01_debuff_lock", nil) + end + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/iku/ability_iku_01_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end +end + +function OnIku02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local time = keys.duration_time + local tick = keys.tick_time + + Iku02CreateEffect(keys) + caster:EmitSound("Sound_THTD.thtd_iku_02") + + caster:SetContextThink(DoUniqueString("thtd_iku02_lightning"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then return nil end + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * tick + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + time = time - tick + return tick + end, + 0) +end + +function Iku02CreateEffect(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + local vec = caster:GetOrigin() + 700*caster:GetForwardVector() + Vector(0,0,128) + + local particle = ParticleManager:CreateParticle("particles/thd2/heroes/iku/ability_iku_04_light_b.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(particle,0,vec) + ParticleManager:SetParticleControlForward(particle,0,caster:GetForwardVector()) + ParticleManager:SetParticleControl(particle,2,vec) + ParticleManager:SetParticleControl(particle,3,vec) + ParticleManager:SetParticleControl(particle,4,-caster:GetForwardVector()) + ParticleManager:SetParticleControl(particle,5,-caster:GetForwardVector()) + + ParticleManager:DestroyParticleSystemTime(particle,keys.duration_time) + + particle = ParticleManager:CreateParticle("particles/thd2/heroes/iku/ability_iku_04_model.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(particle,0,caster:GetOrigin()+caster:GetForwardVector()*350 + Vector(0,0,128)) + ParticleManager:SetParticleControlForward(particle,0,caster:GetForwardVector()) + + ParticleManager:DestroyParticleSystemTime(particle,keys.duration_time) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityinaba.lua b/scripts/vscripts/abilities/abilityinaba.lua new file mode 100755 index 0000000..427571d --- /dev/null +++ b/scripts/vscripts/abilities/abilityinaba.lua @@ -0,0 +1,204 @@ +local inaba_01_black_list = +{ + "lily", + "daiyousei", +} + +function IsInInaba01BlackList(unit) + for k,v in pairs(inaba_01_black_list) do + if unit:GetUnitName() == v then + return true + end + end + return false +end + +function OnSpellStartInaba01(keys) + local caster = keys.caster + local target = keys.target + + if target:THTD_IsTower() == false or target:GetPlayerOwnerID() ~= caster:GetPlayerOwnerID() then + keys.ability:EndCooldown() + caster:GiveMana(caster:GetRealManaCost(keys.ability)) + return + end + + caster.thtd_last_cast_unit = target + caster:EmitSound("Hero_OgreMagi.Bloodlust.Cast") + + local modifier = target:FindModifierByName("modifier_inaba_01_buff") + if modifier == nil then + modifier = keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_inaba_01_buff", nil) + else + modifier:SetDuration(keys.duration, false) + end + + local effectName = "particles/econ/items/ogre_magi/ogre_ti8_immortal_weapon/ogre_ti8_immortal_bloodlust_buff.vpcf" + local effectIndex = ParticleManager:CreateParticle(effectName, PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex, 0, caster, PATTACH_POINT_FOLLOW, "attach_hitloc", caster:GetAbsOrigin(), true) + ParticleManager:SetParticleControlEnt(effectIndex, 2, target, PATTACH_CUSTOMORIGIN_FOLLOW, nil, target:GetAbsOrigin(), true) + ParticleManager:SetParticleControlEnt(effectIndex, 3, target, PATTACH_CUSTOMORIGIN_FOLLOW, nil, target:GetAbsOrigin(), true) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + + +function OnCreatedInaba01Buff(keys) + local target = keys.target + target:THTD_AddCritChance(keys.chance, "thtd_inaba_01_buff_bonus") + target:THTD_AddAttackSpeed(keys.attack_speed, "thtd_inaba_01_buff_bonus") + if not IsInInaba01BlackList(target) then + target:AddManaCostReducePercent(keys.mana_cost, "thtd_inaba_01_buff_bonus") + end +end + +function OnDestroyInaba01Buff(keys) + local target = keys.target + target:THTD_AddCritChance("thtd_inaba_01_buff_bonus") + target:THTD_AddAttackSpeed("thtd_inaba_01_buff_bonus") + if not IsInInaba01BlackList(target) then + target:AddManaCostReducePercent("thtd_inaba_01_buff_bonus") + end +end + + +function OnAttackLandedInaba02(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local targetPoint = keys.target:GetAbsOrigin() + + caster.thtd_inaba_02_attack_count = (caster.thtd_inaba_02_attack_count or 0) + 1 + + local powerDamageUp = 0 + local pv = caster:GetAbilityPowerValue("thtd_inaba_02") + if pv ~= nil then + powerDamageUp = pv[1] + end + + local damage_up = keys.damage_up + powerDamageUp + local max_count = keys.max_count + if caster:IsPower999() then + max_count = max_count * 2 + end + + if caster:HasModifier("modifier_inaba_02_buff") then + caster:FindModifierByName("modifier_inaba_02_buff"):SetDuration(2.0, false) + end + + if caster.thtd_inaba_02_attack_count % keys.count1 == 0 then + if caster.thtd_inaba_power666_bonus_power ~= nil then + caster:THTD_AddPowerPercentage(-caster.thtd_inaba_power666_bonus_power) + caster.thtd_inaba_power666_bonus_power = nil + end + if caster:IsPower999() then + caster.thtd_inaba_power666_bonus_power = 300 + caster:THTD_AddPowerPercentage(caster.thtd_inaba_power666_bonus_power) + end + local unit = CreateUnitByName( + "inaba_rabbit" + ,caster:GetOrigin() + caster:GetForwardVector() * 120 + ,false + ,caster:GetOwner() + ,caster:GetOwner() + ,caster:GetTeam() + ) + + local lastVec = target:GetAbsOrigin() + if unit ~= nil then + unit:SetControllableByPlayer(caster:GetPlayerOwnerID(), false) + unit.thtd_spawn_unit_owner = caster + keys.ability:ApplyDataDrivenModifier(caster, unit, "modifier_inaba_02_rabbit", nil) + unit:AddNewModifier(unit, nil, "modifier_phased", {}) + local kill_time = 10.0 + unit:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + kill_time = kill_time - 0.2 + if THTD_IsValid(caster) == false or kill_time < 0 then + unit:AddNoDraw() + unit:ForceKill(false) + return nil + end + unit:MoveToPosition(lastVec) + if THTD_IsValid(target) then + lastVec = target:GetAbsOrigin() + end + if (lastVec - unit:GetAbsOrigin()):Length2D() < 100 then + -- EmitSoundOnLocationWithCaster(lastVec, "Hero_Techies.LandMine.Detonate", caster) + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_techies/techies_blast_off.vpcf", PATTACH_POINT, caster) + ParticleManager:SetParticleControl(effectIndex , 0, lastVec) + ParticleManager:DestroyParticleSystem(effectIndex, false) + unit:AddNoDraw() + unit:ForceKill(false) + + local boomTargets = THTD_FindUnitsInRadius(caster,lastVec,keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 1) + local modifier = caster:FindModifierByName("modifier_inaba_02_buff") + if modifier ~= nil then + local stack_count = modifier:GetStackCount() + damage = damage * (1 + stack_count * damage_up/100) + modifier:SetStackCount(math.min(max_count, stack_count+1)) + else + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_inaba_02_buff", {duration = 2.0}):SetStackCount(1) + end + for k,v in pairs(boomTargets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + return nil + end + + return 0.2 + end, + 0.2) + end + end + + if caster.thtd_inaba_02_attack_count >= keys.count2 then + caster.thtd_inaba_02_attack_count = 0 + local effectName = "particles/econ/items/sniper/sniper_fall20_immortal/sniper_fall20_immortal_shrapnel.vpcf" + local effectIndex = ParticleManager:CreateParticle(effectName, PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetAbsOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(keys.range, 0, 0)) + local time = math.floor(keys.duration * 100 + 0.5)/100 + local tick = 0.5 + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + time = time - tick + if time < 0 or THTD_IsValid(caster) == false then + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 2) + local modifier = caster:FindModifierByName("modifier_inaba_02_buff") + if modifier ~= nil then + damage = damage * (1 + modifier:GetStackCount() * damage_up/100) + end + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + return tick + end, + 0.1) + + end +end diff --git a/scripts/vscripts/abilities/abilityitem.lua b/scripts/vscripts/abilities/abilityitem.lua new file mode 100755 index 0000000..999efb2 --- /dev/null +++ b/scripts/vscripts/abilities/abilityitem.lua @@ -0,0 +1,486 @@ +function OnItem2001_SpellStart(keys) + local caster = keys.caster + if caster:IsRealHero() or caster:GetUnitName() == "reimu_pet" then + local entities = Entities:FindAllByClassname("npc_dota_creature") + + for k,v in pairs(entities) do + local findNum = string.find(v:GetUnitName(), 'creature') + if findNum ~= nil and v~=nil and v:IsNull()==false and v:IsAlive() then + if SpawnSystem.IsUnLimited then + if v.thtd_player_index == caster:GetPlayerOwnerID() then + caster:NpcKill(v) + end + else + caster:NpcKill(v) + end + end + end + + if SpawnSystem.CurWave > 100 then + if caster:GetUnitName() == "reimu_pet" then + caster:GetOwner().use_item2001_count = (caster:GetOwner().use_item2001_count or 0) + 1 + else + caster.use_item2001_count = (caster.use_item2001_count or 0) + 1 + end + if SpawnSystem.RankMinWave >= SpawnSystem.CurWave then + SpawnSystem.RankMinWave = SpawnSystem.RankMinWave + 1 + end + end + + local particle = ParticleManager:CreateParticle("particles/heroes/yumemi/ability_yumemi_04_exolosion.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(particle,0,caster:GetOrigin()) + ParticleManager:DestroyParticleSystem(particle,false) + + if keys.ability:IsItem() then + local charge = keys.ability:GetCurrentCharges() + if charge > 1 then + keys.ability:SetCurrentCharges(charge-1) + else + caster:RemoveItem(keys.ability) + end + end + end +end + +function OnItem2002_SpellStart(keys) + local caster = keys.caster + if caster:IsRealHero() then + if keys.ability:IsItem() then + local select_cards = {} + for k,v in pairs(towerPlayerList[caster:GetPlayerOwnerID()+1]) do + if v["quality"] == 4 and string.find(v["itemName"],"item_20") == nil and v["count"] > 0 then + select_cards[v["itemName"]] = v["itemName"] + end + end + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_select_card_panel", {cards=select_cards} ) + caster.thtd_last_select_item = keys.ability + end + end +end + +function OnItem2003_SpellStart(keys) + local caster = keys.caster + if caster:IsRealHero() then + if keys.ability:IsItem() then + local select_cards = {} + for k,v in pairs(towerPlayerList[caster:GetPlayerOwnerID()+1]) do + if v["quality"] == 3 and string.find(v["itemName"],"item_20") == nil and v["count"] > 0 then + select_cards[v["itemName"]] = v["itemName"] + end + end + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_select_card_panel", {cards=select_cards} ) + caster.thtd_last_select_item = keys.ability + end + end +end + +function OnItem2004_SpellStart(keys) + local caster = keys.caster + if caster:IsRealHero() then + if keys.ability:IsItem() then + local select_cards = {} + for k,v in pairs(towerPlayerList[caster:GetPlayerOwnerID()+1]) do + if v["quality"] == 2 and string.find(v["itemName"],"item_20") == nil and v["count"] > 0 then + select_cards[v["itemName"]] = v["itemName"] + end + end + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_select_card_panel", {cards=select_cards} ) + caster.thtd_last_select_item = keys.ability + end + end +end + +function OnItem2021_SpellStart(keys) + local target = keys.target + + if target:THTD_IsTower() and target:HasModifier("modifier_item_2021_buff") == false then + local duration_time = math.max(keys.duration_min, keys.duration_max - keys.step * (target.item2021_count or 0)) * 1.0 + target.item2021_count = (target.item2021_count or 0) + 1 + keys.ability:ApplyDataDrivenModifier(target, target, "modifier_item_2021_buff", {duration = duration_time}) + + if keys.ability:IsItem() then + local charge = keys.ability:GetCurrentCharges() + if charge > 1 then + keys.ability:SetCurrentCharges(charge-1) + else + keys.caster:RemoveItem(keys.ability) + end + end + else + keys.ability:EndCooldown() + end +end + +function OnCreatedItem2021Buff(keys) + local target = keys.target + local bonus = keys.bonus + target:THTD_AddManaRegenPercentage(bonus, "thtd_item_2021_bonus") + target:THTD_AddAttackSpeed(bonus, "thtd_item_2021_bonus") + target:THTD_AddCritChance(bonus, "thtd_item_2021_bonus") + target:THTD_AddCritDamage(bonus, "thtd_item_2021_bonus") + target:THTD_AddPowerPercentage(bonus, "thtd_item_2021_bonus") + target:THTD_AddAttackPercentage(bonus, "thtd_item_2021_bonus") + target:SetModelScale(target:GetModelScale() * 1.25) +end + +function OnRemoveItem2021Buff(keys) + local target = keys.target + target:THTD_AddManaRegenPercentage("thtd_item_2021_bonus") + target:THTD_AddAttackSpeed("thtd_item_2021_bonus") + target:THTD_AddCritChance("thtd_item_2021_bonus") + target:THTD_AddCritDamage("thtd_item_2021_bonus") + target:THTD_AddPowerPercentage("thtd_item_2021_bonus") + target:THTD_AddAttackPercentage("thtd_item_2021_bonus") + target:SetModelScale(target:GetModelScale() / 1.25) +end + +function OnItem2022_SpellStart(keys) + if SpawnSystem.IsUnLimited then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster:IsRealHero() then + if target:THTD_IsTower() and target:THTD_GetLevel()= 4 then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="reach_to_limit"}) + return + end + + if target:THTD_IsTower() then + local maxLevel = target:GetMaxPowerLevel() + local modifier = target:FindModifierByName("modifier_fairy_count") + if modifier == nil then + target:AddNewModifier(target, nil, "modifier_fairy_count", nil):SetStackCount(math.min(maxLevel,keys.point)) + target.thtd_power_from_item = (target.thtd_power_from_item or 0) + math.min(maxLevel,keys.point) + else + local count = modifier:GetStackCount() + if count >= maxLevel then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="reach_to_limit"}) + return + end + target.thtd_power_from_item = (target.thtd_power_from_item or 0) + math.min(maxLevel - count, keys.point) + count = math.min(maxLevel, count + keys.point) + modifier:SetStackCount(count) + if target.thtd_power_level ~= nil then + target.thtd_power_level = count + target:AddPowerBonus() + end + end + target:EmitSound("Quest.Completed") + caster.item_power_used = (caster.item_power_used or 0) + 1 + if GameRules.GameData.luck_card ~= "all" then + Service:SavePowerMaxCount(keys.ability.owner_player_id, false) + end + keys.ability:RemoveSelf() + end +end + +function OnItem3150_SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if not caster:THTD_IsTower() then return end + + local radius = 900 + local duration = 10 + + if keys.ability.spell_effect ~= nil then + ParticleManager:DestroyParticle(keys.ability.spell_effect, true) + end + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_riki/riki_tricks.vpcf", PATTACH_ABSORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(radius,radius,radius)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(duration,0,0)) + keys.ability.spell_effect = effectIndex + + local damage = caster:THTD_GetStarDamage() * keys.power_damage + local attackDamage = caster:THTD_GetAttack() + local targets = THTD_FindUnitsInRadius(caster, caster:GetAbsOrigin(), radius) + local count = 0 + for k,v in pairs(targets) do + count = count + 1 + if count <= 3 then + -- 多了造成卡顿,改为取消普通攻击动画实现 + --倒数第二个参数:bFakeAttack如果为true,则不会造成伤害 + --第三个参数如果为false,则会触发OnAttack事件,但是不会触发其余的几个事件(start、land、finish),这样有些攻击命中才生效的逻辑就不会触发了 + --PerformAttack(handle hTarget, bool bUseCastAttackOrb, bool bProcessProcs, bool bSkipCooldown, bool bIgnoreInvis, bool bUseProjectile, bool bFakeAttack, bool bNeverMiss) + caster:PerformAttack(v,true,true,true,false,false,false,true) + end + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + if count > 3 then + DamageTable.damage = DamageTable.damage + attackDamage + end + UnitDamageTarget(DamageTable) + end +end + +function OnItem3151_SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + if keys.ability:IsCooldownReady() then + keys.ability:StartCooldown(keys.ability:GetCooldown(0)) + else + return + end + + target:EmitSound("Hero_Spirit_Breaker.Charge.Impact") + local effectIndex = ParticleManager:CreateParticle("particles/dzz/qingshanjiansheng_yjzcs.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local damage = caster:THTD_GetStarDamage() * keys.power_damage + local targets = THTD_FindUnitsInRadius(caster, target:GetAbsOrigin(), keys.range) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = DAMAGE_TYPE_MAGICAL, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end +end + +local item3152_effect_caster = { + "particles/econ/items/queen_of_pain/qop_ti8_immortal/queen_ti8_golden_shadow_strike_debuff_crowrotating.vpcf", + "particles/econ/items/queen_of_pain/qop_ti8_immortal/queen_ti8_golden_shadow_strike_debuff_crowrotating_b.vpcf", + "particles/econ/items/queen_of_pain/qop_ti8_immortal/queen_ti8_golden_shadow_strike_debuff_crow.vpcf", +} +local item3152_effect_target = { + "particles/econ/items/queen_of_pain/qop_ti8_immortal/queen_ti8_golden_shadow_strike_debuff.vpcf", + "particles/econ/items/queen_of_pain/qop_ti8_immortal/queen_ti8_golden_shadow_strike_debuff_creep.vpcf", +} + +function OnItem3152_SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if keys.ability:IsCooldownReady() then + keys.ability:StartCooldown(keys.ability:GetCooldown(0)) + else + return + end + + if caster.item3152_effect ~= nil then + ParticleManager:DestroyParticleSystem(caster.item3152_effect, true) + end + local effectIndex = ParticleManager:CreateParticle(item3152_effect_caster[RandomInt(1, #item3152_effect_caster)], PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "attach_hitloc", Vector(0,0,0), true) + caster.item3152_effect = effectIndex + + local effectIndex = ParticleManager:CreateParticle(item3152_effect_target[RandomInt(1, #item3152_effect_target)], PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, target, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + if not caster:THTD_IsTower() then return end + + local damage = caster:THTD_GetStarDamage() * keys.power_damage + local targets = THTD_FindUnitsInRadius(caster, target:GetAbsOrigin(), keys.range) + for k,v in pairs(targets) do + if not v:HasModifier("modifier_item_3152_debuff") then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_item_3152_debuff", nil) + end + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = DAMAGE_TYPE_PURE, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end +end + +function OnCreatedItem3150(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster:IsRealHero() then + return + end + + caster:THTD_AddBasePower(keys.power_bonus or 0, "item_3150_bonus") + caster:THTD_AddBaseAttack(keys.power_bonus or 0, "item_3150_bonus") +end + +function OnDestroyItem3150(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster:IsRealHero() then + return + end + + caster:THTD_AddBasePower("item_3150_bonus") + caster:THTD_AddBaseAttack("item_3150_bonus") + + local ability = keys.ability + if ability.spell_effect then + ParticleManager:DestroyParticle(ability.spell_effect, true) + ability.spell_effect = nil + end +end + +function OnCreatedItem3151(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster:IsRealHero() then + return + end + + caster:THTD_AddBasePower(keys.power_bonus or 0, "item_3151_bonus") + caster:THTD_AddBaseAttack(keys.power_bonus or 0, "item_3151_bonus") +end + +function OnDestroyItem3151(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster:IsRealHero() then + return + end + + caster:THTD_AddBasePower("item_3151_bonus") + caster:THTD_AddBaseAttack("item_3151_bonus") +end + +function OnCreatedItem3152(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster:IsRealHero() then + return + end + + caster:THTD_AddBasePower(keys.power_bonus or 0, "item_3152_bonus") + caster:THTD_AddBaseAttack(keys.power_bonus or 0, "item_3152_bonus") +end + +function OnDestroyItem3152(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster:IsRealHero() then + return + end + + caster:THTD_AddBasePower("item_3152_bonus") + caster:THTD_AddBaseAttack("item_3152_bonus") +end + +function OnCreatedItem3153(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster:IsRealHero() then + return + end + + caster:THTD_AddBasePower(keys.power_bonus or 0, "item_3153_bonus") + caster:THTD_AddBaseAttack(keys.power_bonus or 0, "item_3153_bonus") + + local effectIndex = ParticleManager:CreateParticle("particles/econ/items/monkey_king/mk_ti9_immortal/mk_ti9_immortal_army_ring.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(700,50,1)) + caster.item3153_effect = effectIndex + + local count = 0 + caster:SetContextThink(DoUniqueString("thtd_item3153_cast"), + function() + count = count + 1 + if count > 50 then + if caster.item3153_effect ~= nil then + ParticleManager:DestroyParticle(caster.item3153_effect, true) + caster.item3153_effect = nil + return nil + end + else + if caster.item3153_effect ~= nil then + ParticleManager:SetParticleControl(effectIndex, 1, Vector(700 - count * 15,50,1)) + end + return 0.1 + end + end, + 0) +end + +function OnDestroyItem3153(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster:IsRealHero() then + return + end + + caster:THTD_AddBasePower("item_3153_bonus") + caster:THTD_AddBaseAttack("item_3153_bonus") + + if caster.item3153_effect ~= nil then + ParticleManager:DestroyParticle(caster.item3153_effect, true) + end + + caster:RemoveModifierByNameAndCaster("modifier_junko_01", caster) +end + +function OnItem3153_SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + if caster:IsRealHero() then return end + if keys.ability:IsCooldownReady() then + keys.ability:StartCooldown(keys.ability:GetCooldown(0)) + else + return + end + + local damageType = DAMAGE_TYPE_PURE + local pureDg = caster:GetDamageOutgoingPure() + local magicDg = caster:GetDamageOutgoingMagical() + local phyDg = caster:GetDamageOutgoingPhysical() + if pureDg >= magicDg and pureDg >= phyDg then + damageType = DAMAGE_TYPE_PURE + elseif magicDg >= pureDg and magicDg >= phyDg then + damageType = DAMAGE_TYPE_MAGICAL + elseif phyDg >= magicDg and phyDg >= pureDg then + damageType = DAMAGE_TYPE_PHYSICAL + end + + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_omniknight/omniknight_purification.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetAbsOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(100,30,900)) + ParticleManager:DestroyParticleSystemTime(effectIndex, 2.5) + + local damage = caster:THTD_GetStarDamage() * keys.power_damage + local targets = THTD_FindUnitsInRadius(caster, target:GetAbsOrigin(), 700) + for k,v in pairs(targets) do + if not v:HasModifier("modifier_item_3153_debuff") then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_item_3153_debuff", nil) + end + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = damageType, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end +end + +function OnCreatedItem3153Debuff(keys) + keys.target:AddDamageIncomingAll(keys.damage_debuff, "thtd_item_3153_damage_up") +end + +function OnDestroyItem3153Debuff(keys) + keys.target:AddDamageIncomingAll("thtd_item_3153_damage_up") +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityjunko.lua b/scripts/vscripts/abilities/abilityjunko.lua new file mode 100755 index 0000000..2257b82 --- /dev/null +++ b/scripts/vscripts/abilities/abilityjunko.lua @@ -0,0 +1,308 @@ +function OnJunko01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + -- if caster == target then return end + if not target:THTD_IsTower() then return end + if target:HasModifier("modifier_junko_01") then return end + if target:GetPlayerOwnerID() ~= caster:GetPlayerOwnerID() then return end + + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_junko_01", nil) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_junko/ability_junko_01_buff.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, target, 5, "follow_origin", Vector(0,0,0), true) + + local hasCombo = caster:HasModifier("modifier_thtd_junko_01_combo_buff") + if hasCombo then + if THTD_IsValid(caster.ability_junko_01_target1) == false then + caster.ability_junko_01_target1 = target + elseif THTD_IsValid(caster.ability_junko_01_target2) == false then + caster.ability_junko_01_target2 = target + else + caster.ability_junko_01_target1 = caster.ability_junko_01_target2 + caster.ability_junko_01_target2 = target + end + else + caster.ability_junko_01_target1 = target + end + + target:SetContextThink(DoUniqueString("modifier_junko_01"), + function() + if GameRules:IsGamePaused() then return 0.03 end + + if target == nil or target:IsNull() or target:IsAlive() == false then + ParticleManager:DestroyParticleSystem(effectIndex,true) + if caster ~= nil and caster:IsNull() == false then + if caster.ability_junko_01_target1 == target then + caster.ability_junko_01_target1 = nil + elseif caster.ability_junko_01_target2 == target then + caster.ability_junko_01_target2 = nil + end + if caster.ability_junko_01_target1 == nil and caster.ability_junko_01_target2 == nil then + ParticleManager:DestroyParticleSystem(caster.ability_junko_01_effectIndex,true) + caster.ability_junko_01_effectIndex = nil + end + end + return nil + end + + local isCancel = false + + if THTD_IsValid(caster) == false then + isCancel = true + if caster ~= nil and caster:IsNull() == false then + caster.ability_junko_01_target1 = nil + caster.ability_junko_01_target2 = nil + end + else + if caster:HasModifier("modifier_thtd_junko_01_combo_buff") == false then + if caster.ability_junko_01_target2 ~= nil then + caster.ability_junko_01_target1 = caster.ability_junko_01_target2 + caster.ability_junko_01_target2 = nil + end + end + isCancel = (caster.ability_junko_01_target1 ~= target and caster.ability_junko_01_target2 ~= target) + end + + if isCancel then + if target:HasModifier("modifier_junko_01") then + target:RemoveModifierByName("modifier_junko_01") + end + ParticleManager:DestroyParticleSystem(effectIndex,true) + if caster ~= nil and caster:IsNull() == false then + if caster.ability_junko_01_target1 == target then + caster.ability_junko_01_target1 = nil + elseif caster.ability_junko_01_target2 == target then + caster.ability_junko_01_target2 = nil + end + end + if caster.ability_junko_01_target1 == nil and caster.ability_junko_01_target2 == nil then + ParticleManager:DestroyParticleSystem(caster.ability_junko_01_effectIndex,true) + caster.ability_junko_01_effectIndex = nil + end + return nil + end + + return 0.2 + end, + 0.2) +end + +function OnCreatedJunko01Buff(keys) + local target = keys.target + + local bonus = 0 + if target:GetUnitName() == "hecatia" then + bonus = keys.hecatia_up + else + bonus = keys.damage_up + end + target:AddDamageOutgoingPure(bonus, "thtd_junko_01_damage_up") +end + +function OnUpgradeJunko01Buff(keys) + local caster = keys.caster + local targets = {} + if caster.ability_junko_01_target1 ~= nil then + table.insert(targets, caster.ability_junko_01_target1) + end + if caster.ability_junko_01_target2 ~= nil then + table.insert(targets, caster.ability_junko_01_target2) + end + + for _,target in pairs(targets) do + local bonus = 0 + if target:GetUnitName() == "hecatia" then + bonus = keys.hecatia_up + else + bonus = keys.damage_up + end + target:AddDamageOutgoingPure(bonus, "thtd_junko_01_damage_up") + end + + targets = {} +end + +function OnDestroyJunko01Buff(keys) + keys.target:AddDamageOutgoingPure("thtd_junko_01_damage_up") +end + +function OnJunko02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local casterForward = caster:GetForwardVector() + local casterPoint = caster:GetOrigin() + + local point = THTDSystem:FindRadiusOnePointPerfectAOE(caster, caster:Script_GetAttackRange(), 390 * 2) + if point ~= nil then + casterForward = (Vector(point.x, point.y,casterPoint.z) - casterPoint):Normalized() + end + + local duration_time = math.floor(keys.duration_time * 100 + 0.5) / 100 + local tick = math.floor(keys.tick * 100 + 0.5) / 100 + + local time = duration_time + + caster:SetContextThink("modifier_junko_02_think", + function() + if GameRules:IsGamePaused() then return 0.03 end + if not THTD_IsValid(caster) then return nil end + if time <= 0 then return nil end + + local forwardCos = casterForward.x + local forwardSin = casterForward.y + local angle = (39 - 6.5 * RandomInt(0,12)) / 180 * math.pi + local forward = Vector( math.cos(angle)*forwardCos - math.sin(angle)*forwardSin, + forwardSin*math.cos(angle) + forwardCos*math.sin(angle),0) + local info = + { + Ability = keys.ability, + EffectName = "particles/heroes/thtd_junko/ability_junko_02.vpcf", + vSpawnOrigin = casterPoint + forward * 500 - casterForward * 500 + Vector(0,0,128), + fDistance = 1200, + fStartRadius = 150, + fEndRadius = 150, + Source = caster, + bHasFrontalCone = false, + bReplaceExisting = false, + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + iUnitTargetType = DOTA_UNIT_TARGET_HERO, -- 解决撞击后消失 + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = false, + vVelocity = casterForward * 1800, + bProvidesVision = true, + iVisionRadius = 1000, + iVisionTeamNumber = caster:GetTeamNumber() + } + local projectile = ProjectileManager:CreateLinearProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + casterPoint, + casterPoint + casterForward * 1500, + nil, + 390, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + time = time - tick + return tick + end, + tick) +end + +function OnJunko03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local friends = THTD_FindFriendlyUnitsAll(caster) + + local duration_time = math.floor(keys.duration_time * 100 + 0.5) / 100 + local damage_up = keys.damage_up + local power_suck = keys.power_suck + + local modifier = caster:FindModifierByName("modifier_junko_03_buff") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_junko_03_buff", nil) + else + modifier:SetDuration(duration_time, false) + end + + local total = 0 + for k,v in pairs(friends) do + if v ~= caster then + local power = v:THTD_GetBasePower() + local bonus_power = math.min(power, power_suck) + if bonus_power > 0 then + total = total + bonus_power + v:THTD_AddBasePower(-bonus_power) + v:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + v:THTD_AddBasePower(bonus_power) + return nil + end, + duration_time) + end + end + end + if total > 0 then + caster:THTD_AddBasePower(total) + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + caster:THTD_AddBasePower(-total) + return nil + end, + duration_time) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_junko/ability_junko_03.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnCreatedJunko03Buff(keys) + keys.target:AddDamageOutgoingAll(keys.damage_up, "thtd_junko_03_damage_up") +end + +function OnDestroyJunko03Buff(keys) + keys.target:AddDamageOutgoingAll("thtd_junko_03_damage_up") +end + +function OnJunko04SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 1) + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + -- UnitDamageTarget(DamageTable) + if THTD_IsValid(v) and v:HasModifier("modifier_junko_04_debuff") == false then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_junko_04_debuff", nil) + end + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_junko/ability_junko_04.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint+Vector(0,0,64)) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(1,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(255,255,255)) + ParticleManager:SetParticleControl(effectIndex, 3, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnThinkJunko04Debuff(keys) + local caster = keys.caster + local target = keys.target + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 2) + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end diff --git a/scripts/vscripts/abilities/abilitykagerou.lua b/scripts/vscripts/abilities/abilitykagerou.lua new file mode 100755 index 0000000..0cc972e --- /dev/null +++ b/scripts/vscripts/abilities/abilitykagerou.lua @@ -0,0 +1,99 @@ +function OnSpellStartKagerou01(keys) + local caster = keys.caster + local targetPoint = keys.target_points[1] + + local vecForward = (targetPoint - caster:GetOrigin()):Normalized() + local angles = VectorToAngles(vecForward) -- 该方向的角度,水平向右逆时针旋转,360度 + print(angles.y) + local angles2 = VectorToAngles(caster:GetForwardVector()) -- 朝向的角度 + print(angles2.y) +end + +function OnSpellStartKagerou02(keys) + local caster = keys.caster + local duraiton_time = keys.duration_time + caster:RemoveModifierByName("modifier_kagerou_02_buff") + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_kagerou_02_buff", {Duration = duraiton_time}) +end + +function OnCreatedKagerou02Buff(keys) + local target = keys.target + + local powerBonus = 0 + local pv = target:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then + powerBonus = pv[1] + end + + if target:IsPower666() then + powerBonus = powerBonus + 30 + end + + local power = target:THTD_GetBasePower() + local bonus = (keys.bonus_attack + powerBonus) * power + target:THTD_AddBaseAttack(bonus, "thtd_kagerou_02_bonus") + target:THTD_AddBasePower(-power, "thtd_kagerou_02_bonus") + target:THTD_AddAttackSpeed(keys.attack_speed, "thtd_kagerou_02_bonus") +end + +function OnDestroyKagerou02Buff(keys) + local target = keys.target + target:THTD_AddBaseAttack("thtd_kagerou_02_bonus") + target:THTD_AddBasePower("thtd_kagerou_02_bonus") + target:THTD_AddAttackSpeed("thtd_kagerou_02_bonus") +end + +function OnSpellStartKagerou03(keys) + local caster = keys.caster + + local powerDuration = 0 + local powerAttackup = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then + powerAttackup = pv[1] + powerDuration = pv[2] + end + + local attack_up = keys.attack_up + powerAttackup + local duraiton_time = keys.duration_time + powerDuration + + local shiftTime = 0.5 + UnitStunTarget(caster,caster,shiftTime) + caster:SetContextThink(DoUniqueString("thtd_yuuka_02_plant"), + function() + if GameRules:IsGamePaused() then return 0.03 end + caster.kagerou_03_attack_percentage = attack_up + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_kagerou_03_wolf", {Duration = duraiton_time}) + return nil + end, + shiftTime) +end + +function OnCreatedKagerou03wolf(keys) + local target = keys.target + local model = "models/heroes/lycan/lycan_wolf.vmdl" + if target.origin_mode == nil then + target.origin_mode = target:GetModelName() + end + target:SetOriginalModel(model) + target:SetModel(model) + + target:THTD_AddAttackPercentage(target.kagerou_03_attack_percentage, "thtd_kagerou_03_bonus") + target:THTD_AddCritChance(keys.crit_chance, "thtd_kagerou_03_bonus") + + local bonus = keys.crit_damage + if target:IsPower999() then + bonus = bonus + 500 + end + target:THTD_AddCritDamage(bonus, "thtd_kagerou_03_bonus") +end + +function OnDestroyKagerou03wolf(keys) + local target = keys.target + target:SetOriginalModel(target.origin_mode ) + target:SetModel(target.origin_mode ) + + target:THTD_AddAttackPercentage("thtd_kagerou_03_bonus") + target:THTD_AddCritChance("thtd_kagerou_03_bonus") + target:THTD_AddCritDamage("thtd_kagerou_03_bonus") +end diff --git a/scripts/vscripts/abilities/abilitykaguya.lua b/scripts/vscripts/abilities/abilitykaguya.lua new file mode 100755 index 0000000..4e26958 --- /dev/null +++ b/scripts/vscripts/abilities/abilitykaguya.lua @@ -0,0 +1,314 @@ +function OnKaguya01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + local count = keys.max_count + caster:SetContextThink(DoUniqueString("thtd_kaguya01_spell_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if count <= 0 then + return nil + end + OnKaguya01SpellThink(keys,count) + count = count - 1 + return 0.7 + end, + 0) +end + +function OnKaguya01SpellThink(keys,count) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + for i=1,count*5 do + local forwardVector = caster:GetForwardVector() + local rollRad = i*math.pi*2/(count*5) + local forwardCos = forwardVector.x + local forwardSin = forwardVector.y + local damageVector = Vector(math.cos(rollRad)*forwardCos - math.sin(rollRad)*forwardSin, + forwardSin*math.cos(rollRad) + forwardCos*math.sin(rollRad), + 0) * count*100 + targetPoint + + local effectIndex + if((i*count*5)%3==0)then + effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/kaguya/ability_kaguya01_light.vpcf", PATTACH_CUSTOMORIGIN, nil) + elseif((i*count*5)%3==1)then + effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/kaguya/ability_kaguya01_light_green.vpcf", PATTACH_CUSTOMORIGIN, nil) + elseif((i*count*5)%3==2)then + effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/kaguya/ability_kaguya01_light_red.vpcf", PATTACH_CUSTOMORIGIN, nil) + end + + ParticleManager:SetParticleControl(effectIndex, 0, damageVector) + ParticleManager:SetParticleControl(effectIndex, 1, damageVector) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local targets = THTD_FindUnitsInRadius(caster,damageVector,keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end +end + +function OnKaguya02SpellThink(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if keys.ability:GetLevel() < 1 then return end + + if caster.thtd_kaguya_02_count == nil then + caster.thtd_kaguya_02_count = 0 + end + + if caster.thtd_kaguya_02_count == 0 then + local effectName = "particles/econ/items/windrunner/wr_ti8_immortal_shoulder/wr_ti8_shackleshot_pair_rope_target_glow.vpcf" + local effectIndex = ParticleManager:CreateParticle(effectName, PATTACH_ABSORIGIN_FOLLOW, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin() + Vector(0, 0, 100)) + ParticleManager:ReleaseParticleIndex(effectIndex) + end + + caster.thtd_kaguya_02_count = caster.thtd_kaguya_02_count + 1 + if caster.thtd_kaguya_02_count >= 20 then + caster.thtd_kaguya_02_count = 0 + end + + local targets = THTD_FindFriendlyUnitsInRadius(caster,caster:GetAbsOrigin(),1000) + for k,v in pairs(targets) do + local modifier = v:FindModifierByName("modifier_kaguya_02_buff") + -- 持续时间比think大一点 + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_kaguya_02_buff", {Duration = 0.3}) + else + modifier:SetDuration(0.3, false) + end + end +end + +function OnCreatedKaguya02_buff(keys) + local target = keys.target + local factor = 0.5 + if target:GetUnitName() == "kaguya" then + factor = 1 + end + target:THTD_AddCritChance(keys.bonus_chance * factor, "thtd_kaguya_02_bonus") + target:THTD_AddCritDamage(keys.bonus_crit * factor, "thtd_kaguya_02_bonus") +end + +function OnRemoveKaguya02_buff(keys) + local target = keys.target + target:THTD_AddCritChance("thtd_kaguya_02_bonus") + target:THTD_AddCritDamage("thtd_kaguya_02_bonus") +end + +function OnKaguya03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.thtd_kaguya_03_roll == false then + caster.thtd_kaguya_03_roll = true + else + caster.thtd_kaguya_03_roll = false + end +end + +function OnUpgradeKaguya03(keys) + local caster = keys.caster + local friends = THTD_FindFriendlyUnitsAll(caster) + local enemies = THTD_FindUnitsAll(caster) + for i=1,4 do + local buff = "modifier_kaguya_03_"..i.."_buff" + local debuff = "modifier_kaguya_03_"..i.."_debuff" + for k,v in pairs(friends) do + if v:FindModifierByNameAndCaster(buff,caster)~=nil then + v:RemoveModifierByName(buff) + end + end + for k,v in pairs(enemies) do + if v:FindModifierByNameAndCaster(debuff,caster)~=nil then + v:RemoveModifierByName(debuff) + end + end + end +end + +function OnKaguya03SpellThink(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if keys.ability:GetLevel() < 1 then return end + if GameRules:IsGamePaused() then return end + if caster:THTD_IsHidden() then + OnKaguya03ReleaseBall(caster) + return + end + + if caster.thtd_kaguya_03_treasure_table == nil then + caster.thtd_kaguya_03_treasure_table = {} + end + + if caster.thtd_kaguya_03_think_count == nil then + caster.thtd_kaguya_03_think_count = 0 + end + + if caster.thtd_kaguya_03_roll ~= false then + if caster.thtd_kaguya_03_think_count < 360 then + caster.thtd_kaguya_03_think_count = caster.thtd_kaguya_03_think_count + 1 + else + caster.thtd_kaguya_03_think_count = 0 + end + end + + if caster.thtd_effect_count == nil then + caster.thtd_effect_count = 1 + end + + -- 旋转宝具 + for i=1,4 do + if caster.thtd_kaguya_03_treasure_table[i] == nil then + caster.thtd_kaguya_03_treasure_table[i] = {} + end + if caster.thtd_kaguya_03_treasure_table[i]["effectIndex"] == nil then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_kaguya/thtd_kaguya_03_"..i..".vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(1/12,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(500/12,0,0)) + caster.thtd_kaguya_03_treasure_table[i]["effectIndex"] = effectIndex + end + + if caster.thtd_kaguya_03_roll ~= false then + caster.thtd_kaguya_03_treasure_table[i]["origin"] = caster:GetOrigin() + + Vector( + math.cos(i*2*math.pi/4 + caster.thtd_kaguya_03_think_count * math.pi/180)*400, + math.sin(i*2*math.pi/4 + caster.thtd_kaguya_03_think_count * math.pi/180)*400, + 150) + end + end + + local friends = {} + local enemies = {} + if caster.thtd_effect_count >= 10 then + friends = THTD_FindFriendlyUnitsAll(caster) + enemies = THTD_FindUnitsAll(caster) + end + for i=1,4 do + if caster.thtd_kaguya_03_treasure_table[i]["effectIndex"] ~= nil then + ParticleManager:SetParticleControl(caster.thtd_kaguya_03_treasure_table[i]["effectIndex"], 0, caster.thtd_kaguya_03_treasure_table[i]["origin"] ) + end + + if caster.thtd_effect_count >= 10 then + local buff = "modifier_kaguya_03_"..i.."_buff" + local debuff = "modifier_kaguya_03_"..i.."_debuff" + for k,v in pairs(friends) do + if GetDistanceBetweenTwoVec2D(caster.thtd_kaguya_03_treasure_table[i]["origin"], v:GetOrigin()) > keys.range then + if v:FindModifierByNameAndCaster(buff,caster)~=nil then + v:RemoveModifierByName(buff) + end + else + if v:HasModifier(buff) == false then + keys.ability:ApplyDataDrivenModifier(caster, v, buff, {}) + end + end + end + for k,v in pairs(enemies) do + if GetDistanceBetweenTwoVec2D(caster.thtd_kaguya_03_treasure_table[i]["origin"], v:GetOrigin()) > keys.range then + if v:FindModifierByNameAndCaster(debuff,caster)~=nil then + v:RemoveModifierByName(debuff) + end + else + if i ~= 2 and v:HasModifier(debuff) == false then + keys.ability:ApplyDataDrivenModifier(caster, v, debuff, {}) + end + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 + if i == 2 then + damage = damage * (1 + keys.damage_up/100) + end + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + if i == 4 then caster.thtd_effect_count = 1 end + else + if i == 4 then caster.thtd_effect_count = caster.thtd_effect_count + 1 end + end + end +end + + +function OnKaguya03ReleaseBall(caster) + if caster.thtd_kaguya_03_treasure_table ~= nil and caster.thtd_kaguya_03_treasure_table[1] ~= nil and caster.thtd_kaguya_03_treasure_table[1]["effectIndex"] ~= nil then + local friends = THTD_FindFriendlyUnitsAll(caster) + local enemies = THTD_FindUnitsAll(caster) + + for i=1,4 do + local buff = "modifier_kaguya_03_"..i.."_buff" + local debuff = "modifier_kaguya_03_"..i.."_debuff" + for k,v in pairs(friends) do + if v:FindModifierByNameAndCaster(buff,caster)~=nil then + v:RemoveModifierByName(buff) + end + end + for k,v in pairs(enemies) do + if v:FindModifierByNameAndCaster(debuff,caster)~=nil then + v:RemoveModifierByName(debuff) + end + end + + if caster.thtd_kaguya_03_treasure_table[i]["effectIndex"] ~= nil then + ParticleManager:DestroyParticleSystem(caster.thtd_kaguya_03_treasure_table[i]["effectIndex"],true) + caster.thtd_kaguya_03_treasure_table[i]["effectIndex"] = nil + end + end + end +end + +function OnCreatedKaguya03_2_buff(keys) + keys.target:THTD_AddAttackPercentage(keys.attack_percent, "thtd_kaguya_03_2_buff_bonus") +end + +function OnDestroyKaguya03_2_buff(keys) + keys.target:THTD_AddAttackPercentage("thtd_kaguya_03_2_buff_bonus") +end + +function OnCreatedKaguya03_3_debuff(keys) + keys.target:AddDamageIncomingAll(keys.incoming_percent, "thtd_kaguya_03_3_debuff_damage_up") +end + +function OnRemoveKaguya03_3_debuff(keys) + keys.target:AddDamageIncomingAll("thtd_kaguya_03_3_debuff_damage_up") +end + +function OnCreatedKaguya03_3_buff(keys) + keys.target:AddDamageOutgoingAll(keys.outgoing_percent, "thtd_kaguya_03_3_damage_up") +end + +function OnDestroyKaguya03_3_buff(keys) + keys.target:AddDamageOutgoingAll("thtd_kaguya_03_3_damage_up") +end + +function OnCreatedKaguya03_4_debuff(keys) + local target = keys.target + + target:AddPhysicalArmor(-keys.armor) +end + +function OnDestroyKaguya03_4_debuff(keys) + local target = keys.target + + target:AddPhysicalArmor(keys.armor) +end + +function OnCreatedKaguya03_4_buff(keys) + keys.target:AddDamageOutgoingPhysical(keys.penetration, "thtd_kaguya_03_4_damage_up") +end + +function OnDestroyKaguya03_4_buff(keys) + keys.target:AddDamageOutgoingPhysical("thtd_kaguya_03_4_damage_up") +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitykanako.lua b/scripts/vscripts/abilities/abilitykanako.lua new file mode 100755 index 0000000..444cdd0 --- /dev/null +++ b/scripts/vscripts/abilities/abilitykanako.lua @@ -0,0 +1,368 @@ +local doorVec = +{ + [0] = Vector(-2440,1880,0), + [1] = Vector(2440,1880,0), + [2] = Vector(2440,-1880,0), + [3] = Vector(-2440,-1880,0), +} + +local outX = +{ + [0] = -4300, + [1] = 4300, + [2] = 4300, + [3] = -4300 +} + + +function OnKanako01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target:GetOrigin() + local targetForward = keys.target:GetForwardVector() + + local duration_time = math.floor(keys.duration_time * 100 + 0.5)/100 + local tick = math.floor(keys.tick * 100 + 0.5)/100 + + local id = caster:GetPlayerOwnerID() + if math.abs(targetPoint.x) <= math.abs(doorVec[id].x) then + if GetDistanceBetweenTwoVec2D(targetPoint, FirstPointList[id]) < 1200 then + targetForward = (targetPoint - FirstPointList[id]):Normalized() + end + else + if GetDistanceBetweenTwoVec2D(targetPoint, FirstPointList[id]) < 2000 then + targetForward = (Vector(outX[id], targetPoint.y, 0) - targetPoint):Normalized() + end + end + + local info = + { + Ability = keys.ability, + EffectName = "particles/heroes/kanako/ability_kanako_01.vpcf", + vSpawnOrigin = targetPoint + Vector(0,0,128), + fDistance = 500, + fStartRadius = 400, + fEndRadius = 400, + Source = caster, + bHasFrontalCone = false, + bReplaceExisting = false, + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + iUnitTargetType = DOTA_UNIT_TARGET_HERO, + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = false, + vVelocity = -targetForward * 200, + bProvidesVision = true, + iVisionRadius = 1000, + iVisionTeamNumber = caster:GetTeamNumber() + } + local projectile = ProjectileManager:CreateLinearProjectile(info) + caster:SetContextThink(DoUniqueString("thtd_kanako_01_projectile"), + function() + if GameRules:IsGamePaused() then return 0.03 end + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + return nil + end, + duration_time - 1.25) + + local origin = targetPoint + targetForward * 150 + local time = duration_time + local count = 0 + local knockBackGroup = {} + + caster:SetContextThink(DoUniqueString("thtd_kanako_01_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + count = count + 1 + local targets = THTD_FindUnitsInRadius(caster,origin,300) + origin = origin - targetForward * 8 + for k,v in pairs(targets) do + local forward = v:GetForwardVector() + v:SetAbsOrigin(v:GetOrigin() - forward * 16) + table.insert(knockBackGroup,v) + if count == 5 then + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + local modifier = v:FindModifierByName("modifier_kanako_01_stun") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_kanako_01_stun", {duration=0.1}) + else + modifier:SetDuration(0.1,false) + end + end + + if count == 5 then + count = 0 + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_kanako/ability_kanako_01_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, origin+Vector(0,0,160) - targetForward * 150) + ParticleManager:SetParticleControlForward(effectIndex, 0, targetForward) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(100,1,1)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + if time <= 0 then + for k,v in pairs(knockBackGroup) do + if IsValidAlive(v) then + FindClearSpaceForUnit(v, v:GetOrigin(), false) + end + end + knockBackGroup = {} + return nil + end + + time = time - 0.04 + return 0.04 + end, + 0.04) +end + +function OnKanako02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster.thtd_kanako_gojou_count == nil then + caster.thtd_kanako_gojou_count = 0 + end + + if caster.thtd_kanako_gojou_count < keys.max_count then + + local gojou = CreateUnitByName( + "kanako_gojou", + targetPoint, + false, + caster:GetOwner(), + caster:GetOwner(), + caster:GetTeam() + ) + if gojou ~= nil then + gojou.thtd_spawn_unit_owner = caster + gojou:SetControllableByPlayer(caster:GetPlayerOwnerID(), true) + FindClearSpaceForUnit(gojou, targetPoint, false) + keys.ability:ApplyDataDrivenModifier(caster, gojou, "modifier_kanako_rooted", {}) + + local ability = gojou:FindAbilityByName("thtd_kanako_03_unit") + if ability then + ability:SetLevel(1) + end + + if caster.thtd_kanako_gojou_group == nil then + caster.thtd_kanako_gojou_group = {} + end + + table.insert(caster.thtd_kanako_gojou_group,gojou) + caster.thtd_kanako_gojou_count = caster.thtd_kanako_gojou_count + 1 + end + end +end + +function OnKanako03Think(keys) + if GameRules:IsGamePaused() then return end + + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.thtd_kanako_gojou_group == nil then + caster.thtd_kanako_gojou_group = {} + end + + if keys.ability:GetLevel() < 1 or caster:THTD_IsHidden() then + for k,v in pairs(caster.thtd_kanako_gojou_group) do + OnKanako03ReleaseUnit(caster,v) + end + return + end + + for k,v in pairs(caster.thtd_kanako_gojou_group) do + v.thtd_kanako_gojou_thinked = nil + end + + for k,v in pairs(caster.thtd_kanako_gojou_group) do + if IsValidAlive(v) and v.thtd_kanako_03_is_contact == true and IsValidAlive(v.thtd_kanako_03_last_link_unit) then + if v.thtd_kanako_gojou_thinked ~= true then + v.thtd_kanako_gojou_thinked = true + v.thtd_kanako_03_last_link_unit.thtd_kanako_gojou_thinked = true + + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + v:GetOrigin(), + v.thtd_kanako_03_last_link_unit:GetOrigin(), + nil, + 80, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + + local vecA = v:GetAbsOrigin() + local vecB = v.thtd_kanako_03_last_link_unit:GetAbsOrigin() + local key = "thtd_kanako_gojou_"..tostring(v:GetEntityIndex()).."_side" + + for index,unit in pairs(targets) do + local side = IsLeftToLineSide(unit:GetAbsOrigin(), vecA, vecB) + if unit[key] == nil then + unit[key] = IsLeftToLineSide(unit:GetAbsOrigin() - 100 * unit:GetForwardVector(), vecA, vecB) + end + if unit[key] ~= side then + -- print("[unit"..tostring(unit:GetEntityIndex()).."]"..key.." : "..tostring(side)) + unit[key] = side + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local DamageTable = { + ability = keys.ability, + victim = unit, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + end + end + end + +end + +function OnKanako03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if target:GetUnitName() == "kanako_gojou" then + OnKanako03ReleaseUnit(caster,target) + end +end + +function OnKanako03ReleaseUnit(caster,target) + if caster.thtd_kanako_gojou_group == nil then + caster.thtd_kanako_gojou_group = {} + end + for k,v in pairs(caster.thtd_kanako_gojou_group) do + if v==nil or v:IsNull() or v:IsAlive()==false or v == target then + if v.thtd_kanako_03_gojou_effect~=nil then + ParticleManager:DestroyParticleSystem(v.thtd_kanako_03_gojou_effect,true) + end + if v.thtd_kanako_03_last_link_unit ~= nil and v.thtd_kanako_03_last_link_unit:IsNull()==false and v.thtd_kanako_03_last_link_unit:IsAlive() then + if v.thtd_kanako_03_last_link_unit.thtd_kanako_03_gojou_effect ~= nil then + ParticleManager:DestroyParticleSystem(v.thtd_kanako_03_last_link_unit.thtd_kanako_03_gojou_effect,true) + v.thtd_kanako_03_last_link_unit.thtd_kanako_03_gojou_effect = nil + end + v.thtd_kanako_03_last_link_unit.thtd_kanako_03_is_contact = false + end + table.remove(caster.thtd_kanako_gojou_group,k) + caster.thtd_kanako_gojou_count = caster.thtd_kanako_gojou_count - 1 + end + end + + target:AddNoDraw() + target:ForceKill(true) +end + +function OnKanako03UnitSpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local hero = caster.thtd_spawn_unit_owner + + if target:GetUnitName() == "kanako_gojou" and caster~=target and target.thtd_kanako_03_is_contact ~= true then + if caster.thtd_kanako_03_last_link_unit ~= nil and caster.thtd_kanako_03_last_link_unit:IsNull()==false and caster.thtd_kanako_03_last_link_unit:IsAlive() then + caster.thtd_kanako_03_last_link_unit.thtd_kanako_03_is_contact = false + ParticleManager:DestroyParticleSystem(caster.thtd_kanako_03_last_link_unit.thtd_kanako_03_gojou_effect,true) + caster.thtd_kanako_03_last_link_unit.thtd_kanako_03_gojou_effect = nil + end + caster.thtd_kanako_03_last_link_unit = target + target.thtd_kanako_03_last_link_unit = caster + target.thtd_kanako_03_is_contact = true + caster.thtd_kanako_03_is_contact = true + if caster.thtd_kanako_03_gojou_effect == nil then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_kanako/ability_kanako_03_line.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 1, target, 5, "attach_hitloc", Vector(0,0,0), true) + caster.thtd_kanako_03_gojou_effect = effectIndex + else + ParticleManager:SetParticleControlEnt(caster.thtd_kanako_03_gojou_effect , 1, target, 5, "attach_hitloc", Vector(0,0,0), true) + end + end +end + +function OnKanako04SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local origin = caster:GetOrigin() + + local time = keys.ability:GetCooldownTimeRemaining() + local tick = keys.tick + time = math.floor(time * 100 + 0.5) / 100 + tick = math.floor(tick * 100 + 0.5) / 100 + + local key = "thtd_kanako_04_"..tostring(caster:GetEntityIndex()).."_circle" + + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_kanako_04_effect", {duration = time}) + + caster:THTD_AddCritChance(keys.crit_chance, "thtd_kanako_04_crit_chance") + + caster:SetContextThink(DoUniqueString("thtd_kanako_04_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if caster:THTD_IsHidden() or time <= 0 then + caster:RemoveModifierByName("modifier_kanako_04_effect") + caster:AddDamageOutgoingAll("thtd_kanako_04_bonus") + caster:THTD_AddCritChance("thtd_kanako_04_crit_chance") + return nil + end + + if caster:HasModifier("modifier_sanae_04_buff") then + caster:AddDamageOutgoingAll(math.floor(caster:THTD_GetFaith() * keys.damage_up), "thtd_kanako_04_bonus") + else + caster:AddDamageOutgoingAll("thtd_kanako_04_bonus") + end + + local targets = THTD_FindUnitsInRadius(caster,origin,keys.range + 80) + for k,v in pairs(targets) do + local isInCircle = (GetDistanceBetweenTwoVec2D(v:GetAbsOrigin(), origin) <= keys.range) + if v[key] == nil then + v[key] = (GetDistanceBetweenTwoVec2D(v:GetAbsOrigin() - 80 * v:GetForwardVector(), origin) <= keys.range) + end + if v[key] ~= isInCircle then + -- print("[unit"..tostring(v:GetEntityIndex()).."]"..key.." : "..tostring(isInCircle)) + v[key] = isInCircle + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 1) + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 2) + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + time = time - tick + return tick + end, + tick) +end + + +function OnKanakoKill(keys) + -- local caster = EntIndexToHScript(keys.caster_entindex) + -- caster:THTD_AddFaith() +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitykeine.lua b/scripts/vscripts/abilities/abilitykeine.lua new file mode 100755 index 0000000..190a030 --- /dev/null +++ b/scripts/vscripts/abilities/abilitykeine.lua @@ -0,0 +1,286 @@ + +THTD_KEINE_02_HUMEN = 1 +THTD_KEINE_02_SHIRASAWA = 2 + +function OnKeine01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster.thtd_keine_change == nil then + caster.thtd_keine_change = THTD_KEINE_02_HUMEN + end + + if caster.thtd_keine_change == THTD_KEINE_02_HUMEN then + if target:THTD_IsTower() then + caster.thtd_last_cast_unit = target + + if target:HasModifier("modifier_keine_01_buff") then + target:FindModifierByName("modifier_keine_01_buff"):SetDuration(keys.bonus_time, false) + else + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_keine/ability_keine_01_buff.vpcf", PATTACH_CUSTOMORIGIN, target) + ParticleManager:SetParticleControlEnt(effectIndex , 0, target, 5, "follow_origin", Vector(0,0,0), true) + keys.ability:ApplyDataDrivenModifier(caster,target, "modifier_keine_01_buff", {duration = keys.bonus_time}) + end + end + end +end + +function OnCreatedKeine01Buff(keys) + keys.target:THTD_AddBaseAttack(keys.attack_bonus, "thtd_keine_01_bonus") +end + +function OnDestroyKeine01Buff(keys) + keys.target:THTD_AddBaseAttack("thtd_keine_01_bonus") +end + +function OnKeine01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local targetPoint = target:GetOrigin() + + if caster.thtd_keine_change == THTD_KEINE_02_SHIRASAWA then + if RollPercentage(keys.chance) then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_keine/ability_keine_01_stun.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(keys.range,keys.range,keys.range)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + if not v:HasModifier("modifier_keine_01_lock") then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_keine_01_lock", {Duration = keys.lock_time}) + UnitStunTarget(caster,v,keys.stun_time) + end + end + end + end +end + +function OnKeine02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.thtd_keine_change == nil then + caster.thtd_keine_change = THTD_KEINE_02_HUMEN + end + + if caster.thtd_keine_change == THTD_KEINE_02_HUMEN then + caster.thtd_keine_change = THTD_KEINE_02_SHIRASAWA + caster:SetModel("models/thd_hero/keine/keine2/keine2.vmdl") + caster:SetOriginalModel("models/thd_hero/keine/keine2/keine2.vmdl") + if caster.thtd_close_ai == true then + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="change_to_keine_shirasawa", duration=5, params={}, color="#0ff"} ) + end + elseif caster.thtd_keine_change == THTD_KEINE_02_SHIRASAWA then + caster.thtd_keine_change = THTD_KEINE_02_HUMEN + caster:SetModel("models/thd_hero/keine/keine.vmdl") + caster:SetOriginalModel("models/thd_hero/keine/keine.vmdl") + if caster.thtd_close_ai == true then + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="change_to_keine_humen", duration=5, params={}, color="#0ff"} ) + end + end +end + +function OnKeine03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range1) + + if caster.thtd_keine_change == nil then + caster.thtd_keine_change = THTD_KEINE_02_HUMEN + end + + if caster.thtd_keine_change == THTD_KEINE_02_HUMEN then + for k,v in pairs(targets) do + Keine03MarkUnit(v) + local modifier = v:FindModifierByName("thtd_keine_03_debuff") + if modifier==nil and v.thtd_keine_mark_count < keys.max_count then + keys.ability:ApplyDataDrivenModifier(caster, v, "thtd_keine_03_debuff", nil) + end + end + elseif caster.thtd_keine_change == THTD_KEINE_02_SHIRASAWA then + for k,v in pairs(targets) do + if v:HasModifier("thtd_keine_03_debuff") then + v.thtd_keine_mark_count = v.thtd_keine_mark_count + 1 + v:RemoveModifierByName("thtd_keine_03_debuff") + end + end + end +end + +function Keine03MarkUnit(unit) + unit.thtd_keine_mark_count = 0 + unit.thtd_keine_03_origin = unit:GetOrigin() + unit.thtd_keine_03_mark_health = unit:GetHealth() + unit.thtd_keine_03_next_move_point = unit.next_move_point + unit.thtd_keine_03_next_move_forward = unit.next_move_forward + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_keine/ability_keine_03.vpcf", PATTACH_CUSTOMORIGIN, unit) + ParticleManager:SetParticleControl(effectIndex, 0, unit:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, unit:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 2, unit:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnKeine03AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if RollPercentage(keys.chance) then + local targetPoint = target:GetOrigin() + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range2) + if caster.thtd_keine_change == THTD_KEINE_02_HUMEN then + for k,v in pairs(targets) do + Keine03MarkUnit(v) + local modifier = v:FindModifierByName("thtd_keine_03_debuff") + if modifier==nil and v.thtd_keine_mark_count < keys.max_count then + keys.ability:ApplyDataDrivenModifier(caster, v, "thtd_keine_03_debuff", nil) + end + end + else + for k,v in pairs(targets) do + if v:HasModifier("thtd_keine_03_debuff") then + v.thtd_keine_mark_count = v.thtd_keine_mark_count + 1 + v:RemoveModifierByName("thtd_keine_03_debuff") + end + end + end + end +end + +function OnKeine03Destroy(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if target~=nil and target:IsNull()==false and target:IsAlive() and target.thtd_keine_03_origin ~= nil then + local distance = GetDistanceBetweenTwoVec2D(target:GetOrigin(), target.thtd_keine_03_origin) + + local effectIndex = ParticleManager:CreateParticle("particles/bosses/thtd_keine/ability_bosses_keine.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + + FindClearSpaceForUnit(target,target.thtd_keine_03_origin,false) + + ParticleManager:SetParticleControl(effectIndex, 2, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + target.next_move_point = target.thtd_keine_03_next_move_point + target.next_move_forward = target.thtd_keine_03_next_move_forward + target.thtd_keine_03_origin = nil + + local currentHealth = target:GetHealth() + local decrease_health = target.thtd_keine_03_mark_health - currentHealth + + target:SetHealth(target.thtd_keine_03_mark_health) + + local ability = caster:FindAbilityByName("thtd_keine_04") + if ability:GetLevel() >= 1 then + if caster.thtd_keine_04_change == THTD_KEINE_04_SWORD then + OnKeine04Sword(keys) + elseif caster.thtd_keine_04_change == THTD_KEINE_04_JADE then + OnKeine04Jade(keys,distance) + elseif caster.thtd_keine_04_change == THTD_KEINE_04_MIRROR then + OnKeine04Mirror(keys,decrease_health,currentHealth) + end + end + end +end + +function OnKeine04Sword(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + local info = + { + Target = keys.target, + Source = caster, + Ability = keys.ability, + EffectName = "particles/heroes/thtd_keine/ability_keine_04_sword.vpcf", + iMoveSpeed = 1400, + vSourceLoc= caster:GetAbsOrigin(), -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, -- Optional + iVisionRadius = 400, -- Optional + iVisionTeamNumber = caster:GetTeamNumber(), -- Optional + } + local projectile = ProjectileManager:CreateTrackingProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) +end + +function OnKeine04SwordHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local ability = caster:FindAbilityByName("thtd_keine_04") + local damage = caster:THTD_GetAbilityPowerDamage(ability) + + local DamageTable = { + ability = ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + +function OnKeine04Jade(keys,distance) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local damage = caster:THTD_GetStarDamage() * (distance/100) * caster:GetAbilityValue("thtd_keine_04", "distance_damage") + + local DamageTable = { + ability = caster:FindAbilityByName("thtd_keine_04"), + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + +function OnKeine04Mirror(keys,decrease_health,currentHealth) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + target:SetHealth(currentHealth + decrease_health * math.max(0, (1 - caster:GetAbilityValue("thtd_keine_04", "hp_percent")))) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_keine/ability_keine_04_mirror.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +THTD_KEINE_04_SWORD = 1 +THTD_KEINE_04_JADE = 2 +THTD_KEINE_04_MIRROR = 3 + +function OnKeine04SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.thtd_keine_04_change == nil then + caster.thtd_keine_04_change = THTD_KEINE_04_SWORD + end + + if caster.thtd_keine_04_change == THTD_KEINE_04_SWORD then + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="change_to_keine_04_jade", duration=5, params={count=1}, color="#0ff"} ) + caster.thtd_keine_04_change = THTD_KEINE_04_JADE + elseif caster.thtd_keine_04_change == THTD_KEINE_04_JADE then + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="change_to_keine_04_mirror", duration=5, params={count=1}, color="#0ff"} ) + caster.thtd_keine_04_change = THTD_KEINE_04_MIRROR + elseif caster.thtd_keine_04_change == THTD_KEINE_04_MIRROR then + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="change_to_keine_04_sword", duration=5, params={count=1}, color="#0ff"} ) + caster.thtd_keine_04_change = THTD_KEINE_04_SWORD + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitykisume.lua b/scripts/vscripts/abilities/abilitykisume.lua new file mode 100755 index 0000000..c11b791 --- /dev/null +++ b/scripts/vscripts/abilities/abilitykisume.lua @@ -0,0 +1,75 @@ +function OnSpellStartKisume01(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then powerDamage = pv[1] end + + local targets = THTD_FindUnitsInRadius(caster,caster:GetAbsOrigin(),keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + powerDamage) + + for k,v in pairs(targets) do + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/heroes_underlord/abyssal_underlord_firestorm_wave.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end +end + +function OnSpellStartKisume02(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_kisume_02_debuff", nil) + + local powerCount = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then powerCount = pv[2] end + + if powerCount > 0 then + local targets = THTD_FindUnitsInRadius(caster,target:GetAbsOrigin(), 600) + local addTargets = {} + local count = 0 + for k,v in pairs(targets) do + if v ~= target then + table.insert(addTargets, v) + count = count + 1 + end + if count >= powerCount then break end + end + targets = {} + for k,v in pairs(addTargets) do + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_kisume_02_debuff", nil) + end + end +end + + +function OnKisume02Think(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local powerHp = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then powerHp = pv[1] end + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + + DamageTable.damage = DamageTable.damage + target:GetHealth() * (keys.damage_hp + powerHp) / 100 + UnitDamageTarget(DamageTable) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitykoakuma.lua b/scripts/vscripts/abilities/abilitykoakuma.lua new file mode 100755 index 0000000..9c2eb7b --- /dev/null +++ b/scripts/vscripts/abilities/abilitykoakuma.lua @@ -0,0 +1,104 @@ + +thtd_koakuma_01 = class({}) + +function thtd_koakuma_01:OnSpellStart() + local caster = self:GetCaster() + local target = self:GetCursorTarget() + + local ExtraData = { + count=0 + } + + caster:EmitSound("Sound_THTD.thtd_koakuma_01") + self:Koakuma01PassToNextUnit(caster,caster:GetOrigin(),target,ExtraData) +end + + +function thtd_koakuma_01:Koakuma01PassToNextUnit(target,target_1,target_2,data) + local caster = self:GetCaster() + + local info = + { + Target = target_2, + Source = target, + Ability = self, + EffectName = "particles/units/heroes/hero_dragon_knight/dragon_knight_elder_dragon_fire.vpcf", + iMoveSpeed = 1400, + vSourceLoc= target_1, -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, + iVisionRadius = 400, + iVisionTeamNumber = caster:GetTeamNumber(), + ExtraData = { + count=data.count + 1 + } + } + local projectile = ProjectileManager:CreateTrackingProjectile(info) +end + +-------------------------------------------------------------------------------- + +function thtd_koakuma_01:OnProjectileHit_ExtraData( hTarget, vLocation, data ) + local caster = self:GetCaster() + local target = hTarget + local damage = caster:THTD_GetAbilityPowerDamage(self) + local DamageTable = { + ability = self, + victim = target, + attacker = caster, + damage = damage, + damage_type = self:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + caster:EmitSound("Sound_THTD.thtd_koakuma_01.hit") + + local range_damage = self:GetSpecialValueFor("range_damage") + if range_damage > 0 then + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_ogre_magi/ogre_magi_fireblast.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local enemies = THTD_FindUnitsInRadius(caster,vLocation,self:GetSpecialValueFor("range2")) + for k,v in pairs(enemies) do + local DamageTable = { + ability = self, + victim = v, + attacker = caster, + damage = damage * range_damage/100, + damage_type = self:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + + local targets = THTD_FindUnitsInRadius(caster,vLocation,self:GetSpecialValueFor("range1")) + local max_count = self:GetSpecialValueFor("max_count") + for k,v in pairs(targets) do + if v~=nil and v~=target and data.count < max_count then + self:Koakuma01PassToNextUnit(target,vLocation,v,data) + break + end + end + + return true +end + +function OnCreatedKoakuma02Buff(keys) + local target = keys.target + + target:AddMagicalResist(-keys.penetration) +end + +function OnDestroyKoakuma02Buff(keys) + local target = keys.target + + target:AddMagicalResist(keys.penetration) +end diff --git a/scripts/vscripts/abilities/abilitykogasa.lua b/scripts/vscripts/abilities/abilitykogasa.lua new file mode 100755 index 0000000..a60cc26 --- /dev/null +++ b/scripts/vscripts/abilities/abilitykogasa.lua @@ -0,0 +1,87 @@ +function OnKogasa01SpellStart(keys) + local caster = keys.caster + local targetPoint = keys.target_points[1] + + local powerRange = 0 + local powerDamage = 0 + local powerSpecial = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then + powerRange = pv[1] + powerDamage = pv[2] + powerSpecial = pv[3] + end + + caster:EmitSound("Sound_THTD.thtd_kogasa_01") + + local special = 0 + if caster:HasModifier("modifier_byakuren_03_buff") then + special = caster.thtd_byakuren_buff_kogasa + powerSpecial + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + powerDamage) + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius + powerRange) + for k,v in pairs(targets) do + if not v:HasModifier("modifier_kogasa_debuff") then + keys.ability:ApplyDataDrivenModifier(caster,v,"modifier_kogasa_debuff", {Duration = keys.duration_time}) + end + if v.thtd_is_fearing ~= true then + v.thtd_is_fearing = true + local current_next_move_point = v.next_move_point + v.next_move_point = FirstPointList[v.thtd_player_index] + + local time = keys.duration_time + v:SetContextThink(DoUniqueString("modifier_kogasa_debuff"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if not IsValidAlive(v) then + return nil + end + if time <= 0 or THTD_IsValid(caster) == false then + v.next_move_point = current_next_move_point + v.thtd_is_fearing = false + return nil + end + time = time - 0.1 + return 0.1 + end, + 0) + end + + local realDamage = damage + if special > 0 then + if v.thtd_kogasa_01_special ~= true then + v.thtd_kogasa_01_special = true + UnitDamageHpRemove(caster, v, special) + else + realDamage = realDamage * special + end + end + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = realDamage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/kogasa/ability_kogasa_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnCreatedKogasa02Debuff(keys) + local target = keys.target + + target:AddPhysicalArmor(-keys.armor) +end + +function OnDestroyKogasa02Debuff(keys) + local target = keys.target + + target:AddPhysicalArmor(keys.armor) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitykoishi.lua b/scripts/vscripts/abilities/abilitykoishi.lua new file mode 100755 index 0000000..2a52498 --- /dev/null +++ b/scripts/vscripts/abilities/abilitykoishi.lua @@ -0,0 +1,210 @@ +function OnKoishi01Attack(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster.__koishi_lock ~= true then + caster.__koishi_lock = true + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),keys.range) + + for i=1,#targets do + local unit = targets[i] + if unit~=nil and unit:IsNull()==false and unit~=target and unit:IsAlive() then + caster:PerformAttack(unit,true,false,true,false,true,false,true) + if RollPercentage(keys.chance) then + local DamageTable = { + ability = keys.ability, + victim = unit, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_dark_willow/dark_willow_bramble.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, unit, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:DestroyParticleSystemTimeFalse(effectIndex,1.0) + end + end + end + caster.__koishi_lock = false + end +end + +function OnKoishi02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local modifer = caster:FindModifierByName("modifier_koishi_02_attack_speed") or keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_koishi_02_attack_speed", nil) + + local max_count = keys.max_count + if caster:HasModifier("passive_koishi_04_attack") then + max_count = keys.count_bonus + end + + if modifer:GetStackCount() < max_count then + modifer:IncrementStackCount() + end + modifer:SetDuration(keys.duration_time, false) +end + +function OnKoishi03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if target:THTD_IsTower() and target:HasModifier("modifier_koishi_03_buff") == false then + caster.thtd_last_cast_unit = target + + local time = keys.duration_time + if caster:FindAbilityByName("thtd_koishi_01"):GetLevel() > 1 then + time = keys.combo_time + end + + local bonus = keys.power_bonus + if target:GetUnitName() == "satori" then + if target:IsPower999() then + bonus = bonus * (keys.self_crit + 10) + else + bonus = bonus * keys.self_crit + end + elseif target:GetUnitName() == "koishi" then + bonus = bonus * keys.self_crit + end + target.koishi_03_power_bonus = bonus + + keys.ability:ApplyDataDrivenModifier(caster,target,"modifier_koishi_03_buff", {Duration = time}) + target:EmitSound("Hero_OgreMagi.Bloodlust.Target") + else + keys.ability:EndCooldown() + end +end + +function OnCreatedKoishi03Buff(keys) + local target = keys.target + local bonus = target.koishi_03_power_bonus + target:THTD_AddBasePower(bonus, "thtd_koishi_03_bonus") + target:THTD_AddBaseAttack(bonus, "thtd_koishi_03_bonus") +end + +function OnDestroyKoishi03Buff(keys) + local target = keys.target + target:THTD_AddBasePower("thtd_koishi_03_bonus") + target:THTD_AddBaseAttack("thtd_koishi_03_bonus") +end + +function OnKoishi04SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster:HasModifier("passive_koishi_04_attack") then + keys.ability:EndCooldown() + keys.ability:StartCooldown(1.0) + caster:GiveMana(caster:GetRealManaCost(keys.ability)) + return + end + + local time = keys.duration_time + + caster:StartGesture(ACT_DOTA_CAST_ABILITY_4) + caster:SetAttackCapability(DOTA_UNIT_CAP_MELEE_ATTACK) + + keys.ability:ApplyDataDrivenModifier(caster, caster, "passive_koishi_04_attack",nil) + caster:EmitSound("Voice_Thdots_Koishi.AbilityKoishi041") + caster:EmitSound("Hero_VengefulSpirit.WaveOfTerror") + + local effectIndex = ParticleManager:CreateParticle("particles/econ/events/fall_major_2015/teleport_end_fallmjr_2015_lvl2_black.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:DestroyParticleSystemTimeFalse(effectIndex,0.8) + + caster:SetContextThink(DoUniqueString("thtd_koishi04_buff_remove"), + function() + if GameRules:IsGamePaused() then return 0.03 end + caster:RemoveGesture(ACT_DOTA_CAST_ABILITY_4) + + caster:SetContextThink(DoUniqueString("thtd_koishi04_buff_remove"), + function() + if GameRules:IsGamePaused() then return 0.1 end + caster:StartGesture(ACT_DOTA_CAST_ABILITY_4_END) + local effectIndex = ParticleManager:CreateParticle("particles/econ/events/fall_major_2015/teleport_end_fallmjr_2015_lvl2_black.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:DestroyParticleSystemTimeFalse(effectIndex,0.25) + caster:EmitSound("Voice_Thdots_Koishi.AbilityKoishi042") + caster:EmitSound("Hero_VengefulSpirit.WaveOfTerror") + + caster:SetContextThink(DoUniqueString("thtd_koishi04_buff_remove"), + function() + if GameRules:IsGamePaused() then return 0.1 end + caster:RemoveGesture(ACT_DOTA_CAST_ABILITY_4_END) + + caster:SetAttackCapability(DOTA_UNIT_CAP_RANGED_ATTACK) + caster:RemoveModifierByName("passive_koishi_04_attack") + return nil + end, + 0.25) + + return nil + end, + time) + + return nil + end, + 0.8) +end + +function OnKoishi04AttackStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local count = 3 + caster:SetContextThink(DoUniqueString("thtd_koishi03_buff_remove"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local num = RandomInt(1,6) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_koishi/ability_koishi_04_attack_0"..num..".vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, caster:GetOrigin() - Vector(0,0,20)) + ParticleManager:SetParticleControlForward(effectIndex , 0, caster:GetForwardVector()+Vector(0,0,num/12)) + ParticleManager:SetParticleControlForward(effectIndex , 1, caster:GetForwardVector()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_koishi/ability_koishi_04_attack_landed.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, target:GetOrigin() + Vector(0,0,-260)) + ParticleManager:SetParticleControl(effectIndex , 1, target:GetOrigin() + Vector(0,0,0)) + ParticleManager:SetParticleControl(effectIndex , 2, target:GetOrigin() + Vector(0,0,0)) + ParticleManager:SetParticleControl(effectIndex , 3, target:GetOrigin() + Vector(0,0,0)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + if count > 0 then + count = count - 1 + return 0.1 + else + return nil + end + end, + 0.1) +end + +function OnKoishi04Kill(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.unit + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/moluo/ability_moluo03_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex , 3, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnCreatedKoishi04Buff(keys) + local target = keys.target + target:THTD_AddBasePower(keys.power_base, "thtd_koishi_04_bonus") + target:THTD_AddBaseAttack(keys.power_base, "thtd_koishi_04_bonus") + target:THTD_AddPowerPercentage(keys.power_up, "thtd_koishi_04_bonus") + target:THTD_AddAttackPercentage(keys.power_up, "thtd_koishi_04_bonus") +end + +function OnDestroyKoishi04Buff(keys) + local target = keys.target + target:THTD_AddBasePower("thtd_koishi_04_bonus") + target:THTD_AddBaseAttack("thtd_koishi_04_bonus") + target:THTD_AddPowerPercentage("thtd_koishi_04_bonus") + target:THTD_AddAttackPercentage("thtd_koishi_04_bonus") +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitykokoro.lua b/scripts/vscripts/abilities/abilitykokoro.lua new file mode 100755 index 0000000..c858988 --- /dev/null +++ b/scripts/vscripts/abilities/abilitykokoro.lua @@ -0,0 +1,318 @@ +function OnKokoro01SpellStart(keys) + local caster = keys.caster + local targets = THTD_FindUnitsInRadius(caster, caster:GetAbsOrigin(), keys.ability:GetCastRange()) + if #targets == 0 then return end + for k,v in pairs(targets) do + local info = + { + Target = v, + Source = caster, + Ability = keys.ability, + EffectName = "particles/units/heroes/hero_arc_warden/arc_warden_wraith_prj.vpcf", + iMoveSpeed = 660, + vSourceLoc= caster:GetAbsOrigin(), -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, -- Optional + iVisionRadius = 400, -- Optional + iVisionTeamNumber = caster:GetTeamNumber(), -- Optional + ExtraData = { } + } + local projectile = ProjectileManager:CreateTrackingProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + end + + KokoroSetPvCrit(caster) + KokoroSetMust(caster, 1) +end + +function OnProjectileHitUnitKokoro01(keys) + local caster = keys.caster + local target = keys.target + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + + local crit1 = 1 + local hasBuff1 = false + if caster:HasModifier("modifier_kokoro_04_buff_1") then + hasBuff1 = true + end + local damage_up_base = caster:GetAbilityValue("thtd_kokoro_04", "damage_up_base", true) + local damage_up_per = caster:GetAbilityValue("thtd_kokoro_04", "damage_up_per", true) + local damage_up_factor = 1 + if caster:IsPower666() then + damage_up_factor = 4 + end + local crit2 = KokoroGetPvCrit(caster) + if hasBuff1 then + crit1 = 1 + (damage_up_base + damage_up_per * (100 - target:GetHealthPercent())) * damage_up_factor + end + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage * crit1 * crit2, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + +function OnKokoro02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + KokoroSetPvCrit(caster) + + local stun_time = keys.stun_time + + local crit1 = 1 + local hasBuff1 = false + if caster:HasModifier("modifier_kokoro_04_buff_1") then + hasBuff1 = true + end + local damage_up_base = caster:GetAbilityValue("thtd_kokoro_04", "damage_up_base", true) + local damage_up_per = caster:GetAbilityValue("thtd_kokoro_04", "damage_up_per", true) + local damage_up_factor = 1 + if caster:IsPower666() then + damage_up_factor = 4 + end + local crit2 = KokoroGetPvCrit(caster) + + local enemies = THTD_FindUnitsInRadius(caster, caster:GetAbsOrigin(), keys.ability:GetCastRange()) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(enemies) do + local unit = CreateUnitByName( + "kokoro_jin_yin", + caster:GetAbsOrigin(), + false, + caster:GetOwner(), + caster:GetOwner(), + caster:GetTeam() + ) + if unit ~= nil then + keys.ability:ApplyDataDrivenModifier(caster, unit, "modifier_kokoro_02_rooted", {}) + -- unit:MoveToTargetToAttack(v) + -- 设置朝向 + local vecForward = (v:GetOrigin() - caster:GetOrigin()):Normalized() + unit:SetForwardVector(vecForward) + -- local angles = VectorToAngles(vecForward) + -- unit:SetAngles(angles.x,angles.y,angles.z) + local scale = unit:GetModelScale() + local count = 0 + unit:SetContextThink( + DoUniqueString("kokoro02_move"), + function () + if GameRules:IsGamePaused() then return 0.03 end + if v==nil or v:IsNull() or v:IsAlive()==false then + unit:AddNoDraw() + unit:ForceKill(false) + return nil + end + if caster==nil or caster:IsNull() or caster:IsAlive()==false or caster:THTD_IsHidden() then + unit:AddNoDraw() + unit:ForceKill(false) + return nil + end + + unit:SetModelScale(scale * (1 + 0.1 * count)) + unit:MoveToTargetToAttack(v) + local vecMove=(unit:GetOrigin()-v:GetOrigin()):Normalized() * 100 + unit:SetAbsOrigin(GetGroundPosition(unit:GetOrigin()-vecMove, unit)) + if (unit:GetOrigin()-v:GetOrigin()):Length() < 50 then + if hasBuff1 then + crit1 = 1 + (damage_up_base + damage_up_per * (100 - v:GetHealthPercent())) * damage_up_factor + end + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage * crit1 * crit2, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + UnitStunTarget(caster,v,stun_time) + unit:AddNoDraw() + unit:ForceKill(false) + return nil + end + + count = count + 1 + return 0.05 + end, + 0.1) + end + end + + KokoroSetMust(caster, 2) +end + +function OnKokoro03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local range = keys.ability:GetCastRange() + + KokoroSetPvCrit(caster) + + -- local effect = "particles/econ/items/mars/mars_fall20_immortal_shield/mars_fall20_immortal_shield_bash.vpcf" + local effect1 = "particles/econ/items/mars/mars_fall20_immortal_shield/mars_fall20_immortal_shield_bash_headmodel.vpcf" + local effect2 = "particles/units/heroes/hero_mars/mars_shield_bash_model.vpcf" + caster:EmitSound("Hero_Mars.Shield.Cast") --"Hero_Mars.Shield.Cast.Small" + local casterPoint = caster:GetOrigin() + local forward = caster:GetForwardVector() + + local effectIndex = ParticleManager:CreateParticle(effect1, PATTACH_WORLDORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, casterPoint) + ParticleManager:SetParticleControlForward(effectIndex, 0, forward) + ParticleManager:ReleaseParticleIndex(effectIndex) + local effectIndex = ParticleManager:CreateParticle(effect2, PATTACH_WORLDORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, casterPoint) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(range, 0, 0)) + ParticleManager:SetParticleControlForward(effectIndex, 0, forward) + ParticleManager:ReleaseParticleIndex(effectIndex) + + local rotate_angle = QAngle(0,45,0) + local rotate_forward = (RotatePosition(casterPoint + forward * 300, rotate_angle, casterPoint) - casterPoint):Normalized() + local effectIndex = ParticleManager:CreateParticle(effect1, PATTACH_WORLDORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, casterPoint) + ParticleManager:SetParticleControlForward(effectIndex, 0, rotate_forward) + ParticleManager:ReleaseParticleIndex(effectIndex) + local effectIndex = ParticleManager:CreateParticle(effect2, PATTACH_WORLDORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, casterPoint) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(range, 0, 0)) + ParticleManager:SetParticleControlForward(effectIndex, 0, rotate_forward) + ParticleManager:ReleaseParticleIndex(effectIndex) + + local rotate_angle = QAngle(0,-45,0) + local rotate_forward = (RotatePosition(casterPoint + forward * 300, rotate_angle, casterPoint) - casterPoint):Normalized() + local effectIndex = ParticleManager:CreateParticle(effect1, PATTACH_WORLDORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, casterPoint) + ParticleManager:SetParticleControlForward(effectIndex, 0, rotate_forward) + ParticleManager:ReleaseParticleIndex(effectIndex) + local effectIndex = ParticleManager:CreateParticle(effect2, PATTACH_WORLDORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, casterPoint) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(range, 0, 0)) + ParticleManager:SetParticleControlForward(effectIndex, 0, rotate_forward) + ParticleManager:ReleaseParticleIndex(effectIndex) + + local crit1 = 1 + local hasBuff1 = false + if caster:HasModifier("modifier_kokoro_04_buff_1") then + hasBuff1 = true + end + local damage_up_base = caster:GetAbilityValue("thtd_kokoro_04", "damage_up_base", true) + local damage_up_per = caster:GetAbilityValue("thtd_kokoro_04", "damage_up_per", true) + local damage_up_factor = 1 + if caster:IsPower666() then + damage_up_factor = 4 + end + local crit2 = KokoroGetPvCrit(caster) + + local targets = THTD_FindUnitsInRadius(caster, caster:GetAbsOrigin(), range) + local damage = caster:THTD_GetAttack() * keys.crit_mult + for k,v in pairs(targets) do + if hasBuff1 then + crit1 = 1 + (damage_up_base + damage_up_per * (100 - v:GetHealthPercent())) * damage_up_factor + end + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage * crit1 * crit2, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + KokoroSetMust(caster, 3) +end + +function KokoroSetMust(caster, index) + local ability4 = caster:FindAbilityByName("thtd_kokoro_04") + if ability4:GetLevel() > 0 then + caster:RemoveModifierByName("modifier_kokoro_04_buff_1") + caster:RemoveModifierByName("modifier_kokoro_04_buff_2") + caster:RemoveModifierByName("modifier_kokoro_04_buff_3") + ability4:ApplyDataDrivenModifier(caster, caster, "modifier_kokoro_04_buff_"..index, nil) + end +end + +function KokoroSetPvCrit(caster) + local powerDamageUp = 0 + local pv = caster:GetAbilityPowerValue("thtd_kokoro_04") + if pv ~= nil then + powerDamageUp = pv[1] + end + caster.thtd_kokoro_pv_crit = 1 + powerDamageUp * 66/100 +end + +function KokoroGetPvCrit(caster) + return caster.thtd_kokoro_pv_crit or 1 +end + +function OnCreatedKokoro04Buff2(keys) + local target = keys.target + + local bonus = keys.bonus + if target:IsPower666() then + bonus = bonus * 4 + end + target:THTD_AddPowerPercentage(bonus, "thtd_kokoro_04_buff2_bonus") + target:THTD_AddAttackPercentage(bonus, "thtd_kokoro_04_buff2_bonus") +end + +function OnDestroyKokoro04Buff2(keys) + local target = keys.target + target:THTD_AddPowerPercentage("thtd_kokoro_04_buff2_bonus") + target:THTD_AddAttackPercentage("thtd_kokoro_04_buff2_bonus") +end + +function OnCreatedKokoro04Buff3(keys) + local target = keys.target + + local bonus = keys.crit_damage + if target:IsPower666() then + bonus = bonus * 4 + end + target:THTD_AddCritDamage(bonus, "thtd_kokoro_04_bonus") +end + +function OnDestroyKokoro04Buff3(keys) + keys.target:THTD_AddCritDamage("thtd_kokoro_04_bonus") +end + +function OnKokoro04Think(keys) + if keys.ability:GetLevel() < 1 then return end + + local caster = keys.caster + + local bonus = 0 + if caster:IsPower999() then + bonus = 999 + end + local targets = THTD_FindUnitsInRadius(caster, caster:GetAbsOrigin(), keys.ability:GetCastRange()) + for k,v in pairs(targets) do + local hp = v:GetHealthPercent() + if hp > 70 then + bonus = bonus + hp - 70 + end + if caster:IsPower999() then + bonus = bonus + (100 - hp) * 1 + end + end + + if caster.thtd_kokoro_04_power_bonus == bonus then return end + + if caster.thtd_kokoro_04_power_bonus ~= nil then + caster:THTD_AddBasePower(-caster.thtd_kokoro_04_power_bonus) + caster:THTD_AddBaseAttack(-caster.thtd_kokoro_04_power_bonus) + end + caster:THTD_AddBasePower(bonus) + caster:THTD_AddBaseAttack(bonus) + caster.thtd_kokoro_04_power_bonus = bonus +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitykomachi.lua b/scripts/vscripts/abilities/abilitykomachi.lua new file mode 100755 index 0000000..8bf4709 --- /dev/null +++ b/scripts/vscripts/abilities/abilitykomachi.lua @@ -0,0 +1,292 @@ +function OnAttackKomachi01(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/komachi/ability_komachi_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex , 1, caster:GetOrigin()) + ParticleManager:SetParticleControlForward(effectIndex, 1, caster:GetForwardVector()) + ParticleManager:DestroyParticleSystem(effectIndex, false) +end + +function OnAttackLandedKomachi01(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local range = caster:Script_GetAttackRange() + local targets = THTD_FindUnitsInRadius(caster,caster:GetAbsOrigin(),range) + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end +end + +function OnCreatedKomachi01Buff(keys) + -- 被动需要加延时确保在初始化之后 + keys.target:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + keys.target:THTD_AddCritChance(keys.chance, "thtd_komachi_01_chance") + return nil + end, + 0.3) +end + +function OnThinkKomachi01(keys) + local caster = keys.caster + local range = caster:Script_GetAttackRange() + local targets = THTD_FindUnitsInRadius(caster,caster:GetAbsOrigin(),range) + local crit = 0 + local chance = 0 + for k,v in pairs(targets) do + local lostHp = 100 - v:GetHealthPercent() + crit = crit + math.floor(lostHp/4) * keys.crit_bonus + end + caster:THTD_AddCritDamage(crit, "thtd_komachi_01_bonus") +end + +function OnSpellStartKomachi02(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_dark_seer/dark_seer_vacuum.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(keys.radius,0, 0)) + + caster:EmitSound("Hero_Dark_Seer.Vacuum") + + local time = math.floor(keys.duration_time * 100 + 0.5) / 100 + local tick = 0.03 + caster:SetContextThink(DoUniqueString("thtd_komachi_02"), + function() + if THTD_IsValid(caster) == false then + ParticleManager:DestroyParticleSystem(effectIndex, true) + return nil + end + if time < 0 then + ParticleManager:DestroyParticleSystem(effectIndex, true) + caster:StopSound("Hero_Dark_Seer.Vacuum") + + targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + return nil + end + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius) + for k, v in pairs(targets) do + local distance = (v:GetAbsOrigin() - targetPoint):Length2D() + local in_pull = 700 + local new_pos = GetGroundPosition(v:GetAbsOrigin(), v) + if distance > 20 then + local direction = (targetPoint - new_pos):Normalized() + direction.z = 0.0 + new_pos = new_pos + direction * in_pull * tick + end + v:SetOrigin(new_pos) + end + time = time - tick + return tick + end, + 0) +end + +function OnSpellStartKomachi03(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetUnit = keys.target + + local targets = {} + local count = 0 + local modifierName = "modifier_komachi_03_debuff" + + if not targetUnit:HasModifier(modifierName) then + table.insert(targets, targetUnit) + count = count + 1 + end + if count < keys.max_count then + local rangeTargets = THTD_FindUnitsInRadius(caster,targetUnit:GetAbsOrigin(),1000) + for k,v in pairs(rangeTargets) do + if not v:HasModifier(modifierName) then + table.insert(targets, v) + count = count + 1 + if count >= keys.max_count then + break + end + end + end + end + if #targets == 0 then + keys.ability:EndCooldown() + return + end + + for _,target in pairs(targets) do + keys.ability:ApplyDataDrivenModifier(caster, target, modifierName, {}) + end +end + +function OnCreatedKomachi03Debuff(keys) + keys.target:AddDamageIncomingAll(keys.damage_up, "thtd_komachi_02_damage_up") +end + +function OnDestroyKomachi03Debuff(keys) + local caster = keys.caster + local target = keys.target + + target:AddDamageIncomingAll("thtd_komachi_02_damage_up") + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/komachi/ability_komachi_03_explosion_2.vpcf", PATTACH_CUSTOMORIGIN, target) + ParticleManager:SetParticleControl(effectIndex , 0, target:GetOrigin() + Vector(0,0,128)) + ParticleManager:DestroyParticleSystem(effectIndex, false) +end + +function OnSpellStartKomachi04(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local vecCaster = caster:GetOrigin() + + if target:HasModifier("modifier_komachi_04") then + keys.ability:EndCooldown() + return + end + + keys.ability:ApplyDataDrivenModifier(caster,caster,"modifier_komachi_04",{Duration = 2.0}) + keys.ability:ApplyDataDrivenModifier(caster,target,"modifier_komachi_04",{Duration = 2.0}) + target.komachi_04_damage_lock = true + + local rad = GetRadBetweenTwoVec2D(caster:GetOrigin(),target:GetOrigin()) + local tarForward = Vector(math.cos(rad),math.sin(rad),0) + + target:SetForwardVector(tarForward) + + -- 渐隐效果 + -- local effectIndex_start = ParticleManager:CreateParticle("particles/heroes/komachi/ability_komachi_04_start.vpcf", PATTACH_CUSTOMORIGIN, nil) + -- ParticleManager:SetParticleControl(effectIndex_start, 0, vecCaster) + -- ParticleManager:SetParticleControlForward(effectIndex_start, 0, tarForward) + + -- caster:SetContextThink(DoUniqueString("OnKomachi04SpellStart"), + -- function () + -- if GameRules:IsGamePaused() then return 0.03 end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/komachi/ability_komachi_04_blink.vpcf", PATTACH_CUSTOMORIGIN, target) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()-tarForward*250) + ParticleManager:SetParticleControlForward(effectIndex, 0, tarForward) + + caster:SetOrigin(target:GetOrigin()-tarForward*150) + caster:SetForwardVector(tarForward) + caster:StartGesture(ACT_DOTA_CAST_ABILITY_4) + + -- return nil + -- end, + -- 2.0) + + local time = 2.0 + caster:SetContextThink(DoUniqueString("OnKomachi04SpellStart_stage_2"), + function () + if GameRules:IsGamePaused() then return 0.1 end + if not THTD_IsValid(caster) then + target.komachi_04_damage_lock = false + target:RemoveModifierByName("modifier_komachi_04") + ParticleManager:DestroyParticleSystem(effectIndex, true) + if caster ~= nil and caster:IsNull() == false then + caster:RemoveModifierByName("modifier_komachi_04") + end + return nil + end + if not THTD_IsValid(target) then + caster:SetOrigin(vecCaster) + caster:RemoveModifierByName("modifier_komachi_04") + if target ~= nil and target:IsNull() == false then + target:RemoveModifierByName("modifier_komachi_04") + end + caster:EmitSound("Hero_Axe.Culling_Blade_Success") + + local bonusTime = math.floor(keys.duration_time * 100 + 0.5) / 100 + local modifier = caster:FindModifierByName("modifier_komachi_04_buff") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster,caster,"modifier_komachi_04_buff",{Duration=bonusTime}) + else + modifier:SetDuration(bonusTime, false) + end + + if keys.bonus_power > 0 then + local skipedCount = 0 + if SpawnSystem.ReachToWave ~= nil then + if caster.skiped_wave == nil then + caster.skiped_wave = SpawnSystem.ReachToWave + 50 - SpawnSystem.CurWave - 1 + end + elseif caster.skiped_wave ~= nil then + skipedCount = caster.skiped_wave * 2 + caster.skiped_wave = nil + end + modifier = caster:FindModifierByName("modifier_komachi_04_kill_power_bonus") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster,caster,"modifier_komachi_04_kill_power_bonus",{}):SetStackCount(1) + caster:THTD_AddBasePower(keys.bonus_power) + elseif modifier:GetStackCount() < 999 then + local addCount = math.min(999 - modifier:GetStackCount(), 1 + skipedCount) + modifier:SetStackCount(modifier:GetStackCount() + addCount) + caster:THTD_AddBasePower(keys.bonus_power * addCount) + end + end + + return nil + end + + if time <= 0 then + target.komachi_04_damage_lock = false + caster:RemoveModifierByName("modifier_komachi_04") + target:RemoveModifierByName("modifier_komachi_04") + + local effectIndex_end = ParticleManager:CreateParticle("particles/heroes/komachi/ability_komachi_04_scythe.vpcf", PATTACH_CUSTOMORIGIN, target) + ParticleManager:SetParticleControl(effectIndex_end, 0, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex_end, 1, target:GetOrigin()) + + caster:SetOrigin(vecCaster) + + if target:GetHealthPercent() <= keys.hp_kill then + caster:NpcKill(target) + else + caster:AbilityKill(target, keys.ability) + end + time = -1 + return 0.1 + end + + if time <= -1 then + return nil + end + + time = time - 0.1 + return 0.1 + end, + 0) +end + +function OnCreatedKomachi04Buff(keys) + local target = keys.target + target:THTD_AddAttackSpeed(keys.attack_speed, "thtd_komachi_04_bonus") + target:AddDamageOutgoingAll(keys.damage_up, "thtd_komachi_04_bonus") +end + +function OnDestroyKomachi04Buff(keys) + local target = keys.target + target:THTD_AddAttackSpeed("thtd_komachi_04_bonus") + target:AddDamageOutgoingAll("thtd_komachi_04_bonus") +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitykyouko.lua b/scripts/vscripts/abilities/abilitykyouko.lua new file mode 100755 index 0000000..dc82a19 --- /dev/null +++ b/scripts/vscripts/abilities/abilitykyouko.lua @@ -0,0 +1,304 @@ +function OnSpellStartKyouko01(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.ability:GetCursorPosition() + local effects = { + "particles/units/heroes/hero_queenofpain/queen_sonic_wave.vpcf", + "particles/econ/items/queen_of_pain/qop_arcana/qop_arcana_sonic_wave.vpcf", + "particles/econ/items/queen_of_pain/qop_arcana/qop_arcana_sonic_wave_v2.vpcf", + } + + local powerDamageUp = 0 + local pv = caster:GetAbilityPowerValue("thtd_kyouko_01") + if pv ~= nil then + powerDamageUp = pv[1] + end + caster.thtd_kyouko_01_damage_up = keys.damage_up + powerDamageUp + + if caster:IsPower999() then + if caster.kyouko_power999_bonus ~= true then + caster:THTD_AddCritChance(75) + caster:THTD_AddCritDamage(500) + caster.kyouko_power999_bonus = true + end + else + if caster.kyouko_power999_bonus == true then + caster:THTD_AddCritChance(-75) + caster:THTD_AddCritDamage(-500) + caster.kyouko_power999_bonus = nil + end + end + + local direction = (targetPoint - caster:GetAbsOrigin()):Normalized() + direction.z = 0 + + if caster:IsPower666() then + local count = 3 + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + count = count - 1 + if count < 0 then + return nil + end + + local info = + { + Ability = keys.ability, + EffectName = effects[#effects - count], + vSpawnOrigin = caster:GetAbsOrigin(), + fDistance = keys.distance, + fStartRadius = keys.starting_aoe, + fEndRadius = keys.final_aoe, + Source = caster, + iSourceAttachment = "mouth", + bHasFrontalCone = false, + bReplaceExisting = false, + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = false, + vVelocity = direction * keys.speed, + bProvidesVision = false, + ExtraData = {} + } + ProjectileManager:CreateLinearProjectile(info) + return 1.0 + end, + 0) + else + local info = + { + Ability = keys.ability, + EffectName = effects[RandomInt(1, #effects)], + vSpawnOrigin = caster:GetAbsOrigin(), + fDistance = keys.distance, + fStartRadius = keys.starting_aoe, + fEndRadius = keys.final_aoe, + Source = caster, + iSourceAttachment = "mouth", + bHasFrontalCone = false, + bReplaceExisting = false, + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = false, + vVelocity = direction * keys.speed, + bProvidesVision = false, + ExtraData = {} + } + ProjectileManager:CreateLinearProjectile(info) + end +end + +function OnProjectileHitUnitKyouko01(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + (caster.thtd_byakuren_buff_kyouko or 0)/100) + + local crit = 1.0 + local modifier = target:FindModifierByName("modifier_thtd_kyouko_01_debuff") + if modifier ~= nil then + local count = modifier:GetStackCount() + crit = crit + count * caster.thtd_kyouko_01_damage_up/100 + modifier:SetStackCount(math.min(999, count+1)) + else + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_thtd_kyouko_01_debuff", nil):SetStackCount(1) + end + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage * crit, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + + +function OnSpellStartKyouko02(keys) + local caster = keys.caster + + if caster:IsPower999() then + if caster.kyouko_power999_bonus ~= true then + caster:THTD_AddCritChance(75) + caster:THTD_AddCritDamage(500) + caster.kyouko_power999_bonus = true + end + else + if caster.kyouko_power999_bonus == true then + caster:THTD_AddCritChance(-75) + caster:THTD_AddCritDamage(-500) + caster.kyouko_power999_bonus = nil + end + end + + caster.thtd_kyouko_02_first = true + + if caster:IsPower666() then + local count = 3 + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if count == 2 then caster.thtd_kyouko_02_first = false end + count = count - 1 + if count < 0 then + return nil + end + OnSpellStartKyouko02Work(keys) + return 0.9 + end, + 0) + else + OnSpellStartKyouko02Work(keys) + end +end + +function OnSpellStartKyouko02Work(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local effects = { + [1] = { + ["start"] = "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_start.vpcf", + ["ground"] = "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_ground.vpcf", + ["proj"] = "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_proj.vpcf", + }, + [2] = { + ["start"] = "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_start_v2.vpcf", + ["ground"] = "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_ground_v2.vpcf", + ["proj"] = "particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_echoslam_proj_v2.vpcf", + }, + } + local effectTable = effects[RandomInt(1,2)] + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + + -- if #targets > 0 then + -- EmitSoundOnLocationWithCaster(targetPoint, "Hero_EarthShaker.EchoSlam", caster) + -- else + -- EmitSoundOnLocationWithCaster(targetPoint, "Hero_EarthShaker.EchoSlamSmall", caster) + -- end + + -- caster:SetContextThink(DoUniqueString("OnSpellStartKyouko02"), + -- function() + -- if #targets == 2 then + -- local random_response = RandomInt(1, 4) + -- if random_response >= 3 then random_response = random_response + 1 end + -- EmitSoundOnLocationWithCaster(targetPoint, "earthshaker_erth_ability_echo_0"..random_response, caster) + -- elseif #targets >= 3 then + -- EmitSoundOnLocationWithCaster(targetPoint, "earthshaker_erth_ability_echo_03", caster) + -- elseif #targets == 0 then + -- EmitSoundOnLocationWithCaster(targetPoint, "earthshaker_erth_ability_echo_0"..(RandomInt(6, 7)), caster) + -- end + -- return nil + -- end, + -- 0.5) + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_kyouko_02") + if pv ~= nil then + powerDamage = pv[1] + end + caster.thtd_kyouko_02_damage = (keys.power_damage + powerDamage) * caster:THTD_GetStarDamage() + + local effect_counter = 0 + + local count = 0 + for _, enemy in pairs(targets) do + count = count + 1 + if count%5 == 0 then + if effect_counter < 5 then + effect_counter = effect_counter + 1 + end + caster:SetContextThink(DoUniqueString("OnSpellStartKyouko02"), + function() + local echo_slam_death_pfx = ParticleManager:CreateParticle(effectTable["ground"], PATTACH_ABSORIGIN, enemy) + ParticleManager:SetParticleControl(echo_slam_death_pfx, 6, Vector(math.min(effect_counter, 1), math.min(effect_counter, 1), math.min(effect_counter, 1))) + ParticleManager:SetParticleControl(echo_slam_death_pfx, 10, Vector(keys.duration_time + 1, 0, 0)) -- earth particle duration + ParticleManager:ReleaseParticleIndex(echo_slam_death_pfx) + return nil + end, + 0.1) + end + + local crit = 1.0 + local modifier = enemy:FindModifierByName("modifier_thtd_kyouko_01_debuff") + if modifier ~= nil then + crit = crit + modifier:GetStackCount() * caster.thtd_kyouko_01_damage_up/100 + end + + if caster.thtd_kyouko_02_first == true then UnitStunTarget(caster,enemy,keys.duration_time) end + local DamageTable = { + ability = keys.ability, + victim = enemy, + attacker = caster, + damage = caster.thtd_kyouko_02_damage * crit, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + if enemy.is_random_boss == true then + local pfx_screen = ParticleManager:CreateParticleForPlayer("particles/econ/items/earthshaker/earthshaker_arcana/earthshaker_arcana_aftershock_screen.vpcf", PATTACH_ABSORIGIN_FOLLOW, enemy, caster:GetPlayerOwner()) + ParticleManager:ReleaseParticleIndex(pfx_screen) + end + + local echo_enemies = THTD_FindUnitsInRadius(caster,enemy:GetAbsOrigin(),keys.range) + + for _, echo_enemy in pairs(echo_enemies) do + if echo_enemy ~= enemy then + -- echo_enemy:EmitSound("Hero_EarthShaker.EchoSlamEcho") + ProjectileManager:CreateTrackingProjectile( + { + Target = echo_enemy, + Source = enemy, + Ability = keys.ability, + EffectName = effectTable["proj"], + iMoveSpeed = 1100, + vSourceLoc = enemy:GetAbsOrigin(), + bDrawsOnMinimap = false, + bDodgeable = false, + bIsAttack = false, + bVisibleToEnemies = true, + bReplaceExisting = false, + flExpireTime = GameRules:GetGameTime() + 10.0, + bProvidesVision = false, + ExtraData = {} + }) + end + end + end + + local echo_slam_particle = ParticleManager:CreateParticle(effectTable["start"], PATTACH_ABSORIGIN, caster) + ParticleManager:SetParticleControl(echo_slam_particle, 0, targetPoint) + ParticleManager:SetParticleControl(echo_slam_particle, 10, Vector(keys.duration_time + 1, 0, 0)) + ParticleManager:SetParticleControl(echo_slam_particle, 11, Vector(math.min(#targets, 1), math.min(#targets, 1), 0 )) + ParticleManager:ReleaseParticleIndex(echo_slam_particle) + +end + +function OnProjectileHitUnitKyouko02(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster.thtd_kyouko_02_first == true then UnitStunTarget(caster,target,keys.duration_time) end + + local crit = 1.0 + local modifier = target:FindModifierByName("modifier_thtd_kyouko_01_debuff") + if modifier ~= nil then + crit = crit + modifier:GetStackCount() * caster.thtd_kyouko_01_damage_up/100 + end + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster.thtd_kyouko_02_damage * crit, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityletty.lua b/scripts/vscripts/abilities/abilityletty.lua new file mode 100755 index 0000000..ba412b5 --- /dev/null +++ b/scripts/vscripts/abilities/abilityletty.lua @@ -0,0 +1,72 @@ +function OnLetty01SpellStart(keys) + local caster = keys.caster + local targetPoint = keys.target_points[1] + + local powerCount = 0 + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then + powerCount = pv[1] + powerDamage = pv[2] + end + + local maxCount = keys.max_count + powerCount + local count_effect = maxCount + local count = maxCount + keys.ability:StartCooldown(maxCount - 1) + + caster:SetContextThink(DoUniqueString("thtd_letty01_spell_start_effect"), + function() + for i=1,20 do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/letty/ability_letty_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint + Vector(math.cos(math.pi/4*i),math.sin(math.pi/4*i),0)*200 + RandomVector(100)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + count_effect = count_effect - 1 + caster:EmitSound("Sound_THTD.thtd_letty_01") + if count_effect > 0 then + return 1.0 + else + return nil + end + end, + 0) + + caster:SetContextThink(DoUniqueString("thtd_letty01_spell_start"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius) + local damage = (caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage()) * 2^(maxCount - count) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + count = count - 1 + if count > 0 then + return 1.0 + else + return nil + end + end, + 0) +end + +function OnCreatedLetty02Buff(keys) + local target = keys.target + + target:AddMagicalResist(-keys.magic_armor) +end + +function OnDestroyLetty02Buff(keys) + local target = keys.target + + target:AddMagicalResist(keys.magic_armor) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitylily.lua b/scripts/vscripts/abilities/abilitylily.lua new file mode 100755 index 0000000..223ae08 --- /dev/null +++ b/scripts/vscripts/abilities/abilitylily.lua @@ -0,0 +1,117 @@ +function OnLily01SpellStart(keys) + local caster = keys.caster + local ability = keys.ability + local targetPoint = keys.target_points[1] + + if caster:GetMaxMana() ~= (caster.lily_max_mana or 100) then + caster:SetMaxMana(caster.lily_max_mana or 100) + end + + if SpawnSystem.IsUnLimited == false and GameRules:GetCustomGameDifficulty() < FUNNY_MODE then + local targets = + FindUnitsInRadius( + caster:GetTeamNumber(), + targetPoint, + nil, + keys.radius, + ability:GetAbilityTargetTeam(), + ability:GetAbilityTargetType(), + ability:GetAbilityTargetFlags(), + FIND_CLOSEST, + false + ) + + local exp = caster:THTD_GetPower() * keys.power_factor + + for k,v in pairs(targets) do + if v ~= nil and v:IsNull() == false and v:THTD_IsTower() and v ~= caster and v:GetOwner() == caster:GetOwner() and v:THTD_GetLevel() < THTD_MAX_LEVEL then + v:THTD_AddExp(exp) + end + end + end + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius) + local damage = caster:THTD_GetAbilityPowerDamage(ability) + local maxDamage = caster:GetKillDamage() + for k,v in pairs(targets) do + local DamageTable = { + ability = ability, + victim = v, + attacker = caster, + damage = math.min(maxDamage, damage + v:GetHealth() * keys.hp_damage/100), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/lily/ability_lily_01_a.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnLily01EffectThink(keys) + local caster = keys.caster + local ability = keys.ability + + if SpawnSystem.IsUnLimited and caster.is_unlimited_mana_buff ~= true then + caster.is_unlimited_mana_buff = true + caster:AddManaCostReducePercent(keys.mana_down, "thtd_lily_01_unlimited_mana_buff") + caster.lily_max_mana = 100 - caster:GetManaCostReducePercent() + end + + if caster:GetMaxMana() ~= (caster.lily_max_mana or 100) then + caster:SetMaxMana(caster.lily_max_mana or 100) + end + + if ability:IsFullyCastable() then + if caster.thtd_lily_01_effectIndex == nil then + caster.thtd_lily_01_effectIndex = ParticleManager:CreateParticle("particles/heroes/lily/ability_lily_01_ready.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(caster.thtd_lily_01_effectIndex , 0, caster, 5, "follow_origin", Vector(0,0,0), true) + end + elseif caster.thtd_lily_01_effectIndex ~= nil then + ParticleManager:DestroyParticleSystem(caster.thtd_lily_01_effectIndex,true) + caster.thtd_lily_01_effectIndex = nil + end +end + +function OnLily02SpellStart(keys) + local caster = keys.caster + + if caster:GetMaxMana() ~= (caster.lily_max_mana or 100) then + caster:SetMaxMana(caster.lily_max_mana or 100) + end + + local powerRange = 0 + local pv = caster:GetAbilityPowerValue("thtd_lily_02") + if pv ~= nil then + powerRange = pv[1] + end + local range = powerRange + keys.radius + + local targets = THTD_FindFriendlyUnitsInRadius(caster,caster:GetAbsOrigin(),range) + for k,v in pairs(targets) do + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_lily_02_buff", nil) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/lily/ability_lily_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(range, range, range)) + ParticleManager:DestroyParticleSystemTime(effectIndex,keys.duration) +end + +function OnCreatedLily02Buff(keys) + local factor = 1 + if keys.target:GetUnitName() == "lily" then + local date = string.sub(GameRules.GameData.server_time,6,10) + if date >= "02-05" and date <= "05-05" then + factor = keys.self_crit + end + end + keys.target:AddDamageOutgoingAll(keys.damage_up * factor, "thtd_lily_02_damage_up") +end + +function OnDestroyLily02Buff(keys) + keys.target:AddDamageOutgoingAll("thtd_lily_02_damage_up") +end + diff --git a/scripts/vscripts/abilities/abilityluna.lua b/scripts/vscripts/abilities/abilityluna.lua new file mode 100755 index 0000000..2773577 --- /dev/null +++ b/scripts/vscripts/abilities/abilityluna.lua @@ -0,0 +1,169 @@ +function OnLuna01Attack(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local targetPoint = target:GetOrigin() + + local attackedTargets = {} + OnLuna01Damage(keys,target,1) + table.insert(attackedTargets, target) + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + local count = 1 + for k,v in pairs(targets) do + if count > keys.max_count then + break + end + if THTD_IsValid(v) and v ~= target then + OnLuna01Damage(keys,v,1 + keys.damage_up/100) + table.insert(attackedTargets, v) + count = count + 1 + end + end + + local fairyArea = nil + local hero = caster:GetOwner() + if hero~=nil and hero:IsNull()==false then + local fairyList = GetHeroFairyList(hero) + for k,v in pairs(fairyList) do + if v.luna == caster then + fairyArea = v + break + end + end + end + + if fairyArea ~= nil then + local pos1 = fairyArea.sunny:GetAbsOrigin() + local pos2 = fairyArea.star:GetAbsOrigin() + local pos3 = fairyArea.luna:GetAbsOrigin() + local center, radius = GetCircleCenterAndRadius(pos1,pos2,pos3) + local targetsTotal = {} + local fairyTargets = THTD_FindUnitsInRadius(caster,center,radius) + for _,v in pairs(fairyTargets) do + if v~=nil and v:IsNull()==false and v:IsAlive() and IsUnitInFairy(fairyArea,v) then + targetsTotal[v:GetEntityIndex()] = v + end + end + for k,v in pairs(targetsTotal) do + local isExist = false + for k2,v2 in pairs(attackedTargets) do + if v2 == v then + isExist = true + break + end + end + if isExist == false and THTD_IsValid(v) then + OnLuna01Damage(keys,v,1 + keys.damage_up/100) + end + end + end +end + +function OnLuna01Damage(keys,target,percentage) + local caster = EntIndexToHScript(keys.caster_entindex) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_luna/ability_luna_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 2, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 5, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * percentage + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + +function OnLuna02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + local foward = (targetPoint - caster:GetAbsOrigin()):Normalized() + + local targetsTotal = {} + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster:GetOrigin(), + caster:GetOrigin() + foward*1000, + nil, + 200, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + + local fairyArea = nil + local hero = caster:GetOwner() + if hero~=nil and hero:IsNull()==false then + local fairyList = GetHeroFairyList(hero) + for k,v in pairs(fairyList) do + if v.luna == caster then + fairyArea = v + break + end + end + end + + if fairyArea ~= nil then + local pos1 = fairyArea.sunny:GetAbsOrigin() + local pos2 = fairyArea.star:GetAbsOrigin() + local pos3 = fairyArea.luna:GetAbsOrigin() + local center, radius = GetCircleCenterAndRadius(pos1,pos2,pos3) + local fairyTargets = THTD_FindUnitsInRadius(caster,center,radius) + for _,v in pairs(fairyTargets) do + if v~=nil and v:IsNull()==false and v:IsAlive() and IsUnitInFairy(fairyArea,v) then + targetsTotal[v:GetEntityIndex()] = v + end + end + end + + for k,v in pairs(targets) do + targetsTotal[v:GetEntityIndex()] = v + end + targets = {} + + if caster:HasModifier("modifier_luna_02_buff") then + caster:RemoveModifierByName("modifier_luna_02_buff") + end + caster.luna_02_power_bonus = keys.bonus_power * table.count(targetsTotal) + keys.ability:ApplyDataDrivenModifier(caster,caster, "modifier_luna_02_buff", {Duration = keys.duration_time}) + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targetsTotal) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_luna/ability_luna_02_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()+Vector(0,0,128)) + ParticleManager:SetParticleControl(effectIndex, 1, caster:GetOrigin() + foward*1000 + Vector(0,0,128)) + ParticleManager:SetParticleControl(effectIndex, 3, caster:GetOrigin() + foward*1000 + Vector(0,0,128)) + ParticleManager:SetParticleControl(effectIndex, 9, caster:GetOrigin() + Vector(0,0,128)) + ParticleManager:DestroyParticleSystemTime(effectIndex,2.0) +end + +function OnCreatedLuna02Buff(keys) + local target = keys.target + + local bonus = target.luna_02_power_bonus + target:THTD_AddPowerPercentage(bonus, "thtd_luna_02_bonus") + target:THTD_AddAttackPercentage(bonus, "thtd_luna_02_bonus") +end + +function OnDestroyLuna02Buff(keys) + local target = keys.target + target:THTD_AddPowerPercentage("thtd_luna_02_bonus") + target:THTD_AddAttackPercentage("thtd_luna_02_bonus") +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitylunasa.lua b/scripts/vscripts/abilities/abilitylunasa.lua new file mode 100755 index 0000000..e55aa0c --- /dev/null +++ b/scripts/vscripts/abilities/abilitylunasa.lua @@ -0,0 +1,105 @@ + +function OnLunasa01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + caster:EmitSound("Sound_THTD.thtd_lunasa_01") + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius) + for k,v in pairs(targets) do + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_lunasa_01_debuff", nil) + + UpdatePrismriverComboName(caster,v) + + local comboName = GetPrismriverComboName(v) + if comboName == "lyricamerlinlunasa" then + OnLyricaMerlinLunasa(keys,caster,v) + ResetPrismriverComboName(v) + elseif comboName == "merlinlyricalunasa" then + OnMerlinLyricaLunasa(keys,caster,v) + ResetPrismriverComboName(v) + end + + local time = keys.duration_time + v:SetContextThink(DoUniqueString("thtd_lunasa01_debuff"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then return nil end + if v==nil or v:IsNull() or v:IsAlive()==false then return nil end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 0.5 + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + time = time - 0.5 + return 0.5 + end, + 0) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/lunasa/ability_lunasa_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnLunasa02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if keys.ability:GetLevel() < 1 then return end + + local abilty_01 = caster:FindAbilityByName("thtd_lunasa_01") + abilty_01:ApplyDataDrivenModifier(caster, target, "modifier_lunasa_01_debuff", nil) + + local time = abilty_01:GetSpecialValueFor("duration_time") + target:SetContextThink(DoUniqueString("thtd_lunasa02_debuff"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then return nil end + if target==nil or target:IsNull() or target:IsAlive()==false then return nil end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 0.5 + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + time = time - 0.5 + return 0.5 + end, + 0) + + UpdatePrismriverComboName(caster,target) +end + +function OnLyricaMerlinLunasa(keys,caster,target) + local modifier = target:FindModifierByName("modifier_lunasa_01_pause") + if modifier ~= nil then + modifier:SetDuration(keys.stun_time1,false) + else + keys.ability:ApplyDataDrivenModifier(caster,target,"modifier_lunasa_01_pause",{Duration = keys.stun_time1}) + end +end + +function OnMerlinLyricaLunasa(keys,caster,target) + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.radius) + for k,v in pairs(targets) do + local modifier = v:FindModifierByName("modifier_lunasa_01_pause") + if modifier ~= nil then + modifier:SetDuration(keys.stun_time2,false) + else + keys.ability:ApplyDataDrivenModifier(caster,v,"modifier_lunasa_01_pause",{Duration = keys.stun_time2}) + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitylyrica.lua b/scripts/vscripts/abilities/abilitylyrica.lua new file mode 100755 index 0000000..63af292 --- /dev/null +++ b/scripts/vscripts/abilities/abilitylyrica.lua @@ -0,0 +1,95 @@ + +function OnLyrica01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local isEnabled = false + if caster:FindAbilityByName("thtd_lyrica_02"):GetLevel() >= 1 then + isEnabled = true + end + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius) + for k,v in pairs(targets) do + UpdatePrismriverComboName(caster,v) + + if isEnabled then + if v:HasModifier("modifier_lunasa_01_debuff") then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/lunasa/ability_lunasa_music_buff.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + if v:HasModifier("modifier_merlin_01_debuff") then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/merlin/ability_merlin_music_buff.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 1) + if caster:HasModifier("modifier_lyrica_lunasa_merlin_combo") then + damage = damage * (1 + keys.damage_up/100) + end + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + if THTD_IsValid(v) then + local count = GetCountPrismriver(v) + local comboName = GetPrismriverComboName(v) + if comboName == "merlinlunasalyrica" then + OnMerlinLunasaLyrica(keys,caster,v,count) + ResetPrismriverComboName(v) + elseif comboName == "lunasamerlinlyrica" then + OnLunasaMerlinLyrica(keys,caster,v,count) + ResetPrismriverComboName(v) + end + end + end + + caster:EmitSound("Sound_THTD.thtd_lyrica_01") + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/lyrica/ability_lyrica_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnMerlinLunasaLyrica(keys,caster,target,count) + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.radius) + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 2) * (1 + keys.damage_up/100) * (1 + count) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/lyrica/ability_lyrica_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnLunasaMerlinLyrica(keys,caster,target,count) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 3) * (1 + keys.damage_up/100) * (1 + count) + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitymarisa.lua b/scripts/vscripts/abilities/abilitymarisa.lua new file mode 100755 index 0000000..406a56a --- /dev/null +++ b/scripts/vscripts/abilities/abilitymarisa.lua @@ -0,0 +1,369 @@ +local marisa_star_table = +{ + "particles/heroes/thtd_marisa/ability_marisa_02.vpcf", + "particles/heroes/thtd_marisa/ability_marisa_02_pink.vpcf", + "particles/heroes/thtd_marisa/ability_marisa_02_blue.vpcf", + "particles/heroes/thtd_marisa/ability_marisa_02_normal.vpcf", +} + +function OnMarisa01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster.spelling_lock == true then return end + caster.factor = 0 + + if caster.ability_dummy_unit~=nil then + caster.ability_dummy_unit:RemoveSelf() + keys.ability.effectcircle = -1 + ParticleManager:DestroyParticleSystem(keys.ability.effectcircle,true) + keys.ability.effectIndex = -1 + ParticleManager:DestroyParticleSystem(keys.ability.effectIndex,true) + keys.ability.effectIndex_b = -1 + ParticleManager:DestroyParticleSystem(keys.ability.effectIndex_b,true) + end + + local unit = CreateUnitByName( + "npc_dota2x_unit_marisa04_spark" + ,caster:GetOrigin() + ,false + ,caster + ,caster + ,caster:GetTeam() + ) + local ability_dummy_unit = unit:FindAbilityByName("ability_dummy_unit") + ability_dummy_unit:SetLevel(1) + + keys.ability.effectcircle = ParticleManager:CreateParticle("particles/heroes/marisa/marisa_04_spark_circle.vpcf", PATTACH_CUSTOMORIGIN, unit) + keys.ability.effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/marisa/marisa_04_spark.vpcf", PATTACH_CUSTOMORIGIN, unit) + keys.ability.effectIndex_b = ParticleManager:CreateParticle("particles/thd2/heroes/marisa/marisa_04_spark_wind_b.vpcf", PATTACH_CUSTOMORIGIN, unit) + keys.ability:SetContextNum("ability_marisa_04_spark_unit",unit:GetEntityIndex(),0) + + MarisaSparkParticleControl(caster,keys.ability,targetPoint) + keys.ability:SetContextNum("ability_marisa_04_spark_lock",0,0) + + caster.thtd_marisa_01_count = 1 + caster.thtd_marisa_01_last_distance = 10 + caster.thtd_marisa_01_currentForward = caster:GetForwardVector() + caster.ability_dummy_unit = unit + caster.spelling_lock = true + local locktime = keys.channel_time + caster:SetContextThink(DoUniqueString("thtd_marisa_lock"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if caster.spelling_lock == true then return nil end + if caster == nil or caster:IsNull() or caster:IsAlive() == false then return nil end + caster.spelling_lock = false + return nil + end, + locktime) +end + +function MarisaSparkParticleControl(caster,ability,targetPoint) + local unitIndex = ability:GetContext("ability_marisa_04_spark_unit") + local unit = EntIndexToHScript(unitIndex) + + if(ability.targetPoint == targetPoint)then + return + else + ability.targetPoint = targetPoint + end + + if(unit == nil or ability.effectIndex == -1 or ability.effectcircle == -1)then + return + end + + forwardRad = GetRadBetweenTwoVec2D(targetPoint,caster:GetOrigin()) + vecForward = Vector(math.cos(math.pi/2 + forwardRad),math.sin(math.pi/2 + forwardRad),0) + unit:SetForwardVector(vecForward) + vecUnit = caster:GetOrigin() + Vector(caster:GetForwardVector().x * 100,caster:GetForwardVector().y * 100,160) + vecColor = Vector(255,255,255) + unit:SetAbsOrigin(vecUnit) + + ParticleManager:SetParticleControl(ability.effectcircle, 0, caster:GetOrigin()) + + local effect2ForwardRad = GetRadBetweenTwoVec2D(caster:GetOrigin(),targetPoint) + local effect2VecForward = Vector(math.cos(effect2ForwardRad)*1400,math.sin(effect2ForwardRad)*1400,0) + caster:GetOrigin() + Vector(caster:GetForwardVector().x * 100,caster:GetForwardVector().y * 100,108) + + ParticleManager:SetParticleControl(ability.effectIndex, 0, caster:GetOrigin() + Vector(caster:GetForwardVector().x * 92,caster:GetForwardVector().y * 92,150)) + ParticleManager:SetParticleControl(ability.effectIndex, 1, effect2VecForward) + ParticleManager:SetParticleControl(ability.effectIndex, 2, vecColor) + local forwardRadwind = forwardRad + math.pi + ParticleManager:SetParticleControl(ability.effectIndex, 8, Vector(math.cos(forwardRadwind),math.sin(forwardRadwind),0)) + ParticleManager:SetParticleControl(ability.effectIndex, 9, caster:GetOrigin() + Vector(caster:GetForwardVector().x * 100,caster:GetForwardVector().y * 100,108)) + + ParticleManager:SetParticleControl(ability.effectIndex_b, 0, caster:GetOrigin() + Vector(caster:GetForwardVector().x * 92,caster:GetForwardVector().y * 92,150)) + ParticleManager:SetParticleControlForward(ability.effectIndex_b, 3, Vector(math.cos(forwardRadwind),math.sin(forwardRadwind),0)) +end + +function OnMarisa01SpellRemove(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + caster:THTD_AddPowerPercentage("thtd_marisa_03_bonus") + + local unitIndex = keys.ability:GetContext("ability_marisa_04_spark_unit") + + local unit = EntIndexToHScript(unitIndex) + if unit~=nil then + unit:RemoveSelf() + keys.ability.effectcircle = -1 + ParticleManager:DestroyParticleSystem(keys.ability.effectcircle,true) + keys.ability.effectIndex = -1 + ParticleManager:DestroyParticleSystem(keys.ability.effectIndex,true) + keys.ability.effectIndex_b = -1 + ParticleManager:DestroyParticleSystem(keys.ability.effectIndex_b,true) + end + keys.ability:SetContextNum("ability_marisa_04_spark_lock",1,0) + + if keys.ability:GetAbilityName() == "thtd_marisa_03" then + caster:StopSound("Sound_THTD.thtd_marisa_03") + else + caster:StopSound("Sound_THTD.thtd_marisa_01") + end + + caster.ability_dummy_unit = nil + caster.spelling_lock = false +end + +function FindMarisa01MaxCountEnemeiesForward(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local forwardVector = caster.thtd_marisa_01_currentForward + + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),keys.DamageLenth) + + if #targets <= 0 then + return nil,0 + end + local maxCount = 0 + + for i=1,120 do + local sparkRad = math.pi * i/60 + local count = 0 + for k,v in pairs(targets) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + if IsRadInRect(v:GetOrigin(),caster:GetOrigin(),keys.DamageWidth,keys.DamageLenth,sparkRad) then + count = count + 1 + end + end + end + if count > maxCount then + forwardVector = Vector(math.cos(sparkRad),math.sin(sparkRad),forwardVector.z) + maxCount = count + end + end + + return forwardVector,maxCount +end + +function GetMarisa01ForwardMove(forward,nextForward,rad) + local forwardVector = Vector(math.cos(rad)*forward.x - math.sin(rad)*forward.y, + forward.y*math.cos(rad) + forward.x*math.sin(rad), + 0) + return forwardVector +end + +function OnMarisa01SpellThink(keys) + if GameRules:IsGamePaused() then return end + if(keys.ability:GetContext("ability_marisa_04_spark_lock")==1)then + return + end + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + + if caster.factor == nil then + caster.factor = 0 + end + + if keys.ability:GetAbilityName() == "thtd_marisa_03" then + local nextForward,maxCount = FindMarisa01MaxCountEnemeiesForward(keys) + + if nextForward ~= nil then + local forward = GetMarisa01ForwardMove(caster.thtd_marisa_01_currentForward,nextForward,caster.thtd_marisa_01_count * math.pi/180) + local distance = GetDistanceBetweenTwoVec2D(forward, nextForward) + + if caster.thtd_marisa_01_last_distance <= distance then + caster.thtd_marisa_01_count = caster.thtd_marisa_01_count * -1 + end + caster.thtd_marisa_01_last_distance = distance + + local NowDamageTargets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster:GetOrigin(), + caster:GetOrigin() + keys.DamageLenth * caster.thtd_marisa_01_currentForward, + nil, + keys.DamageWidth, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + + local NowCount = 0 + + for k,v in pairs(NowDamageTargets) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + NowCount = NowCount + 1 + end + end + + if distance > math.sin(math.pi/18) and distance < 1.86 and NowCount~=maxCount then + caster:SetForwardVector(forward) + caster.thtd_marisa_01_currentForward = forward + end + else + caster:SetForwardVector(caster.thtd_marisa_01_currentForward) + end + + if caster.factor == 100 then + local powerUp = 0 + local pv = caster:GetAbilityPowerValue("thtd_marisa_03") + if pv ~= nil then + powerUp = pv[2] + end + local bonus = keys.power_up + powerUp + if caster:IsPower666() then + bonus = bonus * 2 + end + caster:THTD_AddPowerPercentage(bonus, "thtd_marisa_03_bonus") + end + end + + local targetPoint = vecCaster + caster.thtd_marisa_01_currentForward + + if caster.factor % 10 == 0 then + local DamageTargets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster:GetOrigin(), + caster:GetOrigin() + keys.DamageLenth * caster.thtd_marisa_01_currentForward, + nil, + keys.DamageWidth, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + + if #DamageTargets > 0 then + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_marisa_03") + if pv ~= nil then + powerDamage = pv[1] + end + + local deal_damage = (caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage()) * 0.2 + if caster:FindAbilityByName("thtd_marisa_02"):GetLevel() > 1 then + deal_damage = deal_damage * (1 + 0.01 * caster.factor) + end + if caster:IsPower666() then deal_damage = deal_damage * 2 end + if caster:IsPower999() then deal_damage = deal_damage * 4 end + for _,v in pairs(DamageTargets) do + local info = + { + Target = v, + Source = caster, + Ability = keys.ability, + EffectName = marisa_star_table[RandomInt(1,#marisa_star_table)], + iMoveSpeed = 1400, + vSourceLoc= caster:GetAbsOrigin(), -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, -- Optional + iVisionRadius = 400, -- Optional + iVisionTeamNumber = caster:GetTeamNumber() -- Optional + } + local projectile = ProjectileManager:CreateTrackingProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = deal_damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + end + end + end + caster.factor = caster.factor + 1 + MarisaSparkParticleControl(caster,keys.ability,targetPoint) +end + +function OnMarisa02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local targetPoint = target:GetOrigin() + + if keys.ability:GetLevel() < 1 then return end + + local count = 2 + + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),caster:Script_GetAttackRange()) + + caster:SetContextThink(DoUniqueString("thtd_marisa02_projectile"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if #targets > 0 then + local index = RandomInt(1,#targets) + local info = + { + Target = targets[index], + Source = caster, + Ability = keys.ability, + EffectName = marisa_star_table[RandomInt(1,#marisa_star_table)], + iMoveSpeed = 1400, + vSourceLoc= caster:GetAbsOrigin(), -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, -- Optional + iVisionRadius = 400, -- Optional + iVisionTeamNumber = caster:GetTeamNumber() -- Optional + } + local projectile = ProjectileManager:CreateTrackingProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + caster:EmitSound("Hero_Marisa.PreAttack") + + if count > 0 then + count = count - 1 + return 0.1 + end + end + return nil + end, + 0.1) +end + +function OnMarisa02SpellHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + target:EmitSound("Hero_Marisa.ProjectileImpact") + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_marisa_02") + if pv ~= nil then + powerDamage = pv[1] + end + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + powerDamage/100), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + if keys.ability:GetAbilityName() == "thtd_marisa_02" then + caster:GiveMana(eys.mana) + end + end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitymedicine.lua b/scripts/vscripts/abilities/abilitymedicine.lua new file mode 100755 index 0000000..c7ca36f --- /dev/null +++ b/scripts/vscripts/abilities/abilitymedicine.lua @@ -0,0 +1,171 @@ +-- 回头、方向旋转角度实现可参考 +function OnMedicine01AttackLandedOld(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local modifier = target:FindModifierByName("modifier_medicine_01_slow") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_medicine_01_slow", {Duration = keys.duration_time}) + + local time =keys.duration_time + local tick = keys.tick_time + target:AddPoison(1, caster) + target:SetContextThink(DoUniqueString("thtd_medicine01_debuff"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if THTD_IsValid(target) == false then return nil end + if time <= 0 then + target:AddPoison(-1) + return nil + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * tick + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + time = time - tick + return tick + end, + 0) + + if target.thtd_is_fearing ~= true then + target.thtd_is_fearing = true + local current_next_move_point = target.next_move_point + target.next_move_point = RotatePosition(target:GetOrigin(), QAngle(0,RandomInt(-70, 70),0), target:GetOrigin() - target:GetForwardVector() * 500) + local time = keys.fear_time + target:SetContextThink(DoUniqueString("modifier_medicine_01_debuff"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if not IsValidAlive(target) then + return nil + end + if time <= 0 or THTD_IsValid(caster) == false then + target.next_move_point = current_next_move_point + target.thtd_is_fearing = false + return nil + end + + time = time - 0.1 + return 0.1 + end, + 0) + end + else + modifier:SetDuration(keys.duration_time,false) + end +end + +function OnMedicine01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local modifier = target:FindModifierByName("modifier_medicine_01_slow") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_medicine_01_slow", {Duration = keys.duration_time}) + else + modifier:SetDuration(keys.duration_time,false) + end + + local time = keys.duration_time + local tick = keys.tick_time + target:AddPoison(1, caster) + target:SetContextThink(DoUniqueString("thtd_medicine01_debuff"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if THTD_IsValid(target) == false then return nil end + if time <= 0 then + target:AddPoison(-1) + return nil + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * tick * target:GetPoisonCount() + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + time = time - tick + return tick + end, + 0) +end + +function OnMedicine02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_medicine/ability_medicine_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystemTime(effectIndex, keys.duration_time) + + local time = math.floor(keys.duration_time * 100 + 0.5) / 100 + local tick = math.floor(keys.tick_time * 100 + 0.5) / 100 + -- print(keys.duration_time, time) + -- print(keys.tick_time, tick) + -- local startTime = GameRules:GetGameTime() + caster:SetContextThink(DoUniqueString("modifier_medicine_02_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then + -- print("----- ability end") + -- print(GameRules:GetGameTime() - startTime) + return nil + end + if THTD_IsValid(caster) == false then + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * tick + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + for k,v in pairs(targets) do + if v.thtd_is_fearing ~= true then + v.thtd_is_fearing = true + + v:AddPoison(1, caster) + local current_next_move_point = v.next_move_point + v.next_move_point = targetPoint + + v:SetContextThink(DoUniqueString("modifier_medicine_02_debuff"), + function() + if GameRules:IsGamePaused() then return 0.03 end + + if not IsValidAlive(v) then + return nil + end + if time <= 0 or THTD_IsValid(caster) == false then + v.next_move_point = current_next_move_point + v.thtd_is_fearing = false + return nil + end + return 0.1 + end, + 0) + end + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + time = time - tick + return tick + end, + 0) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitymeirin.lua b/scripts/vscripts/abilities/abilitymeirin.lua new file mode 100755 index 0000000..4683405 --- /dev/null +++ b/scripts/vscripts/abilities/abilitymeirin.lua @@ -0,0 +1,316 @@ +local thtd_meirin_01_activity = +{ + [1] = + { + ["action"] = ACT_DOTA_ATTACK, + ["duration"] = 0.55, + func = function(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local vecCaster = caster:GetOrigin() + local targetPoint = caster:GetOrigin() + caster:GetForwardVector()*800 + --caster:EmitSoundParams("Hero_KeeperOfTheLight.Illuminate.Discharge",1,0.1,2) + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster:GetOrigin(), + caster:GetOrigin() + caster:GetForwardVector()*800, + nil, + 300, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + for k,v in pairs(targets) do + local DamageTable_aoe = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable_aoe) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_meirin/ability_meirin_01_step_1.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, vecCaster+Vector(0,0,32)) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint+Vector(0,0,32)) + ParticleManager:SetParticleControl(effectIndex, 9, vecCaster+Vector(0,0,32)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + }, + [2] = + { + ["action"] = ACT_DOTA_ATTACK2, + ["duration"] = 0.55, + func = function(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local targetPoint = caster:GetOrigin() + caster:GetForwardVector()*800 + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + damage = damage * (1 + keys.damage_up)^1 + --caster:EmitSoundParams("Hero_Tusk.WalrusPunch.Target",1,0.3,2) + + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),800) + + for k,v in pairs(targets) do + local vVec = v:GetOrigin() + local vecRad = GetRadBetweenTwoVec2D(targetPoint,vecCaster) + + if(IsPointInCircularSector(vVec.x,vVec.y,math.cos(vecRad),math.sin(vecRad),800,math.pi*2/3,vecCaster.x,vecCaster.y))then + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + end + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_meirin/ability_meirin_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, caster:GetOrigin()) + ParticleManager:SetParticleControlForward(effectIndex, 1 , caster:GetForwardVector()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + }, + [3] = + { + ["action"] = ACT_DOTA_CAST_ABILITY_4, + ["duration"] = 0.55, + func = function(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local targetPoint = caster:GetOrigin() + caster:GetForwardVector()*400 + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + damage = damage * (1 + keys.damage_up)^2 + -- caster:EmitSoundParams("Hero_EarthShaker.EchoSlamSmall",1,0.5,2) + caster:EmitSound("Hero_EarthShaker.EchoSlamSmall") + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,400) + + for k,v in pairs(targets) do + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_meirin_01_slow_buff", {}) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_meirin/ability_meirin_01_step_2.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(800,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(255,140,0)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + }, + [4] = + { + ["action"] = ACT_DOTA_CAST_ABILITY_5, + ["duration"] = 0.55, + func = function(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local targetPoint = caster:GetOrigin() + caster:GetForwardVector()*800 + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + damage = damage * (1 + keys.damage_up)^3 + --caster:EmitSoundParams("Hero_Tusk.WalrusPunch.Target",1,0.35,2) + + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),800) + + for k,v in pairs(targets) do + local vVec = v:GetOrigin() + local vecRad = GetRadBetweenTwoVec2D(targetPoint,vecCaster) + + if(IsPointInCircularSector(vVec.x,vVec.y,math.cos(vecRad),math.sin(vecRad),800,math.pi*2/3,vecCaster.x,vecCaster.y))then + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + end + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_meirin/ability_meirin_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, caster:GetOrigin()) + ParticleManager:SetParticleControlForward(effectIndex, 1 , caster:GetForwardVector()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + }, + [5] = + { + ["action"] = ACT_DOTA_CAST_ABILITY_4, + ["duration"] = 0.55, + func = function(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local targetPoint = caster:GetOrigin() + caster:GetForwardVector()*400 + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + damage = damage * (1 + keys.damage_up)^4 + --caster:EmitSoundParams("Hero_Tusk.WalrusPunch.Damage",1,0.4,2) + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,400) + local stun_time = caster:GetAbilityValue("thtd_meirin_02", "level5_stun_time") + + for k,v in pairs(targets) do + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + UnitStunTarget(caster,v,stun_time) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_meirin/ability_meirin_01_step_3.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(800,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(255,140,0)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + }, + [6] = + { + ["action"] = ACT_DOTA_CAST_ABILITY_6, + ["duration"] = 0.55, + func = function(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local vecCaster = caster:GetOrigin() + local targetPoint = caster:GetOrigin() + caster:GetForwardVector()*800 + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + damage = damage * (1 + keys.damage_up)^5 + --caster:EmitSoundParams("Hero_KeeperOfTheLight.Illuminate.Discharge",1,0.25,2) + + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster:GetOrigin(), + caster:GetOrigin() + caster:GetForwardVector()*800, + nil, + 300, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + for k,v in pairs(targets) do + local DamageTable_aoe = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable_aoe) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_meirin/ability_meirin_01_step_1.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, vecCaster+Vector(0,0,32)) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint+Vector(0,0,32)) + ParticleManager:SetParticleControl(effectIndex, 9, vecCaster+Vector(0,0,32)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + }, + [7] = + { + ["action"] = ACT_DOTA_CAST_ABILITY_4, + ["duration"] = 0.55, + func = function(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local targetPoint = caster:GetOrigin() + caster:GetForwardVector()*400 + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + damage = damage * (1 + keys.damage_up)^6 + -- damage = damage * 3 + -- caster:EmitSoundParams("Hero_ElderTitan.EchoStomp",1,0.45,2) + caster:EmitSound("Hero_ElderTitan.EchoStomp") + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,400) + local stun_time = caster:GetAbilityValue("thtd_meirin_02", "level7_stun_time") + + for k,v in pairs(targets) do + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + UnitStunTarget(caster,v,stun_time) + end + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_meirin/ability_meirin_01_step_4.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(800,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(221,160,221)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + }, +} + +function OnMeirin01AttackThink(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if keys.ability:GetLevel() < 1 or caster:THTD_IsHidden() then return end + + if caster.thtd_meirin_01_attack_step == nil then + caster.thtd_meirin_01_attack_step = 1 + end + + if caster:HasModifier("modifier_meirin_01_pause") == false then + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),500) + if #targets > 0 and targets[1]~=nil and targets[1]:IsNull()==false and targets[1]:IsAlive() then + keys.target = targets[1] + local ability2 = caster:FindAbilityByName("thtd_meirin_02") + local chance = 100 + local stun_time = 0 + local level = 3 + if ability2:IsActivated() then + level = 7 + if caster.thtd_meirin_01_attack_step == 4 then + chance = ability2:GetSpecialValueFor("level4_chance") + elseif caster.thtd_meirin_01_attack_step == 6 then + chance = ability2:GetSpecialValueFor("level6_chance") + end + end + + if caster.thtd_meirin_01_attack_step <= level and RollPercentage(chance) then + caster:StartGestureWithPlaybackRate(thtd_meirin_01_activity[caster.thtd_meirin_01_attack_step]["action"],1) + local func = thtd_meirin_01_activity[caster.thtd_meirin_01_attack_step].func + caster:EmitSound("Hero_Axe.PreAttack") + caster:SetContextThink(DoUniqueString("modifier_meirin_01_attack"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if func then + func(keys) + end + return nil + end, + thtd_meirin_01_activity[caster.thtd_meirin_01_attack_step]["duration"]) + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_meirin_01_pause", {duration=thtd_meirin_01_activity[caster.thtd_meirin_01_attack_step]["duration"]}) + caster.thtd_meirin_01_attack_step = caster.thtd_meirin_01_attack_step + 1 + else + caster.thtd_meirin_01_attack_step = 1 + end + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitymerlin.lua b/scripts/vscripts/abilities/abilitymerlin.lua new file mode 100755 index 0000000..5018826 --- /dev/null +++ b/scripts/vscripts/abilities/abilitymerlin.lua @@ -0,0 +1,87 @@ + +function OnMerlin01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + caster:EmitSound("Sound_THTD.thtd_merlin_01") + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_merlin_01_debuff", nil) + + UpdatePrismriverComboName(caster,v) + + local comboName = GetPrismriverComboName(v) + if comboName == "lunasalyricamerlin" then + OnLunasaLyricaMerlin(keys,caster,v) + ResetPrismriverComboName(v) + elseif comboName == "lyricalunasamerlin" then + OnLyricaLunasaMerlin(keys,caster,v) + ResetPrismriverComboName(v) + end + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/merlin/ability_merlin_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnMerlin01Created(keys) + keys.target:AddDamageOutgoingAll(keys.outgoing_percent, "thtd_merlin_01_damage_up") +end + +function OnMerlin01Destroy(keys) + keys.target:AddDamageOutgoingAll("thtd_merlin_01_damage_up") +end + +function OnMerlin02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + if keys.ability:GetLevel() < 1 then return end + + local abilty_01 = caster:FindAbilityByName("thtd_merlin_01") + abilty_01:ApplyDataDrivenModifier(caster, target, "modifier_merlin_01_debuff", nil) + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + UpdatePrismriverComboName(caster,target) +end + +function OnLunasaLyricaMerlin(keys,caster,target) + local targets = THTD_FindFriendlyUnitsInRadius(caster,caster:GetOrigin(),2500) + for k,v in pairs(targets) do + local unitName = v:GetUnitName() + if unitName == "lunasa" or unitName == "merlin" or unitName == "lyrica" then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_merlin_01_buff", nil) + end + end +end + +function OnLyricaLunasaMerlin(keys,caster,target) + local targets = THTD_FindFriendlyUnitsInRadius(caster,caster:GetOrigin(),2500) + for k,v in pairs(targets) do + local unitName = v:GetUnitName() + if unitName == "lunasa" or unitName == "merlin" or unitName == "lyrica" then + v:GiveMana(keys.mana_regen) + end + end +end diff --git a/scripts/vscripts/abilities/abilitymiko.lua b/scripts/vscripts/abilities/abilitymiko.lua new file mode 100755 index 0000000..fe77845 --- /dev/null +++ b/scripts/vscripts/abilities/abilitymiko.lua @@ -0,0 +1,339 @@ +function OnMiko01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local forward = caster:GetForwardVector() + + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/miko/ability_miko_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()+Vector(0,0,64)) + ParticleManager:SetParticleControlForward(effectIndex , 0, caster:GetForwardVector()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_miko_01_pose", {}) + + local bonus = math.floor(keys.power_damage2 * caster:THTD_GetStarDamage()) + for i=1,3 do + local rollRad = (i-2)*math.pi/4 + local currentPoint = Vector(math.cos(rollRad)*forward.x - math.sin(rollRad)*forward.y, + forward.y*math.cos(rollRad) + forward.x*math.sin(rollRad), + 0) * keys.range + caster:GetOrigin() + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster:GetOrigin(), + currentPoint, + nil, + 200, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 1) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + if THTD_IsValid(v) then + v:AddDamageBlockAll(-bonus, "thtd_miko_01_bonus") + local modifier = v:FindModifierByName("modifier_miko_01_debuff") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_miko_01_debuff", {}) + else + modifier:SetDuration(keys.duration_time, false) + end + end + end + end + +end + +function OnDestroyMiko01DeBuff(keys) + keys.target:AddDamageBlockAll("thtd_miko_01_bonus") +end + +function OnMiko02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if THTD_IsTempleOfGodCanBuffedTower(target) then + if caster.thtd_miko_02_religious_count == nil then + caster.thtd_miko_02_religious_count = 0 + end + + if caster.thtd_miko_02_religious_count >= 6000 and target:HasModifier("modifier_miko_02_buff") == false then + local unitName = target:GetUnitName() + if unitName == "soga" then + target.thtd_miko_buff_soga01 = keys.soga01_cd + target.thtd_miko_buff_soga03 = keys.soga03_cd + elseif unitName == "futo" then + target.thtd_miko_buff_futo03 = keys.futo03_up + elseif unitName == "yoshika" then + target.thtd_miko_buff_yoshika = keys.yoshika + elseif unitName == "seiga" then + target.thtd_miko_buff_seiga = keys.seiga + end + caster:RemoveModifierByName("modifier_miko_02_ready") + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_miko_02_buff", {}) + caster.thtd_miko_02_religious_count = 0 + end + end +end + +function OnMiko02SpellThink(keys) + if GameRules:IsGamePaused() then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local targets = THTD_FindFriendlyUnitsInRadius(caster,caster:GetOrigin(),1500) + + for k,v in pairs(targets) do + if THTD_IsTempleOfGodCanBuffedTower(v) then + if caster.thtd_miko_02_religious_count == nil then + caster.thtd_miko_02_religious_count = 0 + end + if caster.thtd_miko_02_religious_count < 6000 then + caster.thtd_miko_02_religious_count = caster.thtd_miko_02_religious_count + 1 + SendOverheadEventMessage(caster:GetPlayerOwner(), OVERHEAD_ALERT_BONUS_POISON_DAMAGE, caster, caster.thtd_miko_02_religious_count, caster:GetPlayerOwner() ) + elseif caster:HasModifier("modifier_miko_02_ready") == false then + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_miko_02_ready", {}) + end + end + end + + local count = 0 + local friends = THTD_FindFriendlyUnitsAll(caster) + for k,v in pairs(friends) do + if THTD_IsTempleOfGodCanBuffedTower(v) then + local modifier = v:FindModifierByName("modifier_miko_02_buff") + if modifier ~= nil then + if modifier:GetCaster() == caster then + count = count + 1 + end + end + end + end + if count > 0 then + if count ~= caster.thtd_miko_03_count then + caster:THTD_AddBasePower(keys.bonus_power * count, "thtd_miko_03_bonus") + caster:THTD_AddBaseAttack(keys.bonus_power * count, "thtd_miko_03_bonus") + caster:THTD_AddCritChance(keys.bonus_chance * count, "thtd_miko_03_bonus") + caster:THTD_AddCritDamage(keys.bonus_crit * count, "thtd_miko_03_bonus") + caster.thtd_miko_03_count = count + end + else + caster:THTD_AddBasePower("thtd_miko_03_bonus") + caster:THTD_AddBaseAttack("thtd_miko_03_bonus") + caster:THTD_AddCritChance("thtd_miko_03_bonus") + caster:THTD_AddCritDamage("thtd_miko_03_bonus") + if count ~= caster.thtd_miko_03_count then + caster.thtd_miko_03_count = count + end + end +end + +function OnMiko03SpellHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + +function OnMiko03SpellThink(keys) + if GameRules:IsGamePaused() then return end + if keys.ability:GetLevel() < 1 then return end + + local caster = EntIndexToHScript(keys.caster_entindex) + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),1200) + + if #targets > 0 then + local index = RandomInt(1,#targets) + if IsValidAlive(targets[index]) then + local info = + { + Target = targets[index], + Source = caster, + Ability = keys.ability, + EffectName = "particles/heroes/thtd_miko/ability_miko_03.vpcf", + iMoveSpeed = 1400, + vSourceLoc= caster:GetAbsOrigin(), -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, -- Optional + iVisionRadius = 400, -- Optional + iVisionTeamNumber = caster:GetTeamNumber() -- Optional + } + local projectile = ProjectileManager:CreateTrackingProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + + local friends = THTD_FindFriendlyUnitsAll(caster) + for k,believer in pairs(friends) do + if believer:HasModifier("modifier_miko_02_buff") then + local index_extra = RandomInt(1,#targets) + if IsValidAlive(targets[index_extra]) then + local info_extra = + { + Target = targets[index_extra], + Source = caster, + Ability = keys.ability, + EffectName = "particles/heroes/thtd_miko/ability_miko_03.vpcf", + iMoveSpeed = 1400, + vSourceLoc= caster:GetAbsOrigin(), -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, -- Optional + iVisionRadius = 400, -- Optional + iVisionTeamNumber = caster:GetTeamNumber() -- Optional + } + local projectile_extra = ProjectileManager:CreateTrackingProjectile(info_extra) + ParticleManager:DestroyLinearProjectileSystem(projectile_extra,false) + end + end + end + end + end +end + + +function OnCreatedMiko04(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local forward = caster:GetForwardVector() + local ability = caster:FindAbilityByName("thtd_miko_01") + + local power_damage2 = ability:GetSpecialValueFor("power_damage2") + local range = ability:GetSpecialValueFor("range") + local duration_time = math.floor(ability:GetSpecialValueFor("duration_time") * 100 + 0.5) / 100 + + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/miko/ability_miko_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()+Vector(0,0,64)) + ParticleManager:SetParticleControlForward(effectIndex , 0, caster:GetForwardVector()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local bonus = math.floor(power_damage2 * caster:THTD_GetStarDamage()) + for i=1,3 do + local rollRad = (i-2)*math.pi/4 + local currentPoint = Vector(math.cos(rollRad)*forward.x - math.sin(rollRad)*forward.y, + forward.y*math.cos(rollRad) + forward.x*math.sin(rollRad), + 0) * range + caster:GetOrigin() + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster:GetOrigin(), + currentPoint, + nil, + 200, + ability:GetAbilityTargetTeam(), + ability:GetAbilityTargetType(), + ability:GetAbilityTargetFlags() + ) + local damage = caster:THTD_GetAbilityPowerDamage(ability, 1) + for k,v in pairs(targets) do + local DamageTable = { + ability = ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + if THTD_IsValid(v) then + v:AddDamageBlockAll(-bonus, "thtd_miko_01_bonus") + local modifier = v:FindModifierByName("modifier_miko_01_debuff") + if modifier == nil then + ability:ApplyDataDrivenModifier(caster, v, "modifier_miko_01_debuff", {}) + else + modifier:SetDuration(duration_time, false) + end + end + end + end +end + +function OnMiko04SpellThink(keys) + if GameRules:IsGamePaused() then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local inners = THTD_FindUnitsInner(caster) + local friends = THTD_FindFriendlyUnitsAll(caster) + + local castUnits = {} + for k,v in pairs(friends) do + if v == caster then + table.insert(castUnits, v) + elseif v:HasModifier("modifier_miko_02_buff") then + local modifier = v:FindModifierByName("modifier_miko_04_pose") + if modifier == nil then + table.insert(castUnits, v) + elseif modifier:GetCaster() == caster then + table.insert(castUnits, v) + end + end + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + + for index,believer in pairs(castUnits) do + local modifier = believer:FindModifierByName("modifier_miko_04_pose") + if modifier == nil then + -- tick+0.1 + keys.ability:ApplyDataDrivenModifier(caster, believer, "modifier_miko_04_pose", {Duration = 0.5}) + else + modifier:SetDuration(0.5, false) + end + if believer ~= caster then + modifier = believer:FindModifierByName("modifier_miko_04_pose_other") + if modifier == nil then + -- tick+0.1 + keys.ability:ApplyDataDrivenModifier(caster, believer, "modifier_miko_04_pose_other", {Duration = 0.5}) + else + modifier:SetDuration(0.5, false) + end + end + + for k,v in pairs(inners) do + if RandomInt(1,3) == 1 then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_miko/ability_thtd_miko_04_starfall.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 2, RandomVector(255)) + ParticleManager:SetParticleControl(effectIndex, 4, Vector(255,255,255)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + caster:SetContextThink(DoUniqueString("thtd_miko_04_star_fall"), + function() + if GameRules:IsGamePaused() then return 0.03 end + + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = 0 + } + UnitDamageTarget(damage_table) + return nil + end, + 0.5) + end + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityminamitsu.lua b/scripts/vscripts/abilities/abilityminamitsu.lua new file mode 100755 index 0000000..9b22d50 --- /dev/null +++ b/scripts/vscripts/abilities/abilityminamitsu.lua @@ -0,0 +1,463 @@ +local BasePoint = +{ + [0] = Vector(-3880,1880,128), + [1] = Vector(3880,1880,128), + [2] = Vector(3880,-1880,128), + [3] = Vector(-3880,-1880,128), +} + +local StartPoint1 = +{ + [0] = Vector(-4300,1588,128), + [1] = Vector(4300,1588,128), + [2] = Vector(4300,-1588,128), + [3] = Vector(-4300,-1588,128), +} + +local EndPoint1 = +{ + [0] = Vector(-1750,1588,128), + [1] = Vector(1750,1588,128), + [2] = Vector(1750,-1588,128), + [3] = Vector(-1750,-1588,128), +} + +local StartPoint2 = +{ + [0] = Vector(-4150,4100,128), + [1] = Vector(4150,4100,128), + [2] = Vector(4150,-4100,128), + [3] = Vector(-4150,-4100,128), +} + +local EndPoint2 = +{ + [0] = Vector(-4150,1600,128), + [1] = Vector(4150,1600,128), + [2] = Vector(4150,-1600,128), + [3] = Vector(-4150,-1600,128), +} + +function OnMinamitsu01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local hero = caster:GetOwner() + local id = caster:GetPlayerOwnerID() + + local targetPoint, forward + local pos = caster:GetAbsOrigin() + if math.abs(pos.x - BasePoint[id].x) > math.abs(pos.y - BasePoint[id].y) then + targetPoint = StartPoint1[id] + forward = (EndPoint1[id] - StartPoint1[id]):Normalized() + caster.thtd_minamitsu_01_first = true + caster.water_start_point = StartPoint1[id] + caster.water_end_point = EndPoint1[id] + else + targetPoint = StartPoint2[id] + forward = (EndPoint2[id] - StartPoint2[id]):Normalized() + caster.thtd_minamitsu_01_first = false + caster.water_start_point = StartPoint2[id] + caster.water_end_point = EndPoint2[id] + end + + if caster.thtd_minamitsu_01_rect == nil then + caster.thtd_minamitsu_01_rect = {} + end + + if caster.thtd_minamitsu_01_rect["effectIndexList"] ~= nil then + for k,v in pairs(caster.thtd_minamitsu_01_rect["effectIndexList"]) do + ParticleManager:DestroyParticleSystem(v,true) + end + end + + caster.thtd_minamitsu_01_rect = + { + ["rectOrigin"] = targetPoint, + ["rectForward"] = forward, + ["effectIndexList"] = {} + } + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 1, forward*600) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + + local time = 4 + caster:SetContextThink(DoUniqueString("thtd_minamitsu_01_move_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time > 0 then + time = time - 0.2 + local waterIndex = ParticleManager:CreateParticle("particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship_water.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(waterIndex, 3, targetPoint+forward*600*(4 - time)) + table.insert(caster.thtd_minamitsu_01_rect["effectIndexList"],waterIndex) + return 0.2 + else + return nil + end + end, + 0) +end + +function OnMinamitsu01DebuffThink(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.thtd_minamitsu_01_rect ~= nil and caster.thtd_minamitsu_01_rect["rectOrigin"] ~= nil then + if caster:THTD_IsHidden() then + for k,v in pairs(caster.thtd_minamitsu_01_rect["effectIndexList"]) do + ParticleManager:DestroyParticleSystem(v,true) + end + caster.thtd_minamitsu_01_rect = + { + ["rectOrigin"] = nil, + ["rectForward"] = nil, + ["effectIndexList"] = {} + } + else + local enemies = FindUnitsInLine( + caster:GetTeamNumber(), + caster.thtd_minamitsu_01_rect["rectOrigin"], + caster.thtd_minamitsu_01_rect["rectOrigin"]+caster.thtd_minamitsu_01_rect["rectForward"]*2500, + nil, + 300, + DOTA_UNIT_TARGET_TEAM_ENEMY, + DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + 0) + for k,v in pairs(enemies) do + local modifier = v:FindModifierByName("modifier_minamitsu_01_slow_buff") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_minamitsu_01_slow_buff", {duration=0.2}) + else + modifier:SetDuration(0.2,false) + end + end + end + end +end + +function OnCreatedMinamitsu02Buff(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + -- local effectIndex = ParticleManager:CreateParticle("particles/heroes/minamitsu/ability_minamitsu_03.vpcf", PATTACH_CUSTOMORIGIN, caster) + -- ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "attach_minamitsu_attack", Vector(0,0,0), true) + + local powerBonus = 0 + local powerCd = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then + powerBonus = pv[1] + powerCd = pv[2] + end + if powerCd > 0 then + caster:ReCooldown(keys.ability, powerCd) + end + + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/minamitsu/ability_minamitsu_03_body.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex2 , 0, caster, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex2 , 1, caster, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex2 , 3, caster, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex2 , 4, caster, 5, "follow_origin", Vector(0,0,0), true) + + ParticleManager:DestroyParticleSystemTime(effectIndex2, keys.ability_duration) + + local bonus = keys.power_bonus + powerBonus + target:THTD_AddPowerPercentage(bonus, "thtd_minamitsu_03_bonus") + target:THTD_AddAttackPercentage(bonus, "thtd_minamitsu_03_bonus") +end + +function OnDestroyMinamitsu02Buff(keys) + local target = keys.target + target:THTD_AddPowerPercentage("thtd_minamitsu_03_bonus") + target:THTD_AddAttackPercentage("thtd_minamitsu_03_bonus") +end + +function OnMinamitsu02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local target = keys.target + + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.Radius) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = keys.ability:GetAbilityTargetFlags() + } + UnitDamageTarget(damage_table) + end + local effectIndex = ParticleManager:CreateParticle("particles/econ/items/kunkka/divine_anchor/hero_kunkka_dafx_weapon/kunkka_spell_tidebringer_fxset.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, vecCaster) + ParticleManager:SetParticleControlForward(effectIndex, 0, caster:GetForwardVector()) + ParticleManager:SetParticleControl(effectIndex, 18, vecCaster) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnMinamitsu03SpellStart(keys) + if keys.ability:GetLevel() < 1 then return end + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.thtd_minamitsu_01_rect == nil or caster.thtd_minamitsu_01_rect["rectOrigin"] == nil then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="only_water_area_use"}) + return + end + + local targetPoint = keys.target_points[1] + local isValidPoint = false + local id = caster:GetPlayerOwnerID() + if caster.thtd_minamitsu_01_first == true then + if math.abs(targetPoint.x - StartPoint1[id].x) + math.abs(targetPoint.x - EndPoint1[id].x) <= math.abs(StartPoint1[id].x - EndPoint1[id].x) + 10 and math.abs(targetPoint.y - StartPoint1[id].y) <= 250 then + isValidPoint = true + end + else + if math.abs(targetPoint.y - StartPoint2[id].y) + math.abs(targetPoint.y - EndPoint2[id].y) <= math.abs(StartPoint2[id].y - EndPoint2[id].y) + 10 and math.abs(targetPoint.x - StartPoint2[id].x) <= 250 then + isValidPoint = true + end + end + if isValidPoint then + local vecCaster = caster:GetOrigin() + local distance = GetDistanceBetweenTwoVec2D(vecCaster,targetPoint) + local speed = distance * 0.03 + local rad = GetRadBetweenTwoVec2D(vecCaster,targetPoint) + local vecHook = caster:GetOrigin() + local forwardVector = caster:GetForwardVector() + local timeCount = 0 + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/minamitsu/ability_minamitsu_02_body.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 3, vecHook) + ParticleManager:SetParticleControlForward(effectIndex, 3, forwardVector) + + caster:SetContextThink( + DoUniqueString("ability_thdots_minamitsu_02_stage_01"), + function () + if GameRules:IsGamePaused() then + return 0.03 + end + timeCount = timeCount + 0.03 + distance = distance - speed + if distance >= 0 then + vecHook = vecHook + Vector(math.cos(rad)*speed,math.sin(rad)*speed,0) + ParticleManager:SetParticleControl(effectIndex, 3, vecHook) + else + ParticleManager:DestroyParticleSystem(effectIndex,true) + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/minamitsu/ability_minamitsu_02.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex2, 0, vecHook) + ParticleManager:SetParticleControl(effectIndex2, 3, vecHook) + Timer.Wait 'OnMinamitsu02Vortex' (0.5, + function() + caster:EmitSound("Voice_Thdots_Minamitsu.AbilityMinamitsu022") + OnMinamitsu02Vortex(keys,caster.thtd_minamitsu_01_rect["rectOrigin"],caster.thtd_minamitsu_01_rect["rectForward"]) + end + ) + Timer.Wait 'OnMinamitsu02Vortex' (3.2, + function() + ParticleManager:SetParticleControl(effectIndex2, 0, caster.thtd_minamitsu_01_rect["rectOrigin"]+caster.thtd_minamitsu_01_rect["rectForward"]*2500) + ParticleManager:SetParticleControl(effectIndex2, 3, caster.thtd_minamitsu_01_rect["rectOrigin"]+caster.thtd_minamitsu_01_rect["rectForward"]*2500) + end + ) + return nil + end + return 0.03 + end, + 0.03 + ) + else + keys.ability:EndCooldown() + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="only_water_area_use"}) + end +end + +function OnMinamitsu02Vortex(keys,origin,forward) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local targetPoint = keys.target_points[1] + local distance = GetDistanceBetweenTwoVec2D(vecCaster,targetPoint) + local rad = GetRadBetweenTwoVec2D(vecCaster,targetPoint) + local timeCount = 0 + caster.ability_minamitsu_02_group = {} + local range = keys.range + + caster:SetContextThink(DoUniqueString("ability_thdots_minamitsu_02_stage_02"), + function () + if GameRules:IsGamePaused() then return 0.03 end + + timeCount = timeCount + 0.15 + local targets = THTD_FindUnitsInRadius(caster,targetPoint,range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 0.15 + for k,v in pairs(targets) do + if v:IsNull() == false and v~=nil then + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = keys.ability:GetAbilityTargetFlags() + } + UnitDamageTarget(damage_table) + table.insert(caster.ability_minamitsu_02_group,v) + + if v:HasModifier("modifier_minamitsu02_vortex_pause_target") == false then + keys.ability:ApplyDataDrivenModifier( caster, v, "modifier_minamitsu02_vortex_pause_target", {} ) + end + if v:HasModifier("modifier_minamitsu02_vortex_target") == false then + local vecTarget = v:GetOrigin() + local distance = GetDistanceBetweenTwoVec2D(vecTarget,targetPoint) + local targetRad = GetRadBetweenTwoVec2D(targetPoint,vecTarget) + if distance > 150 then + v:SetAbsOrigin(Vector(vecTarget.x - math.cos(targetRad - math.pi/3) * 55 * 1.5, vecTarget.y - math.sin(targetRad - math.pi/3) * 55 * 1.5, vecTarget.z)) + else + -- v:AddNoDraw() + keys.ability:ApplyDataDrivenModifier( caster, v, "modifier_minamitsu02_vortex_target", {} ) + v:SetAbsOrigin(targetPoint) + end + end + end + end + if timeCount >= 1.5 then + Timer.Wait 'OnMinamitsu02Vortex_starge_2' (1.0, + function() + caster:EmitSound("Ability.Torrent") + OnMinamitsu02VortexEnd(keys,origin,forward) + end + ) + return nil + end + return 0.15 + end, + 0.03) +end + +function OnMinamitsu02VortexEnd(keys,origin,forward) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local targetPoint = origin + forward * 2500 + local speed = 2 + local g = 0.18 + local timeCount = 0 + + for k,v in pairs(caster.ability_minamitsu_02_group) do + if v:IsNull() == false and v~=nil then + if v.thtd_is_minamitsu_03_damaged ~= true then + v.thtd_is_minamitsu_03_damaged = true + local random = RandomVector(150) + v:SetAbsOrigin(targetPoint+random) + FindClearSpaceForUnit(v, v:GetOrigin(), false) + if caster.thtd_minamitsu_01_first == true then + v.next_move_forward = v.first_move_forward + v.next_move_point = v.first_move_point + end + end + end + end + + caster:SetContextThink( + DoUniqueString("ability_thdots_minamitsu_02_stage_02"), + function () + if GameRules:IsGamePaused() then return 0.03 end + timeCount = timeCount + 0.03 + speed = speed - g + if caster.ability_minamitsu_02_group ~= nil then + for k,v in pairs(caster.ability_minamitsu_02_group) do + if v~=nil and v:IsNull() == false then + if v:HasModifier("modifier_minamitsu02_vortex_target") then + -- v:RemoveNoDraw() + v:RemoveModifierByName("modifier_minamitsu02_vortex_target") + end + if v:HasModifier("modifier_minamitsu02_vortex_pause_target") then + if v:GetOrigin().z >= GetGroundHeight(v:GetOrigin(),nil) then + v:SetAbsOrigin(v:GetOrigin() + Vector(0,0,speed)) + end + end + end + end + if timeCount >= 1.0 then + for k2,v2 in pairs(caster.ability_minamitsu_02_group) do + if v2:HasModifier("modifier_minamitsu02_vortex_pause_target") then + v2:RemoveModifierByName("modifier_minamitsu02_vortex_pause_target") + end + FindClearSpaceForUnit(v2, v2:GetOrigin(), false) + end + return nil + end + end + return 0.03 + end, + 0.03 + ) +end + +function OnMinamitsu04SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster:HasModifier("modifier_byakuren_03_buff") then + caster:ReCooldown(keys.ability, caster.thtd_byakuren_buff_minamitsu) + end + + if caster.thtd_minamitsu_01_rect == nil or caster.thtd_minamitsu_01_rect["rectOrigin"] == nil then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="only_water_area_use"}) + return + end + + local powerDamage = 0 + local powerCount = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then + powerDamage = pv[1] + powerCount = pv[2] + end + + local origin = caster.thtd_minamitsu_01_rect["rectOrigin"] + local forward = caster.thtd_minamitsu_01_rect["rectForward"] + + local count = 1 + powerCount + if caster:IsPower999() then count = count + 7 end + caster:SetContextThink(DoUniqueString("thtd_minamitsu_04"), + function() + if not THTD_IsValid(caster) then return nil end + if count <= 0 then return nil end + count = count - 1 + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_minamitsu/ability_minamitsu_01_ship.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, origin) + ParticleManager:SetParticleControl(effectIndex, 1, forward*1200) + ParticleManager:DestroyParticleSystemTime(effectIndex,2.0) + + local time = 2 + caster:SetContextThink(DoUniqueString("thtd_minamitsu_04_move_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time > 0 then + time = time - 0.2 + local targets = THTD_FindUnitsInRadius(caster,origin+forward*1200*(2 - time),300) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage() + if caster:IsPower666() then + damage = damage + count * 20 * caster:THTD_GetStarDamage() + end + damage = damage * (1 + THTD_GetStarLotusTowerCount(caster) * keys.damage_up/100) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage , + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + return 0.2 + else + return nil + end + end, + 0) + + return 0.5 + end, + 0) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityminoriko.lua b/scripts/vscripts/abilities/abilityminoriko.lua new file mode 100755 index 0000000..bc40147 --- /dev/null +++ b/scripts/vscripts/abilities/abilityminoriko.lua @@ -0,0 +1,70 @@ +function OnMinoriko02StarChange(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if target:GetUnitName() == "minoriko" or target:GetUnitName() == "sizuha" then + return + end + + if target:THTD_IsTower() and target:GetOwner() == caster:GetOwner() and target:GetUnitName() ~= caster:GetUnitName() then + local hero = caster:GetOwner() + if hero.thtd_minoriko_02_change == nil then + hero.thtd_minoriko_02_change = 0 + end + + if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE then + if SpawnSystem.CurWave < 11 then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="minoriko_cannot_be_change"}) + return + end + if SpawnSystem.CurWave < 21 and hero.thtd_minoriko_02_change >= 1 then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="minoriko_change_one_tip"}) + return + end + end + + if hero.thtd_minoriko_02_change >= keys.max_count then + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="minoriko_max_change", duration=5, params={count=1}, color="#0ff"} ) + return + end + hero.thtd_minoriko_02_change = hero.thtd_minoriko_02_change + 1 + + local star = target:THTD_GetStar() + target:THTD_SetStar(caster:THTD_GetStar()) + target:THTD_SetLevel(THTD_MAX_LEVEL) + + caster.thtd_is_changed = true + caster.thtd_star = star + caster:THTD_OpenAbility() + caster:THTD_DestroyLevelEffect() + caster:THTD_CreateLevelEffect() + + if (target:GetUnitName() == "kaguya" and target:THTD_GetStar() < 4) then + if target.thtd_kaguya_03_treasure_table ~= nil and target.thtd_kaguya_03_treasure_table[1] ~= nil and target.thtd_kaguya_03_treasure_table[1]["effectIndex"] ~= nil then + local friends = THTD_FindFriendlyUnitsAll(target) + local enemies = THTD_FindUnitsAll(target) + + for i=1,4 do + local buff = "modifier_kaguya_03_"..i.."_buff" + local debuff = "modifier_kaguya_03_"..i.."_debuff" + for k,v in pairs(friends) do + if v:FindModifierByNameAndCaster(buff,target)~=nil then + v:RemoveModifierByName(buff) + end + end + for k,v in pairs(enemies) do + if v:FindModifierByNameAndCaster(debuff,target)~=nil then + v:RemoveModifierByName(debuff) + end + end + + if target.thtd_kaguya_03_treasure_table[i]["effectIndex"] ~= nil then + ParticleManager:DestroyParticleSystem(target.thtd_kaguya_03_treasure_table[i]["effectIndex"],true) + target.thtd_kaguya_03_treasure_table[i]["effectIndex"] = nil + end + end + end + end + + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitymokou.lua b/scripts/vscripts/abilities/abilitymokou.lua new file mode 100755 index 0000000..009bd36 --- /dev/null +++ b/scripts/vscripts/abilities/abilitymokou.lua @@ -0,0 +1,107 @@ +function OnMokou01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster.thtd_mokou_01_crit_chance == nil then + caster.thtd_mokou_01_crit_chance = keys.base_chance + end + + if caster.thtd_mokou_01_crit_chance < keys.max_chance then + caster.thtd_mokou_01_crit_chance = math.min(keys.max_chance, caster.thtd_mokou_01_crit_chance + keys.bonus_chance) + end + + local modifier = caster:FindModifierByName("passive_mokou_01_crit") + if modifier ~= nil then + modifier:SetStackCount(caster.thtd_mokou_01_crit_chance) + modifier:SetDuration(keys.duration_time,false) + else + local modifier = keys.ability:ApplyDataDrivenModifier(caster, caster, "passive_mokou_01_crit", {Duration = keys.duration_time}) + modifier:SetStackCount(caster.thtd_mokou_01_crit_chance) + end + + local base_crit = caster:GetAbilityValue("thtd_mokou_02", "base_crit") + local max_crit = caster:GetAbilityValue("thtd_mokou_02", "max_crit") + if caster.thtd_mokou_01_crit_damage == nil then + caster.thtd_mokou_01_crit_damage = base_crit + end + + if RollPercentage(caster.thtd_mokou_01_crit_chance) then + caster.thtd_mokou_01_crit_damage = math.min(max_crit, caster.thtd_mokou_01_crit_damage * base_crit) + + local radius = keys.range + if caster:HasModifier("modifier_mokou_03_buff") then + radius = radius + caster:GetAbilityValue("thtd_mokou_03", "bonus_range") + end + + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),radius) + local damage = caster:THTD_GetAttack() * caster.thtd_mokou_01_crit_damage + SendOverheadEventMessage(caster:GetPlayerOwner(), OVERHEAD_ALERT_DAMAGE, caster, caster.thtd_mokou_01_crit_damage, caster:GetPlayerOwner()) + for k,v in pairs(targets) do + local DamageTable_aoe = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable_aoe) + end + if caster:HasModifier("modifier_mokou_03_buff") then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/mouko/ability_mokou_01_boom.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 3, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + caster:EmitSound("Hero_OgreMagi.Fireblast.Target") + else + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/mouko/ability_mokou_02_boom.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()+Vector(0,0,64)) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(1,1,1)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + caster:EmitSound("Hero_OgreMagi.Fireblast.Target") + end + else + caster.thtd_mokou_01_crit_damage = base_crit + end + + local modifier = caster:FindModifierByName("modifier_mokou_crit_buff") + if modifier ~= nil then + modifier:SetStackCount(caster.thtd_mokou_01_crit_damage) + else + local modifier = keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_mokou_crit_buff", nil) + modifier:SetStackCount(caster.thtd_mokou_01_crit_damage) + end +end + +function OnMokou01Remove(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + caster.thtd_mokou_01_crit_chance = keys.base_chance + caster.thtd_mokou_01_crit_damage = caster:GetAbilityValue("thtd_mokou_02", "base_crit") + + local modifier = caster:FindModifierByName("modifier_mokou_crit_buff") + if modifier ~= nil then + modifier:SetStackCount(caster.thtd_mokou_01_crit_damage) + else + local modifier = keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_mokou_crit_buff", nil) + modifier:SetStackCount(caster.thtd_mokou_01_crit_damage) + end +end + +function OnMokou03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/mouko/ability_mokou_04_wing.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:DestroyParticleSystemTime(effectIndex,keys.duration_time) + + keys.ability:ApplyDataDrivenModifier(caster,caster,"modifier_mokou_03_buff", {duration = keys.duration_time}) +end + +function OnCreatedMokou03Buff(keys) + keys.target:THTD_AddBaseAttack(keys.bonus_attack, "thtd_mokou_03_bonus") +end + +function OnDestroyMokou03Buff(keys) + keys.target:THTD_AddBaseAttack("thtd_mokou_03_bonus") +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitymomiji.lua b/scripts/vscripts/abilities/abilitymomiji.lua new file mode 100755 index 0000000..a848d61 --- /dev/null +++ b/scripts/vscripts/abilities/abilitymomiji.lua @@ -0,0 +1,140 @@ +function OnMomiji01Spawn(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster.ability_momiji01_Spawn_unit == nil then + caster.ability_momiji01_Spawn_unit = {} + end + + count = keys.max_count + + for i=1,count do + local unit = CreateUnitByName( + "momiji_wolf" + ,caster:GetOrigin() + ( caster:GetForwardVector() + Vector(math.cos((i-1.5)*math.pi/3),math.sin((i-1.5)*math.pi/3),0) ) * 100 + ,false + ,caster:GetOwner() + ,caster:GetOwner() + ,caster:GetTeam() + ) + + if unit == nil then return end + + unit:SetControllableByPlayer(caster:GetPlayerOwnerID(), false) + unit:SetBaseDamageMax(caster:THTD_GetStarDamage() * keys.wolf_attack) + unit:SetBaseDamageMin(caster:THTD_GetStarDamage() * keys.wolf_attack) + unit.thtd_spawn_unit_owner = caster + + keys.ability:ApplyDataDrivenModifier(caster, unit, "modifier_momiji_01_buff", nil) + + local hero = caster:GetOwner() + if GameRules.player_bb_buff[hero.thtd_player_id]["item_3016"] > 0 then + unit.bb_buff_3016 = GameRules.player_bb_buff[hero.thtd_player_id]["item_3016"] + unit:AddNewModifier(unit, nil, "modifier_bb_buff_3016_effect", nil):SetStackCount(GameRules.player_bb_buff[hero.thtd_player_id]["item_3016"]) + end + + local oldSwpanUnit = caster.ability_momiji01_Spawn_unit[i] + if oldSwpanUnit ~=nil and oldSwpanUnit:IsNull() == false then + oldSwpanUnit:ForceKill(false) + end + caster.ability_momiji01_Spawn_unit[i] = unit + + local duration = keys.ability:GetCooldownTime() + unit:SetContextThink(DoUniqueString("thtd_momiji_01"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if GetDistanceBetweenTwoVec2D(caster:GetOrigin(), unit:GetOrigin()) > keys.range then + local forward = (unit:GetAbsOrigin() - caster:GetAbsOrigin()):Normalized() + unit:MoveToPosition(caster:GetOrigin() + forward * keys.range) + end + if duration > 0 then + duration = duration - 0.5 + else + unit:AddNoDraw() + unit:ForceKill(false) + return nil + end + if not THTD_IsValid(caster) then + unit:AddNoDraw() + unit:ForceKill(false) + return nil + end + return 0.5 + end, + 0.5) + end +end + +function OnMomiji02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if target:GetPlayerOwnerID() ~= caster:GetPlayerOwnerID() then return end + + if caster.ability_momiji_02_target == target then return end + if caster == target then return end + + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_momiji_02", nil) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_momiji/ability_momiji_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, target, 5, "follow_origin", Vector(0,0,0), true) + caster.ability_momiji_02_target = target + + local count = 0 + caster:SetContextThink(DoUniqueString("modifier_momiji_02"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if caster.ability_momiji_02_target ~= target then + if target~=nil and target:IsNull()==false and target:HasModifier("modifier_momiji_02") then + target:RemoveModifierByName("modifier_momiji_02") + end + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + return 0.1 + end, + 0.1) + + caster:SetContextThink("modifier_momiji_02_remove", + function() + if GameRules:IsGamePaused() then return 0.03 end + if caster:THTD_IsHidden() or keys.ability:GetLevel()<1 then + caster.ability_momiji_02_target = nil + return nil + end + return 0.1 + end, + 0.1) +end + +function OnCreatedMomiji02Buff(keys) + local target = keys.target + local bonus = 0 + if target:GetUnitName() == "aya" then + bonus = keys.aya_damage_up + else + bonus = keys.damage_up + end + target:AddDamageOutgoingPhysical(bonus, "thtd_momiji_02_damage_up") +end + +function OnUpgradeMomiji02Buff(keys) + local caster = keys.caster + local targets = {} + if caster.ability_momiji_02_target ~= nil then + table.insert(targets, caster.ability_momiji_02_target) + end + + for _,target in pairs(targets) do + local bonus = 0 + if target:GetUnitName() == "aya" then + bonus = keys.aya_damage_up + else + bonus = keys.damage_up + end + target:AddDamageOutgoingPhysical(bonus, "thtd_momiji_02_damage_up") + end + + targets = {} +end + +function OnDestroyMomiji02Buff(keys) + keys.target:AddDamageOutgoingPhysical("thtd_momiji_02_damage_up") +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitymugiyousei.lua b/scripts/vscripts/abilities/abilitymugiyousei.lua new file mode 100755 index 0000000..07f2c20 --- /dev/null +++ b/scripts/vscripts/abilities/abilitymugiyousei.lua @@ -0,0 +1,40 @@ +function OnMugiyousei01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local powerDamage = 0 + local powerDuration = 0 + local pv = caster:GetAbilityPowerValue(keys.ability:GetAbilityName()) + if pv ~= nil then + powerDamage = pv[1] + powerDuration = pv[2] + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + powerDamage) + local time = keys.damage_duration + powerDuration + target:AddPoison(1, caster) + target:SetContextThink(DoUniqueString("thtd_mugiyousei01_attack"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 or THTD_IsValid(target) == false then + if target ~= nil and target:IsNull() == false then + target:AddPoison(-1) + end + return nil + end + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + time = time - 1.0 + return 1.0 + end, + 0) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitymystia.lua b/scripts/vscripts/abilities/abilitymystia.lua new file mode 100755 index 0000000..7defb99 --- /dev/null +++ b/scripts/vscripts/abilities/abilitymystia.lua @@ -0,0 +1,34 @@ +function OnCreatedMystia01Debuff(keys) + local target = keys.target + + target:AddPhysicalArmor(-keys.penetration) +end + +function OnDestroyMystia01Debuff(keys) + local target = keys.target + + target:AddPhysicalArmor(keys.penetration) +end + +function OnThinkMystia02Buff(keys) + local caster = keys.caster + + local targets = THTD_FindFriendlyUnitsInRadius(caster,caster:GetAbsOrigin(),keys.radius) + for k,v in pairs(targets) do + local modifier = v:FindModifierByName("modifier_mystia_02_buff") + -- 持续时间比think大一点 + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_mystia_02_buff", {Duration = 0.3}) + else + modifier:SetDuration(0.3, false) + end + end +end + +function OnCreatedMystia02Buff(keys) + keys.target:THTD_AddAttackPercentage(keys.critdamage, "thtd_mystia_02_bonus") +end + +function OnDestroyMystia02Buff(keys) + keys.target:THTD_AddAttackPercentage("thtd_mystia_02_bonus") +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitynazrin.lua b/scripts/vscripts/abilities/abilitynazrin.lua new file mode 100755 index 0000000..979ffbb --- /dev/null +++ b/scripts/vscripts/abilities/abilitynazrin.lua @@ -0,0 +1,33 @@ +function OnNazrin01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if SpawnSystem.IsUnLimited then + if caster:HasModifier("modifier_byakuren_03_buff") then + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),400) + local damage = caster:GetGold() * keys.nazrin/100 + damage = damage * (1 + caster:THTD_GetPower() * keys.damage_up/1000) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + return + end + + if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE then return end + + if RollPercentage(keys.BonusChance) then + local gold = math.floor(keys.BonusGold + caster:THTD_GetPower() * keys.PowerPercent/100) + THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), gold , true, DOTA_ModifyGold_CreepKill) + SendOverheadEventMessage(caster:GetPlayerOwner(), OVERHEAD_ALERT_GOLD, target, gold, caster:GetPlayerOwner() ) + caster:EmitSound("Sound_THTD.thtd_nazrin_01") + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitynue.lua b/scripts/vscripts/abilities/abilitynue.lua new file mode 100755 index 0000000..e003330 --- /dev/null +++ b/scripts/vscripts/abilities/abilitynue.lua @@ -0,0 +1,101 @@ +function GetNueExtraDamage(caster) + local ability = caster:FindAbilityByName("thtd_nue_01") + local basedamage = caster:THTD_GetAbilityPowerDamage(ability) + local extradamage = caster:GetModifierStackCount("modifier_nue_01_extradamage", caster) or 0 + return math.max(1, extradamage) * basedamage +end + +function OnNue01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local cooldown = keys.ability:GetCooldownTime() + caster.thtd_nue_01_duration = cooldown + keys.ability:StartCooldown(cooldown) + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_nue_01_extradamage", {Duration = cooldown}) + caster.modifier_extradamage_count = math.min(caster:GetModifierStackCount("modifier_nue_01_extradamage", caster) + 1, keys.max_count) + caster:SetModifierStackCount("modifier_nue_01_extradamage", caster, caster.modifier_extradamage_count) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/nue/ability_nue_01_ball.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "attach_ball", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 1, caster, 5, "attach_ball", Vector(0,0,0), true) + ParticleManager:DestroyParticleSystemTime(effectIndex,cooldown) +end + +function OnNue01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + if target.thtd_damage_lock == true then return end + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_templar_assassin/templar_assassin_meld_hit.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, target, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 3, target, 5, "attach_hitloc", Vector(0,0,0), true) + + local DamageTable = { + victim = target, + attacker = caster, + ability = keys.ability, + damage = GetNueExtraDamage(caster) * keys.attack_bonus, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = keys.ability:GetAbilityTargetFlags() + } + if target:HasModifier("modifier_minamitsu_01_slow_buff") then + DamageTable.damage = DamageTable.damage * (1 + keys.damage_up/100) + end + UnitDamageTarget(DamageTable) + if caster:HasModifier("modifier_byakuren_03_buff") and THTD_IsValid(target) and target.thtd_damage_lock ~= true then + if target:GetHealthPercent() < caster.thtd_byakuren_buff_nue and target:HasModifier("modifier_nue_killed") == false then + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_nue_killed", {Duration = 30.0}) + caster:AbilityKill(target, keys.ability) + end + end +end + +-- buff时间到减1/3层 +function OnNue01Destroy(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + caster.modifier_extradamage_count = math.floor(caster.modifier_extradamage_count * 2/3) + if caster.modifier_extradamage_count > 0 then + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_nue_01_extradamage", {Duration = caster.thtd_nue_01_duration}) + caster:SetModifierStackCount("modifier_nue_01_extradamage", caster, caster.modifier_extradamage_count) + end +end + +function OnNue02SpellHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + if target.thtd_damage_lock == true then return end + local damage_table = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + GetNueExtraDamage(caster) * caster:GetAbilityValue("thtd_nue_01", "spell_bonus"), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = keys.ability:GetAbilityTargetFlags() + } + if target:HasModifier("modifier_minamitsu_01_slow_buff") then + damage_table.damage = damage_table.damage * (1 + caster:GetAbilityValue("thtd_nue_01", "damage_up", true)) + end + UnitDamageTarget(damage_table) + if caster:HasModifier("modifier_byakuren_03_buff") and THTD_IsValid(target) and target.thtd_damage_lock ~= true then + if target:GetHealthPercent() < caster.thtd_byakuren_buff_nue and target:HasModifier("modifier_nue_killed") == false then + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_nue_killed", {Duration = 30.0}) + caster:AbilityKill(target, keys.ability) + end + end +end + +function OnNue03Kill(keys) + local caster = keys.attacker + local target = keys.unit + local ability = nil + local level = keys.ability:GetLevel() + + if level >= 1 then + ability = caster:FindAbilityByName("thtd_nue_01") + if ability~=nil then + ability:EndCooldown() + end + ability = caster:FindAbilityByName("thtd_nue_02") + if ability~=nil then + ability:EndCooldown() + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitypatchouli.lua b/scripts/vscripts/abilities/abilitypatchouli.lua new file mode 100755 index 0000000..cd1336d --- /dev/null +++ b/scripts/vscripts/abilities/abilitypatchouli.lua @@ -0,0 +1,356 @@ +local PATCHOULI_01_AGNI_SHINE = 0 +local PATCHOULI_01_BURY_IN_LAKE = 1 +local PATCHOULI_01_MERCURY_POISON = 2 + +function GetPatchouliDamageCrit(caster) + local crit = 1 + if caster:HasModifier("modifier_patchouli_01_buff_fire") then + crit = 2 + end + if caster:IsPower999() then + crit = crit * 5 + end + return crit +end + +function OnPatchouli01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.thtd_power666_bonus ~= true then + if caster:IsPower666() then + caster.thtd_power666_bonus = true + caster:THTD_AddBasePower(3000) + end + else + if not caster:IsPower666() then + caster:THTD_AddBasePower(-3000) + caster.thtd_power666_bonus = nil + end + end + + if caster.thtd_patchouli_02_type == nil then + caster.thtd_patchouli_02_type = PATCHOULI_01_AGNI_SHINE + end + if caster.thtd_patchouli_02_cast_type == nil then + caster.thtd_patchouli_02_cast_type = PATCHOULI_01_AGNI_SHINE + end + + if caster.thtd_patchouli_02_type == PATCHOULI_01_AGNI_SHINE then + Patchouli01AgniShine(keys) + caster.thtd_patchouli_02_cast_type = PATCHOULI_01_AGNI_SHINE + elseif caster.thtd_patchouli_02_type == PATCHOULI_01_BURY_IN_LAKE then + Patchouli01BuryInLake(keys) + caster.thtd_patchouli_02_cast_type = PATCHOULI_01_BURY_IN_LAKE + elseif caster.thtd_patchouli_02_type == PATCHOULI_01_MERCURY_POISON then + Patchouli01MercuryPoison(keys) + caster.thtd_patchouli_02_cast_type = PATCHOULI_01_MERCURY_POISON + end +end + +function Patchouli01AgniShine(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local modifier = caster:FindModifierByName("modifier_patchouli_01_buff_fire") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_patchouli_01_buff_fire", {Duration=10.0}) + else + modifier:SetDuration(10, false) + end + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_patchouli_01") + if pv ~= nil then + powerDamage = pv[1] + end + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range1) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 1) * (1 + powerDamage/100) * GetPatchouliDamageCrit(caster) + for k,v in pairs(targets) do + local crit = 1 + if v:HasModifier("modifier_patchouli_01_debuff_gold") then + crit = 2 + end + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage * crit, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + caster:EmitSound("Hero_Invoker.Cataclysm.Ignite") + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystemTime(effectIndex,2.0) +end + +function Patchouli01BuryInLake(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local modifier = caster:FindModifierByName("modifier_patchouli_01_buff_water") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_patchouli_01_buff_water", {Duration=10.0}) + else + modifier:SetDuration(10, false) + end + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_patchouli_01") + if pv ~= nil then + powerDamage = pv[1] + end + + local isFirst = true + local time = keys.duration_time2 + + caster:EmitSound("Sound_THTD.thtd_patchouli_01_02") + + caster:SetContextThink(DoUniqueString("thtd_patchouli01_buryinlake"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then return nil end + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range2) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 2) * (1 + powerDamage/100) * 0.25 * GetPatchouliDamageCrit(caster) + for k,v in pairs(targets) do + local crit = 1 + if v:HasModifier("modifier_patchouli_01_debuff_gold") then + crit = 2 + end + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage * crit, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + if isFirst and v ~= nil and v.thtd_damage_lock ~= true and v:IsNull() == false and v:IsAlive() and v:GetHealthPercent() < 30 then + isFirst = false + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake_bury.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + EmitSoundOnLocationForAllies(v:GetOrigin(),"Hero_Kunkka.Tidebringer.Attack",caster) + caster:AbilityKill(v, keys.ability) + end + end + time = time - 0.25 + return 0.25 + end, + 0) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystemTime(effectIndex,keys.duration_time2) +end + +function Patchouli01MercuryPoison(keys) + if GameRules:IsGamePaused() then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local time = keys.duration_time3 + + EmitSoundOnLocationForAllies(targetPoint,"Sound_THTD.thtd_patchouli_01_03",caster) + + caster:SetContextThink(DoUniqueString("thtd_patchouli01_mercuryposion"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then return nil end + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range3) + for k,v in pairs(targets) do + if v:HasModifier("modifier_patchouli_01_mercury_poison_debuff") == false then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_patchouli_01_mercury_poison_debuff", nil) + end + if v:HasModifier("modifier_patchouli_01_debuff_gold") == false then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_patchouli_01_debuff_gold", {Duration = 10.0}) + end + end + time = time - 0.2 + return 0.2 + end, + 0) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystemTime(effectIndex,keys.duration_time3) +end + +function OnPatchouli01MercuryPoisonThink(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_patchouli_01") + if pv ~= nil then + powerDamage = pv[1] + end + + local crit = 1 + if target:HasModifier("modifier_patchouli_01_debuff_gold") then + crit = 2 + end + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 3) * (1 + powerDamage/100) * crit * 0.2 * GetPatchouliDamageCrit(caster), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + +function OnPatchouli01MercuryPoisonCreated(keys) + local caster = keys.caster + local unit = keys.target + unit:AddPoison(1, caster) +end + +function OnPatchouli01MercuryPoisonDestroy(keys) + local caster = keys.caster + local unit = keys.target + unit:AddPoison(-1) +end + +local BuffWaterEffect = { + "particles/econ/items/treant_protector/ti7_shoulder/treant_ti7_livingarmor.vpcf", + "particles/econ/items/treant_protector/ti7_shoulder/treant_ti7_crimson_livingarmor.vpcf", + "particles/econ/items/treant_protector/ti7_shoulder/treant_ti7_golden_livingarmor.vpcf", +} + +function OnPatchouli01BuffWaterCreated(keys) + local caster = keys.caster + local effectIndex = ParticleManager:CreateParticle(BuffWaterEffect[RandomInt(1, #BuffWaterEffect)], PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, caster:GetAbsOrigin()) + caster.buff_water_effect = effectIndex + caster:THTD_AddManaRegenPercentage(100, "thtd_patchouli_01_manaregn_bonus") +end + +function OnPatchouli01BuffWaterDestroy(keys) + local caster = keys.caster + if caster.buff_water_effect ~= nil then + ParticleManager:DestroyParticleSystem(caster.buff_water_effect, true) + caster.buff_water_effect = nil + end + caster:THTD_AddManaRegenPercentage("thtd_patchouli_01_manaregn_bonus") +end + +function OnPatchouli02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + caster:EmitSound("Hero_Invoker.Invoke") + + if caster.thtd_patchouli_02_type == nil then + caster.thtd_patchouli_02_type = PATCHOULI_01_AGNI_SHINE + end + + if caster.thtd_patchouli_02_type == PATCHOULI_01_AGNI_SHINE then + caster.thtd_patchouli_02_type = PATCHOULI_01_BURY_IN_LAKE + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="change_to_patchouli_bury_in_lake", duration=1, params={count=1}, color="#0ff"} ) + elseif caster.thtd_patchouli_02_type == PATCHOULI_01_BURY_IN_LAKE then + caster.thtd_patchouli_02_type = PATCHOULI_01_MERCURY_POISON + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="change_to_patchouli_mercury_poison", duration=1, params={count=1}, color="#0ff"} ) + elseif caster.thtd_patchouli_02_type == PATCHOULI_01_MERCURY_POISON then + caster.thtd_patchouli_02_type = PATCHOULI_01_AGNI_SHINE + CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="change_to_patchouli_agni_shine", duration=1, params={count=1}, color="#0ff"} ) + end +end + +function OnCreatedPatchouli03Buff(keys) + keys.target:AddDamageOutgoingMagical(keys.magic_outgoing, "thtd_patchouli_03_damage_up") +end + +function OnDestroyPatchouli03Buff(keys) + keys.target:AddDamageOutgoingMagical("thtd_patchouli_03_damage_up") +end + +function OnPatchouli04SpellStart(keys) + if keys.duration_time == 0 then return end + + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + + if caster.thtd_power666_bonus ~= true then + if caster:IsPower666() then + caster.thtd_power666_bonus = true + caster:THTD_AddBasePower(2000) + end + else + if not caster:IsPower666() then + caster:THTD_AddBasePower(-2000) + caster.thtd_power666_bonus = nil + end + end + + local count = 4 + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_patchouli_04/ability_patchouli_04.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, vecCaster + Vector(0,0,256)) + ParticleManager:SetParticleControl(effectIndex, 1, vecCaster + Vector(0,0,256)) + ParticleManager:SetParticleControl(effectIndex, 3, vecCaster + Vector(0,0,256)) + + caster:SetContextThink(DoUniqueString("thtd_patchouli04_spell_start"), + function() + if GameRules:IsGamePaused() then return 0.03 end + count = count * 2 + local radius = math.min(128,count) + ParticleManager:SetParticleControl(effectIndex, 14, Vector(radius,0,0)) + if count > 100 then + OnPatchouli04SpellThink(keys) + ParticleManager:DestroyParticleSystemTimeFalse(effectIndex,3.0) + return nil + end + return 0.5 + end, + 0.5) +end + +function OnPatchouli04SpellThink(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + local time = keys.duration_time + local range = keys.range + + THTD_SetSpellLock(caster, "thtd_patchouli_04_in_stun", time) + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_patchouli_04") + if pv ~= nil then + powerDamage = pv[1] + end + + caster:SetContextThink(DoUniqueString("thtd_patchouli04_spell_start"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then return nil end + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),range) + local damage = (caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage()) * 0.2 * GetPatchouliDamageCrit(caster) + for k,v in pairs(targets) do + local crit = 1 + if v:HasModifier("modifier_patchouli_01_debuff_gold") then + crit = 2 + end + UnitStunTarget(caster,v,0.2) + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage * crit, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + time = time - 0.2 + return 0.2 + end, + 0) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityran.lua b/scripts/vscripts/abilities/abilityran.lua new file mode 100755 index 0000000..8ae642d --- /dev/null +++ b/scripts/vscripts/abilities/abilityran.lua @@ -0,0 +1,157 @@ +local ran_03_black_list = +{ + "lily", + "daiyousei", +} + +function IsInRan03BlackList(unit) + for k,v in pairs(ran_03_black_list) do + if unit:GetUnitName() == v then + return true + end + end + return false +end + +local ran_03_ability_black_list = +{ + "thtd_ran_01", +} + +function IsInRan03AbilityBlackList(ability) + for k,v in pairs(ran_03_ability_black_list) do + if ability:GetAbilityName() == v then + return true + end + end + return false +end + + +function Ran01_OnSpellStart(keys) + local caster = keys.caster + local target = keys.target + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/ran/ability_ran_03_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 1, target, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 9, caster, 5, "attach_hitloc", Vector(0,0,0), true) + + local target_point = target:GetOrigin() + + local damage_table={ + victim = target, + attacker = caster, + ability = keys.ability, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + + local target_unit = target + local jump_count = 1 + local jumpAmount = keys.JumpCount + + if target_unit ~= nil and target_unit:IsNull() == false and target_unit:IsAlive() and jumpAmount > 1 then + caster:SetContextThink("ran01_lazer_jumping", + function () + if GameRules:IsGamePaused() then return 0.03 end + local enemies = THTD_FindUnitsInRadius(caster,target_point,keys.JumpRadius) + + local next_target=nil + for _,v in pairs(enemies) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + if v~=target_unit then + next_target=v + break + end + end + end + if next_target then + -- target_unit:EmitSound("Hero_Tinker.Laser") + effectIndex = ParticleManager:CreateParticle("particles/heroes/ran/ability_ran_03_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, target_unit, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 1, next_target, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 9, target_unit, 5, "attach_hitloc", Vector(0,0,0), true) + + target_unit = next_target + target_point = next_target:GetOrigin() + + local DamageTable={ + victim = target_unit, + attacker = caster, + ability = keys.ability, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + -- next_target:EmitSoundParams("Hero_Tinker.LaserImpact",1.0,0.4,2.0) + end + + jump_count=jump_count+1 + if jump_count >= jumpAmount or next_target == nil or next_target:IsNull() or next_target:IsAlive() == false then + return nil + end + return keys.JumpInterval + end, + keys.JumpInterval) + end +end + +function OnRan03SpellStart(keys) + local buffCaster = EntIndexToHScript(keys.caster_entindex) --本buff来源者 + if keys.ability:GetLevel() < 1 then --本buff来源技能 + return + end + + local caster = keys.unit --本次触发的技能施放者 + local ability = keys.event_ability --本次触发的施放的技能 + local manaCost = caster:GetRealManaCost(ability) + if manaCost <= 0 then + return + end + if IsInRan03BlackList(keys.unit) or IsInRan03AbilityBlackList(keys.event_ability) then + return + end + + if keys.mana_regen > 0 then + caster:GiveMana(manaCost * keys.mana_regen/100) + end + + local ability01 = buffCaster:FindAbilityByName("thtd_ran_01") + ability01:EndCooldown() + buffCaster:GiveMana(buffCaster:GetRealManaCost(ability01)) + + local enemies = THTD_FindUnitsInRadius(buffCaster,buffCaster:GetOrigin(),buffCaster:GetAbilityValue("thtd_ran_01", "range")) + if #enemies > 0 then + local unit = nil + for _,v in pairs(enemies) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + unit = v + break + end + end + if unit ~= nil then + buffCaster:CastAbilityOnTarget(unit,ability01,buffCaster:GetPlayerOwnerID()) + end + end + + -- local effectIndex = ParticleManager:CreateParticle("particles/heroes/ran/ability_ran_04_buff.vpcf", PATTACH_CUSTOMORIGIN, caster) + -- ParticleManager:SetParticleControlEnt(effectIndex , 0, keys.unit, 5, "follow_origin", Vector(0,0,0), true) + -- ParticleManager:DestroyParticleSystemTimeFalse(effectIndex,2.0) + -- 太吵,改为只有蓝显示 + if buffCaster.thtd_ran_03_effect ~= true then + buffCaster.thtd_ran_03_effect = true + local effectIndex = ParticleManager:CreateParticle("particles/heroes/ran/ability_ran_04_buff.vpcf", PATTACH_CUSTOMORIGIN, buffCaster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, buffCaster, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:DestroyParticleSystemTimeFalse(effectIndex,2.0) + buffCaster:SetContextThink(DoUniqueString("thtd_ran_03"), + function() + buffCaster.thtd_ran_03_effect = nil + return nil + end, + 2.0) + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityreimu.lua b/scripts/vscripts/abilities/abilityreimu.lua new file mode 100755 index 0000000..09fd3cf --- /dev/null +++ b/scripts/vscripts/abilities/abilityreimu.lua @@ -0,0 +1,359 @@ +function OnReimu01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if keys.ability:GetLevel() < 1 then return end + + if caster.thtd_reimu_01_attack_count == nil then + caster.thtd_reimu_01_attack_count = 0 + end + + caster.thtd_reimu_01_attack_count = caster.thtd_reimu_01_attack_count + 1 + + if caster.thtd_reimu_01_attack_count >= keys.max_count then + caster.thtd_reimu_01_attack_count = 0 + + caster:EmitSound("Sound_THTD.thtd_reimu_01") + + local count = 1 + caster:SetContextThink(DoUniqueString("ability_reimu_01_projectile"), + function () + if GameRules:IsGamePaused() then return 0.03 end + if count <= 3 then + Reimu01Projectile(keys,count) + count = count + 1 + else + return nil + end + return 0.2 + end, + 0.2) + end +end + +function OnReimu01ProjectileHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage * Reimu02GetChance(caster), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + +function Reimu01Projectile(keys,count) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local rad = GetRadBetweenTwoVec2D(caster:GetOrigin(),target:GetOrigin()) + + local forward = Vector(math.cos(rad),math.sin(rad),caster:GetForwardVector().z) + + local info = + { + Ability = keys.ability, + EffectName = "particles/heroes/thtd_reimu/ability_reimu_01_projectile.vpcf", + vSpawnOrigin = caster:GetOrigin() + Vector(0,0,128), + fDistance = 1000, + fStartRadius = 150, + fEndRadius = 150, + Source = caster, + bHasFrontalCone = false, + bReplaceExisting = false, + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = false, + vVelocity = forward * 1500, + bProvidesVision = true, + iVisionRadius = 1000, + iVisionTeamNumber = caster:GetTeamNumber() + } + local projectile = ProjectileManager:CreateLinearProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + + for i=1,count do + local iVec = Vector( math.cos(rad + math.pi/18*(i+0.5)) * 2000 , math.sin(rad + math.pi/18*(i+0.5)) * 2000 , caster:GetForwardVector().z ) + info.vVelocity = iVec + projectile = ProjectileManager:CreateLinearProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + iVec = Vector( math.cos(rad - math.pi/18*(i+0.5)) * 2000 , math.sin(rad - math.pi/18*(i+0.5)) * 2000 , caster:GetForwardVector().z ) + info.vVelocity = iVec + projectile = ProjectileManager:CreateLinearProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + end +end + +function Reimu02GetChance(caster) + if caster.thtd_reimu_04_ball_count == nil then + caster.thtd_reimu_04_ball_count = 0 + end + if caster.thtd_reimu_04_hot_duration == nil then + caster.thtd_reimu_04_hot_duration = 0 + end + + if RollPercentage(caster:GetAbilityValue("thtd_reimu_02", "chance")) then + if caster.thtd_reimu_04_ball_count < 7 then + caster:EmitSound("Sound_THTD.thtd_reimu_02") + caster.thtd_reimu_04_ball_count = caster.thtd_reimu_04_ball_count + 1 + caster.thtd_reimu_04_hot_duration = 20.0 + end + return 2.0 + end + + return 1.0 +end + +function OnReimu03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + caster:EmitSound("Sound_THTD.thtd_reimu_03_01") + + Reimu03ThrowBallToPoint(keys,caster:GetOrigin(),targetPoint,120,1) +end + +function Reimu03ThrowBallToPoint(keys,origin,targetpoint,vhigh,count) + local caster = EntIndexToHScript(keys.caster_entindex) + + local curOrigin = Vector(origin.x,origin.y,origin.z) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/reimu/reimu_01_ball.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, curOrigin) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(1/count,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(500/count,0,0)) + + local g = -10 + local dis = GetDistanceBetweenTwoVec2D(origin,targetpoint) + local vh = vhigh + local t = math.abs(2*vh/g) + local speed = dis/t + local rad = GetRadBetweenTwoVec2D(origin,targetpoint) + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + caster:SetContextThink(DoUniqueString("ability_reimu_03"), + function() + if GameRules:IsGamePaused() then return 0.03 end + vh = vh + g + curOrigin = Vector(curOrigin.x + math.cos(rad) * speed,curOrigin.y + math.sin(rad) * speed,curOrigin.z + vh) + ParticleManager:SetParticleControl(effectIndex, 0, curOrigin) + if curOrigin.z >= caster:GetOrigin().z - 50 then + return 0.02 + else + curOrigin.z = caster:GetOrigin().z + ParticleManager:DestroyParticleSystem(effectIndex,true) + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/reimu/reimu_01_effect.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 0, curOrigin) + ParticleManager:SetParticleControl(effectIndex2, 1, Vector(500/count,0,0)) + ParticleManager:DestroyParticleSystem(effectIndex2,false) + + local targets = THTD_FindUnitsInRadius(caster,curOrigin,keys.range/count) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = math.floor((damage/count) * Reimu02GetChance(caster)), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + UnitStunTarget(caster,v,keys.stun_time/count) + end + + if count < keys.max_count then + count = count + 1 + for i=1,count do + Reimu03ThrowBallToPoint(keys,curOrigin,curOrigin+RandomVector(300-count*30),vhigh*400/442,count) + end + end + caster:EmitSound("Sound_THTD.thtd_reimu_03_02") + return nil + end + end, + 0) +end + +function OnReimu04SpellThink(keys) + if GameRules:IsGamePaused() then return end + if keys.ability:GetLevel() < 1 then return end + + local caster = EntIndexToHScript(keys.caster_entindex) + + -- 初始化 + if caster.thtd_reimu_04_ball_count == nil then + caster.thtd_reimu_04_ball_count = 0 + end + + if caster.thtd_reimu_04_think_count == nil then + caster.thtd_reimu_04_think_count = 0 + end + + if caster.thtd_reimu_04_think_count < 72 then + caster.thtd_reimu_04_think_count = caster.thtd_reimu_04_think_count + 1 + else + caster.thtd_reimu_04_think_count = 0 + end + + if caster.thtd_reimu_04_ball_table == nil then + caster.thtd_reimu_04_ball_table = {} + end + + for i=1,7 do + if caster.thtd_reimu_04_ball_table[i] == nil then + caster.thtd_reimu_04_ball_table[i] = {} + end + caster.thtd_reimu_04_ball_table[i]["origin"] = + caster:GetOrigin() + + Vector( + math.cos(i*2*math.pi/7 + caster.thtd_reimu_04_think_count * math.pi/36)*75, + math.sin(i*2*math.pi/7 + caster.thtd_reimu_04_think_count * math.pi/36)*75, + 128) + end + + -- 根据积累数量初始化光球 + if caster.thtd_reimu_04_ball_count > 0 then + for i=1,caster.thtd_reimu_04_ball_count do + if caster.thtd_reimu_04_ball_table[i]["effectIndex"] == nil then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_reimu/ability_reimu_04.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(1/12,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(500/12,0,0)) + caster.thtd_reimu_04_ball_table[i]["effectIndex"] = effectIndex + end + end + end + + -- 旋转光球 + for i=1,7 do + if caster.thtd_reimu_04_ball_table[i]["effectIndex"] ~= nil then + ParticleManager:SetParticleControl(caster.thtd_reimu_04_ball_table[i]["effectIndex"], 0, caster.thtd_reimu_04_ball_table[i]["origin"] ) + end + end + + if caster.thtd_reimu_04_ball_count == 7 and caster.thtd_reimu_04_ball_7_bonus == nil then + caster.thtd_reimu_04_ball_7_bonus = keys.power_up + if caster:IsPower999() then caster.thtd_reimu_04_ball_7_bonus = caster.thtd_reimu_04_ball_7_bonus * 7 end + caster:THTD_AddPowerPercentage(caster.thtd_reimu_04_ball_7_bonus, "thtd_reimu_04_power_buff") + caster:SetContextThink(DoUniqueString("thtd_reimu_04_power_bonus"), + function () + if GameRules:IsGamePaused() then return 0.03 end + caster:THTD_AddPowerPercentage("thtd_reimu_04_power_buff") + caster.thtd_reimu_04_ball_7_bonus = nil + return nil + end, + 7.0) + end + + local tick_count = 36 + if caster:IsPower666() then tick_count = 12 end + + -- 光球攻击行为 + if caster.thtd_reimu_04_ball_count == 7 and caster.thtd_reimu_04_think_count%tick_count == 0 then -- 原始为8,卡顿改善及伤害系数平衡 + if caster.thtd_reimu_04_think_count >= 72 then caster.thtd_reimu_04_think_count = 0 end -- 修复达到72后连续触发,0余数为0造成 + Reimu04AttackTargetPoint(keys) + for i=1,7 do + if caster.thtd_reimu_04_ball_table[i]["effectIndex"] ~= nil then + ParticleManager:SetParticleControl(caster.thtd_reimu_04_ball_table[i]["effectIndex"], 3, Vector(1000/12,0,0)) + end + end + end + + -- 保持热度时间,结束光球 + if caster.thtd_reimu_04_hot_duration == nil then + caster.thtd_reimu_04_hot_duration = 0 + end + + caster.thtd_reimu_04_hot_duration = caster.thtd_reimu_04_hot_duration - 0.02 + + if caster.thtd_reimu_04_hot_duration < 0 then + Reimu04ReleaseBall(keys) + end +end + +function Reimu04ReleaseBall(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster.thtd_reimu_04_ball_table ~= nil then + caster.thtd_reimu_04_hot_duration = 0 + caster.thtd_reimu_04_ball_count = 0 + for i=1,7 do + if caster.thtd_reimu_04_ball_table[i]["effectIndex"] ~= nil then + ParticleManager:DestroyParticleSystem(caster.thtd_reimu_04_ball_table[i]["effectIndex"],true) + caster.thtd_reimu_04_ball_table[i]["effectIndex"] = nil + end + end + end +end + +function Reimu04AttackTargetPoint(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),1000) + if targets[1]==nil then return end + + caster:EmitSound("Sound_THTD.thtd_reimu_04_01") + + local target = targets[1] + local vecCaster = caster.thtd_reimu_04_ball_table[RandomInt(1,7)]["origin"] + local pointRad = GetRadBetweenTwoVec2D(vecCaster,target:GetOrigin()) + + local randomPi = RandomFloat(-2*math.pi,2*math.pi) + local forwardVec = Vector(math.cos(pointRad+randomPi), math.sin(pointRad+randomPi),RandomFloat(0,1)) + + local BulletTable = { + Ability = keys.ability, + EffectName = "particles/heroes/thtd_reimu/ability_reimu_04_projectile.vpcf", + vSpawnOrigin = vecCaster, + vSpawnOriginNew = vecCaster, + fDistance = 5000, + fStartRadius = 60, + fEndRadius = 60, + Source = caster, + bHasFrontalCone = false, + bRepalceExisting = false, + iUnitTargetTeams = "DOTA_UNIT_TARGET_TEAM_ENEMY", + iUnitTargetTypes = "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP", + iUnitTargetFlags = "DOTA_UNIT_TARGET_FLAG_NONE", + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = true, + vVelocity = forwardVec, + bProvidesVision = true, + iVisionRadius = 400, + iVisionTeamNumber = caster:GetTeamNumber(), + } + + local speed = 2000 + local acc = 200 + local iVelo = 1000 + + CreateProjectileMoveToTarget(BulletTable,caster,target,speed,iVelo,-acc, + function(unit,vec) + local targetpoint = Vector(vec.x,vec.y,caster:GetOrigin().z) + local targets = THTD_FindUnitsInRadius(caster,targetpoint,keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local damage_table = { + victim = v, + attacker = caster, + damage = damage * Reimu02GetChance(caster), + ability = keys.ability, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + end + + caster:EmitSound("Sound_THTD.thtd_reimu_04_02") + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_reimu/ability_reimu_04_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetpoint) + ParticleManager:SetParticleControl(effectIndex, 3, targetpoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + ) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityreimu_pet.lua b/scripts/vscripts/abilities/abilityreimu_pet.lua new file mode 100755 index 0000000..6e08a22 --- /dev/null +++ b/scripts/vscripts/abilities/abilityreimu_pet.lua @@ -0,0 +1,987 @@ + +local reimu_pet_sound = +{ + "UI.Aowu", + "Icewrack_Pup.Ult.Howl", + "Icewrack_Pup.Flee", + "Icewrack_Pup.idle_alt_bark", + "Icewrack_Pup.Alert", + "Icewrack_Pup.Happy", + "Icewrack_Pup.Breath", +} + +local reimu_pet_model = +{ + -- 默认 + h000 = "models/items/courier/courier_ti10_radiant/courier_ti10_radiant.vmdl", + h000b = "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl2/courier_ti10_radiant_lvl2.vmdl", + h000c = "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl3/courier_ti10_radiant_lvl3.vmdl", + h000d = "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl4/courier_ti10_radiant_lvl4.vmdl", + h000e = "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl5/courier_ti10_radiant_lvl5.vmdl", + h000f = "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl6/courier_ti10_radiant_lvl6.vmdl", + h000g = "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl7/courier_ti10_radiant_lvl7.vmdl", + h001 = "models/pets/icewrack_wolf/icewrack_wolf.vmdl", + h002 = "models/heroes/invoker_kid/invoker_kid_trainer_dragon.vmdl", + -- h001 = "models/props_gameplay/donkey.vmdl", -- 默认信使,小马,天辉 + -- h002 = "models/props_gameplay/donkey_dire.vmdl", -- 默认信使,小马,夜宴 + + + h003 = "models/pets/armadillo/armadillo.vmdl", + h004 = "models/courier/baby_rosh/babyroshan_ti9.vmdl", + + + --普通信使 beginner + h101 = "models/courier/skippy_parrot/skippy_parrot.vmdl", + h102 = "models/courier/smeevil_mammoth/smeevil_mammoth.vmdl", + h103 = "models/items/courier/arneyb_rabbit/arneyb_rabbit.vmdl", + h104 = "models/items/courier/axolotl/axolotl.vmdl", + h105 = "models/items/courier/coco_the_courageous/coco_the_courageous.vmdl", + h106 = "models/items/courier/coral_furryfish/coral_furryfish.vmdl", + h107 = "models/items/courier/corsair_ship/corsair_ship.vmdl", + h108 = "models/items/courier/duskie/duskie.vmdl", + h109 = "models/items/courier/itsy/itsy.vmdl", + h110 = "models/items/courier/jumo/jumo.vmdl", + h111 = "models/items/courier/mighty_chicken/mighty_chicken.vmdl", + h112 = "models/items/courier/nexon_turtle_05_green/nexon_turtle_05_green.vmdl", + h113 = "models/items/courier/pumpkin_courier/pumpkin_courier.vmdl", + h114 = "models/items/courier/pw_ostrich/pw_ostrich.vmdl", + h115 = "models/items/courier/scuttling_scotty_penguin/scuttling_scotty_penguin.vmdl", + h116 = "models/items/courier/shagbark/shagbark.vmdl", + h117 = "models/items/courier/snaggletooth_red_panda/snaggletooth_red_panda.vmdl", + h118 = "models/items/courier/snail/courier_snail.vmdl", + h119 = "models/items/courier/teron/teron.vmdl", + h120 = "models/items/courier/xianhe_stork/xianhe_stork.vmdl", + h121 = "models/items/courier/starladder_grillhound/starladder_grillhound.vmdl", + h122 = "models/items/courier/pw_zombie/pw_zombie.vmdl", + h123 = "models/items/courier/raiq/raiq.vmdl", + h124 = "models/courier/frog/frog.vmdl", + h125 = "models/courier/godhorse/godhorse.vmdl", + h126 = "models/courier/imp/imp.vmdl", + h127 = "models/courier/mighty_boar/mighty_boar.vmdl", + h128 = "models/items/courier/onibi_lvl_03/onibi_lvl_03.vmdl", + h129 = "models/items/courier/echo_wisp/echo_wisp.vmdl", --蠕行水母 + h130 = "models/courier/sw_donkey/sw_donkey.vmdl", --驴法师new + h131 = "models/items/courier/gnomepig/gnomepig.vmdl", --丰臀公主new + h132 = "models/items/furion/treant/ravenous_woodfang/ravenous_woodfang.vmdl",--焚牙树精new + h133 = "models/courier/mechjaw/mechjaw.vmdl",--机械咬人箱new + h134 = "models/items/courier/mole_messenger/mole_messenger.vmdl",--1级矿车老鼠 + h135 = "models/items/courier/jumo_dire/jumo_dire.vmdl", + h136 = "models/items/courier/courier_ti9/courier_ti9.vmdl", + h137 = "models/items/courier/courier_ti9/courier_ti9_lvl2/courier_ti9_lvl2.vmdl", + h138 = "models/props_gameplay/donkey.vmdl", + h139 = "models/hy/huya.vmdl", + + --小英雄信使 ameteur + h201 = "models/courier/doom_demihero_courier/doom_demihero_courier.vmdl", + h202 = "models/courier/huntling/huntling.vmdl", + h203 = "models/courier/minipudge/minipudge.vmdl", + h204 = "models/courier/seekling/seekling.vmdl", + h205 = "models/items/courier/baekho/baekho.vmdl", + h206 = "models/items/courier/basim/basim.vmdl", + h207 = "models/items/courier/devourling/devourling.vmdl", + h208 = "models/items/courier/faceless_rex/faceless_rex.vmdl", + h209 = "models/items/courier/tinkbot/tinkbot.vmdl", + h210 = "models/items/courier/lilnova/lilnova.vmdl", + h211 = "models/items/courier/amphibian_kid/amphibian_kid.vmdl", + h212 = "models/courier/venoling/venoling.vmdl", + h213 = "models/courier/juggernaut_dog/juggernaut_dog.vmdl", + h214 = "models/courier/otter_dragon/otter_dragon.vmdl", + h215 = "models/items/courier/boooofus_courier/boooofus_courier.vmdl", + h216 = "models/courier/baby_winter_wyvern/baby_winter_wyvern.vmdl", + h217 = "models/courier/yak/yak.vmdl", + h218 = "models/items/furion/treant/eternalseasons_treant/eternalseasons_treant.vmdl", + h219 = "models/items/courier/blue_lightning_horse/blue_lightning_horse.vmdl", + h220 = "models/items/courier/waldi_the_faithful/waldi_the_faithful.vmdl", + h221 = "models/items/courier/bajie_pig/bajie_pig.vmdl", + h222 = "models/items/courier/courier_faun/courier_faun.vmdl", + h223 = "models/items/courier/livery_llama_courier/livery_llama_courier.vmdl", + h224 = "models/items/courier/onibi_lvl_10/onibi_lvl_10.vmdl", + h225 = "models/items/courier/little_fraid_the_courier_of_simons_retribution/little_fraid_the_courier_of_simons_retribution.vmdl", --胆小南瓜人 + h226 = "models/items/courier/hermit_crab/hermit_crab.vmdl", --螃蟹1 + h227 = "models/items/courier/hermit_crab/hermit_crab_boot.vmdl", --螃蟹2 + h228 = "models/items/courier/hermit_crab/hermit_crab_shield.vmdl", --螃蟹3 + h229 = "models/courier/donkey_unicorn/donkey_unicorn.vmdl", --竭智法师new + h230 = "models/items/courier/white_the_crystal_courier/white_the_crystal_courier.vmdl", --蓝心白隼new + h231 = "models/items/furion/treant/furion_treant_nelum_red/furion_treant_nelum_red.vmdl",--莲花人new + h232 = "models/courier/beetlejaws/mesh/beetlejaws.vmdl",--甲虫咬人箱new + h233 = "models/courier/smeevil_bird/smeevil_bird.vmdl", + h234 = "models/items/courier/mole_messenger/mole_messenger_lvl4.vmdl",--蜡烛头矿车老鼠 + h235 = "models/items/courier/chocobo/chocobo.vmdl", --迅捷陆行鸟 + h236 = "models/items/courier/flightless_dod/flightless_dod.vmdl", --嘟嘟鸟 + h237 = "models/items/courier/frostivus2018_courier_serac_the_seal/frostivus2018_courier_serac_the_seal.vmdl", + h238 = "models/items/courier/pangolier_squire/pangolier_squire.vmdl", + h239 = "models/hujing_wangyu/hujing.vmdl", + h240 = "models/items/courier/courier_ti9/courier_ti9_lvl3/courier_ti9_lvl3.vmdl", + h241 = "models/items/courier/axolotl/axolotl.vmdl", + h242 = "models/items/courier/snaggletooth_red_panda/snaggletooth_red_panda.vmdl", + h243 = "models/items/courier/xianhe_stork/xianhe_stork.vmdl", + + --珍藏信使 pro + h301 = "models/items/courier/bookwyrm/bookwyrm.vmdl", + h302 = "models/items/courier/captain_bamboo/captain_bamboo.vmdl", + h303 = "models/items/courier/kanyu_shark/kanyu_shark.vmdl", + h304 = "models/items/courier/tory_the_sky_guardian/tory_the_sky_guardian.vmdl", + h305 = "models/items/courier/shroomy/shroomy.vmdl", + h306 = "models/items/courier/courier_janjou/courier_janjou.vmdl", + h307 = "models/items/courier/green_jade_dragon/green_jade_dragon.vmdl", + h308 = "models/courier/drodo/drodo.vmdl", + h309 = "models/courier/mech_donkey/mech_donkey.vmdl", + h310 = "models/courier/donkey_crummy_wizard_2014/donkey_crummy_wizard_2014.vmdl", + h311 = "models/courier/octopus/octopus.vmdl", + h312 = "models/items/courier/scribbinsthescarab/scribbinsthescarab.vmdl", + h313 = "models/courier/defense3_sheep/defense3_sheep.vmdl", + h314 = "models/items/courier/snapjaw/snapjaw.vmdl", + h315 = "models/items/courier/g1_courier/g1_courier.vmdl", + h316 = "models/courier/donkey_trio/mesh/donkey_trio.vmdl", + h317 = "models/items/courier/boris_baumhauer/boris_baumhauer.vmdl", + h318 = "models/courier/baby_rosh/babyroshan.vmdl", + h319 = "models/items/courier/bearzky/bearzky.vmdl", + h320 = "models/items/courier/defense4_radiant/defense4_radiant.vmdl", + h321 = "models/items/courier/defense4_dire/defense4_dire.vmdl", + h322 = "models/items/courier/onibi_lvl_20/onibi_lvl_20.vmdl", + h323 = "models/items/juggernaut/ward/fortunes_tout/fortunes_tout.vmdl", --招财猫 + h324 = "models/items/courier/hermit_crab/hermit_crab_necro.vmdl", --螃蟹4 + h325 = "models/items/courier/hermit_crab/hermit_crab_travelboot.vmdl", --螃蟹5 + h326 = "models/items/courier/hermit_crab/hermit_crab_lotus.vmdl", --螃蟹6 + h327 = "models/courier/donkey_ti7/donkey_ti7.vmdl", + h328 = "models/items/courier/shibe_dog_cat/shibe_dog_cat.vmdl", --天猫地狗new + h329 = "models/items/furion/treant/hallowed_horde/hallowed_horde.vmdl",--万圣树群new + h330 = "models/courier/flopjaw/flopjaw.vmdl",--大嘴咬人箱new + h331 = "models/courier/lockjaw/lockjaw.vmdl",--咬人箱洛克new + h332 = "models/items/courier/butch_pudge_dog/butch_pudge_dog.vmdl",--布狗new + h333 = "models/courier/turtle_rider/turtle_rider.vmdl", + h334 = "models/courier/smeevil_crab/smeevil_crab.vmdl", + h335 = "models/items/courier/mole_messenger/mole_messenger_lvl6.vmdl",--绿钻头矿车老鼠 + h336 = "models/items/courier/amaterasu/amaterasu.vmdl", --天照大神 + h337 = "models/qie/qie.vmdl", + h338 = "models/courier/f2p_courier/f2p_courier.vmdl", + h339 = "models/items/courier/azuremircourierfinal/azuremircourierfinal.vmdl", + h340 = "models/items/courier/courier_ti9/courier_ti9_lvl6/courier_ti9_lvl6.vmdl", + h341 = "models/bilibilitv/model/tv.vmdl", + h342 = "models/courier/baby_rosh/babyroshan.vmdl", + h343 = "models/courier/baby_rosh/babyroshan.vmdl", + h344 = "models/courier/baby_rosh/babyroshan.vmdl", + h345 = "models/courier/baby_winter_wyvern/baby_winter_wyvern.vmdl", + h346 = "models/courier/beetlejaws/mesh/beetlejaws.vmdl", + h347 = "models/courier/doom_demihero_courier/doom_demihero_courier.vmdl", + h348 = "models/courier/huntling/huntling.vmdl", + h349 = "models/courier/minipudge/minipudge.vmdl", + h350 = "models/courier/seekling/seekling.vmdl", + h351 = "models/courier/venoling/venoling.vmdl", + h352 = "models/items/courier/axolotl/axolotl.vmdl", + h353 = "models/items/courier/devourling/devourling.vmdl", + h354 = "models/courier/baby_rosh/babyroshan_elemental.vmdl", + h355 = "models/courier/baby_rosh/babyroshan_elemental.vmdl", + + h399 = "models/courier/baby_rosh/babyroshan_winter18.vmdl",--姜饼肉山 + + --战队信使 master + h401 = "models/courier/navi_courier/navi_courier.vmdl", + h402 = "models/items/courier/courier_mvp_redkita/courier_mvp_redkita.vmdl", + h403 = "models/items/courier/ig_dragon/ig_dragon.vmdl", + h404 = "models/items/courier/lgd_golden_skipper/lgd_golden_skipper.vmdl", + h405 = "models/items/courier/vigilante_fox_red/vigilante_fox_red.vmdl", + h406 = "models/items/courier/virtus_werebear_t3/virtus_werebear_t3.vmdl", + h407 = "models/items/courier/throe/throe.vmdl", + h408 = "models/items/courier/vaal_the_animated_constructradiant/vaal_the_animated_constructradiant.vmdl", + h409 = "models/items/courier/vaal_the_animated_constructdire/vaal_the_animated_constructdire.vmdl", + h410 = "models/items/courier/carty/carty.vmdl", + h411 = "models/items/courier/carty_dire/carty_dire.vmdl", + h412 = "models/items/courier/dc_angel/dc_angel.vmdl", + h413 = "models/items/courier/dc_demon/dc_demon.vmdl", + h414 = "models/items/courier/vigilante_fox_green/vigilante_fox_green.vmdl", + h415 = "models/items/courier/bts_chirpy/bts_chirpy.vmdl", + h416 = "models/items/courier/krobeling/krobeling.vmdl", + h417 = "models/items/courier/jin_yin_black_fox/jin_yin_black_fox.vmdl", + h418 = "models/items/courier/jin_yin_white_fox/jin_yin_white_fox.vmdl", + h419 = "models/items/courier/fei_lian_blue/fei_lian_blue.vmdl", + h420 = "models/items/courier/gama_brothers/gama_brothers.vmdl", + h421 = "models/items/courier/onibi_lvl_21/onibi_lvl_21.vmdl", + h422 = "models/items/courier/wabbit_the_mighty_courier_of_heroes/wabbit_the_mighty_courier_of_heroes.vmdl", --小飞侠 + h423 = "models/items/courier/hermit_crab/hermit_crab_octarine.vmdl", --螃蟹7 + h424 = "models/items/courier/hermit_crab/hermit_crab_skady.vmdl", --螃蟹8 + h425 = "models/items/courier/hermit_crab/hermit_crab_aegis.vmdl", --螃蟹9 + h426 = "models/items/furion/treant_flower_1.vmdl",--绽放树精new + h427 = "models/courier/smeevil_magic_carpet/smeevil_magic_carpet.vmdl", + h428 = "models/items/courier/mole_messenger/mole_messenger_lvl7.vmdl",--绿钻头金矿车老鼠 + h499 = "models/items/courier/krobeling_gold/krobeling_gold.vmdl",--金dp + h429 = "models/items/courier/nilbog/nilbog.vmdl",--贪小疯魔 + h430 = "models/courier/frull/frull_courier.vmdl", --灵犀弗拉尔 + h431 = "models/items/courier/sltv_10_courier/sltv_10_courier.vmdl", --黄油小生 + h432 = "models/items/courier/nian_courier/nian_courier.vmdl", --年兽宝宝 + h433 = "models/courier/baby_rosh/babyroshan_ti9.vmdl", + h434 = "models/items/courier/courier_ti9/courier_ti9_lvl7/courier_ti9_lvl7.vmdl", + h435 = "models/shudaixiong/model/shudaixiong/shudaixiong.vmdl", + h436 = "models/courier/baby_rosh/babyroshan.vmdl", + h437 = "models/courier/baby_rosh/babyroshan.vmdl", + h438 = "models/courier/baby_winter_wyvern/baby_winter_wyvern.vmdl", + h439 = "models/courier/flopjaw/flopjaw.vmdl", + h440 = "models/courier/juggernaut_dog/juggernaut_dog.vmdl", + h441 = "models/courier/smeevil_crab/smeevil_crab.vmdl", + h442 = "models/items/courier/axolotl/axolotl.vmdl", + h443 = "models/items/courier/fei_lian_blue/fei_lian_blue.vmdl", + h444 = "models/items/courier/wabbit_the_mighty_courier_of_heroes/wabbit_the_mighty_courier_of_heroes.vmdl", + h445 = "models/items/courier/wabbit_the_mighty_courier_of_heroes/wabbit_the_mighty_courier_of_heroes.vmdl", + h446 = "models/items/courier/wabbit_the_mighty_courier_of_heroes/wabbit_the_mighty_courier_of_heroes.vmdl", +} + +local reimu_pet_skin = +{ + h138 = 1, + h436 = 1, + h437 = 2, + h342 = 3, + h343 = 4, + h344 = 5, + h354 = 1, + h355 = 2, + h345 = 1, + h438 = 2, + h346 = 1, + h347 = 1, + h348 = 1, + h440 = 1, + h349 = 1, + h350 = 1, + h441 = 1, + h351 = 1, + + h241 = 1, + h352 = 2, + h442 = 3, + h353 = 1, + h242 = 1, + h444 = 1, + h445 = 2, + h446 = 3, + h243 = 1, + h443 = 1, + h439 = 1, +} + +local reimu_pet_size = +{ + h000 = 1, + + h001 = 1, + h002 = 1, + --普通信使 beginner + h101 = 1.1, + h102 = 1.1, + h103 = 1.1, + h104 = 1, + h105 = 1, + h106 = 1, + h107 = 1.2, + h108 = 1, + h109 = 1.1, + h110 = 1.1, + h111 = 1.1, + h112 = 1.2, + h113 = 1, + h114 = 1.2, + h115 = 1.2, + h116 = 1, + h117 = 1.3, + h118 = 1.1, + h119 = 1.3, + h120 = 1.3, + h121 = 1.1, + h122 = 1.1, + h123 = 1.2, + h124 = 1, + h125 = 1, + h126 = 1, + h127 = 1, + h128 = 1.1, + h129 = 1.2, --蠕行水母 + h130 = 1, --驴法师new + h131 = 1, --丰臀公主new + h132 = 0.7,--焚牙树精new + h133 = 1.1,--机械咬人箱new + h134 = 1.1,--1级矿车老鼠 + h135 = 1.1, + h136 = 1.1, + h137 = 1.15, + h138 = 1.15, + h139 = 2.5, + + h199 = 1.5, + --小英雄信使 ameteur + h201 = 1.2, + h202 = 1.2, + h203 = 1.2, + h204 = 1.2, + h205 = 1.2, + h206 = 1.2, + h207 = 1.2, + h208 = 1.3, + h209 = 1.2, + h210 = 1.25, + + h211 = 1.2, + h212 = 1.1, + h213 = 1, + h214 = 1.25, + h215 = 1.2, + h216 = 1.25, + h217 = 1.2, + h218 = 1.1, + h219 = 1.2, + h220 = 1.25, + h221 = 1.25, + h222 = 1.3, + h223 = 1.15, + h224 = 1.25, + h225 = 1.3, --胆小南瓜人 + h226 = 1.3, --螃蟹1 + h227 = 1.3, --螃蟹2 + h228 = 1.2, --螃蟹3 + + h229 = 1.2, --竭智法师new + h230 = 1.3, --蓝心白隼new + h231 = 0.8,--莲花人new + h232 = 1.2,--甲虫咬人箱new + h233 = 1.2, + h234 = 1.2,--蜡烛头矿车老鼠 + h235 = 1.2, --迅捷陆行鸟 + h236 = 1.2, --嘟嘟鸟 + h237 = 1.2, + h238 = 0.8, + h239 = 1.4, + h240 = 1.25, + h241 = 1.1, + h242 = 1.4, + h243 = 1.4, + + --珍藏信使 pro + h301 = 1.3, + h302 = 1.3, + h303 = 1.3, + h304 = 1.35, + h305 = 1.3, + h306 = 1.3, + h307 = 1.3, + h308 = 1.3, + h309 = 1.2, + + h310 = 1.2, + h311 = 1.25, + h312 = 1.3, + h313 = 1.3, + h314 = 1.3, + h315 = 1.25, + h316 = 1.3, + h317 = 1.4, + h318 = 1.3, + h319 = 1.3, + h320 = 1.3, + h321 = 1.3, + h322 = 1.3, + h323 = 1.1, --招财猫 + h324 = 1.3, --螃蟹4 + h325 = 1.25, --螃蟹5 + h326 = 1.25, --螃蟹6 + h327 = 1.25, + + h328 = 1.3, --天猫地狗new + h329 = 0.9,--万圣树群new + h330 = 1.3,--大嘴咬人箱new + h331 = 1.25,--咬人箱洛克new + h332 = 1.3,--布狗new + h333 = 1.3, + h334 = 1.3, + h335 = 1.1,--绿钻头矿车老鼠 + h336 = 1.15, --天照大神 + h337 = 1.4, + h338 = 1.3, + h339 = 1.4, + h340 = 1.3, + h341 = 2.3, + h342 = 1.3, + h343 = 1.3, + h344 = 1.3, + h354 = 1.3, + h355 = 1.3, + h345 = 1.35, + h346 = 1.3, + h347 = 1.3, + h348 = 1.3, + h349 = 1.3, + h350 = 1.3, + h351 = 1.2, + h352 = 1.2, + h353 = 1.3, + + h399 = 1.2,--姜饼肉山 + + --战队信使 master + h401 = 1.4, + h402 = 1.4, + h403 = 1.4, + h404 = 1.55, + h405 = 1.4, + h406 = 1.5, + h407 = 1.3, + + h408 = 1.35, + h409 = 1.35, + h410 = 1.3, + h411 = 1.3, + h412 = 1.3, + h413 = 1.3, + h414 = 1.4, + h415 = 1.35, + h416 = 1.4, + h417 = 1.4, + h418 = 1.4, + h419 = 1.4, + h420 = 1.2, + h421 = 1.35, + h422 = 1.4, --小飞侠 + h423 = 1.3, --螃蟹7 + h424 = 1.3, --螃蟹8 + h425 = 1.3, --螃蟹9 + + h426 = 1.1,--绽放树精new + h427 = 1.55, + h428 = 1.2,--绿钻头金矿车老鼠 + + h499 = 1.55,--金dp + h429 = 1.3,--贪小疯魔 + + h430 = 1.3, --灵犀弗拉尔 + h431 = 1.2, --黄油小生 + h432 = 1.3, --年兽宝宝 + h433 = 1.35, + h434 = 1.4, + h435 = 1.0, + h438 = 1.45, + h439 = 1.35, + h440 = 1.2, + h441 = 1.4, + h442 = 1.3, + h444 = 1.4, + h445 = 1.4, + h446 = 1.4, + h443 = 1.4, + h436 = 1.4, + h437 = 1.4, +} + +local reimu_pet_effect = +{ + -- 未包含的 + -- "e316", -- 一圈蓝色五角星 + -- "e999", -- 皇冠 + + "e000", -- 无特效 + + "e101", + "e102", + "e103", + "e104", + "e107", + "e108", + "e111", + "e112", + "e113", + "e114", + "e201", + "e202", + "e203", + "e205", + "e210", + "e213", + "e214", + "e301", + "e302", + "e303", + "e304", + "e305", + "e306", + "e308", + "e309", + "e311", + "e312", + "e313", + "e315", + "e317", + "e319", + "e320", + "e321", + "e322", + "e401", + "e402", + "e403", + "e404", + "e405", + "e406", + "e407", + "e408", + "e409", + "e410", + "e451", + "e452", + "e453", + "e454", + "e455", + "e456", + "e457", + "e458", + "e459", +} + +local courier_flyup_effect_list = +{ + h208 = "effect/xukong/cour_rex_flying.vpcf", + h432 = "effect/nianshou/courier_nian_ambient.vpcf", + h499 = "effect/jin_dp/courier_krobeling_gold_ambient.vpcf", + h399 = "effect/jiangbing/1.vpcf", + h308 = "effect/drodo/1.vpcf", + h199 = "effect/gewugu/3.vpcf", + h239 = "effect/wangyu/1.vpcf", + h303 = "effect/douyu/2.vpcf", + h433 = "effect/roshan_ti9/1.vpcf", + h341 = "effect/music/1.vpcf", + h354 = "effect/lava_roshan/1.vpcf", + h355 = "effect/frost_roshan/ambient.vpcf", + h342 = "effect/darkmoon_roshan/1.vpcf", + h343 = "effect/sand_roshan/baby_roshan_desert_sands_ambient.vpcf", + h344 = "effect/biyu_roshan/1.vpcf", + h436 = "effect/golden_roshan/ambient.vpcf", + h437 = "effect/platinum_roshan/ambient.vpcf", + h438 = "effect/golden_ww/1.vpcf", + h439 = "effect/gold_angel/angels.vpcf", + h440 = "effect/liansai_dog/1.vpcf", + h441 = "effect/liansai_dog2/1.vpcf", + h446 = "effect/wabbit/lvl3.vpcf", +} + +local courier_ground_effect_list = +{ + h199 = "effect/gewugu/2.vpcf", + h303 = "particles/gem/brewmaster_drunken_haze_debuff_bubbles_2.vpcf", +} + +function SetDefaultSkin(caster, index) + local skin = + { + { + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl1_ambient.vpcf", + }, + { + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl2/courier_ti10_radiant_lvl2.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl2_ambient.vpcf", + }, + { + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl3/courier_ti10_radiant_lvl3.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl3_ambient.vpcf", + }, + { + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl4/courier_ti10_radiant_lvl4.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl4_ambient.vpcf", + }, + { + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl5/courier_ti10_radiant_lvl5.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl5_ambient.vpcf", + }, + { + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl6/courier_ti10_radiant_lvl6.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl6_ambient.vpcf", + }, + { + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl7/courier_ti10_radiant_lvl7.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl7_ambient.vpcf", + } + } + if index == nil or index < 1 or index > #skin then + index = RandomInt(1, #skin) + end + local model = skin[index][1] + local effect = skin[index][2] + caster:SetOriginalModel(model) + caster:SetModel(model) + caster:SetModelScale(1.0) + + if caster.effect_name ~= nil then + caster:RemoveAbility(caster.effect_name) + caster:RemoveModifierByName('modifier_texiao_star') + caster.effect_name = nil + end + if caster.default_effect ~= nil then + ParticleManager:DestroyParticleSystem(caster.default_effect, true) + caster.default_effect = nil + end + + local effectIndex = ParticleManager:CreateParticle(effect, PATTACH_ABSORIGIN_FOLLOW, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + caster.default_effect = effectIndex + -- ParticleManager:DestroyParticleSystem(effectIndex,false) + -- PATTACH_ABSORIGIN_FOLLOW + -- PATTACH_POINT_FOLLOW + -- PATTACH_WORLDORIGIN +end + +function OnSpellStartReimuPet01(keys) + local caster = keys.caster + + if caster.is_init ~= true then + caster.is_init = true + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_reimu_pet_01_state", nil) + local playerid = caster:GetPlayerOwnerID() + local petLevel = GameRules.PlayerData[playerid].pet_level + caster.pet_level = petLevel + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_reimu_pet_01_level", nil):SetStackCount(petLevel) + caster:CreatureLevelUp(petLevel - 1) + + local keyTotal = GameRules.PlayerData[playerid].key_total or 0 + if keyTotal > 0 then + local item = CreateItem("item_3121", nil, nil) + if item ~= nil then + item.owner_player_id = playerid + item:SetPurchaser(caster:GetOwner()) + item:SetCurrentCharges(keyTotal) + caster:GetOwner():AddItem(item) + end + end + + local key = GameRules.PlayerData[playerid].pet_model + if reimu_pet_model[key] == nil then + GameRules.PlayerData[playerid].pet_model = "h000" + key = "h000" + end + caster.pet_model = key + + if key == "h000" then + SetDefaultSkin(caster) + elseif string.sub(key,1,4) == "h000" then + SetDefaultSkin(caster, table.keyindex(reimu_pet_model, key)) + else + local model = reimu_pet_model[key] + caster:SetOriginalModel(model) + caster:SetModel(model) + caster:SetSkin(reimu_pet_skin[key] or 0) + caster:SetModelScale(math.min(2.5, (reimu_pet_size[key] or 1) * (1 + 0.05 * petLevel))) + + local effect = GameRules.PlayerData[playerid].pet_effect or "e000" + if table.hasvalue(reimu_pet_effect, effect) then + caster.effect_name = effect + AddAbilityAndSetLevel(caster, effect) + if courier_flyup_effect_list[effect] ~= nil then + ShowCourierEffect(caster,1) + else + ShowCourierEffect(caster,2) + end + end + end + + return + end + + local index = (table.keyindex(reimu_pet_model, caster.pet_model) or 0) + 1 + if index > math.min(caster.pet_level or 1, table.count(reimu_pet_model)) then + index = 1 + end + + if caster.default_effect ~= nil then + ParticleManager:DestroyParticleSystem(caster.default_effect,true) + caster.default_effect = nil + end + + local key = table.getkey(reimu_pet_model, index) + caster.pet_model = key + + if string.sub(key,1,4) == "h000" then + SetDefaultSkin(caster, index) + else + local model = reimu_pet_model[key] + caster:SetOriginalModel(model) + caster:SetModel(model) + caster:SetSkin(reimu_pet_skin[key] or 0) + caster:SetModelScale(math.min(2.5, (reimu_pet_size[key] or 1) * (1 + 0.05 * caster.pet_level))) + end + + if tostring(PlayerResource:GetSteamID(caster:GetPlayerOwnerID())) == GameRules.GameData.admin then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "show_message", {msg="change_to_pet_model", duration=5, params={key = caster.pet_model}, color="#ff0"} ) + end +end + +function OnSpellStartReimuPet02(keys) + local caster = keys.caster + + if string.sub(caster.pet_model,1,4) ~= "h000" and caster.default_effect ~= nil then + ParticleManager:DestroyParticleSystem(caster.default_effect,true) + caster.default_effect = nil + end + + if caster.effect_name ~= nil then + caster:RemoveAbility(caster.effect_name) + caster:RemoveModifierByName('modifier_texiao_star') + end + + local index = 0 + if caster.effect_name == nil then + index = 1 + else + for k,v in ipairs(reimu_pet_effect) do + if v == caster.effect_name then + index = k + 1 + break + end + end + if index > math.min(caster.pet_level or 1, #reimu_pet_effect) then + index = 1 + end + end + + local effect = reimu_pet_effect[index] + caster.effect_name = effect + AddAbilityAndSetLevel(caster, effect) + if courier_flyup_effect_list[effect] ~= nil then + ShowCourierEffect(caster,1) + else + ShowCourierEffect(caster,2) + end + + if tostring(PlayerResource:GetSteamID(caster:GetPlayerOwnerID())) == GameRules.GameData.admin then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "show_message", {msg="change_to_pet_effect", duration=5, params={key = caster.effect_name}, color="#ff0"} ) + end +end + +function OnSpellStartReimuPet03(keys) + local caster = keys.caster + + local playerid = caster:GetPlayerOwnerID() + GameRules.PlayerData[playerid].pet_model = caster.pet_model + GameRules.PlayerData[playerid].pet_effect = caster.effect_name + Service:SavePetCustom(playerid) + + UnitStunTarget(caster,caster,6.0) + + local vecCaster = caster:GetOrigin() + local count = 4 + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_patchouli_04/ability_patchouli_04.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, vecCaster + Vector(0,0,256)) + ParticleManager:SetParticleControl(effectIndex, 1, vecCaster + Vector(0,0,256)) + ParticleManager:SetParticleControl(effectIndex, 3, vecCaster + Vector(0,0,256)) + + caster:SetContextThink(DoUniqueString("OnSpellStartReimuPet03"), + function() + count = count * 2 + local radius = math.min(128,count) + ParticleManager:SetParticleControl(effectIndex, 14, Vector(radius,0,0)) + if count > 100 then + ParticleManager:DestroyParticleSystemTimeFalse(effectIndex,3.0) + return nil + end + return 0.5 + end, + 0.5) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/remilia/ability_remilia_04_laser.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndex, 0, vecCaster+Vector(0,0,700)) + ParticleManager:SetParticleControl(effectIndex, 1, vecCaster+Vector(800,0,800)) + ParticleManager:SetParticleControl(effectIndex, 2, vecCaster+Vector(0,0,0)) + ParticleManager:SetParticleControl(effectIndex, 3, vecCaster+Vector(-800,0,800)) + ParticleManager:SetParticleControl(effectIndex, 4, vecCaster+Vector(0,0,1600)) + ParticleManager:SetParticleControl(effectIndex, 6, vecCaster) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local effectIndexSmoke = ParticleManager:CreateParticle("particles/heroes/remilia/ability_remilia_04_laser_rocket.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndexSmoke, 0, vecCaster+Vector(0,0,700)) + ParticleManager:SetParticleControl(effectIndexSmoke, 1, Vector(1,0,0)) + ParticleManager:SetParticleControl(effectIndexSmoke, 2, Vector(-1,0,0)) + ParticleManager:SetParticleControl(effectIndexSmoke, 3, Vector(0,0,0.5)) + ParticleManager:SetParticleControl(effectIndexSmoke, 4, Vector(0,0,-1)) + ParticleManager:DestroyParticleSystem(effectIndexSmoke,false) +end + +function OnSpellStartReimuPet04(keys) + local caster = keys.caster + local playerid = caster:GetPlayerOwnerID() + local hero = caster:GetOwner() + + if hero:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then + CustomGameEventManager:Send_ServerToPlayer(hero:GetPlayerOwner(), "display_custom_error", {msg="not_enough_item_slot"}) + return + end + + if tostring(PlayerResource:GetSteamID(caster:GetPlayerOwnerID())) == GameRules.GameData.admin then + local item = hero:FindItemInInventory("item_3121") + if item ~= nil then + item:SetCurrentCharges(item:GetCurrentCharges() + 1) + else + item = CreateItem("item_3121", nil, nil) + if item ~= nil then + item.owner_player_id = playerid + item:SetPurchaser(hero) + hero:AddItem(item) + -- local vHitLoc = caster:GetAttachmentOrigin(caster:ScriptLookupAttachment("attach_hitloc")) + -- local drop = CreateItemOnPositionSync(vHitLoc, item) + -- item:LaunchLootInitialHeight(false, vHitLoc.z, vHitLoc.z+200, 1.0, GetGroundPosition(caster:GetOwner():GetAbsOrigin() + caster:GetOwner():GetForwardVector() * 100, caster:GetOwner())) + end + end + caster:EmitSound(reimu_pet_sound[RandomInt(1, #reimu_pet_sound)]) + CustomGameEventManager:Send_ServerToPlayer(hero:GetPlayerOwner(), "show_message", {msg="key_made_tip", duration=3, params={}, color="#ff0"}) + + ParticleManager:DestroyParticleSystem(hero.thtd_emoji_effect,true) + hero.thtd_emoji_effect = ParticleManager:CreateParticle("particles/thtd/emoji/thtd_msg_hongliange.vpcf", PATTACH_OVERHEAD_FOLLOW, hero) + ParticleManager:SetParticleControlEnt(hero.thtd_emoji_effect , 0, hero, PATTACH_OVERHEAD_FOLLOW, "attach_hitloc", Vector(0,0,0), true) --灵梦用 attach_emoji + ParticleManager:SetParticleControl(hero.thtd_emoji_effect, 3, Vector(1,0,0)) + ParticleManager:DestroyParticleSystemTime(hero.thtd_emoji_effect,5.0) + return + end + + if GameRules.PlayerData[playerid]["point"] == nil or GameRules.PlayerData[playerid]["point"] < keys.point then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "display_custom_error", {msg="not_enough_game_point"} ) + return + end + + caster:EmitSound(reimu_pet_sound[RandomInt(1, #reimu_pet_sound)]) + Service:BuyMagicKey(playerid, 1) +end + +local model_tree = +{ + -- "maps/journey_assets/props/trees/journey_armandpine/journey_armandpine_01.vmdl", + -- "maps/journey_assets/props/trees/journey_armandpine/journey_armandpine_02.vmdl", + -- "maps/journey_assets/props/trees/journey_maple/journey_maple02.vmdl", + -- "maps/jungle_assets/trees/kapok/export/kapok_002.vmdl", + -- "maps/jungle_assets/trees/kapok/export/kapok_003.vmdl", + -- "maps/jungle_assets/trees/kapok/export/kapok_004.vmdl", + -- "models/props_tree/dire_tree006.vmdl", + -- "models/props_tree/palm_01.vmdl", + -- "models/props_tree/palm_02b.vmdl", + -- "models/props_tree/palm_02c.vmdl", + -- "models/props_tree/palm_03_inspector.vmdl", + "models/props_tree/frostivus_tree.vmdl", -- 圣诞树 + -- "models/props_tree/newbloom_tree.vmdl", -- 新春树 +} + +function OnSpellStartReimuPet05(keys) + local caster = keys.caster + local targetPoint = keys.target_points[1] + + caster:EmitSound("UI.Aowu") + + if targetPoint.y > 415 and targetPoint.y < 2000 then + local y = 2000 + if (2000-targetPoint.y) > (targetPoint.y-415) then y = 415 end + targetPoint = Vector(targetPoint.x, y, targetPoint.z) + elseif targetPoint.y > -2000 and targetPoint.y < -415 then + local y = -2000 + if math.abs(-2000-targetPoint.y) > math.abs(-415-targetPoint.y) then y = -415 end + targetPoint = Vector(targetPoint.x, y, targetPoint.z) + end + if targetPoint.x > 3755 and targetPoint.x < 4470 then + targetPoint = Vector(3755, targetPoint.y, targetPoint.z) + elseif targetPoint.x < -3755 and targetPoint.x > -4470 then + targetPoint = Vector(-3755, targetPoint.y, targetPoint.z) + end + + if GetDistanceBetweenTwoVec2D(caster:GetAbsOrigin(), targetPoint) <= 200 then + caster.pet_point = nil + if caster.pet_tree ~= nil then UTIL_Remove(caster.pet_tree) end + caster.pet_tree = nil + else + caster.pet_point = targetPoint + if caster.pet_tree ~= nil then UTIL_Remove(caster.pet_tree) end + caster.pet_tree = CreateTempTreeWithModel(targetPoint, 36000, model_tree[RandomInt(1, #model_tree)]) + end +end + +function ShowCourierEffect(hero,type) + if hero.flyup_effect ~= nil then + ParticleManager:DestroyParticle(hero.flyup_effect,true) + end + if hero.ground_effect ~= nil then + ParticleManager:DestroyParticle(hero.ground_effect,true) + end + + local key = table.getkey(reimu_pet_model, hero.model_index) + + if type == 1 then + --陆地特效 + if key ~= nil and courier_ground_effect_list[key] ~= nil then + --陆地特效 + local ground_effect = courier_ground_effect_list[key] + hero.ground_effect = PlayParticleOnUnitUntilDeath({ + caster = hero, + p = ground_effect, + }) + end + end + if type == 2 then + --飞行特效 + if key ~= nil and courier_flyup_effect_list[key] ~= nil then + --飞行特效 + local flyup_effect = courier_flyup_effect_list[key] + hero.flyup_effect = PlayParticleOnUnitUntilDeath({ + caster = hero, + p = flyup_effect, + }) + end + end +end + +function PlayParticleOnUnitUntilDeath(keys) + local p = keys.p + local u = keys.caster + if u == nil then + return + end + local pos = keys.pos or PATTACH_ABSORIGIN_FOLLOW + local pp = ParticleManager:CreateParticle(p, pos, u) + ParticleManager:SetParticleControlEnt( pp, 0, u, pos, nil, u:GetOrigin(), true ); + ParticleManager:SetParticleControlEnt( pp, 1, u, pos, nil, u:GetOrigin(), true ); + ParticleManager:SetParticleControlEnt( pp, 2, u, pos, nil, u:GetOrigin(), true ); + ParticleManager:SetParticleControlEnt( pp, 3, u, pos, nil, u:GetOrigin(), true ); + ParticleManager:SetParticleControlEnt( pp, 4, u, pos, nil, u:GetOrigin(), true ); + ParticleManager:SetParticleControlEnt( pp, 5, u, pos, nil, u:GetOrigin(), true ); + ParticleManager:SetParticleControlEnt( pp, 6, u, pos, nil, u:GetOrigin(), true ); + + u:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if u == nil or u:IsNull() == true or u:IsAlive() == false then + if pp ~= nil then + ParticleManager:DestroyParticle(pp,true) + end + return + end + if pp == nil then + return + end + return 0.1 + end, + 0.1) + + return pp +end + + +function SetCourier(hero, onduty_hero, onduty_hero_effect) + local onduty_hero_model = GameRules:GetGameModeEntity().sm_hero_list[onduty_hero] + local onduty_hero_skin = GameRules:GetGameModeEntity().sm_hero_list_skin[onduty_hero] or 0 + hero:SetOriginalModel(onduty_hero_model) + hero:SetModel(onduty_hero_model) + hero:SetSkin(onduty_hero_skin) + hero.init_model_scale = GameRules:GetGameModeEntity().sm_hero_size[onduty_hero] or 1 + hero:SetModelScale(hero.init_model_scale) + hero.ori_model = onduty_hero_model + hero.ori_skin = onduty_hero_skin + if hero.effect ~= nil then + hero:RemoveAbility(hero.effect) + hero:RemoveModifierByName('modifier_texiao_star') + end + if onduty_hero_effect ~= 'e000' then + if string.find(GameRules:GetGameModeEntity().effect_list,onduty_hero_effect) then + AddAbilityAndSetLevel(hero,onduty_hero_effect) + hero.effect = onduty_hero_effect + end + end + ShowCourierEffect(hero,1) + hero.onduty_hero = onduty_hero +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityreisen.lua b/scripts/vscripts/abilities/abilityreisen.lua new file mode 100755 index 0000000..5d769d8 --- /dev/null +++ b/scripts/vscripts/abilities/abilityreisen.lua @@ -0,0 +1,146 @@ +function OnReisen01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + ReisenRepelUnit(caster, target) +end + +function ReisenRepelUnit(caster, target) + if target.thtd_is_fearing == true then return end + if target.next_move_point ~= nil and target.thtd_is_feared_by_reisen_01 ~= true then + + target.thtd_is_feared_by_reisen_01 = true + target.thtd_is_fearing = true + local current_next_move_point = target.next_move_point + + target.next_move_point = target:GetOrigin() - target:GetForwardVector() * 500 + + target:EmitSound("Hero_Sniper.ProjectileImpact") + + local count = 20 + target:SetContextThink(DoUniqueString("thtd_reisen01_move_next_point"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if not IsValidAlive(target) then + return nil + end + count = count - 1 + if count <= 0 or THTD_IsValid(caster) == false then + target.next_move_point = current_next_move_point + target.thtd_is_fearing = false + return nil + end + return 0.1 + end, + 0) + end +end + +function OnReisen02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster.thtd_reisen_02_illusion_count == nil then + caster.thtd_reisen_02_illusion_count = 0 + end + + if caster.thtd_reisen_02_illusion_count < keys.max_count and RollPercentage(keys.chance) then + caster:EmitSound("Sound_THTD.thtd_reisen_02") + local illusion = CreateUnitByName( + "reisen_illusion", + caster:GetOrigin() + RandomVector(150), + false, + caster:GetOwner(), + caster:GetOwner(), + caster:GetTeam() + ) + illusion.thtd_spawn_unit_owner = caster + illusion:SetControllableByPlayer(caster:GetPlayerOwnerID(), true) + local count = 0 + keys.ability:ApplyDataDrivenModifier(caster, illusion, "modifier_reisen_02_illusion", nil) + illusion:SetBaseDamageMax(caster:THTD_GetAttack()) + illusion:SetBaseDamageMin(caster:THTD_GetAttack()) + illusion:MoveToPositionAggressive(illusion:GetOrigin() + illusion:GetForwardVector() * 100) + illusion:SetContextThink(DoUniqueString("thtd_reisen02_illusion"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if count > 20 then + illusion:AddNoDraw() + illusion:ForceKill(true) + caster.thtd_reisen_02_illusion_count = caster.thtd_reisen_02_illusion_count - 1 + return nil + end + count = count + 1 + return 0.5 + end, + 0) + caster.thtd_reisen_02_illusion_count = caster.thtd_reisen_02_illusion_count + 1 + end +end + +function OnReisen03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + caster:EmitSound("Sound_THTD.thtd_reisen_03") + + if caster.thtd_reisen_02_illusion_count == nil then + caster.thtd_reisen_02_illusion_count = 0 + end + + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + caster.thtd_reisen_02_illusion_count * keys.damage_up/100) + local playerid = caster:GetPlayerOwnerID() + if GameRules.player_bb_buff[playerid]["item_3030"] > 0 then + damage = damage * (1 + GameRules.player_bb_buff[playerid]["item_3030"]/100) + end + for k,v in pairs(targets) do + Reisen03RepelUnit(caster, v) + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_reisen/ability_reisen_03.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 3, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 9, caster:GetOrigin()) + ParticleManager:DestroyParticleSystemTime(effectIndex,2.0) +end + +function Reisen03RepelUnit(caster, target) + if target.thtd_is_fearing == true then return end + if target.next_move_point ~= nil then + target.thtd_is_feared_by_reisen_01 = true + target.thtd_is_fearing = true + local current_next_move_point = target.next_move_point + + target.next_move_point = target:GetOrigin() - target:GetForwardVector() * 500 + + target:EmitSound("Hero_Sniper.ProjectileImpact") + + local count = 20 + target:SetContextThink(DoUniqueString("thtd_reisen01_move_next_point"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if not IsValidAlive(target) then + return nil + end + count = count - 1 + if count <= 0 or THTD_IsValid(caster) == false then + target.next_move_point = current_next_move_point + target.thtd_is_fearing = false + return nil + end + return 0.1 + end, + 0) + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityremilia.lua b/scripts/vscripts/abilities/abilityremilia.lua new file mode 100755 index 0000000..ff24032 --- /dev/null +++ b/scripts/vscripts/abilities/abilityremilia.lua @@ -0,0 +1,254 @@ +function OnRemilia01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local ability = keys.ability + local targetPoint = keys.target:GetOrigin() + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_remilia/ability_remilia_03_end.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 3, caster:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + effectIndex = ParticleManager:CreateParticle("particles/heroes/moluo/abiilty_moluo_014.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(ability) + + local powerBonus = #targets * keys.power_bonus + local duration_time = math.floor(keys.duration_time * 100 + 0.5) / 100 + + for k,target in pairs(targets) do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/moluo/ability_moluo01_explosion_vip.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 1, caster, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 2, target, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlForward(effectIndex, 2, caster:GetForwardVector()) + ParticleManager:SetParticleControlEnt(effectIndex , 5, caster, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 7, caster, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 10, caster, 5, "follow_origin", Vector(0,0,0), true) + + local crit = 1 + if target:HasModifier("modifier_remilia_03_debuff") then + crit = 10 + end + + local damage_table={ + ability = ability, + victim=target, + attacker=caster, + damage=damage * crit, + damage_type=ability:GetAbilityDamageType(), + damage_flags=ability:GetAbilityTargetFlags() + } + UnitDamageTarget(damage_table) + OnRemilia02SpellStart(caster) + end + + if powerBonus > 0 then + caster:THTD_AddBasePower(powerBonus) + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + caster:THTD_AddBasePower(-powerBonus) + return nil + end, + duration_time) + end +end + +function OnRemilia02SpellStart(caster) + local step = caster:GetAbilityValue("thtd_remilia_02", "damage_up") + local maxUp = caster:GetAbilityValue("thtd_remilia_02", "max_up") + local duration = caster:GetAbilityValue("thtd_remilia_02", "duration_time") + + if caster.thtd_remilia_02_outgoing == nil then + caster.thtd_remilia_02_outgoing = 0 + end + + local count = math.min(step, maxUp - caster.thtd_remilia_02_outgoing) + if count > 0 then + caster:AddDamageOutgoingMagical(count) + caster.thtd_remilia_02_outgoing = caster.thtd_remilia_02_outgoing + count + caster:SetContextThink(DoUniqueString("modifier_reimilia_02_buff_count"), + function() + if GameRules:IsGamePaused() then return 0.03 end + caster:AddDamageOutgoingMagical(-count) + caster.thtd_remilia_02_outgoing = caster.thtd_remilia_02_outgoing - count + return nil + end, + duration) + end +end + +function OnRemilia03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local targetPoint = keys.target_points[1] + local forward = (keys.target_points[1] - caster:GetOrigin()):Normalized() + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/remilia/ability_remilia_03_spark.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin() + Vector(forward.x * 92,forward.y * 92,150)) + ParticleManager:SetParticleControl(effectIndex, 8, Vector(forward.x,forward.y,0)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_remilia/ability_remilia_03_end.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 3, caster:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local info = + { + Ability = keys.ability, + EffectName = "particles/heroes/remilia/ability_remilia_01.vpcf", + vSpawnOrigin = caster:GetOrigin()+Vector(0,0,30), + fDistance = keys.distance, + fStartRadius = 300, + fEndRadius = 300, + Source = caster, + bHasFrontalCone = false, + bReplaceExisting = false, + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = false, + vVelocity = forward * 4000, + bProvidesVision = true, + iVisionRadius = 1000, + iVisionTeamNumber = caster:GetTeamNumber() + } + local projectile = ProjectileManager:CreateLinearProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) +end + +function OnRemilia03SpellHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local targetPoint = target:GetOrigin() + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/remilia/ability_remilia_01_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 3, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 5, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + if caster.thtd_remilia_03_chance_count == nil then + caster.thtd_remilia_03_chance_count = 0 + end + + local chance = caster:GetAbilityValue("thtd_remilia_04", "chance") + local success = RollPercentage(chance) + if caster.thtd_remilia_03_chance_count >= 100/chance then + success = true + end + if success then + caster.thtd_remilia_03_chance_count = 0 + else + caster.thtd_remilia_03_chance_count = caster.thtd_remilia_03_chance_count + 1 + end + + local damage = 0 + local ability4 = caster:FindAbilityByName("thtd_remilia_04") + if ability4:GetLevel() > 0 and success then + damage = ability4:GetSpecialValueFor("power_damage_03") * caster:THTD_GetStarDamage() + if not target:HasModifier("modifier_remilia_03_debuff") then + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_remilia_03_debuff",nil) + end + else + damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + end + + local crit = 1 + if target:HasModifier("modifier_remilia_03_debuff") then + crit = 10 + end + + local damage_table = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage * crit, + damage_type = keys.ability:GetAbilityDamageType(), + amage_flags = keys.ability:GetAbilityTargetFlags() + } + UnitDamageTarget(damage_table) + OnRemilia02SpellStart(caster) +end + +function OnRemilia03Created(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + target:RemoveMagicalResist() + target:RemovePhysicalArmor() + + local bonus = caster:GetAbilityValue("thtd_remilia_04", "damage_up") + target:AddDamageIncomingPhysical(bonus, "thtd_remilia_03_damage_up") + target:AddDamageIncomingMagical(bonus, "thtd_remilia_03_damage_up") +end + +function OnRemilia03Destroy(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.unit + local targetPoint = target:GetOrigin() + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/remilia/ability_remilia_04_laser.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint+Vector(0,0,700)) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint+Vector(800,0,800)) + ParticleManager:SetParticleControl(effectIndex, 2, targetPoint+Vector(0,0,0)) + ParticleManager:SetParticleControl(effectIndex, 3, targetPoint+Vector(-800,0,800)) + ParticleManager:SetParticleControl(effectIndex, 4, targetPoint+Vector(0,0,1600)) + ParticleManager:SetParticleControl(effectIndex, 6, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local effectIndexSmoke = ParticleManager:CreateParticle("particles/heroes/remilia/ability_remilia_04_laser_rocket.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndexSmoke, 0, targetPoint+Vector(0,0,700)) + ParticleManager:SetParticleControl(effectIndexSmoke, 1, Vector(1,0,0)) + ParticleManager:SetParticleControl(effectIndexSmoke, 2, Vector(-1,0,0)) + ParticleManager:SetParticleControl(effectIndexSmoke, 3, Vector(0,0,0.5)) + ParticleManager:SetParticleControl(effectIndexSmoke, 4, Vector(0,0,-1)) + ParticleManager:DestroyParticleSystem(effectIndexSmoke,false) + + local ability = caster:FindAbilityByName("thtd_remilia_04") + local time = math.floor(ability:GetSpecialValueFor("duration_time") * 100 + 0.5) / 100 + local tick = math.floor(ability:GetSpecialValueFor("tick_time") * 100 + 0.5) / 100 + local range = ability:GetSpecialValueFor("range") + + caster:EmitSound("Sound_THTD.thtd_remilia_04") + + caster:SetContextThink(DoUniqueString("ability_remilia_03_effect_destroy"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then return nil end + + if not THTD_IsValid(caster) then + ParticleManager:DestroyParticleSystem(effectIndex,true) + ParticleManager:DestroyParticleSystem(effectIndexSmoke,true) + return nil + end + + local damage = caster:THTD_GetAbilityPowerDamage(ability) + local targets = THTD_FindUnitsInRadius(caster,targetPoint,range) + for k,v in pairs(targets) do + local crit = 1 + if v:HasModifier("modifier_remilia_03_debuff") then + crit = 10 + end + local damage_table={ + ability = ability, + victim = v, + attacker = caster, + damage = damage * crit, + damage_type = ability:GetAbilityDamageType(), + damage_flags = ability:GetAbilityTargetFlags() + } + UnitDamageTarget(damage_table) + end + + OnRemilia02SpellStart(caster) + + time = time - tick + return tick + end, + 0) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityrin.lua b/scripts/vscripts/abilities/abilityrin.lua new file mode 100755 index 0000000..00fd29b --- /dev/null +++ b/scripts/vscripts/abilities/abilityrin.lua @@ -0,0 +1,111 @@ +function OnRin01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target:GetOrigin() + + caster:EmitSound("Sound_THTD.thtd_rin_01") + + local info = + { + Ability = keys.ability, + EffectName = "particles/heroes/rin/ability_rin_01.vpcf", + vSpawnOrigin = targetPoint, + fDistance = 1000, + fStartRadius = 400, + fEndRadius = 400, + Source = caster, + bHasFrontalCone = false, + bReplaceExisting = false, + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = false, + vVelocity = -keys.target:GetForwardVector() * 1500, + bProvidesVision = true, + iVisionRadius = 1000, + iVisionTeamNumber = caster:GetTeamNumber() + } + projectile = ProjectileManager:CreateLinearProjectile(info) + + Rin01Wheel(keys) +end + +function Rin01Wheel(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local origin = keys.target:GetOrigin() + local forward = -keys.target:GetForwardVector() + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/rin/ability_rin_01_projectile.vpcf", PATTACH_CUSTOMORIGIN, caster) + + ParticleManager:SetParticleControl(effectIndex, 0, origin) + ParticleManager:SetParticleControlForward(effectIndex, 0 , forward) + + local count = 0 + caster:SetContextThink(DoUniqueString("ability_rin_01_wheel_move"), + function () + if GameRules:IsGamePaused() then return 0.03 end + if count < 23 then + origin = origin + forward * 45 + ParticleManager:SetParticleControl(effectIndex, 0, origin) + count = count + 1 + else + ParticleManager:DestroyParticleSystem(effectIndex,false) + return nil + end + return 0.03 + end, + 0.03) +end + +function OnRin01ProjectileHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + if target~=nil and target:IsNull()== false and target:IsAlive() and target:HasModifier("modifier_rin_01_debuff")==false then + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_rin_01_debuff", nil) + end +end + +function OnRin01Death(keys) + if keys.caster_entindex==nil then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.unit + + if caster:FindAbilityByName("thtd_rin_02"):GetLevel() < 1 then return end + + target:EmitSound("Hero_Nevermore.Shadowraze") + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/moluo/abiilty_moluo_014.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local hp_damage = caster:GetAbilityValue("thtd_rin_02", "hp_damage", true) + local power_damage = caster:GetAbilityValue("thtd_rin_02", "power_damage") + local range = caster:GetAbilityValue("thtd_rin_02", "range") + + local damage = math.min(target:GetMaxHealth() * hp_damage, caster:THTD_GetStarDamage()*power_damage) + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),range) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityrumia.lua b/scripts/vscripts/abilities/abilityrumia.lua new file mode 100755 index 0000000..e76744c --- /dev/null +++ b/scripts/vscripts/abilities/abilityrumia.lua @@ -0,0 +1,343 @@ +function OnRumia01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + +function OnRumia01Kill(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.rumia_01_bonus == nil then + caster.rumia_01_bonus = 0 + end + + if caster:IsPower999() then + if caster.rumia_01_bonus < keys.max_bonus * 10 then + caster.rumia_01_bonus = caster.rumia_01_bonus + 1 + caster:THTD_AddBasePower(1) + end + else + if caster.rumia_01_bonus < keys.max_bonus then + caster.rumia_01_bonus = caster.rumia_01_bonus + 1 + caster:THTD_AddBasePower(1) + elseif caster.rumia_01_bonus > keys.max_bonus then + caster:THTD_AddBasePower(-(caster.rumia_01_bonus - keys.max_bonus)) + caster.rumia_01_bonus = keys.max_bonus + end + end +end + +function OnRumia02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if keys.ability:GetLevel() < 1 then return end + + if caster.rumia_02_attack_count == nil then + caster.rumia_02_attack_count = 0 + end + + local powerCount = 0 + local pv = caster:GetAbilityPowerValue("thtd_rumia_02") + if pv ~= nil then + powerCount = pv[1] + end + + caster.rumia_02_attack_count = caster.rumia_02_attack_count + 1 + + if caster.rumia_02_attack_count >= (keys.max_count - powerCount) then + RumiaProjectileStart(keys) + caster.rumia_02_attack_count = 0 + end +end + +function RumiaProjectileStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + caster:EmitSound("Sound_THTD.thtd_rumia_01") + + for i=1,12 do + local forwardCos = caster:GetForwardVector().x + local forwardSin = caster:GetForwardVector().y + local angle = (39 - 6.5 * i) / 180 * math.pi + local forward = Vector( math.cos(angle)*forwardCos - math.sin(angle)*forwardSin, + forwardSin*math.cos(angle) + forwardCos*math.sin(angle),0) + local info = + { + Ability = keys.ability, + EffectName = "particles/heroes/rumia/ability_rumia_02_projectile.vpcf", + vSpawnOrigin = caster:GetOrigin() + forward * 500 - caster:GetForwardVector() * 500 + Vector(0,0,128), + fDistance = 800, + fStartRadius = 150, + fEndRadius = 150, + Source = caster, + bHasFrontalCone = false, + bReplaceExisting = false, + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = true, + vVelocity = caster:GetForwardVector() * 1800, + bProvidesVision = true, + iVisionRadius = 1000, + iVisionTeamNumber = caster:GetTeamNumber() + } + if caster:THTD_IsTowerEx() == true then + info.EffectName = "particles/heroes/rumia/ability_rumia_02_ex_projectile.vpcf" + end + local projectile = ProjectileManager:CreateLinearProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + end +end + +function OnRumiaProjectileHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 1) + + if caster:THTD_IsTowerEx() == true then + damage = caster:THTD_GetAbilityPowerDamage(keys.ability, 2) + end + + if caster:IsPower666() then damage = damage * 10 end + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + +function OnRumia03AttackLanded(keys) + if keys.ability:GetLevel()<1 then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + if target.thtd_damage_lock == true then return end + + if target:GetHealthPercent() > 70 and RollPercentage(keys.chance) then + local targetPoint = target:GetOrigin() + keys.ability:ApplyDataDrivenModifier(caster,target,"modifier_rumia_03_pause",{}) + local pointRad = GetRadBetweenTwoVec2D(caster:GetOrigin(),targetPoint) + local randomPi = -2*math.pi + + if RandomInt(0,1) == 0 then + randomPi = -2*math.pi + else + randomPi = 2*math.pi + end + + local forwardVec = Vector(math.cos(pointRad+randomPi), math.sin(pointRad+randomPi),RandomFloat(0,1)) + local projectileTable = { + Ability = keys.ability, + EffectName = "particles/heroes/thtd_rumia/ability_rumia_03.vpcf", + vSpawnOrigin = caster:GetOrigin(), + vSpawnOriginNew = caster:GetOrigin(), + fDistance = 5000, + fStartRadius = 60, + fEndRadius = 60, + Source = caster, + bHasFrontalCone = false, + bRepalceExisting = false, + iUnitTargetTeams = "DOTA_UNIT_TARGET_TEAM_ENEMY", + iUnitTargetTypes = "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP", + iUnitTargetFlags = "DOTA_UNIT_TARGET_FLAG_NONE", + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = true, + vVelocity = forwardVec, + bProvidesVision = true, + iVisionRadius = 400, + iVisionTeamNumber = caster:GetTeamNumber(), + } + + local speed = 4000 + local acceleration = -400 + local iVelocity = 1000 + local ishit = false + + local effectIndex = ParticleManager:CreateParticle(projectileTable.EffectName, PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControlForward(effectIndex,3,(projectileTable.vVelocity*iVelocity/50 + speed/50 * (targetPoint - caster:GetOrigin()):Normalized()):Normalized()) + + local ability = projectileTable.Ability + local targets = {} + local targets_remove = {} + local totalDistance = 0 + local time = 0 + local high = 0 + + caster:SetContextThink(DoUniqueString("ability_caster_projectile"), + function() + if GameRules:IsGamePaused() then return 0.03 end + + -- 向心力单位向量 + local vecCentripetal = (projectileTable.vSpawnOriginNew - targetPoint):Normalized() + + -- 向心力 + local forceCentripetal = speed/50 + + -- 初速度单位向量 + local vecInVelocity = projectileTable.vVelocity + + -- 初始力 + local forceIn = iVelocity/50 + + -- 投射物矢量 + local vecProjectile = vecInVelocity * forceIn + forceCentripetal * vecCentripetal + + local vec = projectileTable.vSpawnOriginNew + vecProjectile + Vector(0,0,high) + + -- 投射物单位向量 + local particleForward = vecProjectile:Normalized() + + -- 目标和投射物距离 + local dis = GetDistanceBetweenTwoVec2D(targetPoint,vec) + + ParticleManager:SetParticleControlForward(effectIndex,3,particleForward) + + totalDistance = totalDistance + math.sqrt(forceIn*forceIn + forceCentripetal*forceCentripetal) + + if(dis<400)then + if ishit == false then + ishit = true + target:StartGesture(ACT_DOTA_FLAIL) + end + high = high + 25 + target:SetAbsOrigin(projectileTable.vSpawnOriginNew+400*Vector(forwardVec.x,forwardVec.y,0)-Vector(0,0,50)) + end + + if(dis=projectileTable.fEndRadius)then + ParticleManager:SetParticleControl(effectIndex,3,vec) + projectileTable.vSpawnOriginNew = vec + speed = speed + acceleration + time = time + 0.02 + return 0.02 + else + if func then func(projectileTable.vSpawnOriginNew) end + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + end, + 0.02) + end +end + +function OnRumia03AbilityEnd(caster,target,ability,effectIndex,time) + caster:SetContextThink(DoUniqueString("ability_caster_projectile_END"), + function() + if GameRules:IsGamePaused() then return 0.03 end + target:RemoveModifierByName("modifier_rumia_03_pause") + ParticleManager:DestroyParticleSystem(effectIndex,true) + local effectIndexEnd = ParticleManager:CreateParticle("particles/heroes/thtd_rumia/ability_rumia_04_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndexEnd, 0, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndexEnd, 3, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndexEnd,false) + target:SetContextThink(DoUniqueString("ability_caster_projectile_END"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if THTD_IsValid(target) then + FindClearSpaceForUnit(target, target:GetOrigin(), false) + end + return nil + end, + 0.2) + caster:AbilityKill(target, ability) + if caster.rumia_01_bonus == nil then + caster.rumia_01_bonus = 0 + end + if caster.rumia_01_bonus < caster:GetAbilityValue("thtd_rumia_01", "max_bonus") then + caster.rumia_01_bonus = caster.rumia_01_bonus + 1 + caster:THTD_AddBasePower(1) + end + return nil + end, + 1.5 - time) +end + +function Rumia04AttackTargetPoint(keys) + if keys.ability:GetLevel() < 1 then return end + + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local vecCaster = caster:GetOrigin() + local pointRad = GetRadBetweenTwoVec2D(vecCaster,target:GetOrigin()) + + local randomPi = RandomFloat(-2*math.pi,2*math.pi) + local forwardVec = Vector(math.cos(pointRad+randomPi), math.sin(pointRad+randomPi),RandomFloat(0,1)) + + local BulletTable = { + Ability = keys.ability, + EffectName = "particles/heroes/thtd_rumia/ability_rumia_04.vpcf", + vSpawnOrigin = vecCaster, + vSpawnOriginNew = vecCaster, + fDistance = 5000, + fStartRadius = 60, + fEndRadius = 60, + Source = caster, + bHasFrontalCone = false, + bRepalceExisting = false, + iUnitTargetTeams = "DOTA_UNIT_TARGET_TEAM_ENEMY", + iUnitTargetTypes = "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_CREEP", + iUnitTargetFlags = "DOTA_UNIT_TARGET_FLAG_NONE", + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = true, + vVelocity = forwardVec, + bProvidesVision = true, + iVisionRadius = 400, + iVisionTeamNumber = caster:GetTeamNumber(), + } + + local speed = 2000 + local acc = 200 + local iVelo = 1000 + + CreateProjectileMoveToPoint(BulletTable,caster,target:GetOrigin(),speed,iVelo,-acc, + function(vec) + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_rumia_04") + if pv ~= nil then + powerDamage = pv[1] + end + local targetpoint = Vector(vec.x,vec.y,caster:GetOrigin().z) + local targets = THTD_FindUnitsInRadius(caster,targetpoint,keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage() + for k,v in pairs(targets) do + local damage_table = { + victim = v, + attacker = caster, + damage = damage, + ability = keys.ability, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE, + } + UnitDamageTarget(damage_table) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_rumia/ability_rumia_04_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetpoint) + ParticleManager:SetParticleControl(effectIndex, 3, targetpoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + ) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitysakuya.lua b/scripts/vscripts/abilities/abilitysakuya.lua new file mode 100755 index 0000000..24acc60 --- /dev/null +++ b/scripts/vscripts/abilities/abilitysakuya.lua @@ -0,0 +1,239 @@ +function OnSakuya01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_sakuya_01") + if pv ~= nil then + powerDamage = pv[1] + end + + caster.power_damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage() + + if caster:IsPower666() then + caster.power_damage = caster.power_damage * 4 + end + + if caster:IsPower999() then + caster.power_damage = caster.power_damage * 12 + end + + if caster.thtd_sakuya_03_casted == true then + caster.power_damage = caster.power_damage * (1 - caster:GetAbilityValue("thtd_sakuya_03", "damage_down")/100) + end + + local rad = GetRadBetweenTwoVec2D(caster:GetOrigin(),targetPoint) + local forward = Vector(math.cos(rad),math.sin(rad),caster:GetForwardVector().z) + + local info = + { + Ability = keys.ability, + EffectName = "particles/thd2/heroes/sakuya/ability_sakuya_01.vpcf", + vSpawnOrigin = caster:GetOrigin() + Vector(0,0,128), + fDistance = 1000, + fStartRadius = 150, + fEndRadius = 150, + Source = caster, + bHasFrontalCone = false, + bReplaceExisting = false, + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = false, + vVelocity = forward * 2000, + bProvidesVision = true, + iVisionRadius = 1000, + iVisionTeamNumber = caster:GetTeamNumber() + } + local projectile = ProjectileManager:CreateLinearProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + + local count = keys.max_count + + for i=1,count do + local iVec = Vector( math.cos(rad + math.pi/36*(i+0.5)) * 2000 , math.sin(rad + math.pi/36*(i+0.5)) * 2000 , caster:GetForwardVector().z ) + info.vVelocity = iVec + projectile = ProjectileManager:CreateLinearProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + iVec = Vector( math.cos(rad - math.pi/36*(i+0.5)) * 2000 , math.sin(rad - math.pi/36*(i+0.5)) * 2000 , caster:GetForwardVector().z ) + info.vVelocity = iVec + projectile = ProjectileManager:CreateLinearProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + end +end + +function OnSakuya01ProjectileHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster.power_damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + +local sakuya_02_black_list = +{ + "thtd_lily_01", + "thtd_daiyousei_01", + "thtd_koishi_04", + "thtd_sakuya_02", + "thtd_sakuya_03", + "thtd_yuuka_04", + "thtd_yukari_03", + "thtd_yukari_04", + "thtd_flandre_01", + "thtd_mokou_03", + "thtd_eirin_03", + "thtd_patchouli_04", + "thtd_hatate_02", + "thtd_sanae_03", + "thtd_minamitsu_02", + "thtd_minamitsu_03", + "thtd_toramaru_01", + "thtd_toramaru_02", + "thtd_toramaru_03", + "thtd_kanako_04", + "thtd_sanae_04", + "thtd_miko_04", + "thtd_keine_01", + "thtd_keine_03", + "thtd_suika_04", + "thtd_yuugi_03", + "thtd_alice_03", + "shinki_dragon_01", + "thtd_kagerou_03", + "death_prophet_exorcism", + "thtd_letty_01", + "thtd_suwako_04", + "thtd_komachi_04", + "thtd_junko_03", + "thtd_junko_04", + "thtd_clownpiece_03", + "thtd_kyouko_02", + "thtd_shikieiki_04", + "thtd_shinki_03", + +} + +function IsInSakuya02BlackList(ability) + for k,v in pairs(sakuya_02_black_list) do + if ability:GetAbilityName() == v then + return true + end + end + return false +end + +function OnSakuya02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local targetPoint = keys.target:GetOrigin() + -- local cooldown = keys.ability:GetCooldown(keys.ability:GetLevel() - 1) --获取当前等级的冷却时间 + local cooldown = keys.ability:GetCooldownTimeRemaining() -- 或者 keys.ability:GetCooldownTime() 技能当前实际冷却时间 + if keys.ability:GetLevel() >= 2 then + local unitName = target:GetUnitName() + if unitName == "remilia" or unitName == "flandre" or unitName == "patchouli" or unitName == "sakuya" or unitName == "koakuma" or unitName == "meirin" then + cooldown = cooldown * 0.5 + keys.ability:EndCooldown() + keys.ability:StartCooldown(cooldown) + end + end + + if target:THTD_IsTower() and target:HasModifier("modifier_sakuya_02_buff") == false then + caster.thtd_last_cast_unit = target + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_sakuya_02_buff", {duration=cooldown}) + + local effectIndex = ParticleManager:CreateParticle("particles/thd2/items/item_pocket_watch.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + for i=2,5 do + local ability = target:GetAbilityByIndex(i) + if ability~=nil and IsInSakuya02BlackList(ability) == false then + ability:EndCooldown() + target:GiveMana(target:GetRealManaCost(ability)) + end + end + + if caster == target then + target:THTD_AddManaRegenPercentage(keys.mana_reg) + caster:SetContextThink(DoUniqueString("ability_reimu_03"), + function() + if target~=nil and target:IsNull()==false and target:IsAlive() then + target:THTD_AddManaRegenPercentage(-keys.mana_reg) + end + return nil + end, + cooldown-0.2) + end + end +end + +function OnSakuya03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + local powerCd = 0 + local pv = caster:GetAbilityPowerValue("thtd_sakuya_03") + if pv ~= nil then + powerCd = pv[1] + end + if powerCd > 0 then + caster:ReCooldown(keys.ability, powerCd) + end + + local duration = math.floor(100 * keys.duration_time + 0.5) / 100 + local range = keys.range + local pauseUnit = {} + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/muyue/ability_muyue_014_aeons.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(range,range,range)) + + caster.thtd_sakuya_03_casted = true + caster:SetContextThink(DoUniqueString("ability_reimu_03"), + function() + if GameRules:IsGamePaused() then return 0.1 end + + if duration < 0 or THTD_IsValid(caster) == false then + for k,v in pairs(pauseUnit) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + v:RemoveModifierByName("modifier_sakuya_03_time_pause_debuff") + end + end + ParticleManager:DestroyParticleSystem(effectIndex,true) + pauseUnit = {} + caster.thtd_sakuya_03_casted = nil + return nil + end + + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),range) + + for k,v in pairs(targets) do + if v:HasModifier("modifier_sakuya_03_time_pause_debuff") == false then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_sakuya_03_time_pause_debuff", nil) + pauseUnit[v:GetEntityIndex()] = v + end + end + + if caster:GetMana() < caster:GetMaxMana() then + caster:SetMana(caster:GetMaxMana()) + end + + local ability = caster:FindAbilityByName("thtd_sakuya_01") + local unit = targets[1] + if unit ~= nil and unit:IsNull() == false and ability:IsFullyCastable() then + caster:CastAbilityOnPosition(unit:GetOrigin(), ability, caster:GetPlayerOwnerID()) + end + + duration = duration - 0.1 + return 0.1 + end, + 0) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitysanae.lua b/scripts/vscripts/abilities/abilitysanae.lua new file mode 100755 index 0000000..448b97e --- /dev/null +++ b/scripts/vscripts/abilities/abilitysanae.lua @@ -0,0 +1,271 @@ +thtd_sanae_01 = class({}) + +LinkLuaModifier("modifier_sanae_01", "abilities/abilitySanae", LUA_MODIFIER_MOTION_NONE) + +function thtd_sanae_01:OnSpellStart() + local caster = self:GetCaster() + local target = self:GetCursorTarget() + + -- AI需要改动的地方 + caster.thtd_last_cast_unit = target + + local ExtraData = { + count=0 + } + + self:Sanae01PassToNextUnit(caster,caster:GetOrigin(),target,ExtraData) +end + + +function thtd_sanae_01:Sanae01PassToNextUnit(source,loction,target,data) + local caster = self:GetCaster() + + local info = + { + Target = target, + Source = source, + Ability = self, + EffectName = "particles/heroes/sanae/ability_sanae_01.vpcf", + iMoveSpeed = 1400, + vSourceLoc= loction, -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, + iVisionRadius = 400, + iVisionTeamNumber = caster:GetTeamNumber(), + ExtraData = { + count = data.count + 1 + } + } + projectile = ProjectileManager:CreateTrackingProjectile(info) +end + + +function thtd_sanae_01:OnProjectileHit_ExtraData(hTarget, vLocation, data) + local caster = self:GetCaster() + local target = hTarget + + if target:THTD_IsTower() and target.thtd_sanae_01_power_bonus == nil then + local duration_time = self:GetSpecialValueFor("duration_time") + target.thtd_sanae_01_power_bonus = math.max(1, math.floor(self:GetSpecialValueFor("power_bonus") * (1 - self:GetSpecialValueFor("down_percent")/100)^(data.count - 1))) + target:AddNewModifier(caster, self, "modifier_sanae_01", {duration = duration_time}) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/sanae/ability_sanae_01_effect.vpcf", PATTACH_CUSTOMORIGIN, target) + ParticleManager:SetParticleControlEnt(effectIndex , 0, target, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:DestroyParticleSystemTime(effectIndex, duration_time) + end + + if data.count < self:GetSpecialValueFor("max_count") then + local targets = + FindUnitsInRadius( + caster:GetTeamNumber(), + caster:GetOrigin(), + nil, + self:GetSpecialValueFor("range"), + self:GetAbilityTargetTeam(), + self:GetAbilityTargetType(), + self:GetAbilityTargetFlags(), + FIND_ANY_ORDER, + false + ) + for k,v in pairs(targets) do + if v~=nil and v~=target and v:THTD_IsTower() and v:HasModifier("modifier_sanae_01") == false then + self:Sanae01PassToNextUnit(target,vLocation,v,data) + break + end + end + end + + return true +end + +-------------------------------------------------------------------------------- + +modifier_sanae_01 = class({}) + +function modifier_sanae_01:OnCreated( kv ) + if IsServer() then + local target = self:GetParent() + target:THTD_AddBasePower(target.thtd_sanae_01_power_bonus) + end +end + +function modifier_sanae_01:OnDestroy() + if IsServer() then + local target = self:GetParent() + target:THTD_AddBasePower(-target.thtd_sanae_01_power_bonus) + target.thtd_sanae_01_power_bonus = nil + end +end + +-------------------------------------------------------------------------------- + +function OnSanae02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_sanae/ability_sanae_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystemTime(effectIndex, keys.duration_time) + + effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_sanae/ability_sanae_02_p.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystemTime(effectIndex, keys.duration_time) + + local time = keys.duration_time + + caster:SetContextThink(DoUniqueString("thtd_patchouli04_spell_start"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then return nil end + + local targets = THTD_FindUnitsInRadius(caster, targetPoint, keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 + for k,v in pairs(targets) do + local modifier = v:FindModifierByName("modifier_sanae_debuff") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_sanae_debuff", {duration=0.2}) + else + modifier:SetDuration(0.2,false) + end + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + time = time - 0.2 + return 0.2 + end, + 0) +end + +function OnSanae03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local time = keys.duration_time + + local vec = targetPoint + RandomVector(keys.range) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_sanae_03/ability_sanae_03.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, vec) + ParticleManager:SetParticleControl(effectIndex, 1, vec) + ParticleManager:SetParticleControl(effectIndex, 3, vec) + ParticleManager:SetParticleControl(effectIndex, 4, vec) + ParticleManager:SetParticleControl(effectIndex, 5, vec) + ParticleManager:SetParticleControl(effectIndex, 6, vec) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + caster:SetContextThink(DoUniqueString("thtd_patchouli04_spell_start"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then return nil end + + local targets = THTD_FindUnitsInRadius(caster,vec,keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + caster:THTD_GetFaith() * keys.damage_up/100) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + UnitStunTarget(caster,v, keys.stun_time * (1 + caster:THTD_GetFaith() * keys.stun_up/100)) + end + vec = targetPoint + RandomVector(keys.range) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_sanae_03/ability_sanae_03.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, vec) + ParticleManager:SetParticleControl(effectIndex, 1, vec) + ParticleManager:SetParticleControl(effectIndex, 3, vec) + ParticleManager:SetParticleControl(effectIndex, 4, vec) + ParticleManager:SetParticleControl(effectIndex, 5, vec) + ParticleManager:SetParticleControl(effectIndex, 6, vec) + ParticleManager:DestroyParticleSystem(effectIndex,false) + time = time - 0.2 + return 0.2 + end, + 0) +end + +function OnSanae04SpellStart(keys) + local caster = keys.caster + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/sanae/ability_sanea_04_effect_b.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:DestroyParticleSystemTime(effectIndex, keys.duration_time) + + if keys.ability:GetLevel() < 2 then return end + + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero == nil then return end + for k,v in pairs(hero.thtd_hero_tower_list) do + local unitName = v:GetUnitName() + if unitName == "sanae" or unitName == "kanako" or unitName == "suwako" then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_sanae_04_buff", nil) + end + end +end + +function OnCreatedSanae04Buff(keys) + keys.target:THTD_AddBasePower(keys.power_bonus * keys.target:THTD_GetFaith()/3, "thtd_sanae_04_buff") +end + +function OnDestroySanae04Buff(keys) + keys.target:THTD_AddBasePower("thtd_sanae_04_buff") +end + +function OnSanae04Created(keys) + -- local caster = EntIndexToHScript(keys.caster_entindex) 与下面一样 + local caster = keys.caster + local target = keys.target + + local unitName = target:GetUnitName() + if unitName == "sanae" or unitName == "kanako" or unitName == "suwako" then + if not target:HasModifier("modifier_sanae_04_combo_buff") then + local modifier = keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_sanae_04_combo_buff", nil) + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero ~= nil and hero.thtd_ss_faith ~= nil and hero.thtd_ss_faith > 0 then + modifier:SetStackCount(hero.thtd_ss_faith) + end + end + end +end + +function OnSanae04Destroy(keys) + local caster = keys.caster + local target = keys.target + + local unitName = target:GetUnitName() + if unitName == "sanae" or unitName == "kanako" or unitName == "suwako" then + if target:HasModifier("modifier_sanae_04_combo_buff") then + target:RemoveModifierByName("modifier_sanae_04_combo_buff") + end + if target:HasModifier("modifier_sanae_04_buff") then + target:RemoveModifierByName("modifier_sanae_04_buff") + end + end +end + +function OnCreatedSanae04ComboBuff(keys) + keys.target:THTD_AddBasePower(math.floor(keys.target:THTD_GetFaith()/3), "thtd_sanae_04_combo_buff", "thtd_sanae_04_combo_buff") +end + +function OnDestroySanae04ComboBuff(keys) + keys.target:THTD_AddBasePower("thtd_sanae_04_combo_buff") +end + +function OnSanaeKill(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + caster:THTD_AddFaith() +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitysatori.lua b/scripts/vscripts/abilities/abilitysatori.lua new file mode 100755 index 0000000..6ba0f57 --- /dev/null +++ b/scripts/vscripts/abilities/abilitysatori.lua @@ -0,0 +1,77 @@ +local thtd_satori_02 = +{ + [4] = 0.4, + [5] = 1.0, +} + +function OnSatori01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_satori_02") + if pv ~= nil then + powerDamage = pv[1] + end + if caster:IsPower666() then + powerDamage = powerDamage + 400 + end + local limit = 100 * (1 + powerDamage/100) + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius) + + caster:EmitSound("Sound_THTD.thtd_satori_01") + + for k,v in pairs(targets) do + local modifier = v:FindModifierByName("modifier_satori_01_debuff") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_satori_01_debuff", {Duration=keys.duration_time}) + else + modifier:SetDuration(keys.duration_time,false) + end + + local ability_02 = caster:FindAbilityByName("thtd_satori_02") + if ability_02 ~= nil and ability_02:GetLevel() > 0 and v.thtd_satori_02_debuff ~= true then + v.thtd_satori_02_debuff = true + local health = v:GetHealth() + local time = 3.0 + v:SetContextThink(DoUniqueString("thtd_satori02_debuff"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if not THTD_IsValid(v) then return nil end + if time <= 0 then + local damage = math.min(limit * caster:THTD_GetStarDamage(), (health - v:GetHealth()) * ability_02:GetSpecialValueFor("damage_percent") / 100) + local DamageTable = { + ability = ability_02, + victim = v, + attacker = caster, + damage = damage, + damage_type = ability_02:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + v.thtd_satori_02_debuff = false + return nil + end + time = time - 0.1 + return 0.1 + end, + 0) + end + end +end + +function OnSatori01ModifierCreated(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster:HasModifier("modifier_thtd_satori_02_combo_buff") and target.thtd_satori_01_debuff ~= true then + target.thtd_satori_01_debuff = true + local bonus = caster:GetAbilityValue("thtd_satori_02", "damage_up") + target:AddDamageIncomingPhysical(bonus, "thtd_satori_01_damage_up") + end +end + +function OnSatori01ModifierDestroy(keys) + keys.target:AddDamageIncomingPhysical("thtd_satori_01_damage_up") +end diff --git a/scripts/vscripts/abilities/abilityseiga.lua b/scripts/vscripts/abilities/abilityseiga.lua new file mode 100755 index 0000000..82e1214 --- /dev/null +++ b/scripts/vscripts/abilities/abilityseiga.lua @@ -0,0 +1,139 @@ +local Seiga01ItemDrop = +{ + [1] = + { + ["item_1011"] = 1, + ["item_1012"] = 0, + ["item_1013"] = 0, + ["item_1014"] = 0, + }, + [2] = + { + ["item_1011"] = 2, + ["item_1012"] = 0, + ["item_1013"] = 0, + ["item_1014"] = 0, + }, + [3] = + { + ["item_1011"] = 2, + ["item_1012"] = 1, + ["item_1013"] = 0, + ["item_1014"] = 0, + }, + [4] = + { + ["item_1011"] = 0, + ["item_1012"] = 2, + ["item_1013"] = 1, + ["item_1014"] = 0, + }, + [5] = + { + ["item_1011"] = 0, + ["item_1012"] = 0, + ["item_1013"] = 2, + ["item_1014"] = 1, + }, +} + +function OnSeiga01Death(keys) + if keys.caster==nil or keys.caster:IsNull() or keys.caster:IsAlive()==false then + return + end + + local caster = keys.caster + local target = keys.unit + + if SpawnSystem.IsUnLimited or GameRules:GetCustomGameDifficulty() >= FUNNY_MODE then + if caster:HasModifier("modifier_miko_02_buff") and caster.thtd_miko_buff_seiga ~= nil then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_seiga/ability_seiga_03.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),caster:GetAbilityValue("thtd_seiga_03", "range")) + local damage = THTD_GetTempleOfGodBuffedTowerStarCount(caster) * caster:THTD_GetPower() * caster.thtd_miko_buff_seiga + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = DAMAGE_TYPE_MAGICAL, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + else + if caster.thtd_chance_count == nil then + caster.thtd_chance_count = {} + end + local hero = caster:GetOwner() + local count = 0 + for itemName,chance in pairs(Seiga01ItemDrop[caster:THTD_GetStar()]) do + if chance > 0 then + if caster.thtd_chance_count[itemName] == nil then + caster.thtd_chance_count[itemName] = 0 + end + local randChance = chance + if caster.thtd_chance_count[itemName] >= math.floor(100/randChance) then + randChance = 100 + end + if RollPercentage(randChance) then + caster.thtd_chance_count[itemName] = 0 + local item = CreateItem(itemName, nil, nil) + item.owner_player_id = caster:GetPlayerOwnerID() + item:SetPurchaser(hero) + item:SetPurchaseTime(1.0) + local pos = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, 150) + CreateItemOnPositionSync(pos,item) + else + caster.thtd_chance_count[itemName] = caster.thtd_chance_count[itemName] + 1 + end + end + count = count + 1 + end + end +end + +function OnSeiga02SpellStart(keys) + local caster = keys.caster + local target = keys.target + + if target:THTD_IsTower() and target:IsInAttackSpeedBlackList() == false then + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_seiga_02_attack_speed_buff", {}) + caster.thtd_last_cast_unit = target + end +end + +function OnSeiga03Death(keys) + if keys.caster==nil or keys.caster:IsNull() or keys.caster:IsAlive()==false then + return + end + if keys.ability:GetLevel()<1 then return end + + local caster = keys.caster + local target = keys.unit + + local count = target:GetPoisonCount() + if count > 0 then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_seiga/ability_seiga_03.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * count + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityshikieiki.lua b/scripts/vscripts/abilities/abilityshikieiki.lua new file mode 100755 index 0000000..1a167dc --- /dev/null +++ b/scripts/vscripts/abilities/abilityshikieiki.lua @@ -0,0 +1,185 @@ +function OnSpellStartShikieiki01(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targets = THTD_FindUnitsInRadius(caster,caster:GetAbsOrigin(),keys.range) + + if GameRules:GetGameTime() - (caster.thtd_shikieiki_01_sound or 0) > 12 then + caster.thtd_shikieiki_01_sound = GameRules:GetGameTime() + caster:EmitSound("Hero_Chen.PenitenceCast") + caster:EmitSound("Hero_Chen.PenitenceImpact") + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/shikieiki/ability_shikieiki_01_guilty.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, v, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:DestroyParticleSystem(effectIndex, false) + + local modifier = v:FindModifierByName(keys.modifier) + if modifier == nil then + modifier = keys.ability:ApplyDataDrivenModifier(caster, v, keys.modifier, nil) + modifier:SetStackCount(RandomInt(1, 3)) + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/shikieiki/ability_shikieiki_01_guilty_b.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex2 , 0, v, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControl(effectIndex2, 1, v:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex2, 2, v:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex2, 3, v:GetOrigin()) + v.thtd_shikieiki_01_count_effect = effectIndex2 + else + local count = modifier:GetStackCount() + if count < 10 then + modifier:SetStackCount(math.min(10, count + RandomInt(1, 3))) + end + end + if modifier ~= nil then + ParticleManager:SetParticleControl(v.thtd_shikieiki_01_count_effect, 1, Vector(0,modifier:GetStackCount(),0)) + end + + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + end +end + +function OnDestroyShikieiki01Debuff(keys) + local target = keys.target + ParticleManager:DestroyParticleSystem(target.thtd_shikieiki_01_count_effect, true) +end + +function OnSpellStartShikieiki02(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targets = THTD_FindUnitsInRadius(caster,caster:GetAbsOrigin(),keys.range) + + local count = 0 + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_omniknight/omniknight_purification.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(1,1,1)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(0,0,0)) + ParticleManager:DestroyParticleSystem(effectIndex, false) + + local modifier = v:FindModifierByName(keys.modifier) + local crit = 1 + if modifier ~= nil then + count = count + modifier:GetStackCount() + crit = 1 + modifier:GetStackCount() * keys.damage_up/100 + modifier:Destroy() + end + + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage * crit, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + end + + if count > 0 then + caster.thtd_shikieiki_02_power_bonus = count * keys.power_bonus + caster:RemoveModifierByName("modifier_shikieiki_02_buff") + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_shikieiki_02_buff", {}) + end +end + +function OnCreatedShikieiki02Buff(keys) + keys.target:THTD_AddBasePower(keys.target.thtd_shikieiki_02_power_bonus, "thtd_shikieiki_02_buff") +end + +function OnDestroyShikieiki02Buff(keys) + keys.target:THTD_AddBasePower("thtd_shikieiki_02_buff") +end + +function OnCreatedShikieiki03Debuff(keys) + local caster = keys.caster + local target = keys.target + local effectIndex = ParticleManager:CreateParticle( + "particles/heroes/shikieiki/ability_shikieiki_04.vpcf", + PATTACH_CUSTOMORIGIN, + target) + ParticleManager:SetParticleControlEnt(effectIndex , 0, target, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 1, target, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 4, target, 5, "follow_origin", Vector(0,0,0), true) + target.thtd_shikieiki_03_effect = effectIndex + + if not keys.ability:GetAutoCastState() then + caster:EmitSound("Voice_Thdots_Shikieiki.AbilityShikieiki04") + end +end + +function OnIntervalThinkShikieiki03(keys) + UnitDamageHpRemove(keys.caster, keys.target, keys.hp_damage, false) +end + +function OnDestroyShikieiki03Debuff(keys) + ParticleManager:DestroyParticleSystem(keys.target.thtd_shikieiki_03_effect, true) +end + +function OnSpellStartShikieiki04(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local effectIndex = ParticleManager:CreateParticle("particles/econ/items/enigma/enigma_world_chasm/enigma_blackhole_ti5.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + + caster:EmitSound("Hero_Enigma.Black_Hole") + + local time = keys.duration_time + local tick = 0.05 + local count = 0 + local damage_tick = math.floor(keys.tick * 100 + 0.5)/100 + local damage_count = math.floor(damage_tick/tick) + caster:SetContextThink(DoUniqueString("thtd_shikieiki_04"), + function() + if GameRules:IsGamePaused() then return 0.1 end + count = count + 1 + if time < 0 or THTD_IsValid(caster) == false then + ParticleManager:DestroyParticleSystem(effectIndex, true) + caster:StopSound("Hero_Enigma.Black_Hole") + return nil + end + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius) + local damage = 0 + if count%damage_count == 0 then + damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + end + + for k, v in pairs(targets) do + local distance = (v:GetAbsOrigin() - targetPoint):Length2D() + local in_pull = 400 + local new_pos = GetGroundPosition(RotatePosition(targetPoint, QAngle(0,1.5,0), v:GetAbsOrigin()), v) + if distance > 20 then + local direction = (targetPoint - new_pos):Normalized() + direction.z = 0.0 + new_pos = new_pos + direction * in_pull * tick + end + v:SetOrigin(new_pos) + + if damage > 0 then + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + end + end + time = time - tick + return tick + end, + 0) +end + + diff --git a/scripts/vscripts/abilities/abilityshinki.lua b/scripts/vscripts/abilities/abilityshinki.lua new file mode 100755 index 0000000..8d48133 --- /dev/null +++ b/scripts/vscripts/abilities/abilityshinki.lua @@ -0,0 +1,395 @@ +-- 是否魔界 +function IsMakaiCard(unit) + local unitName = unit:GetUnitName() + if unitName == "shinki" or unitName == "alice" or unitName == "koakuma" or unitName == "mima" then + return true + else + return false + end +end + +function OnShinki01Think(keys) + local caster = keys.caster + local targets = THTD_FindFriendlyUnitsInRadius(caster,caster:GetOrigin(),1200) + for k,v in pairs(targets) do + if IsMakaiCard(v) then + local modifier = v:FindModifierByName(keys.modifier) + if modifier ~= nil then + modifier:SetDuration(0.3, false) + else + if v.thtd_shinki_01_kill_count == nil then + v.thtd_shinki_01_kill_count = 0 + end + modifier = keys.ability:ApplyDataDrivenModifier(caster, v, keys.modifier, {duration = 0.3}) + if modifier ~= nil and v.thtd_shinki_01_kill_count > 0 then + modifier:SetStackCount(v.thtd_shinki_01_kill_count) + end + end + end + end +end + +function OnCreatedShinki01Buff(keys) + keys.target:THTD_AddBasePower(keys.kill_bonus * keys.target.thtd_shinki_01_kill_count, "thtd_shinki_01_kill") +end + +function OnDestroyShinki01Buff(keys) + keys.target:THTD_AddBasePower("thtd_shinki_01_kill") +end + +function OnSpellStartShinki02(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local castPoint = caster:GetOrigin() + -- local effect = "particles/econ/items/queen_of_pain/qop_arcana/qop_arcana_sonic_wave.vpcf" + local effect = "particles/econ/items/queen_of_pain/qop_arcana/qop_arcana_sonic_wave_v2.vpcf" + local range = keys.ability:GetCastRange() + for i=1,6 do + local forward = Vector(math.cos(i*math.pi/3),math.sin(i*math.pi/3),0) + local effectIndex = ParticleManager:CreateParticle(effect, PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, castPoint) + ParticleManager:SetParticleControl(effectIndex, 1, forward * (range/2)) + ParticleManager:ReleaseParticleIndex(effectIndex) + -- local info = + -- { + -- Ability = keys.ability, + -- EffectName = effect, + -- vSpawnOrigin = castPoint, + -- fDistance = range, + -- fStartRadius = 100, + -- fEndRadius = 500, + -- Source = caster, + -- iSourceAttachment = "mouth", + -- bHasFrontalCone = false, + -- bReplaceExisting = false, + -- iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + -- iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + -- iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + -- fExpireTime = GameRules:GetGameTime() + 10.0, + -- bDeleteOnHit = false, + -- vVelocity = forward * 1400, + -- bProvidesVision = false, + -- ExtraData = {} + -- } + -- ProjectileManager:CreateLinearProjectile(info) + end + + local tick = math.floor(keys.tick * 100 + 0.5)/100 + local time = math.floor(keys.duration_time * 100 + 0.5)/100 + + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + time = time - tick + if time < 0 then + return nil + end + + local targets = THTD_FindUnitsInRadius(caster,castPoint,range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local type = keys.ability:GetAbilityDamageType() + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = type, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + return tick + end, + tick) +end + +function OnSpellStartShinki03(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster:HasModifier(keys.modifier) then + caster:RemoveModifierByName(keys.modifier) + end + local modifier = keys.ability:ApplyDataDrivenModifier(caster, caster, keys.modifier, nil) + + local pfx_caster = ParticleManager:CreateParticle("particles/units/heroes/heroes_underlord/abbysal_underlord_darkrift_ambient.vpcf", PATTACH_ABSORIGIN_FOLLOW, caster) + ParticleManager:SetParticleControlEnt(pfx_caster, 2, caster, PATTACH_ABSORIGIN_FOLLOW, nil, caster:GetAbsOrigin(), true) + ParticleManager:SetParticleControl(pfx_caster, 1, Vector(0, 0, 0)) + modifier:AddParticle(pfx_caster, false, false, 15, false, false) + + -- caster:EmitSound("Hero_Nevermore.ROS.Arcana.Cast") + caster:EmitSound("Hero_Terrorblade.Metamorphosis") + local effectIndex = ParticleManager:CreateParticle("particles/econ/items/terrorblade/terrorblade_back_ti8/terrorblade_sunder_ti8.vpcf", PATTACH_ROOTBONE_FOLLOW, caster) + -- ParticleManager:SetParticleControlEnt(effectIndex, 0, caster, PATTACH_ROOTBONE_FOLLOW, "follow_rootbone", caster:GetAbsOrigin(), true) + -- ParticleManager:SetParticleControlEnt(effectIndex, 1, caster, PATTACH_ROOTBONE_FOLLOW, "follow_rootbone", caster:GetAbsOrigin(), true) + ParticleManager:SetParticleControlEnt(effectIndex, 0, caster, PATTACH_ROOTBONE_FOLLOW, "follow_origin", caster:GetAbsOrigin(), true) + ParticleManager:SetParticleControlEnt(effectIndex, 1, caster, PATTACH_ROOTBONE_FOLLOW, "follow_origin", caster:GetAbsOrigin(), true) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnCreatedShinki03Buff(keys) + local target = keys.target + target:SetModelScale(target:GetModelScale() * 2) + target:THTD_AddBasePower(keys.power_bonus, "thtd_shinki_03_bonus") + target:THTD_DestroyLevelEffect() +end + +function OnDestroyShinki03Buff(keys) + local target = keys.target + target:SetModelScale(target:GetModelScale() / 2) + target:THTD_AddBasePower("thtd_shinki_03_bonus") + target:THTD_CreateLevelEffect() +end + + +local baseModel = 1.0 + +function OnShinki04Spawn(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + local entities = Entities:FindAllByClassname("npc_dota_creature") + for k,v in pairs(entities) do + local findNum = string.find(v:GetUnitName(), 'shinki_dragon') + if findNum ~= nil and v~=nil and v:IsNull()==false and v:IsAlive() then + local c = v.thtd_spawn_unit_owner + if c:GetOwner() == caster:GetOwner() then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="shinki_dragon_casted"}) + keys.ability:EndCooldown() + return + end + end + end + + if caster.ability_shinki04_devour_count == nil then + caster.ability_shinki04_devour_count = 0 + end + + local unit = CreateUnitByName( + "shinki_dragon" + ,caster:GetOrigin() + caster:GetForwardVector() * 500 + ,false + ,caster:GetOwner() + ,caster:GetOwner() + ,caster:GetTeam() + ) + if unit == nil then + keys.ability:EndCooldown() + return + end + FindClearSpaceForUnit(unit, unit:GetOrigin(), false) + + unit:SetModelScale(baseModel * (1 + caster.ability_shinki04_devour_count * 0.02)) + + unit:SetControllableByPlayer(caster:GetPlayerOwnerID(), false) + unit:SetHasInventory(false) + unit.thtd_spawn_unit_owner = caster + + local powerStack = math.max(0, math.min(3, caster:GetTowerPowerLevel())) + local hero = caster:GetOwner() + if GameRules.player_bb_buff[hero.thtd_player_id]["item_3016"] > 0 or powerStack > 0 then + unit:AddNewModifier(unit, nil, "modifier_bb_buff_3016_effect", nil):SetStackCount(GameRules.player_bb_buff[hero.thtd_player_id]["item_3016"] + powerStack) + end + + local ability = unit:GetAbilityByIndex(0) + if ability ~= nil then + ability:SetActivated(true) + ability:SetLevel(1) + end + ability = unit:GetAbilityByIndex(1) + if ability ~= nil then + ability:SetActivated(true) + ability:SetLevel(1) + end + ability = unit:GetAbilityByIndex(2) + if ability ~= nil then + ability:SetActivated(true) + ability:SetLevel(1) + end + + ability = unit:FindAbilityByName("shinki_dragon_01") + if ability ~= nil then + if caster.ability_shinki04_devour_count > 0 then + ability:ApplyDataDrivenModifier(unit, unit, "modifier_shinki_dragon_01_buff", nil) + unit:SetModifierStackCount("modifier_shinki_dragon_01_buff", unit, caster.ability_shinki04_devour_count) + end + local modifier = caster:FindModifierByName("modifier_shinki_dragon_01_cooldown") + if modifier ~= nil then + ability:StartCooldown(modifier:GetDuration()) + end + end + + keys.ability:ApplyDataDrivenModifier(caster, unit, "modifier_shinki_04_buff", nil) + + local oldSwpanUnit = caster.thtd_summon_unit + if oldSwpanUnit ~=nil and oldSwpanUnit:IsNull() == false then + oldSwpanUnit:AddNoDraw() + oldSwpanUnit:ForceKill(false) + end + caster.thtd_summon_unit = unit + + local factor = unit:GetAbilityValue("shinki_dragon_01", "damage_up", true) + local attackValue = math.floor(caster:THTD_GetStarDamage() * (1 + caster.ability_shinki04_devour_count * factor)) + unit:SetBaseDamageMax(attackValue) + unit:SetBaseDamageMin(attackValue) + + unit:SetContextThink(DoUniqueString("modifier_shinki_04"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if caster==nil or caster:IsNull() or caster:IsAlive()==false or caster:THTD_IsHidden() then + unit:AddNoDraw() + unit:ForceKill(false) + caster.thtd_summon_unit = nil + return nil + end + + attackValue = math.floor(caster:THTD_GetStarDamage() * (1 + caster.ability_shinki04_devour_count * factor)) + unit:SetBaseDamageMax(attackValue) + unit:SetBaseDamageMin(attackValue) + + unit:InheritOwnerBuff(caster) + + if GetDistanceBetweenTwoVec2D(caster:GetOrigin(), unit:GetOrigin()) > 1000 then + local forward = (unit:GetAbsOrigin() - caster:GetAbsOrigin()):Normalized() + unit:MoveToPosition(caster:GetOrigin() + forward*1000) + end + + enemy = unit:GetAttackTarget() + + ability = unit:FindAbilityByName("shinki_dragon_01") + if unit:IsReadyToCastAbility(ability) and enemy ~= nil and enemy.thtd_damage_lock ~= true then + if enemy~=nil and enemy:IsNull()==false and enemy:IsAlive() then + unit:CastAbilityOnTarget(enemy, ability, caster:GetPlayerOwnerID()) + end + end + + ability = unit:FindAbilityByName("shinki_dragon_03") + if unit:IsReadyToCastAbility(ability) then + if enemy~=nil and enemy:IsNull()==false and enemy:IsAlive() then + unit:CastAbilityNoTarget(ability, caster:GetPlayerOwnerID()) + end + end + + return math.floor(100/unit:GetAttacksPerSecond()) / 100 + end, + 0) +end + + +function OnShinkiDragon01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local owner = caster.thtd_spawn_unit_owner + if owner==nil or owner:IsNull() or owner:IsAlive()==false or owner:THTD_IsHidden() then return end + if target.thtd_damage_lock == true then return end + + local cooldown = math.floor(target:GetHealth() / caster:GetAverageTrueAttackDamage(caster)) + cooldown = math.min(600, math.max(15, cooldown)) + keys.ability:ApplyDataDrivenModifier(owner, owner, "modifier_shinki_dragon_01_cooldown", {Duration = cooldown}) + keys.ability:StartCooldown(cooldown) + + caster:NpcKill(target) + + local max_count = keys.max_count + if owner:IsPower999() then max_count = 999 end + + if owner.ability_shinki04_devour_count < max_count then + local skipedCount = 0 + if SpawnSystem.ReachToWave ~= nil then + if owner.skiped_wave == nil then + owner.skiped_wave = SpawnSystem.ReachToWave + 50 - SpawnSystem.CurWave - 1 + end + elseif owner.skiped_wave ~= nil then + skipedCount = owner.skiped_wave * 2 + owner.skiped_wave = nil + end + local addCount = math.min(max_count - owner.ability_shinki04_devour_count, 1 + skipedCount) + + owner.ability_shinki04_devour_count = owner.ability_shinki04_devour_count + addCount + caster:SetModelScale(baseModel * (1 + math.min(3, owner.ability_shinki04_devour_count * 0.02))) + if not caster:HasModifier("modifier_shinki_dragon_01_buff") then + keys.ability:ApplyDataDrivenModifier(caster, caster, "modifier_shinki_dragon_01_buff", nil) + end + caster:SetModifierStackCount("modifier_shinki_dragon_01_buff", caster, owner.ability_shinki04_devour_count) + elseif owner.ability_shinki04_devour_count > max_count then + owner.ability_shinki04_devour_count = max_count + caster:SetModelScale(baseModel * (1 + math.min(3, owner.ability_shinki04_devour_count * 0.02))) + caster:SetModifierStackCount("modifier_shinki_dragon_01_buff", caster, owner.ability_shinki04_devour_count) + end +end + + +function OnShinki02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local owner = caster.thtd_spawn_unit_owner + if owner==nil or owner:IsNull() or owner:IsAlive()==false or owner:THTD_IsHidden() then return end + local target = keys.target + + if RollPercentage(keys.chance) then + local enemies = THTD_FindUnitsInRadius(owner, target:GetOrigin(), keys.range) + local damage = caster:GetAverageTrueAttackDamage(caster) + local isEnabledStun = false + if caster.stun_locked ~= true then + isEnabledStun = true + caster.stun_locked = true + caster:SetContextThink(DoUniqueString("modifier_shinki_04"), + function() + caster.stun_locked = false + return nil + end, + 1.0) + end + if #enemies > 0 then + for k,v in pairs(enemies) do + if isEnabledStun then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_bash_stun_datadriven", {Duration = keys.stun_time}) + end + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + if v == target then + DamageTable.damage = DamageTable.damage * keys.damage_crit + else + DamageTable.damage = DamageTable.damage * keys.aoe_crit + end + UnitDamageTarget(DamageTable) + end + end + caster:EmitSound("Hero_Slardar.Bash") + end +end + + +function OnShinkiDragon03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local owner = caster.thtd_spawn_unit_owner + if owner==nil or owner:IsNull() or owner:IsAlive()==false or owner:THTD_IsHidden() then return end + + local crit = 1 + if owner:IsPower666() then + crit = 4 + keys.ability:EndCooldown() + keys.ability:StartCooldown(1.0) + end + + local enemies = THTD_FindUnitsInRadius(owner, caster:GetOrigin(), keys.RangeRadius) + local damage = caster:GetAverageTrueAttackDamage(caster) * keys.DamageTimes * crit + local debuff = "modifier_earthshock_debuff_datadriven" + if #enemies > 0 then + for k,v in pairs(enemies) do + keys.ability:ApplyDataDrivenModifier(caster, v, debuff, {}) + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitysizuha.lua b/scripts/vscripts/abilities/abilitysizuha.lua new file mode 100755 index 0000000..472a7bc --- /dev/null +++ b/scripts/vscripts/abilities/abilitysizuha.lua @@ -0,0 +1,15 @@ +function OnSizuha02StarImprove(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if target:THTD_IsTower() and target:GetUnitName()~=caster:GetUnitName() and target:THTD_GetStar() < caster:THTD_GetStar() and target:GetUnitName() ~= "minoriko" and target:GetUnitName() ~= "sizuha" then + target:THTD_SetStar(target:THTD_GetStar()+1) + target:THTD_SetLevel(THTD_MAX_LEVEL) + + caster.thtd_is_changed = true + caster.thtd_star = caster:THTD_GetStar() - 1 + caster:THTD_OpenAbility() + caster:THTD_DestroyLevelEffect() + caster:THTD_CreateLevelEffect() + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitysoga.lua b/scripts/vscripts/abilities/abilitysoga.lua new file mode 100755 index 0000000..222a8b3 --- /dev/null +++ b/scripts/vscripts/abilities/abilitysoga.lua @@ -0,0 +1,403 @@ +function OnSoga01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster:HasModifier("modifier_miko_02_buff") and caster.thtd_miko_buff_soga01 ~= nil then + caster:ReCooldown(keys.ability, caster.thtd_miko_buff_soga01) + end + + if caster.thtd_soga_01_effect_list == nil then + caster.thtd_soga_01_effect_list = {} + end + + if caster.thtd_soga_01_rect_last ~= nil then + for index,point in pairs(caster.thtd_soga_01_rect_last) do + local forward = (point - caster:GetAbsOrigin()):Normalized() + + for i=1,math.floor(keys.length/100) do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin() + 100 * i * forward) + ParticleManager:SetParticleControl(effectIndex, 1, caster:GetOrigin() + 100 * i * forward) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + caster:SetContextThink(DoUniqueString("thtd_soga_01_spell_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster:GetOrigin(), + caster:GetOrigin() + keys.length * forward, + nil, + 200, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + UnitStunTarget(caster,v,keys.stun_time) + end + + for k,v in pairs(caster.thtd_soga_01_effect_list) do + ParticleManager:DestroyParticleSystem(v,true) + end + caster.thtd_soga_01_effect_list = {} + caster.thtd_soga_01_rect_last = {} + return nil + end, + 0.2) + end + else + caster.thtd_soga_01_rect_last = {} + end + + local forward = (targetPoint - caster:GetAbsOrigin()):Normalized() + + for i=1,math.floor(keys.length/100) do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin() + 100 * i * forward) + ParticleManager:SetParticleControl(effectIndex, 1, caster:GetOrigin() + 100 * i * forward) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + caster:SetContextThink(DoUniqueString("thtd_soga_01_spell_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster:GetOrigin(), + caster:GetOrigin() + 800 * forward, + nil, + 200, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + UnitStunTarget(caster,v,keys.stun_time) + end + + table.insert(caster.thtd_soga_01_rect_last,targetPoint) + + for i=1,8 do + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_thtd_soga_lightning.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 0, caster:GetOrigin() + 100 * i * forward) + table.insert(caster.thtd_soga_01_effect_list,effectIndex2) + end + return nil + end, + 0) +end + +function OnSoga02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster.thtd_soga_02_effect_list == nil then + caster.thtd_soga_02_effect_list = {} + end + + if caster.thtd_soga_02_rect_last ~= nil then + for index,point in pairs(caster.thtd_soga_02_rect_last) do + caster:SetContextThink(DoUniqueString("thtd_soga_02_spell_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, point) + ParticleManager:SetParticleControl(effectIndex, 1, point) + ParticleManager:DestroyParticleSystem(effectIndex,false) + return nil + end, + 0.5) + + caster:SetContextThink(DoUniqueString("thtd_soga_02_spell_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * keys.damage_down/100 + local targets = THTD_FindUnitsInRadius(caster,point,keys.range) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + for k,v in pairs(caster.thtd_soga_02_effect_list) do + ParticleManager:DestroyParticleSystem(v,true) + end + caster.thtd_soga_02_effect_list = {} + caster.thtd_soga_02_rect_last = {} + return nil + end, + 0.7) + end + else + caster.thtd_soga_02_rect_last = {} + end + + caster:SetContextThink(DoUniqueString("thtd_soga_02_spell_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + return nil + end, + 0.5) + + caster:SetContextThink(DoUniqueString("thtd_soga_02_spell_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + for i=1,12 do + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_thtd_soga_lightning.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 0, targetPoint+Vector(math.cos(i*math.pi*2/12),math.sin(i*math.pi*2/12),0)*keys.range) + table.insert(caster.thtd_soga_02_effect_list,effectIndex2) + end + + table.insert(caster.thtd_soga_02_rect_last,targetPoint) + return nil + end, + 0.7) + +end + +function OnSoga03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster:HasModifier("modifier_miko_02_buff") and caster.thtd_miko_buff_soga03 ~= nil then + caster:ReCooldown(keys.ability, caster.thtd_miko_buff_soga03) + end + + if caster.thtd_soga_03_effect_list == nil then + caster.thtd_soga_03_effect_list = {} + end + + if caster.thtd_soga_03_rect_last ~= nil then + for index,point in pairs(caster.thtd_soga_03_rect_last) do + caster:SetContextThink(DoUniqueString("thtd_soga_03_spell_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local count = 0 + caster:SetContextThink(DoUniqueString("thtd_soga_03_spell_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if count < 9 then + count = count + 1 + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, point+Vector(math.cos(math.pi/2+count*math.pi*2/18),math.sin(math.pi/2+count*math.pi*2/18),0)*500) + ParticleManager:SetParticleControl(effectIndex, 1, point+Vector(math.cos(math.pi/2+count*math.pi*2/18),math.sin(math.pi/2+count*math.pi*2/18),0)*500) + ParticleManager:DestroyParticleSystem(effectIndex,false) + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 0, point+Vector(math.cos(-math.pi/2+count*math.pi*2/18),math.sin(-math.pi/2+count*math.pi*2/18),0)*500) + ParticleManager:SetParticleControl(effectIndex2, 1, point+Vector(math.cos(-math.pi/2+count*math.pi*2/18),math.sin(-math.pi/2+count*math.pi*2/18),0)*500) + ParticleManager:DestroyParticleSystem(effectIndex2,false) + return 0.1 + else + return nil + end + end, + 0.1) + return nil + end, + 0) + + caster:SetContextThink(DoUniqueString("thtd_soga_03_spell_effect_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + + for i=1,6 do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, point+Vector(math.cos(-math.pi/2+i*math.pi*2/6),math.sin(-math.pi/2+i*math.pi*2/6),0)*400) + ParticleManager:SetParticleControl(effectIndex, 1, point+Vector(math.cos(-math.pi/2+i*math.pi*2/6),math.sin(-math.pi/2+i*math.pi*2/6),0)*400) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + for i=1,3 do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, point+Vector(math.cos(-math.pi/2+i*math.pi*2/3),math.sin(-math.pi/2+i*math.pi*2/3),0)*200) + ParticleManager:SetParticleControl(effectIndex, 1, point+Vector(math.cos(-math.pi/2+i*math.pi*2/3),math.sin(-math.pi/2+i*math.pi*2/3),0)*200) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + for i=1,1 do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, point+Vector(math.cos(-math.pi/2+i*math.pi*2/1),math.sin(-math.pi/2+i*math.pi*2/1),0)*100) + ParticleManager:SetParticleControl(effectIndex, 1, point+Vector(math.cos(-math.pi/2+i*math.pi*2/1),math.sin(-math.pi/2+i*math.pi*2/1),0)*100) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + return nil + end, + 1.1) + + caster:SetContextThink(DoUniqueString("thtd_soga_03_spell_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * keys.damage_down/100 + local targets = THTD_FindUnitsInRadius(caster,point,keys.range) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + if keys.damage_up > 0 and v:HasModifier("modifier_soga_03_debuff") == false then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_soga_03_debuff", {Duration = keys.duration_time}) + end + end + for k,v in pairs(caster.thtd_soga_03_effect_list) do + ParticleManager:DestroyParticleSystem(v,true) + end + caster.thtd_soga_03_effect_list = {} + caster.thtd_soga_03_rect_last = {} + return nil + end, + 1.3) + end + else + caster.thtd_soga_03_rect_last = {} + end + + caster:SetContextThink(DoUniqueString("thtd_soga_03_spell_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local count = 0 + caster:SetContextThink(DoUniqueString("thtd_soga_03_spell_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if count < 9 then + count = count + 1 + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint+Vector(math.cos(math.pi/2+count*math.pi*2/18),math.sin(math.pi/2+count*math.pi*2/18),0)*500) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint+Vector(math.cos(math.pi/2+count*math.pi*2/18),math.sin(math.pi/2+count*math.pi*2/18),0)*500) + ParticleManager:DestroyParticleSystem(effectIndex,false) + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 0, targetPoint+Vector(math.cos(-math.pi/2+count*math.pi*2/18),math.sin(-math.pi/2+count*math.pi*2/18),0)*500) + ParticleManager:SetParticleControl(effectIndex2, 1, targetPoint+Vector(math.cos(-math.pi/2+count*math.pi*2/18),math.sin(-math.pi/2+count*math.pi*2/18),0)*500) + ParticleManager:DestroyParticleSystem(effectIndex2,false) + return 0.1 + else + return nil + end + end, + 0.1) + return nil + end, + 0) + + + caster:SetContextThink(DoUniqueString("thtd_soga_03_spell_effect_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + + for i=1,6 do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint+Vector(math.cos(-math.pi/2+i*math.pi*2/6),math.sin(-math.pi/2+i*math.pi*2/6),0)*400) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint+Vector(math.cos(-math.pi/2+i*math.pi*2/6),math.sin(-math.pi/2+i*math.pi*2/6),0)*400) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + for i=1,3 do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint+Vector(math.cos(-math.pi/2+i*math.pi*2/3),math.sin(-math.pi/2+i*math.pi*2/3),0)*200) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint+Vector(math.cos(-math.pi/2+i*math.pi*2/3),math.sin(-math.pi/2+i*math.pi*2/3),0)*200) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + for i=1,1 do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_soga_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint+Vector(math.cos(-math.pi/2+i*math.pi*2/1),math.sin(-math.pi/2+i*math.pi*2/1),0)*100) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint+Vector(math.cos(-math.pi/2+i*math.pi*2/1),math.sin(-math.pi/2+i*math.pi*2/1),0)*100) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + return nil + end, + 1.1) + + caster:SetContextThink(DoUniqueString("thtd_soga_03_spell_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + if keys.damage_up > 0 and v:HasModifier("modifier_soga_03_debuff") == false then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_soga_03_debuff", {Duration = keys.duration_time}) + end + end + + for i=1,18 do + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/thtd_soga/ability_thtd_soga_lightning.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 0, targetPoint+Vector(math.cos(i*math.pi*2/18),math.sin(i*math.pi*2/18),0)*keys.range) + table.insert(caster.thtd_soga_03_effect_list,effectIndex2) + end + + table.insert(caster.thtd_soga_03_rect_last,targetPoint) + return nil + end, + 1.3) + +end + +function OnCreatedSogaComboBuff(keys) + keys.target:AddDamageIncomingMagical(keys.damage_up, "thtd_soga_combo_damage_up") +end + +function OnDestroySogaComboBuff(keys) + keys.target:AddDamageIncomingMagical("thtd_soga_combo_damage_up") +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitystar.lua b/scripts/vscripts/abilities/abilitystar.lua new file mode 100755 index 0000000..c8ed18a --- /dev/null +++ b/scripts/vscripts/abilities/abilitystar.lua @@ -0,0 +1,200 @@ +function OnStar01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local fairyArea = nil + local hero = caster:GetOwner() + if hero~=nil and hero:IsNull()==false then + local fairyList = GetHeroFairyList(hero) + for k,v in pairs(fairyList) do + if v.star == caster then + fairyArea = v + break + end + end + end + + local isTargetInArea = false + if fairyArea ~= nil then + local pos1 = fairyArea.sunny:GetAbsOrigin() + local pos2 = fairyArea.star:GetAbsOrigin() + local pos3 = fairyArea.luna:GetAbsOrigin() + isTargetInArea = IsInTriangle(pos1,pos2,pos3,targetPoint) + local center, radius = GetCircleCenterAndRadius(pos1,pos2,pos3) + local targetsTotal = {} + local fairyTargets = THTD_FindUnitsInRadius(caster,center,radius) + for _,v in pairs(fairyTargets) do + if v~=nil and v:IsNull()==false and v:IsAlive() and IsUnitInFairy(fairyArea,v) then + targetsTotal[v:GetEntityIndex()] = v + end + end + for k,v in pairs(targetsTotal) do + OnStar01Damage(keys,v:GetOrigin()) + end + end + + if not isTargetInArea then + OnStar01Damage(keys,targetPoint) + end +end + +function OnStar01Damage(keys,targetPoint) + local caster = EntIndexToHScript(keys.caster_entindex) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_star/ability_star_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + caster:SetContextThink(DoUniqueString("ability_star_01_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_star_01_slow", {Duration = keys.duration_time}) + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + return nil + end, + 0.5) +end + +function OnStar02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local fairyArea = nil + local hero = caster:GetOwner() + if hero~=nil and hero:IsNull()==false then + local fairyList = GetHeroFairyList(hero) + for k,v in pairs(fairyList) do + if v.star == caster then + fairyArea = v + break + end + end + end + + local isTargetInArea = false + if fairyArea ~= nil then + local pos1 = fairyArea.sunny:GetAbsOrigin() + local pos2 = fairyArea.star:GetAbsOrigin() + local pos3 = fairyArea.luna:GetAbsOrigin() + + isTargetInArea = IsInTriangle(pos1,pos2,pos3,targetPoint) + + local center, radius = GetCircleCenterAndRadius(pos1,pos2,pos3) + + local pos10 = GetTwoVectorSub(center, pos1, 2/1) + local pos20 = GetTwoVectorSub(center, pos2, 2/1) + local pos30 = GetTwoVectorSub(center, pos3, 2/1) + local star_points = {} + table.insert(star_points, center) + table.insert(star_points, pos10) + table.insert(star_points, pos20) + table.insert(star_points, pos30) + table.insert(star_points, GetTwoVectorSub(pos10, pos20, 1/1)) + table.insert(star_points, GetTwoVectorSub(pos20, pos30, 1/1)) + table.insert(star_points, GetTwoVectorSub(pos30, pos10, 1/1)) + + local time = keys.max_count * 0.2 + local count = 0 + caster:SetContextThink(DoUniqueString("ability_star_02_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time < 0 then return nil end + if fairyArea.sunny==nil or fairyArea.sunny:IsNull() or fairyArea.sunny:THTD_IsHidden() then return nil end + if fairyArea.star==nil or fairyArea.star:IsNull() or fairyArea.star:THTD_IsHidden() then return nil end + if fairyArea.luna==nil or fairyArea.luna:IsNull() or fairyArea.luna:THTD_IsHidden() then return nil end + + for _, pos in pairs(star_points) do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_star/ability_star_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, pos) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + if count > 0 and count % 2 == 0 then + local targetsTotal = {} + local targets = THTD_FindUnitsInRadius(caster,center,radius) + for _,v in pairs(targets) do + if v~=nil and v:IsNull()==false and v:IsAlive() and IsUnitInFairy(fairyArea,v) then + table.insert(targetsTotal, v) + end + end + targets = {} + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 2 * (1 + keys.damage_up/100)^count + for _, v in pairs(targetsTotal) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + + count = count + 1 + time = time - 0.2 + return 0.2 + end, + 0) + + end + + if not isTargetInArea then + OnStar02Damage(keys,targetPoint) + end +end + +function OnStar02Damage(keys,targetPoint) + local caster = EntIndexToHScript(keys.caster_entindex) + local time = keys.max_count * 0.2 + local count = 0 + + caster:SetContextThink(DoUniqueString("ability_star_02_delay"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time < 0 then return nil end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_star/ability_star_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + if count > 0 and count % 2 == 0 then + caster:SetContextThink(DoUniqueString("ability_star_02_delay"), + function() + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 2 * (1 + keys.damage_up/100)^count + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + return nil + end, + 0.5) + end + + count = count + 1 + time = time - 0.2 + return 0.2 + end, + 0) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitysuika.lua b/scripts/vscripts/abilities/abilitysuika.lua new file mode 100755 index 0000000..c85e22a --- /dev/null +++ b/scripts/vscripts/abilities/abilitysuika.lua @@ -0,0 +1,371 @@ +local suika_model_scale_table = +{ + [1] = 0.5, + [2] = 0.7, + [3] = 0.8, + [4] = 1.0, + [5] = 1.2, + [6] = 2.0, + [7] = 3.0, +} + +local suika_count_table = +{ + [1] = 7, + [2] = 3, + [3] = 1, + [4] = 0, + [5] = 0, + [6] = 0, + [7] = 0, +} + +local suika_damage_increase = +{ + [1] = 0.125, + [2] = 0.25, + [3] = 0.5, + [4] = 1, + [5] = 2, + [6] = 4, + [7] = 8, +} + +local suika_damage_chance = +{ + [1] = 50, + [2] = 50, + [3] = 50, + [4] = 50, + [5] = 25, + [6] = 12.5, + [7] = 6.25, +} + +local suika_damage_radius = +{ + [1] = 200, + [2] = 200, + [3] = 200, + [4] = 400, + [5] = 600, + [6] = 800, + [7] = 1000, +} + +function OnSuika01SpellStartUp(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.thtd_suika_01_scale == nil then + caster.thtd_suika_01_scale = 4 + end + + if caster.thtd_suika_01_scale > 1 then + caster.thtd_suika_01_scale = caster.thtd_suika_01_scale - 1 + caster:SetModelScale(suika_model_scale_table[caster.thtd_suika_01_scale]) + RemoveAllSuikaTinySuika(keys) + SuikaCreateTinySuika(keys) + end +end + +function OnSuika01SpellStartDown(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.thtd_suika_01_scale == nil then + caster.thtd_suika_01_scale = 4 + end + + if caster.thtd_suika_01_scale < 7 then + caster.thtd_suika_01_scale = caster.thtd_suika_01_scale + 1 + caster:SetModelScale(suika_model_scale_table[caster.thtd_suika_01_scale]) + RemoveAllSuikaTinySuika(keys) + SuikaCreateTinySuika(keys) + end +end + +function RemoveAllSuikaTinySuika(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster.thtd_suika_01_tiny_suika_table == nil then + caster.thtd_suika_01_tiny_suika_table = {} + end + for k,v in pairs(caster.thtd_suika_01_tiny_suika_table) do + if v~=nil and v:IsNull() == false and v:IsAlive() then + v:AddNoDraw() + v:ForceKill(true) + end + end + caster.thtd_suika_01_tiny_suika_table = {} +end + +function SuikaCreateTinySuika(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local count = suika_count_table[caster.thtd_suika_01_scale] + + if caster.thtd_suika_01_tiny_suika_table == nil then + caster.thtd_suika_01_tiny_suika_table = {} + end + + local particle = ParticleManager:CreateParticle("particles/heroes/thtd_suika/ability_suika_01_smoke.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(particle,0,caster:GetOrigin()) + ParticleManager:SetParticleControl(particle,1,Vector(100,100,100)) + ParticleManager:DestroyParticleSystem(particle,false) + + for i=1,count do + local offset = 100 + local rad = math.pi/2 + if i > 3 then + offset = 200 + rad = rad - math.pi/4 - 3*math.pi/2 + end + local tinySuika = CreateUnitByName( + "tiny_suika", + caster:GetOrigin() + Vector(math.cos(rad*(i+1)),math.sin(rad*(i+1)),0)*offset, + false, + caster:GetOwner(), + caster:GetOwner(), + caster:GetTeam() + ) + tinySuika.thtd_spawn_unit_owner = caster + local suikaAbility01 = caster:FindAbilityByName("thtd_suika_01") + if suikaAbility01~=nil then + suikaAbility01:ApplyDataDrivenModifier(caster, tinySuika, "passive_suika_01_attack_landed", nil) + end + keys.ability:ApplyDataDrivenModifier(caster, tinySuika, "modifier_suika_02_illusion", nil) + tinySuika:SetControllableByPlayer(caster:GetPlayerOwnerID(), true) + tinySuika:SetBaseDamageMax(caster:THTD_GetAttack()) + tinySuika:SetBaseDamageMin(caster:THTD_GetAttack()) + tinySuika:SetModelScale(suika_model_scale_table[caster.thtd_suika_01_scale]) + tinySuika:SetForwardVector(caster:GetForwardVector()) + table.insert(caster.thtd_suika_01_tiny_suika_table,tinySuika) + + local particle = ParticleManager:CreateParticle("particles/heroes/thtd_suika/ability_suika_01_smoke.vpcf",PATTACH_CUSTOMORIGIN,tinySuika) + ParticleManager:SetParticleControl(particle,0,tinySuika:GetOrigin()) + ParticleManager:SetParticleControl(particle,1,Vector(100,100,100)) + ParticleManager:DestroyParticleSystem(particle,false) + end +end + +function OnSuika01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster:GetUnitName() == "tiny_suika" then + caster = caster.thtd_spawn_unit_owner + end + + if caster.thtd_suika_01_scale == nil then + caster.thtd_suika_01_scale = 4 + end + + if RandomInt(1,100) < suika_damage_chance[caster.thtd_suika_01_scale] then + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),suika_damage_radius[caster.thtd_suika_01_scale]) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability)*suika_damage_increase[caster.thtd_suika_01_scale] + for k,v in pairs(targets) do + local damage_table = { + victim = v, + attacker = caster, + damage = damage, + ability = keys.ability, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE, + } + UnitDamageTarget(damage_table) + + local suikaAbility01 = caster:FindAbilityByName("thtd_suika_01") + if suikaAbility01~=nil then + suikaAbility01:ApplyDataDrivenModifier(caster, v, "modifier_suika_01_slow_debuff", {Duration = 5.0}) + end + end + + local particle = ParticleManager:CreateParticle("particles/heroes/thtd_suika/ability_suika_01.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(particle,0,target:GetOrigin()+Vector(0,0,64)) + ParticleManager:SetParticleControl(particle,1,Vector(suika_damage_radius[caster.thtd_suika_01_scale],suika_damage_radius[caster.thtd_suika_01_scale],suika_damage_radius[caster.thtd_suika_01_scale])) + ParticleManager:DestroyParticleSystem(particle,false) + end +end + +function OnSuika01Think(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster==nil or caster:IsNull() or caster:IsAlive() == false or caster:THTD_IsHidden() then + RemoveAllSuikaTinySuika(keys) + end +end + +function OnSuika03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster.thtd_suika_01_scale == nil then + caster.thtd_suika_01_scale = 4 + end + + if caster.thtd_suika_01_tiny_suika_table == nil then + caster.thtd_suika_01_tiny_suika_table = {} + end + + Suika03ThrowBallToPoint(keys,caster:GetOrigin(),targetPoint,120) + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),1000) + for k,v in pairs(caster.thtd_suika_01_tiny_suika_table) do + if v~=nil and v:IsNull() == false and v:IsAlive() and #targets>0 then + Suika03ThrowBallToPoint(keys,v:GetOrigin(),targets[RandomInt(1,#targets)]:GetOrigin(),120) + end + end +end + +function Suika03ThrowBallToPoint(keys,origin,targetpoint,vhigh) + local caster = EntIndexToHScript(keys.caster_entindex) + + local curOrigin = Vector(origin.x,origin.y,origin.z) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_suika/ability_suika_03.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, curOrigin) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(suika_damage_radius[caster.thtd_suika_01_scale]/1000,0,0)) + ParticleManager:SetParticleControl(effectIndex, 2, Vector(suika_damage_radius[caster.thtd_suika_01_scale]/2,0,0)) + + local g = -10 + local dis = GetDistanceBetweenTwoVec2D(origin,targetpoint) + local vh = vhigh + local t = math.abs(2*vh/g) + local speed = dis/t + local rad = GetRadBetweenTwoVec2D(origin,targetpoint) + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * suika_damage_increase[caster.thtd_suika_01_scale] + + caster:SetContextThink(DoUniqueString("ability_suika_03"), + function() + if GameRules:IsGamePaused() then return 0.03 end + vh = vh + g + curOrigin = Vector(curOrigin.x + math.cos(rad) * speed,curOrigin.y + math.sin(rad) * speed,curOrigin.z + vh) + ParticleManager:SetParticleControl(effectIndex, 0, curOrigin) + if curOrigin.z >= caster:GetOrigin().z - 50 then + return 0.02 + else + curOrigin.z = caster:GetOrigin().z + ParticleManager:DestroyParticleSystem(effectIndex,true) + local effectIndex2 = ParticleManager:CreateParticle("particles/thd2/heroes/suika/ability_suika_04_effect.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 0, curOrigin) + ParticleManager:DestroyParticleSystem(effectIndex2,false) + + local targets = THTD_FindUnitsInRadius(caster,curOrigin,suika_damage_radius[caster.thtd_suika_01_scale]/2) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + return nil + end + end, + 0) +end + +function OnSuika04SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster.thtd_suika_01_scale == nil then + caster.thtd_suika_01_scale = 4 + end + + if caster.thtd_suika_01_tiny_suika_table == nil then + caster.thtd_suika_01_tiny_suika_table = {} + end + + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),keys.range) + if #targets>0 then + for index,lockTarget in pairs(targets) do + if lockTarget.thtd_suika_04_lock~=true then + lockTarget.thtd_suika_04_lock = true + OnSuika04LockToTarget(keys,caster,lockTarget) + end + end + end + + for k,v in pairs(caster.thtd_suika_01_tiny_suika_table) do + if v~=nil and v:IsNull() == false and v:IsAlive() then + local targets = THTD_FindUnitsInRadius(caster,v:GetOrigin(),keys.range) + if #targets>0 then + for index,lockTarget in pairs(targets) do + if lockTarget.thtd_suika_04_lock~=true then + lockTarget.thtd_suika_04_lock = true + OnSuika04LockToTarget(keys,v,lockTarget) + end + end + end + end + end +end + +function OnSuika04LockToTarget(keys,caster,target) + local originalCaster = EntIndexToHScript(keys.caster_entindex) + local vecHook = target:GetOrigin() + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_suika/ability_suika_04.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControl(effectIndex, 1, vecHook) + ParticleManager:SetParticleControlEnt(effectIndex , 3, target, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControl(effectIndex, 4, Vector(2400,0,0)) + ParticleManager:SetParticleControl(effectIndex, 5, Vector(2400,0,0)) + ParticleManager:SetParticleControl(effectIndex, 6, vecHook) + + local timecount = keys.duration_time + local range = keys.range + ParticleManager:DestroyParticleSystemTime(effectIndex,timecount) + + caster:SetContextThink(DoUniqueString("ability_suika_04"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if timecount <= 0 or target==nil or target:IsNull() or target:IsAlive()==false then + ParticleManager:DestroyParticleSystem(effectIndex, true) + if THTD_IsValid(target) then + FindClearSpaceForUnit(target, target:GetOrigin(), false) + target.thtd_suika_04_lock = false + end + return nil + end + if GetDistanceBetweenTwoVec2D(caster:GetOrigin(), target:GetOrigin()) > range then + local forward = (target:GetOrigin() - caster:GetAbsOrigin()):Normalized() + target:SetAbsOrigin(caster:GetOrigin()+forward*range) + local damage = originalCaster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 * suika_damage_increase[originalCaster.thtd_suika_01_scale] + if originalCaster == caster then + if not (RandomInt(1,100) <= suika_damage_chance[caster.thtd_suika_01_scale]) then + damage = originalCaster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 + end + end + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = originalCaster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + local damage = originalCaster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 * suika_damage_increase[originalCaster.thtd_suika_01_scale] + if originalCaster == caster then + if RandomInt(1,100) > suika_damage_chance[caster.thtd_suika_01_scale] then + damage = originalCaster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 + end + end + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = originalCaster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + timecount = timecount - 0.2 + return 0.2 + end, + 0) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitysunny.lua b/scripts/vscripts/abilities/abilitysunny.lua new file mode 100755 index 0000000..3883ee3 --- /dev/null +++ b/scripts/vscripts/abilities/abilitysunny.lua @@ -0,0 +1,166 @@ +function OnSunny01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local targetPoint = target:GetOrigin() + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + OnSunny01Damage(keys,caster,caster,target,damage) + local count = 1 + local lastTarget = target + local attackedTarget = {} + for k,v in pairs(targets) do + if count <= keys.max_count and THTD_IsValid(v) and v ~= lastTarget then + count = count + 1 + OnSunny01Damage(keys,caster,lastTarget,v, damage*(1+keys.damage_up/100)^count) + lastTarget = v + table.insert(attackedTarget, v) + else + break + end + end + + local fairyArea = nil + local hero = caster:GetOwner() + if hero~=nil and hero:IsNull()==false then + local fairyList = GetHeroFairyList(hero) + for k,v in pairs(fairyList) do + if v.sunny == caster then + fairyArea = v + break + end + end + end + + if fairyArea ~= nil then + local pos1 = fairyArea.sunny:GetAbsOrigin() + local pos2 = fairyArea.star:GetAbsOrigin() + local pos3 = fairyArea.luna:GetAbsOrigin() + local center, radius = GetCircleCenterAndRadius(pos1,pos2,pos3) + local targetsTotal = {} + local fairyTargets = THTD_FindUnitsInRadius(caster,center,radius) + for _,v in pairs(fairyTargets) do + if v~=nil and v:IsNull()==false and v:IsAlive() and IsUnitInFairy(fairyArea,v) then + targetsTotal[v:GetEntityIndex()] = v + end + end + local targetAdds = {} + for k,v in pairs(targetsTotal) do + local isExist = false + for k2,v2 in pairs(attackedTarget) do + if v2 == v then + isExist = true + break + end + end + if isExist == false then + table.insert(targetAdds,v) + end + end + targetsTotal = {} + + local factor = 0 + for i=1,keys.max_count+1 do + factor = factor + (1+keys.damage_up/100)^(i-1) + end + local lastTarget = caster + for k,v in pairs(targetAdds) do + OnSunny01Damage(keys,caster,lastTarget,v,damage*factor) + lastTarget = v + end + targetAdds = {} + end +end + +function OnSunny01Damage(keys,caster,target1,target2,damage) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/sunny/ability_sunny_01_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, target2, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 1, target1, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 9, target2, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local DamageTable = { + ability = keys.ability, + victim = target2, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + +function OnSunny02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/sunny/ability_sunny_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, targetPoint+Vector(0,0,32)) + ParticleManager:DestroyParticleSystemTime(effectIndex,keys.duration_time) + + local fairyArea = nil + local hero = caster:GetOwner() + if hero~=nil and hero:IsNull()==false then + local fairyList = GetHeroFairyList(hero) + for k,v in pairs(fairyList) do + if v.sunny == caster then + fairyArea = v + break + end + end + end + local center = nil + local radius = nil + if fairyArea ~= nil then + local pos1 = fairyArea.sunny:GetAbsOrigin() + local pos2 = fairyArea.star:GetAbsOrigin() + local pos3 = fairyArea.luna:GetAbsOrigin() + center, radius = GetCircleCenterAndRadius(pos1,pos2,pos3) + end + + local time = keys.duration_time + caster:SetContextThink(DoUniqueString("ability_sunny_02_debuff"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then return nil end + if THTD_IsValid(caster) == false then + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + + local targetsTotal = {} + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + if center ~= nil and radius ~= nil then + local fairyTargets = THTD_FindUnitsInRadius(caster,center,radius) + for _,v in pairs(fairyTargets) do + if v~=nil and v:IsNull()==false and v:IsAlive() and IsUnitInFairy(fairyArea,v) then + targetsTotal[v:GetEntityIndex()] = v + end + end + end + for k,v in pairs(targets) do + targetsTotal[v:GetEntityIndex()] = v + end + targets = {} + for k,v in pairs(targetsTotal) do + local m = v:FindModifierByName("modifier_sunny_02_debuff") + if m ~= nil then + m:SetDuration(0.4, false) + else + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_sunny_02_debuff", {Duration = 0.4}) + end + end + + time = time - 0.25 + return 0.25 + end, + 0) +end + +function OnCreatedSunny02Buff(keys) + keys.target:AddDamageIncomingPure(keys.damage_up, "thtd_sunny_02_damage_up") +end + +function OnDestroySunny02Buff(keys) + keys.target:AddDamageIncomingPure("thtd_sunny_02_damage_up") +end diff --git a/scripts/vscripts/abilities/abilitysuwako.lua b/scripts/vscripts/abilities/abilitysuwako.lua new file mode 100755 index 0000000..472a80b --- /dev/null +++ b/scripts/vscripts/abilities/abilitysuwako.lua @@ -0,0 +1,207 @@ +function OnSuwako01SpellHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local damage_table = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = 0 + } + UnitDamageTarget(damage_table) +end + +function OnSuwako01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local info = + { + Ability = keys.ability, + EffectName = "particles/heroes/thtd_suwako/ability_suwako_01_ring.vpcf", + vSpawnOrigin = caster:GetOrigin() + Vector(0,0,128), + fDistance = caster:Script_GetAttackRange(), + fStartRadius = 200, + fEndRadius = 200, + Source = caster, + bHasFrontalCone = false, + bReplaceExisting = false, + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = false, + vVelocity = caster:GetForwardVector() * 1500, + bProvidesVision = true, + iVisionRadius = 1000, + iVisionTeamNumber = caster:GetTeamNumber() + } + projectile = ProjectileManager:CreateLinearProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) +end + + +function OnSuwako02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster.thtd_suwako_02_rect == nil then + caster.thtd_suwako_02_rect = {} + end + + caster.thtd_suwako_02_rect["point"] = targetPoint + if caster.thtd_suwako_02_rect["effectIndex"] == nil then + caster.thtd_suwako_02_rect["effectIndex"] = ParticleManager:CreateParticle("particles/heroes/thtd_suwako/ability_suwako_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(caster.thtd_suwako_02_rect["effectIndex"], 0, targetPoint) + ParticleManager:SetParticleControl(caster.thtd_suwako_02_rect["effectIndex"], 1, Vector(keys.range,1,1)) + else + ParticleManager:DestroyParticleSystem(caster.thtd_suwako_02_rect["effectIndex"],true) + caster.thtd_suwako_02_rect["effectIndex"] = ParticleManager:CreateParticle("particles/heroes/thtd_suwako/ability_suwako_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(caster.thtd_suwako_02_rect["effectIndex"], 0, targetPoint) + ParticleManager:SetParticleControl(caster.thtd_suwako_02_rect["effectIndex"], 1, Vector(keys.range,1,1)) + end +end + +function OnSuwako02Think(keys) + if GameRules:IsGamePaused() then return end + local caster = EntIndexToHScript(keys.caster_entindex) + if caster.thtd_suwako_02_rect == nil then + caster.thtd_suwako_02_rect = {} + end + if keys.ability:GetLevel() < 1 or caster:THTD_IsHidden() then + if caster.thtd_suwako_02_rect["effectIndex"]~=nil then + ParticleManager:DestroyParticleSystem(caster.thtd_suwako_02_rect["effectIndex"],true) + end + return + end + + if caster.thtd_suwako_02_rect["effectIndex"] ~= nil then + local point = caster.thtd_suwako_02_rect["point"] + local targets = THTD_FindUnitsInRadius(caster,point,keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 0.2 * (1 + caster:THTD_GetFaith()*keys.up_percent/100) + for k,v in pairs(targets) do + if v.thtd_suwako_02_count == nil then + v.thtd_suwako_02_count = 0 + end + if v.thtd_suwako_02_lock == nil then + v.thtd_suwako_02_lock = false + end + v.thtd_suwako_02_count = v.thtd_suwako_02_count + 1 + if v.thtd_suwako_02_count > keys.stay_time/0.2 and v.thtd_suwako_02_lock == false then + keys.ability:ApplyDataDrivenModifier(caster,v,"modifier_suwako_rooted",{Duration = keys.root_time}) + v.thtd_suwako_02_lock = true + + v:SetContextThink(DoUniqueString("thtd_suwako_02_leave_rect"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if GetDistanceBetweenTwoVec2D(point,v:GetOrigin()) > keys.range then + v.thtd_suwako_02_count = 0 + v.thtd_suwako_02_lock = false + return nil + else + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = 0 + } + UnitDamageTarget(damage_table) + end + return 0.2 + end, + 0) + end + end + end +end + +function OnSuwako03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local inners = THTD_FindUnitsInner(caster) + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * (1 + caster:THTD_GetFaith()*keys.up_percent/100) + for k,v in pairs(inners) do + if v:HasModifier("modifier_suwako_03_rooted") == false then + local g = -10 + local vh = 120 + local t = math.abs(2*vh/g) + local targetPoint = v:GetOrigin() -- + RandomVector(200) + local rad = GetRadBetweenTwoVec2D(v:GetOrigin(),targetPoint) + local dis = GetDistanceBetweenTwoVec2D(v:GetOrigin(),targetPoint) + local speed = dis/t + local curOrigin = v:GetOrigin() + local originz = curOrigin.z + + keys.ability:ApplyDataDrivenModifier(caster,v,"modifier_suwako_03_rooted",{}) + + local effectIndex = ParticleManager:CreateParticle("particles/econ/items/kunkka/kunkka_torrent_base/kunkka_spell_torrent_splash_econ.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + v:SetContextThink(DoUniqueString("thtd_suwako_03_unit_up"), + function() + if GameRules:IsGamePaused() then return 0.03 end + vh = vh + g + curOrigin = Vector(curOrigin.x + math.cos(rad) * speed,curOrigin.y + math.sin(rad) * speed,curOrigin.z + vh) + v:SetAbsOrigin(curOrigin) + + if curOrigin.z >= originz then + return 0.03 + else + -- FindClearSpaceForUnit(v, v:GetOrigin(), false) + v:SetAbsOrigin(targetPoint) + + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = 0 + } + UnitDamageTarget(damage_table) + v:RemoveModifierByName("modifier_suwako_03_rooted") + return nil + end + end, + 0) + end + end +end + +function OnSuwakoKill(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + caster:THTD_AddFaith() +end + +function OnSuwako04SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + caster:EmitSound("Sound_THTD.thtd_suwako_04") + caster.thtd_last_cast_unit = target + + local modifier = target:FindModifierByName("modifier_suwako_04_buff") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_suwako_04_buff", {duration = keys.duration_time}) + else + modifier:SetDuration(keys.duration_time, false) + end +end + +function OnCreatedSuwako04Buff(keys) + local unitName = keys.target:GetUnitName() + if unitName == "suwako" or unitName == "kanako" or unitName == "sanae" then + keys.target:THTD_AddCritDamage(keys.self_crit, "thtd_suwako_04_bonus") + else + keys.target:THTD_AddCritDamage(keys.crit, "thtd_suwako_04_bonus") + end +end + +function OnDestroySuwako04Buff(keys) + keys.target:THTD_AddCritDamage("thtd_suwako_04_bonus") +end + diff --git a/scripts/vscripts/abilities/abilitytenshi.lua b/scripts/vscripts/abilities/abilitytenshi.lua new file mode 100755 index 0000000..cad264a --- /dev/null +++ b/scripts/vscripts/abilities/abilitytenshi.lua @@ -0,0 +1,242 @@ +function OnTenshi01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + caster:EmitSound("Sound_THTD.thtd_tenshi_01") + + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + + local powerBonus = #targets * keys.bonus_attack_power + if powerBonus > 0 then + caster:THTD_AddBasePower(powerBonus) + caster:THTD_AddBaseAttack(powerBonus) + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + caster:THTD_AddBasePower(-powerBonus) + caster:THTD_AddBaseAttack(-powerBonus) + return nil + end, + keys.duration_time) + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local DamageTable_aoe = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable_aoe) + end + + local effectIndex = ParticleManager:CreateParticle("particles/econ/items/earthshaker/egteam_set/hero_earthshaker_egset/earthshaker_echoslam_start_fallback_low_egset.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnTenshi02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + local damage = caster:THTD_GetAttack() + for k,v in pairs(targets) do + local DamageTable_aoe = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable_aoe) + end + + if caster.thtd_attack_time == nil then + caster.thtd_attack_time = GameRules:GetGameTime() - 10 + end + if caster.thtd_attack_time < GameRules:GetGameTime() - 1 then + caster.thtd_attack_time = GameRules:GetGameTime() + local effectIndex = ParticleManager:CreateParticle("particles/econ/items/earthshaker/egteam_set/hero_earthshaker_egset/earthshaker_echoslam_start_fallback_low_egset.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end +end + +-- 被动modifier会在所有自定变量前生效,造成不起作用,不要用Passive +function OnThinkTenshi02Buff(keys) + local caster = keys.caster + + local powerChance = 0 + local pv = caster:GetAbilityPowerValue("thtd_tenshi_02") + if pv ~= nil then + powerChance = pv[1] + end + local bonus = keys.chance + powerChance + local add = bonus - (caster.thtd_tenshi_02_crit_chance or 0) + if add ~= 0 then + caster:THTD_AddCritChance(add) + caster.thtd_tenshi_02_crit_chance = bonus + end + + local bonus = keys.crit + if caster:IsPower999() then + bonus = bonus * 2 + end + local add = bonus - (caster.thtd_tenshi_02_crit_damage or 0) + if add ~= 0 then + caster:THTD_AddCritDamage(add) + caster.thtd_tenshi_02_crit_damage = bonus + end +end + +function OnDestroyTenshi02Buff(keys) + local caster = keys.caster + + if caster.thtd_tenshi_02_crit_chance ~= nil then + caster:THTD_AddCritChance(-caster.thtd_tenshi_02_crit_chance) + caster.thtd_tenshi_02_crit_chance = nil + end + if caster.thtd_tenshi_02_crit_damage ~= nil then + caster:THTD_AddCritDamage(-caster.thtd_tenshi_02_crit_damage) + caster.thtd_tenshi_02_crit_damage = nil + end +end + +function OnTenshi03AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if keys.ability:GetLevel() < 1 then return end + + if caster.thtd_tenshi_03_attack_count == nil then + caster.thtd_tenshi_03_attack_count = 0 + end + + caster.thtd_tenshi_03_attack_count = caster.thtd_tenshi_03_attack_count + 1 + + if caster.thtd_tenshi_03_attack_count >= keys.max_count then + caster.thtd_tenshi_03_attack_count = 0 + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_tenshi_03") + if pv ~= nil then + powerDamage = pv[1] + end + caster.thtd_tenshi_03_damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage() + + caster:EmitSound("Hero_Magnataur.ShockWave.Particle") + + local info = + { + Ability = keys.ability, + EffectName = "particles/heroes/tenshi/ability_tenshi_03.vpcf", + vSpawnOrigin = caster:GetAbsOrigin(), + fDistance = 1500, + fStartRadius = 380, + fEndRadius = 380, + Source = caster, + bHasFrontalCone = false, + bReplaceExisting = false, + iUnitTargetTeam = DOTA_UNIT_TARGET_TEAM_ENEMY, + iUnitTargetFlags = DOTA_UNIT_TARGET_FLAG_NONE, + iUnitTargetType = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC, + fExpireTime = GameRules:GetGameTime() + 10.0, + bDeleteOnHit = false, + vVelocity = caster:GetForwardVector() * 1800, + bProvidesVision = true, + iVisionRadius = 1000, + iVisionTeamNumber = caster:GetTeamNumber() + } + local projectile = ProjectileManager:CreateLinearProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + end + + if caster:IsPower666() then + if caster.thtd_tenshi_power666_cast ~= true then + caster.thtd_tenshi_power666_cast = true + local time = 1.5 + local forward = caster:GetForwardVector() + local effectIndex = ParticleManager:CreateParticle("particles/units/heroes/hero_elder_titan/elder_titan_earth_splitter.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, forward * 900) --方向 + ParticleManager:SetParticleControl(effectIndex, 3, Vector(0, time, 0)) --时间 + ParticleManager:DestroyParticleSystem(effectIndex,false) + + caster:SetContextThink(DoUniqueString("thtd_suwako_03_unit_up"), + function() + caster:EmitSound("Hero_ElderTitan.EarthSplitter.Cast") + local targets = FindUnitsInLine( + caster:GetTeamNumber(), + caster:GetOrigin(), + caster:GetOrigin() + forward * 1000, + nil, + 300, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + local damage = 666 * caster:THTD_GetStarDamage() + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + caster.thtd_tenshi_power666_cast = false + return nil + end, + time) + end + end +end + +function OnTenshiProjectileHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster.thtd_tenshi_03_damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + +function OnThinkTenshi03Buff(keys) + local target = keys.target + + local targets = THTD_FindFriendlyUnitsInRadius(target,target:GetAbsOrigin(),keys.radius) + for k,v in pairs(targets) do + local modifier = v:FindModifierByName("modifier_tenshi_03_attack_speed_buff") + -- 持续时间比think大一点 + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(target, v, "modifier_tenshi_03_attack_speed_buff", {Duration = 0.3}) + else + modifier:SetDuration(0.3, false) + end + end +end + +function OnCreatedTenshi03Buff(keys) + keys.target:THTD_AddAttackSpeed(keys.attack_speed, "thtd_tenshi_03_bonus") +end + +function OnDestroyTenshi03Buff(keys) + keys.target:THTD_AddAttackSpeed("thtd_tenshi_03_bonus") +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitytoramaru.lua b/scripts/vscripts/abilities/abilitytoramaru.lua new file mode 100755 index 0000000..e7fd3a2 --- /dev/null +++ b/scripts/vscripts/abilities/abilitytoramaru.lua @@ -0,0 +1,105 @@ +function OnToramaru01SpellStart(keys) + if SpawnSystem.IsUnLimited then return end + if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local gold = keys.BonusGold + THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), gold , true, DOTA_ModifyGold_CreepKill) + SendOverheadEventMessage(caster:GetPlayerOwner(), OVERHEAD_ALERT_GOLD, target, gold, caster:GetPlayerOwner() ) + caster:EmitSound("Sound_THTD.thtd_nazrin_01") + + local effectIndex = ParticleManager:CreateParticle("particles/thd2/items/item_donation_box.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, target:GetAbsOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local damage_table = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = 0 + } + UnitDamageTarget(damage_table) +end + +function OnToramaru02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster:HasModifier("modifier_byakuren_03_buff") then + THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), 500 * caster.thtd_byakuren_buff_toramaru/100 , true, DOTA_ModifyGold_CreepKill) + caster.toramaru_cost_gold = (caster.toramaru_cost_gold or 0) + 500 + end + + local effectIndex = ParticleManager:CreateParticle("particles/thd2/items/item_donation_box.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, target:GetAbsOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local damage_table = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = 0 + } + UnitDamageTarget(damage_table) +end + +function OnToramaru03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster:HasModifier("modifier_byakuren_03_buff") then + THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), 5000 * caster.thtd_byakuren_buff_toramaru/100, true, DOTA_ModifyGold_CreepKill) + caster.toramaru_cost_gold = (caster.toramaru_cost_gold or 0) + 5000 + end + + local inners = THTD_FindUnitsInner(caster) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(inners) do + local effectIndex = ParticleManager:CreateParticle("particles/thd2/items/item_donation_box.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetAbsOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, v:GetAbsOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = 0 + } + UnitDamageTarget(damage_table) + end +end + +function OnSpellStartToramaru04(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + local damage = caster:THTD_GetStarDamage() * 2 + damage = damage + (caster.toramaru_cost_gold or 0)*caster:THTD_GetStar()*0.02 + + local targets = THTD_FindUnitsInRadius(caster,caster:GetAbsOrigin(),keys.ability:GetCastRange()) + for k,v in pairs(targets) do + local effectIndex = ParticleManager:CreateParticle("particles/heroes/sunny/ability_sunny_01_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, v, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 1, caster, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex , 9, v, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityutsuho.lua b/scripts/vscripts/abilities/abilityutsuho.lua new file mode 100755 index 0000000..4ea42db --- /dev/null +++ b/scripts/vscripts/abilities/abilityutsuho.lua @@ -0,0 +1,141 @@ +function OnUtsuho01Attack(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end +end + +function OnCreatedUtsuhoRinBuff(keys) + keys.target:AddDamageOutgoingPhysical(keys.damage_up, "thtd_utsuho_rin_damage_up") +end + +function OnDestroyUtsuhoRinBuff(keys) + keys.target:AddDamageOutgoingPhysical("thtd_utsuho_rin_damage_up") +end + +function OnUtsuho02Attack(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if caster.thtd_utsuho_02_attack_count == nil then + caster.thtd_utsuho_02_attack_count = 0 + end + + caster.thtd_utsuho_02_attack_count = caster.thtd_utsuho_02_attack_count + 1 + + if caster.thtd_utsuho_02_attack_count >= keys.max_count then + caster.thtd_utsuho_02_attack_count = 0 + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/utsuho/ability_utsuho03_effect.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + target:EmitSound("Hero_Invoker.ChaosMeteor.Impact") + + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end +end + + +function OnUtsuho03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + keys.ability.ability_utsuho04_point_x = targetPoint.x + keys.ability.ability_utsuho04_point_y = targetPoint.y + keys.ability.ability_utsuho04_point_z = targetPoint.z + local dummy = CreateUnitByName("npc_dummy_unit", + targetPoint, + false, + caster, + caster, + caster:GetTeamNumber() + ) + caster.ability_utsuho_04_dummy = dummy + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/utsuho/ability_utsuho04_effect.vpcf", PATTACH_CUSTOMORIGIN, dummy) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 3, targetPoint) + keys.ability.ability_utsuho04_effect_index = effectIndex +end + +function OnUtsuho03SpellThink(keys) + if GameRules:IsGamePaused() then return end + local caster = EntIndexToHScript(keys.caster_entindex) + local tx = keys.ability.ability_utsuho04_point_x + local ty = keys.ability.ability_utsuho04_point_y + local tz = keys.ability.ability_utsuho04_point_z + local targetPoint = Vector(tx,ty,tz) + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.radius) + + for _,v in pairs(targets) do + local dis = GetDistanceBetweenTwoVec2D(targetPoint,v:GetOrigin()) + local rad = GetRadBetweenTwoVec2D(targetPoint,v:GetOrigin()) + if(dis>=(keys.Gravity/10))then + v:SetAbsOrigin(v:GetOrigin() - keys.Gravity/10 * Vector(math.cos(rad),math.sin(rad),0)) + end + end +end + +function OnUtsuho03SpellRemove(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targets = keys.target_entities + local effectIndex = keys.ability.ability_utsuho04_effect_index + local tx = keys.ability.ability_utsuho04_point_x + local ty = keys.ability.ability_utsuho04_point_y + local tz = keys.ability.ability_utsuho04_point_z + local targetPoint = Vector(tx,ty,tz) + ParticleManager:DestroyParticleSystem(effectIndex,true) + if(caster.ability_utsuho_04_dummy~=nil)then + effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/utsuho/ability_utsuho04_end.vpcf", PATTACH_CUSTOMORIGIN, caster.ability_utsuho_04_dummy) + else + effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/utsuho/ability_utsuho04_end.vpcf", PATTACH_CUSTOMORIGIN, caster) + end + + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint) + ParticleManager:SetParticleControl(effectIndex, 3, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + caster.ability_utsuho_04_dummy:SetContextThink(DoUniqueString("ability_utsuho04_effect_remove"), + function () + if GameRules:IsGamePaused() then return 0.03 end + caster.ability_utsuho_04_dummy:RemoveSelf() + end, + 1.0) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for _,v in pairs(targets) do + FindClearSpaceForUnit(v, v:GetOrigin(), false) + local damage_table = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilitywriggle.lua b/scripts/vscripts/abilities/abilitywriggle.lua new file mode 100755 index 0000000..44d22b3 --- /dev/null +++ b/scripts/vscripts/abilities/abilitywriggle.lua @@ -0,0 +1,67 @@ +function OnSpellStartWriggle02(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local vecForward = caster:GetForwardVector() + local targetPoint = keys.target_points[1] + Vector(0, 0, 200) + local range = keys.range + local max_count = keys.max_count + + local effectIndex1 = ParticleManager:CreateParticle("particles/units/heroes/hero_keeper_of_the_light/keeper_dazzling.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex1, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex1, 1, Vector(range, 1, 1)) + local effectIndex2 = nil + local count = 1 + local startTime = GameRules:GetGameTime() + caster:SetContextThink(DoUniqueString("thtd_wriggle_02"), + function () + if GameRules:IsGamePaused() then return 0.03 end + if count/3 > max_count or THTD_IsValid(caster) == false then + ParticleManager:DestroyParticleSystem(effectIndex1,true) + if effectIndex2 ~= nil then ParticleManager:DestroyParticleSystem(effectIndex2,true) end + -- print("---- duration time : ", GameRules:GetGameTime() - startTime) + return nil + end + if count%3 == 1 then + effectIndex2 = ParticleManager:CreateParticle("particles/units/heroes/hero_keeper_of_the_light/keeper_dazzling_on.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 0, targetPoint) + ParticleManager:SetParticleControl(effectIndex2, 1, Vector(range, 0, 0)) + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,range) + for k,v in pairs(targets) do + if v.thtd_is_fearing ~= true then + v.thtd_is_fearing = true + + local current_next_move_point = v.next_move_point + v.next_move_point = targetPoint + + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_wriggle02_speed", {}) + + local fearCount = 0.5 * 2 * 10 + -- local startTime = GameRules:GetGameTime() + v:SetContextThink(DoUniqueString("modifier_thtd_wriggle_02"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if not IsValidAlive(target) then + return nil + end + fearCount = fearCount - 1 + if fearCount <= 0 or THTD_IsValid(caster) == false then + target.next_move_point = current_next_move_point + target.thtd_is_fearing = false + return nil + end + return 0.1 + end, + 0) + end + end + elseif count%3 == 0 then + ParticleManager:DestroyParticleSystem(effectIndex2,true) + effectIndex2 = nil + end + count = count + 1 + return 0.5 + end, + 0) + +end diff --git a/scripts/vscripts/abilities/abilityyoshika.lua b/scripts/vscripts/abilities/abilityyoshika.lua new file mode 100755 index 0000000..7bd5eed --- /dev/null +++ b/scripts/vscripts/abilities/abilityyoshika.lua @@ -0,0 +1,75 @@ +function OnYoshika01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yoshika/ability_yoshika_01.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local debuff_count = 1 + if caster:HasModifier("modifier_miko_02_buff") and caster.thtd_miko_buff_yoshika ~= nil then + debuff_count = 1 + caster.thtd_miko_buff_yoshika + end + + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + for k,v in pairs(targets) do + local time = keys.duration_time + v:AddPoison(debuff_count, caster) + v:SetContextThink(DoUniqueString("thtd_yoshika01_debuff"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if THTD_IsValid(v) == false then return nil end + if time <= 0 then + v:AddPoison(-debuff_count) + return nil + end + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * 0.5, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + time = time - 0.5 + return 0.5 + end, + 0) + + local modifier = v:FindModifierByName("modifier_yoshika_01_slow") + if modifier == nil then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_yoshika_01_slow", nil) + else + modifier:SetDuration(keys.duration_time,false) + end + end +end + +function OnYoshika02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local inners = THTD_FindUnitsInner(caster) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(inners) do + if THTD_IsValid(v) then + local count = v:GetPoisonCount() + if count > 0 then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yoshika/ability_yoshika_02.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage * count, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityyoumu.lua b/scripts/vscripts/abilities/abilityyoumu.lua new file mode 100755 index 0000000..5c18f74 --- /dev/null +++ b/scripts/vscripts/abilities/abilityyoumu.lua @@ -0,0 +1,179 @@ +function OnYoumu01AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if keys.ability:GetLevel() < 1 then return end + + if caster.thtd_youmu_01_attack_count == nil then + caster.thtd_youmu_01_attack_count = 0 + end + + local powerChance = 0 + local pv = caster:GetAbilityPowerValue("thtd_youmu_02") + if pv ~= nil then + powerChance = pv[1] + end + + caster:GiveMana(1) + + caster.thtd_youmu_01_attack_count = caster.thtd_youmu_01_attack_count + 1 + + if caster.thtd_youmu_01_attack_count >= keys.max_count then + caster.thtd_youmu_01_attack_count = 0 + caster:EmitSound("Hero_Magnataur.ShockWave.Particle") + + local targetPoint = caster:GetOrigin() + caster:GetForwardVector() * keys.length + Youmu01Damage(keys,targetPoint,caster:GetOrigin()) + + if RollPercentage(caster:GetAbilityValue("thtd_youmu_02", "chance") + powerChance) then + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/youmu/youmu_01_blink_effect.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:SetParticleControlForward(effectIndex, 0 , target:GetForwardVector()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + targetPoint = target:GetOrigin() - target:GetForwardVector() * keys.length + Youmu01Damage(keys,targetPoint,target:GetOrigin()) + end + end +end + +function Youmu01Damage(keys,targetPoint,vecCaster) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + if caster:IsPower666() then damage = damage * 3 end + + local targets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster:GetOrigin(), + targetPoint, + nil, + 360, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/youmu/youmu_01_blink_effect_a.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_youmu/ability_youmu_01_laser.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, vecCaster+Vector(0,0,32)) + ParticleManager:SetParticleControl(effectIndex, 1, targetPoint+Vector(0,0,32)) + ParticleManager:SetParticleControl(effectIndex, 9, vecCaster+Vector(0,0,32)) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnYoumu03Damage(keys,targetPoint,vecCaster) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/youmu/youmu_04_circle.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local rad = 210*math.pi/180 + + local count = 0 + + caster:EmitSound("Sound_THTD.thtd_youmu_01") + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_youmu_03") + if pv ~= nil then + powerDamage = pv[1] + end + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + powerDamage * caster:THTD_GetStarDamage() + if caster:IsPower666() then damage = damage * 3 end + if caster:IsPower999() then damage = damage * 4 end + + caster:SetContextThink(DoUniqueString("thtd_youmu_03_spell_start"), + function() + if GameRules:IsGamePaused() then return 0.03 end + rad = rad + 210*math.pi/180 + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/youmu/youmu_04_sword_effect.vpcf", PATTACH_CUSTOMORIGIN, caster) + local effect2VecForward = Vector(targetPoint.x+math.cos(rad)*500,targetPoint.y+math.sin(rad)*500,vecCaster.z) + ParticleManager:SetParticleControl(effectIndex, 0, vecCaster) + ParticleManager:SetParticleControl(effectIndex, 1, effect2VecForward) + ParticleManager:DestroyParticleSystem(effectIndex,false) + vecCaster = effect2VecForward + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,550) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + if count%5 == 0 then + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/youmu/youmu_02_effect_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex2,false) + end + end + + if count > 20 then return nil end + count = count + 1 + return 0.12 + end, + 0) +end + +function OnYoumu03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local targetPoint = keys.target_points[1] + + if caster.thtd_youmu_03_power_bonus == nil then + local attack = caster:THTD_GetBaseAttack() + local bonus = attack + caster:THTD_AddBasePower(bonus) + caster.thtd_youmu_03_power_bonus = bonus + caster:THTD_AddBaseAttack(-attack) + caster.thtd_kagerou_02_attack_bonus = attack + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + caster:THTD_AddBasePower(-caster.thtd_youmu_03_power_bonus) + caster.thtd_youmu_03_power_bonus = nil + caster:THTD_AddBaseAttack(caster.thtd_kagerou_02_attack_bonus) + caster.thtd_kagerou_02_attack_bonus = nil + return nil + end, + 2.5) + end + + OnYoumu03Damage(keys,targetPoint,vecCaster) + + local powerChance = 0 + local pv = caster:GetAbilityPowerValue("thtd_youmu_02") + if pv ~= nil then + powerChance = pv[1] + end + + if RollPercentage(caster:GetAbilityValue("thtd_youmu_02", "chance") + powerChance) then + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/youmu/youmu_01_blink_effect.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin() + RandomVector(300)) + ParticleManager:SetParticleControlForward(effectIndex, 0 , caster:GetForwardVector()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + targetPoint = targetPoint + RandomVector(150) + OnYoumu03Damage(keys,targetPoint,vecCaster) + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityyukari.lua b/scripts/vscripts/abilities/abilityyukari.lua new file mode 100755 index 0000000..9468041 --- /dev/null +++ b/scripts/vscripts/abilities/abilityyukari.lua @@ -0,0 +1,744 @@ +-- 代替触发器 +local UnitMoveRect = { + [0] = { + [1] = { + ["center"] = {-2200, 1550}, + ["radius"] = 200, + ["tag"] = {2} + }, + [2] = { + ["center"] = {-4100, 1600}, + ["radius"] = 100, + ["tag"] = {3} + }, + [3] = { + ["center"] = {-4100, 4120}, + ["radius"] = 100, + ["tag"] = {4} + }, + [4] = { + ["center"] = {6750, 4120}, + ["radius"] = 100, + ["tag"] = {5} + }, + [5] = { + ["center"] = {6750, -4120}, + ["radius"] = 100, + ["tag"] = {6} + }, + [6] = { + ["center"] = {-6750, -4120}, + ["radius"] = 100, + ["tag"] = {7} + }, + [7] = { + ["center"] = {-6750, 4120}, + ["radius"] = 100, + ["tag"] = {4} + }, + }, + [1] = { + [1] = { + ["center"] = {2200, 1550}, + ["radius"] = 200, + ["tag"] = {2} + }, + [2] = { + ["center"] = {4100, 1600}, + ["radius"] = 100, + ["tag"] = {3} + }, + [3] = { + ["center"] = {4100, 4120}, + ["radius"] = 100, + ["tag"] = {4} + }, + [4] = { + ["center"] = {6750, 4120}, + ["radius"] = 100, + ["tag"] = {5} + }, + [5] = { + ["center"] = {6750, -4120}, + ["radius"] = 100, + ["tag"] = {6} + }, + [6] = { + ["center"] = {-6750, -4120}, + ["radius"] = 100, + ["tag"] = {7} + }, + [7] = { + ["center"] = {-6750, 4120}, + ["radius"] = 100, + ["tag"] = {4} + }, + }, + [2] = { + [1] = { + ["center"] = {2200, -1550}, + ["radius"] = 200, + ["tag"] = {2} + }, + [2] = { + ["center"] = {4100, -1600}, + ["radius"] = 100, + ["tag"] = {3} + }, + [3] = { + ["center"] = {4100, -4120}, + ["radius"] = 100, + ["tag"] = {6} + }, + [4] = { + ["center"] = {6750, 4120}, + ["radius"] = 100, + ["tag"] = {5} + }, + [5] = { + ["center"] = {6750, -4120}, + ["radius"] = 100, + ["tag"] = {6} + }, + [6] = { + ["center"] = {-6750, -4120}, + ["radius"] = 100, + ["tag"] = {7} + }, + [7] = { + ["center"] = {-6750, 4120}, + ["radius"] = 100, + ["tag"] = {4} + }, + }, + [3] = { + [1] = { + ["center"] = {-2200, -1550}, + ["radius"] = 200, + ["tag"] = {2} + }, + [2] = { + ["center"] = {-4100, -1600}, + ["radius"] = 100, + ["tag"] = {3} + }, + [3] = { + ["center"] = {-4100, -4120}, + ["radius"] = 100, + ["tag"] = {6} + }, + [4] = { + ["center"] = {6750, 4120}, + ["radius"] = 100, + ["tag"] = {5} + }, + [5] = { + ["center"] = {6750, -4120}, + ["radius"] = 100, + ["tag"] = {6} + }, + [6] = { + ["center"] = {-6750, -4120}, + ["radius"] = 100, + ["tag"] = {7} + }, + [7] = { + ["center"] = {-6750, 4120}, + ["radius"] = 100, + ["tag"] = {4} + }, + } +} + +function OnYukari01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if target.thtd_player_index ~= caster:GetPlayerOwnerID() then return end + + local powerBonus = target:GetBaseDamageMax() + if powerBonus > 0 then + caster:THTD_AddBasePower(powerBonus) + target:SetBaseDamageMax(0) + target:SetBaseDamageMin(0) + caster:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + caster:THTD_AddBasePower(-powerBonus) + if THTD_IsValid(target) then + target:SetBaseDamageMax(powerBonus) + target:SetBaseDamageMin(powerBonus) + end + return nil + end, + keys.duration_time) + end + + if caster.thtd_yukari_01_hidden_table == nil then + caster.thtd_yukari_01_hidden_table = {} + end + + if target.thtd_yukari_01_hidden_count == nil then + target.thtd_yukari_01_hidden_count = 0 + end + + if #caster.thtd_yukari_01_hidden_table < keys.max_count and target.thtd_yukari_01_hidden_count < keys.limit_count then + keys.ability:ApplyDataDrivenModifier(caster, target, "modifier_yukari_01_hidden", nil) + target:AddNoDraw() + target.thtd_is_yukari_01_hidden = true + target.thtd_yukari_01_hidden_count = target.thtd_yukari_01_hidden_count + 1 + table.insert(caster.thtd_yukari_01_hidden_table,target) + + target:SetContextThink(DoUniqueString("thtd_yukari_01_death"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if caster==nil or caster:IsNull() or caster:IsAlive() == false then + target:RemoveNoDraw() + target:RemoveModifierByName("modifier_yukari_01_hidden") + target.thtd_is_yukari_01_hidden = false + return nil + end + return 1.0 + end, + 1.0) + end + + local unit = CreateUnitByName( + "npc_thdots_unit_yukari01_unit" + ,target:GetOrigin() + ,false + ,caster + ,caster + ,caster:GetTeam() + ) + local ability_dummy_unit = unit:FindAbilityByName("ability_dummy_unit") + ability_dummy_unit:SetLevel(1) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/yukari/ability_yukari_02_vortex_2.vpcf", PATTACH_CUSTOMORIGIN, unit) + ParticleManager:SetParticleControl(effectIndex, 0, unit:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + unit:EmitSound("Hero_ObsidianDestroyer.AstralImprisonment") + + unit:SetContextThink(DoUniqueString("thtd_yukari_01_release"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if unit:IsAlive() then + unit:ForceKill(false) + return 0.5 + else + unit:AddNoDraw() + return nil + end + end, + 1.0) +end + +function OnYukari02SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster.thtd_yukari_01_hidden_table == nil then + caster.thtd_yukari_01_hidden_table = {} + end + + if #caster.thtd_yukari_01_hidden_table > 0 then + for k,v in pairs(caster.thtd_yukari_01_hidden_table) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + OnYukari02SpellDropUnit(keys,v) + table.remove(caster.thtd_yukari_01_hidden_table,k) + break + else + table.remove(caster.thtd_yukari_01_hidden_table,k) + end + end + end +end + +function OnYukari02SpellDropUnit(keys,unit) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + local g = -5 + local high = 500 + local v = 0 + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local currentOrigin = targetPoint + Vector(0,0,high) + local minHigh = caster:GetOrigin().z + local isRemove = false + + unit:SetAbsOrigin(currentOrigin) + unit.thtd_is_yukari_01_hidden = false + if GetDistanceBetweenTwoVec2D(unit.next_move_point, targetPoint) > 2500 then + unit.next_move_point = unit.first_move_point + unit.next_move_forward = unit.first_move_forward + unit.thtd_next_corner = unit.thtd_first_corner + unit.thtd_is_outer = nil + table.insert(THTD_EntitiesRectInner[unit.thtd_player_index],unit) + for k,target in pairs(THTD_EntitiesRectOuter) do + if target == unit then + table.remove(THTD_EntitiesRectOuter,k) + break + end + end + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/yukari/ability_yukari_02_body.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 3, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + EmitSoundOnLocationWithCaster(currentOrigin,"Hero_ObsidianDestroyer.AstralImprisonment.End",caster) + + caster:SetContextThink(DoUniqueString("ability_yuuka_02"), + function() + if GameRules:IsGamePaused() then return 0.03 end + v = v + g + currentOrigin = currentOrigin + Vector(0,0,v) + if unit~=nil and unit:IsNull()==false and unit:IsAlive() then + if GetDistanceBetweenTwoVec2D(unit:GetOrigin(),currentOrigin) < 100 and isRemove == false then + unit:RemoveNoDraw() + isRemove = true + end + unit:SetAbsOrigin(currentOrigin) + end + + if currentOrigin.z >= minHigh then + return 0.02 + else + local effectIndex = ParticleManager:CreateParticle("particles/heroes/yukari/ability_yukari_02_down.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 3, currentOrigin) + ParticleManager:DestroyParticleSystem(effectIndex,false) + EmitSoundOnLocationWithCaster(currentOrigin,"Ability.TossImpact",caster) + + if unit~=nil and unit:IsNull()==false and unit:IsAlive() then + unit:RemoveModifierByName("modifier_yukari_01_hidden") + FindClearSpaceForUnit(unit, currentOrigin, false) + end + if caster~=nil then + local targets = THTD_FindUnitsInRadius(caster,currentOrigin,keys.range) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + UnitStunTarget(caster,v,keys.stun_time) + end + + end + return nil + end + end, + 0) +end + + +-- 无比丑陋 +function OnYukari03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local targetPoint = keys.target_points[1] + + local e1 = ParticleManager:CreateParticle("particles/heroes/yukari/ability_yukari_04_magical.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(e1, 0, caster:GetOrigin()) + + local e2 = ParticleManager:CreateParticle("particles/heroes/yukari/ability_yukari_04_magical.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(e2, 0, targetPoint) + + caster:EmitSound("Hero_Enigma.BlackHole.Cast.Chasm") + caster:EmitSound("Hero_Enigma.Black_Hole") + + local isFirst = false + + caster:SetContextThink(DoUniqueString("OnYukari03"), + function() + if GameRules:IsGamePaused() then return 0.03 end + ParticleManager:DestroyParticleSystem(e1,true) + ParticleManager:DestroyParticleSystem(e2,true) + + -- 取消所有传送 + -- local targets = + -- FindUnitsInRadius( + -- caster:GetTeamNumber(), + -- caster:GetOrigin(), + -- nil, + -- 2000, + -- keys.ability:GetAbilityTargetTeam(), + -- keys.ability:GetAbilityTargetType(), + -- keys.ability:GetAbilityTargetFlags(), + -- FIND_ANY_ORDER, + -- false + -- ) + local v = caster + -- for k,v in pairs(targets) do + if v:THTD_IsTower() and (v:GetUnitName()=="yukari" or v:GetUnitName()=="ran" or v:GetUnitName()=="chen") then + if v:THTD_IsHidden() == false then + local vecOrigin = v:GetOrigin() + v:SetAbsOrigin(targetPoint) + v:AddNoDraw() + local unit = CreateUnitByName( + "npc_thdots_unit_yukari01_unit" + ,vecOrigin + ,false + ,caster + ,caster + ,caster:GetTeam() + ) + local ability_dummy_unit = unit:FindAbilityByName("ability_dummy_unit") + ability_dummy_unit:SetLevel(1) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/yukari/ability_yukari_02_vortex_2.vpcf", PATTACH_CUSTOMORIGIN, unit) + ParticleManager:SetParticleControl(effectIndex, 0, unit:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + unit:SetContextThink(DoUniqueString("thtd_yukari_01_release"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if unit:IsAlive() then + unit:ForceKill(false) + return 0.5 + else + unit:AddNoDraw() + return nil + end + end, + 1.0) + + v:SetContextThink(DoUniqueString("FindClearSpaceForUnit"), + function() + if GetDistanceBetweenTwoVec2D(v:GetOrigin(),targetPoint) < 100 then + v:RemoveNoDraw() + FindClearSpaceForUnit(v, targetPoint, false) + v:THTD_DestroyLevelEffect() + v:THTD_CreateLevelEffect() + return nil + end + return 0.03 + end, + 0.03) + + v:SetContextThink(DoUniqueString("thtd_yukari_03_back"), + function() + if isFirst == false then + isFirst = true + local e1 = ParticleManager:CreateParticle("particles/heroes/yukari/ability_yukari_04_magical.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(e1, 0, targetPoint) + ParticleManager:DestroyParticleSystemTime(e1,1.0) + + local e2 = ParticleManager:CreateParticle("particles/heroes/yukari/ability_yukari_04_magical.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(e2, 0, vecCaster) + ParticleManager:DestroyParticleSystemTime(e2,1.0) + + caster:EmitSound("Hero_Enigma.BlackHole.Cast.Chasm") + caster:EmitSound("Hero_Enigma.Black_Hole") + end + v:SetContextThink(DoUniqueString("OnYuuka03SpellEnd"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if v:THTD_IsHidden() == false then + local unit = CreateUnitByName( + "npc_thdots_unit_yukari01_unit" + ,v:GetOrigin() + ,false + ,caster + ,caster + ,caster:GetTeam() + ) + local ability_dummy_unit = unit:FindAbilityByName("ability_dummy_unit") + ability_dummy_unit:SetLevel(1) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/yukari/ability_yukari_02_vortex_2.vpcf", PATTACH_CUSTOMORIGIN, unit) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + v:SetAbsOrigin(vecOrigin) + v:AddNoDraw() + v:EmitSound("Hero_Enigma.Black_Hole.Stop") + caster:StopSound("Hero_Enigma.BlackHole.Cast.Chasm") + caster:StopSound("Hero_Enigma.Black_Hole") + + unit:SetContextThink(DoUniqueString("thtd_yukari_01_release"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if unit:IsAlive() then + unit:ForceKill(false) + return 0.5 + else + unit:AddNoDraw() + return nil + end + end, + 1.0) + + v:SetContextThink(DoUniqueString("FindClearSpaceForUnit"), + function() + if GetDistanceBetweenTwoVec2D(v:GetOrigin(),vecOrigin) < 100 then + v:RemoveNoDraw() + FindClearSpaceForUnit(v, vecOrigin, false) + v:THTD_DestroyLevelEffect() + v:THTD_CreateLevelEffect() + return nil + end + return 0.03 + end, + 0.03) + end + return nil + end, + 1.0) + return nil + end, + 3.0) + end + end + -- end + + caster:StopSound("Hero_Enigma.BlackHole.Cast.Chasm") + caster:StopSound("Hero_Enigma.Black_Hole") + caster:EmitSound("Hero_Enigma.Black_Hole.Stop") + return nil + end, + 1.0) +end + +function OnThinkYukari03(keys) + local caster = keys.caster + + if keys.ability:GetLevel() < 1 then return end + + local targets = THTD_FindUnitsInRadius(caster,caster:GetAbsOrigin(),1500) + if #targets > 0 then + local point = targets[RandomInt(1, #targets)]:GetAbsOrigin() + targets = {} + local effectIndex = ParticleManager:CreateParticle("particles/econ/items/clockwerk/clockwerk_paraflare/clockwerk_para_rocket_flare_parachute.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, point) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(2,0,0)) + ParticleManager:DestroyParticleSystem(effectIndex,false) + -- EmitSoundOnLocationWithCaster(point,"Hero_Rattletrap.Rocket_Flare.Fire",caster) + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + targets = THTD_FindUnitsInRadius(caster,point,keys.range) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + +end + + +local thtd_yukari_04_train_spwan = +{ + [1] = + { + ["spawn"] = Vector(-1408,1056,136) * 1.5 + Vector(500,0,0), + ["firstPoint"] = Vector(-1408,1056,136) * 1.5, + ["firstForward"] = "left", + ["forward"] = Vector(-1,0,0), + }, + [2] = + { + ["spawn"] = Vector(1408,1056,136) * 1.5 + Vector(-500,0,0), + ["firstPoint"] = Vector(1408,1056,136) * 1.5, + ["firstForward"] = "right", + ["forward"] = Vector(1,0,0), + }, + [3] = + { + ["spawn"] = Vector(1408,-1056,136) * 1.5 + Vector(-500,0,0), + ["firstPoint"] = Vector(1408,-1056,136) * 1.5, + ["firstForward"] = "right", + ["forward"] = Vector(-1,0,0), + }, + [4] = + { + ["spawn"] = Vector(-1408,-1056,136) * 1.5 + Vector(500,0,0), + ["firstPoint"] = Vector(-1408,-1056,136) * 1.5, + ["firstForward"] = "left", + ["forward"] = Vector(1,0,0), + }, +} + +function OnYukari04SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + local max_count = keys.max_count + local crit = 1 + (max_count - 1) * keys.damage_up / 100 + local duration_time = math.floor(keys.duration_time * 100 + 0.5) / 100 + local tick = math.floor(keys.tick * 100 + 0.5) / 100 + + local originSpawn = thtd_yukari_04_train_spwan[caster:GetOwner():GetPlayerOwnerID()+1]["spawn"] + local originPoint = thtd_yukari_04_train_spwan[caster:GetOwner():GetPlayerOwnerID()+1]["firstPoint"] + local originForward = thtd_yukari_04_train_spwan[caster:GetOwner():GetPlayerOwnerID()+1]["firstForward"] + local forward = thtd_yukari_04_train_spwan[caster:GetOwner():GetPlayerOwnerID()+1]["forward"] + + caster:EmitSound("Sound_THTD.thtd_yukari_04") + + local train = CreateUnitByName( + "yukari_train", + originSpawn, + false, + caster:GetOwner(), + caster:GetOwner(), + caster:GetTeam() + ) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yukari/ability_yukari_04_door.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, originSpawn-forward*400) + ParticleManager:SetParticleControl(effectIndex, 3, originSpawn-forward*400) + ParticleManager:SetParticleControlForward(effectIndex, 3, forward) + ParticleManager:SetParticleControl(effectIndex, 4, originSpawn-forward*400) + ParticleManager:SetParticleControlForward(effectIndex, 4, forward) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + train:AddNewModifier(train, nil, "modifier_move_max_speed", nil) + train:SetAbsOrigin(originSpawn) + train:SetForwardVector(forward) + train.next_move_point = originPoint + train.firstForward = originForward + train.next_corner_table = {} + train.FirstTrain = nil + + local timecount = math.floor(duration_time / tick) + train:SetContextThink(DoUniqueString("AttackingBase"), + function () + if GameRules:IsGamePaused() then return 0.03 end + if timecount > 0 then + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * crit + local targets = THTD_FindUnitsInRadius(caster,train:GetOrigin(),200) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + UnitStunTarget(caster,v,keys.stun_time) + end + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/yukari/ability_yukari_04_boom.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 3, train:GetOrigin()-train:GetForwardVector()*100) + ParticleManager:DestroyParticleSystem(effectIndex2,false) + timecount = timecount - 1 + train:MoveToPosition(train.next_move_point) + if timecount%10 == 0 then + train:EmitSound("Sound_THTD.thtd_yukari_04.loop") + end + + -- 替代触发器 + -- local id = caster:GetPlayerOwnerID() + -- for k,v in pairs(UnitMoveRect[id]) do + -- if GetDistanceBetweenTwoVec2D(train:GetOrigin(), Vector(v["center"][1],v["center"][2]),0) <= v["radius"] then + -- if train.current_rect_id ~= k then + -- train.current_rect_id = k + -- local tagIndex = v["tag"][RandomInt(1, #v["tag"])] + -- train.next_move_point = Vector(UnitMoveRect[id][tagIndex]["center"][1],UnitMoveRect[id][tagIndex]["center"][2],0) + -- train:MoveToPosition(train.next_move_point) + -- end + -- break + -- end + -- end + + return tick + else + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yukari/ability_yukari_04_door.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, train:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 3, train:GetOrigin()) + ParticleManager:SetParticleControlForward(effectIndex, 3, train:GetForwardVector()) + ParticleManager:SetParticleControl(effectIndex, 4, train:GetOrigin()) + ParticleManager:SetParticleControlForward(effectIndex, 4, train:GetForwardVector()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + train:ForceKill(true) + train:AddNoDraw() + return nil + end + end, + 0) + + local count = max_count - 1 + caster:SetContextThink(DoUniqueString("OnYukari04SpellStart"), + function() + local nexttrain = CreateUnitByName( + "yukari_train", + originSpawn, + false, + caster:GetOwner(), + caster:GetOwner(), + caster:GetTeam() + ) + + nexttrain:AddNewModifier(nexttrain, nil, "modifier_move_max_speed", nil) + nexttrain:SetAbsOrigin(originSpawn) + nexttrain.next_move_point = originPoint + nexttrain.firstForward = originForward + nexttrain.FirstTrain = train + nexttrain:SetForwardVector(forward) + + local nexttimecount = math.floor(duration_time / tick) + nexttrain:SetContextThink(DoUniqueString("AttackingBase"), + function () + if GameRules:IsGamePaused() then return 0.03 end + if nexttimecount > 0 and nexttrain~=nil and nexttrain:IsNull()==false and nexttrain:IsAlive() then + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * crit + local targets = THTD_FindUnitsInRadius(caster,nexttrain:GetOrigin(),200) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + UnitStunTarget(caster,v,keys.stun_time) + end + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/yukari/ability_yukari_04_boom.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 3, nexttrain:GetOrigin()-nexttrain:GetForwardVector()*100) + ParticleManager:DestroyParticleSystem(effectIndex2,false) + nexttimecount = nexttimecount - 1 + if nexttrain.next_move_point ~= nil then + nexttrain:MoveToPosition(nexttrain.next_move_point) + end + + -- 替代触发器 + -- local id = caster:GetPlayerOwnerID() + -- for k,v in pairs(UnitMoveRect[id]) do + -- if GetDistanceBetweenTwoVec2D(nexttrain:GetOrigin(), Vector(v["center"][1],v["center"][2]),0) <= v["radius"] then + -- if nexttrain.current_rect_id ~= k then + -- nexttrain.current_rect_id = k + -- local tagIndex = v["tag"][RandomInt(1, #v["tag"])] + -- nexttrain.next_move_point = Vector(UnitMoveRect[id][tagIndex]["center"][1],UnitMoveRect[id][tagIndex]["center"][2],0) + -- nexttrain:MoveToPosition(nexttrain.next_move_point) + -- end + -- break + -- end + -- end + + return tick + else + nexttrain:ForceKill(true) + nexttrain:AddNoDraw() + return nil + end + end, + 0) + + if count > 0 then + count = count - 1 + return tick + else + return nil + end + end, + 0) +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityyuugi.lua b/scripts/vscripts/abilities/abilityyuugi.lua new file mode 100755 index 0000000..36665c3 --- /dev/null +++ b/scripts/vscripts/abilities/abilityyuugi.lua @@ -0,0 +1,105 @@ +function OnYuugi01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),caster:Script_GetAttackRange()) + for k,v in pairs(targets) do + local damage_table = { + victim = v, + attacker = caster, + damage = caster:THTD_GetStarDamage()*RandomInt(math.min(keys.power_damage2,math.max(keys.power_damage1,#targets)),keys.power_damage2), + ability = keys.ability, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE, + } + UnitDamageTarget(damage_table) + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuugi/ability_yuugi_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(1000,1000,1000)) + ParticleManager:DestroyParticleSystem(effectIndex,false) +end + +function OnYuugi02AttackLanded(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + if RollPercentage(keys.chance) then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuugi/ability_yuugi_02.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),keys.range) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + for k,v in pairs(targets) do + local damage_table = { + victim = v, + attacker = caster, + damage = damage, + ability = keys.ability, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE, + } + UnitDamageTarget(damage_table) + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_yuugi_02_pause_unit", {Duration = 0.48}) + OnYuugi02KnockBack(v,(v:GetAbsOrigin()-target:GetAbsOrigin()):Normalized()) + end + end +end + +function OnYuugi02KnockBack(target,forward) + local time = 0.48 + target:SetContextThink(DoUniqueString("ability_yuugi_02_knockback"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then + FindClearSpaceForUnit(target, target:GetOrigin(), false) + return nil + end + target:SetAbsOrigin(target:GetOrigin()+forward*10) + time = time - 0.03 + return 0.03 + end, + 0) +end + +function OnYuugi03SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.range) + + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/yugi/yugi_slam.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + for k,v in pairs(targets) do + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_yuugi_03_pause_unit", {Duration = keys.duration_time}) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuggi/ability_yuugi_03.vpcf", PATTACH_CUSTOMORIGIN, v) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystemTime(effectIndex,keys.duration_time) + + local time = keys.duration_time + local vOrigin = v:GetOrigin() + + v:SetContextThink(DoUniqueString("ability_yuugi_03_stop_move"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if time <= 0 then + return nil + end + if not THTD_IsValid(caster) then + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + + if GetDistanceBetweenTwoVec2D(v:GetOrigin(), vOrigin) > 100 then + caster:AbilityKill(v, keys.ability) + return nil + end + + time = time - 0.1 + return 0.1 + end, + 0) + end +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityyuuka.lua b/scripts/vscripts/abilities/abilityyuuka.lua new file mode 100755 index 0000000..3efbe05 --- /dev/null +++ b/scripts/vscripts/abilities/abilityyuuka.lua @@ -0,0 +1,504 @@ +function OnYuuka01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + + if caster.thtd_yuuka_seeds == nil then + caster.thtd_yuuka_seeds = {} + end + + caster:EmitSound("Sound_THTD.thtd_yuuka_01") + + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(), keys.range) + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + + for k,v in pairs(caster.thtd_yuuka_seeds) do + if v~=nil and GetDistanceBetweenTwoVec2D(v, caster:GetOrigin()) <= keys.range then + Yuuka02CreatePlant(keys,v,k) + caster.thtd_yuuka_seeds[k] = nil + end + end + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/ability_yuuka_01.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, vecCaster) + ParticleManager:SetParticleControl(effectIndex, 1, vecCaster) + ParticleManager:SetParticleControl(effectIndex, 2, vecCaster) + ParticleManager:SetParticleControl(effectIndex, 3, vecCaster) + ParticleManager:SetParticleControl(effectIndex, 7, vecCaster) + ParticleManager:DestroyParticleSystemTime(effectIndex,5.0) +end + +function Yuuka02CreatePlant(keys,vec,seed) + local caster = EntIndexToHScript(keys.caster_entindex) + + local flower = CreateUnitByName( + "yuuka_flower", + vec, + false, + caster:GetOwner(), + caster:GetOwner(), + caster:GetTeam() + ) + + ParticleManager:DestroyParticleSystem(seed,true) + + flower.thtd_spawn_unit_owner = caster + flower:SetControllableByPlayer(caster:GetPlayerOwnerID(), true) + keys.ability:ApplyDataDrivenModifier(caster, flower, "modifier_yuuka_02_flower", nil) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/ability_yuuka_01_spawn.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, vec) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/ability_yuuka_01_flower.vpcf", PATTACH_CUSTOMORIGIN, flower) + ParticleManager:SetParticleControlEnt(effectIndex2 , 0, flower, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex2 , 1, flower, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex2 , 2, flower, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(effectIndex2 , 3, flower, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:DestroyParticleSystemTime(effectIndex2,5.0) + + local count = 0 + flower:SetContextThink(DoUniqueString("thtd_yuuka_02_plant"), + function() + local attack = caster:THTD_GetBaseAttack() + flower:SetBaseDamageMax(attack) + flower:SetBaseDamageMin(attack) + flower:InheritOwnerBuff(caster) + if count == 10 then + local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_techies/techies_land_mine_explode.vpcf",PATTACH_CUSTOMORIGIN,caster) + ParticleManager:SetParticleControl(particle,0,flower:GetOrigin()+Vector(0,0,64)) + ParticleManager:DestroyParticleSystem(particle,false) + + local targets = THTD_FindUnitsInRadius(caster,flower:GetAbsOrigin(),keys.radius) + local damage = caster:THTD_GetAbilityPowerDamage(keys.ability) * keys.crit + for k,v in pairs(targets) do + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + elseif count > 10 then + flower:AddNoDraw() + flower:ForceKill(true) + return nil + else + if flower:IsAttacking() == false then + flower:MoveToPositionAggressive(flower:GetOrigin() + flower:GetForwardVector() * 100) + end + end + count = count + 1 + return 0.5 + end, + 0) +end + +function OnIntervalThinkYuuka02(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + if caster:THTD_IsHidden() then return end + + local forward = nil + if IsValidAlive(caster.thtd_yuuka_03_illusion) then + forward = (caster.thtd_yuuka_03_illusion:GetAbsOrigin() - caster:GetAbsOrigin()):Normalized() + else + forward = caster:GetForwardVector() + end + + if caster.thtd_yuuka_seeds == nil then + caster.thtd_yuuka_seeds = {} + end + + local num = RandomInt(0,300) + + local randomVector = caster:GetOrigin() + forward * 300 + RandomVector(num) + Vector(0,0,32) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/ability_yuuka_02_seed.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, randomVector) + + caster.thtd_yuuka_seeds[effectIndex] = randomVector + -- caster:EmitSound("Sound_THTD.thtd_yuuka_02") + + caster:GetOwner():SetContextThink(DoUniqueString("thtd_yuuka_02_seed_release"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if caster~=nil and caster:IsNull()==false and caster:IsAlive() then + caster.thtd_yuuka_seeds[effectIndex] = nil + end + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end, + 10.0) +end + + + +-- 在本体和分身之间创建花田,若花田内有单位死亡,则增加花和花妈的属性 + +function OnSpellStartYuuka03(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + + if caster.thtd_yuuka_03_illusion == nil or caster.thtd_yuuka_03_illusion:IsNull() or caster.thtd_yuuka_03_illusion:IsAlive()==false then + local illusion = CreateUnitByName( + "yuuka_illusion", + targetPoint, + false, + caster:GetOwner(), + caster:GetOwner(), + caster:GetTeam() + ) + caster.thtd_yuuka_03_illusion = illusion + illusion.thtd_yuuka_03_owner = caster + ParticleManager:DestroyParticleSystem(seed,true) + + illusion:SetControllableByPlayer(caster:GetPlayerOwnerID(), true) + keys.ability:ApplyDataDrivenModifier(caster, illusion, "modifier_yuuka_03_illusion", nil) + + local midOrigin = (caster:GetAbsOrigin() + targetPoint)/2 + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/ability_yuuka_03.vpcf", PATTACH_CUSTOMORIGIN, illusion) + ParticleManager:SetParticleControl(effectIndex, 0, midOrigin) + ParticleManager:SetParticleControl(effectIndex, 7, midOrigin) + illusion.effect = effectIndex + + illusion:SetContextThink(DoUniqueString("thtd_yuuka_03_illusion"), + function() + if GameRules:IsGamePaused() then return 0.1 end + illusion:SetBaseDamageMax(caster:THTD_GetAttack()) + illusion:SetBaseDamageMin(caster:THTD_GetAttack()) + illusion:InheritOwnerBuff(caster) + if caster==nil or caster:IsNull() or caster:THTD_IsHidden() or caster:IsAlive()==false then + illusion:AddNoDraw() + illusion:ForceKill(true) + return nil + elseif illusion:IsAttacking() == false and caster:IsChanneling() == false and caster:THTD_IsAggressiveLock()==false then + illusion:MoveToPositionAggressive(illusion:GetOrigin() + illusion:GetForwardVector() * 100) + illusion:THTD_SetAggressiveLock() + end + return 0.5 + end, + 0) + else + local midOrigin = (caster:GetAbsOrigin() + targetPoint)/2 + ParticleManager:SetParticleControl(caster.thtd_yuuka_03_illusion.effect, 0, midOrigin) + ParticleManager:SetParticleControl(caster.thtd_yuuka_03_illusion.effect, 7, midOrigin) + caster.thtd_yuuka_03_illusion:SetAbsOrigin(targetPoint) + FindClearSpaceForUnit(caster.thtd_yuuka_03_illusion, targetPoint, false) + end +end + +function OnThinkYuuka03(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + + if caster.thtd_yuuka_03_illusion ~= nil and caster.thtd_yuuka_03_illusion:IsNull()==false and caster.thtd_yuuka_03_illusion:IsAlive() then + local midOrigin = (caster:GetAbsOrigin() + caster.thtd_yuuka_03_illusion:GetAbsOrigin())/2 + local dis = GetDistanceBetweenTwoEntity(caster,caster.thtd_yuuka_03_illusion) + + local targets = THTD_FindUnitsInRadius(caster,midOrigin,dis/2) + local damage = math.floor(caster:THTD_GetAbilityPowerDamage(keys.ability) * keys.tick) + for k,v in pairs(targets) do + if IsValidAlive(v) then + local modifier = v:FindModifierByName("modifier_thtd_yuuka_03_death") + if modifier ~= nil then + modifier:SetDuration(keys.tick + 0.1, false) + else + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_thtd_yuuka_03_death", {duration = keys.tick + 0.1}) + end + + local DamageTable = { + ability = keys.ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end + end + end +end + +function OnYuuka03Death(keys) + -- local caster = EntIndexToHScript(keys.caster_entindex) + -- local target = keys.unit + + -- if caster == nil or caster:IsNull() or caster:IsAlive() == false then + -- return + -- end + + -- if caster.thtd_yuuka_03_kill_count == nil then + -- caster.thtd_yuuka_03_kill_count = 0 + -- end + + -- if caster.thtd_yuuka_03_kill_count < keys.max_count then + -- caster.thtd_yuuka_03_kill_count = caster.thtd_yuuka_03_kill_count + 1 + -- caster:AddDamageOutgoingAll(keys.damage_up, "thtd_yuuka_03_kill_bonus") + -- caster:THTD_AddBaseAttack(keys.damage_up, "thtd_yuuka_03_kill_bonus") + -- caster:THTD_AddBasePower(keys.damage_up, "thtd_yuuka_03_kill_bonus") + -- end +end + +function OnYuuka04SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = keys.target_points[1] + caster.cool_down_bonus_count = 0 + if caster.ability_dummy_unit~=nil then + caster.ability_dummy_unit:RemoveSelf() + keys.ability.effectcircle = -1 + ParticleManager:DestroyParticleSystem(keys.ability.effectcircle,true) + keys.ability.effectIndex = -1 + ParticleManager:DestroyParticleSystem(keys.ability.effectIndex,true) + keys.ability.effectIndex_b = -1 + ParticleManager:DestroyParticleSystem(keys.ability.effectIndex_b,true) + end + + local owner + if caster.thtd_yuuka_03_owner == nil then + owner = caster + else + owner = caster.thtd_yuuka_03_owner + end + + local unit = CreateUnitByName( + "npc_dota2x_unit_yuuka04_spark" + ,caster:GetOrigin() + ,false + ,caster + ,caster + ,caster:GetTeam() + ) + local ability_dummy_unit = unit:FindAbilityByName("ability_dummy_unit") + ability_dummy_unit:SetLevel(1) + + keys.ability.effectcircle = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/yuuka_04_spark_circle.vpcf", PATTACH_CUSTOMORIGIN, unit) + keys.ability.effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/yuuka_04_spark.vpcf", PATTACH_CUSTOMORIGIN, unit) + keys.ability.effectIndex_b = ParticleManager:CreateParticle("particles/heroes/thtd_yuuka/ability_yuuka_04_spark_wind.vpcf", PATTACH_CUSTOMORIGIN, unit) + keys.ability:SetContextNum("ability_yuuka_04_spark_unit",unit:GetEntityIndex(),0) + + YuukaSparkParticleControl(caster,keys.ability,targetPoint) + keys.ability:SetContextNum("ability_yuuka_04_spark_lock",0,0) + + caster.thtd_Yuuka_04_count = 1 + caster.thtd_Yuuka_04_last_distance = 10 + caster.thtd_Yuuka_04_currentForward = caster:GetForwardVector() + caster.ability_dummy_unit = unit + + if caster.thtd_yuuka_03_illusion ~= nil and caster.thtd_yuuka_03_illusion:IsNull()==false and caster.thtd_yuuka_03_illusion:IsAlive() then + local ability = caster.thtd_yuuka_03_illusion:FindAbilityByName("thtd_yuuka_04") + if ability == nil then + ability = caster.thtd_yuuka_03_illusion:AddAbility("thtd_yuuka_04") + end + if ability:GetLevel() ~= 1 then + ability:SetLevel(1) + end + ability:EndCooldown() + local count = 1 + caster.thtd_yuuka_03_illusion:SetContextThink(DoUniqueString("thtd_yuuka_02_plant"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if count > 50 then return nil end + if not ability:IsCooldownReady() then return nil end + caster.thtd_yuuka_03_illusion:CastAbilityOnPosition(targetPoint,ability,caster:GetPlayerOwnerID()) + count = count + 1 + return 0.1 + end, + 0) + end +end + +function YuukaSparkParticleControl(caster,ability,targetPoint) + local unitIndex = ability:GetContext("ability_yuuka_04_spark_unit") + local unit = EntIndexToHScript(unitIndex) + + if(ability.targetPoint == targetPoint)then + return + else + ability.targetPoint = targetPoint + end + + if(unit == nil or ability.effectIndex == -1 or ability.effectcircle == -1)then + return + end + + forwardRad = GetRadBetweenTwoVec2D(targetPoint,caster:GetOrigin()) + vecForward = Vector(math.cos(math.pi/2 + forwardRad),math.sin(math.pi/2 + forwardRad),0) + unit:SetForwardVector(vecForward) + vecUnit = caster:GetOrigin() + Vector(caster:GetForwardVector().x * 100,caster:GetForwardVector().y * 100,160) + vecColor = Vector(255,255,255) + unit:SetAbsOrigin(vecUnit) + + ParticleManager:SetParticleControl(ability.effectcircle, 0, caster:GetOrigin()) + + local effect2ForwardRad = GetRadBetweenTwoVec2D(caster:GetOrigin(),targetPoint) + local effect2VecForward = Vector(math.cos(effect2ForwardRad)*1400,math.sin(effect2ForwardRad)*1400,0) + caster:GetOrigin() + Vector(caster:GetForwardVector().x * 100,caster:GetForwardVector().y * 100,108) + + ParticleManager:SetParticleControl(ability.effectIndex, 0, caster:GetOrigin() + Vector(caster:GetForwardVector().x * 92,caster:GetForwardVector().y * 92,150)) + ParticleManager:SetParticleControl(ability.effectIndex, 1, effect2VecForward) + ParticleManager:SetParticleControl(ability.effectIndex, 2, vecColor) + local forwardRadwind = forwardRad + math.pi + ParticleManager:SetParticleControl(ability.effectIndex, 8, Vector(math.cos(forwardRadwind),math.sin(forwardRadwind),0)) + ParticleManager:SetParticleControl(ability.effectIndex, 9, caster:GetOrigin() + Vector(caster:GetForwardVector().x * 100,caster:GetForwardVector().y * 100,108)) + + ParticleManager:SetParticleControl(ability.effectIndex_b, 0, caster:GetOrigin() + Vector(caster:GetForwardVector().x * 92,caster:GetForwardVector().y * 92,150)) + ParticleManager:SetParticleControlForward(ability.effectIndex_b, 3, Vector(math.cos(forwardRadwind),math.sin(forwardRadwind),0)) +end + +function OnYuuka04SpellRemove(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local unitIndex = keys.ability:GetContext("ability_yuuka_04_spark_unit") + + local unit = EntIndexToHScript(unitIndex) + if unit~=nil then + unit:RemoveSelf() + keys.ability.effectcircle = -1 + ParticleManager:DestroyParticleSystem(keys.ability.effectcircle,true) + keys.ability.effectIndex = -1 + ParticleManager:DestroyParticleSystem(keys.ability.effectIndex,true) + keys.ability.effectIndex_b = -1 + ParticleManager:DestroyParticleSystem(keys.ability.effectIndex_b,true) + end + keys.ability:SetContextNum("ability_yuuka_04_spark_lock",1,0) + caster:StopSound("Sound_THTD.thtd_yuuka_04") + caster.ability_dummy_unit = nil +end + +function OnYuuka04SpellThink(keys) + if GameRules:IsGamePaused() then return end + if (keys.ability:GetContext("ability_yuuka_04_spark_lock")==1) then + return + end + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local targetPoint = vecCaster + caster:GetForwardVector() + + local nextForward,maxCount = FindYuuka04MaxCountEnemeiesForward(keys) + if nextForward ~= nil then + local forward = GetYuuka04ForwardMove(caster.thtd_Yuuka_04_currentForward,nextForward,caster.thtd_Yuuka_04_count * math.pi/180) + local distance = GetDistanceBetweenTwoVec2D(forward, nextForward) + + if caster.thtd_Yuuka_04_last_distance <= distance then + caster.thtd_Yuuka_04_count = caster.thtd_Yuuka_04_count * - 1 + end + caster.thtd_Yuuka_04_last_distance = distance + + local NowDamageTargets = + FindUnitsInLine( + caster:GetTeamNumber(), + caster:GetOrigin(), + caster:GetOrigin() + keys.DamageLenth * caster.thtd_Yuuka_04_currentForward, + nil, + keys.DamageWidth, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + + local NowCount = 0 + + for k,v in pairs(NowDamageTargets) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + NowCount = NowCount + 1 + end + end + + if distance > math.sin(math.pi/18) and distance < 1.86 and NowCount~=maxCount then + caster:SetForwardVector(forward) + caster.thtd_Yuuka_04_currentForward = forward + end + else + caster:SetForwardVector(caster.thtd_Yuuka_04_currentForward) + end + + local targetPoint = vecCaster + caster.thtd_Yuuka_04_currentForward + + if caster.thtd_effect_count == nil then + caster.thtd_effect_count = 0 + end + + if caster.thtd_effect_count >= 10 then + local attacker = caster + if caster.thtd_yuuka_03_owner~=nil then + attacker = caster.thtd_yuuka_03_owner + end + + local DamageTargets = + FindUnitsInLine( + attacker:GetTeamNumber(), + caster:GetOrigin(), + caster:GetOrigin() + keys.DamageLenth * caster.thtd_Yuuka_04_currentForward, + nil, + keys.DamageWidth, + keys.ability:GetAbilityTargetTeam(), + keys.ability:GetAbilityTargetType(), + keys.ability:GetAbilityTargetFlags() + ) + + if #DamageTargets > 0 then + local damage = attacker:THTD_GetAbilityPowerDamage(keys.ability) / keys.times + for _,v in pairs(DamageTargets) do + local damage_table = { + ability = keys.ability, + victim = v, + attacker = attacker, + damage = damage, + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(damage_table) + end + end + caster.thtd_effect_count = 0 + else + caster.thtd_effect_count = caster.thtd_effect_count + 1 + end + YuukaSparkParticleControl(caster,keys.ability,targetPoint) +end + +function FindYuuka04MaxCountEnemeiesForward(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local forwardVector = caster.thtd_Yuuka_04_currentForward + + local targets = THTD_FindUnitsInRadius(caster,caster:GetOrigin(),keys.DamageLenth) + + if #targets <= 0 then + return nil,0 + end + + local maxCount = 0 + for i=1,120 do + local sparkRad = math.pi * i/60 + local count = 0 + for k,v in pairs(targets) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + if IsRadInRect(v:GetOrigin(),caster:GetOrigin(),keys.DamageWidth,keys.DamageLenth,sparkRad) then + count = count + 1 + end + end + end + if count > maxCount then + forwardVector = Vector(math.cos(sparkRad),math.sin(sparkRad),forwardVector.z) + maxCount = count + end + end + + return forwardVector,maxCount +end + +function GetYuuka04ForwardMove(forward,nextForward,rad) + local forwardVector = Vector(math.cos(rad)*forward.x - math.sin(rad)*forward.y, + forward.y*math.cos(rad) + forward.x*math.sin(rad), + 0) + return forwardVector +end \ No newline at end of file diff --git a/scripts/vscripts/abilities/abilityyuyuko.lua b/scripts/vscripts/abilities/abilityyuyuko.lua new file mode 100755 index 0000000..e83abc7 --- /dev/null +++ b/scripts/vscripts/abilities/abilityyuyuko.lua @@ -0,0 +1,211 @@ +function OnYuyuko01SpellStart(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local casterPoint = caster:GetAbsOrigin() + local range = caster:Script_GetAttackRange() + + local powerChance = 0 + local pv = caster:GetAbilityPowerValue("thtd_yuyuko_02") + if pv ~= nil then + powerChance = pv[1] + end + + caster.thtd_yuyuko_kill_chance = caster:GetAbilityValue("thtd_yuyuko_02", "chance") + powerChance + + caster:EmitSound("Sound_THTD.thtd_yuyuka_01") + + local count = keys.max_count + local tick = keys.tick_time + + if caster:IsPower666() then + count = count + 3 + end + + caster:SetContextThink(DoUniqueString("ability_yuyuko_01_casted"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if not THTD_IsValid(caster) then + return nil + end + if count <= 0 then + return nil + end + + local targets = THTD_FindUnitsInRadius(caster,casterPoint,range) + for k,v in pairs(targets) do + local info = + { + Target = v, + Source = caster, + Ability = keys.ability, + EffectName = "particles/heroes/thtd_yuyuko/ability_yuyuko_01.vpcf", + iMoveSpeed = 750, + vSourceLoc= caster:GetAbsOrigin(), -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, -- Optional + iVisionRadius = 400, -- Optional + iVisionTeamNumber = caster:GetTeamNumber() -- Optional + } + local projectile = ProjectileManager:CreateTrackingProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + end + + count = count - 1 + return tick + end, + 0) +end + +function OnYuyuko01SpellHit(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local target = keys.target + + caster:EmitSound("Hero_Necrolyte.ProjectileImpact") + + if RollPercentage(caster.thtd_yuyuko_kill_chance) then + caster:AbilityKill(target, keys.ability) + else + local DamageTable = { + ability = keys.ability, + victim = target, + attacker = caster, + damage = caster:THTD_GetAbilityPowerDamage(keys.ability), + damage_type = keys.ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + end +end + +function OnSpellStartYuyuko03(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local vecCaster = caster:GetOrigin() + local vecForward = caster:GetForwardVector() + local targetPoint = keys.target_points[1] + caster.thtd_yuyuko_03_target_point = targetPoint + caster.thtd_yuyuko_03_think_count = 0 + + caster:EmitSound("Voice_Thdots_Yuyuko.AbilityYuyuko04") + + local unit = CreateUnitByName( + "npc_dota2x_unit_yuyuko_04" + ,caster:GetOrigin() - vecForward * 100 + ,false + ,caster + ,caster + ,caster:GetTeam() + ) + local ability_dummy_unit = unit:FindAbilityByName("ability_dummy_unit") + ability_dummy_unit:SetLevel(1) + + unit:StartGesture(ACT_DOTA_IDLE) + local forwardRad = GetRadBetweenTwoVec2D(caster:GetOrigin(),unit:GetOrigin()) + unit:SetForwardVector(Vector(math.cos(forwardRad+math.pi/2),math.sin(forwardRad+math.pi/2),0)) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_yuyuko/ability_yuyuko_04.vpcf", PATTACH_CUSTOMORIGIN, unit) + ParticleManager:SetParticleControl(effectIndex, 0, targetPoint) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/yuyuko/ability_yuyuko_04_effect_d.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 0, caster:GetOrigin()) + ParticleManager:DestroyParticleSystemTime(effectIndex2,2.0) + + unit:SetContextThink(DoUniqueString("thtd_yuyuko_03_unit_remove"), + function () + if GameRules:IsGamePaused() then return 0.1 end + unit:RemoveSelf() + return nil + end, + 5.0) + + + local powerChance = 0 + local pv = caster:GetAbilityPowerValue("thtd_yuyuko_02") + if pv ~= nil then + powerChance = pv[1] + end + + caster.thtd_yuyuko_kill_chance = caster:GetAbilityValue("thtd_yuyuko_02", "chance") + powerChance + local ability = caster:FindAbilityByName("thtd_yuyuko_01") + + caster:SetContextThink(DoUniqueString("ability_yuyuko_01_casted"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if not THTD_IsValid(caster) then + return nil + end + if not caster:HasModifier("modifier_yuyuko_03_think") then + return nil + end + + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.damage_radius) + for k,v in pairs(targets) do + local info = + { + Target = v, + Source = caster, + Ability = ability, + EffectName = "particles/heroes/thtd_yuyuko/ability_yuyuko_01.vpcf", + iMoveSpeed = 750, + vSourceLoc= caster:GetAbsOrigin(), -- Optional (HOW) + bDrawsOnMinimap = false, -- Optional + bDodgeable = true, -- Optional + bIsAttack = false, -- Optional + bVisibleToEnemies = true, -- Optional + bReplaceExisting = false, -- Optional + flExpireTime = GameRules:GetGameTime() + 10, -- Optional but recommended + bProvidesVision = true, -- Optional + iVisionRadius = 400, -- Optional + iVisionTeamNumber = caster:GetTeamNumber() -- Optional + } + local projectile = ProjectileManager:CreateTrackingProjectile(info) + ParticleManager:DestroyLinearProjectileSystem(projectile,false) + end + + return 0.25 + end, + 0) +end + +function OnThinkYuyuko03(keys) + local caster = EntIndexToHScript(keys.caster_entindex) + local targetPoint = caster.thtd_yuyuko_03_target_point + + + local powerDamage = 0 + local pv = caster:GetAbilityPowerValue("thtd_yuyuko_03") + if pv ~= nil then + powerDamage = pv[1] + end + + caster.thtd_yuyuko_03_health_kill = keys.health_kill + powerDamage + local targets = THTD_FindUnitsInRadius(caster,targetPoint,keys.damage_radius) + for _,v in pairs(targets) do + if caster.thtd_yuyuko_03_think_count%4 == 0 then + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + + if v.thtd_damage_lock ~= true and v:HasModifier("modifier_yuyuko04_killed") ~= true and v:GetHealthPercent() <= caster.thtd_yuyuko_03_health_kill then + keys.ability:ApplyDataDrivenModifier(caster, v, "modifier_yuyuko04_killed", {}) + + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/yuyuko/ability_yuyuko_04_effect_a.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, v:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 5, v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local effectIndex2 = ParticleManager:CreateParticle("particles/heroes/yuyuko/ability_yuyuko_04_effect_d.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex2, 0, v:GetOrigin()) + ParticleManager:DestroyParticleSystemTime(effectIndex2,2.0) + + caster:AbilityKill(v, keys.ability) + end + end + + caster.thtd_yuyuko_03_think_count = caster.thtd_yuyuko_03_think_count + 1 +end diff --git a/scripts/vscripts/addon_game_mode.lua b/scripts/vscripts/addon_game_mode.lua new file mode 100755 index 0000000..b131065 --- /dev/null +++ b/scripts/vscripts/addon_game_mode.lua @@ -0,0 +1,1939 @@ +if CTHTDGameMode == nil then + CTHTDGameMode = class({}) +end + +require( "util") +require( "common") +-- require( "component/timers") +require( "system/service") +require( "system/spawner") +require( "system/items") +require( "system/tower") +require( "system/damage") +require( "system/custom_event") +require( "system/combo") +require( "system/ai") +require( "trigger/PassCorner") +-- require( "cosmetic_abilities") + +function Precache( context ) + + PrecacheEveryThingFromKV( context ) + + PrecacheResource( "particle", "particles/econ/events/ti6/hero_levelup_ti6_godray.vpcf",context ) + PrecacheResource( "particle", "particles/thtd/msg/thtd_msg_level.vpcf",context ) + PrecacheResource( "particle", "particles/thtd/msg/thtd_msg_star.vpcf",context ) + PrecacheResource( "particle", "particles/thtd/msg/thtd_msg_food.vpcf",context ) + PrecacheResource( "particle", "particles/common/thtd_food_msg.vpcf",context ) + + PrecacheResource( "particle_folder", "particles/portraits", context ) + + PrecacheResource( "particle", "particles/heroes/lily/ability_lily_01_a.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/lily/ability_lily_02.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/thtd_cirno/ability_cirno_02.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/letty/ability_letty_01.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/kogasa/ability_kogasa_01.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/kogasa/ability_kogasa_01_debuff.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/lyrica/ability_lyrica_01.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/lunasa/ability_lunasa_01.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/lunasa/ability_lunasa_buff.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/merlin/ability_merlin_01.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/merlin/ability_merlin_buff.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/rumia/ability_rumia_02_projectile.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/satori/ability_satori_01.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/iku/ability_iku_lightning.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/iku/ability_iku_01_explosion.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/thtd_marisa/ability_marisa_02.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/thtd_marisa/ability_marisa_02_pink.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/thtd_marisa/ability_marisa_02_blue.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/thtd_marisa/ability_marisa_02_normal.vpcf",context ) + PrecacheResource( "particle", "particles/econ/items/earthshaker/egteam_set/hero_earthshaker_egset/earthshaker_echoslam_start_fallback_low_egset.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/tenshi/ability_tenshi_03.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/thtd_patchouli/ability_patchouli_01_agni_shine.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/thtd_patchouli/ability_patchouli_01_bury_in_lake.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/thtd_patchouli/ability_patchouli_01_mercury_poison.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/thtd_reisen/ability_reisen_03.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/thtd_yuyuko/ability_yuyuko_01.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/thtd_yuyuko/ability_yuyuko_04.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/thtd_youmu/ability_youmu_01_laser.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/youmu/youmu_02_effect_explosion.vpcf",context ) + PrecacheResource( "particle", "particles/thd2/heroes/youmu/youmu_01_blink_effect.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/youmu/youmu_04_circle.vpcf",context ) + PrecacheResource( "particle", "particles/thd2/heroes/youmu/youmu_04_sword_effect.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/rin/ability_rin_02_body_c.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/rin/ability_rin_01_projectile.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/rin/ability_rin_01.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/moluo/abiilty_moluo_014.vpcf",context ) + PrecacheResource( "particle", "particles/thd2/heroes/utsuho/ability_utsuho03_effect.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/lyrica/ability_lyrica_music_buff.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/lunasa/ability_lunasa_music_buff.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/merlin/ability_merlin_music_buff.vpcf",context ) + + PrecacheResource( "particle", "particles/heroes/byakuren/ability_byakuren_02.vpcf",context ) + PrecacheResource( "particle", "particles/econ/items/lina/lina_ti6/lina_ti6_laguna_blade.vpcf",context ) + PrecacheResource( "particle", "particles/thd2/items/item_yatagarasu.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/daiyousei/ability_daiyousei_02.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/cirno/ability_cirno_02.vpcf",context ) + + PrecacheResource( "particle", "particles/heroes/yumemi/ability_yumemi_04_exolosion.vpcf",context ) + PrecacheResource( "particle", "particles/thd2/items/item_donation_box.vpcf",context ) + PrecacheResource( "particle", "particles/thtd_item/ability_item_2022.vpcf",context ) + + PrecacheResource( "particle", "particles/thtd/emoji/thtd_msg_hongliange.vpcf",context ) + PrecacheResource( "particle", "particles/thd2/environment/death/act_hero_die.vpcf",context ) + + -- bosses + PrecacheResource( "particle", "particles/heroes/minoriko/ability_minoriko_04.vpcf",context ) + PrecacheResource( "particle", "particles/bosses/thtd_keine/ability_bosses_keine.vpcf",context ) + PrecacheResource( "particle", "particles/thd2/heroes/rumia/ability_rumia01_effect.vpcf",context ) + PrecacheResource( "particle", "particles/heroes/marisa/marisa_01_rocket_a.vpcf",context ) + + -- 装饰技能 + PrecacheResource( "particle", "particles/econ/events/new_bloom/pig_cast.vpcf",context ) + PrecacheResource( "particle", "particles/econ/events/new_bloom/lion_dance_eyes_group.vpcf",context ) + PrecacheResource( "particle", "particles/econ/events/ti9/ti9_drums_musicnotes.vpcf",context ) + PrecacheResource( "particle", "particles/econ/events/snowball/snowball_projectile.vpcf",context ) + PrecacheResource( "particle", "particles/econ/events/snowman/snowman_projectile_explosion_c.vpcf",context ) + + PrecacheResource( "particle", "particles/imagine_assets/courier_fx/courier_fx_2.vpcf",context ) + PrecacheResource( "particle", "particles/particles/imagine_assets/courier_fx/rainbow_tail.vpcf",context ) + + PrecacheResource( "particle", "particles/econ/items/monkey_king/mk_ti9_immortal/mk_ti9_immortal_army_ring.vpcf",context ) + PrecacheResource( "particle", "particles/units/heroes/hero_omniknight/omniknight_purification.vpcf",context ) + + PrecacheResource( "particle", "particles/econ/events/ti10/attack_modifier_ti10.vpcf",context ) + + PrecacheResource( "particle", "particles/units/heroes/hero_monkey_king/monkey_king_quad_tap_stack.vpcf",context ) + + -- sounds + PrecacheResource( "soundfile", "soundevents/game_sounds_custom.vsndevts", context) + PrecacheResource( "soundfile", "soundevents/custom_game/ui.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/custom_game/store.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds/thdots_tower_sound_voice.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/game_sounds/thdots_tower_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_alice_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_aya_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_cirno_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_flandre_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_iku_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_kaguya_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_kanako_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_koishi_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_marisa_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_minamitsu_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_momiji_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_nue_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_ran_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_reimu_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_reisen_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_remilia_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_sakuya_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_shikieiki_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_tenshi_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_utsuho_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_youmu_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_yukari_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_yumemi_sounds.vsndevts", context ) + PrecacheResource( "soundfile", "soundevents/thdots_hero_sounds/thdots_yuyuko_sounds.vsndevts", context ) + + -- 信使 + local mxx={ + --以前的模型和特效 + "particles/units/heroes/hero_templar_assassin/templar_assassin_base_attack.vpcf", + "particles/dev/library/base_dust_hit_smoke.vpcf", + "particles/econ/events/fall_major_2016/teleport_start_fm06_lvl3.vpcf", + "soundevents/soundevents_dota_ui.vsndevts", + "particles/econ/events/snowball/snowball_projectile.vpcf", + "particles/units/heroes/hero_venomancer/venomancer_base_attack.vpcf", + "particles/neutral_fx/gnoll_poison_debuff.vpcf", + "particles/units/heroes/hero_crystalmaiden/maiden_frostbite_buff.vpcf", + "models/items/courier/teron/teron_flying.vmdl", + "soundevents/game_sounds_heroes/game_sounds_omniknight.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_zuus.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_lina.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_keeper_of_the_light.vsndevts", + "particles/econ/items/zeus/arcana_chariot/zeus_arcana_thundergods_wrath_start.vpcf", + "particles/econ/items/omniknight/hammer_ti6_immortal/omniknight_pu_ti6_heal_hammers.vpcf", + "particles/econ/items/lina/lina_ti6/lina_ti6_laguna_blade.vpcf", + "particles/units/heroes/hero_disruptor/disruptor_thunder_strike_bolt.vpcf", + "particles/units/heroes/hero_keeper_of_the_light/keeper_chakra_magic.vpcf", + "particles/units/heroes/hero_oracle/oracle_fatesedict.vpcf", + "particles/econ/events/winter_major_2017/blink_dagger_end_wm07.vpcf", + "soundevents/game_sounds_heroes/game_sounds_antimage.vsndevts", + "particles/units/heroes/hero_lina/lina_spell_light_strike_array.vpcf", + "soundevents/game_sounds_heroes/game_sounds_tidehunter.vsndevts", + "particles/units/heroes/hero_dazzle/dazzle_shallow_grave.vpcf", + "particles/econ/items/axe/axe_cinder/axe_cinder_battle_hunger.vpcf", + "particles/units/heroes/hero_rubick/rubick_spell_steal.vpcf", + "models/items/courier/duskie/duskie.vmdl", + "particles/units/heroes/hero_lone_druid/lone_druid_bear_entangle_body.vpcf", + "soundevents/game_sounds_heroes/game_sounds_lone_druid.vsndevts", + "particles/items2_fx/tranquil_boots_healing.vpcf", + "particles/units/heroes/hero_beastmaster/beastmaster_primal_roar.vpcf", + "particles/units/heroes/hero_spirit_breaker/spirit_breaker_nether_strike_end.vpcf", + "particles/units/heroes/hero_batrider/batrider_base_attack.vpcf", + "particles/items_fx/healing_flask_c.vpcf", + "particles/units/heroes/hero_skeletonking/wraith_king_spirits.vpcf", + "particles/units/heroes/hero_phoenix/phoenix_supernova_scepter_f.vpcf", + "particles/radiant_fx/good_barracks_ranged001_lvl3_disintegrate.vpcf", + "soundevents/game_sounds_heroes/game_sounds_vengefulspirit.vsndevts", + "particles/units/heroes/hero_tinker/tinker_missile.vpcf", + + "soundevents/game_sounds_heroes/game_sounds_tinker.vsndevts", + "particles/units/heroes/hero_visage/visage_grave_chill_skel.vpcf", + "soundevents/game_sounds_heroes/game_sounds_invoker.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_rattletrap.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_sniper.vsndevts", + "particles/econ/items/rubick/rubick_puppet_master/rubick_back_puppet_ambient_edge_c.vpcf", + "particles/newplayer_fx/npx_sleeping.vpcf", + "particles/generic_gameplay/generic_stunned_old.vpcf", + "particles/econ/items/enchantress/enchantress_virgas/ench_impetus_virgas.vpcf", + "particles/econ/items/alchemist/alchemist_smooth_criminal/alchemist_smooth_criminal_unstable_concoction_projectile_explosion_fire.vpcf", + "soundevents/game_sounds_heroes/game_sounds_phoenix.vsndevts", + "particles/econ/items/shadow_fiend/sf_fire_arcana/sf_fire_arcana_shadowraze_char.vpcf", + "particles/units/heroes/hero_tiny/tiny_loadout.vpcf", + "soundevents/game_sounds_heroes/game_sounds_tiny.vsndevts", + "models/props_structures/tower_good.vmdl", + "models/props_structures/tower_bad.vmdl", + "particles/econ/items/sniper/sniper_immortal_cape/sniper_immortal_cape_headshot_slow_model.vpcf", + "particles/customgames/capturepoints/cp_allied_wind.vpcf", + "particles/customgames/capturepoints/cp_wood.vpcf", + "models/items/courier/hermit_crab/hermit_crab.vmdl", + "particles/econ/events/ti7/teleport_end_ti7_team1836806.vpcf", + "particles/econ/items/sniper/sniper_immortal_cape/sniper_immortal_cape_headshot_slow_ring.vpcf", + "particles/econ/items/clinkz/clinkz_maraxiform/clinkz_maraxiform_searing_arrow.vpcf", + "soundevents/game_sounds_heroes/game_sounds_dazzle.vsndevts", + "particles/addons_gameplay/tower_good_tintable_lamp_end.vpcf", + "particles/econ/events/ti7/teleport_end_ti7_model.vpcf", + "particles/units/heroes/hero_shredder/shredder_whirling_death_spin_blades.vpcf", + "soundevents/game_sounds_heroes/game_sounds_shredder.vsndevts", + "particles/units/heroes/hero_lina/lina_base_attack.vpcf", + "particles/units/heroes/hero_razor/razor_static_link_projectile_a.vpcf", + "soundevents/game_sounds_heroes/game_sounds_beastmaster.vsndevts", + "particles/econ/items/crystal_maiden/ti7_immortal_shoulder/cm_ti7_immortal_frostbite.vpcf", + "soundevents/game_sounds_heroes/game_sounds_crystalmaiden.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_earthshaker.vsndevts", + "particles/econ/items/earthshaker/earthshaker_totem_ti6/earthshaker_totem_ti6_leap_impact.vpcf", + "particles/units/heroes/hero_stormspirit/stormspirit_overload_discharge.vpcf", + "particles/units/heroes/hero_sven/sven_spell_gods_strength_small.vpcf", + "particles/units/heroes/hero_sven/sven_spell_gods_strength.vpcf", + "soundevents/game_sounds_heroes/game_sounds_bloodseeker.vsndevts", + "particles/econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodbath_eztzhok_ribbon.vpcf", + "particles/econ/items/slardar/slardar_takoyaki_gold/slardar_crush_tako_ground_dust_pyro_gold.vpcf", + "soundevents/game_sounds_heroes/game_sounds_death_prophet.vsndevts", + "particles/dac/explode/land_mine_explode.vpcf", + "particles/units/heroes/hero_dragon_knight/dragon_knight_transform_blue_smoke04.vpcf", + "particles/econ/items/antimage/antimage_weapon_basher_ti5_gold/antimage_manavoid_explode_b_b_ti_5_gold.vpcf", + "particles/dac/zhayaotong/zhayaotong.vpcf", + "soundevents/game_sounds_heroes/game_sounds_silencer.vsndevts", + "particles/econ/items/bounty_hunter/bounty_hunter_hunters_hoard/bounty_hunter_hoard_shield_mark.vpcf", + "particles/dac/ansha/loadout.vpcf", + "particles/dac/jingzhixianjingplant_ground_disturb.vpcf", + "soundevents/game_sounds_heroes/game_sounds_techies.vsndevts", + "particles/generic_gameplay/generic_stunned.vpcf", + "particles/units/heroes/hero_techies/techies_stasis_trap_explode.vpcf", + + + "particles/econ/items/ancient_apparition/aa_blast_ti_5/ancient_apparition_ice_blast_sphere_final_explosion_smoke_ti5.vpcf", + "models/items/wards/eye_of_avernus_ward/eye_of_avernus_ward.vmdl", + "models/props_structures/dire_ancient_base001_destruction.vmdl", + "models/props_structures/radiant_ancient001_rock_destruction.vmdl", + "models/creeps/lane_creeps/creep_radiant_melee/radiant_melee.vmdl", + "models/creeps/lane_creeps/creep_bad_melee/creep_bad_melee.vmdl", + "models/props_structures/radiant_ranged_barracks001.vmdl", + "models/props_structures/dire_barracks_ranged001.vmdl", + "models/props_structures/radiant_ancient001.vmdl", + "models/props_structures/dire_ancient_base001.vmdl", + "models/props_structures/dire_barracks_ranged001_destruction.vmdl", + "models/props_structures/radiant_ranged_barracks001_destruction.vmdl", + "effects/damage.vpcf", + "effects/damage2.vpcf", + "effects/damage3.vpcf", + "particles/ui/ui_game_start_hero_spawn.vpcf", + "particles/base_attacks/ranged_tower_bad_trail.vpcf", + "particles/units/heroes/hero_warlock/warlock_fatal_bonds_base.vpcf", + "particles/units/heroes/hero_tinker/tinker_laser.vpcf", + "particles/units/heroes/hero_ursa/ursa_fury_swipes_debuff.vpcf", + "soundevents/voscripts/game_sounds_vo_wisp.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_wisp.vsndevts", + + "soundevents/voscripts/game_sounds_vo_lina.vsndevts", + "particles/econ/items/puck/puck_alliance_set/puck_dreamcoil_waves_aproset.vpcf", + "particles/econ/items/drow/drow_ti6/drow_ti6_silence_wave_ground_smoke.vpcf", + "materials/pumpkin.vmdl", + "models/props_gameplay/boots_of_speed.vmdl", + "models/props_gameplay/quelling_blade.vmdl", + "models/props_gameplay/stout_shield.vmdl", + "models/props_gameplay/tango.vmdl", + "models/props_gameplay/smoke.vmdl", + "models/props_gameplay/halloween_candy.vmdl", + "models/props_gameplay/salve_red.vmdl", + "models/props_gameplay/mango.vmdl", + "models/props_gameplay/branch.vmdl", + "particles/gem/sniper_crosshair.vpcf", + "particles/radiant_fx/tower_good3_dest_beam.vpcf", + "particles/units/heroes/hero_witchdoctor/witchdoctor_maledict_dot.vpcf", + "soundevents/voscripts/game_sounds_vo_shredder.vsndevts", + "soundevents/voscripts/game_sounds_vo_rattletrap.vsndevts", + "soundevents/voscripts/game_sounds_vo_dragon_knight.vsndevts", + "soundevents/voscripts/game_sounds_vo_death_prophet.vsndevts", + "soundevents/voscripts/game_sounds_vo_tinker.vsndevts", + "soundevents/voscripts/game_sounds_vo_lycan.vsndevts", + "soundevents/voscripts/game_sounds_vo_ursa.vsndevts", + "soundevents/voscripts/game_sounds_vo_enchantress.vsndevts", + "soundevents/voscripts/game_sounds_vo_techies.vsndevts", + "soundevents/voscripts/game_sounds_vo_tiny.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_shadowshaman.vsndevts", + "soundevents/game_sounds.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_lion.vsndevts", + "soundevents/voscripts/game_sounds_vo_stormspirit.vsndevts", + "soundevents/game_sounds_roshan_halloween.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_lone_druid.vsndevts", + "soundevents/voscripts/game_sounds_vo_doom_bringer.vsndevts", + "soundevents/voscripts/game_sounds_vo_nyx_assassin.vsndevts", + "particles/dev/library/base_dust_hit.vpcf", + "particles/econ/events/fall_major_2016/radiant_fountain_regen_fm06_lvl3_ring.vpcf", + + --新的模型和特效 + "soundevents/game_sounds_heroes/game_sounds_lion.vsndevts", + "particles/units/heroes/hero_shadowshaman/shadowshaman_voodoo.vpcf", + "soundevents/game_sounds_heroes/game_sounds_axe.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_tusk.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_crystalmaiden.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_enchantress.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_ogre_magi.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_tinker.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_beastmaster.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_juggernaut.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_lycan.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_shredder.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_drowranger.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_keeper_of_the_light.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_razor.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_omniknight.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_windrunner.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_kunkka.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_doombringer.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_lina.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_troll_warlord.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_venomancer.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_gyrocopter.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_jakiro.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_lich.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_queenofpain.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_tidehunter.vsndevts", + "particles/units/heroes/hero_lycan/lycan_weapon_blur_b.vpcf", + "particles/econ/items/necrolyte/necrophos_sullen/necro_sullen_pulse_enemy.vpcf", + "particles/units/unit_greevil/loot_greevil_death.vpcf", + "soundevents/game_sounds_heroes/game_sounds_ogre_magi.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_sandking.vsndevts", + "particles/units/heroes/hero_omniknight/omniknight_purification.vpcf", + "particles/dire_fx/bad_ancient002_destroy_fire.vpcf", + "soundevents/game_sounds_heroes/game_sounds_witchdoctor.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_tusk.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_crystalmaiden.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_axe.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_enchantress.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_ogre_magi.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_antimage.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_rattletrap.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_shadowshaman.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_bounty_hunter.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_witchdoctor.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_tinker.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_beastmaster.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_juggernaut.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_lycan.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_shredder.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_phantom_assassin.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_puck.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_slardar.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_chaos_knight.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_drowranger.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_keeper_of_the_light.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_razor.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_omniknight.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_windrunner.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_sandking.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_abaddon.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_slark.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_sniper.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_kunkka.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_doombringer.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_lina.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_troll_warlord.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_venomancer.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_necrolyte.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_templar_assassin.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_gyrocopter.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_lich.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_queenofpain.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_tidehunter.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_enigma.vsndevts", + "models/props_gameplay/donkey.vmdl", + "models/items/courier/bearzky/bearzky.vmdl", + "models/items/courier/bajie_pig/bajie_pig.vmdl", + "models/courier/mech_donkey/mech_donkey.vmdl", + "models/items/courier/little_fraid_the_courier_of_simons_retribution/little_fraid_the_courier_of_simons_retribution.vmdl", + "models/items/courier/baekho/baekho.vmdl", + "models/items/courier/green_jade_dragon/green_jade_dragon.vmdl", + "models/courier/donkey_crummy_wizard_2014/donkey_crummy_wizard_2014.vmdl", + "models/items/courier/pw_zombie/pw_zombie.vmdl", + "models/courier/drodo/drodo.vmdl", + "models/items/courier/courier_mvp_redkita/courier_mvp_redkita.vmdl", + "particles/generic_gameplay/rune_bounty_prespawn.vpcf", + "particles/prime/hero_spawn_hero_level_2_base_ring.vpcf", + "particles/econ/items/treant_protector/ti7_shoulder/treant_ti7_livingarmor_seedlings_parent.vpcf", + "particles/econ/items/bloodseeker/bloodseeker_eztzhok_weapon/bloodseeker_bloodrage_ground_eztzhok_arc.vpcf", + "particles/econ/items/treant_protector/ti7_shoulder/treant_ti7_crimson_livingarmor.vpcf", + "particles/units/heroes/hero_puck/puck_base_attack_warmup.vpcf", + "particles/units/heroes/hero_phantom_assassin/phantom_assassin_attack_blur_crit.vpcf", + "particles/units/heroes/hero_lycan/lycan_weapon_blur_both.vpcf", + "particles/units/heroes/hero_juggernaut/jugg_attack_blur.vpcf", + "particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_ti8_sword_attack_b.vpcf", + "particles/econ/items/juggernaut/jugg_ti8_sword/juggernaut_ti8_sword_attack_a.vpcf", + "particles/units/heroes/hero_windrunner/wr_taunt_kiss.vpcf", + "effect/big.vpcf", + "effect/arrow/1.vpcf", + "effect/arrow/2.vpcf", + "effect/arrow/3.vpcf", + "effect/arrow/4.vpcf", + "effect/arrow/5.vpcf", + "effect/arrow/star1.vpcf", + "effect/arrow/star2.vpcf", + "effect/arrow/star3.vpcf", + "particles/error/error.vpcf", + "particles/units/heroes/hero_chaos_knight/chaos_knight_weapon_blur.vpcf", + "particles/units/heroes/hero_lycan/lycan_claw_blur.vpcf", + "soundevents/voscripts/game_sounds_vo_tusk.vsndevts", + "soundevents/voscripts/game_sounds_vo_crystalmaiden.vsndevts", + 'models/items/courier/virtus_werebear_t3/virtus_werebear_t3.vmdl', + + + "particles/econ/items/templar_assassin/templar_assassin_focal/templar_assassin_meld_focal_attack_shockwave.vpcf", + + "models/props_gameplay/donkey.vmdl", + "models/courier/skippy_parrot/skippy_parrot.vmdl", + "models/courier/smeevil_mammoth/smeevil_mammoth.vmdl", + "models/items/courier/arneyb_rabbit/arneyb_rabbit.vmdl", + "models/items/courier/axolotl/axolotl.vmdl", + "models/items/courier/coco_the_courageous/coco_the_courageous.vmdl", + "models/items/courier/coral_furryfish/coral_furryfish.vmdl", + "models/items/courier/corsair_ship/corsair_ship.vmdl", + "models/items/courier/duskie/duskie.vmdl", + "models/items/courier/itsy/itsy.vmdl", + "models/items/courier/jumo/jumo.vmdl", + "models/items/courier/mighty_chicken/mighty_chicken.vmdl", + "models/items/courier/nexon_turtle_05_green/nexon_turtle_05_green.vmdl", + "models/items/courier/pumpkin_courier/pumpkin_courier.vmdl", + "models/items/courier/pw_ostrich/pw_ostrich.vmdl", + "models/items/courier/scuttling_scotty_penguin/scuttling_scotty_penguin.vmdl", + "models/items/courier/shagbark/shagbark.vmdl", + "models/items/courier/snaggletooth_red_panda/snaggletooth_red_panda.vmdl", + "models/items/courier/snail/courier_snail.vmdl", + "models/items/courier/teron/teron.vmdl", + "models/items/courier/xianhe_stork/xianhe_stork.vmdl", + "models/items/courier/starladder_grillhound/starladder_grillhound.vmdl", + "models/items/courier/pw_zombie/pw_zombie.vmdl", + "models/items/courier/raiq/raiq.vmdl", + "models/courier/frog/frog.vmdl", + "models/courier/godhorse/godhorse.vmdl", + "models/courier/imp/imp.vmdl", + "models/courier/mighty_boar/mighty_boar.vmdl", + "models/items/courier/onibi_lvl_03/onibi_lvl_03.vmdl", + "models/items/courier/echo_wisp/echo_wisp.vmdl", --蠕行水母 + "models/courier/sw_donkey/sw_donkey.vmdl", --驴法师new + "models/items/courier/gnomepig/gnomepig.vmdl", --丰臀公主new + "models/items/furion/treant/ravenous_woodfang/ravenous_woodfang.vmdl",--焚牙树精new + "models/courier/mechjaw/mechjaw.vmdl",--机械咬人箱new + "models/items/courier/mole_messenger/mole_messenger.vmdl",--1级矿车老鼠 + "models/courier/doom_demihero_courier/doom_demihero_courier.vmdl", + "models/courier/huntling/huntling.vmdl", + "models/courier/minipudge/minipudge.vmdl", + "models/courier/seekling/seekling.vmdl", + "models/items/courier/baekho/baekho.vmdl", + "models/items/courier/basim/basim.vmdl", + "models/items/courier/devourling/devourling.vmdl", + "models/items/courier/faceless_rex/faceless_rex.vmdl", + "models/items/courier/tinkbot/tinkbot.vmdl", + "models/items/courier/lilnova/lilnova.vmdl", + "models/items/courier/amphibian_kid/amphibian_kid.vmdl", + "models/courier/venoling/venoling.vmdl", + "models/courier/juggernaut_dog/juggernaut_dog.vmdl", + "models/courier/otter_dragon/otter_dragon.vmdl", + "models/items/courier/boooofus_courier/boooofus_courier.vmdl", + "models/courier/baby_winter_wyvern/baby_winter_wyvern.vmdl", + "models/courier/yak/yak.vmdl", + "models/items/furion/treant/eternalseasons_treant/eternalseasons_treant.vmdl", + "models/items/courier/blue_lightning_horse/blue_lightning_horse.vmdl", + "models/items/courier/waldi_the_faithful/waldi_the_faithful.vmdl", + "models/items/courier/bajie_pig/bajie_pig.vmdl", + "models/items/courier/courier_faun/courier_faun.vmdl", + "models/items/courier/livery_llama_courier/livery_llama_courier.vmdl", + "models/items/courier/onibi_lvl_10/onibi_lvl_10.vmdl", + "models/items/courier/little_fraid_the_courier_of_simons_retribution/little_fraid_the_courier_of_simons_retribution.vmdl", --胆小南瓜人 + "models/items/courier/hermit_crab/hermit_crab.vmdl", --螃蟹1 + "models/items/courier/hermit_crab/hermit_crab_boot.vmdl", --螃蟹2 + "models/items/courier/hermit_crab/hermit_crab_shield.vmdl", --螃蟹3 + "models/courier/donkey_unicorn/donkey_unicorn.vmdl", --竭智法师new + "models/items/courier/white_the_crystal_courier/white_the_crystal_courier.vmdl", --蓝心白隼new + "models/items/furion/treant/furion_treant_nelum_red/furion_treant_nelum_red.vmdl",--莲花人new + "models/courier/beetlejaws/mesh/beetlejaws.vmdl",--甲虫咬人箱new + "models/courier/smeevil_bird/smeevil_bird.vmdl", + "models/items/courier/mole_messenger/mole_messenger_lvl4.vmdl",--蜡烛头矿车老鼠 + "models/items/courier/bookwyrm/bookwyrm.vmdl", + "models/items/courier/captain_bamboo/captain_bamboo.vmdl", + "models/items/courier/kanyu_shark/kanyu_shark.vmdl", + "models/items/courier/tory_the_sky_guardian/tory_the_sky_guardian.vmdl", + "models/items/courier/shroomy/shroomy.vmdl", + "models/items/courier/courier_janjou/courier_janjou.vmdl", + "models/items/courier/green_jade_dragon/green_jade_dragon.vmdl", + "models/courier/drodo/drodo.vmdl", + "models/courier/mech_donkey/mech_donkey.vmdl", + "models/courier/donkey_crummy_wizard_2014/donkey_crummy_wizard_2014.vmdl", + "models/courier/octopus/octopus.vmdl", + "models/items/courier/scribbinsthescarab/scribbinsthescarab.vmdl", + "models/courier/defense3_sheep/defense3_sheep.vmdl", + "models/items/courier/snapjaw/snapjaw.vmdl", + "models/items/courier/g1_courier/g1_courier.vmdl", + "models/courier/donkey_trio/mesh/donkey_trio.vmdl", + "models/items/courier/boris_baumhauer/boris_baumhauer.vmdl", + "models/courier/baby_rosh/babyroshan.vmdl", + "models/items/courier/bearzky/bearzky.vmdl", + "models/items/courier/defense4_radiant/defense4_radiant.vmdl", + "models/items/courier/defense4_dire/defense4_dire.vmdl", + "models/items/courier/onibi_lvl_20/onibi_lvl_20.vmdl", + "models/items/juggernaut/ward/fortunes_tout/fortunes_tout.vmdl", --招财猫 + "models/items/courier/hermit_crab/hermit_crab_necro.vmdl", --螃蟹4 + "models/items/courier/hermit_crab/hermit_crab_travelboot.vmdl", --螃蟹5 + "models/items/courier/hermit_crab/hermit_crab_lotus.vmdl", --螃蟹6 + "models/courier/donkey_ti7/donkey_ti7.vmdl", + "models/items/courier/shibe_dog_cat/shibe_dog_cat.vmdl", --天猫地狗new + "models/items/furion/treant/hallowed_horde/hallowed_horde.vmdl",--万圣树群new + "models/courier/flopjaw/flopjaw.vmdl",--大嘴咬人箱new + "models/courier/lockjaw/lockjaw.vmdl",--咬人箱洛克new + "models/items/courier/butch_pudge_dog/butch_pudge_dog.vmdl",--布狗new + "models/courier/turtle_rider/turtle_rider.vmdl", + "models/courier/smeevil_crab/smeevil_crab.vmdl", + "models/items/courier/mole_messenger/mole_messenger_lvl6.vmdl",--绿钻头矿车老鼠 + "models/courier/navi_courier/navi_courier.vmdl", + "models/items/courier/courier_mvp_redkita/courier_mvp_redkita.vmdl", + "models/items/courier/ig_dragon/ig_dragon.vmdl", + "models/items/courier/lgd_golden_skipper/lgd_golden_skipper.vmdl", + "models/items/courier/vigilante_fox_red/vigilante_fox_red.vmdl", + "models/items/courier/virtus_werebear_t3/virtus_werebear_t3.vmdl", + "models/items/courier/throe/throe.vmdl", + "models/items/courier/vaal_the_animated_constructradiant/vaal_the_animated_constructradiant.vmdl", + "models/items/courier/vaal_the_animated_constructdire/vaal_the_animated_constructdire.vmdl", + "models/items/courier/carty/carty.vmdl", + "models/items/courier/carty_dire/carty_dire.vmdl", + "models/items/courier/dc_angel/dc_angel.vmdl", + "models/items/courier/dc_demon/dc_demon.vmdl", + "models/items/courier/vigilante_fox_green/vigilante_fox_green.vmdl", + "models/items/courier/bts_chirpy/bts_chirpy.vmdl", + "models/items/courier/krobeling/krobeling.vmdl", + "models/items/courier/jin_yin_black_fox/jin_yin_black_fox.vmdl", + "models/items/courier/jin_yin_white_fox/jin_yin_white_fox.vmdl", + "models/items/courier/fei_lian_blue/fei_lian_blue.vmdl", + "models/items/courier/gama_brothers/gama_brothers.vmdl", + "models/items/courier/onibi_lvl_21/onibi_lvl_21.vmdl", + "models/items/courier/wabbit_the_mighty_courier_of_heroes/wabbit_the_mighty_courier_of_heroes.vmdl", --小飞侠 + "models/items/courier/hermit_crab/hermit_crab_octarine.vmdl", --螃蟹7 + "models/items/courier/hermit_crab/hermit_crab_skady.vmdl", --螃蟹8 + "models/items/courier/hermit_crab/hermit_crab_aegis.vmdl", --螃蟹9 + "models/items/furion/treant_flower_1.vmdl",--绽放树精new + "models/courier/smeevil_magic_carpet/smeevil_magic_carpet.vmdl", + "models/items/courier/mole_messenger/mole_messenger_lvl7.vmdl",--绿钻头金矿车老鼠 + "models/items/courier/krobeling_gold/krobeling_gold_flying.vmdl",--金dp + "models/props_gameplay/donkey.vmdl", + "particles/items2_fx/refresher.vpcf", + "soundevents/game_sounds_items.vsndevts", + "particles/speechbubbles/speech_voice.vpcf", + + "soundevents/game_sounds_heroes/game_sounds_nevermore.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_batrider.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_luna.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_treant.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_dragon_knight.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_viper.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_medusa.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_disruptor.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_alchemist.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_techies.vsndevts", + "particles/econ/events/ti5/dagon_ti5.vpcf", + "particles/units/heroes/hero_monkey_king/monkey_king_fur_army_positions_ring_dragon.vpcf", + "particles/econ/items/legion/legion_overwhelming_odds_ti7/legion_commander_odds_ti7_proj_hit_streaks.vpcf", + "particles/units/heroes/hero_queenofpain/queen_sonic_wave.vpcf", + "models/props_gameplay/donkey_dire.vmdl", + "models/props_gameplay/donkey_dire_wings.vmdl", + "models/courier/baby_rosh/babyroshan_winter18.vmdl", + "effect/dizuo/1.vpcf", + "soundevents/voscripts/game_sounds_vo_lone_druid.vsndevts", + "soundevents/voscripts/game_sounds_vo_furion.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_omniknight.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_morphling.vsndevts", + "soundevents/voscripts/game_sounds_vo_terrorblade.vsndevts", + "particles/units/heroes/hero_chaos_knight/chaos_knight_phantasm.vpcf", + "soundevents/game_sounds_heroes/game_sounds_chaos_knight.vsndevts", + "models/items/kunkka/kunkka_immortal/kunkka_shark_immortal.vmdl", + "models/courier/frull/frull_courier.vmdl", + "models/items/courier/amaterasu/amaterasu.vmdl", + "models/items/courier/chocobo/chocobo.vmdl", + "models/items/courier/flightless_dod/flightless_dod.vmdl", + "models/items/courier/frostivus2018_courier_serac_the_seal/frostivus2018_courier_serac_the_seal.vmdl", + "models/items/courier/jumo_dire/jumo_dire.vmdl", + "models/items/courier/pangolier_squire/pangolier_squire.vmdl", + "models/items/courier/sltv_10_courier/sltv_10_courier.vmdl", + "models/items/courier/nian_courier/nian_courier.vmdl", + "models/items/courier/nilbog/nilbog.vmdl", + "particles/items_fx/blink_dagger_end.vpcf", + "soundevents/game_sounds_heroes/game_sounds_terrorblade.vsndevts", + "particles/units/heroes/hero_mirana/mirana_spell_arrow.vpcf", + "particles/econ/items/mirana/mirana_starstorm_bow/mirana_starstorm_starfall_attack.vpcf", + "soundevents/game_sounds_heroes/game_sounds_mirana.vsndevts", + "particles/units/heroes/hero_slark/slark_pounce_start.vpcf", + "particles/econ/items/slark/slark_ti6_blade/slark_ti6_pounce_start.vpcf", + "particles/econ/items/slark/slark_ti6_blade/slark_ti6_pounce_start_gold.vpcf", + "soundevents/game_sounds_heroes/game_sounds_zuus.vsndevts", + "particles/econ/items/zeus/arcana_chariot/zeus_arcana_thundergods_wrath_start_bolt_parent.vpcf", + "models/items/lycan/wolves/blood_moon_hunter_wolves/blood_moon_hunter_wolves.vmdl", + "models/items/lycan/ultimate/blood_moon_hunter_shapeshift_form/blood_moon_hunter_shapeshift_form.vmdl", + "models/items/courier/krobeling_gold/krobeling_gold.vmdl", + "models/items/courier/krobeling_gold/krobeling_gold_flying.vmdl", + "effect/jin_dp/courier_krobeling_gold_ambient.vpcf", + "effect/nianshou/courier_nian_ambient.vpcf", + "soundevents/game_sounds.vsndevts", + "soundevents/voscripts/game_sounds_vo_announcer_killing_spree.vsndevts", + "effect/3sha/vr_killbanner_triplekill.vpcf", + "effect/5sha/vr_killbanner_rampage.vpcf", + "effect/zeus/victory/victory.vpcf", + "effect/god/1.vpcf", + "soundevents/voscripts/game_sounds_vo_zuus.vsndevts", + "soundevents/voscripts/game_sounds_vo_mars.vsndevts", + "effect/mars/2/e.vpcf", + "effect/mars/1/e.vpcf", + "soundevents/game_sounds_heroes/game_sounds_dazzle.vsndevts", + "soundevents/game_sounds_heroes/game_sounds_dark_seer.vsndevts", + "soundevents/music/game_sounds_stingers_diretide.vsndevts", + "particles/gem/brewmaster_drunken_haze_debuff_bubbles_2.vpcf", + "models/qie/qie.vmdl", + "models/courier/f2p_courier/f2p_courier.vmdl", + "models/items/courier/azuremircourierfinal/azuremircourierfinal.vmdl", + "effect/roshan_ti9/1.vpcf", + "models/items/axe/ti9_jungle_axe/axe_bare.vmdl", + "models/shudaixiong/model/shudaixiong/shudaixiong.vmdl", + "models/shudaixiong/model/shudaixiong_flying/shudaixiong_flying.vmdl", + "models/courier/baby_rosh/babyroshan_elemental.vmdl", + "particles/units/heroes/hero_grimstroke/grimstroke_soulchain_debuff.vpcf", + "soundevents/game_sounds_heroes/game_sounds_rubick.vsndevts", + + "models/pets/armadillo/armadillo.vmdl", + "models/courier/baby_rosh/babyroshan_ti9.vmdl", + "models/heroes/invoker_kid/invoker_kid_trainer_dragon.vmdl", + + "particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_idle_rare.vpcf", + + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant.vmdl", + + -- TI10晴儿 + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl1_ambient.vpcf", + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl2/courier_ti10_radiant_lvl2.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl2_ambient.vpcf", + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl3/courier_ti10_radiant_lvl3.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl3_ambient.vpcf", + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl4/courier_ti10_radiant_lvl4.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl4_ambient.vpcf", + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl5/courier_ti10_radiant_lvl5.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl5_ambient.vpcf", + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl6/courier_ti10_radiant_lvl6.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl6_ambient.vpcf", + "models/items/courier/courier_ti10_radiant/courier_ti10_radiant_lvl7/courier_ti10_radiant_lvl7.vmdl", + "particles/econ/courier/courier_ti10/courier_ti10_lvl7_ambient.vpcf", + } + print("Precache mxx ...") + local t=table.maxn(mxx) + for i=1,t do + if string.find(mxx[i], ".vpcf") then + PrecacheResource( "particle", mxx[i], context) + end + if string.find(mxx[i], ".vmdl") then + PrecacheResource( "model", mxx[i], context) + end + if string.find(mxx[i], ".vsndevts") then + PrecacheResource( "soundfile", mxx[i], context) + end + end +end + +function Activate() + GameRules.THTDGameMode = CTHTDGameMode() + GameRules.THTDGameMode:InitGameMode() +end + + +function CTHTDGameMode:InitGameMode() + GameRules:GetGameModeEntity():SetCameraDistanceOverride(1734.0) + GameRules:GetGameModeEntity():SetFogOfWarDisabled(true) + GameRules:GetGameModeEntity():SetUseCustomHeroLevels(true) + GameRules:GetGameModeEntity():SetCustomXPRequiredToReachNextLevel(self:SettingExp()) + GameRules:GetGameModeEntity():SetCustomHeroMaxLevel(THTD_MAX_LEVEL) + GameRules:SetStartingGold(4500) + GameRules:SetGoldPerTick(0) + GameRules:GetGameModeEntity():SetLoseGoldOnDeath(false) + GameRules:SetSameHeroSelectionEnabled(true) + GameRules:SetHeroSelectionTime(10) + GameRules:SetPreGameTime(30) + GameRules:SetStrategyTime(0) + GameRules:SetShowcaseTime(0) + GameRules:SetUseUniversalShopMode(true) + GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_GOODGUYS, 4 ) + GameRules:SetCustomGameTeamMaxPlayers( DOTA_TEAM_BADGUYS, 0 ) + GameRules:SetCustomGameAllowBattleMusic( false ) + GameRules:SetCustomGameAllowMusicAtGameStart( false ) + + -- GameRules:GetGameModeEntity():SetGoldSoundDisabled(true) + GameRules:GetGameModeEntity():SetNeutralStashEnabled(false) + GameRules:GetGameModeEntity():SetSendToStashEnabled(false) + GameRules:GetGameModeEntity():SetStashPurchasingDisabled(true) + + GameRules:GetGameModeEntity():SetAlwaysShowPlayerNames(true) + GameRules:GetGameModeEntity():SetMaximumAttackSpeed(700) --显示会突破 + GameRules:GetGameModeEntity():SetMinimumAttackSpeed(20) + GameRules:GetGameModeEntity():SetCustomBackpackSwapCooldown(0) + -- GameRules:GetGameModeEntity():SetAnnouncerDisabled(true) + GameRules:GetGameModeEntity():SetKillingSpreeAnnouncerDisabled(true) + -- GameRules:SetCustomGameAllowHeroPickMusic( false ) + GameRules:GetGameModeEntity():SetCanSellAnywhere(true) + + + ListenToGameEvent('entity_killed', Dynamic_Wrap(CTHTDGameMode, 'OnEntityKilled'), self) + ListenToGameEvent('player_chat', Dynamic_Wrap(CTHTDGameMode, 'OnPlayerSay'), self) + ListenToGameEvent('game_rules_state_change', Dynamic_Wrap(CTHTDGameMode, 'OnGameRulesStateChange'), self) + ListenToGameEvent('player_connect_full', Dynamic_Wrap( CTHTDGameMode, 'OnPlayerConnected' ), self ) + + GameRules:GetGameModeEntity():SetExecuteOrderFilter(Dynamic_Wrap(CTHTDGameMode, 'ExecuteOrder'), self) + GameRules:GetGameModeEntity():SetItemAddedToInventoryFilter(Dynamic_Wrap(CTHTDGameMode, 'ItemAddedToInventory'), self) + GameRules:GetGameModeEntity():SetDamageFilter(Dynamic_Wrap(CTHTDGameMode, 'DamageFilter'), self) + GameRules:GetGameModeEntity():SetModifierGainedFilter(Dynamic_Wrap(CTHTDGameMode, 'ModifierFilter'), self) + GameRules:GetGameModeEntity():SetModifyGoldFilter(Dynamic_Wrap(CTHTDGameMode, 'OnModifyGoldFilter'), self) + GameRules:GetGameModeEntity():SetTPScrollSlotItemOverride("item_3121") + + LinkLuaModifier("modifier_magical_armor", "modifiers/modifier_magical_armor", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_move_speed", "modifiers/modifier_move_speed", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_move_max_speed", "modifiers/modifier_move_max_speed", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_attack_speed", "modifiers/modifier_attack_speed", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_attack_time", "modifiers/modifier_attack_time", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_cooldown_reduce", "modifiers/modifier_cooldown_reduce", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2005_attack_aura", "modifiers/modifier_item_2005_attack_aura", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2005_attack_aura_effect", "modifiers/modifier_item_2005_attack_aura_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2006_mana_regen_aura", "modifiers/modifier_item_2006_mana_regen_aura", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2006_mana_regen_aura_effect", "modifiers/modifier_item_2006_mana_regen_aura_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2008_slow_aura", "modifiers/modifier_item_2008_slow_aura", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2008_slow_aura_effect", "modifiers/modifier_item_2008_slow_aura_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2009_damage", "modifiers/modifier_item_2009_damage", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2010_damage", "modifiers/modifier_item_2010_damage", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2011_attack_stun", "modifiers/modifier_item_2011_attack_stun", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2012_magical_damage_aura", "modifiers/modifier_item_2012_magical_damage_aura", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2012_magical_damage_aura_effect", "modifiers/modifier_item_2012_magical_damage_aura_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2013_physical_damage_aura", "modifiers/modifier_item_2013_physical_damage_aura", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2013_physical_damage_aura_effect", "modifiers/modifier_item_2013_physical_damage_aura_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2014_damage_aura", "modifiers/modifier_item_2014_damage_aura", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2014_damage_aura_effect", "modifiers/modifier_item_2014_damage_aura_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_item_2018_bonus_attack_range", "modifiers/modifier_item_2018_bonus_attack_range", LUA_MODIFIER_MOTION_NONE) + + LinkLuaModifier("modifier_touhoutd_pause", "modifiers/modifier_touhoutd_pause", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_root", "modifiers/modifier_touhoutd_root", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_release_hidden", "modifiers/modifier_touhoutd_release_hidden", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_building", "modifiers/modifier_touhoutd_building", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_hidden_bar", "modifiers/modifier_hidden_bar", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_root_hidden_info", "modifiers/modifier_root_hidden_info", LUA_MODIFIER_MOTION_NONE) + + LinkLuaModifier("modifier_touhoutd_luck", "modifiers/modifier_touhoutd_luck", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_poison", "modifiers/modifier_touhoutd_poison", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_damage_outgoing_pure", "modifiers/modifier_touhoutd_damage_outgoing_pure", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_damage_outgoing_physical", "modifiers/modifier_touhoutd_damage_outgoing_physical", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_damage_outgoing_magical", "modifiers/modifier_touhoutd_damage_outgoing_magical", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_damage_incoming_pure", "modifiers/modifier_touhoutd_damage_incoming_pure", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_damage_incoming_physical", "modifiers/modifier_touhoutd_damage_incoming_physical", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_damage_incoming_magical", "modifiers/modifier_touhoutd_damage_incoming_magical", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_crit_chance", "modifiers/modifier_touhoutd_crit_chance", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_crit_damage", "modifiers/modifier_touhoutd_crit_damage", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_touhoutd_unlimited_resist", "modifiers/modifier_touhoutd_unlimited_resist", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_base_attack_bonus_percent", "modifiers/modifier_base_attack_bonus_percent", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_manacost_reduce_percent", "modifiers/modifier_manacost_reduce_percent", LUA_MODIFIER_MOTION_NONE) + + LinkLuaModifier("modifier_ability_power_common", "modifiers/power/modifier_ability_power_common", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_minoriko", "modifiers/power/modifier_ability_power_minoriko", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_sizuha", "modifiers/power/modifier_ability_power_sizuha", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_lily", "modifiers/power/modifier_ability_power_lily", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_shinki", "modifiers/power/modifier_ability_power_shinki", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_nazrin", "modifiers/power/modifier_ability_power_nazrin", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_byakuren", "modifiers/power/modifier_ability_power_byakuren", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_shikieiki", "modifiers/power/modifier_ability_power_shikieiki", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_reimu", "modifiers/power/modifier_ability_power_reimu", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_flandre", "modifiers/power/modifier_ability_power_flandre", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_koishi", "modifiers/power/modifier_ability_power_koishi", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_hecatia", "modifiers/power/modifier_ability_power_hecatia", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_yuuka", "modifiers/power/modifier_ability_power_yuuka", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_daiyousei", "modifiers/power/modifier_ability_power_daiyousei", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_kanako", "modifiers/power/modifier_ability_power_kanako", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_yukari", "modifiers/power/modifier_ability_power_yukari", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_miko", "modifiers/power/modifier_ability_power_miko", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_eirin", "modifiers/power/modifier_ability_power_eirin", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_komachi", "modifiers/power/modifier_ability_power_komachi", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_remilia", "modifiers/power/modifier_ability_power_remilia", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_ability_power_junko", "modifiers/power/modifier_ability_power_junko", LUA_MODIFIER_MOTION_NONE) + + LinkLuaModifier("modifier_bb_buff_3011", "modifiers/battle_buff/modifier_bb_buff_3011", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3011_effect", "modifiers/battle_buff/modifier_bb_buff_3011_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3012", "modifiers/battle_buff/modifier_bb_buff_3012", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3013", "modifiers/battle_buff/modifier_bb_buff_3013", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3014", "modifiers/battle_buff/modifier_bb_buff_3014", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3015", "modifiers/battle_buff/modifier_bb_buff_3015", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3015_effect", "modifiers/battle_buff/modifier_bb_buff_3015_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3016", "modifiers/battle_buff/modifier_bb_buff_3016", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3016_effect", "modifiers/battle_buff/modifier_bb_buff_3016_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3017", "modifiers/battle_buff/modifier_bb_buff_3017", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3018", "modifiers/battle_buff/modifier_bb_buff_3018", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3019", "modifiers/battle_buff/modifier_bb_buff_3019", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3020", "modifiers/battle_buff/modifier_bb_buff_3020", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3021", "modifiers/battle_buff/modifier_bb_buff_3021", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3023", "modifiers/battle_buff/modifier_bb_buff_3023", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3024", "modifiers/battle_buff/modifier_bb_buff_3024", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3025", "modifiers/battle_buff/modifier_bb_buff_3025", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3026", "modifiers/battle_buff/modifier_bb_buff_3026", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3027", "modifiers/battle_buff/modifier_bb_buff_3027", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3028", "modifiers/battle_buff/modifier_bb_buff_3028", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3029", "modifiers/battle_buff/modifier_bb_buff_3029", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3030", "modifiers/battle_buff/modifier_bb_buff_3030", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bb_buff_3031", "modifiers/battle_buff/modifier_bb_buff_3031", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_fairy_count", "modifiers/battle_buff/modifier_fairy_count", LUA_MODIFIER_MOTION_NONE) + + LinkLuaModifier("modifier_bosses_alice", "modifiers/bosses/modifier_bosses_alice", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_aya", "modifiers/bosses/modifier_bosses_aya", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_hina", "modifiers/bosses/modifier_bosses_hina", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_hina_aura_effect", "modifiers/bosses/modifier_bosses_hina_aura_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_kaguya", "modifiers/bosses/modifier_bosses_kaguya", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_keine", "modifiers/bosses/modifier_bosses_keine", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_kisume", "modifiers/bosses/modifier_bosses_kisume", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_marisa", "modifiers/bosses/modifier_bosses_marisa", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_minoriko", "modifiers/bosses/modifier_bosses_minoriko", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_mokou", "modifiers/bosses/modifier_bosses_mokou", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_mokou_aura_effect", "modifiers/bosses/modifier_bosses_mokou_aura_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_rumia", "modifiers/bosses/modifier_bosses_rumia", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_yuugi", "modifiers/bosses/modifier_bosses_yuugi", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_random_resist_aura", "modifiers/bosses/modifier_bosses_random_resist_aura", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_random_resist_effect", "modifiers/bosses/modifier_bosses_random_resist_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_random_attack_speed_aura", "modifiers/bosses/modifier_bosses_random_attack_speed_aura", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_random_attack_speed_effect", "modifiers/bosses/modifier_bosses_random_attack_speed_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_random_move_aura", "modifiers/bosses/modifier_bosses_random_move_aura", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_random_move_effect", "modifiers/bosses/modifier_bosses_random_move_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_random_health_aura", "modifiers/bosses/modifier_bosses_random_health_aura", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_random_health_effect", "modifiers/bosses/modifier_bosses_random_health_effect", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_random_dead_heal", "modifiers/bosses/modifier_bosses_random_dead_heal", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_random_aura_dark", "modifiers/bosses/modifier_bosses_random_aura_dark", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_bosses_random_aura_dark_effect", "modifiers/bosses/modifier_bosses_random_aura_dark_effect", LUA_MODIFIER_MOTION_NONE) + + LinkLuaModifier("modifier_courier_fx", "modifiers/effects/modifier_courier_fx", LUA_MODIFIER_MOTION_NONE) + LinkLuaModifier("modifier_rainbow_tail", "modifiers/effects/modifier_rainbow_tail", LUA_MODIFIER_MOTION_NONE) + + + + CustomNetTables:SetTableValue("CustomGameInfo", "thtd_tower_list", towerNameList) + print("\n---------- InitGameMode Finished ----------") + + GameRules:GetGameModeEntity():SetContextThink(DoUniqueString("collectgarbage"), + function() + local m = collectgarbage('count') + print(string.format("[Lua Memory] %.3f KB %.3f MB", m, m/1024)) + return 60 + end, + 60) +end + +function CTHTDGameMode:SettingExp() + -- 总和5400 + -- 经验分配规则 保底 1X每只30点 2X每只20点,3X每只10点,4X每只6点,5X每只3点 + -- 单吃一个兵经验 300点 200点 100点 60点 30点 + -- 经验获取率1X 100% 2X 2/3 3X 1/3 4X 1/5 5X 1/10 + -- 素材培养 (1000+素材卡牌经验/5)* 星级 + + local HERO_EXP_TABLE = {0} + local exp = {200,300,400,500,600,700,800,900,1000} + local xp = 0 + + for i = 2, THTD_MAX_LEVEL-1 do + HERO_EXP_TABLE[i]=HERO_EXP_TABLE[i-1]+exp[i-1] + end + + return HERO_EXP_TABLE +end + + +function CTHTDGameMode:OnDotaItemPickedUp(keys) + local item = EntIndexToHScript(keys.ItemEntityIndex) + if item == nil then return end + if item.locked_by_player_id == nil or item.locked_by_player_id == keys.PlayerID or item.card_poor_player_id == keys.PlayerID then return end + -- local heroes = Entities:FindAllByClassname("npc_dota_hero_lina") + for _,hero in pairs(GameRules.HeroList) do + if hero.thtd_player_id == item.locked_by_player_id and hero.is_game_over == true then return end + end + + local picker = nil + if keys.HeroEntityIndex ~= nil then + picker = EntIndexToHScript(keys.HeroEntityIndex) + elseif keys.UnitEntityIndex ~= nil then + picker = EntIndexToHScript(keys.UnitEntityIndex) + end + if picker == nil then return end + CustomGameEventManager:Send_ServerToPlayer(picker:GetPlayerOwner() , "display_custom_error", {msg="item_is_locked"}) + picker:DropItemAtPositionImmediate(item, picker:GetOrigin()) +end + + +function CTHTDGameMode:OnGameRulesStateChange(keys) + local newState = GameRules:State_Get() + local stateText = { + [0] = "DOTA_GAMERULES_STATE_INIT", + [1] = "DOTA_GAMERULES_STATE_WAIT_FOR_PLAYERS_TO_LOAD", + [2] = "DOTA_GAMERULES_STATE_CUSTOM_GAME_SETUP", + [3] = "DOTA_GAMERULES_STATE_HERO_SELECTION", + [4] = "DOTA_GAMERULES_STATE_STRATEGY_TIME", + [5] = "DOTA_GAMERULES_STATE_TEAM_SHOWCASE", + [6] = "DOTA_GAMERULES_STATE_PRE_GAME", + [7] = "DOTA_GAMERULES_STATE_GAME_IN_PROGRESS", + [8] = "DOTA_GAMERULES_STATE_POST_GAME", + [9] = "DOTA_GAMERULES_STATE_DISCONNECT", + } + print("-------- Now State: ", stateText[newState]) + if newState == DOTA_GAMERULES_STATE_CUSTOM_GAME_SETUP then + self:GameStateCustomGameSetup() + Service:LoadGameData() + + elseif newState == DOTA_GAMERULES_STATE_STRATEGY_TIME then + ListenToGameEvent('npc_spawned', Dynamic_Wrap( CTHTDGameMode, 'OnNpcSpawned' ), self ) + ListenToGameEvent('dota_item_picked_up', Dynamic_Wrap(CTHTDGameMode, 'OnDotaItemPickedUp'), self) + ListenToGameEvent('dota_non_player_used_ability', Dynamic_Wrap(CTHTDGameMode, 'OnDotaNonPlayerUsedAbility'), self) + + -------- 设置游戏难度 -------- + local level = {[0]=0,[1]=0,[2]=0,[3]=0,[4]=0,[5]=0,[6]=0} + for k,v in pairs(PlayersSelectedDifficulty) do + level[v] = (level[v] or 0) + 1 + end + local difficulty = 0 + for k,v in pairs(level) do + if k ~= difficulty and level[k] > level[difficulty] then + difficulty = k + end + end + difficulty = difficulty + 1 + GameRules:SetCustomGameDifficulty(difficulty) + + -- 初始化金钱 + for i=0, PlayerResource:GetPlayerCount()-1 do + if PlayerResource:IsValidPlayerID(i) then + -- PlayerResource:ModifyGold(i, 4500 - 600 , true, DOTA_ModifyGold_Unspecified) + PlayerResource:SetLastBuybackTime(i, 0) + end + end + + elseif newState == DOTA_GAMERULES_STATE_PRE_GAME then + Service:GetRank() + SpawnSystem:PreSpawn() + -- 解除地图购买上限 + SendToServerConsole("dota_max_physical_items_purchase_limit 59999") + + elseif newState == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then + SpawnSystem:InitSpawn() + for i=0, PlayerResource:GetPlayerCount()-1 do + if PlayerResource:GetTeam(i) == DOTA_TEAM_GOODGUYS then + if GameRules.PlayerData[i].ban == 1 then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(i), "display_chat_msg", {msg="game_ban_tip", params={player_name=PlayerResource:GetPlayerName(i),reason=GameRules.PlayerData[i].reason}}) + for _,hero in pairs(GameRules.HeroList) do + if hero.thtd_player_id == i then + SpawnSystem:GameOver(hero) + break + end + end + elseif GameRules.PlayerData[i].vip == 1 then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(i), "show_message", {msg="game_start_vip_tip", duration=60, params={name=PlayerResource:GetPlayerName(i),endtime=GameRules.PlayerData[i].end_time}, color="#ff0"}) + end + GameRules.HeroList[i]:RemoveModifierByName("modifier_rainbow_tail") + end + end + + if GameRules.GameData.luck_card == "all" then + CustomGameEventManager:Send_ServerToAllClients("thtd_server_msg", {code = "0000", msg = "无限潜力活动开启,开局可选潜能Lv999的凤凰之灵!", duration = 15, pos = -150}) + EmitAnnouncerSound("Quest.Completed") + end + end +end + +-- 全局变量定义 +function CTHTDGameMode:GameStateCustomGameSetup() + -- 预设,数据载入完成最终设置一次 + local heroNames = { + "npc_dota_hero_lina", + "npc_dota_hero_juggernaut", + } + for i=0, PlayerResource:GetPlayerCount()-1 do + PlayerResource:SetCustomTeamAssignment(i, DOTA_TEAM_GOODGUYS) + local player = PlayerResource:GetPlayer(i) + if player then + CreateHeroForPlayer(heroNames[RandomInt(1, #heroNames)], player):RemoveSelf() + end + end + print("Heros setup") + + -- 玩家信息定义,按playerid的steamid、dota2帐户、玩家名称、英雄index信息、黑白名单及宠物信息 + GameRules.PlayerData = { } + + -- 英雄列表定义,按playerid,出生时初始化 + GameRules.HeroList = {} + + -- 战利品buff定义 + GameRules.player_bb_buff = {} + + -- 按玩家id初始化 + for i=0, PlayerResource:GetPlayerCount()-1 do + -- 玩家信息 + GameRules.PlayerData[i] = { + ["code"] = "", + ["msg"] = "", + + ["steamid"] = tostring(PlayerResource:GetSteamID(i)), + ["userid"] = tostring(PlayerResource:GetSteamAccountID(i)), + ["name"] = PlayerResource:GetPlayerName(i), + ["hero_index"] = 0, + + ["max_wave"] = 0, + ["max_team_wave"] = 0, + + ["point"] = 0, + ["level_list"] = {}, + + ["vip"] = 0, + ["ban"] = 0, + ["pet_level"] = 1, + ["end_time"] = "", + ["reason"] = "", + ["pet_model"] = "h000", + ["pet_effect"] = "e000", + + ["is_first_win"] = 0, + ["key_total"] = 0, + ["key_use_count"] = 0, + ["power_max_total"] = 0, + + ["cardgroup1"] = {}, + ["cardgroup2"] = {}, + ["cardgroup3"] = {}, + ["cardgroup4"] = {}, + ["cardgroup5"] = {}, + + ["update_time"] = "" + } + + -- 英雄列表 + GameRules.HeroList[i] = nil + + -- 战利品buff + GameRules.player_bb_buff[i] = { + ["item_3011"] = 0, -- 地灵殿单位物理伤害提升量 + ["item_3011_effect"] = 0, -- 实际加成 + ["item_3012"] = 0, -- 抽卡额外获得的一张卡牌的概率 + ["item_3013"] = 1, -- 无敌意识的负面效果比例 + ["item_3014"] = 0, -- 主角组无尽后每击杀100个单位增加的能量点数(灵梦、魔理沙、东方谷早苗、爱丽丝) + ["item_3015"] = 0, -- 月之民纯粹伤害提升数值 + ["item_3015_effect"] = 0, -- 实际加成 + ["item_3016"] = 0, -- 所有召唤物+150攻击力和+30%%攻速的倍数 + ["item_3017"] = 0, -- 每有一个外圈漏怪,则全体单位伤害提升量 + ["item_3018"] = 1, -- 抽卡价格优惠度,乘法叠加 + ["item_3019"] = 0, -- 每波最后3秒如果漏怪数量达到30则造成的伤害提高量 + ["item_3019_enable"] = false, -- 是否正在触发 + ["item_3020"] = 0, -- 同名卡上场最大数量增加量 + ["item_3021"] = 0, -- 秒杀伤害上限提高量 + ["item_3023"] = 0, -- 神灵庙单位的相机4件套效果加成和神子附加伤害加成效果提高量 + ["item_3024"] = 0, -- 守矢神社的信仰收集上限提高量 + ["item_3025"] = 0, -- 红魔馆单位的触发类技能的概率增加量 + ["item_3026"] = 0, -- 怪物移动速度降低量 + ["item_3027"] = 0, -- 星莲船单位装备提供的属性效果提高量 + ["item_3028"] = 0, -- 鬼族单位效果层数 + ["item_3028_effect"] = 0, -- 实际加成 + ["item_3029"] = 0, -- 四季馈赠量 + ["item_3030"] = 0, -- 分身加成效果提高量 + } + end +end + + +function CTHTDGameMode:OnPlayerConnected(keys) + print("----player_connect_full") + CustomGameEventManager:Send_ServerToAllClients("debug_msg", {msg = PlayerResource:GetPlayerName(keys.PlayerID).." 连接完成!"}) +end + + +function CTHTDGameMode:OnNpcSpawned(keys) + local hero = EntIndexToHScript(keys.entindex) + if hero:IsRealHero() and hero.isFirstSpawn ~= false then + hero.isFirstSpawn = false + hero.thtd_hero_tower_list = {} + hero.thtd_hero_damage_list ={} + hero.thtd_combo_voice_array = {} + hero.thtd_emoji_effect = nil + + hero.thtd_game_info = {} + hero.thtd_game_info["creep_count"] = 0 + hero.thtd_game_info["creep_count_max"] = 0 + hero.thtd_game_info["food_count"] = 0 + hero.thtd_game_info["creature_kill_count"] = 0 + hero.thtd_game_info["max_wave_damage"] = 0 + hero.thtd_game_info["max_wave"] = 0 + hero.thtd_game_info["is_player_connected"] = 0 + + hero.thtd_chance_count = {} + hero.is_game_over = false + hero.thtd_wave_total_health = 0 + + hero:SetTeam(DOTA_TEAM_GOODGUYS) + + -- 判定是否上巅峰榜 + if PlayerResource:GetPlayerCountForTeam(DOTA_TEAM_GOODGUYS) > 1 and GameRules:GetCustomGameDifficulty() ~= PVE_MODE then + hero.is_team_mode = true + else + hero.is_team_mode = false + end + + local playerId = hero:GetPlayerOwnerID() + hero.thtd_player_id = playerId + hero.spawn_position = SpawnSystem.SpawnOrigin[playerId+1] + hero:SetAbsOrigin(hero.spawn_position) + hero:SetContextThink(DoUniqueString("SetSpawn") , + function() + if GameRules:IsGamePaused() then return 0.1 end + if GetDistanceBetweenTwoVec2D(hero:GetOrigin(), hero.spawn_position) > 1000 then + hero:SetAbsOrigin(hero.spawn_position) + PlayerResource:SetCameraTarget(hero:GetPlayerID(), hero) + return 0.5 + else + PlayerResource:SetCameraTarget(hero:GetPlayerID(), nil) + end + return nil + end, + 0.5) + + UnitNoPathingfix( hero,hero,-1) + + hero:AddNewModifier(hero, nil, "modifier_phased", nil) + hero:AddNewModifier(hero, nil, "modifier_hidden_bar", nil) + hero:AddNewModifier(hero, nil, "modifier_rainbow_tail", nil) + + if GameRules.PlayerData[playerId].power_max_total > 0 then + for i=1,GameRules.PlayerData[playerId].power_max_total do + local item = CreateItem("item_3149", nil, nil) + if item ~= nil then + item.owner_player_id = playerId + item:SetPurchaser(hero) + hero:AddItem(item) + end + if i == 4 then + break + end + end + end + + GameRules.PlayerData[playerId]["hero_index"] = keys.entindex + GameRules.HeroList[playerId] = hero + + for i=0,7 do + local ability=hero:GetAbilityByIndex(i) + if ability ~= nil then + ability:SetLevel(1) + end + end + + hero:SetContextThink(DoUniqueString("delete_tp"), + function() + if GameRules:IsGamePaused() then return 0.03 end + for i=0,THTD_MAX_ITEM_SLOT-1 do + local hTP = hero:GetItemInSlot(i) + if hTP ~= nil and hTP:GetAbilityName() == "item_tpscroll" then + UTIL_Remove( hTP ) + end + end + return nil + end, + 2.0) + + local shop = CreateUnitByName( + "minoriko_shop", + SpawnSystem.ShopOrigin[hero:GetPlayerOwnerID()+1], + false, + hero, + hero, + hero:GetTeam() + ) + shop:SetControllableByPlayer(hero:GetPlayerOwnerID(), true) + shop:SetHasInventory(true) + shop:AddNewModifier(shop, nil, "modifier_root_hidden_info", nil) + shop.hero = hero + hero.shop = shop + shop:SetContextThink(DoUniqueString("set_shop_forward"), + function() + if GameRules:IsGamePaused() then return 0.1 end + shop:MoveToPosition(shop:GetOrigin()+SpawnSystem.ShopForward[hero:GetPlayerOwnerID()+1]) + return nil + end, + 1.0) + + if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE then + hero:SetContextThink(DoUniqueString("set_gold_bonus") , + function() + if GameRules:IsGamePaused() then return 0.1 end + if SpawnSystem.IsUnLimited then return nil end + THTD_ModifyGoldEx(playerId, math.min(SpawnSystem.CurWave * 25, 500) , true, DOTA_ModifyGold_Unspecified) + return 1 + end, + 10) + end + + -- local tree = CreateUnitByName( + -- "christmas_tree", + -- hero.spawn_position, + -- false, + -- hero, + -- hero, + -- hero:GetTeam() + -- ) + + local unit = CreateUnitByName( + "reimu_pet" + ,hero:GetOrigin() + hero:GetForwardVector() * 500 + ,false + ,hero + ,hero + ,hero:GetTeam() + ) + if unit ~= nil then + FindClearSpaceForUnit(unit, unit:GetOrigin(), false) + unit:SetControllableByPlayer(hero:GetPlayerOwnerID(), false) + unit:SetOwner(hero) + unit:SetHasInventory(true) + unit:FindAbilityByName("reimu_pet_01"):CastAbility() + + local items = {"item_3003", "item_3004", "item_3007"} + for _,itemName in pairs(items) do + local item = CreateItem(itemName, nil, nil) + if item ~= nil then + item.owner_player_id = hero.thtd_player_id + unit:AddItem(item) + end + end + + local reimu_pet_sound = + { + "UI.Aowu", + "Icewrack_Pup.Ult.Howl", + "Icewrack_Pup.Flee", + "Icewrack_Pup.idle_alt_bark", + "Icewrack_Pup.Alert", + "Icewrack_Pup.Happy", + "Icewrack_Pup.Breath", + } + + unit:SetContextThink(DoUniqueString("reimu_pet_think"), + function() + if unit:IsStunned() then return nil end + THTD_ModifyGoldEx(playerId) + + local point = unit.pet_point + if point == nil then + point = hero:GetAbsOrigin() + end + local d = GetDistanceBetweenTwoVec2D(point, unit:GetOrigin()) + if d > 1800 then + if unit:IsStunned() then return nil end + FindClearSpaceForUnit(unit, point + hero:GetForwardVector() * 500, false) + unit:EmitSound("Sound_THTD.ability_touhoutd_blink.End") + return 1.0 + elseif d > 1200 then + local forward = (unit:GetAbsOrigin() - point):Normalized() + unit:MoveToPosition(point + forward * 500) + return 1.0 + else + if RollPercentage(85) then return 1.0 end + local rad = RandomInt(1, 360) + local distance = RandomInt(500, 1180) + local moveToPoint = point + + Vector( + math.cos(rad * math.pi/180) * distance, + math.sin(rad * math.pi/180) * distance, + 0) + unit:MoveToPosition(moveToPoint) + if RollPercentage(10) then + unit:EmitSound(reimu_pet_sound[RandomInt(1, #reimu_pet_sound)]) + end + end + return 1.0 + end, + 1.0) + hero.reimu_pet = unit + end + + return + end +end + + +function CTHTDGameMode:OnEntityKilled(keys) + if keys.entindex_killed == nil or keys.entindex_attacker == nil then return end + + -- 储存被击杀的单位 + local killedUnit = EntIndexToHScript( keys.entindex_killed ) + -- 储存杀手单位 + local killerEntity = EntIndexToHScript( keys.entindex_attacker ) + + local id = killedUnit.thtd_player_index + + local findNum = string.find(killedUnit:GetUnitName(), 'creature') + if findNum ~= nil then + if not SpawnSystem.IsUnLimited then + local expRange = 1500 + local targets = THTD_FindFriendlyUnitsInRadius(killerEntity,killedUnit:GetOrigin(),expRange) + local expUnits = {} + for k,v in pairs(targets) do + if v ~= nil and v:IsNull()==false and v:THTD_IsTower() and v:THTD_GetLevel() < THTD_MAX_LEVEL then + table.insert(expUnits,v) + end + end + targets = {} + + local factor = 1 + if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE then + factor = 1.5 + end + local totalNum = #expUnits + if totalNum > 0 then + for k,v in pairs(expUnits) do + v:THTD_AddExp(math.floor(factor * killedUnit:GetDeathXP() / totalNum + 0.5)) + end + end + end + + -- 物品掉落 + -- local vHitLoc = killedUnit:GetAttachmentOrigin(killedUnit:ScriptLookupAttachment("attach_hitloc")) + -- local drop = CreateItemOnPositionSync(vHitLoc, item) + -- drop:SetModelScale(drop:GetModelScale() * (item:THTD_GetCardQuality() or 2) * 0.5) + -- item:LaunchLootInitialHeight(false, vHitLoc.z, vHitLoc.z+300, 2.0, killedUnit:GetAbsOrigin() + RandomVector(300)) + + if killedUnit.thtd_is_outer == true then + for k,v in pairs(THTD_EntitiesRectOuter) do + if v == killedUnit then + table.remove(THTD_EntitiesRectOuter, k) + break + end + end + elseif id ~= nil then + for k,v in pairs(THTD_EntitiesRectInner[id]) do + if v == killedUnit then + table.remove(THTD_EntitiesRectInner[id], k) + break + end + end + end + + killedUnit:AddNoDraw() + + local effectIndex = ParticleManager:CreateParticle("particles/thd2/environment/death/act_hero_die.vpcf", PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, killedUnit:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, killedUnit:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + local hero = GameRules.HeroList[killerEntity:GetPlayerOwnerID()] + if hero == nil then return end + hero.thtd_game_info["creature_kill_count"] = hero.thtd_game_info["creature_kill_count"] + 1 + end +end + +function CTHTDGameMode:OnPlayerSay(keys) + -- if tostring(PlayerResource:GetSteamID(keys.playerid)) ~= GameRules.GameData.admin then return end + + local text = keys.text + if string.sub(text,1,1) ~= "-" then + return + end + + if text == "-6" then + local player = PlayerResource:GetPlayer(keys.playerid) + local hero = player:GetAssignedHero() + ParticleManager:DestroyParticleSystem(hero.thtd_emoji_effect,true) + hero.thtd_emoji_effect = ParticleManager:CreateParticle("particles/thtd/emoji/thtd_msg_hongliange.vpcf", PATTACH_OVERHEAD_FOLLOW, hero) + ParticleManager:SetParticleControlEnt(hero.thtd_emoji_effect , 0, hero, PATTACH_OVERHEAD_FOLLOW, "attach_hitloc", Vector(0,0,0), true) --灵梦用 attach_emoji + ParticleManager:SetParticleControl(hero.thtd_emoji_effect, 3, Vector(1,0,0)) + ParticleManager:DestroyParticleSystemTime(hero.thtd_emoji_effect,5.0) + return + end + if text == "-7" then + local player = PlayerResource:GetPlayer(keys.playerid) + local hero = player:GetAssignedHero() + ParticleManager:DestroyParticleSystem(hero.thtd_emoji_effect,true) + hero.thtd_emoji_effect = ParticleManager:CreateParticle("particles/thtd/emoji/thtd_msg_hongliange.vpcf", PATTACH_OVERHEAD_FOLLOW, hero) + ParticleManager:SetParticleControlEnt(hero.thtd_emoji_effect , 0, hero, PATTACH_OVERHEAD_FOLLOW, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControl(hero.thtd_emoji_effect, 3, Vector(2,0,0)) + ParticleManager:DestroyParticleSystemTime(hero.thtd_emoji_effect,5.0) + return + end + if text == "-8" then + local player = PlayerResource:GetPlayer(keys.playerid) + local hero = player:GetAssignedHero() + ParticleManager:DestroyParticleSystem(hero.thtd_emoji_effect,true) + hero.thtd_emoji_effect = ParticleManager:CreateParticle("particles/thtd/emoji/thtd_msg_hongliange.vpcf", PATTACH_OVERHEAD_FOLLOW, hero) + ParticleManager:SetParticleControlEnt(hero.thtd_emoji_effect , 0, hero, PATTACH_OVERHEAD_FOLLOW, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControl(hero.thtd_emoji_effect, 3, Vector(3,0,0)) + ParticleManager:DestroyParticleSystemTime(hero.thtd_emoji_effect,5.0) + return + end + if text == "-9" then + local player = PlayerResource:GetPlayer(keys.playerid) + local hero = player:GetAssignedHero() + ParticleManager:DestroyParticleSystem(hero.thtd_emoji_effect,true) + hero.thtd_emoji_effect = ParticleManager:CreateParticle("particles/thtd/emoji/thtd_msg_hongliange.vpcf", PATTACH_OVERHEAD_FOLLOW, hero) + ParticleManager:SetParticleControlEnt(hero.thtd_emoji_effect , 0, hero, PATTACH_OVERHEAD_FOLLOW, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControl(hero.thtd_emoji_effect, 3, Vector(4,0,0)) + ParticleManager:DestroyParticleSystemTime(hero.thtd_emoji_effect,5.0) + return + end + if text == "-0" then + local player = PlayerResource:GetPlayer(keys.playerid) + local hero = player:GetAssignedHero() + ParticleManager:DestroyParticleSystem(hero.thtd_emoji_effect,true) + hero.thtd_emoji_effect = ParticleManager:CreateParticle("particles/thtd/emoji/thtd_msg_hongliange.vpcf", PATTACH_OVERHEAD_FOLLOW, hero) + ParticleManager:SetParticleControlEnt(hero.thtd_emoji_effect , 0, hero, PATTACH_OVERHEAD_FOLLOW, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControl(hero.thtd_emoji_effect, 3, Vector(5,0,0)) + ParticleManager:DestroyParticleSystemTime(hero.thtd_emoji_effect,5.0) + return + end + + if string.sub(text,1,6) == "-color" then + local colorValue = string.sub(text, 8, 11) + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="item_locked_tip", duration=10, params={}, color=colorValue}) + return + end + + if string.sub(text,1,3) == "-id" then + GameRules:SendCustomMessage("id:"..tostring(PlayerResource:GetSteamAccountID(keys.playerid))..", steamid:"..tostring(PlayerResource:GetSteamID(keys.playerid)).."", DOTA_TEAM_GOODGUYS, 0) + return + end + + if string.sub(text,1,5) == "-date" then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(keys.playerid), "display_chat_msg", {msg="open_day_tip", params={server_time=GetRealDateTime(),start_time=GameRules.GameData.server_time,open_day_list=GameRules.GameData.open_day_list}}) + return + end + + if string.sub(text,1,4) == "-pos" then + local player = PlayerResource:GetPlayer(keys.playerid) + local hero = player:GetAssignedHero() + local pos = hero:GetAbsOrigin() + print("------- Current Position (x, y, z):") + print(math.floor(pos.x + 0.5)) + print(math.floor(pos.y + 0.5)) + print(math.floor(pos.z + 0.5)) + GameRules:SendCustomMessage("X: "..tostring(math.floor(pos.x + 0.5))..",Y:"..tostring(math.floor(pos.y + 0.5))..",Z:"..tostring(math.floor(pos.z + 0.5)), DOTA_TEAM_GOODGUYS, 0) + return + end + + if string.sub(text,1,5) == "-wave" then + local num = tonumber(string.sub(text, 7)) + if num ~= nil and num > -49 then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(keys.playerid),"thtd_command", {cmd="wave", param=num}) + end + return + end + + if string.sub(text,1,5) == "-boss" then + local num = string.sub(text, 7, 20) + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(keys.playerid),"thtd_command", {cmd="boss", param=num}) + return + end + + if string.sub(text,1,4) == "-add" then + local num = string.sub(text, 6, 9) + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(keys.playerid),"thtd_command", {cmd="add", param=num}) + return + end + + if string.sub(text,1,3) == "-tp" then + local num = string.sub(text, 5, 20) + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(keys.playerid),"thtd_command", {cmd="tp", param=num}) + return + end + + if string.sub(text,1,10) == "-clearrank" then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(keys.playerid),"thtd_command", {cmd="clearrank", param={}}) + return + end + + if string.sub(text,1,8) == "-lv" then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(keys.playerid),"thtd_command", {cmd="lv", param={}}) + return + end + + if string.sub(text,1,5) == "-test" then + if tostring(PlayerResource:GetSteamID(keys.playerid)) ~= GameRules.GameData.admin then return end + + local select_cards = {} + for i = 3011,3031 do + select_cards["item_"..tostring(i)] = "item_"..tostring(i) + end + for i = 2011,2022 do + select_cards["item_"..tostring(i)] = "item_"..tostring(i) + end + + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(keys.playerid) , "show_select_bonus_card_panel", {cards=select_cards}) + return + end + + if string.sub(text,1,5) == "-skey" then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(keys.playerid),"thtd_command", {cmd="skey", param=SERVER_KEY}) + return + end +end + + +function CTHTDGameMode:ExecuteOrder( keys ) + if table.hasvalue(SpawnSystem.GameOverPlayerId, keys.issuer_player_id_const) then return false end + + local orderUnit = EntIndexToHScript(keys.units["0"]) + if orderUnit == nil then return true end + + -- PrintTable(keys) + local order_type = keys.order_type + + if order_type == DOTA_UNIT_ORDER_ATTACK_TARGET or + order_type == DOTA_UNIT_ORDER_CAST_POSITION or + order_type == DOTA_UNIT_ORDER_CAST_TARGET or + order_type == DOTA_UNIT_ORDER_CAST_NO_TARGET or + order_type == DOTA_UNIT_ORDER_CAST_TARGET_TREE + then + orderUnit:THTD_SetAggressiveLock() + end + + if order_type == 32 then + local ability = EntIndexToHScript(keys.entindex_ability) + if ability ~= nil and ability:IsItem() then + if keys.entindex_target == 1 then + ability.locked_by_player_id = keys.issuer_player_id_const + else + local tower = ability:THTD_GetTower() + if tower ~= nil then + for i=0,8 do + local targetItem = tower:GetItemInSlot(i) + if targetItem~=nil and targetItem:IsNull()==false then + CustomGameEventManager:Send_ServerToPlayer(orderUnit:GetPlayerOwner(), "display_custom_error", {msg="card_cannot_unlock_when_having_equipment"}) + return false + end + end + end + ability.locked_by_player_id = nil + end + return true + end + return false + end + + -- if order_type == DOTA_UNIT_ORDER_MOVE_ITEM then + -- 移动储存处 + -- if keys.entindex_target >= THTD_MAX_ITEM_SLOT then + + -- end + -- return true + -- end + + if order_type == DOTA_UNIT_ORDER_SELL_ITEM then + local ability = EntIndexToHScript(keys.entindex_ability) + if ability ~= nil and ability:IsItem() then + if ability:GetAbilityName() == "item_3121" then + return false + end + if ability.disable_sell == true then + local player = PlayerResource:GetPlayer(keys.issuer_player_id_const) + if player then + CustomGameEventManager:Send_ServerToPlayer(player , "display_custom_error", {msg="item_disable_sell"} ) + end + return false + end + if ability.is_bonus_item == true then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(keys.issuer_player_id_const), "display_custom_error", {msg="start_card_cannot_be_sell"}) + return false + end + if ability.locked_by_player_id ~= nil then + local player = PlayerResource:GetPlayer(keys.issuer_player_id_const) + if player then + CustomGameEventManager:Send_ServerToPlayer(player , "display_custom_error", {msg="item_is_locked"} ) + end + return false + end + OnItemDestroyed(EntIndexToHScript(keys.units["0"]), ability, true) + end + local gold = ability:GetCost() + if gold ~= nil and gold > 0 then + gold = math.floor(gold/2) + local current_gold = PlayerResource:GetGold(keys.issuer_player_id_const) + if gold + current_gold > 99999 then + thtd_extra_gold[keys.issuer_player_id_const] = thtd_extra_gold[keys.issuer_player_id_const] + (gold - (99999-current_gold)) + THTD_RefreshExtraGold(keys.issuer_player_id_const) + elseif thtd_extra_gold[keys.issuer_player_id_const] > 0 then + local add_gold = math.min(thtd_extra_gold[keys.issuer_player_id_const], 99999-(gold+current_gold)) + thtd_extra_gold[keys.issuer_player_id_const] = thtd_extra_gold[keys.issuer_player_id_const] - add_gold + PlayerResource:ModifyGold(keys.issuer_player_id_const, add_gold, true, DOTA_ModifyGold_Unspecified) + THTD_RefreshExtraGold(keys.issuer_player_id_const) + end + end + return true + end + + if order_type == DOTA_UNIT_ORDER_GIVE_ITEM then + local item = EntIndexToHScript(keys.entindex_ability) + local target = EntIndexToHScript(keys.entindex_target) + local count = 0 + for i=0,THTD_MAX_ITEM_SLOT-1 do + local targetItem = target:GetItemInSlot(i) + if targetItem~=nil and targetItem:IsNull()==false then count = count + 1 end + end + if count >= THTD_MAX_ITEM_SLOT then + local player = PlayerResource:GetPlayer(keys.issuer_player_id_const) + if player then + CustomGameEventManager:Send_ServerToPlayer(player, "display_custom_error", {msg="not_enough_item_slot"}) + end + return false + else + return true + end + end + + if order_type == DOTA_UNIT_ORDER_DROP_ITEM then + local item = EntIndexToHScript(keys.entindex_ability) + if THTD_HasItemScale(item) then + if item.item_set_scale ~= true then + item.item_set_scale = true + local count = 600 + item:SetContextThink(DoUniqueString("item_set_scale"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if item:GetContainer() ~= nil then + THTD_ItemSetScale(item) + item.item_set_scale = nil + return nil + end + if count <= 0 then + item.item_set_scale = nil + return nil + end + count = count - 1 + return 0.1 + end, + 0.1) + end + end + return true + end + + if order_type == DOTA_UNIT_ORDER_PICKUP_ITEM then + local itemC = EntIndexToHScript(keys.entindex_target) + if itemC ~= nil then + local item = itemC:GetContainedItem() + if item ~= nil then + local itemName = item:GetAbilityName() + if itemName == "item_3101" or itemName == "item_3102" or itemName == "item_3103" then + local player = PlayerResource:GetPlayer(keys.issuer_player_id_const) + if orderUnit:IsRealHero() == false then + CustomGameEventManager:Send_ServerToPlayer(player, "display_custom_error", {msg="not_key_unit"}) + return false + end + if orderUnit:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then + CustomGameEventManager:Send_ServerToPlayer(player, "display_custom_error", {msg="not_enough_item_slot"}) + return false + end + if not orderUnit:HasItemInInventory("item_3121") then + CustomGameEventManager:Send_ServerToPlayer(player, "display_custom_error", {msg="not_has_key_item"}) + return false + end + end + end + end + end + + return true +end + + +local item_cn_name = { + ["item_2019"] = "「纳税用阴阳玉」", + ["item_2008"] = "「死神渡河船桨」", + ["item_2005"] = "「血染的太阳伞」", + ["item_2009"] = "「割夺真实之刃」", + ["item_2010"] = "「死神大镰刀」", + ["item_2011"] = "「月兔粉碎巨刃」", + ["item_2015"] = "「念缚灵的船勾」", + ["item_2016"] = "「速融的核融合棒」", + ["item_2017"] = "「恶魔的乳牙」", + ["item_2001"] = "「四次元爆蛋」", + ["item_2012"] = "「迷你八卦炉」", + ["item_2013"] = "「莱瓦汀」", + ["item_2014"] = "「神枪冈格尼尔」", + ["item_2020"] = "「高科技相机」", + ["item_3150"] = "「布都御魂」", + ["item_3151"] = "「天丛云剑」", + ["item_3152"] = "「天羽羽斩」", + ["item_3149"] = "「凤凰之灵」", + ["item_2021"] = "「千年佳酿」", +} +local item_loot = { + [1] = {"item_2021","item_2019","item_2008","item_2005"}, --R + [2] = {"item_2009","item_2010","item_2011","item_2015","item_2016","item_2017","item_2001"}, -- SR + [3] = {"item_2012","item_2013","item_2014","item_2020"}, -- SSR + [4] = {}, -- 羁绊,todo + [5] = {"item_3150", "item_3151", "item_3152"}, -- 神器 + +} +function CTHTDGameMode:ItemAddedToInventory( keys ) + local caster = EntIndexToHScript(keys.inventory_parent_entindex_const) + local hItem = EntIndexToHScript(keys.item_entindex_const) + local itemName = hItem:GetAbilityName() + + if itemName == "item_enchanted_mango" then + return false + end + + if GameRules:GetCustomGameDifficulty() == PVE_MODE then + CheckItemShare(caster, hItem) + end + + if itemName == "item_3101" or itemName == "item_3102" or itemName == "item_3103" then + local keyItem = caster:FindItemInInventory("item_3121") + if keyItem ~= nil then + keyItem:SpendCharge() + if keyItem:GetCurrentCharges() == 0 then + caster:RemoveItem(keyItem) + end + + local playerid = caster:GetPlayerOwnerID() + GameRules.PlayerData[playerid]["key_use_count"] = GameRules.PlayerData[playerid]["key_use_count"] + 1 + + if caster.first_chest_opened ~= true and GameRules.PlayerData[playerid]["is_first_win"] == 1 then + caster.first_chest_opened = true + Service:GiveDayFirstWinBonus(playerid) + else + local itemName = "" + local chance = RandomInt(1, 100) + if GameRules.PlayerData[playerid]["key_use_count"] > 100/0.05 then + chance = 101 + end + + if chance <= 35 then + itemName = item_loot[1][1] + elseif chance <= 15 + 35 then + itemName = item_loot[1][RandomInt(1, #item_loot[1])] + elseif chance <= 25 + 50 then + itemName = item_loot[2][RandomInt(1, #item_loot[2])] + elseif chance <= 12 + 75 then + itemName = item_loot[3][RandomInt(1, #item_loot[3])] + elseif chance <= 5 + 87 then + itemName = item_loot[1][1] + elseif chance <= 3 + 92 then + itemName = item_loot[5][RandomInt(1, #item_loot[5])] + else + if chance == 101 or RollPercentage(1) then + itemName = "item_3149" + GameRules.PlayerData[playerid]["key_use_count"] = 0 + else + itemName = item_loot[1][1] + end + end + local item = CreateItem(itemName, nil, nil) + if item ~= nil then + item.owner_player_id = playerid + item.disable_sell = true + item:SetPurchaser(caster) + item:SetPurchaseTime(1.0) + caster:AddItem(item) + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "thtd_server_msg", {code = "0000", msg = "获得 "..(item_cn_name[itemName] or itemName)}) + if itemName == "item_3149" then + Service:SavePowerMaxCount(playerid, true) + end + end + end + + Service:SaveKeyCount(playerid) + end + + UTIL_Remove(hItem) + return false + end + + if not caster:IsRealHero() then + local hero = caster:GetHero() + if hero ~= nil then + if itemName == "item_3150" or itemName == "item_3151" or itemName == "item_3152" then + if hero.is_team_mode ~= true then + hero.is_team_mode = true + CustomGameEventManager:Send_ServerToPlayer(hero:GetPlayerOwner(), "display_chat_msg", {msg="team_rank_tip", params={player_name=PlayerResource:GetPlayerName(hero:GetPlayerOwnerID()),reason="使用了传说武器"}}) + end + end + end + end + + return true +end + +function CheckItemShare(caster,item) + if caster == nil or item == nil then return end + if item:GetAbilityName() == "item_tpscroll" then return end + -- local cardName = item:THTD_GetCardName() + -- if cardName == "BonusEgg" or cardName == "minoriko" or cardName == "sizuha" or cardName == "lily" or cardName == "nazrin" or cardName == "toramaru" or item:THTD_GetCardQuality() == 1 then return end + + local playerId = caster:GetPlayerOwnerID() + if item.owner_player_id ~= playerId then + CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="cannot_use_others_item_in_single_mode"}) + caster:SetContextThink(DoUniqueString("thtd_pertick_gold_think"), + function() + if GameRules:IsGamePaused() then return 0.03 end + caster:DropItemAtPositionImmediate(item, caster:GetOrigin()) + return nil + end, + 0.15) + end +end + + +function CTHTDGameMode:ModifierFilter(keys) + if keys.entindex_parent_const == nil or keys.entindex_caster_const == nil then + return true + end + + local caster = EntIndexToHScript(keys.entindex_caster_const) + local unit = EntIndexToHScript(keys.entindex_parent_const) + + if unit~=nil and unit:IsNull()==false then + local modifierName = keys.name_const + + if THTD_IsUniqueSlowBuff(modifierName) == true then + if unit:THTD_HasUniqueSlowBuff() or unit:HasModifier("modifier_bosses_aya") then + return false + else + return true + end + end + + if modifierName == "modifier_faceless_void_timelock_freeze" then + local ability = EntIndexToHScript(keys.entindex_ability_const) + caster:SetContextThink(DoUniqueString("thtd_bb_3028"), + function() + local DamageTable = { + ability = ability, + victim = unit, + attacker = caster, + damage = unit:GetMaxHealth() * ability:GetSpecialValueFor("bonus_damage")/100, + damage_type = ability:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + return nil + end, + 0.3) + end + end + return true +end + + +function CTHTDGameMode:DamageFilter(keys) + -- damage: 24 + -- damagetype_const: 1 + -- entindex_attacker_const: 503 + -- entindex_inflictor_const: 500 技能,普通攻击没有这个 + -- entindex_victim_const: 434 + if keys.damage <= 0 then return false end + if keys.entindex_attacker_const == nil or keys.entindex_victim_const == nil then return true end + + local target = EntIndexToHScript(keys.entindex_victim_const) + local unit = EntIndexToHScript(keys.entindex_attacker_const) + if unit:IsRealHero() then + local health = target:GetHealth() + -- 辉夜复活 + if target:HasModifier("modifier_bosses_kaguya") and keys.damage > health then + target:SetHealth(1) + target:RemoveModifierByName("modifier_bosses_kaguya") + return false + end + -- 爱丽丝免死符 + if target:HasModifier("modifier_bosses_alice") and target.left_death_count > 0 and keys.damage >= health then + target:SetHealth(1) + target:RemoveModifierByName("modifier_bosses_alice") + return false + end + return true + end + + local DamageTable = { + ability = nil, + victim = target, + attacker = unit, + damage = keys.damage, + damage_type = keys.damagetype_const, + } + UnitDamageTarget(DamageTable, false, true) + return false +end + + +function CTHTDGameMode:OnModifyGoldFilter(keys) + -- gold: 15 + -- player_id_const: 0 + -- reason_const: 13 + -- reliable: 0 + + -- 出售和接口改变金钱不会触发,当前地图只有杀怪奖励金钱 + + if keys.gold == 0 then return true end + + if keys.gold > 0 then + if thtd_extra_gold[keys.player_id_const] == nil then + thtd_extra_gold[keys.player_id_const] = 0 + end + local current_gold = PlayerResource:GetGold(keys.player_id_const) + if current_gold + keys.gold > 99999 then + local add_gold = math.min(keys.gold, 99999-current_gold) + thtd_extra_gold[keys.player_id_const] = thtd_extra_gold[keys.player_id_const] + (keys.gold - add_gold) + keys.gold = add_gold + elseif thtd_extra_gold[keys.player_id_const] > 0 then + local add_gold = math.min(thtd_extra_gold[keys.player_id_const], 99999-(keys.gold+current_gold)) + keys.gold = keys.gold + add_gold + thtd_extra_gold[keys.player_id_const] = thtd_extra_gold[keys.player_id_const] - add_gold + end + end + + THTD_RefreshExtraGold(keys.player_id_const) + return true +end + + +function CTHTDGameMode:OnDotaNonPlayerUsedAbility(keys) + -- 字段 + -- abilityname + -- caster_entindex + + local caster = EntIndexToHScript(keys.caster_entindex) + + local unitName = caster:GetUnitName() + if unitName == "remilia" or unitName == "flandre" or unitName == "patchouli" or unitName == "sakuya" or unitName == "koakuma" or unitName == "meirin" then + local playerid = caster:GetPlayerOwnerID() + if GameRules.player_bb_buff[playerid]["item_3025"] > 0 and RollPercentage(GameRules.player_bb_buff[playerid]["item_3025"]) then + local ability = caster:FindAbilityByName(keys.abilityname) + ability:EndCooldown() + caster:GiveMana(caster:GetRealManaCost(ability)) + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/common.lua b/scripts/vscripts/common.lua new file mode 100755 index 0000000..98c782e --- /dev/null +++ b/scripts/vscripts/common.lua @@ -0,0 +1,1732 @@ +THTD_Custom_Hit_Block = {} + +function GetHeroFairyList(hero) + local fairyList = {} + local count = 0 + for k,v in pairs(hero.thtd_hero_tower_list) do + if v:GetUnitName() == "sunny" and v.thtd_combo_fairyList ~= nil then + table.insert(fairyList,v.thtd_combo_fairyList) + end + end + return fairyList +end + +function IsUnitInFairy(fairyArea,unit) + local pos1 = fairyArea.sunny:GetAbsOrigin() + local pos2 = fairyArea.star:GetAbsOrigin() + local pos3 = fairyArea.luna:GetAbsOrigin() + + local origin = unit:GetAbsOrigin() + + if IsInTriangle(pos1,pos2,pos3,origin) == true then + return true + else + return false + end +end + +function GetTriangleArea(p0,p1,p2) + local ab = Vector(p1.x - p0.x, p1.y - p0.y, 0) + local bc = Vector(p2.x - p1.x, p2.y - p1.y, 0) + return math.abs((ab.x * bc.y - ab.y * bc.x) / 2.0) +end + +function IsInTriangle(a,b,c,d) + local sabc = GetTriangleArea(a, b, c) + local sadb = GetTriangleArea(a, d, b) + local sbdc = GetTriangleArea(b, d, c) + local sadc = GetTriangleArea(a, d, c) + + local sumSuqar = sadb + sbdc + sadc + + if (-5 < (sabc - sumSuqar) and (sabc - sumSuqar) < 5) then + return true + else + return false + end +end + +--判断三点是否一条线 +function IsThreePointsOnOneLine(p1,p2,p3) + local a = math.floor(GetDistanceBetweenTwoVec2D(p1, p2) + 0.5) + local b = math.floor(GetDistanceBetweenTwoVec2D(p2, p3) + 0.5) + local c = math.floor(GetDistanceBetweenTwoVec2D(p3, p1) + 0.5) + local max = math.max(a, b, c) + if a == max and a == (b + c) then return true end + if b == max and b == (a + c) then return true end + if c == max and c == (a + b) then return true end + return false +end + +--求三角形的重心和最大半径 +function GetCircleCenterAndRadius(p1,p2,p3) + local center = Vector((p1.x + p2.x + p3.x)/3, (p1.y + p2.y + p3.y)/3, 0) + return center, math.max(math.floor(GetDistanceBetweenTwoVec2D(p1, center) + 0.5), math.floor(GetDistanceBetweenTwoVec2D(p2, center) + 0.5), math.floor(GetDistanceBetweenTwoVec2D(p3, center) + 0.5)) +end + +-- 两点连线上任意点的坐标 +function GetTwoVectorSub(pos1, pos2, p1vsp2) + --Px点到两端点的距离P1Px与PxP2比值为p1vsp2 + local x=(pos1.x + p1vsp2 * pos2.x)/(1+p1vsp2) + local y=(pos1.y + p1vsp2 * pos2.y)/(1+p1vsp2) + local z=(pos1.z + p1vsp2 * pos2.z)/(1+p1vsp2) + return Vector(x, y, z) +end + +--求三角形的外接圆圆心和半径,如果三点共线则返回nil +function GetOuterCircleCenterAndRadius(p1,p2,p3) + local a = math.floor(GetDistanceBetweenTwoVec2D(p1, p2) + 0.5) + local b = math.floor(GetDistanceBetweenTwoVec2D(p2, p3) + 0.5) + local c = math.floor(GetDistanceBetweenTwoVec2D(p3, p1) + 0.5) + + --如果在一条线上,则返回中点 + local max = math.max(a, b, c) + if a == max and a == (b + c) then + local x = (p1.x + p2.x) / 2 + local y = (p1.y + p2.y) / 2 + local r = a / 2 + return Vector(math.floor(x + 0.5),math.floor(y + 0.5),0), r + end + if b == max and b == (a + c) then + local x = (p2.x + p3.x) / 2 + local y = (p2.y + p3.y) / 2 + local r = b / 2 + return Vector(math.floor(x + 0.5),math.floor(y + 0.5),0), r + end + if c == max and c == (a + b) then + local x = (p1.x + p3.x) / 2 + local y = (p1.y + p3.y) / 2 + local r = c / 2 + return Vector(math.floor(x + 0.5),math.floor(y + 0.5),0), r + end + + --外接圆半径 + local p = (a + b +c)/2 + local s = math.sqrt(p*(p-a)*(p-b)*(p-c)) + local r = math.floor(a*b*c/(4*s) + 0.5) + + --外接圆圆心 + local x1 = p1.x + local x2 = p2.x + local x3 = p3.x + local y1 = p1.y + local y2 = p2.y + local y3 = p3.y + local t1 = x1*x1+y1*y1 + local t2 = x2*x2+y2*y2 + local t3 = x3*x3+y3*y3 + local temp = x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2 + local x = (t2*y3+t1*y2+t3*y1-t2*y1-t3*y2-t1*y3)/temp/2 + local y = (t3*x2+t2*x1+t1*x3-t1*x2-t2*x3-t3*x1)/temp/2 + + return Vector(math.floor(x + 0.5),math.floor(y + 0.5),0), r +end + +--求三角形的内接圆圆心和半径 +function GetInnerCircleCenterAndRadius(p0,p1,p2) + local x1 = p0.x + local x2 = p1.x + local x3 = p2.x + local y1 = p0.y + local y2 = p1.y + local y3 = p2.y + + local x=((y2-y1)*(y3*y3-y1*y1+x3*x3-x1*x1)-(y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1))/(2*(x3-x1)*(y2-y1)-2*((x2-x1)*(y3-y1))) + local y=((x2-x1)*(x3*x3-x1*x1+y3*y3-y1*y1)-(x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1))/(2*(y3-y1)*(x2-x1)-2*((y2-y1)*(x3-x1))) + + local radius = math.sqrt((p0.x - x)*(p0.x - x) + (p0.y - y)*(p0.y - y)) + + return Vector(x,y,0),radius +end + +-- 获取各刷怪路线的偏移位置,x, y 为偏移量,增长方向默认为左右集中,一致向下 +function GetSpawnLineOffsetVector(lineid,vec,x,y) + -- lineid从左上顺时针 + if lineid == 2 or lineid == 3 then + return vec + Vector(-x,-y,0) + else + return vec + Vector(x,-y,0) + end +end + +-- 判断点在直线哪一边,-1为AB的左侧,1为右侧 +function PointToLineSide(point, vecA, vecB) + local a = vecB.y - vecA.y + local b = vecA.x - vecB.x + local c = vecB.x * vecA.y - vecA.x * vecB.y + local v = a * point.x + b * point.y + c + + if v < 0 then + return -1 + elseif v > 0 then + return 1 + else + return 0 + end +end + +-- 是否在三角形内 +function IsPointInTriangle(point, vecA, vecB, vecC) + local d1 = PointToLineSide(point, vecA, vecB) + local d2 = PointToLineSide(point, vecB, vecC) + local d3 = PointToLineSide(point, vecC, vecA) + return (d1 * d2 > 0) and (d2 * d3 > 0) +end + +-- 点是否在直线AB左边,右手掌指向线段,大拇指方向 +function IsLeftToLineSide(point, vecA, vecB) + return (vecB.x - vecA.x) * (point.y - vecA.y) > (point.x - vecA.x) * (vecB.y - vecA.y) +end + +-- 点是否在三角形内 +function IsPointInTriangle2(point, vecA, vecB, VecC) + local x = point.x + local y = point.y + local ax = vecA.x + local ay = vecA.y + local bx = vecB.x + local by = vecB.y + local cx = VecC.x + local cy = VecC.y + if (bx - ax) * (y - ay) > (by - ay) * (x - ax) and (cx - bx) * (y - by) > (cy - by) * (x - bx) and (ax - cx) * (y - cy) > (ay - cy) * (x - cx) then + return false + else + return true + end +end + +-- 计算点与A、B两点形成的角度,即形成三角形中点所在顶点的角度 +function GetAngle(point, vecA, vecB) + local a = (point - vecA):Length2D() + local b = (vecA - vecB):Length2D() + local c = (point - vecB):Length2D() + + -- 计算弧度表示的角 + local rad = math.acos((a*a + c*c - b*b)/(2.0*a*c)); + -- 用角度表示的角 + return 180*rad/math.pi +end + +-- /** +-- * 点到线的最短距离实际上就是点到线的垂直距离。 +-- * (x,y)为点的坐标 +-- * (x1,y1)为线段上点的坐标 +-- * (x2,y2)为线段另外一点的坐标 +-- * 将点连接上两个线段的 +-- */ +function GetLengthPointToLine(point, vecA, vecB) + local x = point.x + local y = point.y + local x1 = vecA.x + local y1 = vecA.y + local x2 = vecB.x + local y2 = vecB.y + -- 三角形三个边长 + local A = math.abs(math.sqrt(math.pow((x - x1), 2) + math.pow((y - y1), 2))) + local B = math.abs(math.sqrt(math.pow((x - x2), 2) + math.pow((y - y2), 2))) + local C = math.abs(math.sqrt(math.pow((x1 - x2), 2) + math.pow((y1 - y2), 2))) + -- 利用海伦公式计算三角形面积 + -- 周长的一半 + local P = (A + B + C) / 2 + local allArea = math.abs(math.sqrt(P * (P - A) * (P - B) * (P - C))) + -- 普通公式计算三角形面积反推点到线的垂直距离 + local dis = (2 * allArea) / C + return dis +end + +-------------------------------------------------------------------------------- + +-- 判断单位是否有效,即非空、存活、激活 +function THTD_IsValid(unit) + if unit ~= nil and unit:IsNull() == false and unit:IsAlive() and unit:HasModifier("modifier_touhoutd_release_hidden") == false then + return true + else + return false + end +end + +-- 判断是否有效且存活 +function IsValidAlive(unit) + if unit ~= nil and unit:IsNull() == false and unit:IsAlive() then + return true + else + return false + end +end + +-------------------------------------------------------------------------------- + +-- PlayerResource:ModifyGold 强化版,超出金钱将保存 +thtd_extra_gold = {[0] = 0,[1] = 0,[2] = 0,[3] = 0} +function THTD_ModifyGoldEx(playerid, gold, reliable, flag) + if flag == nil then flag = DOTA_ModifyGold_Unspecified end + if reliable ~= false then reliable = true end + + if thtd_extra_gold[playerid] == nil then + thtd_extra_gold[playerid] = 0 + end + + local current_gold = PlayerResource:GetGold(playerid) + if gold ~= nil then + local add_gold = gold + if current_gold + gold > 99999 then + add_gold = math.min(gold, 99999-current_gold) + thtd_extra_gold[playerid] = thtd_extra_gold[playerid] + (gold - add_gold) + elseif thtd_extra_gold[playerid] > 0 then + add_gold = math.min(thtd_extra_gold[playerid], 99999-(gold+current_gold)) + thtd_extra_gold[playerid] = thtd_extra_gold[playerid] - add_gold + end + PlayerResource:ModifyGold(playerid, add_gold, reliable, flag) + else + if current_gold < 99999 and thtd_extra_gold[playerid] > 0 then + local move_gold = math.min(99999 - current_gold, thtd_extra_gold[playerid]) + thtd_extra_gold[playerid] = thtd_extra_gold[playerid] - move_gold + PlayerResource:ModifyGold(playerid, move_gold, true, flag) + end + end + THTD_RefreshExtraGold(playerid) +end + +-- 刷新超出上限金钱显示 +function THTD_RefreshExtraGold(playerid) + PlayerResource:SetLastBuybackTime(playerid, thtd_extra_gold[playerid] or 0) +end + +-- 获取总金钱 +function CDOTA_BaseNPC:GetGold() + local playerid = self:GetPlayerOwnerID() + if PlayerResource:IsValidPlayerID(playerid) then + return PlayerResource:GetGold(playerid) + (thtd_extra_gold[playerid] or 0) + else + return 0 + end +end + +-------------------------------------------------------------------------------- + +function THTD_IsTempleOfGodTower(unit) + local unitName = unit:GetUnitName() + if unitName == "miko" or unitName == "soga" or unitName == "futo" or unitName == "yoshika" or unitName == "seiga" then + return true + else + return false + end +end + +function THTD_IsTempleOfGodCanBuffedTower(unit) + local unitName = unit:GetUnitName() + if unitName == "soga" or unitName == "futo" or unitName == "yoshika" or unitName == "seiga" then + return true + else + return false + end +end + +function THTD_GetTempleOfGodBuffedTowerStarCount(caster) + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero == nil then return 0 end + + local star = 0 + for k,v in pairs(hero.thtd_hero_tower_list) do + if THTD_IsValid(v) and THTD_IsTempleOfGodTower(v) then + if v:HasModifier("modifier_miko_02_buff") or v:GetUnitName() == "miko" then + star = star + v:THTD_GetStar() + end + end + end + return star +end + +-------------------------------------------------------------------------------- + +-- 是否星莲船单位 +function THTD_IsStarLotusTower(unit) + local unitName = unit:GetUnitName() + if unitName == "byakuren" or unitName == "nazrin" or unitName == "toramaru" or unitName == "minamitsu" or unitName == "nue" or unitName == "kogasa" or unitName == "kyouko" then + return true + else + return false + end +end + +-- 获取教徒数量,教徒不包括圣白莲 +function THTD_GetStarLotusBuffedTowerCount(caster) + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero == nil then return 0 end + + local count = 0 + for k,v in pairs(hero.thtd_hero_tower_list) do + if v:GetUnitName() ~= "byakuren" and THTD_IsStarLotusTower(v) then + if v:HasModifier("modifier_byakuren_03_buff") then + count = count + 1 + end + end + end + return count +end + +-- 获取星莲船单位数量 +function THTD_GetStarLotusTowerCount(caster) + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero == nil then return 0 end + + local count = 0 + for k,v in pairs(hero.thtd_hero_tower_list) do + if THTD_IsStarLotusTower(v) then + count = count + 1 + end + end + return count +end + +-------------------------------------------------------------------------------- + +function THTD_FindFriendlyUnitsAll(caster) + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero == nil then return {} end + + return hero.thtd_hero_tower_list +end + +function THTD_FindFriendlyUnitsInRadius(caster,point,radius) + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero == nil then return {} end + + local targets = {} + for k,v in pairs(hero.thtd_hero_tower_list) do + if THTD_IsValid(v) then + if GetDistanceBetweenTwoVec2D(v:GetOrigin(), point) < radius then + table.insert(targets,v) + end + end + end + return targets +end + +function THTD_FindUnitsInRadius(caster,point,radius) + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero == nil then return {} end + + + local id = hero.thtd_player_id + local targets = {} + if id ~= nil then + for k,v in pairs(THTD_EntitiesRectInner[id]) do + if THTD_IsValid(v) and v.thtd_is_outer ~= true then + if GetDistanceBetweenTwoVec2D(v:GetOrigin(), point) < radius then + if v.thtd_is_yukari_01_hidden ~= true then + table.insert(targets,v) + end + end + end + end + + if not(point.x+radius < 4432 and point.x-radius > -4432 and point.y+radius < 3896 and point.y-radius > -3896) then + for k,v in pairs(THTD_EntitiesRectOuter) do + if THTD_IsValid(v) then + if GetDistanceBetweenTwoVec2D(v:GetOrigin(), point) < radius then + if v.thtd_is_yukari_01_hidden ~= true then + table.insert(targets,v) + end + end + end + end + end + end + return targets +end + +function THTD_FindUnitsAll(caster) + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero == nil then return {} end + + local id = hero.thtd_player_id + local targets = {} + if id ~= nil then + for k,v in pairs(THTD_EntitiesRectInner[id]) do + if THTD_IsValid(v) and v.thtd_is_outer ~= true then + if v.thtd_is_yukari_01_hidden ~= true then + table.insert(targets,v) + end + end + end + + for k,v in pairs(THTD_EntitiesRectOuter) do + if THTD_IsValid(v) then + if v.thtd_is_yukari_01_hidden ~= true then + table.insert(targets,v) + end + end + end + end + return targets +end + +function THTD_FindUnitsInner(caster) + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero == nil then + print("------- THTD_FindUnitsInner : hero is nil, caster : "..caster:GetUnitName()) + return {} + end + + local id = hero.thtd_player_id + local targets = {} + if id ~= nil then + for k,v in pairs(THTD_EntitiesRectInner[id]) do + if THTD_IsValid(v) and v.thtd_is_outer ~= true then + if v.thtd_is_yukari_01_hidden ~= true then + table.insert(targets,v) + end + end + end + end + return targets +end + +function THTD_FindUnitsOuter(caster) + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero == nil then return {} end + + local id = hero.thtd_player_id + local targets = {} + if id ~= nil then + for k,v in pairs(THTD_EntitiesRectOuter) do + if THTD_IsValid(v) then + if v.thtd_is_yukari_01_hidden ~= true then + table.insert(targets,v) + end + end + end + end + return targets +end + +function THTD_HasUnitsInRadius(caster,point,radius) + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero == nil then return false end + + local id = hero.thtd_player_id + if id ~= nil then + for k,v in pairs(THTD_EntitiesRectInner[id]) do + if THTD_IsValid(v) then + if GetDistanceBetweenTwoVec2D(v:GetOrigin(), point) < radius then + if v.thtd_is_yukari_01_hidden ~= true then + return true + end + end + end + end + + if not(point.x+radius < 4432 and point.x-radius > -4432 and point.y+radius < 3896 and point.y-radius > -3896) then + for k,v in pairs(THTD_EntitiesRectOuter) do + if THTD_IsValid(v) then + if GetDistanceBetweenTwoVec2D(v:GetOrigin(), point) < radius then + if v.thtd_is_yukari_01_hidden ~= true then + return true + end + end + end + end + end + end + + return false +end + +function THTD_IsUnitInGroup(unit,group) + for k,v in pairs(group) do + if v == unit then + return true + end + end + return false +end + +-------------------------------------------------------------------------------- + +-- _print = print +-- function print(str,value) +-- if PlayerResource ~= nil and tostring(PlayerResource:GetSteamID(0)) == string.decode("EE54BFF625C40D3D05AB039344290EA2A1","9527") then +-- _print(str, value) +-- end +-- end +-- _PrintTable = PrintTable +-- function PrintTable(t, indent, done) +-- if PlayerResource ~= nil and tostring(PlayerResource:GetSteamID(0)) == string.decode("EE54BFF625C40D3D05AB039344290EA2A1","9527") then +-- _PrintTable(t, indent, done) +-- end +-- end +-- _DeepPrintTable = DeepPrintTable +-- function DeepPrintTable(t) +-- if PlayerResource ~= nil and tostring(PlayerResource:GetSteamID(0)) == string.decode("EE54BFF625C40D3D05AB039344290EA2A1","9527") then +-- _DeepPrintTable(t) +-- end +-- end + + +function UnitStunTarget(caster,target,stuntime) + if target:HasModifier("modifier_bosses_random_resist_effect") then + target:AddNewModifier(caster, nil, "modifier_stunned", {duration=stuntime * 0.75}) + else + target:AddNewModifier(caster, nil, "modifier_stunned", {duration=stuntime}) + end +end + +function UnitNoPathingfix(caster,target,duration) + target:AddNewModifier(caster, nil, "modifier_spectre_spectral_dagger_path_phased", {duration=duration}) +end + +-------------------------------------------------------------------------------- + +function GetDistanceBetweenTwoVec2D(a, b) + local xx = (a.x-b.x) + local yy = (a.y-b.y) + return math.sqrt(xx*xx + yy*yy) +end + +function GetDistanceBetweenTwoEntity(ent1,ent2) + local pos_1=ent1:GetOrigin() + local pos_2=ent2:GetOrigin() + local x_=(pos_1[1]-pos_2[1])^2 + local y_=(pos_1[2]-pos_2[2])^2 + local dis=(x_+y_)^(0.5) + return dis +end + +function GetRadBetweenTwoVec2D(a,b) + local y = b.y - a.y + local x = b.x - a.x + return math.atan2(y,x) +end + +function GetRadBetweenTwoVecZ3D(a,b) + local y = b.y - a.y + local x = b.x - a.x + local z = b.z - a.z + local s = math.sqrt(x*x + y*y) + return math.atan2(z,s) +end + +--aVec:原点向量 +--rectOrigin:单位原点向量 +--rectWidth:矩形宽度 +--rectLenth:矩形长度 +--rectRad:矩形相对Y轴旋转角度 +function IsRadInRect(aVec,rectOrigin,rectWidth,rectLenth,rectRad) + local aRad = GetRadBetweenTwoVec2D(rectOrigin,aVec) + local turnRad = aRad + (math.pi/2 - rectRad) + local aRadius = GetDistanceBetweenTwoVec2D(rectOrigin,aVec) + local turnX = aRadius*math.cos(turnRad) + local turnY = aRadius*math.sin(turnRad) + local maxX = rectWidth/2 + local minX = -rectWidth/2 + local maxY = rectLenth + local minY = 0 + if(turnXminX and turnY>minY and turnY r) then + return false + end + + local vec = Vector(dx,dy,0):Normalized() + return math.acos(vec.x * ux + vec.y * uy) < theta +end + +--删除table中的table,第二个参数为子表 +function TableRemoveSubTable(table_1 , table_2) + for i,v in pairs(table_1) do + if v == table_2 then + table.remove(table_1,i) + return + end + end +end + +GameRules.AbilityBehavior = { + DOTA_ABILITY_BEHAVIOR_ATTACK, + DOTA_ABILITY_BEHAVIOR_AURA, + DOTA_ABILITY_BEHAVIOR_AUTOCAST, + DOTA_ABILITY_BEHAVIOR_CHANNELLED, + DOTA_ABILITY_BEHAVIOR_DIRECTIONAL, + DOTA_ABILITY_BEHAVIOR_DONT_ALERT_TARGET, + DOTA_ABILITY_BEHAVIOR_DONT_CANCEL_MOVEMENT, + DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK, + DOTA_ABILITY_BEHAVIOR_DONT_RESUME_MOVEMENT, + DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING, + DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL, + DOTA_ABILITY_BEHAVIOR_IGNORE_PSEUDO_QUEUE, + DOTA_ABILITY_BEHAVIOR_IGNORE_TURN , + DOTA_ABILITY_BEHAVIOR_IMMEDIATE, + DOTA_ABILITY_BEHAVIOR_ITEM, + DOTA_ABILITY_BEHAVIOR_NOASSIST, + DOTA_ABILITY_BEHAVIOR_NONE, + DOTA_ABILITY_BEHAVIOR_NORMAL_WHEN_STOLEN, + DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE, + DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES, + DOTA_ABILITY_BEHAVIOR_RUNE_TARGET, + DOTA_ABILITY_BEHAVIOR_UNRESTRICTED , +} + +--判断单体技能 +function CDOTABaseAbility:IsUnitTarget() + local b = self:GetBehavior() + + if self:IsHidden() then b = b - 1 end + for k,v in pairs(GameRules.AbilityBehavior) do + repeat + if v == 0 then break end + b = b % v + until true + end + + if (b - DOTA_ABILITY_BEHAVIOR_AOE) == DOTA_ABILITY_BEHAVIOR_UNIT_TARGET then + b = b - DOTA_ABILITY_BEHAVIOR_AOE + end + + if b == DOTA_ABILITY_BEHAVIOR_UNIT_TARGET then + return true + end + return false +end + +--判断点目标技能 +function CDOTABaseAbility:IsPoint( ) + local b = self:GetBehavior() + + return bit.band(b,DOTA_ABILITY_BEHAVIOR_POINT) == DOTA_ABILITY_BEHAVIOR_POINT +end + +--判断无目标技能 +function CDOTABaseAbility:IsNoTarget( ) + local b = self:GetBehavior() + + return bit.band(b,DOTA_ABILITY_BEHAVIOR_NO_TARGET) == DOTA_ABILITY_BEHAVIOR_NO_TARGET +end + +--通用方法之添加技能,传入单位(实体)、技能名(必传)、等级(默认1) +function AddAbilityAndSetLevel(u,a,l) + if l == nil then + l = 1 + end + if u == nil or u:IsNull() then + return + end + if u:FindAbilityByName(a) == nil then + u:AddAbility(a) + if u:FindAbilityByName(a) ~= nil then + u:FindAbilityByName(a):SetLevel(l) + end + else + u:FindAbilityByName(a):SetLevel(l) + end +end + +--增加buff,支持lua和技能的,如果存在则刷新,否则创建。sourceAbility为可选(lua的buff输入nil) +function CDOTA_BaseNPC:AddModifier(caster, sourceAbility, modifierName, duration, stackCount) + local modifier = self:FindModifierByName(modifierName) + if modifier ~= nil then + if duration ~= nil and duration > 0 then + modifier:SetDuration(duration, false) + end + else + if duration ~= nil and duration > 0 then + modifier = self:AddNewModifier(caster, sourceAbility, modifierName, {Duration = duration}) + else + modifier = self:AddNewModifier(caster, sourceAbility, modifierName, nil) + end + end + if stackCount ~= nil and stackCount > 0 and modifier ~= nil then + modifier:SetStackCount(stackCount) + end + return modifier +end + +-- 获取技能设定值,在技能的 AbilitySpecial 中定义,isConvertPercent 为是否将百分比的转为化对应小数 +function CDOTA_BaseNPC:GetAbilityValue(abilityName, itemName, isConvertPercent) + local ability = self:FindAbilityByName(abilityName) + if ability == nil then + print("---------- GetAbilityValue Error!") + print(abilityName..": ability for "..self:GetUnitName().." is nil") + return 0 + end + + -- 如果没有定义,则 v 等于0不会等于nil + local v = ability:GetSpecialValueFor(itemName) + if isConvertPercent == true then + return v / 100 + else + return v + end +end + +-------------------------------------------------------------------------------- + +--弹射函数 +--用于检测是否被此次弹射命中过 +function CatapultFindImpact( unit,str ) + for i,v in pairs(unit.CatapultImpact) do + if v == str then + return true + end + end + return false +end + +--caster是施法者或者主要来源 +--target是第一个目标 +--ability是技能来源 +--effectName是弹射的投射物 +--move_speed是投射物的速率 +--doge是表示能否被躲掉 +--radius是每次弹射的范围 +--count是弹射次数 +--teams,types,flags获取单位的三剑客 +--find_tpye是单位组按远近或者随机排列 +-- FIND_CLOSEST +-- FIND_FARTHEST +-- FIND_UNITS_EVERYWHERE +function Catapult( caster,target,ability,effectName,move_speed,radius,count,teams,types,flags,find_tpye ) + print("Run Catapult") + + local old_target = caster + + --生成独立的字符串 + local str = DoUniqueString(ability:GetAbilityName()) + print("Catapult:"..str) + + --假设一个马甲 + local unit = {} + + --绑定信息 + --是否发射下一个投射物 + unit.CatapultNext = false + unit.count_num = 0 + --本次弹射标识的字符串 + unit.CatapultThisProjectile = str + unit.old_target = old_target + --本次弹射的目标 + unit.CatapultThisTarget = target + + --CatapultUnit用来存储unit + if caster.CatapultUnit == nil then + caster.CatapultUnit = {} + end + + --把unit插入CatapultUnit + table.insert(caster.CatapultUnit,unit) + + --用于决定是否发射投射物 + local fire = true + + --弹射最大次数 + local count_num = 0 + + GameRules:GetGameModeEntity():SetContextThink(str, + function( ) + + --满足达到最大弹射次数删除计时器 + if count_num>=count then + print("Catapult impact :"..count_num) + print("Catapult:"..str.." is over") + return nil + end + + + if unit.CatapultNext then + + --获取单位组 + local group = THTD_FindUnitsInRadius(caster,target:GetOrigin(),radius) + + --用于计算循环次数 + local num = 0 + for i=1,#group do + if group[i].CatapultImpact == nil then + group[i].CatapultImpact = {} + end + + --判断是否命中 + local impact = CatapultFindImpact(group[i],str) + + if impact == false then + + --替换old_target + old_target = target + + --新target + target = group[i] + + --可以发射新投射物 + fire = true + unit.count_num = count_num + --等待下一个目标 + unit.old_target = old_target + unit.CatapultNext =false + + --锁定当前目标 + unit.CatapultThisTarget = target + break + end + num = num + 1 + end + + --如果大于等于单位组的数量那么就删除计时器 + if num >= #group then + --从CatapultUnit中删除unit + TableRemoveSubTable(caster.CatapultUnit,unit) + + print("Catapult impact :"..count_num) + print("Catapult:"..str.." is over") + return nil + end + end + + --发射投射物 + if fire then + fire = false + count_num = count_num + 1 + local info = + { + Target = target, + Source = old_target, + Ability = ability, + EffectName = effectName, + bDodgeable = false, + iMoveSpeed = move_speed, + bProvidesVision = true, + iVisionRadius = 300, + iVisionTeamNumber = caster:GetTeamNumber(), + iSourceAttachment = DOTA_PROJECTILE_ATTACHMENT_ATTACK_1 + } + projectile = ProjectileManager:CreateTrackingProjectile(info) + end + + return 0.05 + end,0) +end + +--此函数在KV里面用OnProjectileHitUnit调用 +function CatapultImpact( keys ) + local caster = keys.caster + local target = keys.target + + --防止意外 + if caster.CatapultUnit == nil then + caster.CatapultUnit = {} + end + if target.CatapultImpact == nil then + target.CatapultImpact = {} + end + + --挨个检测是否是弹射的目标 + for i,v in pairs(caster.CatapultUnit) do + + if v.CatapultThisProjectile ~= nil and v.CatapultThisTarget ~= nil then + + if v.CatapultThisTarget == target then + + --标记target被CatapultThisProjectile命中 + table.insert(target.CatapultImpact,v.CatapultThisProjectile) + + --允许发射下一次投射物 + v.CatapultNext = true + return + end + + end + end +end + +-------------------------------------------------------------------------------- + +function ParticleManager:DestroyParticleSystem(effectIndex, bool) + if effectIndex==nil then return end + if bool == true then + ParticleManager:DestroyParticle(effectIndex,true) + ParticleManager:ReleaseParticleIndex(effectIndex) + else + Timer.Wait 'Effect_Destroy_Particle' (4, + function() + ParticleManager:DestroyParticle(effectIndex,true) + ParticleManager:ReleaseParticleIndex(effectIndex) + end + ) + end +end + +function ParticleManager:DestroyParticleSystemTime(effectIndex,time) + if effectIndex==nil then return end + Timer.Wait 'Effect_Destroy_Particle_Time' (time, + function() + ParticleManager:DestroyParticle(effectIndex,true) + ParticleManager:ReleaseParticleIndex(effectIndex) + end + ) +end + +function ParticleManager:DestroyParticleSystemTimeFalse(effectIndex,time) + if effectIndex==nil then return end + Timer.Wait 'Effect_Destroy_Particle_Time' (time, + function() + ParticleManager:DestroyParticle(effectIndex,false) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + ) +end + +function ParticleManager:DestroyLinearProjectileSystem(effectIndex,bool) + if effectIndex==nil then return end + if(bool)then + ProjectileManager:DestroyLinearProjectile(effectIndex) + else + Timer.Wait 'Effect_Destroy_Particle' (8, + function() + if effectIndex==nil then return end + ProjectileManager:DestroyLinearProjectile(effectIndex) + end + ) + end +end + +function ParticleManager:DestroyLinearProjectileSystemTime(effectIndex,time) + if effectIndex==nil then return end + Timer.Wait 'Effect_Destroy_Particle_Time' (time, + function() + if effectIndex==nil then return end + ProjectileManager:DestroyLinearProjectile(effectIndex) + end + ) +end + + +function CreateProjectileMoveToTargetPoint(projectileTable,caster,speed,acceleration1,acceleration2,func) + local effectIndex = ParticleManager:CreateParticle(projectileTable.EffectName, PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControlForward(effectIndex,3,projectileTable.vVelocity:Normalized()) + + local acceleration = acceleration1 + local ability = projectileTable.Ability + local targets = {} + local targets_remove = {} + local dis = 0 + local reflexCount = 0 + local pString = DoUniqueString("projectile_string") + local high = projectileTable.vSpawnOriginNew.z - GetGroundHeight(projectileTable.vSpawnOriginNew, nil) + local fixedTime = 10.0 + local count = 0 + + caster:SetContextThink(DoUniqueString("ability_caster_projectile"), + function() + if GameRules:IsGamePaused() then return 0.03 end + + local vec = projectileTable.vSpawnOriginNew + projectileTable.vVelocity*speed/50 + dis = dis + speed/50 + + -- 是否反射 + if projectileTable.bReflexByBlock~=nil and projectileTable.bReflexByBlock==true then + --if GridNav:CanFindPath(projectileTable.vSpawnOriginNew,projectileTable.vSpawnOriginNew + projectileTable.vVelocity*speed/50)==false or GetHitCustomBlock(projectileTable.vSpawnOriginNew,projectileTable.vSpawnOriginNew + projectileTable.vVelocity*speed/50)~=nil then + if GetHitCustomBlock(projectileTable.vSpawnOriginNew,projectileTable.vSpawnOriginNew + projectileTable.vVelocity*speed/50)~=nil then + local inRad = GetRadBetweenTwoVec2D(vec,projectileTable.vSpawnOriginNew) + local blockRad = GetBlockTurning(inRad,projectileTable.vSpawnOriginNew) + projectileTable.vVelocity = Vector(math.cos(inRad-blockRad+math.pi),math.sin(inRad-blockRad+math.pi),0) + vec = projectileTable.vSpawnOriginNew + projectileTable.vVelocity*speed/50 + ParticleManager:SetParticleControlForward(effectIndex,3,projectileTable.vVelocity:Normalized()) + reflexCount = reflexCount + 1 + for k,v in pairs(targets_remove) do + if v:GetContext(pString)~=0 then + v:SetContextNum(pString,0,0) + table.remove(targets_remove,k) + end + end + end + end + + -- 是否判断击中墙壁 + if projectileTable.bStopByBlock~=nil and projectileTable.bStopByBlock==true then + if GridNav:CanFindPath(projectileTable.vSpawnOriginNew,projectileTable.vSpawnOriginNew + projectileTable.vVelocity*speed/50)==false then + if(projectileTable.bDeleteOnHit)then + if func then func(nil,vec) end + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + else + if func then func(nil,vec) end + end + end + end + + targets = THTD_FindUnitsInRadius(caster,vec,projectileTable.fStartRadius) + + if(targets[1]~=nil)then + if(projectileTable.bDeleteOnHit)then + if func then func(targets[1],vec,reflexCount) end + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + elseif(projectileTable.bDeleteOnHit==false)then + for k,v in pairs(targets) do + if v:GetContext(pString)~=1 then + v:SetContextNum(pString,1,0) + table.insert(targets_remove,v) + if func then func(v,vec,reflexCount) end + end + end + end + end + + if(speed <= 0 and acceleration2 ~= 0)then + acceleration = acceleration2 + speed = 0 + acceleration2 = 0 + end + + fixedTime = fixedTime - 0.02 + if(dis 0)then + ParticleManager:SetParticleControl(effectIndex,3,Vector(vec.x,vec.y,GetGroundHeight(vec, nil)+high)) + projectileTable.vSpawnOriginNew = vec + speed = speed + acceleration + return 0.02 + else + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + end, + 0.02) +end + +function CreateProjectileMoveToPoint(projectileTable,caster,targetPoint,speed,iVelocity,acceleration,func) + local effectIndex = ParticleManager:CreateParticle(projectileTable.EffectName, PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControlForward(effectIndex,3,(projectileTable.vVelocity*iVelocity/50 + speed/50 * (targetPoint - caster:GetOrigin()):Normalized()):Normalized()) + + local ability = projectileTable.Ability + local targets = {} + local targets_remove = {} + local totalDistance = 0 + + caster:SetContextThink(DoUniqueString("ability_caster_projectile"), + function() + if GameRules:IsGamePaused() then return 0.03 end + + -- 向心力单位向量 + local vecCentripetal = (projectileTable.vSpawnOriginNew - targetPoint):Normalized() + + -- 向心力 + local forceCentripetal = speed/50 + + -- 初速度单位向量 + local vecInVelocity = projectileTable.vVelocity + + -- 初始力 + local forceIn = iVelocity/50 + + -- 投射物矢量 + local vecProjectile = vecInVelocity * forceIn + forceCentripetal * vecCentripetal + + local vec = projectileTable.vSpawnOriginNew + vecProjectile + + -- 投射物单位向量 + local particleForward = vecProjectile:Normalized() + + -- 目标和投射物距离 + local dis = GetDistanceBetweenTwoVec2D(targetPoint,vec) + + ParticleManager:SetParticleControlForward(effectIndex,3,particleForward) + + totalDistance = totalDistance + math.sqrt(forceIn*forceIn + forceCentripetal*forceCentripetal) + + if(dis=projectileTable.fEndRadius)then + ParticleManager:SetParticleControl(effectIndex,3,vec) + projectileTable.vSpawnOriginNew = vec + speed = speed + acceleration + return 0.02 + else + if func then func(projectileTable.vSpawnOriginNew) end + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + end, + 0.02) +end + +function CreateProjectileMoveToTarget(projectileTable,caster,target,speed,iVelocity,acceleration,func) + local effectIndex = ParticleManager:CreateParticle(projectileTable.EffectName, PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControlForward(effectIndex,3,(projectileTable.vVelocity*iVelocity/50 + speed/50 * (target:GetOrigin() - caster:GetOrigin()):Normalized()):Normalized()) + + local ability = projectileTable.Ability + local targets = {} + local targets_remove = {} + local totalDistance = 0 + + caster:SetContextThink(DoUniqueString("ability_caster_projectile"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if target:IsNull() or target==nil then + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + + -- 向心力单位向量 + local vecCentripetal = (projectileTable.vSpawnOriginNew - target:GetOrigin()):Normalized() + + -- 向心力 + local forceCentripetal = speed/50 + + -- 初速度单位向量 + local vecInVelocity = projectileTable.vVelocity + + -- 初始力 + local forceIn = iVelocity/50 + + -- 投射物矢量 + local vecProjectile = vecInVelocity * forceIn + forceCentripetal * vecCentripetal + + local vec = projectileTable.vSpawnOriginNew + vecProjectile + + -- 投射物单位向量 + local particleForward = vecProjectile:Normalized() + + -- 目标和投射物距离 + local dis = GetDistanceBetweenTwoVec2D(target:GetOrigin(),vec) + + ParticleManager:SetParticleControlForward(effectIndex,3,particleForward) + + totalDistance = totalDistance + math.sqrt(forceIn*forceIn + forceCentripetal*forceCentripetal) + + if dis < projectileTable.fStartRadius then + targets = THTD_FindUnitsInRadius(caster,vec,projectileTable.fStartRadius) + + if(targets[1]~=nil)then + if(projectileTable.bDeleteOnHit)then + if func then func(targets[1],projectileTable.vSpawnOriginNew) end + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + else + if #targets_remove==0 then + table.insert(targets_remove,targets[1]) + if func then func(targets[1],projectileTable.vSpawnOriginNew) end + else + for k,v in pairs(targets) do + for k1,v1 in pairs(targets_remove) do + if v~=v1 then + table.insert(targets_remove,v) + if func then func(v,projectileTable.vSpawnOriginNew) end + end + end + end + end + end + end + end + + if(totalDistance=projectileTable.fEndRadius)then + ParticleManager:SetParticleControl(effectIndex,3,vec) + projectileTable.vSpawnOriginNew = vec + speed = speed + acceleration + return 0.02 + else + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + end, + 0.02) +end + +function CreateProjectileThrowToTargetPoint(projectileTable,caster,targetPoint,speed,upSpeed,func) + local ability = projectileTable.Ability + local targets = {} + local targets_remove = {} + local totalDistance = 0 + + -- 过程时间 + local distance = GetDistanceBetweenTwoVec2D(caster:GetOrigin(),targetPoint) + local t = distance/speed + + -- 重力方向 + local vecGravity = Vector(0,0,-1) + + local PV = targetPoint.z - 128 - caster:GetOrigin().z + + -- 重力大小 + local gravity = 0.02 * ((2*upSpeed+PV/16)/t) + + -- 初速度单位向量 + local vecInVelocity = projectileTable.vVelocity + + -- 初始水平方向力 + local forceIn = 0.02 * speed + + -- 投射物矢量 + local vecProjectile = vecInVelocity * forceIn + gravity * vecGravity + + -- 投射物单位向量 + local particleForward = vecProjectile:Normalized() + + local effectIndex = ParticleManager:CreateParticle(projectileTable.EffectName, PATTACH_CUSTOMORIGIN, nil) + ParticleManager:SetParticleControlForward(effectIndex,3,caster:GetForwardVector()) + + local count = 0 + + caster:SetContextThink(DoUniqueString("ability_caster_projectile"), + function() + if GameRules:IsGamePaused() then return 0.03 end + + distance = distance - forceIn + if distance<0 then + forceIn = 0 + end + + -- 投射物矢量 + vecProjectile = vecInVelocity * forceIn + upSpeed * vecGravity + + local vec = projectileTable.vSpawnOriginNew + vecProjectile + + totalDistance = totalDistance + math.sqrt(forceIn*forceIn + gravity*gravity) + + if(projectileTable.vSpawnOriginNew.z+128>targetPoint.z or t > t/2)then + ParticleManager:SetParticleControl(effectIndex,3,vec) + projectileTable.vSpawnOriginNew = vec + upSpeed = upSpeed - gravity + t = t - 0.02 + return 0.02 + else + targets = THTD_FindUnitsInRadius(caster,vec,projectileTable.fStartRadius) + if func then func(targets) end + ParticleManager:DestroyParticleSystem(effectIndex,true) + return nil + end + end, + 0.02) +end + +function GetBlockTurning(face,pos) + local vface = face + + local hitblock = GetHitCustomBlock(pos,pos + Vector(math.cos(vface/180*math.pi),math.sin(vface/180*math.pi),0)*50) + + if hitblock~=nil then + return 90 + end + return 90 +end + +function GetBlockHeight(rad,pos) + for i=0,200 do + local gridPos = pos + Vector(math.cos(rad),math.sin(rad),0)*i + local height = GetGroundHeight(gridPos,nil) + if height > pos.z + 128 then + return height + end + end + return 0 +end + +function GetHitCustomBlock(vec,pos) + for k,v in pairs(THTD_Custom_Hit_Block) do + local circlePoint = v.circlePoint + local dis1 = GetDistanceBetweenTwoVec2D(vec,circlePoint) + local dis2 = GetDistanceBetweenTwoVec2D(pos,circlePoint) + + if dis1-50 < v.radius and dis2+50 >= v.radius then + return v + end + end + return nil +end + +function IsAroundBlock(pos) + for k,v in pairs(THTD_Custom_Hit_Block) do + local circlePoint = v.circlePoint + local dis = GetDistanceBetweenTwoVec2D(pos,circlePoint) + + if dis < v.radius then + return true + end + end + return false +end + +function clone(object) + local lookup_table = {} + local function _copy(object) + if type(object) ~= "table" then + return object + elseif lookup_table[object] then + return lookup_table[object] + end + local newObject = {} + lookup_table[object] = newObject + for key, value in pairs(object) do + newObject[_copy(key)] = _copy(value) + end + return setmetatable(newObject, getmetatable(object)) + end + return _copy(object) +end + +-------------------------------------------------------------------------------- + +--[[ + 计时器函数Timer + 调用方法: + Timer.Wait '5秒后打印一次' (5, + function() + print '我已经打印了一次文本' + end + ) + + Timer.Loop '每隔1秒打印一次,一共打印5次' (1, 5, + function(i) + print('这是第' .. i .. '次打印') + if i == 5 then + print('我改变主意了,我还要打印10次,但是间隔降低为0.5秒') + return 0.5, i + 10 + end + if i == 10 then + print('我好像打印的太多了,算了不打印了') + return true + end + end + ) +]] + +--全局计时器表 +Timer = {} +local Timer = Timer +setmetatable(Timer, Timer) + +function Timer.Wait(name) + --[[if not dota_base_game_mode then + print('WARNING: Timer created too soon!') + return + end]]-- + + return function(t, func) + local ent = GameRules:GetGameModeEntity() + ent:SetThink(func, DoUniqueString(name), t) + end +end + +function Timer.Loop(name) + --[[if not dota_base_game_mode then + print('WARNING: Timer created too soon!') + return + end]]-- + + return function(t, count, func) + if not func then + count, func = -1, count + end + + local times = 0 + local function func2() + times = times + 1 + local t2, count2 = func(times) + t, count = t2 or t, count2 or count + + if t == true or times == count then + return nil + end + + return t + end + + local ent = GameRules:GetGameModeEntity() + ent:SetThink(func2, DoUniqueString(name), t) + end +end + +TIMERS_THINK = 0.01 + +if Timers == nil then + print ( '[Timers] creating Timers' ) + Timers = {} + Timers.__index = Timers +end + +function Timers:new( o ) + o = o or {} + setmetatable( o, Timers ) + return o +end + +function Timers:start() + Timers = self + self.timers = {} + + local ent = Entities:CreateByClassname("info_target") -- Entities:FindByClassname(nil, 'CWorld') + ent:SetThink("Think", self, "timers", TIMERS_THINK) +end + +function Timers:Think() + if GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then + return + end + + -- Track game time, since the dt passed in to think is actually wall-clock time not simulation time. + local now = GameRules:GetGameTime() + + -- Process timers + for k,v in pairs(Timers.timers) do + local bUseGameTime = true + if v.useGameTime ~= nil and v.useGameTime == false then + bUseGameTime = false + end + local bOldStyle = false + if v.useOldStyle ~= nil and v.useOldStyle == true then + bOldStyle = true + end + + local now = GameRules:GetGameTime() + if not bUseGameTime then + now = Time() + end + + if v.endTime == nil then + v.endTime = now + end + -- Check if the timer has finished + if now >= v.endTime then + -- Remove from timers list + Timers.timers[k] = nil + + -- Run the callback + local status, nextCall = pcall(v.callback, GameRules:GetGameModeEntity(), v) + + -- Make sure it worked + if status then + -- Check if it needs to loop + if nextCall then + -- Change its end time + + if bOldStyle then + v.endTime = v.endTime + nextCall - now + else + v.endTime = v.endTime + nextCall + end + + Timers.timers[k] = v + end + + -- Update timer data + --self:UpdateTimerData() + else + -- Nope, handle the error + Timers:HandleEventError('Timer', k, nextCall) + end + end + end + return TIMERS_THINK +end + +function Timers:HandleEventError(name, event, err) + print(err) + + -- Ensure we have data + name = tostring(name or 'unknown') + event = tostring(event or 'unknown') + err = tostring(err or 'unknown') + + -- Tell everyone there was an error + --Say(nil, name .. ' threw an error on event '..event, false) + --Say(nil, err, false) + + -- Prevent loop arounds + if not self.errorHandled then + -- Store that we handled an error + self.errorHandled = true + end +end + +function Timers:CreateTimer(name, args) + if type(name) == "function" then + args = {callback = name} + name = DoUniqueString("timer") + elseif type(name) == "table" then + args = name + name = DoUniqueString("timer") + elseif type(name) == "number" then + args = {endTime = name, callback = args} + name = DoUniqueString("timer") + end + if not args.callback then + print("Invalid timer created: "..name) + return + end + + + local now = GameRules:GetGameTime() + if args.useGameTime ~= nil and args.useGameTime == false then + now = Time() + end + + if args.endTime == nil then + args.endTime = now + elseif args.useOldStyle == nil or args.useOldStyle == false then + args.endTime = now + args.endTime + end + + Timers.timers[name] = args +end + +function Timers:RemoveTimer(name) + Timers.timers[name] = nil +end + +function Timers:RemoveTimers(killAll) + local timers = {} + + if not killAll then + for k,v in pairs(Timers.timers) do + if v.persist then + timers[k] = v + end + end + end + + Timers.timers = timers +end + +Timers:start() + +-------------------------------------------------------------------------------- + +function PrecacheEveryThingFromKV( context ) + local kv_files = { + "scripts/npc/npc_units_custom.txt", + --[["scripts/npc/npc_abilities_custom.txt", + "scripts/npc/npc_heroes_custom.txt", + "scripts/npc/npc_abilities_override.txt", + "npc_items_custom.txt"]]-- + } + for _, kv in pairs(kv_files) do + local kvs = LoadKeyValues(kv) + if kvs then + -- print("BEGIN TO PRECACHE RESOURCE FROM: ", kv) + PrecacheEverythingFromTable( context, kvs) + end + end + local unitKv = LoadKeyValues("scripts/npc/npc_units_custom.txt") + for k,v in pairs(unitKv) do + -- print("PRECACHE UNIT RESOURCE: "..k, k) + PrecacheUnitByNameSync(k,context) + end +end + +function PrecacheEverythingFromTable( context, kvtable) + for key, value in pairs(kvtable) do + if type(value) == "table" then + PrecacheEverythingFromTable( context, value ) + else + if string.find(value, "vpcf") then + PrecacheResource( "particle", value, context) + -- print("PRECACHE PARTICLE RESOURCE", value) + end + if string.find(value, "vmdl") then + PrecacheResource( "model", value, context) + -- print("PRECACHE MODEL RESOURCE", value) + end + if string.find(value, "vsndevts") then + PrecacheResource( "soundfile", value, context) + -- print("PRECACHE SOUND RESOURCE", value) + end + end + end +end + +-------------------------------------------------------------------------------- + +-- 当物品被摧毁时执行,出现场景为升星、培养和出售,以及程序删除,将物品返回卡池,如果是卡牌则同时摧毁关联的塔 +-- 参数:物品实体,玩家id,是否出售场景(不需要在本函数中进行删除物品) +function OnItemDestroyed(caster, item, isSold) + --摧毁关联的塔 + local tower = item:THTD_GetTower() + if tower ~= nil then + tower:ForceKill(false) + end + + local itemName = item:GetAbilityName() + --炸弹和福弹及赠送的不返回卡池 + if itemName ~= "item_2001" and item.card_poor_player_id ~= nil then + THTD_AddItemToListByName(item.card_poor_player_id, itemName) + end + + if isSold ~= true then + item:RemoveSelf() + end +end + +-- 同步卡池 +function SetNetTableTowerPlayerList(playerId) + local steamid = PlayerResource:GetSteamID(playerId) + CustomNetTables:SetTableValue("TowerListInfo", "cardlist"..tostring(steamid), towerPlayerList[playerId+1]) +end + +-- 同步当前塔清单 +function SetNetTableTowerList(caster) + local hero = GameRules.HeroList[caster:GetPlayerOwnerID()] + if hero == nil then return end + + local towerList = {} + for k,v in pairs(hero.thtd_hero_tower_list) do + towerList[k] = v:GetEntityIndex() + end + local steamid = PlayerResource:GetSteamID(hero:GetPlayerOwnerID()) + CustomNetTables:SetTableValue("TowerListInfo", "towerlist"..tostring(steamid), towerList) +end + +-- 获取现实时间,格式为: 2019-04-19 10:00:00 +function GetRealDateTime() + local date = GetSystemDate() --04/12/19 月 日 年 + local time = GetSystemTime() --00:10:43 时 分 秒 + return "20"..string.sub(date,7,8).."-"..string.sub(date,1,2).."-"..string.sub(date,4,5).." "..time +end + +-- 判断当前时间是否超过了指定时间,格式必须为 2019-04-19 10:00:00 +function IsEndByDateTime(endDateTime) + local currentDateTime = GetRealDateTime() + if GameRules.GameData.server_time ~= "" then + currentDateTime = GameRules.GameData.server_time + end + if currentDateTime > endDateTime then + return true + else + return false + end +end diff --git a/scripts/vscripts/component/dkjson.lua b/scripts/vscripts/component/dkjson.lua new file mode 100755 index 0000000..25c60ff --- /dev/null +++ b/scripts/vscripts/component/dkjson.lua @@ -0,0 +1,714 @@ +-- Module options: +local always_try_using_lpeg = false +local register_global_module_table = true +local global_module_name = 'json' + +--[==[ + +David Kolf's JSON module for Lua 5.1/5.2 + +Version 2.5 + + +For the documentation see the corresponding readme.txt or visit +. + +You can contact the author by sending an e-mail to 'david' at the +domain 'dkolf.de'. + + +Copyright (C) 2010-2013 David Heiko Kolf + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--]==] + +-- global dependencies: +local pairs, type, tostring, tonumber, getmetatable, setmetatable, rawset = + pairs, type, tostring, tonumber, getmetatable, setmetatable, rawset +local error, require, pcall, select = error, require, pcall, select +local floor, huge = math.floor, math.huge +local strrep, gsub, strsub, strbyte, strchar, strfind, strlen, strformat = + string.rep, string.gsub, string.sub, string.byte, string.char, + string.find, string.len, string.format +local strmatch = string.match +local concat = table.concat + +local json = { version = "dkjson 2.5" } + +if register_global_module_table then + _G[global_module_name] = json +end + +local _ENV = nil -- blocking globals in Lua 5.2 + +pcall (function() + -- Enable access to blocked metatables. + -- Don't worry, this module doesn't change anything in them. + local debmeta = require "debug".getmetatable + if debmeta then getmetatable = debmeta end +end) + +json.null = setmetatable ({}, { + __tojson = function () return "null" end +}) + +local function isarray (tbl) + local max, n, arraylen = 0, 0, 0 + for k,v in pairs (tbl) do + if k == 'n' and type(v) == 'number' then + arraylen = v + if v > max then + max = v + end + else + if type(k) ~= 'number' or k < 1 or floor(k) ~= k then + return false + end + if k > max then + max = k + end + n = n + 1 + end + end + if max > 10 and max > arraylen and max > n * 2 then + return false -- don't create an array with too many holes + end + return true, max +end + +local escapecodes = { + ["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f", + ["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t" +} + +local function escapeutf8 (uchar) + local value = escapecodes[uchar] + if value then + return value + end + local a, b, c, d = strbyte (uchar, 1, 4) + a, b, c, d = a or 0, b or 0, c or 0, d or 0 + if a <= 0x7f then + value = a + elseif 0xc0 <= a and a <= 0xdf and b >= 0x80 then + value = (a - 0xc0) * 0x40 + b - 0x80 + elseif 0xe0 <= a and a <= 0xef and b >= 0x80 and c >= 0x80 then + value = ((a - 0xe0) * 0x40 + b - 0x80) * 0x40 + c - 0x80 + elseif 0xf0 <= a and a <= 0xf7 and b >= 0x80 and c >= 0x80 and d >= 0x80 then + value = (((a - 0xf0) * 0x40 + b - 0x80) * 0x40 + c - 0x80) * 0x40 + d - 0x80 + else + return "" + end + if value <= 0xffff then + return strformat ("\\u%.4x", value) + elseif value <= 0x10ffff then + -- encode as UTF-16 surrogate pair + value = value - 0x10000 + local highsur, lowsur = 0xD800 + floor (value/0x400), 0xDC00 + (value % 0x400) + return strformat ("\\u%.4x\\u%.4x", highsur, lowsur) + else + return "" + end +end + +local function fsub (str, pattern, repl) + -- gsub always builds a new string in a buffer, even when no match + -- exists. First using find should be more efficient when most strings + -- don't contain the pattern. + if strfind (str, pattern) then + return gsub (str, pattern, repl) + else + return str + end +end + +local function quotestring (value) + -- based on the regexp "escapable" in https://github.com/douglascrockford/JSON-js + value = fsub (value, "[%z\1-\31\"\\\127]", escapeutf8) + if strfind (value, "[\194\216\220\225\226\239]") then + value = fsub (value, "\194[\128-\159\173]", escapeutf8) + value = fsub (value, "\216[\128-\132]", escapeutf8) + value = fsub (value, "\220\143", escapeutf8) + value = fsub (value, "\225\158[\180\181]", escapeutf8) + value = fsub (value, "\226\128[\140-\143\168-\175]", escapeutf8) + value = fsub (value, "\226\129[\160-\175]", escapeutf8) + value = fsub (value, "\239\187\191", escapeutf8) + value = fsub (value, "\239\191[\176-\191]", escapeutf8) + end + return "\"" .. value .. "\"" +end +json.quotestring = quotestring + +local function replace(str, o, n) + local i, j = strfind (str, o, 1, true) + if i then + return strsub(str, 1, i-1) .. n .. strsub(str, j+1, -1) + else + return str + end +end + +-- locale independent num2str and str2num functions +local decpoint, numfilter + +local function updatedecpoint () + decpoint = strmatch(tostring(0.5), "([^05+])") + -- build a filter that can be used to remove group separators + numfilter = "[^0-9%-%+eE" .. gsub(decpoint, "[%^%$%(%)%%%.%[%]%*%+%-%?]", "%%%0") .. "]+" +end + +updatedecpoint() + +local function num2str (num) + return replace(fsub(tostring(num), numfilter, ""), decpoint, ".") +end + +local function str2num (str) + local num = tonumber(replace(str, ".", decpoint)) + if not num then + updatedecpoint() + num = tonumber(replace(str, ".", decpoint)) + end + return num +end + +local function addnewline2 (level, buffer, buflen) + buffer[buflen+1] = "\n" + buffer[buflen+2] = strrep (" ", level) + buflen = buflen + 2 + return buflen +end + +function json.addnewline (state) + if state.indent then + state.bufferlen = addnewline2 (state.level or 0, + state.buffer, state.bufferlen or #(state.buffer)) + end +end + +local encode2 -- forward declaration + +local function addpair (key, value, prev, indent, level, buffer, buflen, tables, globalorder, state) + local kt = type (key) + if kt ~= 'string' and kt ~= 'number' then + return nil, "type '" .. kt .. "' is not supported as a key by JSON." + end + if prev then + buflen = buflen + 1 + buffer[buflen] = "," + end + if indent then + buflen = addnewline2 (level, buffer, buflen) + end + buffer[buflen+1] = quotestring (key) + buffer[buflen+2] = ":" + return encode2 (value, indent, level, buffer, buflen + 2, tables, globalorder, state) +end + +local function appendcustom(res, buffer, state) + local buflen = state.bufferlen + if type (res) == 'string' then + buflen = buflen + 1 + buffer[buflen] = res + end + return buflen +end + +local function exception(reason, value, state, buffer, buflen, defaultmessage) + defaultmessage = defaultmessage or reason + local handler = state.exception + if not handler then + return nil, defaultmessage + else + state.bufferlen = buflen + local ret, msg = handler (reason, value, state, defaultmessage) + if not ret then return nil, msg or defaultmessage end + return appendcustom(ret, buffer, state) + end +end + +function json.encodeexception(reason, value, state, defaultmessage) + return quotestring("<" .. defaultmessage .. ">") +end + +encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, state) + local valtype = type (value) + local valmeta = getmetatable (value) + valmeta = type (valmeta) == 'table' and valmeta -- only tables + local valtojson = valmeta and valmeta.__tojson + if valtojson then + if tables[value] then + return exception('reference cycle', value, state, buffer, buflen) + end + tables[value] = true + state.bufferlen = buflen + local ret, msg = valtojson (value, state) + if not ret then return exception('custom encoder failed', value, state, buffer, buflen, msg) end + tables[value] = nil + buflen = appendcustom(ret, buffer, state) + elseif value == nil then + buflen = buflen + 1 + buffer[buflen] = "null" + elseif valtype == 'number' then + local s + if value ~= value or value >= huge or -value >= huge then + -- This is the behaviour of the original JSON implementation. + s = "null" + else + s = num2str (value) + end + buflen = buflen + 1 + buffer[buflen] = s + elseif valtype == 'boolean' then + buflen = buflen + 1 + buffer[buflen] = value and "true" or "false" + elseif valtype == 'string' then + buflen = buflen + 1 + buffer[buflen] = quotestring (value) + elseif valtype == 'table' then + if tables[value] then + return exception('reference cycle', value, state, buffer, buflen) + end + tables[value] = true + level = level + 1 + local isa, n = isarray (value) + if n == 0 and valmeta and valmeta.__jsontype == 'object' then + isa = false + end + local msg + if isa then -- JSON array + buflen = buflen + 1 + buffer[buflen] = "[" + for i = 1, n do + buflen, msg = encode2 (value[i], indent, level, buffer, buflen, tables, globalorder, state) + if not buflen then return nil, msg end + if i < n then + buflen = buflen + 1 + buffer[buflen] = "," + end + end + buflen = buflen + 1 + buffer[buflen] = "]" + else -- JSON object + local prev = false + buflen = buflen + 1 + buffer[buflen] = "{" + local order = valmeta and valmeta.__jsonorder or globalorder + if order then + local used = {} + n = #order + for i = 1, n do + local k = order[i] + local v = value[k] + if v then + used[k] = true + buflen, msg = addpair (k, v, prev, indent, level, buffer, buflen, tables, globalorder, state) + prev = true -- add a seperator before the next element + end + end + for k,v in pairs (value) do + if not used[k] then + buflen, msg = addpair (k, v, prev, indent, level, buffer, buflen, tables, globalorder, state) + if not buflen then return nil, msg end + prev = true -- add a seperator before the next element + end + end + else -- unordered + for k,v in pairs (value) do + buflen, msg = addpair (k, v, prev, indent, level, buffer, buflen, tables, globalorder, state) + if not buflen then return nil, msg end + prev = true -- add a seperator before the next element + end + end + if indent then + buflen = addnewline2 (level - 1, buffer, buflen) + end + buflen = buflen + 1 + buffer[buflen] = "}" + end + tables[value] = nil + else + return exception ('unsupported type', value, state, buffer, buflen, + "type '" .. valtype .. "' is not supported by JSON.") + end + return buflen +end + +function json.encode (value, state) + state = state or {} + local oldbuffer = state.buffer + local buffer = oldbuffer or {} + state.buffer = buffer + updatedecpoint() + local ret, msg = encode2 (value, state.indent, state.level or 0, + buffer, state.bufferlen or 0, state.tables or {}, state.keyorder, state) + if not ret then + error (msg, 2) + elseif oldbuffer == buffer then + state.bufferlen = ret + return true + else + state.bufferlen = nil + state.buffer = nil + return concat (buffer) + end +end + +local function loc (str, where) + local line, pos, linepos = 1, 1, 0 + while true do + pos = strfind (str, "\n", pos, true) + if pos and pos < where then + line = line + 1 + linepos = pos + pos = pos + 1 + else + break + end + end + return "line " .. line .. ", column " .. (where - linepos) +end + +local function unterminated (str, what, where) + return nil, strlen (str) + 1, "unterminated " .. what .. " at " .. loc (str, where) +end + +local function scanwhite (str, pos) + while true do + pos = strfind (str, "%S", pos) + if not pos then return nil end + local sub2 = strsub (str, pos, pos + 1) + if sub2 == "\239\187" and strsub (str, pos + 2, pos + 2) == "\191" then + -- UTF-8 Byte Order Mark + pos = pos + 3 + elseif sub2 == "//" then + pos = strfind (str, "[\n\r]", pos + 2) + if not pos then return nil end + elseif sub2 == "/*" then + pos = strfind (str, "*/", pos + 2) + if not pos then return nil end + pos = pos + 2 + else + return pos + end + end +end + +local escapechars = { + ["\""] = "\"", ["\\"] = "\\", ["/"] = "/", ["b"] = "\b", ["f"] = "\f", + ["n"] = "\n", ["r"] = "\r", ["t"] = "\t" +} + +local function unichar (value) + if value < 0 then + return nil + elseif value <= 0x007f then + return strchar (value) + elseif value <= 0x07ff then + return strchar (0xc0 + floor(value/0x40), + 0x80 + (floor(value) % 0x40)) + elseif value <= 0xffff then + return strchar (0xe0 + floor(value/0x1000), + 0x80 + (floor(value/0x40) % 0x40), + 0x80 + (floor(value) % 0x40)) + elseif value <= 0x10ffff then + return strchar (0xf0 + floor(value/0x40000), + 0x80 + (floor(value/0x1000) % 0x40), + 0x80 + (floor(value/0x40) % 0x40), + 0x80 + (floor(value) % 0x40)) + else + return nil + end +end + +local function scanstring (str, pos) + local lastpos = pos + 1 + local buffer, n = {}, 0 + while true do + local nextpos = strfind (str, "[\"\\]", lastpos) + if not nextpos then + return unterminated (str, "string", pos) + end + if nextpos > lastpos then + n = n + 1 + buffer[n] = strsub (str, lastpos, nextpos - 1) + end + if strsub (str, nextpos, nextpos) == "\"" then + lastpos = nextpos + 1 + break + else + local escchar = strsub (str, nextpos + 1, nextpos + 1) + local value + if escchar == "u" then + value = tonumber (strsub (str, nextpos + 2, nextpos + 5), 16) + if value then + local value2 + if 0xD800 <= value and value <= 0xDBff then + -- we have the high surrogate of UTF-16. Check if there is a + -- low surrogate escaped nearby to combine them. + if strsub (str, nextpos + 6, nextpos + 7) == "\\u" then + value2 = tonumber (strsub (str, nextpos + 8, nextpos + 11), 16) + if value2 and 0xDC00 <= value2 and value2 <= 0xDFFF then + value = (value - 0xD800) * 0x400 + (value2 - 0xDC00) + 0x10000 + else + value2 = nil -- in case it was out of range for a low surrogate + end + end + end + value = value and unichar (value) + if value then + if value2 then + lastpos = nextpos + 12 + else + lastpos = nextpos + 6 + end + end + end + end + if not value then + value = escapechars[escchar] or escchar + lastpos = nextpos + 2 + end + n = n + 1 + buffer[n] = value + end + end + if n == 1 then + return buffer[1], lastpos + elseif n > 1 then + return concat (buffer), lastpos + else + return "", lastpos + end +end + +local scanvalue -- forward declaration + +local function scantable (what, closechar, str, startpos, nullval, objectmeta, arraymeta) + local len = strlen (str) + local tbl, n = {}, 0 + local pos = startpos + 1 + if what == 'object' then + setmetatable (tbl, objectmeta) + else + setmetatable (tbl, arraymeta) + end + while true do + pos = scanwhite (str, pos) + if not pos then return unterminated (str, what, startpos) end + local char = strsub (str, pos, pos) + if char == closechar then + return tbl, pos + 1 + end + local val1, err + val1, pos, err = scanvalue (str, pos, nullval, objectmeta, arraymeta) + if err then return nil, pos, err end + pos = scanwhite (str, pos) + if not pos then return unterminated (str, what, startpos) end + char = strsub (str, pos, pos) + if char == ":" then + if val1 == nil then + return nil, pos, "cannot use nil as table index (at " .. loc (str, pos) .. ")" + end + pos = scanwhite (str, pos + 1) + if not pos then return unterminated (str, what, startpos) end + local val2 + val2, pos, err = scanvalue (str, pos, nullval, objectmeta, arraymeta) + if err then return nil, pos, err end + tbl[val1] = val2 + pos = scanwhite (str, pos) + if not pos then return unterminated (str, what, startpos) end + char = strsub (str, pos, pos) + else + n = n + 1 + tbl[n] = val1 + end + if char == "," then + pos = pos + 1 + end + end +end + +scanvalue = function (str, pos, nullval, objectmeta, arraymeta) + pos = pos or 1 + pos = scanwhite (str, pos) + if not pos then + return nil, strlen (str) + 1, "no valid JSON value (reached the end)" + end + local char = strsub (str, pos, pos) + if char == "{" then + return scantable ('object', "}", str, pos, nullval, objectmeta, arraymeta) + elseif char == "[" then + return scantable ('array', "]", str, pos, nullval, objectmeta, arraymeta) + elseif char == "\"" then + return scanstring (str, pos) + else + local pstart, pend = strfind (str, "^%-?[%d%.]+[eE]?[%+%-]?%d*", pos) + if pstart then + local number = str2num (strsub (str, pstart, pend)) + if number then + return number, pend + 1 + end + end + pstart, pend = strfind (str, "^%a%w*", pos) + if pstart then + local name = strsub (str, pstart, pend) + if name == "true" then + return true, pend + 1 + elseif name == "false" then + return false, pend + 1 + elseif name == "null" then + return nullval, pend + 1 + end + end + return nil, pos, "no valid JSON value at " .. loc (str, pos) + end +end + +local function optionalmetatables(...) + if select("#", ...) > 0 then + return ... + else + return {__jsontype = 'object'}, {__jsontype = 'array'} + end +end + +function json.decode (str, pos, nullval, ...) + local objectmeta, arraymeta = optionalmetatables(...) + return scanvalue (str, pos, nullval, objectmeta, arraymeta) +end + +function json.use_lpeg () + local g = require ("lpeg") + + if g.version() == "0.11" then + error "due to a bug in LPeg 0.11, it cannot be used for JSON matching" + end + + local pegmatch = g.match + local P, S, R = g.P, g.S, g.R + + local function ErrorCall (str, pos, msg, state) + if not state.msg then + state.msg = msg .. " at " .. loc (str, pos) + state.pos = pos + end + return false + end + + local function Err (msg) + return g.Cmt (g.Cc (msg) * g.Carg (2), ErrorCall) + end + + local SingleLineComment = P"//" * (1 - S"\n\r")^0 + local MultiLineComment = P"/*" * (1 - P"*/")^0 * P"*/" + local Space = (S" \n\r\t" + P"\239\187\191" + SingleLineComment + MultiLineComment)^0 + + local PlainChar = 1 - S"\"\\\n\r" + local EscapeSequence = (P"\\" * g.C (S"\"\\/bfnrt" + Err "unsupported escape sequence")) / escapechars + local HexDigit = R("09", "af", "AF") + local function UTF16Surrogate (match, pos, high, low) + high, low = tonumber (high, 16), tonumber (low, 16) + if 0xD800 <= high and high <= 0xDBff and 0xDC00 <= low and low <= 0xDFFF then + return true, unichar ((high - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000) + else + return false + end + end + local function UTF16BMP (hex) + return unichar (tonumber (hex, 16)) + end + local U16Sequence = (P"\\u" * g.C (HexDigit * HexDigit * HexDigit * HexDigit)) + local UnicodeEscape = g.Cmt (U16Sequence * U16Sequence, UTF16Surrogate) + U16Sequence/UTF16BMP + local Char = UnicodeEscape + EscapeSequence + PlainChar + local String = P"\"" * g.Cs (Char ^ 0) * (P"\"" + Err "unterminated string") + local Integer = P"-"^(-1) * (P"0" + (R"19" * R"09"^0)) + local Fractal = P"." * R"09"^0 + local Exponent = (S"eE") * (S"+-")^(-1) * R"09"^1 + local Number = (Integer * Fractal^(-1) * Exponent^(-1))/str2num + local Constant = P"true" * g.Cc (true) + P"false" * g.Cc (false) + P"null" * g.Carg (1) + local SimpleValue = Number + String + Constant + local ArrayContent, ObjectContent + + -- The functions parsearray and parseobject parse only a single value/pair + -- at a time and store them directly to avoid hitting the LPeg limits. + local function parsearray (str, pos, nullval, state) + local obj, cont + local npos + local t, nt = {}, 0 + repeat + obj, cont, npos = pegmatch (ArrayContent, str, pos, nullval, state) + if not npos then break end + pos = npos + nt = nt + 1 + t[nt] = obj + until cont == 'last' + return pos, setmetatable (t, state.arraymeta) + end + + local function parseobject (str, pos, nullval, state) + local obj, key, cont + local npos + local t = {} + repeat + key, obj, cont, npos = pegmatch (ObjectContent, str, pos, nullval, state) + if not npos then break end + pos = npos + t[key] = obj + until cont == 'last' + return pos, setmetatable (t, state.objectmeta) + end + + local Array = P"[" * g.Cmt (g.Carg(1) * g.Carg(2), parsearray) * Space * (P"]" + Err "']' expected") + local Object = P"{" * g.Cmt (g.Carg(1) * g.Carg(2), parseobject) * Space * (P"}" + Err "'}' expected") + local Value = Space * (Array + Object + SimpleValue) + local ExpectedValue = Value + Space * Err "value expected" + ArrayContent = Value * Space * (P"," * g.Cc'cont' + g.Cc'last') * g.Cp() + local Pair = g.Cg (Space * String * Space * (P":" + Err "colon expected") * ExpectedValue) + ObjectContent = Pair * Space * (P"," * g.Cc'cont' + g.Cc'last') * g.Cp() + local DecodeValue = ExpectedValue * g.Cp () + + function json.decode (str, pos, nullval, ...) + local state = {} + state.objectmeta, state.arraymeta = optionalmetatables(...) + local obj, retpos = pegmatch (DecodeValue, str, pos, nullval, state) + if state.msg then + return nil, state.pos, state.msg + else + return obj, retpos + end + end + + -- use this function only once: + json.use_lpeg = function () return json end + + json.using_lpeg = true + + return json -- so you can get the module using json = require "dkjson".use_lpeg() +end + +if always_try_using_lpeg then + pcall (json.use_lpeg) +end + +return json + diff --git a/scripts/vscripts/component/sha.lua b/scripts/vscripts/component/sha.lua new file mode 100755 index 0000000..7dc7091 --- /dev/null +++ b/scripts/vscripts/component/sha.lua @@ -0,0 +1,2941 @@ +-------------------------------------------------------------------------------------------------------------------------- +-- sha2.lua +-------------------------------------------------------------------------------------------------------------------------- +-- VERSION: 9 (2020-05-10) +-- AUTHOR: Egor Skriptunoff +-- LICENSE: MIT (the same license as Lua itself) +-- +-- +-- DESCRIPTION: +-- This module contains functions to calculate SHA digest: +-- MD5, SHA-1, +-- SHA-224, SHA-256, SHA-512/224, SHA-512/256, SHA-384, SHA-512, +-- SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128, SHAKE256, +-- HMAC +-- Written in pure Lua. +-- Compatible with: +-- Lua 5.1, Lua 5.2, Lua 5.3, Lua 5.4, Fengari, LuaJIT 2.0/2.1 (any CPU endianness). +-- Main feature of this module: it was heavily optimized for speed. +-- For every Lua version the module contains particular implementation branch to get benefits from version-specific features. +-- - branch for Lua 5.1 (emulating bitwise operators using look-up table) +-- - branch for Lua 5.2 (using bit32/bit library), suitable for both Lua 5.2 with native "bit32" and Lua 5.1 with external library "bit" +-- - branch for Lua 5.3/5.4 (using native 64-bit bitwise operators) +-- - branch for Lua 5.3/5.4 (using native 32-bit bitwise operators) for Lua built with LUA_INT_TYPE=LUA_INT_INT +-- - branch for LuaJIT without FFI library (useful in a sandboxed environment) +-- - branch for LuaJIT x86 without FFI library (LuaJIT x86 has oddity because of lack of CPU registers) +-- - branch for LuaJIT 2.0 with FFI library (bit.* functions work only with Lua numbers) +-- - branch for LuaJIT 2.1 with FFI library (bit.* functions can work with "int64_t" arguments) +-- +-- +-- USAGE: +-- Input data should be provided as a binary string: either as a whole string or as a sequence of substrings (chunk-by-chunk loading, total length < 9*10^15 bytes). +-- Result (SHA digest) is returned in hexadecimal representation as a string of lowercase hex digits. +-- Simplest usage example: +-- local sha = require("sha2") +-- local your_hash = sha.sha256("your string") +-- See file "sha2_test.lua" for more examples. +-- +-- +-- CHANGELOG: +-- version date description +-- ------- ---------- ----------- +-- 9 2020-05-10 Now works in OpenWrt's Lua (dialect of Lua 5.1 with "double" + "invisible int32") +-- 8 2019-09-03 SHA3 functions added +-- 7 2019-03-17 Added functions to convert to/from base64 +-- 6 2018-11-12 HMAC added +-- 5 2018-11-10 SHA-1 added +-- 4 2018-11-03 MD5 added +-- 3 2018-11-02 Bug fixed: incorrect hashing of long (2 GByte) data streams on Lua 5.3/5.4 built with "int32" integers +-- 2 2018-10-07 Decreased module loading time in Lua 5.1 implementation branch (thanks to Peter Melnichenko for giving a hint) +-- 1 2018-10-06 First release (only SHA-2 functions) +----------------------------------------------------------------------------- + +local print_debug_messages = false -- set to true to view some messages about your system's abilities and implementation branch chosen for your system + +local unpack, table_concat, byte, char, string_rep, sub, gsub, gmatch, string_format, floor, ceil, math_min, math_max, tonumber, type = + table.unpack or unpack, table.concat, string.byte, string.char, string.rep, string.sub, string.gsub, string.gmatch, string.format, math.floor, math.ceil, math.min, math.max, tonumber, type + + +-------------------------------------------------------------------------------- +-- EXAMINING YOUR SYSTEM +-------------------------------------------------------------------------------- + +local function get_precision(one) + -- "one" must be either float 1.0 or integer 1 + -- returns bits_precision, is_integer + -- This function works correctly with all floating point datatypes (including non-IEEE-754) + local k, n, m, prev_n = 0, one, one + while true do + k, prev_n, n, m = k + 1, n, n + n + 1, m + m + k % 2 + if k > 256 or n - (n - 1) ~= 1 or m - (m - 1) ~= 1 or n == m then + return k, false -- floating point datatype + elseif n == prev_n then + return k, true -- integer datatype + end + end +end + +-- Make sure Lua has "double" numbers +local x = 2/3 +local Lua_has_double = x * 5 > 3 and x * 4 < 3 and get_precision(1.0) >= 53 +assert(Lua_has_double, "at least 53-bit floating point numbers are required") + +-- Q: +-- SHA2 was designed for FPU-less machines. +-- So, why floating point numbers are needed for this module? +-- A: +-- 53-bit "double" numbers are useful to calculate "magic numbers" used in SHA. +-- I prefer to write 50 LOC "magic numbers calculator" instead of storing more than 200 constants explicitly in this source file. + +local int_prec, Lua_has_integers = get_precision(1) +local Lua_has_int64 = Lua_has_integers and int_prec == 64 +local Lua_has_int32 = Lua_has_integers and int_prec == 32 +assert(Lua_has_int64 or Lua_has_int32 or not Lua_has_integers, "Lua integers must be either 32-bit or 64-bit") + +-- Q: +-- Does it mean that almost all non-standard configurations are not supported? +-- A: +-- Yes. Sorry, too many problems to support all possible Lua numbers configurations. +-- Lua 5.1/5.2 with "int32" will not work. +-- Lua 5.1/5.2 with "int64" will not work. +-- Lua 5.1/5.2 with "int128" will not work. +-- Lua 5.1/5.2 with "float" will not work. +-- Lua 5.1/5.2 with "double" is OK. (default config for Lua 5.1, Lua 5.2, LuaJIT) +-- Lua 5.3/5.4 with "int32" + "float" will not work. +-- Lua 5.3/5.4 with "int64" + "float" will not work. +-- Lua 5.3/5.4 with "int128" + "float" will not work. +-- Lua 5.3/5.4 with "int32" + "double" is OK. (config used by Fengari) +-- Lua 5.3/5.4 with "int64" + "double" is OK. (default config for Lua 5.3, Lua 5.4) +-- Lua 5.3/5.4 with "int128" + "double" will not work. +-- Using floating point numbers better than "double" instead of "double" is OK (non-IEEE-754 floating point implementation are allowed). +-- Using "int128" instead of "int64" is not OK: "int128" would require different branch of implementation for optimized SHA512. + +-- Check for LuaJIT and 32-bit bitwise libraries +local is_LuaJIT = ({false, [1] = true})[1] and (type(jit) ~= "table" or jit.version_num >= 20000) -- LuaJIT 1.x.x is treated as vanilla Lua 5.1 +local is_LuaJIT_21 -- LuaJIT 2.1+ +local LuaJIT_arch +local ffi -- LuaJIT FFI library (as a table) +local b -- 32-bit bitwise library (as a table) +local library_name + +if is_LuaJIT then + -- Assuming "bit" library is always available on LuaJIT + b = require"bit" + library_name = "bit" + -- "ffi" is intentionally disabled on some systems for safety reason + local LuaJIT_has_FFI, result = pcall(require, "ffi") + if LuaJIT_has_FFI then + ffi = result + end + is_LuaJIT_21 = not not loadstring"b=0b0" + LuaJIT_arch = type(jit) == "table" and jit.arch or ffi and ffi.arch or nil +else + -- For vanilla Lua, "bit"/"bit32" libraries are searched in global namespace only. No attempt is made to load a library if it's not loaded yet. + for _, libname in ipairs(_VERSION == "Lua 5.2" and {"bit32", "bit"} or {"bit", "bit32"}) do + if type(_G[libname]) == "table" and _G[libname].bxor then + b = _G[libname] + library_name = libname + break + end + end +end + +-------------------------------------------------------------------------------- +-- You can disable here some of your system's abilities (for testing purposes) +-------------------------------------------------------------------------------- +-- is_LuaJIT = nil +-- is_LuaJIT_21 = nil +-- ffi = nil +-- Lua_has_int32 = nil +-- Lua_has_int64 = nil +-- b, library_name = nil +-------------------------------------------------------------------------------- + +if print_debug_messages then + -- Printing list of abilities of your system + print("Abilities:") + print(" Lua version: "..(is_LuaJIT and "LuaJIT "..(is_LuaJIT_21 and "2.1 " or "2.0 ")..(LuaJIT_arch or "")..(ffi and " with FFI" or " without FFI") or _VERSION)) + print(" Integer bitwise operators: "..(Lua_has_int64 and "int64" or Lua_has_int32 and "int32" or "no")) + print(" 32-bit bitwise library: "..(library_name or "not found")) +end + +-- Selecting the most suitable implementation for given set of abilities +local method, branch +if is_LuaJIT and ffi then + method = "Using 'ffi' library of LuaJIT" + branch = "FFI" +elseif is_LuaJIT then + method = "Using special code for FFI-less LuaJIT" + branch = "LJ" +elseif Lua_has_int64 then + method = "Using native int64 bitwise operators" + branch = "INT64" +elseif Lua_has_int32 then + method = "Using native int32 bitwise operators" + branch = "INT32" +elseif library_name then -- when bitwise library is available (Lua 5.2 with native library "bit32" or Lua 5.1 with external library "bit") + method = "Using '"..library_name.."' library" + branch = "LIB32" +else + method = "Emulating bitwise operators using look-up table" + branch = "EMUL" +end + +if print_debug_messages then + -- Printing the implementation selected to be used on your system + print("Implementation selected:") + print(" "..method) +end + + +-------------------------------------------------------------------------------- +-- BASIC 32-BIT BITWISE FUNCTIONS +-------------------------------------------------------------------------------- + +local AND, OR, XOR, SHL, SHR, ROL, ROR, NOT, NORM, HEX, XOR_BYTE +-- Only low 32 bits of function arguments matter, high bits are ignored +-- The result of all functions (except HEX) is an integer inside "correct range": +-- for "bit" library: (-2^31)..(2^31-1) +-- for "bit32" library: 0..(2^32-1) + +if branch == "FFI" or branch == "LJ" or branch == "LIB32" then + + -- Your system has 32-bit bitwise library (either "bit" or "bit32") + + AND = b.band -- 2 arguments + OR = b.bor -- 2 arguments + XOR = b.bxor -- 2..5 arguments + SHL = b.lshift -- second argument is integer 0..31 + SHR = b.rshift -- second argument is integer 0..31 + ROL = b.rol or b.lrotate -- second argument is integer 0..31 + ROR = b.ror or b.rrotate -- second argument is integer 0..31 + NOT = b.bnot -- only for LuaJIT + NORM = b.tobit -- only for LuaJIT + HEX = b.tohex -- returns string of 8 lowercase hexadecimal digits + assert(AND and OR and XOR and SHL and SHR and ROL and ROR and NOT, "Library '"..library_name.."' is incomplete") + XOR_BYTE = XOR -- XOR of two bytes (0..255) + +elseif branch == "EMUL" then + + -- Emulating 32-bit bitwise operations using 53-bit floating point arithmetic + + function SHL(x, n) + return (x * 2^n) % 2^32 + end + + function SHR(x, n) + -- return (x % 2^32 - x % 2^n) / 2^n + x = x % 2^32 / 2^n + return x - x % 1 + end + + function ROL(x, n) + x = x % 2^32 * 2^n + local r = x % 2^32 + return r + (x - r) / 2^32 + end + + function ROR(x, n) + x = x % 2^32 / 2^n + local r = x % 1 + return r * 2^32 + (x - r) + end + + local AND_of_two_bytes = {[0] = 0} -- look-up table (256*256 entries) + local idx = 0 + for y = 0, 127 * 256, 256 do + for x = y, y + 127 do + x = AND_of_two_bytes[x] * 2 + AND_of_two_bytes[idx] = x + AND_of_two_bytes[idx + 1] = x + AND_of_two_bytes[idx + 256] = x + AND_of_two_bytes[idx + 257] = x + 1 + idx = idx + 2 + end + idx = idx + 256 + end + + local function and_or_xor(x, y, operation) + -- operation: nil = AND, 1 = OR, 2 = XOR + local x0 = x % 2^32 + local y0 = y % 2^32 + local rx = x0 % 256 + local ry = y0 % 256 + local res = AND_of_two_bytes[rx + ry * 256] + x = x0 - rx + y = (y0 - ry) / 256 + rx = x % 65536 + ry = y % 256 + res = res + AND_of_two_bytes[rx + ry] * 256 + x = (x - rx) / 256 + y = (y - ry) / 256 + rx = x % 65536 + y % 256 + res = res + AND_of_two_bytes[rx] * 65536 + res = res + AND_of_two_bytes[(x + y - rx) / 256] * 16777216 + if operation then + res = x0 + y0 - operation * res + end + return res + end + + function AND(x, y) + return and_or_xor(x, y) + end + + function OR(x, y) + return and_or_xor(x, y, 1) + end + + function XOR(x, y, z, t, u) -- 2..5 arguments + if z then + if t then + if u then + t = and_or_xor(t, u, 2) + end + z = and_or_xor(z, t, 2) + end + y = and_or_xor(y, z, 2) + end + return and_or_xor(x, y, 2) + end + + function XOR_BYTE(x, y) + return x + y - 2 * AND_of_two_bytes[x + y * 256] + end + +end + +HEX = HEX + or + pcall(string_format, "%x", 2^31) and + function (x) -- returns string of 8 lowercase hexadecimal digits + return string_format("%08x", x % 4294967296) + end + or + function (x) -- for OpenWrt's dialect of Lua + return string_format("%08x", (x + 2^31) % 2^32 - 2^31) + end + +local function XOR32A5(x) + return XOR(x, 0xA5A5A5A5) % 4294967296 +end + +local function create_array_of_lanes() + return {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} +end + + +-------------------------------------------------------------------------------- +-- CREATING OPTIMIZED INNER LOOP +-------------------------------------------------------------------------------- + +-- Inner loop functions +local sha256_feed_64, sha512_feed_128, md5_feed_64, sha1_feed_64, keccak_feed + +-- Arrays of SHA2 "magic numbers" (in "INT64" and "FFI" branches "*_lo" arrays contain 64-bit values) +local sha2_K_lo, sha2_K_hi, sha2_H_lo, sha2_H_hi, sha3_RC_lo, sha3_RC_hi = {}, {}, {}, {}, {}, {} +local sha2_H_ext256 = {[224] = {}, [256] = sha2_H_hi} +local sha2_H_ext512_lo, sha2_H_ext512_hi = {[384] = {}, [512] = sha2_H_lo}, {[384] = {}, [512] = sha2_H_hi} +local md5_K, md5_sha1_H = {}, {0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0} +local md5_next_shift = {0, 0, 0, 0, 0, 0, 0, 0, 28, 25, 26, 27, 0, 0, 10, 9, 11, 12, 0, 15, 16, 17, 18, 0, 20, 22, 23, 21} +local HEX64, XOR64A5, lanes_index_base -- defined only for branches that internally use 64-bit integers: "INT64" and "FFI" +local common_W = {} -- temporary table shared between all calculations (to avoid creating new temporary table every time) +local K_lo_modulo, hi_factor, hi_factor_keccak = 4294967296, 0, 0 + +local function build_keccak_format(elem) + local keccak_format = {} + for _, size in ipairs{1, 9, 13, 17, 18, 21} do + keccak_format[size] = "<"..string_rep(elem, size) + end + return keccak_format +end + + +if branch == "FFI" then + + + -- SHA256 implementation for "LuaJIT with FFI" branch + + local common_W_FFI_int32 = ffi.new"int32_t[80]" -- 64 is enough for SHA256, but 80 is needed for SHA-1 + + function sha256_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W, K = common_W_FFI_int32, sha2_K_hi + for pos = offs, offs + size - 1, 64 do + for j = 0, 15 do + pos = pos + 4 + local a, b, c, d = byte(str, pos - 3, pos) -- slow, but doesn't depend on endianness + W[j] = OR(SHL(a, 24), SHL(b, 16), SHL(c, 8), d) + end + for j = 16, 63 do + local a, b = W[j-15], W[j-2] + W[j] = NORM( XOR(ROR(a, 7), ROL(a, 14), SHR(a, 3)) + XOR(ROL(b, 15), ROL(b, 13), SHR(b, 10)) + W[j-7] + W[j-16] ) + end + local a, b, c, d, e, f, g, h = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] + for j = 0, 63, 8 do -- Thanks to Peter Cawley for this workaround (unroll the loop to avoid "PHI shuffling too complex" due to PHIs overlap) + local z = NORM( XOR(g, AND(e, XOR(f, g))) + XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + (W[j] + K[j+1] + h) ) + h, g, f, e = g, f, e, NORM( d + z ) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(g, AND(e, XOR(f, g))) + XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + (W[j+1] + K[j+2] + h) ) + h, g, f, e = g, f, e, NORM( d + z ) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(g, AND(e, XOR(f, g))) + XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + (W[j+2] + K[j+3] + h) ) + h, g, f, e = g, f, e, NORM( d + z ) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(g, AND(e, XOR(f, g))) + XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + (W[j+3] + K[j+4] + h) ) + h, g, f, e = g, f, e, NORM( d + z ) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(g, AND(e, XOR(f, g))) + XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + (W[j+4] + K[j+5] + h) ) + h, g, f, e = g, f, e, NORM( d + z ) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(g, AND(e, XOR(f, g))) + XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + (W[j+5] + K[j+6] + h) ) + h, g, f, e = g, f, e, NORM( d + z ) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(g, AND(e, XOR(f, g))) + XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + (W[j+6] + K[j+7] + h) ) + h, g, f, e = g, f, e, NORM( d + z ) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(g, AND(e, XOR(f, g))) + XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + (W[j+7] + K[j+8] + h) ) + h, g, f, e = g, f, e, NORM( d + z ) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + end + H[1], H[2], H[3], H[4] = NORM(a + H[1]), NORM(b + H[2]), NORM(c + H[3]), NORM(d + H[4]) + H[5], H[6], H[7], H[8] = NORM(e + H[5]), NORM(f + H[6]), NORM(g + H[7]), NORM(h + H[8]) + end + end + + local common_W_FFI_int64 = ffi.new"int64_t[80]" + local int64 = ffi.typeof"int64_t" + local int32 = ffi.typeof"int32_t" + local uint32 = ffi.typeof"uint32_t" + + hi_factor = int64(2^32) + + if is_LuaJIT_21 then -- LuaJIT 2.1 supports bitwise 64-bit operations + + local AND64, OR64, XOR64, NOT64, SHL64, SHR64, ROL64, ROR64 -- introducing synonyms for better code readability + = AND, OR, XOR, NOT, SHL, SHR, ROL, ROR + HEX64 = HEX + + + -- SHA3 implementation for "LuaJIT 2.1 + FFI" branch + + local lanes_arr64 = ffi.typeof"int64_t[30]" -- 25 + 5 for temporary usage + -- lanes array is indexed from 0 + lanes_index_base = 0 + hi_factor_keccak = int64(2^32) + + function create_array_of_lanes() + return lanes_arr64() + end + + function keccak_feed(lanes, _, str, offs, size, block_size_in_bytes) + -- offs >= 0, size >= 0, size is multiple of block_size_in_bytes, block_size_in_bytes is positive multiple of 8 + local RC = sha3_RC_lo + local qwords_qty = SHR(block_size_in_bytes, 3) + for pos = offs, offs + size - 1, block_size_in_bytes do + for j = 0, qwords_qty - 1 do + pos = pos + 8 + local h, g, f, e, d, c, b, a = byte(str, pos - 7, pos) -- slow, but doesn't depend on endianness + lanes[j] = XOR64(lanes[j], OR64(OR(SHL(a, 24), SHL(b, 16), SHL(c, 8), d) * int64(2^32), uint32(int32(OR(SHL(e, 24), SHL(f, 16), SHL(g, 8), h))))) + end + for round_idx = 1, 24 do + for j = 0, 4 do + lanes[25 + j] = XOR64(lanes[j], lanes[j+5], lanes[j+10], lanes[j+15], lanes[j+20]) + end + local D = XOR64(lanes[25], ROL64(lanes[27], 1)) + lanes[1], lanes[6], lanes[11], lanes[16] = ROL64(XOR64(D, lanes[6]), 44), ROL64(XOR64(D, lanes[16]), 45), ROL64(XOR64(D, lanes[1]), 1), ROL64(XOR64(D, lanes[11]), 10) + lanes[21] = ROL64(XOR64(D, lanes[21]), 2) + D = XOR64(lanes[26], ROL64(lanes[28], 1)) + lanes[2], lanes[7], lanes[12], lanes[22] = ROL64(XOR64(D, lanes[12]), 43), ROL64(XOR64(D, lanes[22]), 61), ROL64(XOR64(D, lanes[7]), 6), ROL64(XOR64(D, lanes[2]), 62) + lanes[17] = ROL64(XOR64(D, lanes[17]), 15) + D = XOR64(lanes[27], ROL64(lanes[29], 1)) + lanes[3], lanes[8], lanes[18], lanes[23] = ROL64(XOR64(D, lanes[18]), 21), ROL64(XOR64(D, lanes[3]), 28), ROL64(XOR64(D, lanes[23]), 56), ROL64(XOR64(D, lanes[8]), 55) + lanes[13] = ROL64(XOR64(D, lanes[13]), 25) + D = XOR64(lanes[28], ROL64(lanes[25], 1)) + lanes[4], lanes[14], lanes[19], lanes[24] = ROL64(XOR64(D, lanes[24]), 14), ROL64(XOR64(D, lanes[19]), 8), ROL64(XOR64(D, lanes[4]), 27), ROL64(XOR64(D, lanes[14]), 39) + lanes[9] = ROL64(XOR64(D, lanes[9]), 20) + D = XOR64(lanes[29], ROL64(lanes[26], 1)) + lanes[5], lanes[10], lanes[15], lanes[20] = ROL64(XOR64(D, lanes[10]), 3), ROL64(XOR64(D, lanes[20]), 18), ROL64(XOR64(D, lanes[5]), 36), ROL64(XOR64(D, lanes[15]), 41) + lanes[0] = XOR64(D, lanes[0]) + lanes[0], lanes[1], lanes[2], lanes[3], lanes[4] = XOR64(lanes[0], AND64(NOT64(lanes[1]), lanes[2]), RC[round_idx]), XOR64(lanes[1], AND64(NOT64(lanes[2]), lanes[3])), XOR64(lanes[2], AND64(NOT64(lanes[3]), lanes[4])), XOR64(lanes[3], AND64(NOT64(lanes[4]), lanes[0])), XOR64(lanes[4], AND64(NOT64(lanes[0]), lanes[1])) + lanes[5], lanes[6], lanes[7], lanes[8], lanes[9] = XOR64(lanes[8], AND64(NOT64(lanes[9]), lanes[5])), XOR64(lanes[9], AND64(NOT64(lanes[5]), lanes[6])), XOR64(lanes[5], AND64(NOT64(lanes[6]), lanes[7])), XOR64(lanes[6], AND64(NOT64(lanes[7]), lanes[8])), XOR64(lanes[7], AND64(NOT64(lanes[8]), lanes[9])) + lanes[10], lanes[11], lanes[12], lanes[13], lanes[14] = XOR64(lanes[11], AND64(NOT64(lanes[12]), lanes[13])), XOR64(lanes[12], AND64(NOT64(lanes[13]), lanes[14])), XOR64(lanes[13], AND64(NOT64(lanes[14]), lanes[10])), XOR64(lanes[14], AND64(NOT64(lanes[10]), lanes[11])), XOR64(lanes[10], AND64(NOT64(lanes[11]), lanes[12])) + lanes[15], lanes[16], lanes[17], lanes[18], lanes[19] = XOR64(lanes[19], AND64(NOT64(lanes[15]), lanes[16])), XOR64(lanes[15], AND64(NOT64(lanes[16]), lanes[17])), XOR64(lanes[16], AND64(NOT64(lanes[17]), lanes[18])), XOR64(lanes[17], AND64(NOT64(lanes[18]), lanes[19])), XOR64(lanes[18], AND64(NOT64(lanes[19]), lanes[15])) + lanes[20], lanes[21], lanes[22], lanes[23], lanes[24] = XOR64(lanes[22], AND64(NOT64(lanes[23]), lanes[24])), XOR64(lanes[23], AND64(NOT64(lanes[24]), lanes[20])), XOR64(lanes[24], AND64(NOT64(lanes[20]), lanes[21])), XOR64(lanes[20], AND64(NOT64(lanes[21]), lanes[22])), XOR64(lanes[21], AND64(NOT64(lanes[22]), lanes[23])) + end + end + end + + + -- SHA512 implementation for "LuaJIT 2.1 + FFI" branch + + local A5_long = 0xA5A5A5A5 * int64(2^32 + 1) -- It's impossible to use constant 0xA5A5A5A5A5A5A5A5LL because it will raise syntax error on other Lua versions + + function XOR64A5(long) + return XOR64(long, A5_long) + end + + function sha512_feed_128(H, _, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 128 + local W, K = common_W_FFI_int64, sha2_K_lo + for pos = offs, offs + size - 1, 128 do + for j = 0, 15 do + pos = pos + 8 + local a, b, c, d, e, f, g, h = byte(str, pos - 7, pos) -- slow, but doesn't depend on endianness + W[j] = OR64(OR(SHL(a, 24), SHL(b, 16), SHL(c, 8), d) * int64(2^32), uint32(int32(OR(SHL(e, 24), SHL(f, 16), SHL(g, 8), h)))) + end + for j = 16, 79 do + local a, b = W[j-15], W[j-2] + W[j] = XOR64(ROR64(a, 1), ROR64(a, 8), SHR64(a, 7)) + XOR64(ROR64(b, 19), ROL64(b, 3), SHR64(b, 6)) + W[j-7] + W[j-16] + end + local a, b, c, d, e, f, g, h = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] + for j = 0, 79, 8 do + local z = XOR64(ROR64(e, 14), ROR64(e, 18), ROL64(e, 23)) + XOR64(g, AND64(e, XOR64(f, g))) + h + K[j+1] + W[j] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XOR64(AND64(XOR64(a, b), c), AND64(a, b)) + XOR64(ROR64(a, 28), ROL64(a, 25), ROL64(a, 30)) + z + z = XOR64(ROR64(e, 14), ROR64(e, 18), ROL64(e, 23)) + XOR64(g, AND64(e, XOR64(f, g))) + h + K[j+2] + W[j+1] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XOR64(AND64(XOR64(a, b), c), AND64(a, b)) + XOR64(ROR64(a, 28), ROL64(a, 25), ROL64(a, 30)) + z + z = XOR64(ROR64(e, 14), ROR64(e, 18), ROL64(e, 23)) + XOR64(g, AND64(e, XOR64(f, g))) + h + K[j+3] + W[j+2] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XOR64(AND64(XOR64(a, b), c), AND64(a, b)) + XOR64(ROR64(a, 28), ROL64(a, 25), ROL64(a, 30)) + z + z = XOR64(ROR64(e, 14), ROR64(e, 18), ROL64(e, 23)) + XOR64(g, AND64(e, XOR64(f, g))) + h + K[j+4] + W[j+3] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XOR64(AND64(XOR64(a, b), c), AND64(a, b)) + XOR64(ROR64(a, 28), ROL64(a, 25), ROL64(a, 30)) + z + z = XOR64(ROR64(e, 14), ROR64(e, 18), ROL64(e, 23)) + XOR64(g, AND64(e, XOR64(f, g))) + h + K[j+5] + W[j+4] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XOR64(AND64(XOR64(a, b), c), AND64(a, b)) + XOR64(ROR64(a, 28), ROL64(a, 25), ROL64(a, 30)) + z + z = XOR64(ROR64(e, 14), ROR64(e, 18), ROL64(e, 23)) + XOR64(g, AND64(e, XOR64(f, g))) + h + K[j+6] + W[j+5] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XOR64(AND64(XOR64(a, b), c), AND64(a, b)) + XOR64(ROR64(a, 28), ROL64(a, 25), ROL64(a, 30)) + z + z = XOR64(ROR64(e, 14), ROR64(e, 18), ROL64(e, 23)) + XOR64(g, AND64(e, XOR64(f, g))) + h + K[j+7] + W[j+6] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XOR64(AND64(XOR64(a, b), c), AND64(a, b)) + XOR64(ROR64(a, 28), ROL64(a, 25), ROL64(a, 30)) + z + z = XOR64(ROR64(e, 14), ROR64(e, 18), ROL64(e, 23)) + XOR64(g, AND64(e, XOR64(f, g))) + h + K[j+8] + W[j+7] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XOR64(AND64(XOR64(a, b), c), AND64(a, b)) + XOR64(ROR64(a, 28), ROL64(a, 25), ROL64(a, 30)) + z + end + H[1] = a + H[1] + H[2] = b + H[2] + H[3] = c + H[3] + H[4] = d + H[4] + H[5] = e + H[5] + H[6] = f + H[6] + H[7] = g + H[7] + H[8] = h + H[8] + end + end + + else -- LuaJIT 2.0 doesn't support 64-bit bitwise operations + + + -- SHA512 implementation for "LuaJIT 2.0 + FFI" branch + + local union64 = ffi.typeof"union{int64_t i64; struct{int32_t lo, hi;} i32;}" + do -- make sure the struct is endianness-compatible + local u = union64(1) + if u.i32.lo < u.i32.hi then + union64 = ffi.typeof"union{int64_t i64; struct{int32_t hi, lo;} i32;}" + end + end + local unions64 = ffi.typeof("$[?]", union64) + local U = unions64(3) -- this array of unions is used for fast splitting int64 into int32_high and int32_low + + -- "xorrific" 64-bit functions :-) + -- int64 input is splitted into two int32 parts, some bitwise 32-bit operations are performed, finally the result is converted to int64 + -- these functions are needed because bit.* functions in LuaJIT 2.0 don't work with int64_t + + local function XORROR64_1(a) + -- return XOR64(ROR64(a, 1), ROR64(a, 8), SHR64(a, 7)) + U[0].i64 = a + local a_lo, a_hi = U[0].i32.lo, U[0].i32.hi + local t_lo = XOR(OR(SHR(a_lo, 1), SHL(a_hi, 31)), OR(SHR(a_lo, 8), SHL(a_hi, 24)), OR(SHR(a_lo, 7), SHL(a_hi, 25))) + local t_hi = XOR(OR(SHR(a_hi, 1), SHL(a_lo, 31)), OR(SHR(a_hi, 8), SHL(a_lo, 24)), SHR(a_hi, 7)) + return t_hi * int64(2^32) + uint32(int32(t_lo)) + end + + local function XORROR64_2(b) + -- return XOR64(ROR64(b, 19), ROL64(b, 3), SHR64(b, 6)) + U[0].i64 = b + local b_lo, b_hi = U[0].i32.lo, U[0].i32.hi + local u_lo = XOR(OR(SHR(b_lo, 19), SHL(b_hi, 13)), OR(SHL(b_lo, 3), SHR(b_hi, 29)), OR(SHR(b_lo, 6), SHL(b_hi, 26))) + local u_hi = XOR(OR(SHR(b_hi, 19), SHL(b_lo, 13)), OR(SHL(b_hi, 3), SHR(b_lo, 29)), SHR(b_hi, 6)) + return u_hi * int64(2^32) + uint32(int32(u_lo)) + end + + local function XORROR64_3(e) + -- return XOR64(ROR64(e, 14), ROR64(e, 18), ROL64(e, 23)) + U[0].i64 = e + local e_lo, e_hi = U[0].i32.lo, U[0].i32.hi + local u_lo = XOR(OR(SHR(e_lo, 14), SHL(e_hi, 18)), OR(SHR(e_lo, 18), SHL(e_hi, 14)), OR(SHL(e_lo, 23), SHR(e_hi, 9))) + local u_hi = XOR(OR(SHR(e_hi, 14), SHL(e_lo, 18)), OR(SHR(e_hi, 18), SHL(e_lo, 14)), OR(SHL(e_hi, 23), SHR(e_lo, 9))) + return u_hi * int64(2^32) + uint32(int32(u_lo)) + end + + local function XORROR64_6(a) + -- return XOR64(ROR64(a, 28), ROL64(a, 25), ROL64(a, 30)) + U[0].i64 = a + local b_lo, b_hi = U[0].i32.lo, U[0].i32.hi + local u_lo = XOR(OR(SHR(b_lo, 28), SHL(b_hi, 4)), OR(SHL(b_lo, 30), SHR(b_hi, 2)), OR(SHL(b_lo, 25), SHR(b_hi, 7))) + local u_hi = XOR(OR(SHR(b_hi, 28), SHL(b_lo, 4)), OR(SHL(b_hi, 30), SHR(b_lo, 2)), OR(SHL(b_hi, 25), SHR(b_lo, 7))) + return u_hi * int64(2^32) + uint32(int32(u_lo)) + end + + local function XORROR64_4(e, f, g) + -- return XOR64(g, AND64(e, XOR64(f, g))) + U[0].i64 = f + U[1].i64 = g + U[2].i64 = e + local f_lo, f_hi = U[0].i32.lo, U[0].i32.hi + local g_lo, g_hi = U[1].i32.lo, U[1].i32.hi + local e_lo, e_hi = U[2].i32.lo, U[2].i32.hi + local result_lo = XOR(g_lo, AND(e_lo, XOR(f_lo, g_lo))) + local result_hi = XOR(g_hi, AND(e_hi, XOR(f_hi, g_hi))) + return result_hi * int64(2^32) + uint32(int32(result_lo)) + end + + local function XORROR64_5(a, b, c) + -- return XOR64(AND64(XOR64(a, b), c), AND64(a, b)) + U[0].i64 = a + U[1].i64 = b + U[2].i64 = c + local a_lo, a_hi = U[0].i32.lo, U[0].i32.hi + local b_lo, b_hi = U[1].i32.lo, U[1].i32.hi + local c_lo, c_hi = U[2].i32.lo, U[2].i32.hi + local result_lo = XOR(AND(XOR(a_lo, b_lo), c_lo), AND(a_lo, b_lo)) + local result_hi = XOR(AND(XOR(a_hi, b_hi), c_hi), AND(a_hi, b_hi)) + return result_hi * int64(2^32) + uint32(int32(result_lo)) + end + + function XOR64A5(long) + -- return XOR64(long, 0xA5A5A5A5A5A5A5A5) + U[0].i64 = long + local lo32, hi32 = U[0].i32.lo, U[0].i32.hi + lo32 = XOR(lo32, 0xA5A5A5A5) + hi32 = XOR(hi32, 0xA5A5A5A5) + return hi32 * int64(2^32) + uint32(int32(lo32)) + end + + function HEX64(long) + U[0].i64 = long + return HEX(U[0].i32.hi)..HEX(U[0].i32.lo) + end + + function sha512_feed_128(H, _, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 128 + local W, K = common_W_FFI_int64, sha2_K_lo + for pos = offs, offs + size - 1, 128 do + for j = 0, 15 do + pos = pos + 8 + local a, b, c, d, e, f, g, h = byte(str, pos - 7, pos) -- slow, but doesn't depend on endianness + W[j] = OR(SHL(a, 24), SHL(b, 16), SHL(c, 8), d) * int64(2^32) + uint32(int32(OR(SHL(e, 24), SHL(f, 16), SHL(g, 8), h))) + end + for j = 16, 79 do + W[j] = XORROR64_1(W[j-15]) + XORROR64_2(W[j-2]) + W[j-7] + W[j-16] + end + local a, b, c, d, e, f, g, h = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] + for j = 0, 79, 8 do + local z = XORROR64_3(e) + XORROR64_4(e, f, g) + h + K[j+1] + W[j] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XORROR64_5(a, b, c) + XORROR64_6(a) + z + z = XORROR64_3(e) + XORROR64_4(e, f, g) + h + K[j+2] + W[j+1] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XORROR64_5(a, b, c) + XORROR64_6(a) + z + z = XORROR64_3(e) + XORROR64_4(e, f, g) + h + K[j+3] + W[j+2] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XORROR64_5(a, b, c) + XORROR64_6(a) + z + z = XORROR64_3(e) + XORROR64_4(e, f, g) + h + K[j+4] + W[j+3] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XORROR64_5(a, b, c) + XORROR64_6(a) + z + z = XORROR64_3(e) + XORROR64_4(e, f, g) + h + K[j+5] + W[j+4] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XORROR64_5(a, b, c) + XORROR64_6(a) + z + z = XORROR64_3(e) + XORROR64_4(e, f, g) + h + K[j+6] + W[j+5] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XORROR64_5(a, b, c) + XORROR64_6(a) + z + z = XORROR64_3(e) + XORROR64_4(e, f, g) + h + K[j+7] + W[j+6] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XORROR64_5(a, b, c) + XORROR64_6(a) + z + z = XORROR64_3(e) + XORROR64_4(e, f, g) + h + K[j+8] + W[j+7] + h, g, f, e = g, f, e, z + d + d, c, b, a = c, b, a, XORROR64_5(a, b, c) + XORROR64_6(a) + z + end + H[1] = a + H[1] + H[2] = b + H[2] + H[3] = c + H[3] + H[4] = d + H[4] + H[5] = e + H[5] + H[6] = f + H[6] + H[7] = g + H[7] + H[8] = h + H[8] + end + end + + end + + + -- MD5 implementation for "LuaJIT with FFI" branch + + function md5_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W, K = common_W_FFI_int32, md5_K + for pos = offs, offs + size - 1, 64 do + for j = 0, 15 do + pos = pos + 4 + local a, b, c, d = byte(str, pos - 3, pos) -- slow, but doesn't depend on endianness + W[j] = OR(SHL(d, 24), SHL(c, 16), SHL(b, 8), a) + end + local a, b, c, d = H[1], H[2], H[3], H[4] + for j = 0, 15, 4 do + a, d, c, b = d, c, b, NORM(ROL(XOR(d, AND(b, XOR(c, d))) + (K[j+1] + W[j ] + a), 7) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(d, AND(b, XOR(c, d))) + (K[j+2] + W[j+1] + a), 12) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(d, AND(b, XOR(c, d))) + (K[j+3] + W[j+2] + a), 17) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(d, AND(b, XOR(c, d))) + (K[j+4] + W[j+3] + a), 22) + b) + end + for j = 16, 31, 4 do + local g = 5*j + a, d, c, b = d, c, b, NORM(ROL(XOR(c, AND(d, XOR(b, c))) + (K[j+1] + W[AND(g + 1, 15)] + a), 5) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(c, AND(d, XOR(b, c))) + (K[j+2] + W[AND(g + 6, 15)] + a), 9) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(c, AND(d, XOR(b, c))) + (K[j+3] + W[AND(g - 5, 15)] + a), 14) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(c, AND(d, XOR(b, c))) + (K[j+4] + W[AND(g , 15)] + a), 20) + b) + end + for j = 32, 47, 4 do + local g = 3*j + a, d, c, b = d, c, b, NORM(ROL(XOR(b, c, d) + (K[j+1] + W[AND(g + 5, 15)] + a), 4) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(b, c, d) + (K[j+2] + W[AND(g + 8, 15)] + a), 11) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(b, c, d) + (K[j+3] + W[AND(g - 5, 15)] + a), 16) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(b, c, d) + (K[j+4] + W[AND(g - 2, 15)] + a), 23) + b) + end + for j = 48, 63, 4 do + local g = 7*j + a, d, c, b = d, c, b, NORM(ROL(XOR(c, OR(b, NOT(d))) + (K[j+1] + W[AND(g , 15)] + a), 6) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(c, OR(b, NOT(d))) + (K[j+2] + W[AND(g + 7, 15)] + a), 10) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(c, OR(b, NOT(d))) + (K[j+3] + W[AND(g - 2, 15)] + a), 15) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(c, OR(b, NOT(d))) + (K[j+4] + W[AND(g + 5, 15)] + a), 21) + b) + end + H[1], H[2], H[3], H[4] = NORM(a + H[1]), NORM(b + H[2]), NORM(c + H[3]), NORM(d + H[4]) + end + end + + + -- SHA-1 implementation for "LuaJIT with FFI" branch + + function sha1_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W = common_W_FFI_int32 + for pos = offs, offs + size - 1, 64 do + for j = 0, 15 do + pos = pos + 4 + local a, b, c, d = byte(str, pos - 3, pos) -- slow, but doesn't depend on endianness + W[j] = OR(SHL(a, 24), SHL(b, 16), SHL(c, 8), d) + end + for j = 16, 79 do + W[j] = ROL(XOR(W[j-3], W[j-8], W[j-14], W[j-16]), 1) + end + local a, b, c, d, e = H[1], H[2], H[3], H[4], H[5] + for j = 0, 19, 5 do + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(d, AND(b, XOR(d, c))) + (W[j] + 0x5A827999 + e)) -- constant = floor(2^30 * sqrt(2)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(d, AND(b, XOR(d, c))) + (W[j+1] + 0x5A827999 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(d, AND(b, XOR(d, c))) + (W[j+2] + 0x5A827999 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(d, AND(b, XOR(d, c))) + (W[j+3] + 0x5A827999 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(d, AND(b, XOR(d, c))) + (W[j+4] + 0x5A827999 + e)) + end + for j = 20, 39, 5 do + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j] + 0x6ED9EBA1 + e)) -- 2^30 * sqrt(3) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+1] + 0x6ED9EBA1 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+2] + 0x6ED9EBA1 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+3] + 0x6ED9EBA1 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+4] + 0x6ED9EBA1 + e)) + end + for j = 40, 59, 5 do + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(AND(d, XOR(b, c)), AND(b, c)) + (W[j] + 0x8F1BBCDC + e)) -- 2^30 * sqrt(5) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(AND(d, XOR(b, c)), AND(b, c)) + (W[j+1] + 0x8F1BBCDC + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(AND(d, XOR(b, c)), AND(b, c)) + (W[j+2] + 0x8F1BBCDC + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(AND(d, XOR(b, c)), AND(b, c)) + (W[j+3] + 0x8F1BBCDC + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(AND(d, XOR(b, c)), AND(b, c)) + (W[j+4] + 0x8F1BBCDC + e)) + end + for j = 60, 79, 5 do + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j] + 0xCA62C1D6 + e)) -- 2^30 * sqrt(10) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+1] + 0xCA62C1D6 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+2] + 0xCA62C1D6 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+3] + 0xCA62C1D6 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+4] + 0xCA62C1D6 + e)) + end + H[1], H[2], H[3], H[4], H[5] = NORM(a + H[1]), NORM(b + H[2]), NORM(c + H[3]), NORM(d + H[4]), NORM(e + H[5]) + end + end + +end + + +-- SHA3 implementation for "LuaJIT 2.0 + FFI" and "LuaJIT without FFI" branches + +if branch == "FFI" and not is_LuaJIT_21 or branch == "LJ" then + + if branch == "FFI" then + local lanes_arr32 = ffi.typeof"int32_t[31]" -- 25 + 5 + 1 (due to 1-based indexing) + + function create_array_of_lanes() + return lanes_arr32() + end + + end + + function keccak_feed(lanes_lo, lanes_hi, str, offs, size, block_size_in_bytes) + -- offs >= 0, size >= 0, size is multiple of block_size_in_bytes, block_size_in_bytes is positive multiple of 8 + local RC_lo, RC_hi = sha3_RC_lo, sha3_RC_hi + local qwords_qty = SHR(block_size_in_bytes, 3) + for pos = offs, offs + size - 1, block_size_in_bytes do + for j = 1, qwords_qty do + local a, b, c, d = byte(str, pos + 1, pos + 4) + lanes_lo[j] = XOR(lanes_lo[j], OR(SHL(d, 24), SHL(c, 16), SHL(b, 8), a)) + pos = pos + 8 + a, b, c, d = byte(str, pos - 3, pos) + lanes_hi[j] = XOR(lanes_hi[j], OR(SHL(d, 24), SHL(c, 16), SHL(b, 8), a)) + end + for round_idx = 1, 24 do + for j = 1, 5 do + lanes_lo[25 + j] = XOR(lanes_lo[j], lanes_lo[j + 5], lanes_lo[j + 10], lanes_lo[j + 15], lanes_lo[j + 20]) + end + for j = 1, 5 do + lanes_hi[25 + j] = XOR(lanes_hi[j], lanes_hi[j + 5], lanes_hi[j + 10], lanes_hi[j + 15], lanes_hi[j + 20]) + end + local D_lo = XOR(lanes_lo[26], SHL(lanes_lo[28], 1), SHR(lanes_hi[28], 31)) + local D_hi = XOR(lanes_hi[26], SHL(lanes_hi[28], 1), SHR(lanes_lo[28], 31)) + lanes_lo[2], lanes_hi[2], lanes_lo[7], lanes_hi[7], lanes_lo[12], lanes_hi[12], lanes_lo[17], lanes_hi[17] = XOR(SHR(XOR(D_lo, lanes_lo[7]), 20), SHL(XOR(D_hi, lanes_hi[7]), 12)), XOR(SHR(XOR(D_hi, lanes_hi[7]), 20), SHL(XOR(D_lo, lanes_lo[7]), 12)), XOR(SHR(XOR(D_lo, lanes_lo[17]), 19), SHL(XOR(D_hi, lanes_hi[17]), 13)), XOR(SHR(XOR(D_hi, lanes_hi[17]), 19), SHL(XOR(D_lo, lanes_lo[17]), 13)), XOR(SHL(XOR(D_lo, lanes_lo[2]), 1), SHR(XOR(D_hi, lanes_hi[2]), 31)), XOR(SHL(XOR(D_hi, lanes_hi[2]), 1), SHR(XOR(D_lo, lanes_lo[2]), 31)), XOR(SHL(XOR(D_lo, lanes_lo[12]), 10), SHR(XOR(D_hi, lanes_hi[12]), 22)), XOR(SHL(XOR(D_hi, lanes_hi[12]), 10), SHR(XOR(D_lo, lanes_lo[12]), 22)) + local L, H = XOR(D_lo, lanes_lo[22]), XOR(D_hi, lanes_hi[22]) + lanes_lo[22], lanes_hi[22] = XOR(SHL(L, 2), SHR(H, 30)), XOR(SHL(H, 2), SHR(L, 30)) + D_lo = XOR(lanes_lo[27], SHL(lanes_lo[29], 1), SHR(lanes_hi[29], 31)) + D_hi = XOR(lanes_hi[27], SHL(lanes_hi[29], 1), SHR(lanes_lo[29], 31)) + lanes_lo[3], lanes_hi[3], lanes_lo[8], lanes_hi[8], lanes_lo[13], lanes_hi[13], lanes_lo[23], lanes_hi[23] = XOR(SHR(XOR(D_lo, lanes_lo[13]), 21), SHL(XOR(D_hi, lanes_hi[13]), 11)), XOR(SHR(XOR(D_hi, lanes_hi[13]), 21), SHL(XOR(D_lo, lanes_lo[13]), 11)), XOR(SHR(XOR(D_lo, lanes_lo[23]), 3), SHL(XOR(D_hi, lanes_hi[23]), 29)), XOR(SHR(XOR(D_hi, lanes_hi[23]), 3), SHL(XOR(D_lo, lanes_lo[23]), 29)), XOR(SHL(XOR(D_lo, lanes_lo[8]), 6), SHR(XOR(D_hi, lanes_hi[8]), 26)), XOR(SHL(XOR(D_hi, lanes_hi[8]), 6), SHR(XOR(D_lo, lanes_lo[8]), 26)), XOR(SHR(XOR(D_lo, lanes_lo[3]), 2), SHL(XOR(D_hi, lanes_hi[3]), 30)), XOR(SHR(XOR(D_hi, lanes_hi[3]), 2), SHL(XOR(D_lo, lanes_lo[3]), 30)) + L, H = XOR(D_lo, lanes_lo[18]), XOR(D_hi, lanes_hi[18]) + lanes_lo[18], lanes_hi[18] = XOR(SHL(L, 15), SHR(H, 17)), XOR(SHL(H, 15), SHR(L, 17)) + D_lo = XOR(lanes_lo[28], SHL(lanes_lo[30], 1), SHR(lanes_hi[30], 31)) + D_hi = XOR(lanes_hi[28], SHL(lanes_hi[30], 1), SHR(lanes_lo[30], 31)) + lanes_lo[4], lanes_hi[4], lanes_lo[9], lanes_hi[9], lanes_lo[19], lanes_hi[19], lanes_lo[24], lanes_hi[24] = XOR(SHL(XOR(D_lo, lanes_lo[19]), 21), SHR(XOR(D_hi, lanes_hi[19]), 11)), XOR(SHL(XOR(D_hi, lanes_hi[19]), 21), SHR(XOR(D_lo, lanes_lo[19]), 11)), XOR(SHL(XOR(D_lo, lanes_lo[4]), 28), SHR(XOR(D_hi, lanes_hi[4]), 4)), XOR(SHL(XOR(D_hi, lanes_hi[4]), 28), SHR(XOR(D_lo, lanes_lo[4]), 4)), XOR(SHR(XOR(D_lo, lanes_lo[24]), 8), SHL(XOR(D_hi, lanes_hi[24]), 24)), XOR(SHR(XOR(D_hi, lanes_hi[24]), 8), SHL(XOR(D_lo, lanes_lo[24]), 24)), XOR(SHR(XOR(D_lo, lanes_lo[9]), 9), SHL(XOR(D_hi, lanes_hi[9]), 23)), XOR(SHR(XOR(D_hi, lanes_hi[9]), 9), SHL(XOR(D_lo, lanes_lo[9]), 23)) + L, H = XOR(D_lo, lanes_lo[14]), XOR(D_hi, lanes_hi[14]) + lanes_lo[14], lanes_hi[14] = XOR(SHL(L, 25), SHR(H, 7)), XOR(SHL(H, 25), SHR(L, 7)) + D_lo = XOR(lanes_lo[29], SHL(lanes_lo[26], 1), SHR(lanes_hi[26], 31)) + D_hi = XOR(lanes_hi[29], SHL(lanes_hi[26], 1), SHR(lanes_lo[26], 31)) + lanes_lo[5], lanes_hi[5], lanes_lo[15], lanes_hi[15], lanes_lo[20], lanes_hi[20], lanes_lo[25], lanes_hi[25] = XOR(SHL(XOR(D_lo, lanes_lo[25]), 14), SHR(XOR(D_hi, lanes_hi[25]), 18)), XOR(SHL(XOR(D_hi, lanes_hi[25]), 14), SHR(XOR(D_lo, lanes_lo[25]), 18)), XOR(SHL(XOR(D_lo, lanes_lo[20]), 8), SHR(XOR(D_hi, lanes_hi[20]), 24)), XOR(SHL(XOR(D_hi, lanes_hi[20]), 8), SHR(XOR(D_lo, lanes_lo[20]), 24)), XOR(SHL(XOR(D_lo, lanes_lo[5]), 27), SHR(XOR(D_hi, lanes_hi[5]), 5)), XOR(SHL(XOR(D_hi, lanes_hi[5]), 27), SHR(XOR(D_lo, lanes_lo[5]), 5)), XOR(SHR(XOR(D_lo, lanes_lo[15]), 25), SHL(XOR(D_hi, lanes_hi[15]), 7)), XOR(SHR(XOR(D_hi, lanes_hi[15]), 25), SHL(XOR(D_lo, lanes_lo[15]), 7)) + L, H = XOR(D_lo, lanes_lo[10]), XOR(D_hi, lanes_hi[10]) + lanes_lo[10], lanes_hi[10] = XOR(SHL(L, 20), SHR(H, 12)), XOR(SHL(H, 20), SHR(L, 12)) + D_lo = XOR(lanes_lo[30], SHL(lanes_lo[27], 1), SHR(lanes_hi[27], 31)) + D_hi = XOR(lanes_hi[30], SHL(lanes_hi[27], 1), SHR(lanes_lo[27], 31)) + lanes_lo[6], lanes_hi[6], lanes_lo[11], lanes_hi[11], lanes_lo[16], lanes_hi[16], lanes_lo[21], lanes_hi[21] = XOR(SHL(XOR(D_lo, lanes_lo[11]), 3), SHR(XOR(D_hi, lanes_hi[11]), 29)), XOR(SHL(XOR(D_hi, lanes_hi[11]), 3), SHR(XOR(D_lo, lanes_lo[11]), 29)), XOR(SHL(XOR(D_lo, lanes_lo[21]), 18), SHR(XOR(D_hi, lanes_hi[21]), 14)), XOR(SHL(XOR(D_hi, lanes_hi[21]), 18), SHR(XOR(D_lo, lanes_lo[21]), 14)), XOR(SHR(XOR(D_lo, lanes_lo[6]), 28), SHL(XOR(D_hi, lanes_hi[6]), 4)), XOR(SHR(XOR(D_hi, lanes_hi[6]), 28), SHL(XOR(D_lo, lanes_lo[6]), 4)), XOR(SHR(XOR(D_lo, lanes_lo[16]), 23), SHL(XOR(D_hi, lanes_hi[16]), 9)), XOR(SHR(XOR(D_hi, lanes_hi[16]), 23), SHL(XOR(D_lo, lanes_lo[16]), 9)) + lanes_lo[1], lanes_hi[1] = XOR(D_lo, lanes_lo[1]), XOR(D_hi, lanes_hi[1]) + lanes_lo[1], lanes_lo[2], lanes_lo[3], lanes_lo[4], lanes_lo[5] = XOR(lanes_lo[1], AND(NOT(lanes_lo[2]), lanes_lo[3]), RC_lo[round_idx]), XOR(lanes_lo[2], AND(NOT(lanes_lo[3]), lanes_lo[4])), XOR(lanes_lo[3], AND(NOT(lanes_lo[4]), lanes_lo[5])), XOR(lanes_lo[4], AND(NOT(lanes_lo[5]), lanes_lo[1])), XOR(lanes_lo[5], AND(NOT(lanes_lo[1]), lanes_lo[2])) + lanes_lo[6], lanes_lo[7], lanes_lo[8], lanes_lo[9], lanes_lo[10] = XOR(lanes_lo[9], AND(NOT(lanes_lo[10]), lanes_lo[6])), XOR(lanes_lo[10], AND(NOT(lanes_lo[6]), lanes_lo[7])), XOR(lanes_lo[6], AND(NOT(lanes_lo[7]), lanes_lo[8])), XOR(lanes_lo[7], AND(NOT(lanes_lo[8]), lanes_lo[9])), XOR(lanes_lo[8], AND(NOT(lanes_lo[9]), lanes_lo[10])) + lanes_lo[11], lanes_lo[12], lanes_lo[13], lanes_lo[14], lanes_lo[15] = XOR(lanes_lo[12], AND(NOT(lanes_lo[13]), lanes_lo[14])), XOR(lanes_lo[13], AND(NOT(lanes_lo[14]), lanes_lo[15])), XOR(lanes_lo[14], AND(NOT(lanes_lo[15]), lanes_lo[11])), XOR(lanes_lo[15], AND(NOT(lanes_lo[11]), lanes_lo[12])), XOR(lanes_lo[11], AND(NOT(lanes_lo[12]), lanes_lo[13])) + lanes_lo[16], lanes_lo[17], lanes_lo[18], lanes_lo[19], lanes_lo[20] = XOR(lanes_lo[20], AND(NOT(lanes_lo[16]), lanes_lo[17])), XOR(lanes_lo[16], AND(NOT(lanes_lo[17]), lanes_lo[18])), XOR(lanes_lo[17], AND(NOT(lanes_lo[18]), lanes_lo[19])), XOR(lanes_lo[18], AND(NOT(lanes_lo[19]), lanes_lo[20])), XOR(lanes_lo[19], AND(NOT(lanes_lo[20]), lanes_lo[16])) + lanes_lo[21], lanes_lo[22], lanes_lo[23], lanes_lo[24], lanes_lo[25] = XOR(lanes_lo[23], AND(NOT(lanes_lo[24]), lanes_lo[25])), XOR(lanes_lo[24], AND(NOT(lanes_lo[25]), lanes_lo[21])), XOR(lanes_lo[25], AND(NOT(lanes_lo[21]), lanes_lo[22])), XOR(lanes_lo[21], AND(NOT(lanes_lo[22]), lanes_lo[23])), XOR(lanes_lo[22], AND(NOT(lanes_lo[23]), lanes_lo[24])) + lanes_hi[1], lanes_hi[2], lanes_hi[3], lanes_hi[4], lanes_hi[5] = XOR(lanes_hi[1], AND(NOT(lanes_hi[2]), lanes_hi[3]), RC_hi[round_idx]), XOR(lanes_hi[2], AND(NOT(lanes_hi[3]), lanes_hi[4])), XOR(lanes_hi[3], AND(NOT(lanes_hi[4]), lanes_hi[5])), XOR(lanes_hi[4], AND(NOT(lanes_hi[5]), lanes_hi[1])), XOR(lanes_hi[5], AND(NOT(lanes_hi[1]), lanes_hi[2])) + lanes_hi[6], lanes_hi[7], lanes_hi[8], lanes_hi[9], lanes_hi[10] = XOR(lanes_hi[9], AND(NOT(lanes_hi[10]), lanes_hi[6])), XOR(lanes_hi[10], AND(NOT(lanes_hi[6]), lanes_hi[7])), XOR(lanes_hi[6], AND(NOT(lanes_hi[7]), lanes_hi[8])), XOR(lanes_hi[7], AND(NOT(lanes_hi[8]), lanes_hi[9])), XOR(lanes_hi[8], AND(NOT(lanes_hi[9]), lanes_hi[10])) + lanes_hi[11], lanes_hi[12], lanes_hi[13], lanes_hi[14], lanes_hi[15] = XOR(lanes_hi[12], AND(NOT(lanes_hi[13]), lanes_hi[14])), XOR(lanes_hi[13], AND(NOT(lanes_hi[14]), lanes_hi[15])), XOR(lanes_hi[14], AND(NOT(lanes_hi[15]), lanes_hi[11])), XOR(lanes_hi[15], AND(NOT(lanes_hi[11]), lanes_hi[12])), XOR(lanes_hi[11], AND(NOT(lanes_hi[12]), lanes_hi[13])) + lanes_hi[16], lanes_hi[17], lanes_hi[18], lanes_hi[19], lanes_hi[20] = XOR(lanes_hi[20], AND(NOT(lanes_hi[16]), lanes_hi[17])), XOR(lanes_hi[16], AND(NOT(lanes_hi[17]), lanes_hi[18])), XOR(lanes_hi[17], AND(NOT(lanes_hi[18]), lanes_hi[19])), XOR(lanes_hi[18], AND(NOT(lanes_hi[19]), lanes_hi[20])), XOR(lanes_hi[19], AND(NOT(lanes_hi[20]), lanes_hi[16])) + lanes_hi[21], lanes_hi[22], lanes_hi[23], lanes_hi[24], lanes_hi[25] = XOR(lanes_hi[23], AND(NOT(lanes_hi[24]), lanes_hi[25])), XOR(lanes_hi[24], AND(NOT(lanes_hi[25]), lanes_hi[21])), XOR(lanes_hi[25], AND(NOT(lanes_hi[21]), lanes_hi[22])), XOR(lanes_hi[21], AND(NOT(lanes_hi[22]), lanes_hi[23])), XOR(lanes_hi[22], AND(NOT(lanes_hi[23]), lanes_hi[24])) + end + end + end + +end + + +if branch == "LJ" then + + + -- SHA256 implementation for "LuaJIT without FFI" branch + + function sha256_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W, K = common_W, sha2_K_hi + for pos = offs, offs + size - 1, 64 do + for j = 1, 16 do + pos = pos + 4 + local a, b, c, d = byte(str, pos - 3, pos) + W[j] = OR(SHL(a, 24), SHL(b, 16), SHL(c, 8), d) + end + for j = 17, 64 do + local a, b = W[j-15], W[j-2] + W[j] = NORM( NORM( XOR(ROR(a, 7), ROL(a, 14), SHR(a, 3)) + XOR(ROL(b, 15), ROL(b, 13), SHR(b, 10)) ) + NORM( W[j-7] + W[j-16] ) ) + end + local a, b, c, d, e, f, g, h = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] + for j = 1, 64, 8 do -- Thanks to Peter Cawley for this workaround (unroll the loop to avoid "PHI shuffling too complex" due to PHIs overlap) + local z = NORM( XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + XOR(g, AND(e, XOR(f, g))) + (K[j] + W[j] + h) ) + h, g, f, e = g, f, e, NORM(d + z) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + XOR(g, AND(e, XOR(f, g))) + (K[j+1] + W[j+1] + h) ) + h, g, f, e = g, f, e, NORM(d + z) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + XOR(g, AND(e, XOR(f, g))) + (K[j+2] + W[j+2] + h) ) + h, g, f, e = g, f, e, NORM(d + z) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + XOR(g, AND(e, XOR(f, g))) + (K[j+3] + W[j+3] + h) ) + h, g, f, e = g, f, e, NORM(d + z) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + XOR(g, AND(e, XOR(f, g))) + (K[j+4] + W[j+4] + h) ) + h, g, f, e = g, f, e, NORM(d + z) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + XOR(g, AND(e, XOR(f, g))) + (K[j+5] + W[j+5] + h) ) + h, g, f, e = g, f, e, NORM(d + z) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + XOR(g, AND(e, XOR(f, g))) + (K[j+6] + W[j+6] + h) ) + h, g, f, e = g, f, e, NORM(d + z) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + z = NORM( XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + XOR(g, AND(e, XOR(f, g))) + (K[j+7] + W[j+7] + h) ) + h, g, f, e = g, f, e, NORM(d + z) + d, c, b, a = c, b, a, NORM( XOR(AND(a, XOR(b, c)), AND(b, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + z ) + end + H[1], H[2], H[3], H[4] = NORM(a + H[1]), NORM(b + H[2]), NORM(c + H[3]), NORM(d + H[4]) + H[5], H[6], H[7], H[8] = NORM(e + H[5]), NORM(f + H[6]), NORM(g + H[7]), NORM(h + H[8]) + end + end + + local function ADD64_4(a_lo, a_hi, b_lo, b_hi, c_lo, c_hi, d_lo, d_hi) + local sum_lo = a_lo % 2^32 + b_lo % 2^32 + c_lo % 2^32 + d_lo % 2^32 + local sum_hi = a_hi + b_hi + c_hi + d_hi + local result_lo = NORM( sum_lo ) + local result_hi = NORM( sum_hi + floor(sum_lo / 2^32) ) + return result_lo, result_hi + end + + if LuaJIT_arch == "x86" then -- Special trick is required to avoid "PHI shuffling too complex" on x86 platform + + + -- SHA512 implementation for "LuaJIT x86 without FFI" branch + + function sha512_feed_128(H_lo, H_hi, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 128 + -- W1_hi, W1_lo, W2_hi, W2_lo, ... Wk_hi = W[2*k-1], Wk_lo = W[2*k] + local W, K_lo, K_hi = common_W, sha2_K_lo, sha2_K_hi + for pos = offs, offs + size - 1, 128 do + for j = 1, 16*2 do + pos = pos + 4 + local a, b, c, d = byte(str, pos - 3, pos) + W[j] = OR(SHL(a, 24), SHL(b, 16), SHL(c, 8), d) + end + for jj = 17*2, 80*2, 2 do + local a_lo, a_hi = W[jj-30], W[jj-31] + local t_lo = XOR(OR(SHR(a_lo, 1), SHL(a_hi, 31)), OR(SHR(a_lo, 8), SHL(a_hi, 24)), OR(SHR(a_lo, 7), SHL(a_hi, 25))) + local t_hi = XOR(OR(SHR(a_hi, 1), SHL(a_lo, 31)), OR(SHR(a_hi, 8), SHL(a_lo, 24)), SHR(a_hi, 7)) + local b_lo, b_hi = W[jj-4], W[jj-5] + local u_lo = XOR(OR(SHR(b_lo, 19), SHL(b_hi, 13)), OR(SHL(b_lo, 3), SHR(b_hi, 29)), OR(SHR(b_lo, 6), SHL(b_hi, 26))) + local u_hi = XOR(OR(SHR(b_hi, 19), SHL(b_lo, 13)), OR(SHL(b_hi, 3), SHR(b_lo, 29)), SHR(b_hi, 6)) + W[jj], W[jj-1] = ADD64_4(t_lo, t_hi, u_lo, u_hi, W[jj-14], W[jj-15], W[jj-32], W[jj-33]) + end + local a_lo, b_lo, c_lo, d_lo, e_lo, f_lo, g_lo, h_lo = H_lo[1], H_lo[2], H_lo[3], H_lo[4], H_lo[5], H_lo[6], H_lo[7], H_lo[8] + local a_hi, b_hi, c_hi, d_hi, e_hi, f_hi, g_hi, h_hi = H_hi[1], H_hi[2], H_hi[3], H_hi[4], H_hi[5], H_hi[6], H_hi[7], H_hi[8] + local zero = 0 + for j = 1, 80 do + local t_lo = XOR(g_lo, AND(e_lo, XOR(f_lo, g_lo))) + local t_hi = XOR(g_hi, AND(e_hi, XOR(f_hi, g_hi))) + local u_lo = XOR(OR(SHR(e_lo, 14), SHL(e_hi, 18)), OR(SHR(e_lo, 18), SHL(e_hi, 14)), OR(SHL(e_lo, 23), SHR(e_hi, 9))) + local u_hi = XOR(OR(SHR(e_hi, 14), SHL(e_lo, 18)), OR(SHR(e_hi, 18), SHL(e_lo, 14)), OR(SHL(e_hi, 23), SHR(e_lo, 9))) + local sum_lo = u_lo % 2^32 + t_lo % 2^32 + h_lo % 2^32 + K_lo[j] + W[2*j] % 2^32 + local z_lo, z_hi = NORM( sum_lo ), NORM( u_hi + t_hi + h_hi + K_hi[j] + W[2*j-1] + floor(sum_lo / 2^32) ) + zero = zero + zero -- this thick is needed to avoid "PHI shuffling too complex" due to PHIs overlap + h_lo, h_hi, g_lo, g_hi, f_lo, f_hi = OR(zero, g_lo), OR(zero, g_hi), OR(zero, f_lo), OR(zero, f_hi), OR(zero, e_lo), OR(zero, e_hi) + local sum_lo = z_lo % 2^32 + d_lo % 2^32 + e_lo, e_hi = NORM( sum_lo ), NORM( z_hi + d_hi + floor(sum_lo / 2^32) ) + d_lo, d_hi, c_lo, c_hi, b_lo, b_hi = OR(zero, c_lo), OR(zero, c_hi), OR(zero, b_lo), OR(zero, b_hi), OR(zero, a_lo), OR(zero, a_hi) + u_lo = XOR(OR(SHR(b_lo, 28), SHL(b_hi, 4)), OR(SHL(b_lo, 30), SHR(b_hi, 2)), OR(SHL(b_lo, 25), SHR(b_hi, 7))) + u_hi = XOR(OR(SHR(b_hi, 28), SHL(b_lo, 4)), OR(SHL(b_hi, 30), SHR(b_lo, 2)), OR(SHL(b_hi, 25), SHR(b_lo, 7))) + t_lo = OR(AND(d_lo, c_lo), AND(b_lo, XOR(d_lo, c_lo))) + t_hi = OR(AND(d_hi, c_hi), AND(b_hi, XOR(d_hi, c_hi))) + local sum_lo = z_lo % 2^32 + t_lo % 2^32 + u_lo % 2^32 + a_lo, a_hi = NORM( sum_lo ), NORM( z_hi + t_hi + u_hi + floor(sum_lo / 2^32) ) + end + H_lo[1], H_hi[1] = ADD64_4(H_lo[1], H_hi[1], a_lo, a_hi, 0, 0, 0, 0) + H_lo[2], H_hi[2] = ADD64_4(H_lo[2], H_hi[2], b_lo, b_hi, 0, 0, 0, 0) + H_lo[3], H_hi[3] = ADD64_4(H_lo[3], H_hi[3], c_lo, c_hi, 0, 0, 0, 0) + H_lo[4], H_hi[4] = ADD64_4(H_lo[4], H_hi[4], d_lo, d_hi, 0, 0, 0, 0) + H_lo[5], H_hi[5] = ADD64_4(H_lo[5], H_hi[5], e_lo, e_hi, 0, 0, 0, 0) + H_lo[6], H_hi[6] = ADD64_4(H_lo[6], H_hi[6], f_lo, f_hi, 0, 0, 0, 0) + H_lo[7], H_hi[7] = ADD64_4(H_lo[7], H_hi[7], g_lo, g_hi, 0, 0, 0, 0) + H_lo[8], H_hi[8] = ADD64_4(H_lo[8], H_hi[8], h_lo, h_hi, 0, 0, 0, 0) + end + end + + else -- all platforms except x86 + + + -- SHA512 implementation for "LuaJIT non-x86 without FFI" branch + + function sha512_feed_128(H_lo, H_hi, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 128 + -- W1_hi, W1_lo, W2_hi, W2_lo, ... Wk_hi = W[2*k-1], Wk_lo = W[2*k] + local W, K_lo, K_hi = common_W, sha2_K_lo, sha2_K_hi + for pos = offs, offs + size - 1, 128 do + for j = 1, 16*2 do + pos = pos + 4 + local a, b, c, d = byte(str, pos - 3, pos) + W[j] = OR(SHL(a, 24), SHL(b, 16), SHL(c, 8), d) + end + for jj = 17*2, 80*2, 2 do + local a_lo, a_hi = W[jj-30], W[jj-31] + local t_lo = XOR(OR(SHR(a_lo, 1), SHL(a_hi, 31)), OR(SHR(a_lo, 8), SHL(a_hi, 24)), OR(SHR(a_lo, 7), SHL(a_hi, 25))) + local t_hi = XOR(OR(SHR(a_hi, 1), SHL(a_lo, 31)), OR(SHR(a_hi, 8), SHL(a_lo, 24)), SHR(a_hi, 7)) + local b_lo, b_hi = W[jj-4], W[jj-5] + local u_lo = XOR(OR(SHR(b_lo, 19), SHL(b_hi, 13)), OR(SHL(b_lo, 3), SHR(b_hi, 29)), OR(SHR(b_lo, 6), SHL(b_hi, 26))) + local u_hi = XOR(OR(SHR(b_hi, 19), SHL(b_lo, 13)), OR(SHL(b_hi, 3), SHR(b_lo, 29)), SHR(b_hi, 6)) + W[jj], W[jj-1] = ADD64_4(t_lo, t_hi, u_lo, u_hi, W[jj-14], W[jj-15], W[jj-32], W[jj-33]) + end + local a_lo, b_lo, c_lo, d_lo, e_lo, f_lo, g_lo, h_lo = H_lo[1], H_lo[2], H_lo[3], H_lo[4], H_lo[5], H_lo[6], H_lo[7], H_lo[8] + local a_hi, b_hi, c_hi, d_hi, e_hi, f_hi, g_hi, h_hi = H_hi[1], H_hi[2], H_hi[3], H_hi[4], H_hi[5], H_hi[6], H_hi[7], H_hi[8] + for j = 1, 80 do + local t_lo = XOR(g_lo, AND(e_lo, XOR(f_lo, g_lo))) + local t_hi = XOR(g_hi, AND(e_hi, XOR(f_hi, g_hi))) + local u_lo = XOR(OR(SHR(e_lo, 14), SHL(e_hi, 18)), OR(SHR(e_lo, 18), SHL(e_hi, 14)), OR(SHL(e_lo, 23), SHR(e_hi, 9))) + local u_hi = XOR(OR(SHR(e_hi, 14), SHL(e_lo, 18)), OR(SHR(e_hi, 18), SHL(e_lo, 14)), OR(SHL(e_hi, 23), SHR(e_lo, 9))) + local sum_lo = u_lo % 2^32 + t_lo % 2^32 + h_lo % 2^32 + K_lo[j] + W[2*j] % 2^32 + local z_lo, z_hi = NORM( sum_lo ), NORM( u_hi + t_hi + h_hi + K_hi[j] + W[2*j-1] + floor(sum_lo / 2^32) ) + h_lo, h_hi, g_lo, g_hi, f_lo, f_hi = g_lo, g_hi, f_lo, f_hi, e_lo, e_hi + local sum_lo = z_lo % 2^32 + d_lo % 2^32 + e_lo, e_hi = NORM( sum_lo ), NORM( z_hi + d_hi + floor(sum_lo / 2^32) ) + d_lo, d_hi, c_lo, c_hi, b_lo, b_hi = c_lo, c_hi, b_lo, b_hi, a_lo, a_hi + u_lo = XOR(OR(SHR(b_lo, 28), SHL(b_hi, 4)), OR(SHL(b_lo, 30), SHR(b_hi, 2)), OR(SHL(b_lo, 25), SHR(b_hi, 7))) + u_hi = XOR(OR(SHR(b_hi, 28), SHL(b_lo, 4)), OR(SHL(b_hi, 30), SHR(b_lo, 2)), OR(SHL(b_hi, 25), SHR(b_lo, 7))) + t_lo = OR(AND(d_lo, c_lo), AND(b_lo, XOR(d_lo, c_lo))) + t_hi = OR(AND(d_hi, c_hi), AND(b_hi, XOR(d_hi, c_hi))) + local sum_lo = z_lo % 2^32 + u_lo % 2^32 + t_lo % 2^32 + a_lo, a_hi = NORM( sum_lo ), NORM( z_hi + u_hi + t_hi + floor(sum_lo / 2^32) ) + end + H_lo[1], H_hi[1] = ADD64_4(H_lo[1], H_hi[1], a_lo, a_hi, 0, 0, 0, 0) + H_lo[2], H_hi[2] = ADD64_4(H_lo[2], H_hi[2], b_lo, b_hi, 0, 0, 0, 0) + H_lo[3], H_hi[3] = ADD64_4(H_lo[3], H_hi[3], c_lo, c_hi, 0, 0, 0, 0) + H_lo[4], H_hi[4] = ADD64_4(H_lo[4], H_hi[4], d_lo, d_hi, 0, 0, 0, 0) + H_lo[5], H_hi[5] = ADD64_4(H_lo[5], H_hi[5], e_lo, e_hi, 0, 0, 0, 0) + H_lo[6], H_hi[6] = ADD64_4(H_lo[6], H_hi[6], f_lo, f_hi, 0, 0, 0, 0) + H_lo[7], H_hi[7] = ADD64_4(H_lo[7], H_hi[7], g_lo, g_hi, 0, 0, 0, 0) + H_lo[8], H_hi[8] = ADD64_4(H_lo[8], H_hi[8], h_lo, h_hi, 0, 0, 0, 0) + end + end + + end + + + -- MD5 implementation for "LuaJIT without FFI" branch + + function md5_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W, K = common_W, md5_K + for pos = offs, offs + size - 1, 64 do + for j = 1, 16 do + pos = pos + 4 + local a, b, c, d = byte(str, pos - 3, pos) + W[j] = OR(SHL(d, 24), SHL(c, 16), SHL(b, 8), a) + end + local a, b, c, d = H[1], H[2], H[3], H[4] + for j = 1, 16, 4 do + a, d, c, b = d, c, b, NORM(ROL(XOR(d, AND(b, XOR(c, d))) + (K[j ] + W[j ] + a), 7) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(d, AND(b, XOR(c, d))) + (K[j+1] + W[j+1] + a), 12) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(d, AND(b, XOR(c, d))) + (K[j+2] + W[j+2] + a), 17) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(d, AND(b, XOR(c, d))) + (K[j+3] + W[j+3] + a), 22) + b) + end + for j = 17, 32, 4 do + local g = 5*j-4 + a, d, c, b = d, c, b, NORM(ROL(XOR(c, AND(d, XOR(b, c))) + (K[j ] + W[AND(g , 15) + 1] + a), 5) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(c, AND(d, XOR(b, c))) + (K[j+1] + W[AND(g + 5, 15) + 1] + a), 9) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(c, AND(d, XOR(b, c))) + (K[j+2] + W[AND(g + 10, 15) + 1] + a), 14) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(c, AND(d, XOR(b, c))) + (K[j+3] + W[AND(g - 1, 15) + 1] + a), 20) + b) + end + for j = 33, 48, 4 do + local g = 3*j+2 + a, d, c, b = d, c, b, NORM(ROL(XOR(b, c, d) + (K[j ] + W[AND(g , 15) + 1] + a), 4) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(b, c, d) + (K[j+1] + W[AND(g + 3, 15) + 1] + a), 11) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(b, c, d) + (K[j+2] + W[AND(g + 6, 15) + 1] + a), 16) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(b, c, d) + (K[j+3] + W[AND(g - 7, 15) + 1] + a), 23) + b) + end + for j = 49, 64, 4 do + local g = j*7 + a, d, c, b = d, c, b, NORM(ROL(XOR(c, OR(b, NOT(d))) + (K[j ] + W[AND(g - 7, 15) + 1] + a), 6) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(c, OR(b, NOT(d))) + (K[j+1] + W[AND(g , 15) + 1] + a), 10) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(c, OR(b, NOT(d))) + (K[j+2] + W[AND(g + 7, 15) + 1] + a), 15) + b) + a, d, c, b = d, c, b, NORM(ROL(XOR(c, OR(b, NOT(d))) + (K[j+3] + W[AND(g - 2, 15) + 1] + a), 21) + b) + end + H[1], H[2], H[3], H[4] = NORM(a + H[1]), NORM(b + H[2]), NORM(c + H[3]), NORM(d + H[4]) + end + end + + + -- SHA-1 implementation for "LuaJIT without FFI" branch + + function sha1_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W = common_W + for pos = offs, offs + size - 1, 64 do + for j = 1, 16 do + pos = pos + 4 + local a, b, c, d = byte(str, pos - 3, pos) + W[j] = OR(SHL(a, 24), SHL(b, 16), SHL(c, 8), d) + end + for j = 17, 80 do + W[j] = ROL(XOR(W[j-3], W[j-8], W[j-14], W[j-16]), 1) + end + local a, b, c, d, e = H[1], H[2], H[3], H[4], H[5] + for j = 1, 20, 5 do + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(d, AND(b, XOR(d, c))) + (W[j] + 0x5A827999 + e)) -- constant = floor(2^30 * sqrt(2)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(d, AND(b, XOR(d, c))) + (W[j+1] + 0x5A827999 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(d, AND(b, XOR(d, c))) + (W[j+2] + 0x5A827999 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(d, AND(b, XOR(d, c))) + (W[j+3] + 0x5A827999 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(d, AND(b, XOR(d, c))) + (W[j+4] + 0x5A827999 + e)) + end + for j = 21, 40, 5 do + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j] + 0x6ED9EBA1 + e)) -- 2^30 * sqrt(3) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+1] + 0x6ED9EBA1 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+2] + 0x6ED9EBA1 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+3] + 0x6ED9EBA1 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+4] + 0x6ED9EBA1 + e)) + end + for j = 41, 60, 5 do + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(AND(d, XOR(b, c)), AND(b, c)) + (W[j] + 0x8F1BBCDC + e)) -- 2^30 * sqrt(5) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(AND(d, XOR(b, c)), AND(b, c)) + (W[j+1] + 0x8F1BBCDC + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(AND(d, XOR(b, c)), AND(b, c)) + (W[j+2] + 0x8F1BBCDC + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(AND(d, XOR(b, c)), AND(b, c)) + (W[j+3] + 0x8F1BBCDC + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(AND(d, XOR(b, c)), AND(b, c)) + (W[j+4] + 0x8F1BBCDC + e)) + end + for j = 61, 80, 5 do + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j] + 0xCA62C1D6 + e)) -- 2^30 * sqrt(10) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+1] + 0xCA62C1D6 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+2] + 0xCA62C1D6 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+3] + 0xCA62C1D6 + e)) + e, d, c, b, a = d, c, ROR(b, 2), a, NORM(ROL(a, 5) + XOR(b, c, d) + (W[j+4] + 0xCA62C1D6 + e)) + end + H[1], H[2], H[3], H[4], H[5] = NORM(a + H[1]), NORM(b + H[2]), NORM(c + H[3]), NORM(d + H[4]), NORM(e + H[5]) + end + end + +end + + +if branch == "INT64" then + + + -- implementation for Lua 5.3/5.4 + + hi_factor = 4294967296 + hi_factor_keccak = 4294967296 + lanes_index_base = 1 + + HEX64, XOR64A5, XOR_BYTE, sha256_feed_64, sha512_feed_128, md5_feed_64, sha1_feed_64, keccak_feed = load[[ + local md5_next_shift, md5_K, sha2_K_lo, sha2_K_hi, build_keccak_format, sha3_RC_lo = ... + local string_format, string_unpack = string.format, string.unpack + local function HEX64(x) + return string_format("%016x", x) + end + local function XOR64A5(x) + return x ~ 0xa5a5a5a5a5a5a5a5 + end + local function XOR_BYTE(x, y) + return x ~ y + end + local common_W = {} + local function sha256_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W, K = common_W, sha2_K_hi + local h1, h2, h3, h4, h5, h6, h7, h8 = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] + for pos = offs + 1, offs + size, 64 do + W[1], W[2], W[3], W[4], W[5], W[6], W[7], W[8], W[9], W[10], W[11], W[12], W[13], W[14], W[15], W[16] = + string_unpack(">I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4", str, pos) + for j = 17, 64 do + local a = W[j-15] + a = a<<32 | a + local b = W[j-2] + b = b<<32 | b + W[j] = (a>>7 ~ a>>18 ~ a>>35) + (b>>17 ~ b>>19 ~ b>>42) + W[j-7] + W[j-16] & (1<<32)-1 + end + local a, b, c, d, e, f, g, h = h1, h2, h3, h4, h5, h6, h7, h8 + for j = 1, 64 do + e = e<<32 | e & (1<<32)-1 + local z = (e>>6 ~ e>>11 ~ e>>25) + (g ~ e & (f ~ g)) + h + K[j] + W[j] + h = g + g = f + f = e + e = z + d + d = c + c = b + b = a + a = a<<32 | a & (1<<32)-1 + a = z + ((a ~ c) & d ~ a & c) + (a>>2 ~ a>>13 ~ a>>22) + end + h1 = a + h1 + h2 = b + h2 + h3 = c + h3 + h4 = d + h4 + h5 = e + h5 + h6 = f + h6 + h7 = g + h7 + h8 = h + h8 + end + H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] = h1, h2, h3, h4, h5, h6, h7, h8 + end + local function sha512_feed_128(H, _, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 128 + local W, K = common_W, sha2_K_lo + local h1, h2, h3, h4, h5, h6, h7, h8 = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] + for pos = offs + 1, offs + size, 128 do + W[1], W[2], W[3], W[4], W[5], W[6], W[7], W[8], W[9], W[10], W[11], W[12], W[13], W[14], W[15], W[16] = + string_unpack(">i8i8i8i8i8i8i8i8i8i8i8i8i8i8i8i8", str, pos) + for j = 17, 80 do + local a = W[j-15] + local b = W[j-2] + W[j] = (a >> 1 ~ a >> 7 ~ a >> 8 ~ a << 56 ~ a << 63) + (b >> 6 ~ b >> 19 ~ b >> 61 ~ b << 3 ~ b << 45) + W[j-7] + W[j-16] + end + local a, b, c, d, e, f, g, h = h1, h2, h3, h4, h5, h6, h7, h8 + for j = 1, 80 do + local z = (e >> 14 ~ e >> 18 ~ e >> 41 ~ e << 23 ~ e << 46 ~ e << 50) + (g ~ e & (f ~ g)) + h + K[j] + W[j] + h = g + g = f + f = e + e = z + d + d = c + c = b + b = a + a = z + ((a ~ c) & d ~ a & c) + (a >> 28 ~ a >> 34 ~ a >> 39 ~ a << 25 ~ a << 30 ~ a << 36) + end + h1 = a + h1 + h2 = b + h2 + h3 = c + h3 + h4 = d + h4 + h5 = e + h5 + h6 = f + h6 + h7 = g + h7 + h8 = h + h8 + end + H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] = h1, h2, h3, h4, h5, h6, h7, h8 + end + local function md5_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W, K, md5_next_shift = common_W, md5_K, md5_next_shift + local h1, h2, h3, h4 = H[1], H[2], H[3], H[4] + for pos = offs + 1, offs + size, 64 do + W[1], W[2], W[3], W[4], W[5], W[6], W[7], W[8], W[9], W[10], W[11], W[12], W[13], W[14], W[15], W[16] = + string_unpack("> s) + b + s = md5_next_shift[s] + end + s = 32-5 + for j = 17, 32 do + local F = (c ~ d & (b ~ c)) + a + K[j] + W[(5*j-4 & 15) + 1] + a = d + d = c + c = b + b = ((F<<32 | F & (1<<32)-1) >> s) + b + s = md5_next_shift[s] + end + s = 32-4 + for j = 33, 48 do + local F = (b ~ c ~ d) + a + K[j] + W[(3*j+2 & 15) + 1] + a = d + d = c + c = b + b = ((F<<32 | F & (1<<32)-1) >> s) + b + s = md5_next_shift[s] + end + s = 32-6 + for j = 49, 64 do + local F = (c ~ (b | ~d)) + a + K[j] + W[(j*7-7 & 15) + 1] + a = d + d = c + c = b + b = ((F<<32 | F & (1<<32)-1) >> s) + b + s = md5_next_shift[s] + end + h1 = a + h1 + h2 = b + h2 + h3 = c + h3 + h4 = d + h4 + end + H[1], H[2], H[3], H[4] = h1, h2, h3, h4 + end + local function sha1_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W = common_W + local h1, h2, h3, h4, h5 = H[1], H[2], H[3], H[4], H[5] + for pos = offs + 1, offs + size, 64 do + W[1], W[2], W[3], W[4], W[5], W[6], W[7], W[8], W[9], W[10], W[11], W[12], W[13], W[14], W[15], W[16] = + string_unpack(">I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4", str, pos) + for j = 17, 80 do + local a = W[j-3] ~ W[j-8] ~ W[j-14] ~ W[j-16] + W[j] = (a<<32 | a) << 1 >> 32 + end + local a, b, c, d, e = h1, h2, h3, h4, h5 + for j = 1, 20 do + local z = ((a<<32 | a & (1<<32)-1) >> 27) + (d ~ b & (c ~ d)) + 0x5A827999 + W[j] + e -- constant = floor(2^30 * sqrt(2)) + e = d + d = c + c = (b<<32 | b & (1<<32)-1) >> 2 + b = a + a = z + end + for j = 21, 40 do + local z = ((a<<32 | a & (1<<32)-1) >> 27) + (b ~ c ~ d) + 0x6ED9EBA1 + W[j] + e -- 2^30 * sqrt(3) + e = d + d = c + c = (b<<32 | b & (1<<32)-1) >> 2 + b = a + a = z + end + for j = 41, 60 do + local z = ((a<<32 | a & (1<<32)-1) >> 27) + ((b ~ c) & d ~ b & c) + 0x8F1BBCDC + W[j] + e -- 2^30 * sqrt(5) + e = d + d = c + c = (b<<32 | b & (1<<32)-1) >> 2 + b = a + a = z + end + for j = 61, 80 do + local z = ((a<<32 | a & (1<<32)-1) >> 27) + (b ~ c ~ d) + 0xCA62C1D6 + W[j] + e -- 2^30 * sqrt(10) + e = d + d = c + c = (b<<32 | b & (1<<32)-1) >> 2 + b = a + a = z + end + h1 = a + h1 + h2 = b + h2 + h3 = c + h3 + h4 = d + h4 + h5 = e + h5 + end + H[1], H[2], H[3], H[4], H[5] = h1, h2, h3, h4, h5 + end + local keccak_format_i8 = build_keccak_format("i8") + local function keccak_feed(lanes, _, str, offs, size, block_size_in_bytes) + -- offs >= 0, size >= 0, size is multiple of block_size_in_bytes, block_size_in_bytes is positive multiple of 8 + local RC = sha3_RC_lo + local qwords_qty = block_size_in_bytes / 8 + local keccak_format = keccak_format_i8[qwords_qty] + for pos = offs + 1, offs + size, block_size_in_bytes do + local qwords_from_message = {string_unpack(keccak_format, str, pos)} + for j = 1, qwords_qty do + lanes[j] = lanes[j] ~ qwords_from_message[j] + end + local L01, L02, L03, L04, L05, L06, L07, L08, L09, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, L22, L23, L24, L25 = + lanes[1], lanes[2], lanes[3], lanes[4], lanes[5], lanes[6], lanes[7], lanes[8], lanes[9], lanes[10], lanes[11], lanes[12], lanes[13], + lanes[14], lanes[15], lanes[16], lanes[17], lanes[18], lanes[19], lanes[20], lanes[21], lanes[22], lanes[23], lanes[24], lanes[25] + for round_idx = 1, 24 do + local C1 = L01 ~ L06 ~ L11 ~ L16 ~ L21 + local C2 = L02 ~ L07 ~ L12 ~ L17 ~ L22 + local C3 = L03 ~ L08 ~ L13 ~ L18 ~ L23 + local C4 = L04 ~ L09 ~ L14 ~ L19 ~ L24 + local C5 = L05 ~ L10 ~ L15 ~ L20 ~ L25 + local D = C1 ~ C3<<1 ~ C3>>63 + local T0 = D ~ L02 + local T1 = D ~ L07 + local T2 = D ~ L12 + local T3 = D ~ L17 + local T4 = D ~ L22 + L02 = T1<<44 ~ T1>>20 + L07 = T3<<45 ~ T3>>19 + L12 = T0<<1 ~ T0>>63 + L17 = T2<<10 ~ T2>>54 + L22 = T4<<2 ~ T4>>62 + D = C2 ~ C4<<1 ~ C4>>63 + T0 = D ~ L03 + T1 = D ~ L08 + T2 = D ~ L13 + T3 = D ~ L18 + T4 = D ~ L23 + L03 = T2<<43 ~ T2>>21 + L08 = T4<<61 ~ T4>>3 + L13 = T1<<6 ~ T1>>58 + L18 = T3<<15 ~ T3>>49 + L23 = T0<<62 ~ T0>>2 + D = C3 ~ C5<<1 ~ C5>>63 + T0 = D ~ L04 + T1 = D ~ L09 + T2 = D ~ L14 + T3 = D ~ L19 + T4 = D ~ L24 + L04 = T3<<21 ~ T3>>43 + L09 = T0<<28 ~ T0>>36 + L14 = T2<<25 ~ T2>>39 + L19 = T4<<56 ~ T4>>8 + L24 = T1<<55 ~ T1>>9 + D = C4 ~ C1<<1 ~ C1>>63 + T0 = D ~ L05 + T1 = D ~ L10 + T2 = D ~ L15 + T3 = D ~ L20 + T4 = D ~ L25 + L05 = T4<<14 ~ T4>>50 + L10 = T1<<20 ~ T1>>44 + L15 = T3<<8 ~ T3>>56 + L20 = T0<<27 ~ T0>>37 + L25 = T2<<39 ~ T2>>25 + D = C5 ~ C2<<1 ~ C2>>63 + T1 = D ~ L06 + T2 = D ~ L11 + T3 = D ~ L16 + T4 = D ~ L21 + L06 = T2<<3 ~ T2>>61 + L11 = T4<<18 ~ T4>>46 + L16 = T1<<36 ~ T1>>28 + L21 = T3<<41 ~ T3>>23 + L01 = D ~ L01 + L01, L02, L03, L04, L05 = L01 ~ ~L02 & L03, L02 ~ ~L03 & L04, L03 ~ ~L04 & L05, L04 ~ ~L05 & L01, L05 ~ ~L01 & L02 + L06, L07, L08, L09, L10 = L09 ~ ~L10 & L06, L10 ~ ~L06 & L07, L06 ~ ~L07 & L08, L07 ~ ~L08 & L09, L08 ~ ~L09 & L10 + L11, L12, L13, L14, L15 = L12 ~ ~L13 & L14, L13 ~ ~L14 & L15, L14 ~ ~L15 & L11, L15 ~ ~L11 & L12, L11 ~ ~L12 & L13 + L16, L17, L18, L19, L20 = L20 ~ ~L16 & L17, L16 ~ ~L17 & L18, L17 ~ ~L18 & L19, L18 ~ ~L19 & L20, L19 ~ ~L20 & L16 + L21, L22, L23, L24, L25 = L23 ~ ~L24 & L25, L24 ~ ~L25 & L21, L25 ~ ~L21 & L22, L21 ~ ~L22 & L23, L22 ~ ~L23 & L24 + L01 = L01 ~ RC[round_idx] + end + lanes[1] = L01 + lanes[2] = L02 + lanes[3] = L03 + lanes[4] = L04 + lanes[5] = L05 + lanes[6] = L06 + lanes[7] = L07 + lanes[8] = L08 + lanes[9] = L09 + lanes[10] = L10 + lanes[11] = L11 + lanes[12] = L12 + lanes[13] = L13 + lanes[14] = L14 + lanes[15] = L15 + lanes[16] = L16 + lanes[17] = L17 + lanes[18] = L18 + lanes[19] = L19 + lanes[20] = L20 + lanes[21] = L21 + lanes[22] = L22 + lanes[23] = L23 + lanes[24] = L24 + lanes[25] = L25 + end + end + return HEX64, XOR64A5, XOR_BYTE, sha256_feed_64, sha512_feed_128, md5_feed_64, sha1_feed_64, keccak_feed + ]](md5_next_shift, md5_K, sha2_K_lo, sha2_K_hi, build_keccak_format, sha3_RC_lo) + +end + + +if branch == "INT32" then + + + -- implementation for Lua 5.3/5.4 having non-standard numbers config "int32"+"double" (built with LUA_INT_TYPE=LUA_INT_INT) + + K_lo_modulo = 2^32 + + function HEX(x) -- returns string of 8 lowercase hexadecimal digits + return string_format("%08x", x) + end + + XOR32A5, XOR_BYTE, sha256_feed_64, sha512_feed_128, md5_feed_64, sha1_feed_64, keccak_feed = load[[ + local md5_next_shift, md5_K, sha2_K_lo, sha2_K_hi, build_keccak_format, sha3_RC_lo, sha3_RC_hi = ... + local string_unpack, floor = string.unpack, math.floor + local function XOR32A5(x) + return x ~ 0xA5A5A5A5 + end + local function XOR_BYTE(x, y) + return x ~ y + end + local common_W = {} + local function sha256_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W, K = common_W, sha2_K_hi + local h1, h2, h3, h4, h5, h6, h7, h8 = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] + for pos = offs + 1, offs + size, 64 do + W[1], W[2], W[3], W[4], W[5], W[6], W[7], W[8], W[9], W[10], W[11], W[12], W[13], W[14], W[15], W[16] = + string_unpack(">i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4", str, pos) + for j = 17, 64 do + local a, b = W[j-15], W[j-2] + W[j] = (a>>7 ~ a<<25 ~ a<<14 ~ a>>18 ~ a>>3) + (b<<15 ~ b>>17 ~ b<<13 ~ b>>19 ~ b>>10) + W[j-7] + W[j-16] + end + local a, b, c, d, e, f, g, h = h1, h2, h3, h4, h5, h6, h7, h8 + for j = 1, 64 do + local z = (e>>6 ~ e<<26 ~ e>>11 ~ e<<21 ~ e>>25 ~ e<<7) + (g ~ e & (f ~ g)) + h + K[j] + W[j] + h = g + g = f + f = e + e = z + d + d = c + c = b + b = a + a = z + ((a ~ c) & d ~ a & c) + (a>>2 ~ a<<30 ~ a>>13 ~ a<<19 ~ a<<10 ~ a>>22) + end + h1 = a + h1 + h2 = b + h2 + h3 = c + h3 + h4 = d + h4 + h5 = e + h5 + h6 = f + h6 + h7 = g + h7 + h8 = h + h8 + end + H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] = h1, h2, h3, h4, h5, h6, h7, h8 + end + local function sha512_feed_128(H_lo, H_hi, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 128 + -- W1_hi, W1_lo, W2_hi, W2_lo, ... Wk_hi = W[2*k-1], Wk_lo = W[2*k] + local floor, W, K_lo, K_hi = floor, common_W, sha2_K_lo, sha2_K_hi + local h1_lo, h2_lo, h3_lo, h4_lo, h5_lo, h6_lo, h7_lo, h8_lo = H_lo[1], H_lo[2], H_lo[3], H_lo[4], H_lo[5], H_lo[6], H_lo[7], H_lo[8] + local h1_hi, h2_hi, h3_hi, h4_hi, h5_hi, h6_hi, h7_hi, h8_hi = H_hi[1], H_hi[2], H_hi[3], H_hi[4], H_hi[5], H_hi[6], H_hi[7], H_hi[8] + for pos = offs + 1, offs + size, 128 do + W[1], W[2], W[3], W[4], W[5], W[6], W[7], W[8], W[9], W[10], W[11], W[12], W[13], W[14], W[15], W[16], + W[17], W[18], W[19], W[20], W[21], W[22], W[23], W[24], W[25], W[26], W[27], W[28], W[29], W[30], W[31], W[32] = + string_unpack(">i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4", str, pos) + for jj = 17*2, 80*2, 2 do + local a_lo, a_hi, b_lo, b_hi = W[jj-30], W[jj-31], W[jj-4], W[jj-5] + local tmp = + (a_lo>>1 ~ a_hi<<31 ~ a_lo>>8 ~ a_hi<<24 ~ a_lo>>7 ~ a_hi<<25) % 2^32 + + (b_lo>>19 ~ b_hi<<13 ~ b_lo<<3 ~ b_hi>>29 ~ b_lo>>6 ~ b_hi<<26) % 2^32 + + W[jj-14] % 2^32 + W[jj-32] % 2^32 + W[jj-1] = + (a_hi>>1 ~ a_lo<<31 ~ a_hi>>8 ~ a_lo<<24 ~ a_hi>>7) + + (b_hi>>19 ~ b_lo<<13 ~ b_hi<<3 ~ b_lo>>29 ~ b_hi>>6) + + W[jj-15] + W[jj-33] + floor(tmp / 2^32) + W[jj] = 0|((tmp + 2^31) % 2^32 - 2^31) + end + local a_lo, b_lo, c_lo, d_lo, e_lo, f_lo, g_lo, h_lo = h1_lo, h2_lo, h3_lo, h4_lo, h5_lo, h6_lo, h7_lo, h8_lo + local a_hi, b_hi, c_hi, d_hi, e_hi, f_hi, g_hi, h_hi = h1_hi, h2_hi, h3_hi, h4_hi, h5_hi, h6_hi, h7_hi, h8_hi + for j = 1, 80 do + local jj = 2*j + local z_lo = (e_lo>>14 ~ e_hi<<18 ~ e_lo>>18 ~ e_hi<<14 ~ e_lo<<23 ~ e_hi>>9) % 2^32 + (g_lo ~ e_lo & (f_lo ~ g_lo)) % 2^32 + h_lo % 2^32 + K_lo[j] + W[jj] % 2^32 + local z_hi = (e_hi>>14 ~ e_lo<<18 ~ e_hi>>18 ~ e_lo<<14 ~ e_hi<<23 ~ e_lo>>9) + (g_hi ~ e_hi & (f_hi ~ g_hi)) + h_hi + K_hi[j] + W[jj-1] + floor(z_lo / 2^32) + z_lo = z_lo % 2^32 + h_lo = g_lo + h_hi = g_hi + g_lo = f_lo + g_hi = f_hi + f_lo = e_lo + f_hi = e_hi + e_lo = z_lo + d_lo % 2^32 + e_hi = z_hi + d_hi + floor(e_lo / 2^32) + e_lo = 0|((e_lo + 2^31) % 2^32 - 2^31) + d_lo = c_lo + d_hi = c_hi + c_lo = b_lo + c_hi = b_hi + b_lo = a_lo + b_hi = a_hi + z_lo = z_lo + (d_lo & c_lo ~ b_lo & (d_lo ~ c_lo)) % 2^32 + (b_lo>>28 ~ b_hi<<4 ~ b_lo<<30 ~ b_hi>>2 ~ b_lo<<25 ~ b_hi>>7) % 2^32 + a_hi = z_hi + (d_hi & c_hi ~ b_hi & (d_hi ~ c_hi)) + (b_hi>>28 ~ b_lo<<4 ~ b_hi<<30 ~ b_lo>>2 ~ b_hi<<25 ~ b_lo>>7) + floor(z_lo / 2^32) + a_lo = 0|((z_lo + 2^31) % 2^32 - 2^31) + end + a_lo = h1_lo % 2^32 + a_lo % 2^32 + h1_hi = h1_hi + a_hi + floor(a_lo / 2^32) + h1_lo = 0|((a_lo + 2^31) % 2^32 - 2^31) + a_lo = h2_lo % 2^32 + b_lo % 2^32 + h2_hi = h2_hi + b_hi + floor(a_lo / 2^32) + h2_lo = 0|((a_lo + 2^31) % 2^32 - 2^31) + a_lo = h3_lo % 2^32 + c_lo % 2^32 + h3_hi = h3_hi + c_hi + floor(a_lo / 2^32) + h3_lo = 0|((a_lo + 2^31) % 2^32 - 2^31) + a_lo = h4_lo % 2^32 + d_lo % 2^32 + h4_hi = h4_hi + d_hi + floor(a_lo / 2^32) + h4_lo = 0|((a_lo + 2^31) % 2^32 - 2^31) + a_lo = h5_lo % 2^32 + e_lo % 2^32 + h5_hi = h5_hi + e_hi + floor(a_lo / 2^32) + h5_lo = 0|((a_lo + 2^31) % 2^32 - 2^31) + a_lo = h6_lo % 2^32 + f_lo % 2^32 + h6_hi = h6_hi + f_hi + floor(a_lo / 2^32) + h6_lo = 0|((a_lo + 2^31) % 2^32 - 2^31) + a_lo = h7_lo % 2^32 + g_lo % 2^32 + h7_hi = h7_hi + g_hi + floor(a_lo / 2^32) + h7_lo = 0|((a_lo + 2^31) % 2^32 - 2^31) + a_lo = h8_lo % 2^32 + h_lo % 2^32 + h8_hi = h8_hi + h_hi + floor(a_lo / 2^32) + h8_lo = 0|((a_lo + 2^31) % 2^32 - 2^31) + end + H_lo[1], H_lo[2], H_lo[3], H_lo[4], H_lo[5], H_lo[6], H_lo[7], H_lo[8] = h1_lo, h2_lo, h3_lo, h4_lo, h5_lo, h6_lo, h7_lo, h8_lo + H_hi[1], H_hi[2], H_hi[3], H_hi[4], H_hi[5], H_hi[6], H_hi[7], H_hi[8] = h1_hi, h2_hi, h3_hi, h4_hi, h5_hi, h6_hi, h7_hi, h8_hi + end + local function md5_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W, K, md5_next_shift = common_W, md5_K, md5_next_shift + local h1, h2, h3, h4 = H[1], H[2], H[3], H[4] + for pos = offs + 1, offs + size, 64 do + W[1], W[2], W[3], W[4], W[5], W[6], W[7], W[8], W[9], W[10], W[11], W[12], W[13], W[14], W[15], W[16] = + string_unpack(">s) + b + s = md5_next_shift[s] + end + s = 32-5 + for j = 17, 32 do + local F = (c ~ d & (b ~ c)) + a + K[j] + W[(5*j-4 & 15) + 1] + a = d + d = c + c = b + b = (F << 32-s | F>>s) + b + s = md5_next_shift[s] + end + s = 32-4 + for j = 33, 48 do + local F = (b ~ c ~ d) + a + K[j] + W[(3*j+2 & 15) + 1] + a = d + d = c + c = b + b = (F << 32-s | F>>s) + b + s = md5_next_shift[s] + end + s = 32-6 + for j = 49, 64 do + local F = (c ~ (b | ~d)) + a + K[j] + W[(j*7-7 & 15) + 1] + a = d + d = c + c = b + b = (F << 32-s | F>>s) + b + s = md5_next_shift[s] + end + h1 = a + h1 + h2 = b + h2 + h3 = c + h3 + h4 = d + h4 + end + H[1], H[2], H[3], H[4] = h1, h2, h3, h4 + end + local function sha1_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W = common_W + local h1, h2, h3, h4, h5 = H[1], H[2], H[3], H[4], H[5] + for pos = offs + 1, offs + size, 64 do + W[1], W[2], W[3], W[4], W[5], W[6], W[7], W[8], W[9], W[10], W[11], W[12], W[13], W[14], W[15], W[16] = + string_unpack(">i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4", str, pos) + for j = 17, 80 do + local a = W[j-3] ~ W[j-8] ~ W[j-14] ~ W[j-16] + W[j] = a << 1 ~ a >> 31 + end + local a, b, c, d, e = h1, h2, h3, h4, h5 + for j = 1, 20 do + local z = (a << 5 ~ a >> 27) + (d ~ b & (c ~ d)) + 0x5A827999 + W[j] + e -- constant = floor(2^30 * sqrt(2)) + e = d + d = c + c = b << 30 ~ b >> 2 + b = a + a = z + end + for j = 21, 40 do + local z = (a << 5 ~ a >> 27) + (b ~ c ~ d) + 0x6ED9EBA1 + W[j] + e -- 2^30 * sqrt(3) + e = d + d = c + c = b << 30 ~ b >> 2 + b = a + a = z + end + for j = 41, 60 do + local z = (a << 5 ~ a >> 27) + ((b ~ c) & d ~ b & c) + 0x8F1BBCDC + W[j] + e -- 2^30 * sqrt(5) + e = d + d = c + c = b << 30 ~ b >> 2 + b = a + a = z + end + for j = 61, 80 do + local z = (a << 5 ~ a >> 27) + (b ~ c ~ d) + 0xCA62C1D6 + W[j] + e -- 2^30 * sqrt(10) + e = d + d = c + c = b << 30 ~ b >> 2 + b = a + a = z + end + h1 = a + h1 + h2 = b + h2 + h3 = c + h3 + h4 = d + h4 + h5 = e + h5 + end + H[1], H[2], H[3], H[4], H[5] = h1, h2, h3, h4, h5 + end + local keccak_format_i4i4 = build_keccak_format("i4i4") + local function keccak_feed(lanes_lo, lanes_hi, str, offs, size, block_size_in_bytes) + -- offs >= 0, size >= 0, size is multiple of block_size_in_bytes, block_size_in_bytes is positive multiple of 8 + local RC_lo, RC_hi = sha3_RC_lo, sha3_RC_hi + local qwords_qty = block_size_in_bytes / 8 + local keccak_format = keccak_format_i4i4[qwords_qty] + for pos = offs + 1, offs + size, block_size_in_bytes do + local dwords_from_message = {string_unpack(keccak_format, str, pos)} + for j = 1, qwords_qty do + lanes_lo[j] = lanes_lo[j] ~ dwords_from_message[2*j-1] + lanes_hi[j] = lanes_hi[j] ~ dwords_from_message[2*j] + end + local L01_lo, L01_hi, L02_lo, L02_hi, L03_lo, L03_hi, L04_lo, L04_hi, L05_lo, L05_hi, L06_lo, L06_hi, L07_lo, L07_hi, L08_lo, L08_hi, + L09_lo, L09_hi, L10_lo, L10_hi, L11_lo, L11_hi, L12_lo, L12_hi, L13_lo, L13_hi, L14_lo, L14_hi, L15_lo, L15_hi, L16_lo, L16_hi, + L17_lo, L17_hi, L18_lo, L18_hi, L19_lo, L19_hi, L20_lo, L20_hi, L21_lo, L21_hi, L22_lo, L22_hi, L23_lo, L23_hi, L24_lo, L24_hi, L25_lo, L25_hi = + lanes_lo[1], lanes_hi[1], lanes_lo[2], lanes_hi[2], lanes_lo[3], lanes_hi[3], lanes_lo[4], lanes_hi[4], lanes_lo[5], lanes_hi[5], + lanes_lo[6], lanes_hi[6], lanes_lo[7], lanes_hi[7], lanes_lo[8], lanes_hi[8], lanes_lo[9], lanes_hi[9], lanes_lo[10], lanes_hi[10], + lanes_lo[11], lanes_hi[11], lanes_lo[12], lanes_hi[12], lanes_lo[13], lanes_hi[13], lanes_lo[14], lanes_hi[14], lanes_lo[15], lanes_hi[15], + lanes_lo[16], lanes_hi[16], lanes_lo[17], lanes_hi[17], lanes_lo[18], lanes_hi[18], lanes_lo[19], lanes_hi[19], lanes_lo[20], lanes_hi[20], + lanes_lo[21], lanes_hi[21], lanes_lo[22], lanes_hi[22], lanes_lo[23], lanes_hi[23], lanes_lo[24], lanes_hi[24], lanes_lo[25], lanes_hi[25] + for round_idx = 1, 24 do + local C1_lo = L01_lo ~ L06_lo ~ L11_lo ~ L16_lo ~ L21_lo + local C1_hi = L01_hi ~ L06_hi ~ L11_hi ~ L16_hi ~ L21_hi + local C2_lo = L02_lo ~ L07_lo ~ L12_lo ~ L17_lo ~ L22_lo + local C2_hi = L02_hi ~ L07_hi ~ L12_hi ~ L17_hi ~ L22_hi + local C3_lo = L03_lo ~ L08_lo ~ L13_lo ~ L18_lo ~ L23_lo + local C3_hi = L03_hi ~ L08_hi ~ L13_hi ~ L18_hi ~ L23_hi + local C4_lo = L04_lo ~ L09_lo ~ L14_lo ~ L19_lo ~ L24_lo + local C4_hi = L04_hi ~ L09_hi ~ L14_hi ~ L19_hi ~ L24_hi + local C5_lo = L05_lo ~ L10_lo ~ L15_lo ~ L20_lo ~ L25_lo + local C5_hi = L05_hi ~ L10_hi ~ L15_hi ~ L20_hi ~ L25_hi + local D_lo = C1_lo ~ C3_lo<<1 ~ C3_hi>>31 + local D_hi = C1_hi ~ C3_hi<<1 ~ C3_lo>>31 + local T0_lo = D_lo ~ L02_lo + local T0_hi = D_hi ~ L02_hi + local T1_lo = D_lo ~ L07_lo + local T1_hi = D_hi ~ L07_hi + local T2_lo = D_lo ~ L12_lo + local T2_hi = D_hi ~ L12_hi + local T3_lo = D_lo ~ L17_lo + local T3_hi = D_hi ~ L17_hi + local T4_lo = D_lo ~ L22_lo + local T4_hi = D_hi ~ L22_hi + L02_lo = T1_lo>>20 ~ T1_hi<<12 + L02_hi = T1_hi>>20 ~ T1_lo<<12 + L07_lo = T3_lo>>19 ~ T3_hi<<13 + L07_hi = T3_hi>>19 ~ T3_lo<<13 + L12_lo = T0_lo<<1 ~ T0_hi>>31 + L12_hi = T0_hi<<1 ~ T0_lo>>31 + L17_lo = T2_lo<<10 ~ T2_hi>>22 + L17_hi = T2_hi<<10 ~ T2_lo>>22 + L22_lo = T4_lo<<2 ~ T4_hi>>30 + L22_hi = T4_hi<<2 ~ T4_lo>>30 + D_lo = C2_lo ~ C4_lo<<1 ~ C4_hi>>31 + D_hi = C2_hi ~ C4_hi<<1 ~ C4_lo>>31 + T0_lo = D_lo ~ L03_lo + T0_hi = D_hi ~ L03_hi + T1_lo = D_lo ~ L08_lo + T1_hi = D_hi ~ L08_hi + T2_lo = D_lo ~ L13_lo + T2_hi = D_hi ~ L13_hi + T3_lo = D_lo ~ L18_lo + T3_hi = D_hi ~ L18_hi + T4_lo = D_lo ~ L23_lo + T4_hi = D_hi ~ L23_hi + L03_lo = T2_lo>>21 ~ T2_hi<<11 + L03_hi = T2_hi>>21 ~ T2_lo<<11 + L08_lo = T4_lo>>3 ~ T4_hi<<29 + L08_hi = T4_hi>>3 ~ T4_lo<<29 + L13_lo = T1_lo<<6 ~ T1_hi>>26 + L13_hi = T1_hi<<6 ~ T1_lo>>26 + L18_lo = T3_lo<<15 ~ T3_hi>>17 + L18_hi = T3_hi<<15 ~ T3_lo>>17 + L23_lo = T0_lo>>2 ~ T0_hi<<30 + L23_hi = T0_hi>>2 ~ T0_lo<<30 + D_lo = C3_lo ~ C5_lo<<1 ~ C5_hi>>31 + D_hi = C3_hi ~ C5_hi<<1 ~ C5_lo>>31 + T0_lo = D_lo ~ L04_lo + T0_hi = D_hi ~ L04_hi + T1_lo = D_lo ~ L09_lo + T1_hi = D_hi ~ L09_hi + T2_lo = D_lo ~ L14_lo + T2_hi = D_hi ~ L14_hi + T3_lo = D_lo ~ L19_lo + T3_hi = D_hi ~ L19_hi + T4_lo = D_lo ~ L24_lo + T4_hi = D_hi ~ L24_hi + L04_lo = T3_lo<<21 ~ T3_hi>>11 + L04_hi = T3_hi<<21 ~ T3_lo>>11 + L09_lo = T0_lo<<28 ~ T0_hi>>4 + L09_hi = T0_hi<<28 ~ T0_lo>>4 + L14_lo = T2_lo<<25 ~ T2_hi>>7 + L14_hi = T2_hi<<25 ~ T2_lo>>7 + L19_lo = T4_lo>>8 ~ T4_hi<<24 + L19_hi = T4_hi>>8 ~ T4_lo<<24 + L24_lo = T1_lo>>9 ~ T1_hi<<23 + L24_hi = T1_hi>>9 ~ T1_lo<<23 + D_lo = C4_lo ~ C1_lo<<1 ~ C1_hi>>31 + D_hi = C4_hi ~ C1_hi<<1 ~ C1_lo>>31 + T0_lo = D_lo ~ L05_lo + T0_hi = D_hi ~ L05_hi + T1_lo = D_lo ~ L10_lo + T1_hi = D_hi ~ L10_hi + T2_lo = D_lo ~ L15_lo + T2_hi = D_hi ~ L15_hi + T3_lo = D_lo ~ L20_lo + T3_hi = D_hi ~ L20_hi + T4_lo = D_lo ~ L25_lo + T4_hi = D_hi ~ L25_hi + L05_lo = T4_lo<<14 ~ T4_hi>>18 + L05_hi = T4_hi<<14 ~ T4_lo>>18 + L10_lo = T1_lo<<20 ~ T1_hi>>12 + L10_hi = T1_hi<<20 ~ T1_lo>>12 + L15_lo = T3_lo<<8 ~ T3_hi>>24 + L15_hi = T3_hi<<8 ~ T3_lo>>24 + L20_lo = T0_lo<<27 ~ T0_hi>>5 + L20_hi = T0_hi<<27 ~ T0_lo>>5 + L25_lo = T2_lo>>25 ~ T2_hi<<7 + L25_hi = T2_hi>>25 ~ T2_lo<<7 + D_lo = C5_lo ~ C2_lo<<1 ~ C2_hi>>31 + D_hi = C5_hi ~ C2_hi<<1 ~ C2_lo>>31 + T1_lo = D_lo ~ L06_lo + T1_hi = D_hi ~ L06_hi + T2_lo = D_lo ~ L11_lo + T2_hi = D_hi ~ L11_hi + T3_lo = D_lo ~ L16_lo + T3_hi = D_hi ~ L16_hi + T4_lo = D_lo ~ L21_lo + T4_hi = D_hi ~ L21_hi + L06_lo = T2_lo<<3 ~ T2_hi>>29 + L06_hi = T2_hi<<3 ~ T2_lo>>29 + L11_lo = T4_lo<<18 ~ T4_hi>>14 + L11_hi = T4_hi<<18 ~ T4_lo>>14 + L16_lo = T1_lo>>28 ~ T1_hi<<4 + L16_hi = T1_hi>>28 ~ T1_lo<<4 + L21_lo = T3_lo>>23 ~ T3_hi<<9 + L21_hi = T3_hi>>23 ~ T3_lo<<9 + L01_lo = D_lo ~ L01_lo + L01_hi = D_hi ~ L01_hi + L01_lo, L02_lo, L03_lo, L04_lo, L05_lo = L01_lo ~ ~L02_lo & L03_lo, L02_lo ~ ~L03_lo & L04_lo, L03_lo ~ ~L04_lo & L05_lo, L04_lo ~ ~L05_lo & L01_lo, L05_lo ~ ~L01_lo & L02_lo + L01_hi, L02_hi, L03_hi, L04_hi, L05_hi = L01_hi ~ ~L02_hi & L03_hi, L02_hi ~ ~L03_hi & L04_hi, L03_hi ~ ~L04_hi & L05_hi, L04_hi ~ ~L05_hi & L01_hi, L05_hi ~ ~L01_hi & L02_hi + L06_lo, L07_lo, L08_lo, L09_lo, L10_lo = L09_lo ~ ~L10_lo & L06_lo, L10_lo ~ ~L06_lo & L07_lo, L06_lo ~ ~L07_lo & L08_lo, L07_lo ~ ~L08_lo & L09_lo, L08_lo ~ ~L09_lo & L10_lo + L06_hi, L07_hi, L08_hi, L09_hi, L10_hi = L09_hi ~ ~L10_hi & L06_hi, L10_hi ~ ~L06_hi & L07_hi, L06_hi ~ ~L07_hi & L08_hi, L07_hi ~ ~L08_hi & L09_hi, L08_hi ~ ~L09_hi & L10_hi + L11_lo, L12_lo, L13_lo, L14_lo, L15_lo = L12_lo ~ ~L13_lo & L14_lo, L13_lo ~ ~L14_lo & L15_lo, L14_lo ~ ~L15_lo & L11_lo, L15_lo ~ ~L11_lo & L12_lo, L11_lo ~ ~L12_lo & L13_lo + L11_hi, L12_hi, L13_hi, L14_hi, L15_hi = L12_hi ~ ~L13_hi & L14_hi, L13_hi ~ ~L14_hi & L15_hi, L14_hi ~ ~L15_hi & L11_hi, L15_hi ~ ~L11_hi & L12_hi, L11_hi ~ ~L12_hi & L13_hi + L16_lo, L17_lo, L18_lo, L19_lo, L20_lo = L20_lo ~ ~L16_lo & L17_lo, L16_lo ~ ~L17_lo & L18_lo, L17_lo ~ ~L18_lo & L19_lo, L18_lo ~ ~L19_lo & L20_lo, L19_lo ~ ~L20_lo & L16_lo + L16_hi, L17_hi, L18_hi, L19_hi, L20_hi = L20_hi ~ ~L16_hi & L17_hi, L16_hi ~ ~L17_hi & L18_hi, L17_hi ~ ~L18_hi & L19_hi, L18_hi ~ ~L19_hi & L20_hi, L19_hi ~ ~L20_hi & L16_hi + L21_lo, L22_lo, L23_lo, L24_lo, L25_lo = L23_lo ~ ~L24_lo & L25_lo, L24_lo ~ ~L25_lo & L21_lo, L25_lo ~ ~L21_lo & L22_lo, L21_lo ~ ~L22_lo & L23_lo, L22_lo ~ ~L23_lo & L24_lo + L21_hi, L22_hi, L23_hi, L24_hi, L25_hi = L23_hi ~ ~L24_hi & L25_hi, L24_hi ~ ~L25_hi & L21_hi, L25_hi ~ ~L21_hi & L22_hi, L21_hi ~ ~L22_hi & L23_hi, L22_hi ~ ~L23_hi & L24_hi + L01_lo = L01_lo ~ RC_lo[round_idx] + L01_hi = L01_hi ~ RC_hi[round_idx] + end + lanes_lo[1] = L01_lo + lanes_hi[1] = L01_hi + lanes_lo[2] = L02_lo + lanes_hi[2] = L02_hi + lanes_lo[3] = L03_lo + lanes_hi[3] = L03_hi + lanes_lo[4] = L04_lo + lanes_hi[4] = L04_hi + lanes_lo[5] = L05_lo + lanes_hi[5] = L05_hi + lanes_lo[6] = L06_lo + lanes_hi[6] = L06_hi + lanes_lo[7] = L07_lo + lanes_hi[7] = L07_hi + lanes_lo[8] = L08_lo + lanes_hi[8] = L08_hi + lanes_lo[9] = L09_lo + lanes_hi[9] = L09_hi + lanes_lo[10] = L10_lo + lanes_hi[10] = L10_hi + lanes_lo[11] = L11_lo + lanes_hi[11] = L11_hi + lanes_lo[12] = L12_lo + lanes_hi[12] = L12_hi + lanes_lo[13] = L13_lo + lanes_hi[13] = L13_hi + lanes_lo[14] = L14_lo + lanes_hi[14] = L14_hi + lanes_lo[15] = L15_lo + lanes_hi[15] = L15_hi + lanes_lo[16] = L16_lo + lanes_hi[16] = L16_hi + lanes_lo[17] = L17_lo + lanes_hi[17] = L17_hi + lanes_lo[18] = L18_lo + lanes_hi[18] = L18_hi + lanes_lo[19] = L19_lo + lanes_hi[19] = L19_hi + lanes_lo[20] = L20_lo + lanes_hi[20] = L20_hi + lanes_lo[21] = L21_lo + lanes_hi[21] = L21_hi + lanes_lo[22] = L22_lo + lanes_hi[22] = L22_hi + lanes_lo[23] = L23_lo + lanes_hi[23] = L23_hi + lanes_lo[24] = L24_lo + lanes_hi[24] = L24_hi + lanes_lo[25] = L25_lo + lanes_hi[25] = L25_hi + end + end + return XOR32A5, XOR_BYTE, sha256_feed_64, sha512_feed_128, md5_feed_64, sha1_feed_64, keccak_feed + ]](md5_next_shift, md5_K, sha2_K_lo, sha2_K_hi, build_keccak_format, sha3_RC_lo, sha3_RC_hi) + +end + + +if branch == "LIB32" or branch == "EMUL" then + + + -- implementation for Lua 5.1/5.2 (with or without bitwise library available) + + function sha256_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W, K = common_W, sha2_K_hi + local h1, h2, h3, h4, h5, h6, h7, h8 = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] + for pos = offs, offs + size - 1, 64 do + for j = 1, 16 do + pos = pos + 4 + local a, b, c, d = byte(str, pos - 3, pos) + W[j] = ((a * 256 + b) * 256 + c) * 256 + d + end + for j = 17, 64 do + local a, b = W[j-15], W[j-2] + W[j] = XOR(ROR(a, 7), ROL(a, 14), SHR(a, 3)) + XOR(ROL(b, 15), ROL(b, 13), SHR(b, 10)) + W[j-7] + W[j-16] + end + local a, b, c, d, e, f, g, h = h1, h2, h3, h4, h5, h6, h7, h8 + for j = 1, 64 do + local z = XOR(ROR(e, 6), ROR(e, 11), ROL(e, 7)) + AND(e, f) + AND(-1-e, g) + h + K[j] + W[j] + h = g + g = f + f = e + e = z + d + d = c + c = b + b = a + a = z + AND(d, c) + AND(a, XOR(d, c)) + XOR(ROR(a, 2), ROR(a, 13), ROL(a, 10)) + end + h1, h2, h3, h4 = (a + h1) % 4294967296, (b + h2) % 4294967296, (c + h3) % 4294967296, (d + h4) % 4294967296 + h5, h6, h7, h8 = (e + h5) % 4294967296, (f + h6) % 4294967296, (g + h7) % 4294967296, (h + h8) % 4294967296 + end + H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] = h1, h2, h3, h4, h5, h6, h7, h8 + end + + function sha512_feed_128(H_lo, H_hi, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 128 + -- W1_hi, W1_lo, W2_hi, W2_lo, ... Wk_hi = W[2*k-1], Wk_lo = W[2*k] + local W, K_lo, K_hi = common_W, sha2_K_lo, sha2_K_hi + local h1_lo, h2_lo, h3_lo, h4_lo, h5_lo, h6_lo, h7_lo, h8_lo = H_lo[1], H_lo[2], H_lo[3], H_lo[4], H_lo[5], H_lo[6], H_lo[7], H_lo[8] + local h1_hi, h2_hi, h3_hi, h4_hi, h5_hi, h6_hi, h7_hi, h8_hi = H_hi[1], H_hi[2], H_hi[3], H_hi[4], H_hi[5], H_hi[6], H_hi[7], H_hi[8] + for pos = offs, offs + size - 1, 128 do + for j = 1, 16*2 do + pos = pos + 4 + local a, b, c, d = byte(str, pos - 3, pos) + W[j] = ((a * 256 + b) * 256 + c) * 256 + d + end + for jj = 17*2, 80*2, 2 do + local a_lo, a_hi, b_lo, b_hi = W[jj-30], W[jj-31], W[jj-4], W[jj-5] + local tmp1 = XOR(SHR(a_lo, 1) + SHL(a_hi, 31), SHR(a_lo, 8) + SHL(a_hi, 24), SHR(a_lo, 7) + SHL(a_hi, 25)) % 4294967296 + XOR(SHR(b_lo, 19) + SHL(b_hi, 13), SHL(b_lo, 3) + SHR(b_hi, 29), SHR(b_lo, 6) + SHL(b_hi, 26)) % 4294967296 + W[jj-14] + W[jj-32] + local tmp2 = tmp1 % 4294967296 + W[jj-1] = XOR(SHR(a_hi, 1) + SHL(a_lo, 31), SHR(a_hi, 8) + SHL(a_lo, 24), SHR(a_hi, 7)) + XOR(SHR(b_hi, 19) + SHL(b_lo, 13), SHL(b_hi, 3) + SHR(b_lo, 29), SHR(b_hi, 6)) + W[jj-15] + W[jj-33] + (tmp1 - tmp2) / 4294967296 + W[jj] = tmp2 + end + local a_lo, b_lo, c_lo, d_lo, e_lo, f_lo, g_lo, h_lo = h1_lo, h2_lo, h3_lo, h4_lo, h5_lo, h6_lo, h7_lo, h8_lo + local a_hi, b_hi, c_hi, d_hi, e_hi, f_hi, g_hi, h_hi = h1_hi, h2_hi, h3_hi, h4_hi, h5_hi, h6_hi, h7_hi, h8_hi + for j = 1, 80 do + local jj = 2*j + local tmp1 = XOR(SHR(e_lo, 14) + SHL(e_hi, 18), SHR(e_lo, 18) + SHL(e_hi, 14), SHL(e_lo, 23) + SHR(e_hi, 9)) % 4294967296 + (AND(e_lo, f_lo) + AND(-1-e_lo, g_lo)) % 4294967296 + h_lo + K_lo[j] + W[jj] + local z_lo = tmp1 % 4294967296 + local z_hi = XOR(SHR(e_hi, 14) + SHL(e_lo, 18), SHR(e_hi, 18) + SHL(e_lo, 14), SHL(e_hi, 23) + SHR(e_lo, 9)) + AND(e_hi, f_hi) + AND(-1-e_hi, g_hi) + h_hi + K_hi[j] + W[jj-1] + (tmp1 - z_lo) / 4294967296 + h_lo = g_lo + h_hi = g_hi + g_lo = f_lo + g_hi = f_hi + f_lo = e_lo + f_hi = e_hi + tmp1 = z_lo + d_lo + e_lo = tmp1 % 4294967296 + e_hi = z_hi + d_hi + (tmp1 - e_lo) / 4294967296 + d_lo = c_lo + d_hi = c_hi + c_lo = b_lo + c_hi = b_hi + b_lo = a_lo + b_hi = a_hi + tmp1 = z_lo + (AND(d_lo, c_lo) + AND(b_lo, XOR(d_lo, c_lo))) % 4294967296 + XOR(SHR(b_lo, 28) + SHL(b_hi, 4), SHL(b_lo, 30) + SHR(b_hi, 2), SHL(b_lo, 25) + SHR(b_hi, 7)) % 4294967296 + a_lo = tmp1 % 4294967296 + a_hi = z_hi + (AND(d_hi, c_hi) + AND(b_hi, XOR(d_hi, c_hi))) + XOR(SHR(b_hi, 28) + SHL(b_lo, 4), SHL(b_hi, 30) + SHR(b_lo, 2), SHL(b_hi, 25) + SHR(b_lo, 7)) + (tmp1 - a_lo) / 4294967296 + end + a_lo = h1_lo + a_lo + h1_lo = a_lo % 4294967296 + h1_hi = (h1_hi + a_hi + (a_lo - h1_lo) / 4294967296) % 4294967296 + a_lo = h2_lo + b_lo + h2_lo = a_lo % 4294967296 + h2_hi = (h2_hi + b_hi + (a_lo - h2_lo) / 4294967296) % 4294967296 + a_lo = h3_lo + c_lo + h3_lo = a_lo % 4294967296 + h3_hi = (h3_hi + c_hi + (a_lo - h3_lo) / 4294967296) % 4294967296 + a_lo = h4_lo + d_lo + h4_lo = a_lo % 4294967296 + h4_hi = (h4_hi + d_hi + (a_lo - h4_lo) / 4294967296) % 4294967296 + a_lo = h5_lo + e_lo + h5_lo = a_lo % 4294967296 + h5_hi = (h5_hi + e_hi + (a_lo - h5_lo) / 4294967296) % 4294967296 + a_lo = h6_lo + f_lo + h6_lo = a_lo % 4294967296 + h6_hi = (h6_hi + f_hi + (a_lo - h6_lo) / 4294967296) % 4294967296 + a_lo = h7_lo + g_lo + h7_lo = a_lo % 4294967296 + h7_hi = (h7_hi + g_hi + (a_lo - h7_lo) / 4294967296) % 4294967296 + a_lo = h8_lo + h_lo + h8_lo = a_lo % 4294967296 + h8_hi = (h8_hi + h_hi + (a_lo - h8_lo) / 4294967296) % 4294967296 + end + H_lo[1], H_lo[2], H_lo[3], H_lo[4], H_lo[5], H_lo[6], H_lo[7], H_lo[8] = h1_lo, h2_lo, h3_lo, h4_lo, h5_lo, h6_lo, h7_lo, h8_lo + H_hi[1], H_hi[2], H_hi[3], H_hi[4], H_hi[5], H_hi[6], H_hi[7], H_hi[8] = h1_hi, h2_hi, h3_hi, h4_hi, h5_hi, h6_hi, h7_hi, h8_hi + end + + function md5_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W, K, md5_next_shift = common_W, md5_K, md5_next_shift + local h1, h2, h3, h4 = H[1], H[2], H[3], H[4] + for pos = offs, offs + size - 1, 64 do + for j = 1, 16 do + pos = pos + 4 + local a, b, c, d = byte(str, pos - 3, pos) + W[j] = ((d * 256 + c) * 256 + b) * 256 + a + end + local a, b, c, d = h1, h2, h3, h4 + local s = 32-7 + for j = 1, 16 do + local F = ROR(AND(b, c) + AND(-1-b, d) + a + K[j] + W[j], s) + b + s = md5_next_shift[s] + a = d + d = c + c = b + b = F + end + s = 32-5 + for j = 17, 32 do + local F = ROR(AND(d, b) + AND(-1-d, c) + a + K[j] + W[(5*j-4) % 16 + 1], s) + b + s = md5_next_shift[s] + a = d + d = c + c = b + b = F + end + s = 32-4 + for j = 33, 48 do + local F = ROR(XOR(XOR(b, c), d) + a + K[j] + W[(3*j+2) % 16 + 1], s) + b + s = md5_next_shift[s] + a = d + d = c + c = b + b = F + end + s = 32-6 + for j = 49, 64 do + local F = ROR(XOR(c, OR(b, -1-d)) + a + K[j] + W[(j*7-7) % 16 + 1], s) + b + s = md5_next_shift[s] + a = d + d = c + c = b + b = F + end + h1 = (a + h1) % 4294967296 + h2 = (b + h2) % 4294967296 + h3 = (c + h3) % 4294967296 + h4 = (d + h4) % 4294967296 + end + H[1], H[2], H[3], H[4] = h1, h2, h3, h4 + end + + function sha1_feed_64(H, str, offs, size) + -- offs >= 0, size >= 0, size is multiple of 64 + local W = common_W + local h1, h2, h3, h4, h5 = H[1], H[2], H[3], H[4], H[5] + for pos = offs, offs + size - 1, 64 do + for j = 1, 16 do + pos = pos + 4 + local a, b, c, d = byte(str, pos - 3, pos) + W[j] = ((a * 256 + b) * 256 + c) * 256 + d + end + for j = 17, 80 do + W[j] = ROL(XOR(W[j-3], W[j-8], W[j-14], W[j-16]), 1) + end + local a, b, c, d, e = h1, h2, h3, h4, h5 + for j = 1, 20 do + local z = ROL(a, 5) + AND(b, c) + AND(-1-b, d) + 0x5A827999 + W[j] + e -- constant = floor(2^30 * sqrt(2)) + e = d + d = c + c = ROR(b, 2) + b = a + a = z + end + for j = 21, 40 do + local z = ROL(a, 5) + XOR(b, c, d) + 0x6ED9EBA1 + W[j] + e -- 2^30 * sqrt(3) + e = d + d = c + c = ROR(b, 2) + b = a + a = z + end + for j = 41, 60 do + local z = ROL(a, 5) + AND(d, c) + AND(b, XOR(d, c)) + 0x8F1BBCDC + W[j] + e -- 2^30 * sqrt(5) + e = d + d = c + c = ROR(b, 2) + b = a + a = z + end + for j = 61, 80 do + local z = ROL(a, 5) + XOR(b, c, d) + 0xCA62C1D6 + W[j] + e -- 2^30 * sqrt(10) + e = d + d = c + c = ROR(b, 2) + b = a + a = z + end + h1 = (a + h1) % 4294967296 + h2 = (b + h2) % 4294967296 + h3 = (c + h3) % 4294967296 + h4 = (d + h4) % 4294967296 + h5 = (e + h5) % 4294967296 + end + H[1], H[2], H[3], H[4], H[5] = h1, h2, h3, h4, h5 + end + + function keccak_feed(lanes_lo, lanes_hi, str, offs, size, block_size_in_bytes) + -- This is an example of a Lua function having 79 local variables :-) + -- offs >= 0, size >= 0, size is multiple of block_size_in_bytes, block_size_in_bytes is positive multiple of 8 + local RC_lo, RC_hi = sha3_RC_lo, sha3_RC_hi + local qwords_qty = block_size_in_bytes / 8 + for pos = offs, offs + size - 1, block_size_in_bytes do + for j = 1, qwords_qty do + local a, b, c, d = byte(str, pos + 1, pos + 4) + lanes_lo[j] = XOR(lanes_lo[j], ((d * 256 + c) * 256 + b) * 256 + a) + pos = pos + 8 + a, b, c, d = byte(str, pos - 3, pos) + lanes_hi[j] = XOR(lanes_hi[j], ((d * 256 + c) * 256 + b) * 256 + a) + end + local L01_lo, L01_hi, L02_lo, L02_hi, L03_lo, L03_hi, L04_lo, L04_hi, L05_lo, L05_hi, L06_lo, L06_hi, L07_lo, L07_hi, L08_lo, L08_hi, + L09_lo, L09_hi, L10_lo, L10_hi, L11_lo, L11_hi, L12_lo, L12_hi, L13_lo, L13_hi, L14_lo, L14_hi, L15_lo, L15_hi, L16_lo, L16_hi, + L17_lo, L17_hi, L18_lo, L18_hi, L19_lo, L19_hi, L20_lo, L20_hi, L21_lo, L21_hi, L22_lo, L22_hi, L23_lo, L23_hi, L24_lo, L24_hi, L25_lo, L25_hi = + lanes_lo[1], lanes_hi[1], lanes_lo[2], lanes_hi[2], lanes_lo[3], lanes_hi[3], lanes_lo[4], lanes_hi[4], lanes_lo[5], lanes_hi[5], + lanes_lo[6], lanes_hi[6], lanes_lo[7], lanes_hi[7], lanes_lo[8], lanes_hi[8], lanes_lo[9], lanes_hi[9], lanes_lo[10], lanes_hi[10], + lanes_lo[11], lanes_hi[11], lanes_lo[12], lanes_hi[12], lanes_lo[13], lanes_hi[13], lanes_lo[14], lanes_hi[14], lanes_lo[15], lanes_hi[15], + lanes_lo[16], lanes_hi[16], lanes_lo[17], lanes_hi[17], lanes_lo[18], lanes_hi[18], lanes_lo[19], lanes_hi[19], lanes_lo[20], lanes_hi[20], + lanes_lo[21], lanes_hi[21], lanes_lo[22], lanes_hi[22], lanes_lo[23], lanes_hi[23], lanes_lo[24], lanes_hi[24], lanes_lo[25], lanes_hi[25] + for round_idx = 1, 24 do + local C1_lo = XOR(L01_lo, L06_lo, L11_lo, L16_lo, L21_lo) + local C1_hi = XOR(L01_hi, L06_hi, L11_hi, L16_hi, L21_hi) + local C2_lo = XOR(L02_lo, L07_lo, L12_lo, L17_lo, L22_lo) + local C2_hi = XOR(L02_hi, L07_hi, L12_hi, L17_hi, L22_hi) + local C3_lo = XOR(L03_lo, L08_lo, L13_lo, L18_lo, L23_lo) + local C3_hi = XOR(L03_hi, L08_hi, L13_hi, L18_hi, L23_hi) + local C4_lo = XOR(L04_lo, L09_lo, L14_lo, L19_lo, L24_lo) + local C4_hi = XOR(L04_hi, L09_hi, L14_hi, L19_hi, L24_hi) + local C5_lo = XOR(L05_lo, L10_lo, L15_lo, L20_lo, L25_lo) + local C5_hi = XOR(L05_hi, L10_hi, L15_hi, L20_hi, L25_hi) + local D_lo = XOR(C1_lo, C3_lo * 2 + (C3_hi % 2^32 - C3_hi % 2^31) / 2^31) + local D_hi = XOR(C1_hi, C3_hi * 2 + (C3_lo % 2^32 - C3_lo % 2^31) / 2^31) + local T0_lo = XOR(D_lo, L02_lo) + local T0_hi = XOR(D_hi, L02_hi) + local T1_lo = XOR(D_lo, L07_lo) + local T1_hi = XOR(D_hi, L07_hi) + local T2_lo = XOR(D_lo, L12_lo) + local T2_hi = XOR(D_hi, L12_hi) + local T3_lo = XOR(D_lo, L17_lo) + local T3_hi = XOR(D_hi, L17_hi) + local T4_lo = XOR(D_lo, L22_lo) + local T4_hi = XOR(D_hi, L22_hi) + L02_lo = (T1_lo % 2^32 - T1_lo % 2^20) / 2^20 + T1_hi * 2^12 + L02_hi = (T1_hi % 2^32 - T1_hi % 2^20) / 2^20 + T1_lo * 2^12 + L07_lo = (T3_lo % 2^32 - T3_lo % 2^19) / 2^19 + T3_hi * 2^13 + L07_hi = (T3_hi % 2^32 - T3_hi % 2^19) / 2^19 + T3_lo * 2^13 + L12_lo = T0_lo * 2 + (T0_hi % 2^32 - T0_hi % 2^31) / 2^31 + L12_hi = T0_hi * 2 + (T0_lo % 2^32 - T0_lo % 2^31) / 2^31 + L17_lo = T2_lo * 2^10 + (T2_hi % 2^32 - T2_hi % 2^22) / 2^22 + L17_hi = T2_hi * 2^10 + (T2_lo % 2^32 - T2_lo % 2^22) / 2^22 + L22_lo = T4_lo * 2^2 + (T4_hi % 2^32 - T4_hi % 2^30) / 2^30 + L22_hi = T4_hi * 2^2 + (T4_lo % 2^32 - T4_lo % 2^30) / 2^30 + D_lo = XOR(C2_lo, C4_lo * 2 + (C4_hi % 2^32 - C4_hi % 2^31) / 2^31) + D_hi = XOR(C2_hi, C4_hi * 2 + (C4_lo % 2^32 - C4_lo % 2^31) / 2^31) + T0_lo = XOR(D_lo, L03_lo) + T0_hi = XOR(D_hi, L03_hi) + T1_lo = XOR(D_lo, L08_lo) + T1_hi = XOR(D_hi, L08_hi) + T2_lo = XOR(D_lo, L13_lo) + T2_hi = XOR(D_hi, L13_hi) + T3_lo = XOR(D_lo, L18_lo) + T3_hi = XOR(D_hi, L18_hi) + T4_lo = XOR(D_lo, L23_lo) + T4_hi = XOR(D_hi, L23_hi) + L03_lo = (T2_lo % 2^32 - T2_lo % 2^21) / 2^21 + T2_hi * 2^11 + L03_hi = (T2_hi % 2^32 - T2_hi % 2^21) / 2^21 + T2_lo * 2^11 + L08_lo = (T4_lo % 2^32 - T4_lo % 2^3) / 2^3 + T4_hi * 2^29 % 2^32 + L08_hi = (T4_hi % 2^32 - T4_hi % 2^3) / 2^3 + T4_lo * 2^29 % 2^32 + L13_lo = T1_lo * 2^6 + (T1_hi % 2^32 - T1_hi % 2^26) / 2^26 + L13_hi = T1_hi * 2^6 + (T1_lo % 2^32 - T1_lo % 2^26) / 2^26 + L18_lo = T3_lo * 2^15 + (T3_hi % 2^32 - T3_hi % 2^17) / 2^17 + L18_hi = T3_hi * 2^15 + (T3_lo % 2^32 - T3_lo % 2^17) / 2^17 + L23_lo = (T0_lo % 2^32 - T0_lo % 2^2) / 2^2 + T0_hi * 2^30 % 2^32 + L23_hi = (T0_hi % 2^32 - T0_hi % 2^2) / 2^2 + T0_lo * 2^30 % 2^32 + D_lo = XOR(C3_lo, C5_lo * 2 + (C5_hi % 2^32 - C5_hi % 2^31) / 2^31) + D_hi = XOR(C3_hi, C5_hi * 2 + (C5_lo % 2^32 - C5_lo % 2^31) / 2^31) + T0_lo = XOR(D_lo, L04_lo) + T0_hi = XOR(D_hi, L04_hi) + T1_lo = XOR(D_lo, L09_lo) + T1_hi = XOR(D_hi, L09_hi) + T2_lo = XOR(D_lo, L14_lo) + T2_hi = XOR(D_hi, L14_hi) + T3_lo = XOR(D_lo, L19_lo) + T3_hi = XOR(D_hi, L19_hi) + T4_lo = XOR(D_lo, L24_lo) + T4_hi = XOR(D_hi, L24_hi) + L04_lo = T3_lo * 2^21 % 2^32 + (T3_hi % 2^32 - T3_hi % 2^11) / 2^11 + L04_hi = T3_hi * 2^21 % 2^32 + (T3_lo % 2^32 - T3_lo % 2^11) / 2^11 + L09_lo = T0_lo * 2^28 % 2^32 + (T0_hi % 2^32 - T0_hi % 2^4) / 2^4 + L09_hi = T0_hi * 2^28 % 2^32 + (T0_lo % 2^32 - T0_lo % 2^4) / 2^4 + L14_lo = T2_lo * 2^25 % 2^32 + (T2_hi % 2^32 - T2_hi % 2^7) / 2^7 + L14_hi = T2_hi * 2^25 % 2^32 + (T2_lo % 2^32 - T2_lo % 2^7) / 2^7 + L19_lo = (T4_lo % 2^32 - T4_lo % 2^8) / 2^8 + T4_hi * 2^24 % 2^32 + L19_hi = (T4_hi % 2^32 - T4_hi % 2^8) / 2^8 + T4_lo * 2^24 % 2^32 + L24_lo = (T1_lo % 2^32 - T1_lo % 2^9) / 2^9 + T1_hi * 2^23 % 2^32 + L24_hi = (T1_hi % 2^32 - T1_hi % 2^9) / 2^9 + T1_lo * 2^23 % 2^32 + D_lo = XOR(C4_lo, C1_lo * 2 + (C1_hi % 2^32 - C1_hi % 2^31) / 2^31) + D_hi = XOR(C4_hi, C1_hi * 2 + (C1_lo % 2^32 - C1_lo % 2^31) / 2^31) + T0_lo = XOR(D_lo, L05_lo) + T0_hi = XOR(D_hi, L05_hi) + T1_lo = XOR(D_lo, L10_lo) + T1_hi = XOR(D_hi, L10_hi) + T2_lo = XOR(D_lo, L15_lo) + T2_hi = XOR(D_hi, L15_hi) + T3_lo = XOR(D_lo, L20_lo) + T3_hi = XOR(D_hi, L20_hi) + T4_lo = XOR(D_lo, L25_lo) + T4_hi = XOR(D_hi, L25_hi) + L05_lo = T4_lo * 2^14 + (T4_hi % 2^32 - T4_hi % 2^18) / 2^18 + L05_hi = T4_hi * 2^14 + (T4_lo % 2^32 - T4_lo % 2^18) / 2^18 + L10_lo = T1_lo * 2^20 % 2^32 + (T1_hi % 2^32 - T1_hi % 2^12) / 2^12 + L10_hi = T1_hi * 2^20 % 2^32 + (T1_lo % 2^32 - T1_lo % 2^12) / 2^12 + L15_lo = T3_lo * 2^8 + (T3_hi % 2^32 - T3_hi % 2^24) / 2^24 + L15_hi = T3_hi * 2^8 + (T3_lo % 2^32 - T3_lo % 2^24) / 2^24 + L20_lo = T0_lo * 2^27 % 2^32 + (T0_hi % 2^32 - T0_hi % 2^5) / 2^5 + L20_hi = T0_hi * 2^27 % 2^32 + (T0_lo % 2^32 - T0_lo % 2^5) / 2^5 + L25_lo = (T2_lo % 2^32 - T2_lo % 2^25) / 2^25 + T2_hi * 2^7 + L25_hi = (T2_hi % 2^32 - T2_hi % 2^25) / 2^25 + T2_lo * 2^7 + D_lo = XOR(C5_lo, C2_lo * 2 + (C2_hi % 2^32 - C2_hi % 2^31) / 2^31) + D_hi = XOR(C5_hi, C2_hi * 2 + (C2_lo % 2^32 - C2_lo % 2^31) / 2^31) + T1_lo = XOR(D_lo, L06_lo) + T1_hi = XOR(D_hi, L06_hi) + T2_lo = XOR(D_lo, L11_lo) + T2_hi = XOR(D_hi, L11_hi) + T3_lo = XOR(D_lo, L16_lo) + T3_hi = XOR(D_hi, L16_hi) + T4_lo = XOR(D_lo, L21_lo) + T4_hi = XOR(D_hi, L21_hi) + L06_lo = T2_lo * 2^3 + (T2_hi % 2^32 - T2_hi % 2^29) / 2^29 + L06_hi = T2_hi * 2^3 + (T2_lo % 2^32 - T2_lo % 2^29) / 2^29 + L11_lo = T4_lo * 2^18 + (T4_hi % 2^32 - T4_hi % 2^14) / 2^14 + L11_hi = T4_hi * 2^18 + (T4_lo % 2^32 - T4_lo % 2^14) / 2^14 + L16_lo = (T1_lo % 2^32 - T1_lo % 2^28) / 2^28 + T1_hi * 2^4 + L16_hi = (T1_hi % 2^32 - T1_hi % 2^28) / 2^28 + T1_lo * 2^4 + L21_lo = (T3_lo % 2^32 - T3_lo % 2^23) / 2^23 + T3_hi * 2^9 + L21_hi = (T3_hi % 2^32 - T3_hi % 2^23) / 2^23 + T3_lo * 2^9 + L01_lo = XOR(D_lo, L01_lo) + L01_hi = XOR(D_hi, L01_hi) + L01_lo, L02_lo, L03_lo, L04_lo, L05_lo = XOR(L01_lo, AND(-1-L02_lo, L03_lo)), XOR(L02_lo, AND(-1-L03_lo, L04_lo)), XOR(L03_lo, AND(-1-L04_lo, L05_lo)), XOR(L04_lo, AND(-1-L05_lo, L01_lo)), XOR(L05_lo, AND(-1-L01_lo, L02_lo)) + L01_hi, L02_hi, L03_hi, L04_hi, L05_hi = XOR(L01_hi, AND(-1-L02_hi, L03_hi)), XOR(L02_hi, AND(-1-L03_hi, L04_hi)), XOR(L03_hi, AND(-1-L04_hi, L05_hi)), XOR(L04_hi, AND(-1-L05_hi, L01_hi)), XOR(L05_hi, AND(-1-L01_hi, L02_hi)) + L06_lo, L07_lo, L08_lo, L09_lo, L10_lo = XOR(L09_lo, AND(-1-L10_lo, L06_lo)), XOR(L10_lo, AND(-1-L06_lo, L07_lo)), XOR(L06_lo, AND(-1-L07_lo, L08_lo)), XOR(L07_lo, AND(-1-L08_lo, L09_lo)), XOR(L08_lo, AND(-1-L09_lo, L10_lo)) + L06_hi, L07_hi, L08_hi, L09_hi, L10_hi = XOR(L09_hi, AND(-1-L10_hi, L06_hi)), XOR(L10_hi, AND(-1-L06_hi, L07_hi)), XOR(L06_hi, AND(-1-L07_hi, L08_hi)), XOR(L07_hi, AND(-1-L08_hi, L09_hi)), XOR(L08_hi, AND(-1-L09_hi, L10_hi)) + L11_lo, L12_lo, L13_lo, L14_lo, L15_lo = XOR(L12_lo, AND(-1-L13_lo, L14_lo)), XOR(L13_lo, AND(-1-L14_lo, L15_lo)), XOR(L14_lo, AND(-1-L15_lo, L11_lo)), XOR(L15_lo, AND(-1-L11_lo, L12_lo)), XOR(L11_lo, AND(-1-L12_lo, L13_lo)) + L11_hi, L12_hi, L13_hi, L14_hi, L15_hi = XOR(L12_hi, AND(-1-L13_hi, L14_hi)), XOR(L13_hi, AND(-1-L14_hi, L15_hi)), XOR(L14_hi, AND(-1-L15_hi, L11_hi)), XOR(L15_hi, AND(-1-L11_hi, L12_hi)), XOR(L11_hi, AND(-1-L12_hi, L13_hi)) + L16_lo, L17_lo, L18_lo, L19_lo, L20_lo = XOR(L20_lo, AND(-1-L16_lo, L17_lo)), XOR(L16_lo, AND(-1-L17_lo, L18_lo)), XOR(L17_lo, AND(-1-L18_lo, L19_lo)), XOR(L18_lo, AND(-1-L19_lo, L20_lo)), XOR(L19_lo, AND(-1-L20_lo, L16_lo)) + L16_hi, L17_hi, L18_hi, L19_hi, L20_hi = XOR(L20_hi, AND(-1-L16_hi, L17_hi)), XOR(L16_hi, AND(-1-L17_hi, L18_hi)), XOR(L17_hi, AND(-1-L18_hi, L19_hi)), XOR(L18_hi, AND(-1-L19_hi, L20_hi)), XOR(L19_hi, AND(-1-L20_hi, L16_hi)) + L21_lo, L22_lo, L23_lo, L24_lo, L25_lo = XOR(L23_lo, AND(-1-L24_lo, L25_lo)), XOR(L24_lo, AND(-1-L25_lo, L21_lo)), XOR(L25_lo, AND(-1-L21_lo, L22_lo)), XOR(L21_lo, AND(-1-L22_lo, L23_lo)), XOR(L22_lo, AND(-1-L23_lo, L24_lo)) + L21_hi, L22_hi, L23_hi, L24_hi, L25_hi = XOR(L23_hi, AND(-1-L24_hi, L25_hi)), XOR(L24_hi, AND(-1-L25_hi, L21_hi)), XOR(L25_hi, AND(-1-L21_hi, L22_hi)), XOR(L21_hi, AND(-1-L22_hi, L23_hi)), XOR(L22_hi, AND(-1-L23_hi, L24_hi)) + L01_lo = XOR(L01_lo, RC_lo[round_idx]) + L01_hi = L01_hi + RC_hi[round_idx] -- RC_hi[] is either 0 or 0x80000000, so we could use fast addition instead of slow XOR + end + lanes_lo[1] = L01_lo + lanes_hi[1] = L01_hi + lanes_lo[2] = L02_lo + lanes_hi[2] = L02_hi + lanes_lo[3] = L03_lo + lanes_hi[3] = L03_hi + lanes_lo[4] = L04_lo + lanes_hi[4] = L04_hi + lanes_lo[5] = L05_lo + lanes_hi[5] = L05_hi + lanes_lo[6] = L06_lo + lanes_hi[6] = L06_hi + lanes_lo[7] = L07_lo + lanes_hi[7] = L07_hi + lanes_lo[8] = L08_lo + lanes_hi[8] = L08_hi + lanes_lo[9] = L09_lo + lanes_hi[9] = L09_hi + lanes_lo[10] = L10_lo + lanes_hi[10] = L10_hi + lanes_lo[11] = L11_lo + lanes_hi[11] = L11_hi + lanes_lo[12] = L12_lo + lanes_hi[12] = L12_hi + lanes_lo[13] = L13_lo + lanes_hi[13] = L13_hi + lanes_lo[14] = L14_lo + lanes_hi[14] = L14_hi + lanes_lo[15] = L15_lo + lanes_hi[15] = L15_hi + lanes_lo[16] = L16_lo + lanes_hi[16] = L16_hi + lanes_lo[17] = L17_lo + lanes_hi[17] = L17_hi + lanes_lo[18] = L18_lo + lanes_hi[18] = L18_hi + lanes_lo[19] = L19_lo + lanes_hi[19] = L19_hi + lanes_lo[20] = L20_lo + lanes_hi[20] = L20_hi + lanes_lo[21] = L21_lo + lanes_hi[21] = L21_hi + lanes_lo[22] = L22_lo + lanes_hi[22] = L22_hi + lanes_lo[23] = L23_lo + lanes_hi[23] = L23_hi + lanes_lo[24] = L24_lo + lanes_hi[24] = L24_hi + lanes_lo[25] = L25_lo + lanes_hi[25] = L25_hi + end + end + +end + + +-------------------------------------------------------------------------------- +-- MAGIC NUMBERS CALCULATOR +-------------------------------------------------------------------------------- +-- Q: +-- Is 53-bit "double" math enough to calculate square roots and cube roots of primes with 64 correct bits after decimal point? +-- A: +-- Yes, 53-bit "double" arithmetic is enough. +-- We could obtain first 40 bits by direct calculation of p^(1/3) and next 40 bits by one step of Newton's method. + +do + local function mul(src1, src2, factor, result_length) + -- src1, src2 - long integers (arrays of digits in base 2^24) + -- factor - small integer + -- returns long integer result (src1 * src2 * factor) and its floating point approximation + local result, carry, value, weight = {}, 0.0, 0.0, 1.0 + for j = 1, result_length do + for k = math_max(1, j + 1 - #src2), math_min(j, #src1) do + carry = carry + factor * src1[k] * src2[j + 1 - k] -- "int32" is not enough for multiplication result, that's why "factor" must be of type "double" + end + local digit = carry % 2^24 + result[j] = floor(digit) + carry = (carry - digit) / 2^24 + value = value + digit * weight + weight = weight * 2^24 + end + return result, value + end + + local idx, step, p, one, sqrt_hi, sqrt_lo = 0, {4, 1, 2, -2, 2}, 4, {1}, sha2_H_hi, sha2_H_lo + repeat + p = p + step[p % 6] + local d = 1 + repeat + d = d + step[d % 6] + if d*d > p then -- next prime number is found + local root = p^(1/3) + local R = root * 2^40 + R = mul({R - R % 1}, one, 1.0, 2) + local _, delta = mul(R, mul(R, R, 1.0, 4), -1.0, 4) + local hi = R[2] % 65536 * 65536 + floor(R[1] / 256) + local lo = R[1] % 256 * 16777216 + floor(delta * (2^-56 / 3) * root / p) + if idx < 16 then + root = p^(1/2) + R = root * 2^40 + R = mul({R - R % 1}, one, 1.0, 2) + _, delta = mul(R, R, -1.0, 2) + local hi = R[2] % 65536 * 65536 + floor(R[1] / 256) + local lo = R[1] % 256 * 16777216 + floor(delta * 2^-17 / root) + local idx = idx % 8 + 1 + sha2_H_ext256[224][idx] = lo + sqrt_hi[idx], sqrt_lo[idx] = hi, lo + hi * hi_factor + if idx > 7 then + sqrt_hi, sqrt_lo = sha2_H_ext512_hi[384], sha2_H_ext512_lo[384] + end + end + idx = idx + 1 + sha2_K_hi[idx], sha2_K_lo[idx] = hi, lo % K_lo_modulo + hi * hi_factor + break + end + until p % d == 0 + until idx > 79 +end + +-- Calculating IVs for SHA512/224 and SHA512/256 +for width = 224, 256, 32 do + local H_lo, H_hi = {} + if XOR64A5 then + for j = 1, 8 do + H_lo[j] = XOR64A5(sha2_H_lo[j]) + end + else + H_hi = {} + for j = 1, 8 do + H_lo[j] = XOR32A5(sha2_H_lo[j]) + H_hi[j] = XOR32A5(sha2_H_hi[j]) + end + end + sha512_feed_128(H_lo, H_hi, "SHA-512/"..tostring(width).."\128"..string_rep("\0", 115).."\88", 0, 128) + sha2_H_ext512_lo[width] = H_lo + sha2_H_ext512_hi[width] = H_hi +end + +-- Constants for MD5 +do + local sin, abs, modf = math.sin, math.abs, math.modf + for idx = 1, 64 do + -- we can't use formula floor(abs(sin(idx))*2^32) because its result may be beyond integer range on Lua built with 32-bit integers + local hi, lo = modf(abs(sin(idx)) * 2^16) + md5_K[idx] = hi * 65536 + floor(lo * 2^16) + end +end + +-- Constants for SHA3 +do + local sh_reg = 29 + local function next_bit() + local r = sh_reg % 2 + sh_reg = XOR_BYTE((sh_reg - r) / 2, 142 * r) + return r + end + for idx = 1, 24 do + local lo, m = 0 + for _ = 1, 6 do + m = m and m * m * 2 or 1 + lo = lo + next_bit() * m + end + local hi = next_bit() * m + sha3_RC_hi[idx], sha3_RC_lo[idx] = hi, lo + hi * hi_factor_keccak + end +end + + +-------------------------------------------------------------------------------- +-- MAIN FUNCTIONS +-------------------------------------------------------------------------------- + +local function sha256ext(width, message) + + -- Create an instance (private objects for current calculation) + local H, length, tail = {unpack(sha2_H_ext256[width])}, 0.0, "" + + local function partial(message_part) + if message_part then + if tail then + length = length + #message_part + local offs = 0 + if tail ~= "" and #tail + #message_part >= 64 then + offs = 64 - #tail + sha256_feed_64(H, tail..sub(message_part, 1, offs), 0, 64) + tail = "" + end + local size = #message_part - offs + local size_tail = size % 64 + sha256_feed_64(H, message_part, offs, size - size_tail) + tail = tail..sub(message_part, #message_part + 1 - size_tail) + return partial + else + error("Adding more chunks is not allowed after receiving the result", 2) + end + else + if tail then + local final_blocks = {tail, "\128", string_rep("\0", (-9 - length) % 64 + 1)} + tail = nil + -- Assuming user data length is shorter than (2^53)-9 bytes + -- Anyway, it looks very unrealistic that someone would spend more than a year of calculations to process 2^53 bytes of data by using this Lua script :-) + -- 2^53 bytes = 2^56 bits, so "bit-counter" fits in 7 bytes + length = length * (8 / 256^7) -- convert "byte-counter" to "bit-counter" and move decimal point to the left + for j = 4, 10 do + length = length % 1 * 256 + final_blocks[j] = char(floor(length)) + end + final_blocks = table_concat(final_blocks) + sha256_feed_64(H, final_blocks, 0, #final_blocks) + local max_reg = width / 32 + for j = 1, max_reg do + H[j] = HEX(H[j]) + end + H = table_concat(H, "", 1, max_reg) + end + return H + end + end + + if message then + -- Actually perform calculations and return the SHA256 digest of a message + return partial(message)() + else + -- Return function for chunk-by-chunk loading + -- User should feed every chunk of input data as single argument to this function and finally get SHA256 digest by invoking this function without an argument + return partial + end + +end + + +local function sha512ext(width, message) + + -- Create an instance (private objects for current calculation) + local length, tail, H_lo, H_hi = 0.0, "", {unpack(sha2_H_ext512_lo[width])}, not HEX64 and {unpack(sha2_H_ext512_hi[width])} + + local function partial(message_part) + if message_part then + if tail then + length = length + #message_part + local offs = 0 + if tail ~= "" and #tail + #message_part >= 128 then + offs = 128 - #tail + sha512_feed_128(H_lo, H_hi, tail..sub(message_part, 1, offs), 0, 128) + tail = "" + end + local size = #message_part - offs + local size_tail = size % 128 + sha512_feed_128(H_lo, H_hi, message_part, offs, size - size_tail) + tail = tail..sub(message_part, #message_part + 1 - size_tail) + return partial + else + error("Adding more chunks is not allowed after receiving the result", 2) + end + else + if tail then + local final_blocks = {tail, "\128", string_rep("\0", (-17-length) % 128 + 9)} + tail = nil + -- Assuming user data length is shorter than (2^53)-17 bytes + -- 2^53 bytes = 2^56 bits, so "bit-counter" fits in 7 bytes + length = length * (8 / 256^7) -- convert "byte-counter" to "bit-counter" and move floating point to the left + for j = 4, 10 do + length = length % 1 * 256 + final_blocks[j] = char(floor(length)) + end + final_blocks = table_concat(final_blocks) + sha512_feed_128(H_lo, H_hi, final_blocks, 0, #final_blocks) + local max_reg = ceil(width / 64) + if HEX64 then + for j = 1, max_reg do + H_lo[j] = HEX64(H_lo[j]) + end + else + for j = 1, max_reg do + H_lo[j] = HEX(H_hi[j])..HEX(H_lo[j]) + end + H_hi = nil + end + H_lo = sub(table_concat(H_lo, "", 1, max_reg), 1, width / 4) + end + return H_lo + end + end + + if message then + -- Actually perform calculations and return the SHA512 digest of a message + return partial(message)() + else + -- Return function for chunk-by-chunk loading + -- User should feed every chunk of input data as single argument to this function and finally get SHA512 digest by invoking this function without an argument + return partial + end + +end + + +local function md5(message) + + -- Create an instance (private objects for current calculation) + local H, length, tail = {unpack(md5_sha1_H, 1, 4)}, 0.0, "" + + local function partial(message_part) + if message_part then + if tail then + length = length + #message_part + local offs = 0 + if tail ~= "" and #tail + #message_part >= 64 then + offs = 64 - #tail + md5_feed_64(H, tail..sub(message_part, 1, offs), 0, 64) + tail = "" + end + local size = #message_part - offs + local size_tail = size % 64 + md5_feed_64(H, message_part, offs, size - size_tail) + tail = tail..sub(message_part, #message_part + 1 - size_tail) + return partial + else + error("Adding more chunks is not allowed after receiving the result", 2) + end + else + if tail then + local final_blocks = {tail, "\128", string_rep("\0", (-9 - length) % 64)} + tail = nil + length = length * 8 -- convert "byte-counter" to "bit-counter" + for j = 4, 11 do + local low_byte = length % 256 + final_blocks[j] = char(low_byte) + length = (length - low_byte) / 256 + end + final_blocks = table_concat(final_blocks) + md5_feed_64(H, final_blocks, 0, #final_blocks) + for j = 1, 4 do + H[j] = HEX(H[j]) + end + H = gsub(table_concat(H), "(..)(..)(..)(..)", "%4%3%2%1") + end + return H + end + end + + if message then + -- Actually perform calculations and return the MD5 digest of a message + return partial(message)() + else + -- Return function for chunk-by-chunk loading + -- User should feed every chunk of input data as single argument to this function and finally get MD5 digest by invoking this function without an argument + return partial + end + +end + + +local function sha1(message) + + -- Create an instance (private objects for current calculation) + local H, length, tail = {unpack(md5_sha1_H)}, 0.0, "" + + local function partial(message_part) + if message_part then + if tail then + length = length + #message_part + local offs = 0 + if tail ~= "" and #tail + #message_part >= 64 then + offs = 64 - #tail + sha1_feed_64(H, tail..sub(message_part, 1, offs), 0, 64) + tail = "" + end + local size = #message_part - offs + local size_tail = size % 64 + sha1_feed_64(H, message_part, offs, size - size_tail) + tail = tail..sub(message_part, #message_part + 1 - size_tail) + return partial + else + error("Adding more chunks is not allowed after receiving the result", 2) + end + else + if tail then + local final_blocks = {tail, "\128", string_rep("\0", (-9 - length) % 64 + 1)} + tail = nil + -- Assuming user data length is shorter than (2^53)-9 bytes + -- 2^53 bytes = 2^56 bits, so "bit-counter" fits in 7 bytes + length = length * (8 / 256^7) -- convert "byte-counter" to "bit-counter" and move decimal point to the left + for j = 4, 10 do + length = length % 1 * 256 + final_blocks[j] = char(floor(length)) + end + final_blocks = table_concat(final_blocks) + sha1_feed_64(H, final_blocks, 0, #final_blocks) + for j = 1, 5 do + H[j] = HEX(H[j]) + end + H = table_concat(H) + end + return H + end + end + + if message then + -- Actually perform calculations and return the SHA-1 digest of a message + return partial(message)() + else + -- Return function for chunk-by-chunk loading + -- User should feed every chunk of input data as single argument to this function and finally get SHA-1 digest by invoking this function without an argument + return partial + end + +end + + +local function keccak(block_size_in_bytes, digest_size_in_bytes, is_SHAKE, message) + -- "block_size_in_bytes" is multiple of 8 + if type(digest_size_in_bytes) ~= "number" then + -- arguments in SHAKE are swapped: + -- NIST FIPS 202 defines SHAKE(message,num_bits) + -- this module defines SHAKE(num_bytes,message) + -- it's easy to forget about this swap, hence the check + error("Argument 'digest_size_in_bytes' must be a number", 2) + end + + -- Create an instance (private objects for current calculation) + local tail, lanes_lo, lanes_hi = "", create_array_of_lanes(), hi_factor_keccak == 0 and create_array_of_lanes() + local result + +--~ pad the input N using the pad function, yielding a padded bit string P with a length divisible by r (such that n = len(P)/r is integer), +--~ break P into n consecutive r-bit pieces P0, ..., Pn-1 (last is zero-padded) +--~ initialize the state S to a string of b 0 bits. +--~ absorb the input into the state: For each block Pi, +--~ extend Pi at the end by a string of c 0 bits, yielding one of length b, +--~ XOR that with S and +--~ apply the block permutation f to the result, yielding a new state S +--~ initialize Z to be the empty string +--~ while the length of Z is less than d: +--~ append the first r bits of S to Z +--~ if Z is still less than d bits long, apply f to S, yielding a new state S. +--~ truncate Z to d bits + + local function partial(message_part) + if message_part then + if tail then + local offs = 0 + if tail ~= "" and #tail + #message_part >= block_size_in_bytes then + offs = block_size_in_bytes - #tail + keccak_feed(lanes_lo, lanes_hi, tail..sub(message_part, 1, offs), 0, block_size_in_bytes, block_size_in_bytes) + tail = "" + end + local size = #message_part - offs + local size_tail = size % block_size_in_bytes + keccak_feed(lanes_lo, lanes_hi, message_part, offs, size - size_tail, block_size_in_bytes) + tail = tail..sub(message_part, #message_part + 1 - size_tail) + return partial + else + error("Adding more chunks is not allowed after receiving the result", 2) + end + else + if tail then + -- append the following bits to the message: for usual SHA3: 011(0*)1, for SHAKE: 11111(0*)1 + local gap_start = is_SHAKE and 31 or 6 + tail = tail..(#tail + 1 == block_size_in_bytes and char(gap_start + 128) or char(gap_start)..string_rep("\0", (-2 - #tail) % block_size_in_bytes).."\128") + keccak_feed(lanes_lo, lanes_hi, tail, 0, #tail, block_size_in_bytes) + tail = nil + + local lanes_used = 0 + local total_lanes = floor(block_size_in_bytes / 8) + local qwords = {} + + local function get_next_qwords_of_digest(qwords_qty) + -- returns not more than 'qwords_qty' qwords ('qwords_qty' might be non-integer) + -- doesn't go across keccak-buffer boundary + -- block_size_in_bytes is a multiple of 8, so, keccak-buffer contains integer number of qwords + if lanes_used >= total_lanes then + keccak_feed(lanes_lo, lanes_hi, "\0\0\0\0\0\0\0\0", 0, 8, 8) + lanes_used = 0 + end + qwords_qty = floor(math_min(qwords_qty, total_lanes - lanes_used)) + if hi_factor_keccak ~= 0 then + for j = 1, qwords_qty do + qwords[j] = HEX64(lanes_lo[lanes_used + j - 1 + lanes_index_base]) + end + else + for j = 1, qwords_qty do + qwords[j] = HEX(lanes_hi[lanes_used + j])..HEX(lanes_lo[lanes_used + j]) + end + end + lanes_used = lanes_used + qwords_qty + return + gsub(table_concat(qwords, "", 1, qwords_qty), "(..)(..)(..)(..)(..)(..)(..)(..)", "%8%7%6%5%4%3%2%1"), + qwords_qty * 8 + end + + local parts = {} -- digest parts + local last_part, last_part_size = "", 0 + + local function get_next_part_of_digest(bytes_needed) + -- returns 'bytes_needed' bytes, for arbitrary integer 'bytes_needed' + bytes_needed = bytes_needed or 1 + if bytes_needed <= last_part_size then + last_part_size = last_part_size - bytes_needed + local part_size_in_nibbles = bytes_needed * 2 + local result = sub(last_part, 1, part_size_in_nibbles) + last_part = sub(last_part, part_size_in_nibbles + 1) + return result + end + local parts_qty = 0 + if last_part_size > 0 then + parts_qty = 1 + parts[parts_qty] = last_part + bytes_needed = bytes_needed - last_part_size + end + -- repeats until the length is enough + while bytes_needed >= 8 do + local next_part, next_part_size = get_next_qwords_of_digest(bytes_needed / 8) + parts_qty = parts_qty + 1 + parts[parts_qty] = next_part + bytes_needed = bytes_needed - next_part_size + end + if bytes_needed > 0 then + last_part, last_part_size = get_next_qwords_of_digest(1) + parts_qty = parts_qty + 1 + parts[parts_qty] = get_next_part_of_digest(bytes_needed) + else + last_part, last_part_size = "", 0 + end + return table_concat(parts, "", 1, parts_qty) + end + + if digest_size_in_bytes < 0 then + result = get_next_part_of_digest + else + result = get_next_part_of_digest(digest_size_in_bytes) + end + + end + return result + end + end + + if message then + -- Actually perform calculations and return the SHA3 digest of a message + return partial(message)() + else + -- Return function for chunk-by-chunk loading + -- User should feed every chunk of input data as single argument to this function and finally get SHA3 digest by invoking this function without an argument + return partial + end + +end + + +local hex2bin, bin2base64, base642bin +do + + function hex2bin(hex_string) + return (gsub(hex_string, "%x%x", + function (hh) + return char(tonumber(hh, 16)) + end + )) + end + + local base64_symbols = { + ['+'] = 62, ['-'] = 62, [62] = '+', + ['/'] = 63, ['_'] = 63, [63] = '/', + ['='] = -1, ['.'] = -1, [-1] = '=' + } + local symbol_index = 0 + for j, pair in ipairs{'AZ', 'az', '09'} do + for ascii = byte(pair), byte(pair, 2) do + local ch = char(ascii) + base64_symbols[ch] = symbol_index + base64_symbols[symbol_index] = ch + symbol_index = symbol_index + 1 + end + end + + function bin2base64(binary_string) + local result = {} + for pos = 1, #binary_string, 3 do + local c1, c2, c3, c4 = byte(sub(binary_string, pos, pos + 2)..'\0', 1, -1) + result[#result + 1] = + base64_symbols[floor(c1 / 4)] + ..base64_symbols[c1 % 4 * 16 + floor(c2 / 16)] + ..base64_symbols[c3 and c2 % 16 * 4 + floor(c3 / 64) or -1] + ..base64_symbols[c4 and c3 % 64 or -1] + end + return table_concat(result) + end + + function base642bin(base64_string) + local result, chars_qty = {}, 3 + for pos, ch in gmatch(gsub(base64_string, '%s+', ''), '()(.)') do + local code = base64_symbols[ch] + if code < 0 then + chars_qty = chars_qty - 1 + code = 0 + end + local idx = pos % 4 + if idx > 0 then + result[-idx] = code + else + local c1 = result[-1] * 4 + floor(result[-2] / 16) + local c2 = (result[-2] % 16) * 16 + floor(result[-3] / 4) + local c3 = (result[-3] % 4) * 64 + code + result[#result + 1] = sub(char(c1, c2, c3), 1, chars_qty) + end + end + return table_concat(result) + end + +end + + +local block_size_for_HMAC -- this table will be initialized at the end of the module + +local function pad_and_xor(str, result_length, byte_for_xor) + return gsub(str, ".", + function(c) + return char(XOR_BYTE(byte(c), byte_for_xor)) + end + )..string_rep(char(byte_for_xor), result_length - #str) +end + +local function hmac(hash_func, key, message) + + -- Create an instance (private objects for current calculation) + local block_size = block_size_for_HMAC[hash_func] + if not block_size then + error("Unknown hash function", 2) + end + if #key > block_size then + key = hex2bin(hash_func(key)) + end + local append = hash_func()(pad_and_xor(key, block_size, 0x36)) + local result + + local function partial(message_part) + if not message_part then + result = result or hash_func(pad_and_xor(key, block_size, 0x5C)..hex2bin(append())) + return result + elseif result then + error("Adding more chunks is not allowed after receiving the result", 2) + else + append(message_part) + return partial + end + end + + if message then + -- Actually perform calculations and return the HMAC of a message + return partial(message)() + else + -- Return function for chunk-by-chunk loading of a message + -- User should feed every chunk of the message as single argument to this function and finally get HMAC by invoking this function without an argument + return partial + end + +end + + +local sha = { + md5 = md5, -- MD5 + sha1 = sha1, -- SHA-1 + -- SHA2 hash functions: + sha224 = function (message) return sha256ext(224, message) end, -- SHA-224 + sha256 = function (message) return sha256ext(256, message) end, -- SHA-256 + sha512_224 = function (message) return sha512ext(224, message) end, -- SHA-512/224 + sha512_256 = function (message) return sha512ext(256, message) end, -- SHA-512/256 + sha384 = function (message) return sha512ext(384, message) end, -- SHA-384 + sha512 = function (message) return sha512ext(512, message) end, -- SHA-512 + -- SHA3 hash functions: + sha3_224 = function (message) return keccak((1600 - 2 * 224) / 8, 224 / 8, false, message) end, -- SHA3-224 + sha3_256 = function (message) return keccak((1600 - 2 * 256) / 8, 256 / 8, false, message) end, -- SHA3-256 + sha3_384 = function (message) return keccak((1600 - 2 * 384) / 8, 384 / 8, false, message) end, -- SHA3-384 + sha3_512 = function (message) return keccak((1600 - 2 * 512) / 8, 512 / 8, false, message) end, -- SHA3-512 + shake128 = function (digest_size_in_bytes, message) return keccak((1600 - 2 * 128) / 8, digest_size_in_bytes, true, message) end, -- SHAKE128 + shake256 = function (digest_size_in_bytes, message) return keccak((1600 - 2 * 256) / 8, digest_size_in_bytes, true, message) end, -- SHAKE256 + -- misc utilities: + hmac = hmac, -- HMAC(hash_func, key, message) is applicable to any hash function from this module except SHAKE* + hex2bin = hex2bin, -- converts hexadecimal representation to binary string + base642bin = base642bin, -- converts base64 representation to binary string + bin2base64 = bin2base64, -- converts binary string to base64 representation +} + + +block_size_for_HMAC = { + [sha.md5] = 64, + [sha.sha1] = 64, + [sha.sha224] = 64, + [sha.sha256] = 64, + [sha.sha512_224] = 128, + [sha.sha512_256] = 128, + [sha.sha384] = 128, + [sha.sha512] = 128, + [sha.sha3_224] = (1600 - 2 * 224) / 8, + [sha.sha3_256] = (1600 - 2 * 256) / 8, + [sha.sha3_384] = (1600 - 2 * 384) / 8, + [sha.sha3_512] = (1600 - 2 * 512) / 8, +} + + +return sha \ No newline at end of file diff --git a/scripts/vscripts/component/timers.lua b/scripts/vscripts/component/timers.lua new file mode 100755 index 0000000..284d7b9 --- /dev/null +++ b/scripts/vscripts/component/timers.lua @@ -0,0 +1,251 @@ +TIMERS_VERSION = "1.05" + +--[[ + + -- A timer running every second that starts immediately on the next frame, respects pauses + Timers:CreateTimer(function() + print ("Hello. I'm running immediately and then every second thereafter.") + return 1.0 + end + ) + + -- The same timer as above with a shorthand call + Timers(function() + print ("Hello. I'm running immediately and then every second thereafter.") + return 1.0 + end) + + + -- A timer which calls a function with a table context + Timers:CreateTimer(GameMode.someFunction, GameMode) + + -- A timer running every second that starts 5 seconds in the future, respects pauses + Timers:CreateTimer(5, function() + print ("Hello. I'm running 5 seconds after you called me and then every second thereafter.") + return 1.0 + end + ) + + -- 10 second delayed, run once using gametime (respect pauses) + Timers:CreateTimer({ + endTime = 10, -- when this timer should first execute, you can omit this if you want it to run first on the next frame + callback = function() + print ("Hello. I'm running 10 seconds after when I was started.") + end + }) + + -- 10 second delayed, run once regardless of pauses + Timers:CreateTimer({ + useGameTime = false, + endTime = 10, -- when this timer should first execute, you can omit this if you want it to run first on the next frame + callback = function() + print ("Hello. I'm running 10 seconds after I was started even if someone paused the game.") + end + }) + + + -- A timer running every second that starts after 2 minutes regardless of pauses + Timers:CreateTimer("uniqueTimerString3", { + useGameTime = false, + endTime = 120, + callback = function() + print ("Hello. I'm running after 2 minutes and then every second thereafter.") + return 1 + end + }) + + + -- A timer using the old style to repeat every second starting 5 seconds ahead + Timers:CreateTimer("uniqueTimerString3", { + useOldStyle = true, + endTime = GameRules:GetGameTime() + 5, + callback = function() + print ("Hello. I'm running after 5 seconds and then every second thereafter.") + return GameRules:GetGameTime() + 1 + end + }) + +]] + + + +TIMERS_THINK = 0.01 + +if Timers == nil then + --print ( '[Timers] creating Timers' ) + Timers = {} + setmetatable(Timers, { + __call = function(t, ...) + return t:CreateTimer(...) + end + }) + --Timers.__index = Timers +end + +function Timers:start() + Timers = self + self.timers = {} + + --local ent = Entities:CreateByClassname("info_target") -- Entities:FindByClassname(nil, 'CWorld') + local ent = SpawnEntityFromTableSynchronous("info_target", {targetname="timers_lua_thinker"}) + ent:SetThink("Think", self, "timers", TIMERS_THINK) +end + +function Timers:Think() + --if GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then + --return + --end + + -- Track game time, since the dt passed in to think is actually wall-clock time not simulation time. + local now = GameRules:GetGameTime() + + -- Process timers + for k,v in pairs(Timers.timers) do + local bUseGameTime = true + if v.useGameTime ~= nil and v.useGameTime == false then + bUseGameTime = false + end + local bOldStyle = false + if v.useOldStyle ~= nil and v.useOldStyle == true then + bOldStyle = true + end + + local now = GameRules:GetGameTime() + if not bUseGameTime then + now = Time() + end + + if v.endTime == nil then + v.endTime = now + end + -- Check if the timer has finished + if now >= v.endTime then + -- Remove from timers list + Timers.timers[k] = nil + + Timers.runningTimer = k + Timers.removeSelf = false + + -- Run the callback + local status, nextCall + if v.context then + status, nextCall = xpcall(function() return v.callback(v.context, v) end, function (msg) + return msg..'\n'..debug.traceback()..'\n' + end) + else + status, nextCall = xpcall(function() return v.callback(v) end, function (msg) + return msg..'\n'..debug.traceback()..'\n' + end) + end + + Timers.runningTimer = nil + + -- Make sure it worked + if status then + -- Check if it needs to loop + if nextCall and not Timers.removeSelf then + -- Change its end time + + if bOldStyle then + v.endTime = v.endTime + nextCall - now + else + v.endTime = v.endTime + nextCall + end + + Timers.timers[k] = v + end + + -- Update timer data + --self:UpdateTimerData() + else + -- Nope, handle the error + Timers:HandleEventError('Timer', k, nextCall) + end + end + end + + return TIMERS_THINK +end + +function Timers:HandleEventError(name, event, err) + --print(err) + + -- Ensure we have data + name = tostring(name or 'unknown') + event = tostring(event or 'unknown') + err = tostring(err or 'unknown') + + -- Tell everyone there was an error + --Say(nil, name .. ' threw an error on event '..event, false) + --Say(nil, err, false) + + -- Prevent loop arounds + if not self.errorHandled then + -- Store that we handled an error + self.errorHandled = true + end +end + +function Timers:CreateTimer(name, args, context) + if type(name) == "function" then + if args ~= nil then + context = args + end + args = {callback = name} + name = DoUniqueString("timer") + elseif type(name) == "table" then + args = name + name = DoUniqueString("timer") + elseif type(name) == "number" then + args = {endTime = name, callback = args} + name = DoUniqueString("timer") + end + if not args.callback then + --print("Invalid timer created: "..name) + return + end + + + local now = GameRules:GetGameTime() + if args.useGameTime ~= nil and args.useGameTime == false then + now = Time() + end + + if args.endTime == nil then + args.endTime = now + elseif args.useOldStyle == nil or args.useOldStyle == false then + args.endTime = now + args.endTime + end + + args.context = context + + Timers.timers[name] = args + + return name +end + +function Timers:RemoveTimer(name) + Timers.timers[name] = nil + if Timers.runningTimer == name then + Timers.removeSelf = true + end +end + +function Timers:RemoveTimers(killAll) + local timers = {} + Timers.removeSelf = true + + if not killAll then + for k,v in pairs(Timers.timers) do + if v.persist then + timers[k] = v + end + end + end + + Timers.timers = timers +end + +if not Timers.timers then Timers:start() end + +GameRules.Timers = Timers \ No newline at end of file diff --git a/scripts/vscripts/cosmetic_abilities.lua b/scripts/vscripts/cosmetic_abilities.lua new file mode 100755 index 0000000..2239c3e --- /dev/null +++ b/scripts/vscripts/cosmetic_abilities.lua @@ -0,0 +1,144 @@ +-- 需启用 info.xml 的 creator.js + +local PERMANENT_HERO_ABILITIES = { + "seasonal_summon_cny_balloon", + "seasonal_summon_ti9_balloon", + "seasonal_ti9_instruments", + "seasonal_decorate_tree", + "high_five", + "seasonal_ti9_banner", +} + +local PATREON_LEVEL_FOR_ABILITY = { + ["high_five"] = 0, + ["seasonal_ti9_banner"] = 1, + ["seasonal_summon_cny_balloon"] = 0, + ["seasonal_summon_dragon"] = 0, + ["seasonal_summon_cny_tree"] = 0, + ["seasonal_firecrackers"] = 0, + ["seasonal_ti9_shovel"] = 0, + ["seasonal_ti9_instruments"] = 0, + ["seasonal_ti9_monkey"] = 0, + ["seasonal_summon_ti9_balloon"] = 0, + ["seasonal_throw_snowball"] = 0, + ["seasonal_festive_firework"] = 0, + ["seasonal_decorate_tree"] = 0, + ["seasonal_summon_snowman"] = 0, +} + +local ABILITIES_CANT_BE_REMOVED = { + ["high_five"] = true, + ["seasonal_ti9_banner"] = true +} + +local MAX_COSMETIC_ABILITIES = 6 + +local function GetCosmeticAbilitiesCount( npc ) + local count = 0 + + for i = 0, npc:GetAbilityCount() - 1 do + local ability = npc:GetAbilityByIndex( i ) + if ability and PATREON_LEVEL_FOR_ABILITY[ability:GetAbilityName()] then + count = count + 1 + end + end + + return count +end + +local function AddAbilityIfNeed( npc, abilityName, sendReload ) + if npc:IsRealHero() and not npc:FindAbilityByName( abilityName ) and PATREON_LEVEL_FOR_ABILITY[abilityName] and GetCosmeticAbilitiesCount( npc ) < MAX_COSMETIC_ABILITIES then + local new_ability = npc:AddAbility( abilityName ) + + new_ability:SetLevel( 1 ) + new_ability:SetHidden( false ) + + if sendReload then + CustomGameEventManager:Send_ServerToAllClients( "cosmetic_abilities_reload_hud", nil ) + end + end +end + +ListenToGameEvent( "npc_spawned", function( keys ) + local npc = EntIndexToHScript( keys.entindex ) + + if npc:IsRealHero() then + for _, ability_name in pairs( PERMANENT_HERO_ABILITIES ) do + AddAbilityIfNeed( npc, ability_name) + end + end +end, nil ) + +local function CheckAbilityAndUnit( abilityName, npcIndex ) + local npc = EntIndexToHScript( npcIndex ) + + if not npc or not npc:GetClassname():find( "npc_dota_" ) or not PATREON_LEVEL_FOR_ABILITY[abilityName] then + return + end + + -- if p and p.level < PATREON_LEVEL_FOR_ABILITY[abilityName] then + -- CustomGameEventManager:Send_ServerToPlayer( PlayerResource:GetPlayer( id ), "display_custom_error", { message = "#nopatreonerror" } ) + -- return + -- end + + return true +end + +CustomGameEventManager:RegisterListener( "cosmetic_abilities_try_activate", function( id, keys ) + CheckAbilityAndUnit( keys.ability, keys.unit ) +end ) + +CustomGameEventManager:RegisterListener( "cosmetic_abilities_take", function( id, keys ) + if CheckAbilityAndUnit( keys.ability, keys.unit ) then + AddAbilityIfNeed( EntIndexToHScript( keys.unit ), keys.ability, true ) + end +end ) + +CustomGameEventManager:RegisterListener( "cosmetic_abilities_delete", function( id, keys ) + if not PATREON_LEVEL_FOR_ABILITY[keys.ability] or ABILITIES_CANT_BE_REMOVED[keys.ability] then return end + EntIndexToHScript( keys.unit ):RemoveAbility( keys.ability ) + CustomGameEventManager:Send_ServerToAllClients( "cosmetic_abilities_reload_hud", nil ) +end ) + + + +-------------------------------------------------------------------------------- + +-- 最多放置7个,简洁方式 +-- local TOY_ABILITY = { +-- ["high_five"] = 0, +-- ["seasonal_ti9_banner"] = 0, +-- ["seasonal_summon_cny_balloon"] = 1, +-- ["seasonal_summon_ti9_balloon"] = 1, +-- ["seasonal_summon_dragon"] = 0, +-- ["seasonal_summon_cny_tree"] = 0, +-- ["seasonal_firecrackers"] = 0, +-- ["seasonal_ti9_shovel"] = 0, +-- ["seasonal_ti9_instruments"] = 0, +-- ["seasonal_ti9_monkey"] = 0, +-- ["seasonal_throw_snowball"] = 0, +-- ["seasonal_festive_firework"] = 1, +-- ["seasonal_decorate_tree"] = 1, +-- ["seasonal_summon_snowman"] = 0, +-- } + +-- -- 击掌和战斗旗帜,位于物品栏上方 +-- ListenToGameEvent( "npc_spawned", function( keys ) +-- local npc = EntIndexToHScript( keys.entindex ) +-- if npc:IsRealHero() then +-- local count = 0 +-- for k,v in pairs(TOY_ABILITY) do +-- if not npc:FindAbilityByName(k) then +-- if v == 1 then +-- local ability = npc:AddAbility(k) +-- ability:SetLevel( 1 ) +-- ability:SetHidden( false ) +-- count = count + 1 +-- if count >= 7 then +-- break +-- end +-- end +-- end +-- end +-- end +-- end, nil ) \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3011.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3011.lua new file mode 100755 index 0000000..62fd80b --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3011.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3011 = class({}) + +local public = modifier_bb_buff_3011 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3011" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3011_effect.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3011_effect.lua new file mode 100755 index 0000000..bef76c7 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3011_effect.lua @@ -0,0 +1,40 @@ +modifier_bb_buff_3011_effect = class({}) + +local public = modifier_bb_buff_3011_effect + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + local target = self:GetParent() + local playerid = target:GetPlayerOwnerID() + local bonus = GameRules.player_bb_buff[playerid]["item_3011_effect"] + target:AddDamageOutgoingPhysical(bonus, "thtd_hero_3011_damage_up") + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + self:GetParent():AddDamageOutgoingPhysical("thtd_hero_3011_damage_up") + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3012.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3012.lua new file mode 100755 index 0000000..e651d88 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3012.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3012 = class({}) + +local public = modifier_bb_buff_3012 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3012" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3013.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3013.lua new file mode 100755 index 0000000..7c660c6 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3013.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3013 = class({}) + +local public = modifier_bb_buff_3013 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3013" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3014.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3014.lua new file mode 100755 index 0000000..d98fbcc --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3014.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3014 = class({}) + +local public = modifier_bb_buff_3014 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3014" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3015.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3015.lua new file mode 100755 index 0000000..4bf1a5b --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3015.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3015 = class({}) + +local public = modifier_bb_buff_3015 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3015" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3015_effect.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3015_effect.lua new file mode 100755 index 0000000..962de36 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3015_effect.lua @@ -0,0 +1,40 @@ +modifier_bb_buff_3015_effect = class({}) + +local public = modifier_bb_buff_3015_effect + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + local target = self:GetParent() + local playerid = target:GetPlayerOwnerID() + local bonus = GameRules.player_bb_buff[playerid]["item_3015_effect"] + target:AddDamageOutgoingPure(bonus, "thtd_hero_3015_damage_up") + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + self:GetParent():AddDamageOutgoingPure("thtd_hero_3015_damage_up") + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3016.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3016.lua new file mode 100755 index 0000000..8957cd7 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3016.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3016 = class({}) + +local public = modifier_bb_buff_3016 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3016" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3016_effect.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3016_effect.lua new file mode 100755 index 0000000..2e7ca72 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3016_effect.lua @@ -0,0 +1,41 @@ +modifier_bb_buff_3016_effect = class({}) + +local public = modifier_bb_buff_3016_effect + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:DeclareFunctions() + local funcs = { + MODIFIER_PROPERTY_BASEATTACK_BONUSDAMAGE, + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, + } + return funcs +end + +-------------------------------------------------------------------------------- + +function public:GetModifierBaseAttack_BonusDamage() + return 200 * self:GetStackCount() +end + +function public:GetModifierAttackSpeedBonus_Constant() + return 40 * self:GetStackCount() +end diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3017.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3017.lua new file mode 100755 index 0000000..2766bda --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3017.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3017 = class({}) + +local public = modifier_bb_buff_3017 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3017" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3018.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3018.lua new file mode 100755 index 0000000..284bd3f --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3018.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3018 = class({}) + +local public = modifier_bb_buff_3018 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3018" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3019.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3019.lua new file mode 100755 index 0000000..bd6b5d3 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3019.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3019 = class({}) + +local public = modifier_bb_buff_3019 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3019" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3020.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3020.lua new file mode 100755 index 0000000..f570be1 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3020.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3020 = class({}) + +local public = modifier_bb_buff_3020 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3020" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3021.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3021.lua new file mode 100755 index 0000000..3e40361 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3021.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3021 = class({}) + +local public = modifier_bb_buff_3021 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3021" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3023.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3023.lua new file mode 100755 index 0000000..c7e0653 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3023.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3023 = class({}) + +local public = modifier_bb_buff_3023 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3023" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3024.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3024.lua new file mode 100755 index 0000000..52ed176 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3024.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3024 = class({}) + +local public = modifier_bb_buff_3024 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3024" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3025.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3025.lua new file mode 100755 index 0000000..46c1922 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3025.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3025 = class({}) + +local public = modifier_bb_buff_3025 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3025" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3026.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3026.lua new file mode 100755 index 0000000..1659af8 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3026.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3026 = class({}) + +local public = modifier_bb_buff_3026 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3026" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3027.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3027.lua new file mode 100755 index 0000000..f69ad9e --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3027.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3027 = class({}) + +local public = modifier_bb_buff_3027 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3027" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3028.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3028.lua new file mode 100755 index 0000000..c368d9f --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3028.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3028 = class({}) + +local public = modifier_bb_buff_3028 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3028" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3029.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3029.lua new file mode 100755 index 0000000..11ff677 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3029.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3029 = class({}) + +local public = modifier_bb_buff_3029 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3029" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3030.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3030.lua new file mode 100755 index 0000000..0dc2af1 --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3030.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3030 = class({}) + +local public = modifier_bb_buff_3030 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3030" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3031.lua b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3031.lua new file mode 100755 index 0000000..3ccb06a --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_bb_buff_3031.lua @@ -0,0 +1,23 @@ +modifier_bb_buff_3031 = class({}) + +local public = modifier_bb_buff_3031 + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetAttributes() + return MODIFIER_ATTRIBUTE_MULTIPLE +end + +function public:GetTexture() + return "item_3031" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/battle_buff/modifier_fairy_count.lua b/scripts/vscripts/modifiers/battle_buff/modifier_fairy_count.lua new file mode 100755 index 0000000..760c9ef --- /dev/null +++ b/scripts/vscripts/modifiers/battle_buff/modifier_fairy_count.lua @@ -0,0 +1,19 @@ +modifier_fairy_count = class({}) + +local public = modifier_fairy_count + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_alice.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_alice.lua new file mode 100755 index 0000000..23a09cc --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_alice.lua @@ -0,0 +1,76 @@ +modifier_bosses_alice = class({}) + +local public = modifier_bosses_alice + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +-- 分裂效果造成游戏卡顿崩溃,改为免死符 +function public:OnCreated(kv) + if IsServer() then + local caster = self:GetParent() + if caster.left_death_count == nil then + caster.left_death_count = 3 + end + if caster.effect_index == nil then + local effectName = "particles/units/heroes/hero_monkey_king/monkey_king_quad_tap_stack.vpcf" + local effectIndex = ParticleManager:CreateParticle(effectName, PATTACH_OVERHEAD_FOLLOW, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, PATTACH_OVERHEAD_FOLLOW, "attach_hitloc", Vector(0, 0, 0), true) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(0, caster.left_death_count, 0)) + caster.effect_index = effectIndex + else + ParticleManager:SetParticleControl(caster.effect_index, 1, Vector(0, caster.left_death_count, 1)) + end + self:SetStackCount(caster.left_death_count) + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + local caster = self:GetParent() + if caster.diseble_buff == true then return end + + caster.thtd_damage_lock = true + + local health = caster:GetMaxHealth() + if caster.left_death_count == 3 then + health = health * 0.33 + end + caster:SetBaseMaxHealth(health) + caster:SetMaxHealth(health) + caster:SetHealth(health) + caster:SetModelScale(caster:GetModelScale() * 0.9) + + local effectIndex = ParticleManager:CreateParticle("particles/econ/events/ti6/hero_levelup_ti6_godray.vpcf", PATTACH_CUSTOMORIGIN_FOLLOW, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex, false) + + caster.left_death_count = caster.left_death_count - 1 + if caster.left_death_count <= 0 then + ParticleManager:DestroyParticleSystem(caster.effect_index, true) + else + caster:AddNewModifier(caster, nil, "modifier_bosses_alice", {}) + end + + caster.thtd_damage_lock = nil + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_aya.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_aya.lua new file mode 100755 index 0000000..6e9139b --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_aya.lua @@ -0,0 +1,21 @@ +modifier_bosses_aya = class({}) + +local public = modifier_bosses_aya + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_hina.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_hina.lua new file mode 100755 index 0000000..40abb1b --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_hina.lua @@ -0,0 +1,59 @@ +modifier_bosses_hina = class({}) + +local public = modifier_bosses_hina + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function public:GetModifierAura() + return "modifier_bosses_hina_aura_effect" +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_ENEMY +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NONE +end + +-------------------------------------------------------------------------------- + +function public:GetAuraRadius() + return 1500 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_hina_aura_effect.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_hina_aura_effect.lua new file mode 100755 index 0000000..19f0ad2 --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_hina_aura_effect.lua @@ -0,0 +1,37 @@ +modifier_bosses_hina_aura_effect = class({}) + +local public = modifier_bosses_hina_aura_effect + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + self:GetParent():AddExtraStarDamagePercentage(4505000, "modifier_bosses_hina_aura_effect") + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + self:GetParent():AddExtraStarDamagePercentage("modifier_bosses_hina_aura_effect") + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_kaguya.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_kaguya.lua new file mode 100755 index 0000000..67bdd40 --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_kaguya.lua @@ -0,0 +1,60 @@ +modifier_bosses_kaguya = class({}) + +local public = modifier_bosses_kaguya + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + local caster = self:GetParent() + + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + local caster = self:GetParent() + if caster.diseble_buff == true then return end + + caster:AddNewModifier(caster,nil,"modifier_touhoutd_pause",{}) + caster:StartGesture(ACT_DOTA_DIE) + caster.thtd_damage_lock = true + caster:SetContextThink(DoUniqueString("thtd_modifier_kaguya_renew"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if caster == nil or caster:IsNull() or caster:IsAlive() == false or caster.diseble_buff == true then + return nil + end + if caster:GetHealth() >= caster:GetMaxHealth() then + caster.thtd_damage_lock = false + caster:RemoveGesture(ACT_DOTA_DIE) + caster:RemoveModifierByName("modifier_touhoutd_pause") + return nil + end + caster:SetHealth(caster:GetHealth()+caster:GetMaxHealth()*0.04) + return 0.04 + end, + 0) + + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_keine.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_keine.lua new file mode 100755 index 0000000..9aa0add --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_keine.lua @@ -0,0 +1,68 @@ +modifier_bosses_keine = class({}) + +local public = modifier_bosses_keine + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + local caster = self:GetParent() + local max_health = caster:GetMaxHealth() + caster:SetContextThink(DoUniqueString("thtd_bosses_keine_buff"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if caster==nil or caster:IsNull() or caster:IsAlive()==false then return nil end + if caster:GetHealth() < max_health * 0.7 then + local count = 50 + caster:SetContextThink(DoUniqueString("thtd_bosses_keine_back_buff"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if caster==nil or caster:IsNull() or caster:IsAlive()==false then return nil end + + count = count - 1 + if count > 0 then return 0.1 end + + caster:SetHealth(max_health * 0.7) + local effectIndex = ParticleManager:CreateParticle("particles/bosses/thtd_keine/ability_bosses_keine.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, caster:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 2, caster:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + return nil + end, + 0.1) + + return nil + end + return 0.1 + end, + 0.1) + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + local caster = self:GetParent() + + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_kisume.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_kisume.lua new file mode 100755 index 0000000..408714c --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_kisume.lua @@ -0,0 +1,29 @@ +modifier_bosses_kisume = class({}) + +local public = modifier_bosses_kisume + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + self:GetParent():AddDamageBlockAll(600, "bosses_kisume_block_damage") + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_marisa.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_marisa.lua new file mode 100755 index 0000000..13379f2 --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_marisa.lua @@ -0,0 +1,75 @@ +modifier_bosses_marisa = class({}) + +local public = modifier_bosses_marisa + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + local caster = self:GetParent() + local effectIndex = ParticleManager:CreateParticle("particles/heroes/marisa/marisa_01_rocket_a.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:SetParticleControlForward(effectIndex,0,caster:GetForwardVector()) + ParticleManager:SetParticleControl(effectIndex, 15, Vector(0,60,255)) + local count = 5 + if caster.first_delay == nil then + caster.first_delay = 0.3 + else + caster.first_delay = 0 + end + caster:SetContextThink(DoUniqueString("thtd_marisa_delay"), + function () + if GameRules:IsGamePaused() then return 0.03 end + if count <= 0 then + caster:RemoveModifierByName("modifier_bosses_marisa") + ParticleManager:DestroyParticleSystem(effectIndex,true) + if caster~=nil and caster:IsNull()==false and caster:IsAlive() then + FindClearSpaceForUnit(caster, caster:GetOrigin(), false) + end + return nil + end + if caster:IsStunned() == false and caster:IsRooted() == false then + caster:SetAbsOrigin(caster:GetOrigin() + caster:GetForwardVector() * 50) + end + count = count - 1 + return 0.06 + end, + caster.first_delay) + end +end + +function public:OnDestroy(kv) + if IsServer() then + local caster = self:GetParent() + local count = 27 + caster:SetContextThink(DoUniqueString("thtd_marisa_delay"), + function () + if GameRules:IsGamePaused() then return 0.03 end + if caster==nil or caster:IsNull() or caster:IsAlive()==false then return nil end + count = count - 1 + if count > 0 then return 0.1 end + caster:AddNewModifier(caster,caster,"modifier_bosses_marisa",nil) + return nil + end, + 0.1) + + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_minoriko.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_minoriko.lua new file mode 100755 index 0000000..6ad70af --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_minoriko.lua @@ -0,0 +1,58 @@ +modifier_bosses_minoriko = class({}) + +local public = modifier_bosses_minoriko + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + local caster = self:GetParent() + local count = 100 + local max_health = caster:GetMaxHealth() + caster:SetContextThink(DoUniqueString("thtd_bosses_minoriko_buff"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if caster==nil or caster:IsNull() or caster:IsAlive()==false then return nil end + + count = count - 1 + if count == 0 then + caster:SetHealth(math.min(caster:GetHealth() + max_health * 0.3, max_health)) + local effectIndex = ParticleManager:CreateParticle("particles/heroes/minoriko/ability_minoriko_04.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + count = 100 + end + + return 0.1 + end, + 0.1) + + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + local caster = self:GetParent() + + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_mokou.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_mokou.lua new file mode 100755 index 0000000..7b6e70c --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_mokou.lua @@ -0,0 +1,59 @@ +modifier_bosses_mokou = class({}) + +local public = modifier_bosses_mokou + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function public:GetModifierAura() + return "modifier_bosses_mokou_aura_effect" +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_ENEMY +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NONE +end + +-------------------------------------------------------------------------------- + +function public:GetAuraRadius() + return 1500 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_mokou_aura_effect.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_mokou_aura_effect.lua new file mode 100755 index 0000000..6a6aba2 --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_mokou_aura_effect.lua @@ -0,0 +1,37 @@ +modifier_bosses_mokou_aura_effect = class({}) + +local public = modifier_bosses_mokou_aura_effect + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + self:GetParent():THTD_AddCritChance(-85, "modifier_bosses_mokou_aura_effect") + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + self:GetParent():THTD_AddCritChance("modifier_bosses_mokou_aura_effect") + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_random_attack_speed_aura.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_attack_speed_aura.lua new file mode 100755 index 0000000..791bc43 --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_attack_speed_aura.lua @@ -0,0 +1,63 @@ +modifier_bosses_random_attack_speed_aura = class({}) + +local public = modifier_bosses_random_attack_speed_aura + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function public:GetModifierAura() + return "modifier_bosses_random_attack_speed_effect" +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_ENEMY +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NONE +end + +-------------------------------------------------------------------------------- + +function public:GetAuraRadius() + return 1200 +end + +-------------------------------------------------------------------------------- + +function public:GetTexture() + return "random_boss_buff_attack_speed" +end diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_random_attack_speed_effect.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_attack_speed_effect.lua new file mode 100755 index 0000000..e3060f8 --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_attack_speed_effect.lua @@ -0,0 +1,42 @@ +modifier_bosses_random_attack_speed_effect = class({}) + +local public = modifier_bosses_random_attack_speed_effect + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, +} + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "random_boss_buff_attack_speed" +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierAttackSpeedBonus_Constant() + return -self:GetStackCount() +end + +function public:OnCreated(kv) + if IsServer() then + local caster = self:GetParent() + local playerid = caster:GetPlayerOwnerID() + if GameRules.player_bb_buff[playerid]["item_3013"] > 0 then + self:SetStackCount(math.floor(GameRules.player_bb_buff[playerid]["item_3013"] * 50)) + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_random_aura_dark.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_aura_dark.lua new file mode 100755 index 0000000..2bcef3a --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_aura_dark.lua @@ -0,0 +1,64 @@ + +modifier_bosses_random_aura_dark = class({}) + +local public = modifier_bosses_random_aura_dark + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function public:GetModifierAura() + return "modifier_bosses_random_aura_dark_effect" +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_ENEMY +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NONE +end + +-------------------------------------------------------------------------------- + +function public:GetAuraRadius() + return 1200 +end + +-------------------------------------------------------------------------------- + +function public:GetTexture() + return "touhoutd/thtd_suika_02" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_random_aura_dark_effect.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_aura_dark_effect.lua new file mode 100755 index 0000000..bd9563a --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_aura_dark_effect.lua @@ -0,0 +1,55 @@ + +modifier_bosses_random_aura_dark_effect = class({}) + +local public = modifier_bosses_random_aura_dark_effect + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return true +end + +function public:IsPurgable() + return true +end + +function public:GetEffectName() + return "particles/units/towers/aura_dark.vpcf" +end + +function public:GetEffectAttachType() + return PATTACH_ABSORIGIN_FOLLOW +end + +function public:GetTexture() + return "touhoutd/thtd_suika_02" +end + +function public:OnCreated( kv ) + if not IsServer() then + return + end + + local target = self:GetParent() + local bonus = -25 + target:THTD_AddPowerPercentage(bonus, "thtd_boss_random_dark_aura") + target:THTD_AddAttackPercentage(bonus, "thtd_boss_random_dark_aura") + target:THTD_AddCritDamage(bonus, "thtd_boss_random_dark_aura") + target:THTD_AddCritChance(bonus, "thtd_boss_random_dark_aura") +end + +function public:OnDestroy() + if not IsServer() then + return + end + + local target = self:GetParent() + target:THTD_AddPowerPercentage("thtd_boss_random_dark_aura") + target:THTD_AddAttackPercentage("thtd_boss_random_dark_aura") + target:THTD_AddCritDamage("thtd_boss_random_dark_aura") + target:THTD_AddCritChance("thtd_boss_random_dark_aura") +end diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_random_dead_heal.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_dead_heal.lua new file mode 100755 index 0000000..2b7aa17 --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_dead_heal.lua @@ -0,0 +1,58 @@ +modifier_bosses_random_dead_heal = class({}) + +local public = modifier_bosses_random_dead_heal + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + local caster = self:GetParent() + local point = caster:GetOrigin() + local hero = GameRules.HeroList[caster.thtd_player_index] + local time = 5 + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_suwako/ability_suwako_02.vpcf", PATTACH_CUSTOMORIGIN, hero) + ParticleManager:SetParticleControl(effectIndex, 0, point) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(200,1,1)) + ParticleManager:DestroyParticleSystemTime(effectIndex,5.0) + + hero:SetContextThink(DoUniqueString("random_boss_buff_dead_heal"), + function() + if GameRules:IsGamePaused() then return 0.3 end + if time <= 0 then return nil end + local targets = THTD_FindUnitsInRadius(hero,point,300) + for k,v in pairs(targets) do + if v ~= nil and v:IsNull() == false and v:IsAlive() then + v:SetHealth(math.min(v:GetMaxHealth(), v:GetHealth() + v:GetMaxHealth() * 0.05)) + end + end + time = time - 1 + return 1 + end, + 1) + end +end + +-------------------------------------------------------------------------------- + +function public:GetTexture() + return "random_boss_buff_dead_heal" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_random_health_aura.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_health_aura.lua new file mode 100755 index 0000000..e5ce767 --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_health_aura.lua @@ -0,0 +1,63 @@ +modifier_bosses_random_health_aura = class({}) + +local public = modifier_bosses_random_health_aura + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function public:GetModifierAura() + return "modifier_bosses_random_health_effect" +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_FRIENDLY +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NONE +end + +-------------------------------------------------------------------------------- + +function public:GetAuraRadius() + return 500 +end + +-------------------------------------------------------------------------------- + +function public:GetTexture() + return "random_boss_buff_health" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_random_health_effect.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_health_effect.lua new file mode 100755 index 0000000..b438a3a --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_health_effect.lua @@ -0,0 +1,55 @@ +modifier_bosses_random_health_effect = class({}) + +local public = modifier_bosses_random_health_effect + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + local caster = self:GetParent() + if caster.random_boss_health_buff ~= true then + caster.random_boss_health_buff = true + local health = math.min(MAX_HEALTH, caster:GetMaxHealth()*1.25) + caster.random_health_factor = health/caster:GetMaxHealth() + caster:SetBaseMaxHealth(health) + caster:SetMaxHealth(health) + caster:SetHealth(caster:GetHealth()*caster.random_health_factor) + end + end +end + +function public:OnDestroy(kv) + if IsServer() then + local caster = self:GetParent() + if caster.random_boss_health_buff == true and caster.random_health_factor ~= nil then + local health = caster:GetMaxHealth()/caster.random_health_factor + caster:SetBaseMaxHealth(health) + caster:SetMaxHealth(health) + caster:SetHealth(caster:GetHealth()/caster.random_health_factor) + caster.random_boss_health_buff = false + end + end +end +-------------------------------------------------------------------------------- + +function public:GetTexture() + return "random_boss_buff_health" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_random_move_aura.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_move_aura.lua new file mode 100755 index 0000000..fa999eb --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_move_aura.lua @@ -0,0 +1,63 @@ +modifier_bosses_random_move_aura = class({}) + +local public = modifier_bosses_random_move_aura + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function public:GetModifierAura() + return "modifier_bosses_random_move_effect" +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_FRIENDLY +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NONE +end + +-------------------------------------------------------------------------------- + +function public:GetAuraRadius() + return 500 +end + +-------------------------------------------------------------------------------- + +function public:GetTexture() + return "random_boss_buff_move_speed" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_random_move_effect.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_move_effect.lua new file mode 100755 index 0000000..beccba4 --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_move_effect.lua @@ -0,0 +1,32 @@ +modifier_bosses_random_move_effect = class({}) + +local public = modifier_bosses_random_move_effect + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE, +} + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierMoveSpeedBonus_Percentage() + return 25 +end + +function public:GetTexture() + return "random_boss_buff_move_speed" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_random_resist_aura.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_resist_aura.lua new file mode 100755 index 0000000..6815b03 --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_resist_aura.lua @@ -0,0 +1,63 @@ +modifier_bosses_random_resist_aura = class({}) + +local public = modifier_bosses_random_resist_aura + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function public:GetModifierAura() + return "modifier_bosses_random_resist_effect" +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_FRIENDLY +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NONE +end + +-------------------------------------------------------------------------------- + +function public:GetAuraRadius() + return 500 +end + +-------------------------------------------------------------------------------- + +function public:GetTexture() + return "touhoutd/thtd_suika_02" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_random_resist_effect.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_resist_effect.lua new file mode 100755 index 0000000..0489c05 --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_random_resist_effect.lua @@ -0,0 +1,32 @@ +modifier_bosses_random_resist_effect = class({}) +-- 实际对自定义的控制不起作用 +local public = modifier_bosses_random_resist_effect + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_STATUS_RESISTANCE, +} + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierStatusResistance() + return 25 +end + +function public:GetTexture() + return "touhoutd/thtd_hatate_01" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_rumia.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_rumia.lua new file mode 100755 index 0000000..7459e9c --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_rumia.lua @@ -0,0 +1,44 @@ +modifier_bosses_rumia = class({}) + +local public = modifier_bosses_rumia + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:OnCreated(kv) + if IsServer() then + local caster = self:GetParent() + local count = 40 + caster:SetContextThink(DoUniqueString("thtd_rumia_think"), + function () + if GameRules:IsGamePaused() then return 0.03 end + if caster==nil or caster:IsNull() or caster:IsAlive()==false then return nil end + + count = count - 1 + + if count > 10 then + caster.thtd_damage_lock = false + elseif count == 10 then + caster.thtd_damage_lock = true + local effectIndex = ParticleManager:CreateParticle("particles/thd2/heroes/rumia/ability_rumia01_effect.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, "follow_origin", Vector(0,0,0), true) + ParticleManager:DestroyParticleSystemTime(effectIndex,1.0) + elseif count == 0 then + count = 40 + end + + return 0.1 + end, + 0.1) + + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/bosses/modifier_bosses_yuugi.lua b/scripts/vscripts/modifiers/bosses/modifier_bosses_yuugi.lua new file mode 100755 index 0000000..835af0d --- /dev/null +++ b/scripts/vscripts/modifiers/bosses/modifier_bosses_yuugi.lua @@ -0,0 +1,21 @@ +modifier_bosses_yuugi = class({}) + +local public = modifier_bosses_yuugi + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/effects/modifier_courier_fx.lua b/scripts/vscripts/modifiers/effects/modifier_courier_fx.lua new file mode 100755 index 0000000..bbdffa9 --- /dev/null +++ b/scripts/vscripts/modifiers/effects/modifier_courier_fx.lua @@ -0,0 +1,31 @@ +if modifier_courier_fx == nil then + modifier_courier_fx = class({}) +end + +local public = modifier_courier_fx + +function public:IsHidden() + return true +end +function public:IsDebuff() + return false +end +function public:IsPurgable() + return false +end +function public:IsPurgeException() + return false +end +function public:AllowIllusionDuplicate() + return false +end +function public:RemoveOnDeath() + return false +end +function public:OnCreated(params) + if IsServer() then + local iParticleID = ParticleManager:CreateParticle("particles/imagine_assets/courier_fx/courier_fx_2.vpcf", PATTACH_CUSTOMORIGIN, self:GetParent()) + ParticleManager:SetParticleControlEnt(iParticleID, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetAbsOrigin(), true) + self:AddParticle(iParticleID, false, false, -1, false, false) + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/effects/modifier_rainbow_tail.lua b/scripts/vscripts/modifiers/effects/modifier_rainbow_tail.lua new file mode 100755 index 0000000..508e070 --- /dev/null +++ b/scripts/vscripts/modifiers/effects/modifier_rainbow_tail.lua @@ -0,0 +1,31 @@ +if modifier_rainbow_tail == nil then + modifier_rainbow_tail = class({}) +end + +local public = modifier_rainbow_tail + +function public:IsHidden() + return true +end +function public:IsDebuff() + return false +end +function public:IsPurgable() + return false +end +function public:IsPurgeException() + return false +end +function public:AllowIllusionDuplicate() + return false +end +function public:RemoveOnDeath() + return false +end +function public:OnCreated(params) + if IsServer() then + local iParticleID = ParticleManager:CreateParticle("particles/particles/imagine_assets/courier_fx/rainbow_tail.vpcf", PATTACH_CUSTOMORIGIN, self:GetParent()) + ParticleManager:SetParticleControlEnt(iParticleID, 0, self:GetParent(), PATTACH_POINT_FOLLOW, "attach_hitloc", self:GetParent():GetAbsOrigin(), true) + self:AddParticle(iParticleID, false, false, -1, false, false) + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_attack_speed.lua b/scripts/vscripts/modifiers/modifier_attack_speed.lua new file mode 100755 index 0000000..809e523 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_attack_speed.lua @@ -0,0 +1,34 @@ +-- 攻速增加或降低,800以上为降低 + +modifier_attack_speed = class({}) + +local public = modifier_attack_speed + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierAttackSpeedBonus_Constant() + if self:GetStackCount() <= 800 then + return self:GetStackCount() + else + return -(self:GetStackCount() - 800) + end +end diff --git a/scripts/vscripts/modifiers/modifier_attack_time.lua b/scripts/vscripts/modifiers/modifier_attack_time.lua new file mode 100755 index 0000000..4423ea7 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_attack_time.lua @@ -0,0 +1,28 @@ +modifier_attack_time = class({}) + +local public = modifier_attack_time + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_BASE_ATTACK_TIME_CONSTANT, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierBaseAttackTimeConstant() + return self:GetStackCount()*0.1 +end diff --git a/scripts/vscripts/modifiers/modifier_base_attack_bonus_percent.lua b/scripts/vscripts/modifiers/modifier_base_attack_bonus_percent.lua new file mode 100755 index 0000000..aa48f38 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_base_attack_bonus_percent.lua @@ -0,0 +1,38 @@ +-- 基础攻击力百分比提升或降低,每层1%,5000层以上取负值 + +modifier_base_attack_bonus_percent = class({}) + +local public = modifier_base_attack_bonus_percent + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_BASEDAMAGEOUTGOING_PERCENTAGE, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierBaseDamageOutgoing_Percentage() + if self:GetStackCount() <= 5000 then + return self:GetStackCount() + else + return -(self:GetStackCount() - 5000) + end +end diff --git a/scripts/vscripts/modifiers/modifier_cooldown_reduce.lua b/scripts/vscripts/modifiers/modifier_cooldown_reduce.lua new file mode 100755 index 0000000..927c3fc --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_cooldown_reduce.lua @@ -0,0 +1,34 @@ +-- CD降低或延长,超过800负面 + +modifier_cooldown_reduce = class({}) + +local public = modifier_cooldown_reduce + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_COOLDOWN_PERCENTAGE, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierPercentageCooldown() + if self:GetStackCount() <= 800 then + return self:GetStackCount() + else + return -(self:GetStackCount() - 800) + end +end diff --git a/scripts/vscripts/modifiers/modifier_hidden_bar.lua b/scripts/vscripts/modifiers/modifier_hidden_bar.lua new file mode 100755 index 0000000..453f57f --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_hidden_bar.lua @@ -0,0 +1,23 @@ +modifier_hidden_bar = class({}) + +local public = modifier_hidden_bar + +local m_modifier_states = { + [MODIFIER_STATE_NO_HEALTH_BAR] = true +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:CheckState() + return m_modifier_states +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2005_attack_aura.lua b/scripts/vscripts/modifiers/modifier_item_2005_attack_aura.lua new file mode 100755 index 0000000..00b670c --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2005_attack_aura.lua @@ -0,0 +1,93 @@ +modifier_item_2005_attack_aura = class({}) + +local public = modifier_item_2005_attack_aura + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:GetTexture() + return "item_2005" +end + +-------------------------------------------------------------------------------- + +-- function public:IsAura() +-- return true +-- end + +-------------------------------------------------------------------------------- + +-- function public:GetModifierAura() +-- return "modifier_item_2005_attack_aura_effect" +-- end + +-------------------------------------------------------------------------------- + +-- function public:GetAuraSearchTeam() +-- return DOTA_UNIT_TARGET_TEAM_FRIENDLY +-- end + +-------------------------------------------------------------------------------- + +-- function public:GetAuraSearchType() +-- return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +-- end + +-------------------------------------------------------------------------------- + +-- function public:GetAuraSearchFlags() +-- return DOTA_UNIT_TARGET_FLAG_NONE +-- end + +-------------------------------------------------------------------------------- + +-- function public:GetAuraRadius() +-- return 1200 +-- end + +-------------------------------------------------------------------------------- + + +function public:OnCreated( kv ) + if IsServer() then + self:OnIntervalThink() + self:StartIntervalThink( 0.2 ) + end +end + +----------------------------------------------------------------------- + +function public:OnIntervalThink() + if not IsServer() then + return + end + + local caster = self:GetCaster() + local targets = THTD_FindFriendlyUnitsInRadius(caster,caster:GetAbsOrigin(),1200) + for k,v in pairs(targets) do + local modifier = v:FindModifierByName("modifier_item_2005_attack_aura_effect") + -- 持续时间比think大一点 + if modifier == nil then + v:AddNewModifier(caster, nil, "modifier_item_2005_attack_aura_effect", {Duration = 0.3}) + else + modifier:SetDuration(0.3, false) + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2005_attack_aura_effect.lua b/scripts/vscripts/modifiers/modifier_item_2005_attack_aura_effect.lua new file mode 100755 index 0000000..6029b7f --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2005_attack_aura_effect.lua @@ -0,0 +1,41 @@ +modifier_item_2005_attack_aura_effect = class({}) + +local public = modifier_item_2005_attack_aura_effect + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated( kv ) + if not IsServer() then + return + end + self:GetParent():THTD_AddAttackPercentage(50, "thtd_item_2005_bonus") +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy() + if not IsServer() then + return + end + self:GetParent():THTD_AddAttackPercentage("thtd_item_2005_bonus") +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2006_mana_regen_aura.lua b/scripts/vscripts/modifiers/modifier_item_2006_mana_regen_aura.lua new file mode 100755 index 0000000..bd1188d --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2006_mana_regen_aura.lua @@ -0,0 +1,59 @@ +modifier_item_2006_mana_regen_aura = class({}) + +local public = modifier_item_2006_mana_regen_aura + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function public:GetModifierAura() + return "modifier_item_2006_mana_regen_aura_effect" +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_FRIENDLY +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NONE +end + +-------------------------------------------------------------------------------- + +function public:GetAuraRadius() + return 1000 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2006_mana_regen_aura_effect.lua b/scripts/vscripts/modifiers/modifier_item_2006_mana_regen_aura_effect.lua new file mode 100755 index 0000000..7a9c7ff --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2006_mana_regen_aura_effect.lua @@ -0,0 +1,37 @@ +modifier_item_2006_mana_regen_aura_effect = class({}) + +local public = modifier_item_2006_mana_regen_aura_effect + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + self:GetParent():THTD_AddManaRegenPercentage(20, "thtd_item_2006_mana_regen_bonus") + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + self:GetParent():THTD_AddManaRegenPercentage("thtd_item_2006_mana_regen_bonus") + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2008_slow_aura.lua b/scripts/vscripts/modifiers/modifier_item_2008_slow_aura.lua new file mode 100755 index 0000000..41a867e --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2008_slow_aura.lua @@ -0,0 +1,59 @@ +modifier_item_2008_slow_aura = class({}) + +local public = modifier_item_2008_slow_aura + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function public:GetModifierAura() + return "modifier_item_2008_slow_aura_effect" +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_ENEMY +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NONE +end + +-------------------------------------------------------------------------------- + +function public:GetAuraRadius() + return 1000 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2008_slow_aura_effect.lua b/scripts/vscripts/modifiers/modifier_item_2008_slow_aura_effect.lua new file mode 100755 index 0000000..66b6e1c --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2008_slow_aura_effect.lua @@ -0,0 +1,37 @@ +modifier_item_2008_slow_aura_effect = class({}) + +local public = modifier_item_2008_slow_aura_effect + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:DeclareFunctions() + return { + MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE + } +end + +-------------------------------------------------------------------------------- + +function public:GetModifierMoveSpeedBonus_Percentage() + return -10 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2009_damage.lua b/scripts/vscripts/modifiers/modifier_item_2009_damage.lua new file mode 100755 index 0000000..6bb866d --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2009_damage.lua @@ -0,0 +1,15 @@ +modifier_item_2009_damage = class({}) + +local public = modifier_item_2009_damage + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2010_damage.lua b/scripts/vscripts/modifiers/modifier_item_2010_damage.lua new file mode 100755 index 0000000..965e864 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2010_damage.lua @@ -0,0 +1,15 @@ +modifier_item_2010_damage = class({}) + +local public = modifier_item_2010_damage + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2011_attack_stun.lua b/scripts/vscripts/modifiers/modifier_item_2011_attack_stun.lua new file mode 100755 index 0000000..2464f73 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2011_attack_stun.lua @@ -0,0 +1,48 @@ +modifier_item_2011_attack_stun = class({}) + +local public = modifier_item_2011_attack_stun + +local m_modifier_funcs = { + MODIFIER_EVENT_ON_ATTACK_LANDED, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:OnAttackLanded(kv) + if IsServer() then + if kv.attacker ~= self:GetParent() or self:GetParent():IsIllusion() then + return + end + + local caster = self:GetCaster() + local target = kv.target + + local targets = THTD_FindUnitsInRadius(caster,target:GetOrigin(),400) + local damage = caster:THTD_GetAttack() + for k,v in pairs(targets) do + local DamageTable_aoe = { + ability = nil, + victim = v, + attacker = caster, + damage = damage, + damage_type = DAMAGE_TYPE_PHYSICAL, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable_aoe) + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2012_magical_damage_aura.lua b/scripts/vscripts/modifiers/modifier_item_2012_magical_damage_aura.lua new file mode 100755 index 0000000..fd2683c --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2012_magical_damage_aura.lua @@ -0,0 +1,59 @@ +modifier_item_2012_magical_damage_aura = class({}) + +local public = modifier_item_2012_magical_damage_aura + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function public:GetModifierAura() + return "modifier_item_2012_magical_damage_aura_effect" +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_FRIENDLY +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NONE +end + +-------------------------------------------------------------------------------- + +function public:GetAuraRadius() + return 1000 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2012_magical_damage_aura_effect.lua b/scripts/vscripts/modifiers/modifier_item_2012_magical_damage_aura_effect.lua new file mode 100755 index 0000000..438a6d6 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2012_magical_damage_aura_effect.lua @@ -0,0 +1,37 @@ +modifier_item_2012_magical_damage_aura_effect = class({}) + +local public = modifier_item_2012_magical_damage_aura_effect + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + self:GetParent():AddDamageOutgoingMagical(20, "thtd_item_2012_damage_up") + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + self:GetParent():AddDamageOutgoingMagical("thtd_item_2012_damage_up") + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2013_physical_damage_aura.lua b/scripts/vscripts/modifiers/modifier_item_2013_physical_damage_aura.lua new file mode 100755 index 0000000..b2605f4 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2013_physical_damage_aura.lua @@ -0,0 +1,59 @@ +modifier_item_2013_physical_damage_aura = class({}) + +local public = modifier_item_2013_physical_damage_aura + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function public:GetModifierAura() + return "modifier_item_2013_physical_damage_aura_effect" +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_FRIENDLY +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NONE +end + +-------------------------------------------------------------------------------- + +function public:GetAuraRadius() + return 1000 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2013_physical_damage_aura_effect.lua b/scripts/vscripts/modifiers/modifier_item_2013_physical_damage_aura_effect.lua new file mode 100755 index 0000000..9c28075 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2013_physical_damage_aura_effect.lua @@ -0,0 +1,37 @@ +modifier_item_2013_physical_damage_aura_effect = class({}) + +local public = modifier_item_2013_physical_damage_aura_effect + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + self:GetParent():AddDamageOutgoingPhysical(20, "thtd_item_2013_damage_up") + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + self:GetParent():AddDamageOutgoingPhysical("thtd_item_2013_damage_up") + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2014_damage_aura.lua b/scripts/vscripts/modifiers/modifier_item_2014_damage_aura.lua new file mode 100755 index 0000000..1f28c9b --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2014_damage_aura.lua @@ -0,0 +1,59 @@ +modifier_item_2014_damage_aura = class({}) + +local public = modifier_item_2014_damage_aura + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsAura() + return true +end + +-------------------------------------------------------------------------------- + +function public:GetModifierAura() + return "modifier_item_2014_damage_aura_effect" +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchTeam() + return DOTA_UNIT_TARGET_TEAM_FRIENDLY +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchType() + return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC +end + +-------------------------------------------------------------------------------- + +function public:GetAuraSearchFlags() + return DOTA_UNIT_TARGET_FLAG_NONE +end + +-------------------------------------------------------------------------------- + +function public:GetAuraRadius() + return 1000 +end + +-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2014_damage_aura_effect.lua b/scripts/vscripts/modifiers/modifier_item_2014_damage_aura_effect.lua new file mode 100755 index 0000000..e4c5df4 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2014_damage_aura_effect.lua @@ -0,0 +1,37 @@ +modifier_item_2014_damage_aura_effect = class({}) + +local public = modifier_item_2014_damage_aura_effect + +-------------------------------------------------------------------------------- + +function public:IsDebuff() + return false +end + +-------------------------------------------------------------------------------- + +function public:IsHidden() + return true +end + +-------------------------------------------------------------------------------- + +function public:IsPurgable() + return false +end + +-------------------------------------------------------------------------------- + +function public:OnCreated(kv) + if IsServer() then + self:GetParent():AddDamageOutgoingAll(15, "thtd_item_2014_bonus") + end +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy(kv) + if IsServer() then + self:GetParent():AddDamageOutgoingAll("thtd_item_2014_bonus") + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_item_2018_bonus_attack_range.lua b/scripts/vscripts/modifiers/modifier_item_2018_bonus_attack_range.lua new file mode 100755 index 0000000..b5031e9 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_item_2018_bonus_attack_range.lua @@ -0,0 +1,28 @@ +modifier_item_2018_bonus_attack_range = class({}) + +local public = modifier_item_2018_bonus_attack_range + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_ATTACK_RANGE_BONUS, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierAttackRangeBonus() + return 300 +end diff --git a/scripts/vscripts/modifiers/modifier_magical_armor.lua b/scripts/vscripts/modifiers/modifier_magical_armor.lua new file mode 100755 index 0000000..0c9f955 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_magical_armor.lua @@ -0,0 +1,28 @@ +modifier_magical_armor = class({}) + +local public = modifier_magical_armor + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierMagicalResistanceBonus() + return self:GetStackCount()/2*5 +end diff --git a/scripts/vscripts/modifiers/modifier_manacost_reduce_percent.lua b/scripts/vscripts/modifiers/modifier_manacost_reduce_percent.lua new file mode 100755 index 0000000..77c0d97 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_manacost_reduce_percent.lua @@ -0,0 +1,30 @@ +-- 魔法消耗降低百分比,每层1%,最高99% + +modifier_manacost_reduce_percent = class({}) + +local public = modifier_manacost_reduce_percent + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_MANACOST_PERCENTAGE, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierPercentageManacost() + return math.min(99, self:GetStackCount()) +end diff --git a/scripts/vscripts/modifiers/modifier_move_max_speed.lua b/scripts/vscripts/modifiers/modifier_move_max_speed.lua new file mode 100755 index 0000000..bcac84a --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_move_max_speed.lua @@ -0,0 +1,34 @@ +modifier_move_max_speed = class({}) + +local public = modifier_move_max_speed + +local m_modifier_funcs= +{ + -- MODIFIER_PROPERTY_MOVESPEED_MAX, -- 7.20失效 + MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE_MAX, + MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierMoveSpeed_AbsoluteMax() + return 2000 +end + +function public:GetModifierMoveSpeed_Absolute() + return 2000 +end diff --git a/scripts/vscripts/modifiers/modifier_move_speed.lua b/scripts/vscripts/modifiers/modifier_move_speed.lua new file mode 100755 index 0000000..f4f0cd2 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_move_speed.lua @@ -0,0 +1,34 @@ +-- 速度增加或降低固定值,每层加1,超过800层则降低1 + +modifier_move_speed = class({}) + +local public = modifier_move_speed + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierMoveSpeedBonus_Constant() + if self:GetStackCount() <= 800 then + return self:GetStackCount() + else --减速 + return -(self:GetStackCount() - 800) + end +end diff --git a/scripts/vscripts/modifiers/modifier_root_hidden_info.lua b/scripts/vscripts/modifiers/modifier_root_hidden_info.lua new file mode 100755 index 0000000..76fcec2 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_root_hidden_info.lua @@ -0,0 +1,27 @@ +modifier_root_hidden_info = class({}) + +local public = modifier_root_hidden_info + +local m_modifier_states = { + [MODIFIER_STATE_NOT_ON_MINIMAP] = true, + [MODIFIER_STATE_NOT_ON_MINIMAP_FOR_ENEMIES] = true, + [MODIFIER_STATE_NO_HEALTH_BAR] = true, + [MODIFIER_STATE_NO_UNIT_COLLISION] = true, + [MODIFIER_STATE_ROOTED] = true, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:CheckState() + return m_modifier_states +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_building.lua b/scripts/vscripts/modifiers/modifier_touhoutd_building.lua new file mode 100755 index 0000000..67cabc3 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_building.lua @@ -0,0 +1,24 @@ +modifier_touhoutd_building = class({}) + +local public = modifier_touhoutd_building + +local m_modifier_states = { + [MODIFIER_STATE_STUNNED] = true, + [MODIFIER_STATE_FROZEN] = true, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:CheckState() + return m_modifier_states +end diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_crit_chance.lua b/scripts/vscripts/modifiers/modifier_touhoutd_crit_chance.lua new file mode 100755 index 0000000..dd11604 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_crit_chance.lua @@ -0,0 +1,16 @@ +modifier_touhoutd_crit_chance = class({}) + +local public = modifier_touhoutd_crit_chance + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_crit_damage.lua b/scripts/vscripts/modifiers/modifier_touhoutd_crit_damage.lua new file mode 100755 index 0000000..c91c5ab --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_crit_damage.lua @@ -0,0 +1,15 @@ +modifier_touhoutd_crit_damage = class({}) + +local public = modifier_touhoutd_crit_damage + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_damage_incoming_magical.lua b/scripts/vscripts/modifiers/modifier_touhoutd_damage_incoming_magical.lua new file mode 100755 index 0000000..d357df9 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_damage_incoming_magical.lua @@ -0,0 +1,19 @@ +modifier_touhoutd_damage_incoming_magical = class({}) + +local public = modifier_touhoutd_damage_incoming_magical + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_yoshika_02" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_damage_incoming_physical.lua b/scripts/vscripts/modifiers/modifier_touhoutd_damage_incoming_physical.lua new file mode 100755 index 0000000..1058f08 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_damage_incoming_physical.lua @@ -0,0 +1,19 @@ +modifier_touhoutd_damage_incoming_physical = class({}) + +local public = modifier_touhoutd_damage_incoming_physical + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_satori_02" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_damage_incoming_pure.lua b/scripts/vscripts/modifiers/modifier_touhoutd_damage_incoming_pure.lua new file mode 100755 index 0000000..3827210 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_damage_incoming_pure.lua @@ -0,0 +1,19 @@ +modifier_touhoutd_damage_incoming_pure = class({}) + +local public = modifier_touhoutd_damage_incoming_pure + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_sunny_02" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_damage_outgoing_magical.lua b/scripts/vscripts/modifiers/modifier_touhoutd_damage_outgoing_magical.lua new file mode 100755 index 0000000..df24c1b --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_damage_outgoing_magical.lua @@ -0,0 +1,19 @@ +modifier_touhoutd_damage_outgoing_magical = class({}) + +local public = modifier_touhoutd_damage_outgoing_magical + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_yuyuko_03" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_damage_outgoing_physical.lua b/scripts/vscripts/modifiers/modifier_touhoutd_damage_outgoing_physical.lua new file mode 100755 index 0000000..eec454f --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_damage_outgoing_physical.lua @@ -0,0 +1,19 @@ +modifier_touhoutd_damage_outgoing_physical = class({}) + +local public = modifier_touhoutd_damage_outgoing_physical + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_flandre_02" -- thtd_kokoro_03 +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_damage_outgoing_pure.lua b/scripts/vscripts/modifiers/modifier_touhoutd_damage_outgoing_pure.lua new file mode 100755 index 0000000..57f8b0f --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_damage_outgoing_pure.lua @@ -0,0 +1,19 @@ +modifier_touhoutd_damage_outgoing_pure = class({}) + +local public = modifier_touhoutd_damage_outgoing_pure + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_reimu_04" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_luck.lua b/scripts/vscripts/modifiers/modifier_touhoutd_luck.lua new file mode 100755 index 0000000..619f17d --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_luck.lua @@ -0,0 +1,49 @@ +modifier_touhoutd_luck = class({}) + +local public = modifier_touhoutd_luck + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "luck" +end + +-------------------------------------------------------------------------------- + +function public:OnCreated( kv ) + if not IsServer() then + return + end + + local target = self:GetParent() + target:SetModelScale(target:GetModelScale() * 1.25) + + local bonus = GameRules.GameData.luck_crit + self:SetStackCount(bonus) + target:THTD_AddCritDamage(bonus, "thtd_luck_day_bonus") + target:THTD_AddCritChance(math.floor(bonus/10), "thtd_luck_day_bonus") +end + +-------------------------------------------------------------------------------- + +function public:OnDestroy() + if not IsServer() then + return + end + + local target = self:GetParent() + + target:SetModelScale(target:GetModelScale() / 1.25) + target:THTD_AddCritDamage("thtd_luck_day_bonus") + target:THTD_AddCritChance("thtd_luck_day_bonus") +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_pause.lua b/scripts/vscripts/modifiers/modifier_touhoutd_pause.lua new file mode 100755 index 0000000..1418aa1 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_pause.lua @@ -0,0 +1,23 @@ +modifier_touhoutd_pause = class({}) + +local public = modifier_touhoutd_pause + +local m_modifier_states = { + [MODIFIER_STATE_STUNNED] = true, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:CheckState() + return m_modifier_states +end diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_poison.lua b/scripts/vscripts/modifiers/modifier_touhoutd_poison.lua new file mode 100755 index 0000000..0d3f8c0 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_poison.lua @@ -0,0 +1,19 @@ +modifier_touhoutd_poison = class({}) + +local public = modifier_touhoutd_poison + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_medicine_01" +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_release_hidden.lua b/scripts/vscripts/modifiers/modifier_touhoutd_release_hidden.lua new file mode 100755 index 0000000..f250b18 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_release_hidden.lua @@ -0,0 +1,28 @@ +modifier_touhoutd_release_hidden = class({}) + +local public = modifier_touhoutd_release_hidden + +local m_modifier_states = { + [MODIFIER_STATE_STUNNED] = true, + [MODIFIER_STATE_NOT_ON_MINIMAP] = true, + [MODIFIER_STATE_NO_UNIT_COLLISION] = true, + [MODIFIER_STATE_NOT_ON_MINIMAP_FOR_ENEMIES] = true, + [MODIFIER_STATE_INVULNERABLE] = true, + [MODIFIER_STATE_OUT_OF_GAME] = true, +} + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:CheckState() + return m_modifier_states +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_root.lua b/scripts/vscripts/modifiers/modifier_touhoutd_root.lua new file mode 100755 index 0000000..e0ae70d --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_root.lua @@ -0,0 +1,26 @@ +modifier_touhoutd_root = class({}) + +local public = modifier_touhoutd_root + +local m_modifier_states = { + [MODIFIER_STATE_ROOTED] = true, +} + +-- 这个不受玩家控制 +-- MODIFIER_STATE_COMMAND_RESTRICTED + +function public:IsHidden() + return true +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:CheckState() + return m_modifier_states +end diff --git a/scripts/vscripts/modifiers/modifier_touhoutd_unlimited_resist.lua b/scripts/vscripts/modifiers/modifier_touhoutd_unlimited_resist.lua new file mode 100755 index 0000000..9f83578 --- /dev/null +++ b/scripts/vscripts/modifiers/modifier_touhoutd_unlimited_resist.lua @@ -0,0 +1,21 @@ +modifier_touhoutd_unlimited_resist = class({}) + +local public = modifier_touhoutd_unlimited_resist + +function public:IsHidden() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:GetTexture() + return "touhoutd/thtd_eirin_03" +end + +-- 待增加创建时的特效 diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_byakuren.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_byakuren.lua new file mode 100755 index 0000000..ba69123 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_byakuren.lua @@ -0,0 +1,147 @@ +modifier_ability_power_byakuren = class({}) + +local public = modifier_ability_power_byakuren + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_byakuren_01"] = { + [1] = { + ["damage_up"] = 20, + }, + [2] = { + ["damage_up"] = 40, + }, + [3] = { + ["damage_up"] = 60, + }, + [4] = { + ["damage_up"] = 160, + }, + [5] = { + ["damage_up"] = 160, + ["power_damage"] = 5, + }, + }, + ["thtd_byakuren_02"] = { + [1] = { + ["damage_up"] = 20, + }, + [2] = { + ["damage_up"] = 40, + }, + [3] = { + ["damage_up"] = 60, + }, + [4] = { + ["damage_up"] = 160, + }, + [5] = { + ["damage_up"] = 160, + ["power_damage"] = 5, + }, + }, + ["thtd_byakuren_04"] = { + [1] = { + ["power_bonus"] = 20, + }, + [2] = { + ["power_bonus"] = 40, + }, + [3] = { + ["power_bonus"] = 60, + }, + [4] = { + ["power_bonus"] = 160, + }, + [5] = { + ["power_bonus"] = 160, + ["power_damage"] = 5, + }, + }, +} + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- if not IsServer() then return end +-- self:OnRefresh( kv ) +-- end + +-- function public:OnRefresh( kv ) +-- if not IsServer() then return end +-- end + +-- function public:OnDestroy(kv) +-- if not IsServer() then return end +-- end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if valueName == "power_damage" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + else + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_common.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_common.lua new file mode 100755 index 0000000..1428137 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_common.lua @@ -0,0 +1,128 @@ +-- 此通用方法会加重资源消耗,改为单个 + +modifier_ability_power_common = class({}) + +local public = modifier_ability_power_common + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + -- 有个显示bug,_Description描述中引用了值名称的不会变,单独的会变 +} + +-- function public:IsHidden() +-- return true +-- end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:OnCreated( kv ) + -- self.bDirty = true --本地时在其它函数不起作用 + + if IsServer() then + -- local playerId = self:GetParent():GetPlayerOwnerID() + -- CustomNetTables:SetTableValue("CustomGameInfo", "PowerAbilityValue"..tostring(playerId), GameRules.player_power_enabled[playerId]) + -- print("---- is Server") + -- DeepPrintTable(GameRules.player_power_enabled[playerId]) + -- else --这里可以生效,但在其它函数里失效 + -- self:GetParent().PowerAbilityUpgrades = CustomNetTables:GetTableValue("CustomGameInfo", "PowerAbilityValue"..tostring(self:GetParent():GetPlayerOwnerID())) + -- print("---- not Server") + -- DeepPrintTable(self:GetParent().PowerAbilityUpgrades) + end +end + +-- function public:OnCreated( kv ) +-- if not IsServer() then return end +-- self:OnRefresh( kv ) +-- end + +-- function public:OnRefresh( kv ) +-- -- 设置层数仅本地会触发,无层数设置为1层时不触发 +-- -- 使用 modifier:ForceRefresh() 会双端触发 +-- if not IsServer() then return end +-- end + +function public:GetModifierOverrideAbilitySpecial( params ) + -- 这两个必须在双端跑 + + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + -- 本地取值失效,并且从NetTable取值后每次生成新的一张table,下同 + -- local hUpgrades = self:GetParent().PowerAbilityUpgrades + -- if hUpgrades == nil then + -- hUpgrades = CustomNetTables:GetTableValue("CustomGameInfo", "PowerAbilityValue"..tostring(self:GetParent():GetPlayerOwnerID())) + -- print("---- hUpgrades == nil, CustomNetTables:GetTableValue") + -- print(hUpgrades) + -- end + local hUpgrades = CustomNetTables:GetTableValue("CustomGameInfo", "PowerAbilityValue"..tostring(self:GetParent():GetPlayerOwnerID())) + local szUnitName = self:GetParent():GetUnitName() + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + + if hUpgrades == nil or hUpgrades[szUnitName] == nil or hUpgrades[szUnitName][szAbilityName] == nil then + return 0 + end + + if hUpgrades[szUnitName][szAbilityName][szSpecialValueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + -- 这两个必须在双端跑 + + local hUpgrades = CustomNetTables:GetTableValue("CustomGameInfo", "PowerAbilityValue"..tostring(self:GetParent():GetPlayerOwnerID())) + local szUnitName = self:GetParent():GetUnitName() + local szAbilityName = params.ability:GetAbilityName() + local szSpecialValueName = params.ability_special_value + local nSpecialLevel = params.ability_special_level + if hUpgrades == nil or hUpgrades[szUnitName] == nil or hUpgrades[szUnitName][szAbilityName] == nil then + return 0 + end + + local flBaseValue = params.ability:GetLevelSpecialValueNoOverride(szSpecialValueName, nSpecialLevel) + local SpecialValueUpgrade = hUpgrades[szUnitName][szAbilityName][szSpecialValueName] + + if SpecialValueUpgrade ~= nil then + return flBaseValue + SpecialValueUpgrade + + -- 本地不起作用 + -- if self.bDirty == false and SpecialValueUpgrade["cached_result"] ~= nil and SpecialValueUpgrade["cached_result"][nSpecialLevel] ~= nil then + -- print("---- return cached_result") + -- return SpecialValueUpgrade["cached_result"][nSpecialLevel] + -- end + + -- local flResult = flBaseValue + SpecialValueUpgrade["value"] + -- if SpecialValueUpgrade["cached_result"] == nil then + -- SpecialValueUpgrade["cached_result"] = {} + -- end + -- SpecialValueUpgrade["cached_result"][nSpecialLevel] = flResult + -- self.bDirty = false + -- return flResult + end + + return flBaseValue +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_daiyousei.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_daiyousei.lua new file mode 100755 index 0000000..7882e62 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_daiyousei.lua @@ -0,0 +1,131 @@ +modifier_ability_power_daiyousei = class({}) + +local public = modifier_ability_power_daiyousei + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_daiyousei_02"] = { + [1] = { + ["mana_reg"] = 1, + }, + [2] = { + ["mana_reg"] = 2, + }, + [3] = { + ["mana_reg"] = 3, + }, + }, + ["thtd_daiyousei_03"] = { + [1] = { + ["damage_up"] = 10, + ["crino_up"] = 10, + }, + [2] = { + ["damage_up"] = 20, + ["crino_up"] = 20, + }, + [3] = { + ["damage_up"] = 30, + ["crino_up"] = 30, + }, + }, +} + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- self:ForceRefresh() +-- end + +-- function public:OnRefresh( kv ) +-- if not IsServer() then return end +-- end + +function public:OnDestroy(kv) + if not IsServer() then return end + self:OnStackCountChanged(0) +end + +function public:OnStackCountChanged( iStackCount ) + -- 双端触发,iStackCount为改变前的层数 + if not IsServer() then return end + + local caster = self:GetParent() + if caster ~= nil and caster:IsNull() == false then + if caster.ability_daiyousei_03_target1 ~= nil and caster.ability_daiyousei_03_target1:HasModifier("modifier_daiyousei_03") then + caster.ability_daiyousei_03_target1:RemoveModifierByName("modifier_daiyousei_03") + caster:FindAbilityByName("thtd_daiyousei_03"):ApplyDataDrivenModifier(caster, caster.ability_daiyousei_03_target1, "modifier_daiyousei_03", nil) + end + if caster.ability_daiyousei_03_target2 ~= nil and caster.ability_daiyousei_03_target2:HasModifier("modifier_daiyousei_03") then + caster.ability_daiyousei_03_target2:RemoveModifierByName("modifier_daiyousei_03") + caster:FindAbilityByName("thtd_daiyousei_03"):ApplyDataDrivenModifier(caster, caster.ability_daiyousei_03_target2, "modifier_daiyousei_03", nil) + end + end +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_eirin.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_eirin.lua new file mode 100755 index 0000000..57d4774 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_eirin.lua @@ -0,0 +1,184 @@ +modifier_ability_power_eirin = class({}) + +local public = modifier_ability_power_eirin + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_eirin_01"] = { + [1] = { + ["power_damage"] = 2, + ["power_bonus"] = 1, + ["crit_bonus"] = 1, + ["crit_chance"] = 1, + }, + [2] = { + ["power_damage"] = 4, + ["power_bonus"] = 1, + ["crit_bonus"] = 1, + ["crit_chance"] = 1, + }, + [3] = { + ["power_damage"] = 6, + ["power_bonus"] = 1, + ["crit_bonus"] = 1, + ["crit_chance"] = 1, + }, + [4] = { + ["power_damage"] = 5, + ["power_bonus"] = 5, + ["crit_bonus"] = 5, + ["crit_chance"] = 5, + }, + [5] = { + ["power_damage"] = 5, + ["power_bonus"] = 5, + ["crit_bonus"] = 5, + ["crit_chance"] = 5, + }, + }, + ["thtd_eirin_02"] = { + [1] = { + ["power_damage"] = 2, + ["power_bonus"] = 1, + ["crit_bonus"] = 1, + ["crit_chance"] = 1, + }, + [2] = { + ["power_damage"] = 4, + ["power_bonus"] = 1, + ["crit_bonus"] = 1, + ["crit_chance"] = 1, + }, + [3] = { + ["power_damage"] = 6, + ["power_bonus"] = 1, + ["crit_bonus"] = 1, + ["crit_chance"] = 1, + }, + [4] = { + ["power_damage"] = 5, + ["power_bonus"] = 5, + ["crit_bonus"] = 5, + ["crit_chance"] = 5, + }, + [5] = { + ["power_damage"] = 5, + ["power_bonus"] = 5, + ["crit_bonus"] = 5, + ["crit_chance"] = 5, + }, + }, + ["thtd_eirin_04"] = { + [1] = { + ["power_damage"] = 5, + }, + [2] = { + ["power_damage"] = 10, + }, + [3] = { + ["power_damage"] = 15, + }, + }, +} +local power999_bonus = 1200 + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- if not IsServer() then return end +-- self:OnRefresh( kv ) +-- end + +-- function public:OnRefresh( kv ) +-- if not IsServer() then return end +-- end + +function public:OnDestroy(kv) + if not IsServer() then return end + + local caster = self:GetParent() + caster:THTD_AddBasePower("thtd_eirin_power_999") + caster:THTD_AddBaseAttack("thtd_eirin_power_999") +end + +function public:OnStackCountChanged( iStackCount ) + -- 双端触发,iStackCount为改变前的层数 + if not IsServer() then return end + + local caster = self:GetParent() + if self:GetStackCount() == 5 then + caster:THTD_AddBasePower(power999_bonus, "thtd_eirin_power_999") + caster:THTD_AddBaseAttack(power999_bonus, "thtd_eirin_power_999") + end +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if valueName == "power_damage" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + else + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_flandre.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_flandre.lua new file mode 100755 index 0000000..19458cb --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_flandre.lua @@ -0,0 +1,123 @@ +modifier_ability_power_flandre = class({}) + +local public = modifier_ability_power_flandre + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + MODIFIER_PROPERTY_COOLDOWN_REDUCTION_CONSTANT, +} + +local power_bonus = { + ["thtd_flandre_03"] = { + [1] = { + ["damage_up"] = 1, + }, + [2] = { + ["damage_up"] = 2, + }, + [3] = { + ["damage_up"] = 3, + }, + }, + ["thtd_flandre_04"] = { + [1] = { + ["cd"] = 1, + }, + [2] = { + ["cd"] = 2, + }, + [3] = { + ["cd"] = 3, + }, + [4] = { + ["cd"] = 3, + ["power_damage"] = 4, + }, + [5] = { + ["cd"] = 3, + ["power_damage"] = 4, + }, + }, +} + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if abilityName == "thtd_flandre_03" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + else + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + end +end + +function public:GetModifierCooldownReduction_Constant( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + if params.ability:GetAbilityName() == "thtd_flandre_04" then + return power_bonus["thtd_flandre_04"][self:GetStackCount()]["cd"] or 0 + else + return 0 + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_hecatia.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_hecatia.lua new file mode 100755 index 0000000..316ddac --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_hecatia.lua @@ -0,0 +1,124 @@ +modifier_ability_power_hecatia = class({}) + +local public = modifier_ability_power_hecatia + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_hecatia_01"] = { + [4] = { + ["power_up"] = 3, + }, + [5] = { + ["power_up"] = 3, + }, + }, + ["thtd_hecatia_02"] = { + [4] = { + ["chance"] = 3, + ["crit"] = 3, + }, + [5] = { + ["chance"] = 3, + ["crit"] = 3, + }, + }, + ["thtd_hecatia_03"] = { + [4] = { + ["damage_up"] = 3, + }, + [5] = { + ["damage_up"] = 3, + }, + }, + ["thtd_hecatia_04"] = { + [1] = { + ["power_damage"] = 5, + }, + [2] = { + ["power_damage"] = 10, + }, + [3] = { + ["power_damage"] = 15, + }, + [4] = { + ["power_damage"] = 15, + }, + [5] = { + ["power_damage"] = 15, + ["power_bonus"] = 900, + }, + }, +} + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if abilityName == "thtd_hecatia_04" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + else + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_junko.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_junko.lua new file mode 100755 index 0000000..a423389 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_junko.lua @@ -0,0 +1,135 @@ +modifier_ability_power_junko = class({}) + +local public = modifier_ability_power_junko + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_junko_02"] = { + [1] = { + ["power_damage"] = 5, + }, + [2] = { + ["power_damage"] = 10, + }, + [3] = { + ["power_damage"] = 15, + }, + }, + ["thtd_junko_04"] = { + [1] = { + ["power_damage1"] = 10, + ["power_damage2"] = 2, + }, + [2] = { + ["power_damage1"] = 20, + ["power_damage2"] = 4, + }, + [3] = { + ["power_damage1"] = 30, + ["power_damage2"] = 6, + }, + }, +} +local power666_bonus = 4 +local power999_bonus = 400 + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- if not IsServer() then return end +-- self:OnRefresh( kv ) +-- end + +-- function public:OnRefresh( kv ) +-- if not IsServer() then return end +-- end + +function public:OnDestroy(kv) + if not IsServer() then return end + + local caster = self:GetParent() + caster:THTD_AddPowerPercentage("thtd_junko_power_999") + caster:THTD_AddAttackPercentage("thtd_junko_power_999") +end + +function public:OnStackCountChanged( iStackCount ) + -- 双端触发,iStackCount为改变前的层数 + if not IsServer() then return end + + local caster = self:GetParent() + if self:GetStackCount() == 5 then + caster:THTD_AddPowerPercentage(power999_bonus, "thtd_junko_power_999") + caster:THTD_AddAttackPercentage(power999_bonus, "thtd_junko_power_999") + end +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if self:GetStackCount() >= 4 then + return (params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName]) * power666_bonus + else + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_kanako.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_kanako.lua new file mode 100755 index 0000000..1f844ad --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_kanako.lua @@ -0,0 +1,148 @@ +modifier_ability_power_kanako = class({}) + +local public = modifier_ability_power_kanako + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_kanako_02"] = { + [1] = { + ["power_damage"] = 2, + }, + [2] = { + ["power_damage"] = 4, + }, + [3] = { + ["power_damage"] = 8, + }, + }, + ["thtd_kanako_04"] = { + [1] = { + ["power_damage1"] = 50, + ["power_damage2"] = 50, + ["damage_up"] = 0, + }, + [2] = { + ["power_damage1"] = 100, + ["power_damage2"] = 100, + ["damage_up"] = 0, + }, + [3] = { + ["power_damage1"] = 200, + ["power_damage2"] = 200, + ["damage_up"] = 0, + }, + [4] = { + ["power_damage1"] = 200, + ["power_damage2"] = 200, + ["damage_up"] = 0.6, + }, + [5] = { + ["power_damage1"] = 200, + ["power_damage2"] = 200, + ["damage_up"] = 0.6, + }, + }, +} +local power999_bonus = 600 + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- self:ForceRefresh() +-- end + +-- function public:OnRefresh( kv ) +-- if not IsServer() then return end +-- end + +function public:OnDestroy(kv) + if not IsServer() then return end + + local caster = self:GetParent() + caster:THTD_AddCritDamage("thtd_kanako_04_crit_999") +end + +function public:OnStackCountChanged( iStackCount ) + -- 双端触发,iStackCount为改变前的层数 + if not IsServer() then return end + + local caster = self:GetParent() + if self:GetStackCount() == 5 then + caster:THTD_AddCritDamage(power999_bonus, "thtd_kanako_04_crit_999") + end +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if abilityName == "thtd_kanako_02" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + elseif abilityName == "thtd_kanako_04" then + if valueName == "power_damage1" or valueName == "power_damage2" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * (1 + power_bonus[abilityName][level][valueName] / 100) + else + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_koishi.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_koishi.lua new file mode 100755 index 0000000..010a221 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_koishi.lua @@ -0,0 +1,111 @@ +modifier_ability_power_koishi = class({}) + +local public = modifier_ability_power_koishi + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_koishi_03"] = { + [1] = { + ["self_crit"] = 1, + }, + [2] = { + ["self_crit"] = 2, + }, + [3] = { + ["self_crit"] = 3, + }, + }, + ["thtd_koishi_04"] = { + [1] = { + ["duration_time"] = 2, + }, + [2] = { + ["duration_time"] = 4, + }, + [3] = { + ["duration_time"] = 8, + }, + [4] = { + ["power_base"] = 1000, + ["duration_time"] = 9, + }, + [5] = { + ["power_base"] = 1000, + ["power_up"] = 300, + ["duration_time"] = 9, + }, + }, +} + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if abilityName == "thtd_koishi_01" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + else + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_komachi.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_komachi.lua new file mode 100755 index 0000000..743323a --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_komachi.lua @@ -0,0 +1,155 @@ +modifier_ability_power_komachi = class({}) + +local public = modifier_ability_power_komachi + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_komachi_01"] = { + [1] = { + ["power_damage"] = 2, + }, + [2] = { + ["power_damage"] = 4, + }, + [3] = { + ["power_damage"] = 6, + }, + }, + ["thtd_komachi_04"] = { + [1] = { + ["hp_kill"] = 1, + ["attack_speed"] = 1, + ["damage_up"] = 1, + ["duration_time"] = 2, + ["bonus_power"] = 0, + }, + [2] = { + ["hp_kill"] = 1, + ["attack_speed"] = 1, + ["damage_up"] = 1, + ["duration_time"] = 4, + ["bonus_power"] = 0, + }, + [3] = { + ["hp_kill"] = 1, + ["attack_speed"] = 1, + ["damage_up"] = 1, + ["duration_time"] = 6, + ["bonus_power"] = 0, + }, + [4] = { + ["hp_kill"] = 2, + ["attack_speed"] = 2, + ["damage_up"] = 2, + ["duration_time"] = 6, + ["bonus_power"] = 0, + }, + [5] = { + ["hp_kill"] = 2, + ["attack_speed"] = 2, + ["damage_up"] = 2, + ["duration_time"] = 6, + ["bonus_power"] = 4, + }, + }, +} +local power999_bonus = 40 + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- if not IsServer() then return end +-- self:OnRefresh( kv ) +-- end + +-- function public:OnRefresh( kv ) +-- if not IsServer() then return end +-- end + +function public:OnDestroy(kv) + if not IsServer() then return end + + local caster = self:GetParent() + caster:THTD_AddCritChance("thtd_komachi_power_999") +end + +function public:OnStackCountChanged( iStackCount ) + -- 双端触发,iStackCount为改变前的层数 + if not IsServer() then return end + + local caster = self:GetParent() + if self:GetStackCount() == 5 then + caster:THTD_AddCritChance(power999_bonus, "thtd_komachi_power_999") + end +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if valueName == "power_damage" or valueName == "bonus_power" or valueName == "duration_time" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + else + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_lily.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_lily.lua new file mode 100755 index 0000000..e66e331 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_lily.lua @@ -0,0 +1,122 @@ +modifier_ability_power_lily = class({}) + +local public = modifier_ability_power_lily + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_lily_02"] = { + [1] = { + ["radius"] = 150, + }, + [2] = { + ["radius"] = 300, + }, + [3] = { + ["radius"] = 450, + }, + }, +} + +local thtd_lily_01_mana_cost = { + [1] = 10, + [2] = 20, + [3] = 30, +} + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- if not IsServer() then return end +-- self:OnRefresh( kv ) +-- end + +-- function public:OnRefresh( kv ) +-- -- 设置层数仅本地会触发,无层数设置为1层时不触发 +-- -- 使用 modifier:ForceRefresh() 会双端触发 +-- if not IsServer() then return end +-- end + +function public:OnStackCountChanged( iStackCount ) + -- 双端触发,iStackCount为改变前的层数 + if not IsServer() then return end + + local level = math.max(1, math.min(3, self:GetStackCount())) + local caster = self:GetParent() + caster:AddManaCostReducePercent(thtd_lily_01_mana_cost[level], "thtd_lily_01_power_level_buff") + caster.lily_max_mana = 100 - caster:GetManaCostReducePercent() +end + +function public:OnDestroy(kv) + if not IsServer() then return end + + local caster = self:GetParent() + caster:AddManaCostReducePercent("thtd_lily_01_power_level_buff") + caster.lily_max_mana = 100 - caster:GetManaCostReducePercent() +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] +end diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_miko.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_miko.lua new file mode 100755 index 0000000..3d091d3 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_miko.lua @@ -0,0 +1,132 @@ +modifier_ability_power_miko = class({}) + +local public = modifier_ability_power_miko + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_miko_03"] = { + [1] = { + ["power_damage"] = 2, + }, + [2] = { + ["power_damage"] = 4, + }, + [3] = { + ["power_damage"] = 6, + }, + [4] = { + ["power_damage"] = 18, + }, + [5] = { + ["power_damage"] = 18, + }, + }, + ["thtd_miko_04"] = { + [1] = { + ["power_damage"] = 5, + }, + [2] = { + ["power_damage"] = 10, + }, + [3] = { + ["power_damage"] = 20, + }, + [4] = { + ["power_damage"] = 20, + }, + [5] = { + ["power_damage"] = 190, + }, + }, +} +local power666_bonus = 400 + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:OnDestroy(kv) + if not IsServer() then return end + + local caster = self:GetParent() + caster:THTD_AddCritDamage("thtd_miko_power_666") +end + +function public:OnStackCountChanged( iStackCount ) + -- 双端触发,iStackCount为改变前的层数 + if not IsServer() then return end + + local caster = self:GetParent() + if self:GetStackCount() >= 4 then + caster:THTD_AddCritDamage(power666_bonus, "thtd_miko_power_666") + end +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if abilityName == "thtd_miko_03" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + else + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_minoriko.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_minoriko.lua new file mode 100755 index 0000000..33dda19 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_minoriko.lua @@ -0,0 +1,117 @@ +modifier_ability_power_minoriko = class({}) + +local public = modifier_ability_power_minoriko + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_minoriko_01"] = { + [1] = { + ["grow_time"] = 10, + }, + [2] = { + ["grow_time"] = 20, + }, + [3] = { + ["grow_time"] = 30, + }, + }, + ["thtd_minoriko_02"] = { + [1] = { + ["max_count"] = 1, + }, + [2] = { + ["max_count"] = 2, + }, + [3] = { + ["max_count"] = 3, + }, + }, +} + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- if not IsServer() then return end +-- self:OnRefresh( kv ) +-- end + +-- function public:OnRefresh( kv ) +-- if not IsServer() then return end +-- end + +-- function public:OnDestroy(kv) +-- if not IsServer() then return end +-- end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if abilityName == "thtd_minoriko_01" then + return math.floor(params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * (1 - power_bonus[abilityName][level][valueName]/100)) + elseif abilityName == "thtd_minoriko_02" then + -- local bonus = math.max(0, math.floor((self:GetParent():GetPhysicalArmorBaseValue() - 100)/50)) + -- return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + bonus + return math.floor(params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_nazrin.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_nazrin.lua new file mode 100755 index 0000000..79746a2 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_nazrin.lua @@ -0,0 +1,100 @@ +modifier_ability_power_nazrin = class({}) + +local public = modifier_ability_power_nazrin + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_nazrin_01"] = { + [1] = { + ["bonus_chance"] = 5, + }, + [2] = { + ["bonus_chance"] = 10, + }, + [3] = { + ["bonus_chance"] = 15, + }, + }, +} + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- if not IsServer() then return end +-- self:OnRefresh( kv ) +-- end + +-- function public:OnRefresh( kv ) +-- if not IsServer() then return end +-- end + +-- function public:OnDestroy(kv) +-- if not IsServer() then return end +-- end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_reimu.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_reimu.lua new file mode 100755 index 0000000..2a02d57 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_reimu.lua @@ -0,0 +1,126 @@ +modifier_ability_power_reimu = class({}) + +local public = modifier_ability_power_reimu + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_reimu_03"] = { + [1] = { + ["power_damage"] = 5, + }, + [2] = { + ["power_damage"] = 10, + }, + [3] = { + ["power_damage"] = 15, + }, + }, + ["thtd_reimu_04"] = { + [1] = { + ["power_damage"] = 5, + }, + [2] = { + ["power_damage"] = 10, + }, + [3] = { + ["power_damage"] = 15, + }, + [4] = { + ["power_damage"] = 15, + }, + [5] = { + ["power_damage"] = 15, + ["power_up"] = 7, + }, + }, +} + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- if not IsServer() then return end +-- self:OnRefresh( kv ) +-- end + +-- function public:OnRefresh( kv ) +-- if not IsServer() then return end +-- end + +-- function public:OnDestroy(kv) +-- if not IsServer() then return end +-- end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if abilityName == "thtd_reimu_03" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + else + if valueName == "power_damage" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + else + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + end + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_remilia.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_remilia.lua new file mode 100755 index 0000000..6a13d4f --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_remilia.lua @@ -0,0 +1,161 @@ +modifier_ability_power_remilia = class({}) + +local public = modifier_ability_power_remilia + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + MODIFIER_PROPERTY_COOLDOWN_REDUCTION_CONSTANT, +} + +local power_bonus = { + ["thtd_remilia_01"] = { + [1] = { + ["power_bonus"] = 1, + ["duration_time"] = 1, + }, + [2] = { + ["power_bonus"] = 1, + ["duration_time"] = 1, + }, + [3] = { + ["power_bonus"] = 1, + ["duration_time"] = 1, + }, + [4] = { + ["power_bonus"] = 6, + ["duration_time"] = 6, + }, + [5] = { + ["power_bonus"] = 6, + ["duration_time"] = 6, + }, + }, + ["thtd_remilia_03"] = { + [1] = { + ["cd"] = 1, + }, + [2] = { + ["cd"] = 3, + }, + [3] = { + ["cd"] = 5, + }, + [4] = { + ["cd"] = 5, + }, + [5] = { + ["cd"] = 5, + }, + }, + ["thtd_remilia_04"] = { + [1] = { + ["power_damage"] = 10, + }, + [2] = { + ["power_damage"] = 20, + }, + [3] = { + ["power_damage"] = 30, + }, + }, +} +local power999_bonus = 400 + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:OnDestroy(kv) + if not IsServer() then return end + + local caster = self:GetParent() + caster:AddDamageOutgoingAll("thtd_remilia_power_999") +end + +function public:OnStackCountChanged( iStackCount ) + -- 双端触发,iStackCount为改变前的层数 + if not IsServer() then return end + + local caster = self:GetParent() + if self:GetStackCount() == 5 then + caster:AddDamageOutgoingAll(power999_bonus, "thtd_remilia_power_999") + end +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if abilityName == "thtd_remilia_01" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + elseif abilityName == "thtd_remilia_04" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + end +end + +function public:GetModifierCooldownReduction_Constant( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + if params.ability:GetAbilityName() == "thtd_remilia_03" then + return power_bonus["thtd_remilia_03"][self:GetStackCount()]["cd"] or 0 + else + return 0 + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_shikieiki.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_shikieiki.lua new file mode 100755 index 0000000..51602bd --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_shikieiki.lua @@ -0,0 +1,126 @@ +modifier_ability_power_shikieiki = class({}) + +local public = modifier_ability_power_shikieiki + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_shikieiki_02"] = { + [1] = { + ["power_bonus"] = 2, + }, + [2] = { + ["power_bonus"] = 4, + }, + [3] = { + ["power_bonus"] = 8, + }, + }, + ["thtd_shikieiki_04"] = { + [1] = { + ["power_damage"] = 5, + }, + [2] = { + ["power_damage"] = 10, + }, + [3] = { + ["power_damage"] = 15, + }, + [4] = { + ["power_damage"] = 440, + }, + [5] = { + ["power_damage"] = 440, + }, + }, +} + +local power_999_crit = 700 +local power_999_chance = 70 + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:OnStackCountChanged( iStackCount ) + -- 双端触发,iStackCount为改变前的层数 + if not IsServer() then return end + + if self:GetStackCount() >= 5 then + local caster = self:GetParent() + caster:THTD_AddCritChance(power_999_chance, "shikieiki_power_999_buff") + caster:THTD_AddCritDamage(power_999_crit, "shikieiki_power_999_buff") + end +end + +function public:OnDestroy(kv) + if not IsServer() then return end + + local caster = self:GetParent() + caster:THTD_AddCritChance("shikieiki_power_999_buff") + caster:THTD_AddCritDamage("shikieiki_power_999_buff") +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_shinki.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_shinki.lua new file mode 100755 index 0000000..eea5421 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_shinki.lua @@ -0,0 +1,102 @@ +modifier_ability_power_shinki = class({}) + +local public = modifier_ability_power_shinki + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_shinki_03"] = { + [1] = { + ["power_bonus"] = 200, + ["duration_time"] = 1, + }, + [2] = { + ["power_bonus"] = 400, + ["duration_time"] = 2, + }, + [3] = { + ["power_bonus"] = 600, + ["duration_time"] = 3, + }, + }, +} + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- if not IsServer() then return end +-- end + +-- function public:OnRefresh( kv ) +-- if not IsServer() then return end +-- end + +-- function public:OnDestroy(kv) +-- if not IsServer() then return end +-- end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_sizuha.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_sizuha.lua new file mode 100755 index 0000000..cb90ede --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_sizuha.lua @@ -0,0 +1,99 @@ +modifier_ability_power_sizuha = class({}) + +local public = modifier_ability_power_sizuha + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_sizuha_01"] = { + [1] = { + ["grow_time"] = 10, + }, + [2] = { + ["grow_time"] = 20, + }, + [3] = { + ["grow_time"] = 30, + }, + }, +} + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- if not IsServer() then return end +-- end + +-- function public:OnRefresh( kv ) +-- if not IsServer() then return end +-- end + +-- function public:OnDestroy(kv) +-- if not IsServer() then return end +-- end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + return math.floor(params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * (1 - power_bonus[abilityName][level][valueName]/100)) +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_yukari.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_yukari.lua new file mode 100755 index 0000000..8852cbb --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_yukari.lua @@ -0,0 +1,157 @@ +modifier_ability_power_yukari = class({}) + +local public = modifier_ability_power_yukari + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, +} + +local power_bonus = { + ["thtd_yukari_01"] = { + [1] = { + ["duration_time"] = 1, + }, + [2] = { + ["duration_time"] = 1, + }, + [3] = { + ["duration_time"] = 1, + }, + [4] = { + ["duration_time"] = 2, + }, + [5] = { + ["duration_time"] = 2, + }, + }, + ["thtd_yukari_03"] = { + [1] = { + ["power_damage"] = 5, + }, + [2] = { + ["power_damage"] = 10, + }, + [3] = { + ["power_damage"] = 15, + }, + }, + ["thtd_yukari_04"] = { + [1] = { + ["power_damage"] = 10, + ["max_count"] = 1, + }, + [2] = { + ["power_damage"] = 20, + ["max_count"] = 1, + }, + [3] = { + ["power_damage"] = 30, + ["max_count"] = 1, + }, + [4] = { + ["power_damage"] = 30, + ["max_count"] = 2, + }, + [5] = { + ["power_damage"] = 30, + ["max_count"] = 2, + }, + }, +} +local power999_bonus = 400 + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +-- function public:OnCreated( kv ) +-- if not IsServer() then return end +-- self:OnRefresh( kv ) +-- end + +-- function public:OnRefresh( kv ) +-- if not IsServer() then return end +-- end + +function public:OnDestroy(kv) + if not IsServer() then return end + + local caster = self:GetParent() + caster:THTD_AddPowerPercentage("thtd_yukari_power_999") +end + +function public:OnStackCountChanged( iStackCount ) + -- 双端触发,iStackCount为改变前的层数 + if not IsServer() then return end + + local caster = self:GetParent() + if self:GetStackCount() == 5 then + caster:THTD_AddPowerPercentage(power999_bonus, "thtd_yukari_power_999") + end +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if valueName == "power_damage" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + else + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + end +end \ No newline at end of file diff --git a/scripts/vscripts/modifiers/power/modifier_ability_power_yuuka.lua b/scripts/vscripts/modifiers/power/modifier_ability_power_yuuka.lua new file mode 100755 index 0000000..308a6a8 --- /dev/null +++ b/scripts/vscripts/modifiers/power/modifier_ability_power_yuuka.lua @@ -0,0 +1,128 @@ +modifier_ability_power_yuuka = class({}) + +local public = modifier_ability_power_yuuka + +local m_modifier_funcs= +{ + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL, + MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE, + MODIFIER_PROPERTY_COOLDOWN_REDUCTION_CONSTANT, +} + +local power_bonus = { + ["thtd_yuuka_03"] = { + [1] = { + ["max_count"] = 50, + }, + [2] = { + ["max_count"] = 100, + }, + [3] = { + ["max_count"] = 150, + }, + [4] = { + ["max_count"] = 400, + }, + [5] = { + ["max_count"] = 400, + }, + }, + ["thtd_yuuka_04"] = { + [1] = { + ["cd"] = 2, + }, + [2] = { + ["cd"] = 4, + }, + [3] = { + ["cd"] = 8, + }, + [4] = { + ["cd"] = 8, + }, + [5] = { + ["cd"] = 8, + ["power_damage"] = 5, + }, + }, +} + +function public:IsHidden() + return true +end + +function public:IsPermanent() + return true +end + +function public:RemoveOnDeath() + return false +end + +function public:IsDebuff() + return false +end + +function public:IsPurgable() + return false +end + +function public:DeclareFunctions() + return m_modifier_funcs +end + +function public:GetModifierOverrideAbilitySpecial( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + + if power_bonus[abilityName] == nil then + return 0 + end + + if power_bonus[abilityName][level] == nil then + level = 3 + end + if power_bonus[abilityName][level] == nil then + return 0 + end + + if power_bonus[abilityName][level][valueName] == nil then + return 0 + end + + return 1 +end + +function public:GetModifierOverrideAbilitySpecialValue( params ) + local abilityName = params.ability:GetAbilityName() + local level = self:GetStackCount() + local valueName = params.ability_special_value + local specialLevel = params.ability_special_level + + if power_bonus[abilityName][level] == nil then + level = 3 + end + + if abilityName == "thtd_yuuka_03" then + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) + power_bonus[abilityName][level][valueName] + else + return params.ability:GetLevelSpecialValueNoOverride(valueName, specialLevel) * power_bonus[abilityName][level][valueName] + end +end + +function public:GetModifierCooldownReduction_Constant( params ) + if self:GetParent() == nil or params.ability == nil then + return 0 + end + + if params.ability:GetAbilityName() == "thtd_yuuka_04" then + return power_bonus["thtd_yuuka_04"][self:GetStackCount()]["cd"] or 0 + else + return 0 + end +end \ No newline at end of file diff --git a/scripts/vscripts/system/ai.lua b/scripts/vscripts/system/ai.lua new file mode 100755 index 0000000..6eb4f35 --- /dev/null +++ b/scripts/vscripts/system/ai.lua @@ -0,0 +1,2687 @@ +--用向量的叉乘判断p在有向直线ab的左边还是右边,直线ab将平面分成两块左边和右边 +function GetLeftRightSide(a,b,p) + return (b.x-a.x) * (p.y-a.y) - (p.x-a.x) * (b.y-a.y) +end + +--循环判断p是否在有向直线ab,bc,cd,da的同向,这些直线的左边或者右边构成这个四边形 +function IsInQuadrangle(point, a, b, c, d) + local ab_side = GetLeftRightSide(a,b,point) + local bc_side = GetLeftRightSide(b,c,point) + local cd_side = GetLeftRightSide(c,d,point) + local da_side = GetLeftRightSide(d,a,point) + return (ab_side>=0 and bc_side>=0 and cd_side>=0 and da_side>=0) or (ab_side<=0 and bc_side<=0 and cd_side<=0 and da_side<=0) +end + +--这里的width不是长方形的宽,而是直线技能得左右宽度 +function THTD_FindUnitsInLine(caster, point, forward, width, length) + if caster:THTD_IsTower() then + forward = forward:Normalized() + local orth_Vec = Vector(forward.y, -forward.x, 0) + local a = point + orth_Vec * width + local b = a + forward * length + local c = b - orth_Vec * width * 2 + local d = c - forward * length + local targets = {} + local enemies = THTD_FindUnitsAll(caster) + for _,v in pairs(enemies) do + if v~=nil and v:IsNull()==false and IsInQuadrangle(v:GetAbsOrigin(), a, b, c, d) then + table.insert(targets, v) + end + end + return targets + end +end + +function THTD_RandomUnitSelection(inputs, count) + if #inputs<=count then + return inputs + end + for i=2,#inputs do + local j = RandomInt(1, i) + if j~=i then + local tmp = inputs[i] + inputs[i] = inputs[j] + inputs[j] = tmp + end + end + local outputs = {} + for i=1,count do + table.insert(outputs, inputs[i]) + end + return outputs +end + +FirstPointList = +{ + [0] = Vector(-1408, 1056,0), + [1] = Vector( 1408, 1056,0), + [2] = Vector( 1408,-1056,0), + [3] = Vector(-1408,-1056,0), +} + +function GetUnitBackWardVector(unit, id) + return (FirstPointList[id] - unit:GetAbsOrigin()):Normalized() +end + + +if THTDSystem == nil then + THTDSystem = {} +end + +function THTDSystem:FindFriendlyRadiusOneUnitLast( entity, range) + if THTD_IsValid(entity.thtd_last_cast_unit) and GetDistanceBetweenTwoVec2D(entity:GetOrigin(),entity.thtd_last_cast_unit:GetOrigin()) <= range then + return entity.thtd_last_cast_unit + end + + local friends = THTD_FindFriendlyUnitsInRadius(entity,entity:GetOrigin(),range) + if #friends > 0 then + local index = RandomInt(1, #friends) + entity.thtd_last_cast_unit = friends[index] + return friends[index] + else + return nil + end +end + +function THTDSystem:FindRadiusWeakOneUnit( entity, range, ...) + local condition = ... + if condition == nil then + condition = function(...) return true end + end + local isFlandre = (entity:GetUnitName() == "flandre") + local enemies = THTD_FindUnitsInRadius(entity, entity:GetOrigin(), range) + if #enemies > 0 then + local weakUnit = nil + for k,v in pairs(enemies) do + if v~=nil and v:IsNull()==false and v:IsAlive() and v.thtd_damage_lock ~= true and condition(v) then + if weakUnit == nil or weakUnit:IsNull() or weakUnit:IsAlive() == false then + weakUnit = v + else + local factor = 1.0 + local factor2 = 1.0 + if isFlandre and v:HasModifier("modifier_remilia_03_debuff") then factor = 1.6 end + if isFlandre and weakUnit:HasModifier("modifier_remilia_03_debuff") then factor2 = 1.6 end + if v:GetHealth()/factor < weakUnit:GetHealth()/factor2 then + weakUnit = v + end + end + end + end + return weakUnit + else + return nil + end +end + +function THTDSystem:FindRadiusMostHpOneUnit(entity, range, ...) + local condition = ... + if condition == nil then + condition = function(...) return true end + end + local enemies = THTD_FindUnitsInRadius(entity, entity:GetOrigin(), range) + if #enemies > 0 then + local weakUnit = nil + for k,v in pairs(enemies) do + if v~=nil and v:IsNull()==false and v:IsAlive() and v.thtd_damage_lock ~= true and condition(v) then + if weakUnit == nil or weakUnit:IsNull() or weakUnit:IsAlive() == false then + weakUnit = v + elseif v:GetHealth() > weakUnit:GetHealth() then + weakUnit = v + end + end + end + return weakUnit + else + return nil + end +end + +function THTDSystem:FindRadiusLowHpOneUnit(entity, range, ...) + local condition = ... + if condition == nil then + condition = function(...) return true end + end + local enemies = THTD_FindUnitsInRadius(entity, entity:GetOrigin(), range) + if #enemies > 0 then + local weakUnit = nil + for k,v in pairs(enemies) do + if v~=nil and v:IsNull()==false and v:IsAlive() and v.thtd_damage_lock ~= true and condition(v) then + if weakUnit == nil or weakUnit:IsNull() or weakUnit:IsAlive() == false then + weakUnit = v + elseif v:GetHealth() < weakUnit:GetHealth() then + weakUnit = v + end + end + end + return weakUnit + else + return nil + end +end + +function THTDSystem:FindRadiusLonelyOneUnit( entity, range , lonelyCount) + local enemies = THTD_FindUnitsInRadius(entity, entity:GetOrigin(), range) + if #enemies > 0 then + local lonelyUnit = nil + for k,v in pairs(enemies) do + local units = THTD_FindFriendlyUnitsInRadius(entity,v:GetOrigin(),range) + if #units <= lonelyCount then + lonelyUnit = v + break + end + end + return lonelyUnit + else + return nil + end +end + +function THTDSystem:FindFriendlyRadiusOneUnit( entity, range) + local friends = THTD_FindFriendlyUnitsInRadius(entity,entity:GetOrigin(),range) + if #friends > 0 then + local index = RandomInt( 1, #friends ) + return friends[index] + else + return nil + end +end + +function THTDSystem:FindFriendlyHighestStarRadiusOneUnit( entity, range) + local friends = THTD_FindFriendlyUnitsInRadius(entity,entity:GetOrigin(),range) + if #friends > 0 then + local highestUnit = nil + for k,v in pairs(friends) do + if v:THTD_IsTower() and v~=entity and v:THTD_GetLevel()<10 then + if highestUnit == nil then + highestUnit = v + end + if v:THTD_GetStar() > highestUnit:THTD_GetStar() then + highestUnit = v + end + end + end + return highestUnit + else + return nil + end +end + +function THTDSystem:FindRadiusOnePointLastCast( entity, range) + local point = entity.thtd_last_cast_point + if point == nil or GetDistanceBetweenTwoVec2D(point, entity:GetOrigin()) > range then + local unit = THTDSystem:FindRadiusOneUnit(entity, range) + if unit~=nil and unit:IsNull()==false then + point = unit:GetOrigin() + end + end + return point +end + +function THTDSystem:FindRadiusOnePointPerfectAOE( entity, range, AOErange) + local enemies = THTD_FindUnitsInRadius(entity, entity:GetOrigin(), range) + if #enemies > 10 then enemies = THTD_RandomUnitSelection(enemies, 10) end + local target,maxCount = nil, 0 + for k,v in pairs(enemies) do + if v~=nil and v:IsNull()==false then + local count = THTDSystem:FindUnitCountInPoint(entity, v:GetAbsOrigin(), AOErange) + if target == nil or count > maxCount then + target = v + maxCount = count + end + end + end + if target~=nil then + return target:GetAbsOrigin(), maxCount, target + end + return nil, 0 +end + +function THTDSystem:FindRadiusOnePointPerfectLineAOE(entity, range, width, length, onlyInner) + local enemies = THTD_FindUnitsInRadius(entity, entity:GetOrigin(), range) + if #enemies > 10 then enemies = THTD_RandomUnitSelection(enemies, 10) end + local target,maxCount = nil, 0 + for k,v in pairs(enemies) do + if v~=nil and v:IsNull()==false and not (onlyInner and v.thtd_is_outer==true) then + local forward = (v:GetAbsOrigin() - entity:GetAbsOrigin()):Normalized() + local count = THTDSystem:FindUnitCountInLine(entity, entity:GetOrigin(), forward, width, length) + if target == nil or count > maxCount then + target = v + maxCount = count + end + end + end + if target~=nil then + return target:GetAbsOrigin(), maxCount, target + end + return nil +end + +function THTDSystem:CastAbility(unit,ability) + if ability:IsUnitTarget() then + local teams = DOTA_UNIT_TARGET_TEAM_ENEMY + local types = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + local flags = 0 + local target = THTDSystem:FindRadiusOneUnit( unit,ability:GetCastRange(),teams,types,flags) + if target then + unit:THTD_SetAggressiveLock() + unit:CastAbilityOnTarget(target,ability,target:GetPlayerOwnerID()) + end + elseif ability:IsPoint() or ability:GetBehavior() == 24 then + local teams = DOTA_UNIT_TARGET_TEAM_ENEMY + local types = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + local flags = 0 + local target = THTDSystem:FindRadiusOneUnit( unit,ability:GetCastRange(),teams,types,flags) + if target then + unit:THTD_SetAggressiveLock() + unit:CastAbilityOnPosition(target:GetOrigin(),ability,target:GetPlayerOwnerID()) + end + elseif ability:IsNoTarget() then + unit:THTD_SetAggressiveLock() + ability:CastAbility() + end +end + +function THTDSystem:CastAbilityFriendly( unit,ability) + if ability:IsUnitTarget() then + local teams = DOTA_UNIT_TARGET_TEAM_FRIENDLY + local types = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + local flags = 0 + local target = THTDSystem:FindFriendlyRadiusOneUnit( unit,ability:GetCastRange(),teams,types,flags) + if target then + unit:THTD_SetAggressiveLock() + unit:CastAbilityOnTarget(target,ability,target:GetPlayerOwnerID()) + end + elseif ability:IsPoint() or ability:GetBehavior() == 24 then + local teams = DOTA_UNIT_TARGET_TEAM_FRIENDLY + local types = DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC + local flags = 0 + local target = THTDSystem:FindFriendlyRadiusOneUnit( unit,ability:GetCastRange(),teams,types,flags) + if target then + unit:THTD_SetAggressiveLock() + unit:CastAbilityOnPosition(target:GetOrigin(),ability,target:GetPlayerOwnerID()) + end + elseif ability:IsNoTarget() then + unit:THTD_SetAggressiveLock() + ability:CastAbility() + end +end + +function THTDSystem:CastAbilityToUnit( unit,ability,target) + if ability:IsUnitTarget() then + unit:THTD_SetAggressiveLock() + unit:CastAbilityOnTarget(target,ability,target:GetPlayerOwnerID()) + elseif ability:IsPoint() or ability:GetBehavior() == 24 then + unit:THTD_SetAggressiveLock() + unit:CastAbilityOnPosition(target:GetOrigin(),ability,target:GetPlayerOwnerID()) + end +end + +function THTDSystem:FindRadiusOneUnit( entity, range) + local enemies = THTD_FindUnitsInRadius(entity, entity:GetOrigin(), range) + if #enemies > 0 then + local index = RandomInt( 1, #enemies ) + return enemies[index] + else + return nil + end +end + +function THTDSystem:FindRadiusOneUnitHasNoModifier(entity,range,modifierName) + local enemies = THTD_FindUnitsInRadius(entity, entity:GetOrigin(), range) + if #enemies > 0 then + for k,v in pairs(enemies) do + if v:HasModifier(modifierName) ~= true and v.thtd_damage_lock ~= true then + return v + end + end + return nil + else + return nil + end +end + +function THTDSystem:FindRadiusAllUnitHasNoModifier(entity,range,modifierName) + local enemies = THTD_FindUnitsInRadius(entity, entity:GetOrigin(), range) + local tb = {} + if #enemies > 0 then + for k,v in pairs(enemies) do + if v:HasModifier(modifierName) ~= true and v.thtd_damage_lock ~= true then + tb.insert(tb, v) + end + end + end + return tb +end + +function THTDSystem:FindRadiusAllUnitHasModifier(entity,range,modifierName) + local enemies = THTD_FindUnitsInRadius(entity, entity:GetOrigin(), range) + local tb = {} + if #enemies > 0 then + for k,v in pairs(enemies) do + if v:HasModifier(modifierName) then + tb.insert(tb, v) + end + end + end + return tb +end + +function THTDSystem:FindRadiusOneUnitHasNoStunned(entity,point,range) + local enemies = THTD_FindUnitsInRadius(entity, point, range) + if #enemies > 0 then + for k,v in pairs(enemies) do + if v:IsStunned() ~= true then + return v + end + end + return nil + else + return nil + end +end + +function THTDSystem:ChangeTargetHasNoDamageLock(entity, filter) + local range = entity:Script_GetAttackRange() + if range == nil then range = entity:GetBaseAttackRange() end + if range == nil then range = 1000 end + + local enemies = THTD_FindUnitsInRadius(entity, entity:GetOrigin(), range) + if #enemies > 0 then + for k,v in pairs(enemies) do + if v.thtd_damage_lock ~= true and ((filter ~=nil and filter(v)) or filter == nil) then + return v + end + end + end + return entity:GetAttackTarget() +end + +function THTDSystem:FindUnitCountInPoint( entity, point, range) + local enemies = THTD_FindUnitsInRadius(entity, point, range) + if #enemies > 0 then + return #enemies + else + return 0 + end +end + +function THTDSystem:FindUnitCountInLine(entity, point, forward, width, length) + local enemies = THTD_FindUnitsInLine(entity, point, forward, width, length) + if #enemies > 0 then + return #enemies + else + return 0 + end +end + +function THTDSystem:FindRadiousMostDangerousUnit(entity, range, ...) + local enemies = THTD_FindUnitsInRadius(entity, entity:GetAbsOrigin(), range) + local condition = ... + if condition == nil then + condition = function(...) return true end + end + local target = nil + local maxdist = 0 + local firstpoint = FirstPointList[entity:GetPlayerOwnerID()] + if #enemies > 0 then + for k,v in pairs(enemies) do + if v~=nil and v:IsNull()==false and condition(v) then + local dist = GetDistanceBetweenTwoVec2D(firstpoint, v:GetAbsOrigin()) + if target == nil or dist > maxdist then + target = v + maxdist = dist + end + end + end + end + return target, maxdist +end + +function THTDSystem:ChangeAttackTarget(entity, target) + local range = entity:Script_GetAttackRange() -- 获取真实射程, 7.20 GetAttackRange() 改名为 Script_GetAttackRange() + if range == nil then range = entity:GetBaseAttackRange() end -- 此只能获取无加成的攻击距离 + if range == nil then range = 1000 end + if entity.thtd_changing_attack_target == true then return end + entity.thtd_changing_attack_target = true + local count = 3 + entity:SetContextThink(DoUniqueString("thtd_change_attack_target"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if target==nil or target:IsNull() or target:IsAlive()==false or + entity==nil or entity:IsNull() or entity:GetAttackTarget()==target or GetDistanceBetweenTwoEntity(entity,target)>range or count <= 0 then + entity.thtd_changing_attack_target = false + return nil + end + entity:MoveToTargetToAttack(target) + count = count - 1 + return 0.1 + end, + 0) +end + +function THTDSystem:FindUtsuhoPerfectPoint(entity, range, AOErange) + local unit = THTDSystem:FindRadiousMostDangerousUnit(entity, AOErange) + if unit~=nil and unit:IsNull()==false then + local Point = unit:GetAbsOrigin() + GetUnitBackWardVector(unit, entity:GetPlayerOwnerID()) * 280 + return Point + end + local enemies = THTD_FindUnitsInRadius(entity, entity:GetAbsOrigin(), range+AOErange) + local points = {} + for k,v in pairs(enemies) do + if v~=nil and v:IsNull()==false then + local overlap = false + local curpoint = v:GetAbsOrigin() + for x,p in pairs(points) do + if GetDistanceBetweenTwoVec2D(p, curpoint)<64 then + overlap = true + break + end + end + if overlap==false then + table.insert(points, curpoint) + end + end + end + local maxSumEffect = 0 + local point = nil + for k1,p1 in pairs(points) do + if GetDistanceBetweenTwoVec2D(p1, entity:GetAbsOrigin()) <= range then + local sumEffect = 0 + local count = 0 + for k2,p2 in pairs(points) do + local dist = GetDistanceBetweenTwoVec2D(p1, p2) + if dist < AOErange then + sumEffect = sumEffect + dist + count = count + 1 + end + end + if sumEffect > maxSumEffect and count > 5 then + maxSumEffect = sumEffect + point = p1 + end + end + end + if maxSumEffect > 999 then + return point + end + return nil +end + +function CDOTA_BaseNPC:IsReadyToCastAbility(ability) + return ability:IsFullyCastable() and self:IsChanneling() == false and THTD_IsSpellLock(self, ability:GetAbilityName()) == false +end + + +function CDOTA_BaseNPC:EnableAi() + -- print("---------- AI start : ", self:GetUnitName()) + self:SetContextThink(DoUniqueString("thtd_ai_think"), + function() + if GameRules:IsGamePaused() then return 0.1 end + if self == nil or self:IsNull() or self:IsAlive() == false or self:THTD_IsHidden() then + -- print("---------- AI close : ", self:GetUnitName()) + return nil + end + if self.thtd_close_ai ~= true then + local func = self["THTD_"..self:GetUnitName().."_thtd_ai"] + if func then + func(self) + elseif self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end + end + return 0.3 + end, + 0) +end + +function CDOTA_BaseNPC:THTD_lily_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_lily_01") + local ability2 = self:FindAbilityByName("thtd_lily_02") + + if self:IsReadyToCastAbility(ability2) and self:HasModifier("thtd_lily_02") == false then + local unit = THTDSystem:FindRadiusOneUnit(self, 1000) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability2, self:GetPlayerOwnerID()) + return + end + end + + if SpawnSystem.IsUnLimited and self:IsReadyToCastAbility(ability1) and THTD_HasUnitsInRadius(self, self:GetAbsOrigin(), ability1:GetCastRange()) then + local point = self.thtd_last_cast_point + if point == nil then + point = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability1:GetCastRange(), ability1:GetSpecialValueFor("radius")) + end + if point ~= nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + -- IsAttacking() 实测只能判定是否正在攻击动作,不能判断是否在战斗中 + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_cirno_thtd_ai() + local ability = self:FindAbilityByName("thtd_cirno_02") + + if self:IsReadyToCastAbility(ability) then + local unit = THTDSystem:FindRadiusOneUnit(self,ability:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_letty_thtd_ai() + local ability = self:FindAbilityByName("thtd_letty_01") + + if self:IsReadyToCastAbility(ability) then + local unit = THTDSystem:FindRadiusOneUnit(self,ability:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(unit:GetAbsOrigin(), ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_kogasa_thtd_ai() + local ability = self:FindAbilityByName("thtd_kogasa_01") + + if self:IsReadyToCastAbility(ability) then + if self.thtd_last_cast_point ~= nil then + local point = self.thtd_last_cast_point + if THTD_HasUnitsInRadius(self, point, ability:GetSpecialValueFor("radius") * 0.7) then + THTD_SetSpellLock(self, ability:GetAbilityName(), ability:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability, self:GetPlayerOwnerID()) + return + end + else + local unit = THTDSystem:FindRadiousMostDangerousUnit(self, ability:GetCastRange()) + if unit ~= nil then + local point = unit:GetAbsOrigin() + if point.x <= -2400 or point.x >= 2400 then + THTD_SetSpellLock(self, ability:GetAbilityName(), ability:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability, self:GetPlayerOwnerID()) + return + end + end + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_lyrica_thtd_ai() + local ability = self:FindAbilityByName("thtd_lyrica_01") + + if self:IsReadyToCastAbility(ability) then + local unit = THTDSystem:FindRadiusOneUnit(self,ability:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(unit:GetAbsOrigin(), ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_lunasa_thtd_ai() + local ability = self:FindAbilityByName("thtd_lunasa_01") + + if self:IsReadyToCastAbility(ability) then + local unit = THTDSystem:FindRadiusOneUnit(self,ability:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(unit:GetAbsOrigin(), ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_merlin_thtd_ai() + local ability = self:FindAbilityByName("thtd_merlin_01") + + if self:IsReadyToCastAbility(ability) then + local unit = THTDSystem:FindRadiusOneUnit(self,ability:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(unit:GetAbsOrigin(), ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_satori_thtd_ai() + local ability = self:FindAbilityByName("thtd_satori_01") + + if self:IsReadyToCastAbility(ability) then + local unit = THTDSystem:FindRadiusOneUnitHasNoModifier(self, ability:GetCastRange()+500, "modifier_satori_01_debuff") + if unit==nil or unit:IsNull()== false then + unit = THTDSystem:FindRadiusOneUnit(self, 1000) + end + if unit~=nil and unit:IsNull()==false then + local point = nil + if GetDistanceBetweenTwoEntity(self, unit) > ability:GetCastRange() then + local forward = (unit:GetAbsOrigin()-self:GetAbsOrigin()):Normalized() + point = self:GetAbsOrigin() + forward * ability:GetCastRange() + else + point = unit:GetAbsOrigin() + end + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_iku_thtd_ai() + local ability = self:FindAbilityByName("thtd_iku_02") + + if self:IsReadyToCastAbility(ability) then + local unit = THTDSystem:FindRadiusOneUnit(self,ability:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(unit:GetAbsOrigin(), ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_marisa_thtd_ai() + if self.spelling_lock == true then return end + + local ability1 = self:FindAbilityByName("thtd_marisa_01") + local ability3 = self:FindAbilityByName("thtd_marisa_03") + + if self:IsReadyToCastAbility(ability3) then + local point = THTDSystem:FindRadiusOnePointPerfectLineAOE(self, ability3:GetCastRange(), 300, 1200, false) + if point~=nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability3, self:GetPlayerOwnerID()) + return + end + end + + if ability3:GetLevel() == 0 and self:IsReadyToCastAbility(ability1) then + local point = THTDSystem:FindRadiusOnePointPerfectLineAOE(self, ability1:GetCastRange(), 300, 1200, false) + if point~=nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false and self:IsChanneling() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_tenshi_thtd_ai() + local ability = self:FindAbilityByName("thtd_tenshi_01") + + if self:IsReadyToCastAbility(ability) then + local _,_,unit = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability:GetCastRange(), 400) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_patchouli_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_patchouli_01") + local ability2 = self:FindAbilityByName("thtd_patchouli_02") + local ability4 = self:FindAbilityByName("thtd_patchouli_04") + + if (self.thtd_patchouli_02_cast == nil or self.thtd_patchouli_02_cast == true) and self:IsReadyToCastAbility(ability2) then + if self.thtd_patchouli_02_type == self.thtd_patchouli_02_cast_type then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability1) then + local point = nil + if self.thtd_patchouli_02_type == 1 then + point = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability1:GetCastRange(), 300) + elseif self.thtd_patchouli_02_type == 2 then + local target = THTDSystem:FindRadiusOneUnitHasNoModifier(self, ability1:GetCastRange(), "modifier_patchouli_01_mercury_poison_debuff") + if target==nil then + target = THTDSystem:FindRadiusOneUnit(self, ability1:GetCastRange()) + end + if target~=nil then + point = target:GetAbsOrigin() + end + else + point = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability1:GetCastRange(), 350) + end + if point~=nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability4) and (THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), 800) > 5 or THTDSystem:FindRadiousMostDangerousUnit(self,400)~=nil) then + THTD_SetSpellLock(self, ability4:GetAbilityName(), ability4:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability4, self:GetPlayerOwnerID()) + return + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_hina_thtd_ai() + local ability2 = self:FindAbilityByName("thtd_hina_02") + + if self:IsReadyToCastAbility(ability2) and THTD_HasUnitsInRadius(self, self:GetAbsOrigin(), ability2:GetCastRange()) then + local point = self.thtd_last_cast_point + if point == nil then + point = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability2:GetCastRange(), ability2:GetSpecialValueFor("range")) + end + if point ~= nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_reisen_thtd_ai() + local ability = self:FindAbilityByName("thtd_reisen_03") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + local target = self:GetAttackTarget() + if target == nil or target:IsNull() == true or target.thtd_is_feared_by_reisen_01 == true then + target = THTDSystem:FindRadiousMostDangerousUnit(self, range, + function(targetunit) return targetunit.thtd_is_feared_by_reisen_01~=true end) + if target~=nil and target:IsNull()==false then + THTDSystem:ChangeAttackTarget(self, target) + end + end + + if self:IsReadyToCastAbility(ability) then + local unit = THTDSystem:FindRadiousMostDangerousUnit(self, range-250, + function(targetunit) return targetunit.thtd_is_fearing~=true end) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_yuyuko_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_yuyuko_01") + local ability3 = self:FindAbilityByName("thtd_yuyuko_03") + if self.thtd_yuyuko_03_cast == nil then self.thtd_yuyuko_03_cast = true end + + local target = THTDSystem:FindRadiousMostDangerousUnit(self, ability3:GetCastRange(), + function (targetunit) return targetunit:GetHealthPercent() <= (self.thtd_yuyuko_03_health_kill or 30) end) + + if self.thtd_yuyuko_03_cast==true and self:IsReadyToCastAbility(ability3) and target~=nil and target:IsNull()==false then + THTD_SetSpellLock(self, ability3:GetAbilityName(), ability3:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(target:GetAbsOrigin(), ability3, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability1) and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), ability1:GetCastRange()) > 0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability1, self:GetPlayerOwnerID()) + return + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false and self:IsChanneling() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_youmu_thtd_ai() + local ability = self:FindAbilityByName("thtd_youmu_03") + + if self:IsReadyToCastAbility(ability) then + local point = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability:GetCastRange(), 550) + if point~=nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_utsuho_thtd_ai() + local ability = self:FindAbilityByName("thtd_utsuho_03") + + if self:IsReadyToCastAbility(ability) then + if self.thtd_last_cast_point ~= nil then + local point = self.thtd_last_cast_point + if THTD_HasUnitsInRadius(self, point, ability:GetSpecialValueFor("radius")-250) then + THTD_SetSpellLock(self, ability:GetAbilityName(), ability:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability, self:GetPlayerOwnerID()) + return + end + else + local point = THTDSystem:FindUtsuhoPerfectPoint(self, ability:GetCastRange(), ability:GetSpecialValueFor("radius")-100) + if point~=nil then + THTD_SetSpellLock(self, ability:GetAbilityName(), ability:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability, self:GetPlayerOwnerID()) + return + end + end + + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false and self:IsChanneling()==false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_rin_thtd_ai() + local ability = self:FindAbilityByName("thtd_rin_01") + + if self:IsReadyToCastAbility(ability) then + local unit = THTDSystem:FindRadiusOneUnit(self,ability:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_reimu_thtd_ai() + local ability = self:FindAbilityByName("thtd_reimu_03") + + if self:IsReadyToCastAbility(ability) then + if self.thtd_last_cast_point ~= nil then + local point = self.thtd_last_cast_point + if THTD_HasUnitsInRadius(self, point, ability:GetSpecialValueFor("range") * 0.7) then + THTD_SetSpellLock(self, ability:GetAbilityName(), ability:GetSpecialValueFor("stun_time") * 1.5) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability, self:GetPlayerOwnerID()) + return + end + else + local unit = THTDSystem:FindRadiousMostDangerousUnit(self, ability:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + local point = unit:GetAbsOrigin() + THTD_SetSpellLock(self, ability:GetAbilityName(), ability:GetSpecialValueFor("stun_time") * 1.5) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability, self:GetPlayerOwnerID()) + return + end + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_daiyousei_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_daiyousei_01") + local ability2 = self:FindAbilityByName("thtd_daiyousei_02") + + if SpawnSystem.IsUnLimited == false and GameRules:GetCustomGameDifficulty() < 8 and self:IsReadyToCastAbility(ability1) then + local target = THTDSystem:FindFriendlyHighestStarRadiusOneUnit(self,ability1:GetCastRange()) + if target~=nil and target:THTD_IsTower() then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(target,ability1,self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability2) then + local target = THTDSystem:FindFriendlyRadiusOneUnit(self, 1000) + if target~=nil and target:THTD_IsTower() then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability2,self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_remilia_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_remilia_01") + local ability2 = self:FindAbilityByName("thtd_remilia_03") + + + if self:IsReadyToCastAbility(ability2) then + local point,count = THTDSystem:FindRadiusOnePointPerfectLineAOE(self, ability2:GetCastRange(), 300, 2500, false) + if point~=nil and count>=3 then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability1) then + local point,count,unit = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability1:GetCastRange(), 800) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_flandre_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_flandre_01") + local ability4 = self:FindAbilityByName("thtd_flandre_04") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + if self:THTD_IsAttackChangeLock() == false and (self.thtd_attatck_target==nil or self.thtd_attatck_target:IsNull() or GetDistanceBetweenTwoEntity(self, self.thtd_attatck_target) > range) then + local target = THTDSystem:FindRadiusWeakOneUnit(self,range) + if target~=nil and target:IsNull()==false and target:IsAlive() then + self.thtd_attatck_target = target + THTDSystem:ChangeAttackTarget(self, target) + self:THTD_SetAttackChangeLock() + end + end + + if self:IsReadyToCastAbility(ability1) then + range = ability1:GetCastRange() + if ability4:GetLevel() > 0 then range = ability4:GetCastRange() end + if THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), range) > 0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability4) then + range = ability4:GetCastRange() + local unit = THTDSystem:FindRadiusWeakOneUnit(self, range) + if unit ~= nil and unit:IsNull() == false and unit:IsAlive() then + if SpawnSystem.CurTime > ability4:GetCooldownTime() + 3 then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability4, self:GetPlayerOwnerID()) + return + end + + -- 溢出伤害占比 + local factor = 0.1 + SpawnSystem.CurTime * 0.01 + + local damage = self:THTD_GetAbilityPowerDamage(ability4) * 4 + local crit = 1 + local ability3 = self:FindAbilityByName("thtd_flandre_03") + if ability3:GetLevel() > 0 then + crit = 1 + (100 - unit:GetHealthPercent()) * ability3:GetSpecialValueFor("damage_up") / 100 + end + if self:IsPower999() then + crit = crit * 4 + end + + local DamageTable = { + ability = ability4, + victim = unit, + attacker = self, + damage = damage * crit, + damage_type = ability4:GetAbilityDamageType(), + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + if UnitDamageTarget(DamageTable, true) <= factor then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability4, self:GetPlayerOwnerID()) + return + else + THTDSystem:ChangeAttackTarget(self,unit) + return + end + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +require( "../abilities/abilitysakuya") + +function CDOTA_BaseNPC:NeedRefreshAbility() + if self:THTD_IsTower() and self:HasModifier("modifier_sakuya_02_buff") == false then + for i=2,5 do + local ability = self:GetAbilityByIndex(i) + if ability ~= nil and ability:GetAbilityName() ~= "ability_common_ai" and not IsInSakuya02BlackList(ability) and (ability:GetCooldownTimeRemaining() > 0 or ability:GetManaCost(-1) > 0) then + local cd = ability:GetCooldownTime() + local left = ability:GetCooldownTimeRemaining() + if left > 2.0 then + if left > cd * 0.4 or self:GetMana() <= self:GetRealManaCost(ability) * 0.6 then + return true + end + end + end + end + end + return false +end + +function CDOTA_BaseNPC:THTD_sakuya_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_sakuya_01") + local ability2 = self:FindAbilityByName("thtd_sakuya_02") + local ability3 = self:FindAbilityByName("thtd_sakuya_03") + + if self:IsReadyToCastAbility(ability2) then + local target = THTDSystem:FindFriendlyRadiusOneUnitLast(self,ability2:GetCastRange()) + if target~=nil and target:IsNull()==false and target:THTD_IsTower() and target:NeedRefreshAbility() then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(target,ability2,self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability3) and (THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), 800)>5 or THTDSystem:FindRadiousMostDangerousUnit(self,400)~=nil ) then + THTD_SetSpellLock(self, ability3:GetAbilityName(), ability3:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability3, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability1) then + local unit = THTDSystem:FindRadiusOneUnit(self,ability1:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_koishi_thtd_ai() + local ability3 = self:FindAbilityByName("thtd_koishi_03") + local ability4 = self:FindAbilityByName("thtd_koishi_04") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + if self:IsReadyToCastAbility(ability3) and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), range) > 0 then + local target = THTDSystem:FindFriendlyRadiusOneUnitLast(self, ability3:GetCastRange()) + if target~=nil and target:IsNull()==false and target:THTD_IsTower() and target.thtd_koishi_03_bonus~=true then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(target, ability3, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability4) and self:HasModifier("passive_koishi_04_attack") == false and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), range) > 0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability4, self:GetPlayerOwnerID()) + return + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_koakuma_thtd_ai() + local ability = self:FindAbilityByName("thtd_koakuma_01") + + if self:IsReadyToCastAbility(ability) then + local unit = THTDSystem:FindRadiusOneUnit(self, 800) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_yuuka_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_yuuka_01") + local ability4 = self:FindAbilityByName("thtd_yuuka_04") + + if self:IsReadyToCastAbility(ability1) and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), 800) > 0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability1, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability4) then + local point,count = THTDSystem:FindRadiusOnePointPerfectLineAOE(self, ability4:GetCastRange() - 600, 300, 1000, false) + if point~=nil and count >= 5 then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability4, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false and self:IsChanneling() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_yukari_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_yukari_01") + local ability2 = self:FindAbilityByName("thtd_yukari_02") + local ability4 = self:FindAbilityByName("thtd_yukari_04") + + if self.thtd_yukari_01_hidden_table == nil then + self.thtd_yukari_01_hidden_table = {} + end + + if self:IsReadyToCastAbility(ability4) and (#THTD_FindUnitsInner(self)>=5 or THTDSystem:FindRadiousMostDangerousUnit(self,400)~=nil) then + THTD_SetSpellLock(self, ability4:GetAbilityName(), ability4:GetSpecialValueFor("max_count") * ability4:GetSpecialValueFor("stun_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability4, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability1) and #self.thtd_yukari_01_hidden_table < self:GetAbilityValue("thtd_yukari_01", "max_count") then + local unit = THTDSystem:FindRadiousMostDangerousUnit(self, ability1:GetCastRange()-200, + function(targetUnit) return (targetUnit.thtd_yukari_01_hidden_count == nil or targetUnit.thtd_yukari_01_hidden_count < self:GetAbilityValue("thtd_yukari_01", "limit_count")) and targetUnit.thtd_is_fearing ~= true end) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability1, self:GetPlayerOwnerID()) + end + end + + if self:IsReadyToCastAbility(ability2) and #self.thtd_yukari_01_hidden_table > 0 then + local point = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability2:GetCastRange(), 300) + if point == nil then + point = self:GetAbsOrigin() + ability2:GetCastRange() * GetUnitBackWardVector(self, self:GetPlayerOwnerID()) + end + local unit = self.thtd_yukari_01_hidden_table[1] + if GetDistanceBetweenTwoVec2D(unit.first_move_point, point) < 2000 then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_ran_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_ran_01") + local ability2 = self:FindAbilityByName("thtd_ran_02") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + if self:IsReadyToCastAbility(ability2) and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), range) > 0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability2, self:GetPlayerOwnerID()) + -- ability2:CastAbility() + return + end + + if self:IsReadyToCastAbility(ability1) then + local unit = THTDSystem:FindRadiusOneUnit(self,ability1:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_chen_thtd_ai() + local ability = self:FindAbilityByName("thtd_chen_01") + + if self:IsReadyToCastAbility(ability) and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), ability:GetCastRange())>0 then + if self.thtd_chen_01_last_origin ~= nil and GetDistanceBetweenTwoVec2D(self.thtd_chen_01_last_origin, self:GetAbsOrigin()) <= ability:GetCastRange() then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(self.thtd_chen_01_last_origin, ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_eirin_thtd_ai() + local ability3 = self:FindAbilityByName("thtd_eirin_03") + local ability4 = self:FindAbilityByName("thtd_eirin_04") + + if ability4:GetLevel() < 1 then + if self:IsReadyToCastAbility(ability3) then + if self.thtd_last_cast_point ~= nil then + local point = self.thtd_last_cast_point + if THTD_HasUnitsInRadius(self, point, ability3:GetSpecialValueFor("range") * 0.7) then + THTD_SetSpellLock(self, ability3:GetAbilityName(), ability3:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability3, self:GetPlayerOwnerID()) + return + end + else + local point, count = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability3:GetCastRange(), 400) + if count > 3 and point ~= nil then + THTD_SetSpellLock(self, ability3:GetAbilityName(), ability3:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability3, self:GetPlayerOwnerID()) + return + end + end + end + else + if self:IsReadyToCastAbility(ability3) and self:IsReadyToCastAbility(ability4) then + if self.thtd_last_cast_point ~= nil then + local point = self.thtd_last_cast_point + if THTD_HasUnitsInRadius(self, point, ability3:GetSpecialValueFor("range") * 0.7) then + THTD_SetSpellLock(self, ability3:GetAbilityName(), ability3:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability3, self:GetPlayerOwnerID()) + + self:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + self:CastAbilityOnPosition(point, ability4, self:GetPlayerOwnerID()) + return nil + end, + 0.15) + + return + end + else + local point, count = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability3:GetCastRange(), 400) + if count > 3 and point ~= nil then + THTD_SetSpellLock(self, ability3:GetAbilityName(), ability3:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability3, self:GetPlayerOwnerID()) + + self:SetContextThink(DoUniqueString("dota_timer"), + function() + if GameRules:IsGamePaused() then return 0.1 end + self:CastAbilityOnPosition(point, ability4, self:GetPlayerOwnerID()) + return nil + end, + 0.15) + + return + end + end + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_mokou_thtd_ai() + local ability = self:FindAbilityByName("thtd_mokou_03") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + if self:IsReadyToCastAbility(ability) and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), range) > 0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability, self:GetPlayerOwnerID()) + return + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_kaguya_thtd_ai() + local ability = self:FindAbilityByName("thtd_kaguya_01") + + if self:IsReadyToCastAbility(ability) then + local unit = THTDSystem:FindRadiusOneUnit(self, ability:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(unit:GetAbsOrigin(), ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_aya_thtd_ai() + local ability = self:FindAbilityByName("thtd_aya_02") + + if self:IsReadyToCastAbility(ability) then + local point = THTDSystem:FindRadiusOnePointPerfectLineAOE(self, 6666, 300, 1500, true) + if point~=nil then + local forward = (point - self:GetAbsOrigin()):Normalized() + local dist = GetDistanceBetweenTwoVec2D(self:GetAbsOrigin() ,point) + point = self:GetAbsOrigin() + (dist + 200) * forward + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_hatate_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_hatate_01") + local ability2 = self:FindAbilityByName("thtd_hatate_02") + + if self:IsReadyToCastAbility(ability1) then + local unit = THTDSystem:FindRadiusOneUnit(self,ability1:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(unit:GetAbsOrigin(), ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability2) and #THTD_FindUnitsInner(self) >= 10 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability2, self:GetPlayerOwnerID()) + return + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false and self:IsChanneling() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_sanae_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_sanae_01") + local ability2 = self:FindAbilityByName("thtd_sanae_02") + local ability3 = self:FindAbilityByName("thtd_sanae_03") + local ability4 = self:FindAbilityByName("thtd_sanae_04") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + -- ability1:GetCastRange() 会报错,部分技能这样使用会报错,要求传入参数,被动技能?直接脚本方式?不太确定 + + if self:IsReadyToCastAbility(ability4) and THTDSystem:FindRadiusOneUnit(self, range)~=nil and self:HasModifier("modifier_sanae_04_buff")==false then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability4, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability2) then + local point = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability2:GetCastRange(), 300) + if point~=nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability1) and THTDSystem:FindRadiusOneUnit(self, range)~=nil then + local target = THTDSystem:FindFriendlyRadiusOneUnitLast(self, 800) + if target~=nil and target:IsNull()==false and target:THTD_IsTower() and target.thtd_sanae_01_bonus~=true then + self:THTD_SetAggressiveLock() + THTD_SetSpellLock(self, ability1:GetAbilityName(), ability1:GetSpecialValueFor("duration_time")) + self:CastAbilityOnTarget(target, ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability3) then + local point, count = nil, 0 + local unit = THTDSystem:FindRadiousMostDangerousUnit(self, 400) + if unit~=nil and unit:IsNull()==false then + point = unit:GetAbsOrigin() + 250 * GetUnitBackWardVector(unit, self:GetPlayerOwnerID()) + else + point, count = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability3:GetCastRange(), 400) + if count < 5 then point=nil end + end + if point~=nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability3, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_kanako_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_kanako_01") + local ability4 = self:FindAbilityByName("thtd_kanako_04") + + if self:IsReadyToCastAbility(ability4) and THTDSystem:FindRadiusOneUnit(self,750)~=nil then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability4, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability1) then + local unit = THTDSystem:FindRadiousMostDangerousUnit(self, 600, + function(target) return math.abs(target:GetAbsOrigin().x) > math.abs(self:GetAbsOrigin().x) end) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_momiji_thtd_ai() + local ability = self:FindAbilityByName("thtd_momiji_01") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + if self:IsReadyToCastAbility(ability) and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), range)>0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability, self:GetPlayerOwnerID()) + return + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_shinki_thtd_ai() + local ability2 = self:FindAbilityByName("thtd_shinki_02") + local ability3 = self:FindAbilityByName("thtd_shinki_03") + + if self:IsReadyToCastAbility(ability3) then + local enemies = THTD_FindUnitsInRadius(self, self:GetAbsOrigin(), ability3:GetCastRange()) + if #enemies >= 3 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability3, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability2) then + local enemies = THTD_FindUnitsInRadius(self, self:GetAbsOrigin(), ability2:GetCastRange() * 0.7) + if #enemies >= 3 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_minamitsu_thtd_ai() + local ability2 = self:FindAbilityByName("thtd_minamitsu_02") + local ability3 = self:FindAbilityByName("thtd_minamitsu_03") + local ability4 = self:FindAbilityByName("thtd_minamitsu_04") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + if self:IsReadyToCastAbility(ability2) and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), range) > 0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability2, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability3) then + local unit = THTDSystem:FindRadiousMostDangerousUnit(self, ability3:GetCastRange(), + function(targetunit) return targetunit:HasModifier("modifier_minamitsu_01_slow_buff") end) + if unit ~= nil and unit:IsNull() == false then + local isValidPoint = false + local targetPoint = unit:GetAbsOrigin() + if self.water_end_point ~= nil then + if self.thtd_minamitsu_01_first == true then + if math.abs(targetPoint.x) > math.abs(self.water_end_point.x) + 800 then + isValidPoint = true + end + else + if math.abs(targetPoint.y) > math.abs(self.water_end_point.y) + 800 then + isValidPoint = true + end + end + end + if isValidPoint then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(targetPoint, ability3, self:GetPlayerOwnerID()) + return + end + end + end + + if self:IsReadyToCastAbility(ability4) then + local unit = THTDSystem:FindRadiousMostDangerousUnit(self, range, + function(targetunit) return targetunit:HasModifier("modifier_minamitsu_01_slow_buff") end) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability4, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_nue_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_nue_01") + local ability2 = self:FindAbilityByName("thtd_nue_02") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + if self:IsReadyToCastAbility(ability1) and ability2:IsInAbilityPhase() == false then + if ability2:GetLevel()>0 then range = ability2:GetCastRange() end + if THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), range)>0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability2) and ability2:IsInAbilityPhase() == false then + local unit = THTDSystem:FindRadiusWeakOneUnit(self, ability2:GetCastRange()) + if unit~=nil and unit:IsNull()==false and unit:IsAlive() then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(unit:GetAbsOrigin(), ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false and ability2:IsInAbilityPhase() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_toramaru_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_toramaru_01") + local ability2 = self:FindAbilityByName("thtd_toramaru_02") + local ability3 = self:FindAbilityByName("thtd_toramaru_03") + local ability4 = self:FindAbilityByName("thtd_toramaru_04") + + if self:IsReadyToCastAbility(ability1) then + local unit = THTDSystem:FindRadiusOneUnit(self, ability1:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability4) and THTD_HasUnitsInRadius(self, self:GetAbsOrigin(), ability4:GetCastRange()) then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability4, self:GetPlayerOwnerID()) + return + end + + if SpawnSystem.CurWave > 70 then + if self:IsReadyToCastAbility(ability2) and self:GetGold() >= 500 then + local unit = THTDSystem:FindRadiousMostDangerousUnit(self, ability2:GetCastRange()) + if unit ~= nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit,ability2,self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability3) and self:GetGold() >= 5000 and #THTD_EntitiesRectInner[self:GetPlayerOwnerID()] >= 3 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability3, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_suwako_thtd_ai() + local ability = self:FindAbilityByName("thtd_suwako_03") + local ability4 = self:FindAbilityByName("thtd_suwako_04") + + if self:IsReadyToCastAbility(ability) then + local unit = THTDSystem:FindRadiusOneUnit(self, 500) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + THTD_SetSpellLock(self, ability:GetAbilityName(), 1.0) + self:CastAbilityNoTarget(ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability4) then + if THTDSystem:FindRadiusOneUnit(self, self:Script_GetAttackRange()) ~= nil then + local target = THTDSystem:FindFriendlyRadiusOneUnitLast(self,ability4:GetCastRange()) + if target~=nil and target:IsNull()==false and target:THTD_IsTower() and target:HasModifier("modifier_suwako_04_buff") == false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(target,ability4,self:GetPlayerOwnerID()) + return + end + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_soga_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_soga_01") + local ability2 = self:FindAbilityByName("thtd_soga_02") + local ability3 = self:FindAbilityByName("thtd_soga_03") + + if self:IsReadyToCastAbility(ability1) then + local unit1 = THTDSystem:FindRadiousMostDangerousUnit(self, ability1:GetCastRange()) + if unit1~=nil and unit1:IsNull()==false then + THTD_SetSpellLock(self, "thtd_soga_01", ability1:GetSpecialValueFor("stun_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(unit1:GetAbsOrigin(),ability1,self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability2) then + local point2 = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability2:GetCastRange(), 300) + if point2~=nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point2,ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability3) then + local point3, count3 = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability3:GetCastRange(), 500) + if point3~=nil and count3>4 then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point3,ability3,self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_futo_thtd_ai() + local ability = self:FindAbilityByName("thtd_futo_03") + + if self:IsReadyToCastAbility(ability) then + local point, count = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability:GetCastRange(), 1000) + if point~=nil and count>5 then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_miko_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_miko_01") + local ability4 = self:FindAbilityByName("thtd_miko_04") + if self.thtd_miko_04_cast == nil then self.thtd_miko_04_cast = true end + + if self.thtd_miko_04_cast == true and self:IsReadyToCastAbility(ability4) and ability4:IsInAbilityPhase() == false and #THTD_FindUnitsInner(self) >= 5 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability4, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability1) and ability1:IsInAbilityPhase() == false and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), 1000)>0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability1, self:GetPlayerOwnerID()) + return + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false and ability1:IsInAbilityPhase() == false and ability4:IsInAbilityPhase() == false and self:IsChanneling() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_yoshika_thtd_ai() + local ability = self:FindAbilityByName("thtd_yoshika_02") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + local target = self:GetAttackTarget() + if target==nil or target:IsNull() or target:HasModifier("modifier_yoshika_01_slow") then + target = THTDSystem:FindRadiusOneUnitHasNoModifier(self, range, "modifier_yoshika_01_slow") + if target~=nil and target:IsNull()==false then + THTDSystem:ChangeAttackTarget(self,target) + end + end + + if self:IsReadyToCastAbility(ability) and #THTD_FindUnitsInner(self)>0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability, self:GetPlayerOwnerID()) + return + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_seiga_thtd_ai() + local ability2 = self:FindAbilityByName("thtd_seiga_02") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + if self:IsReadyToCastAbility(ability2) and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), range)>0 then + local target = THTDSystem:FindFriendlyRadiusOneUnitLast(self,ability2:GetCastRange()) + if target~=nil and target:IsNull()==false and target:THTD_IsTower() then + if target:GetUnitName() ~= "komachi" or target:HasModifier("modifier_komachi_04") == false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(target,ability2,self:GetPlayerOwnerID()) + return + end + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_keine_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_keine_01") + local ability2 = self:FindAbilityByName("thtd_keine_02") + local ability3 = self:FindAbilityByName("thtd_keine_03") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + local target = self:GetAttackTarget() + if target==nil or target:IsNull() or target:HasModifier("thtd_keine_03_debuff") then + target = THTDSystem:FindRadiousMostDangerousUnit(self, range, + function (targetunit) return targetunit:HasModifier("thtd_keine_03_debuff")==false end) + if target~=nil and target:IsNull()==false then + THTDSystem:ChangeAttackTarget(self, target) + end + end + + if self:IsReadyToCastAbility(ability1) and self.thtd_keine_change~=2 and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), range)>0 then + local target1 = THTDSystem:FindFriendlyRadiusOneUnitLast(self,ability1:GetCastRange()) + if target1 ~= nil and target1:IsNull() == false and target1:THTD_IsTower() and target1:HasModifier("modifier_keine_01_buff") == false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(target1,ability1,self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability3) and self.thtd_keine_change==1 then + local point3 = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability3:GetCastRange(), 1000) + if point3~=nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point3, ability3, self:GetPlayerOwnerID()) + return + end + end + + if self.thtd_keine_02_cast == nil then self.thtd_keine_02_cast = true end + if self.thtd_keine_02_cast == true and self:IsReadyToCastAbility(ability2) then + local unit = THTDSystem:FindRadiusOneUnit(self, range) + if (self.thtd_keine_change == 1 and ability1:GetCooldownTimeRemaining() > 5 and unit ~= nil) or + (self.thtd_keine_change == 2 and (ability1:IsCooldownReady() or unit == nil) ) + then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_medicine_thtd_ai() + local ability2 = self:FindAbilityByName("thtd_medicine_02") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + local target = self:GetAttackTarget() + if target==nil or target:IsNull() or target:HasModifier("modifier_medicine_01_slow") then + target = THTDSystem:FindRadiousMostDangerousUnit(self, range, + function (targetunit) return targetunit:HasModifier("modifier_medicine_01_slow")==false end) + if target~=nil and target:IsNull()==false then + THTDSystem:ChangeAttackTarget(self, target) + end + end + + if self:IsReadyToCastAbility(ability2) and THTD_HasUnitsInRadius(self, self:GetAbsOrigin(), ability2:GetCastRange()) then + local point = nil + local unit = THTDSystem:FindRadiousMostDangerousUnit(self, 400, + function(targetunit) return targetunit.thtd_is_fearing~=true end) + if unit~=nil and unit:IsNull()==false then + point = unit:GetAbsOrigin() + 350*GetUnitBackWardVector(unit,self:GetPlayerOwnerID()) + else + point = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability2:GetCastRange(), 400) + end + if point~=nil then + if self.thtd_last_cast_point ~= nil then + point = self.thtd_last_cast_point + end + THTD_SetSpellLock(self, ability2:GetAbilityName(), ability2:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_luna_thtd_ai() + local ability2 = self:FindAbilityByName("thtd_luna_02") + + if self:IsReadyToCastAbility(ability2) and self:HasModifier("modifier_luna_02_buff") == false then + local point,count = THTDSystem:FindRadiusOnePointPerfectLineAOE(self, ability2:GetCastRange(), 200, 1000, false) + if point~=nil and ((SpawnSystem.IsUnLimited == false and count >= 3) or (SpawnSystem.IsUnLimited and count >= 7)) then + THTD_SetSpellLock(self, ability2:GetAbilityName(), 1.0) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_sunny_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_sunny_01") + local ability2 = self:FindAbilityByName("thtd_sunny_02") + + if self:IsReadyToCastAbility(ability2) and THTD_HasUnitsInRadius(self, self:GetAbsOrigin(), ability2:GetCastRange()) then + local point = nil + if self.thtd_last_cast_point ~= nil then + point = self.thtd_last_cast_point + else + point = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability2:GetCastRange(), 300) + end + if point~=nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability1) then + local unit = THTDSystem:FindRadiusOneUnit(self, ability1:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_star_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_star_01") + local ability2 = self:FindAbilityByName("thtd_star_02") + + if self:IsReadyToCastAbility(ability1) then + local unit = THTDSystem:FindRadiusOneUnit(self, ability1:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(unit:GetAbsOrigin(), ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability2) then + local unit = THTDSystem:FindRadiusOneUnit(self, ability2:GetCastRange()) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(unit:GetAbsOrigin(), ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_suika_thtd_ai() + local ability3 = self:FindAbilityByName("thtd_suika_03") + local ability4 = self:FindAbilityByName("thtd_suika_04") + local unit = THTDSystem:FindRadiusOneUnit(self,800) + + if self:IsReadyToCastAbility(ability3) then + local unit = THTDSystem:FindRadiusOneUnit(self, 800) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability3, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability4) then + local unit = THTDSystem:FindRadiusOneUnit(self, 800) + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability4, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_yuugi_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_yuugi_01") + local ability3 = self:FindAbilityByName("thtd_yuugi_03") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + local target = self:GetAttackTarget() + if target == nil or target:IsNull() == true then + target = THTDSystem:FindRadiousMostDangerousUnit(self, range) + if target~=nil and target:IsNull()==false then + THTDSystem:ChangeAttackTarget(self, target) + end + end + + if self:IsReadyToCastAbility(ability1) and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), range)>0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability1, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability3) then + local point, count = nil, 0 + local unit = THTDSystem:FindRadiousMostDangerousUnit(self, 400) + if unit~=nil and unit:IsNull()==false then + point = unit:GetAbsOrigin() + 450 * GetUnitBackWardVector(unit, self:GetPlayerOwnerID()) + else + point, count = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability3:GetCastRange(), 500) + if count < 7 then point=nil end + end + if point~=nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability3, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_junko_thtd_ai() + local ability2 = self:FindAbilityByName("thtd_junko_02") + local ability3 = self:FindAbilityByName("thtd_junko_03") + local ability4 = self:FindAbilityByName("thtd_junko_04") + + if THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), 1000) >= 2 then + if self:IsReadyToCastAbility(ability3) and ability3:GetAutoCastState() then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability3, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability2) then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability4) then + local point,count = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability4:GetCastRange(), 500) + if point~=nil and count>=3 then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability4, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_mugiyousei_thtd_ai() + local target = self:GetAttackTarget() + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + local min_thtd_poison_buff = 0 + if target~=nil then + min_thtd_poison_buff = target:GetPoisonCount() + end + local unit = target + + local enemies = THTD_FindUnitsInRadius(self, self:GetAbsOrigin(), range) + if #enemies > 0 then + for k,v in pairs(enemies) do + if v~=nil and v:IsNull()==false and v:GetPoisonCount() < min_thtd_poison_buff then + unit = v + min_thtd_poison_buff = v:GetPoisonCount() + end + end + end + + if unit~=nil and unit:IsNull()==false and unit~=target then + THTDSystem:ChangeAttackTarget(self, unit) + elseif self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_rumia_thtd_ai() + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 1000 end + + if self.thtd_is_ex == true then + local target = self:GetAttackTarget() + if target==nil or target:IsNull()==true or target:GetHealthPercent()<=70 then + target = THTDSystem:FindRadiousMostDangerousUnit(self, range, + function (targetunit) return targetunit:GetHealthPercent() > 70 end) + if target~=nil and target:IsNull()==false then + target = THTDSystem:ChangeTargetHasNoDamageLock(self, function (targetunit) return targetunit:GetHealthPercent() > 70 end) + THTDSystem:ChangeAttackTarget(self, target) + end + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_alice_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_alice_01") + local ability2 = self:FindAbilityByName("thtd_alice_02") + local ability4 = self:FindAbilityByName("thtd_alice_03") + + local enemies = THTD_FindUnitsInRadius(self, self:GetAbsOrigin(), ability4:GetCastRange()) + if self:IsReadyToCastAbility(ability4) and ability4:IsInAbilityPhase() == false and #enemies >= 5 then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(enemies[#enemies-2], ability4, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability1) and ability1:IsInAbilityPhase() == false then + local point = nil + if self.thtd_last_cast_point ~= nil then + point = self.thtd_last_cast_point + else + local enemies = THTD_FindUnitsInRadius(self, self:GetAbsOrigin(), ability1:GetCastRange()) + if #enemies > 0 then + point = enemies[1]:GetAbsOrigin() + end + end + if point ~= nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability1, self:GetPlayerOwnerID()) + end + return + end + + if self:IsReadyToCastAbility(ability2) and self.thtd_summon_unit == nil then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability2, self:GetPlayerOwnerID()) + return + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false and ability1:IsInAbilityPhase() == false and ability4:IsInAbilityPhase() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_kokoro_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_kokoro_01") + local ability2 = self:FindAbilityByName("thtd_kokoro_02") + local ability3 = self:FindAbilityByName("thtd_kokoro_03") + + if self:IsReadyToCastAbility(ability2) then + local enemies = THTD_FindUnitsInRadius(self, self:GetAbsOrigin(), ability2:GetCastRange()) + if #enemies >= 2 then + self:THTD_SetAggressiveLock() + THTD_SetSpellLock(self, ability2:GetAbilityName(), ability2:GetSpecialValueFor("stun_time")) + self:CastAbilityNoTarget(ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability3) then + local enemies = THTD_FindUnitsInRadius(self, self:GetAbsOrigin(), ability3:GetCastRange()) + if #enemies >= 1 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability3, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability1) then + local enemies = THTD_FindUnitsInRadius(self, self:GetAbsOrigin(), ability1:GetCastRange()) + if #enemies >= 2 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false and ability2:IsInAbilityPhase() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_kagerou_thtd_ai() + local ability2 = self:FindAbilityByName("thtd_kagerou_02") + local ability3 = self:FindAbilityByName("thtd_kagerou_03") + + local range = self:Script_GetAttackRange() + if range == nil then range = self:GetBaseAttackRange() end + if range == nil then range = 800 end + + if self:IsReadyToCastAbility(ability2) and self:HasModifier("modifier_kagerou_02_buff") == false and THTD_HasUnitsInRadius(self, self:GetAbsOrigin(),range) then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability2, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability3) and self:HasModifier("modifier_kagerou_03_wolf") == false and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), range) >= 3 then + self:THTD_SetAggressiveLock() + THTD_SetSpellLock(self, ability3:GetAbilityName(), 0.6) + self:CastAbilityNoTarget(ability3, self:GetPlayerOwnerID()) + return + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_wriggle_thtd_ai() + local ability1 = self:FindAbilityByName("death_prophet_exorcism") + local ability2 = self:FindAbilityByName("thtd_wriggle_02") + + local range = 900 + + if self:IsReadyToCastAbility(ability1) and THTD_HasUnitsInRadius(self, self:GetAbsOrigin(), range) then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability1, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability2) then + local point,count = THTDSystem:FindRadiusOnePointPerfectAOE(self, range, 700) + if point ~= nil and count >= 3 then + if self.thtd_last_cast_point ~= nil then + point = self.thtd_last_cast_point + end + THTD_SetSpellLock(self, ability2:GetAbilityName(), ability2:GetSpecialValueFor("max_count") * 1.5 - 0.5) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:THTD_IsAttackChangeLock() == false and (self.thtd_attatck_target==nil or self.thtd_attatck_target:IsNull() or GetDistanceBetweenTwoEntity(self, self.thtd_attatck_target) > self:Script_GetAttackRange()) then + local target = THTDSystem:FindRadiusMostHpOneUnit(self,range) + if target~=nil and target:IsNull()==false and target:IsAlive() then + self.thtd_attatck_target = target + THTDSystem:ChangeAttackTarget(self, target) + self:THTD_SetAttackChangeLock() + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_inaba_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_inaba_01") + + if self:IsAttacking() and self:IsReadyToCastAbility(ability1) then + local target = THTDSystem:FindFriendlyRadiusOneUnitLast(self,ability1:GetCastRange()) + if target~=nil then + if target:GetUnitName() ~= "komachi" or target:HasModifier("modifier_komachi_04") == false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(target,ability1,self:GetPlayerOwnerID()) + return + end + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_clownpiece_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_clownpiece_01") + local ability2 = self:FindAbilityByName("thtd_clownpiece_02") + local ability3 = self:FindAbilityByName("thtd_clownpiece_03") + + if self:IsReadyToCastAbility(ability2) then + local point,count = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability2:GetCastRange(), 400) + if point ~= nil and count >= 3 then + self:THTD_SetAggressiveLock() + local powerDuration = 0 + local pv = self:GetAbilityPowerValue(ability2:GetAbilityName()) + if pv ~= nil then + powerDuration = pv[2] + end + THTD_SetSpellLock(self, ability2:GetAbilityName(), ability2:GetSpecialValueFor("duration_time") + powerDuration) + self:CastAbilityOnPosition(point, ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability3) then + local point,count = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability3:GetCastRange(), 400) + if point ~= nil and count >= 3 then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability3, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability1) then + local point,count = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability1:GetCastRange(), 400) + if point ~= nil and count >= 2 then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_kisume_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_kisume_01") + local ability2 = self:FindAbilityByName("thtd_kisume_02") + + if self:IsReadyToCastAbility(ability2) then + local unit = THTDSystem:FindRadiusOneUnitHasNoModifier(self, ability2:GetCastRange(),"modifier_kisume_02_debuff") + if unit~=nil and unit:IsNull()==false then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability1) and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), ability1:GetCastRange()) > 0 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability1, self:GetPlayerOwnerID()) + return + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_komachi_thtd_ai() + local ability2 = self:FindAbilityByName("thtd_komachi_02") + local ability3 = self:FindAbilityByName("thtd_komachi_03") + local ability4 = self:FindAbilityByName("thtd_komachi_04") + + if not self:HasModifier("modifier_komachi_04") then + if self:IsReadyToCastAbility(ability3) then + local target = THTDSystem:FindRadiousMostDangerousUnit(self, ability3:GetCastRange(),function (targetUnit) return targetUnit:GetHealthPercent() > 1 end) + if target ~= nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(target, ability3, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability2) then + local point = nil + if self.thtd_last_cast_point ~= nil then + if THTD_HasUnitsInRadius(self, self.thtd_last_cast_point, ability2:GetSpecialValueFor("radius") * 0.7) then + point = self.thtd_last_cast_point + end + else + local point2,count = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability2:GetCastRange(), ability2:GetSpecialValueFor("radius")) + if point2 ~= nil and count >= 3 then + point = point2 + end + end + if point ~= nil then + THTD_SetSpellLock(self, ability2:GetAbilityName(), ability2:GetSpecialValueFor("duration_time") + 0.3) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability4) then + local unit = THTDSystem:FindRadiusWeakOneUnit(self, ability4:GetCastRange(), function (targetUnit) return targetUnit:HasModifier("modifier_komachi_04") == false end) + if unit~=nil and unit:IsNull()==false then + if unit:GetHealthPercent() <= ability4:GetSpecialValueFor("hp_kill") or unit:GetHealth() <= self:GetKillDamage() then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit, ability4, self:GetPlayerOwnerID()) + return + end + end + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_kyouko_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_kyouko_01") + local ability2 = self:FindAbilityByName("thtd_kyouko_02") + + if self:IsReadyToCastAbility(ability1) then + local point,count = THTDSystem:FindRadiusOnePointPerfectLineAOE(self, ability1:GetCastRange(), ability1:GetSpecialValueFor("final_aoe") * 0.8, ability1:GetSpecialValueFor("distance"), false) + if point~=nil and count>=0 then + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability1, self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability2) then + local point = nil + if self.thtd_last_cast_point ~= nil then + if THTD_HasUnitsInRadius(self, self.thtd_last_cast_point, ability2:GetSpecialValueFor("range") * 0.8) then + point = self.thtd_last_cast_point + end + else + local point2,count = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability2:GetCastRange(), ability2:GetSpecialValueFor("range")) + if point2 ~= nil and count >= 3 then + point = point2 + end + end + if point ~= nil then + if self.thtd_last_cast_point ~= nil then + THTD_SetSpellLock(self, ability2:GetAbilityName(), ability2:GetSpecialValueFor("duration_time")) + end + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability2, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_shikieiki_thtd_ai() + local ability1 = self:FindAbilityByName("thtd_shikieiki_01") + local ability2 = self:FindAbilityByName("thtd_shikieiki_02") + local ability3 = self:FindAbilityByName("thtd_shikieiki_03") + local ability4 = self:FindAbilityByName("thtd_shikieiki_04") + + if self:IsReadyToCastAbility(ability1) and THTD_HasUnitsInRadius(self, self:GetAbsOrigin(), ability1:GetCastRange()) then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability1, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability2) and THTDSystem:FindUnitCountInPoint(self, self:GetAbsOrigin(), ability2:GetCastRange()) >= 3 then + self:THTD_SetAggressiveLock() + self:CastAbilityNoTarget(ability2, self:GetPlayerOwnerID()) + return + end + + if self:IsReadyToCastAbility(ability3) then + local unit = THTDSystem:FindRadiousMostDangerousUnit(self, ability3:GetCastRange(), function(target) return target:HasModifier("modifier_thtd_shikieiki_03_debuff") == false end) + if unit ~= nil then + self:THTD_SetAggressiveLock() + self:CastAbilityOnTarget(unit,ability3,self:GetPlayerOwnerID()) + return + end + end + + if self:IsReadyToCastAbility(ability4) and ability2:IsCooldownReady() == false then + local point = nil + if self.thtd_last_cast_point ~= nil then + if THTD_HasUnitsInRadius(self, self.thtd_last_cast_point, ability4:GetSpecialValueFor("radius") * 0.75) then + point = self.thtd_last_cast_point + end + else + local point2,count = THTDSystem:FindRadiusOnePointPerfectAOE(self, ability4:GetCastRange(), ability4:GetSpecialValueFor("radius")) + if point2 ~= nil and count >= 3 then + point = point2 + end + end + if point ~= nil then + THTD_SetSpellLock(self, ability4:GetAbilityName(), ability4:GetSpecialValueFor("duration_time")) + self:THTD_SetAggressiveLock() + self:CastAbilityOnPosition(point, ability4, self:GetPlayerOwnerID()) + return + end + end + + if self:IsAttacking() == false and self:THTD_IsAggressiveLock() == false then + self:MoveToPositionAggressive(self:GetOrigin() + self:GetForwardVector() * 100) + self:THTD_SetAggressiveLock() + end +end + +function CDOTA_BaseNPC:THTD_IsAggressiveLock() + if self.thtd_spelled_time == nil then + return false + end + if self.thtd_spelled_time > GameRules:GetGameTime() then + return true + else + return false + end +end + +function CDOTA_BaseNPC:THTD_SetAggressiveLock() + self.thtd_spelled_time = GameRules:GetGameTime() + 0.9 +end + +function CDOTA_BaseNPC:THTD_IsAttackChangeLock() + if self.thtd_attack_changed_time == nil then + return false + end + if self.thtd_attack_changed_time > GameRules:GetGameTime() then + return true + else + return false + end +end + +function CDOTA_BaseNPC:THTD_SetAttackChangeLock() + self.thtd_attack_changed_time = GameRules:GetGameTime() + 2.0 +end \ No newline at end of file diff --git a/scripts/vscripts/system/combo.lua b/scripts/vscripts/system/combo.lua new file mode 100755 index 0000000..4ce0317 --- /dev/null +++ b/scripts/vscripts/system/combo.lua @@ -0,0 +1,634 @@ +local thtd_combo_table = +{ + ["cirno"] = + { + ["letty_cirno"] = + { + ["abilityName"] = "thtd_cirno_01", + } + }, + ["letty"] = + { + ["letty_cirno"] = + { + ["abilityName"] = "thtd_letty_01", + } + }, + ["lyrica"] = + { + ["lyrica_lunasa_merlin"] = + { + ["delay"] = 3, + ["duration"] = 3, + ["abilityName"] = "thtd_lyrica_01", + } + }, + ["lunasa"] = + { + ["lyrica_lunasa_merlin"] = + { + ["delay"] = 3, + ["duration"] = 3, + } + }, + ["merlin"] = + { + ["lyrica_lunasa_merlin"] = + { + ["delay"] = 3, + ["duration"] = 3, + } + }, + ["youmu"] = + { + ["yuyuko_youmu"] = + { + ["delay"] = 9, + ["duration"] = 5, + ["abilityName"] = "thtd_youmu_01", + }, + ["youmu_reisen"] = + { + ["abilityName"] = "thtd_youmu_02", + } + }, + ["yuyuko"] = + { + ["yuyuko_youmu"] = + { + ["delay"] = 13, + ["duration"] = 5, + ["abilityName"] = "thtd_yuyuko_02", + }, + ["yuyuko_yukari"] = + { + ["abilityName"] = "thtd_yuyuko_01", + } + }, + ["marisa"] = + { + ["reimu_marisa"] = + { + ["delay"] = 3, + ["duration"] = 2, + ["abilityName"] = "thtd_marisa_01", + ["abilityName2"] = "thtd_marisa_03", + }, + ["marisa_alice"] = + { + ["delay"] = 2, + ["duration"] = 3, + ["abilityName"] = "thtd_marisa_02", + } + }, + ["alice"] = + { + ["marisa_alice"] = + { + ["delay"] = 3, + ["duration"] = 3, + ["abilityName"] = "thtd_alice_03", + }, + ["reimu_alice"] = + { + ["delay"] = 3, + ["duration"] = 3, + ["abilityName"] = "thtd_alice_02", + } + }, + ["koishi"] = + { + ["koishi_satori"] = + { + ["delay"] = 5, + ["duration"] = 2, + ["abilityName"] = "thtd_koishi_01", + } + }, + ["satori"] = + { + ["koishi_satori"] = + { + ["abilityName"] = "thtd_satori_02", + } + }, + ["sakuya"] = + { + ["remilia_sakuya"] = + { + ["delay"] = 3, + ["duration"] = 3, + ["abilityName"] = "thtd_sakuya_02", + }, + ["meirin_sakuya"] = + { + ["abilityName"] = "thtd_sakuya_03", + } + }, + ["koakuma"] = + { + ["koakuma_patchouli"] = + { + ["delay"] = 7, + ["duration"] = 3, + ["abilityName"] = "thtd_koakuma_01", + } + }, + ["patchouli"] = + { + ["koakuma_patchouli"] = + { + ["delay"] = 5, + ["duration"] = 2, + ["abilityName"] = "thtd_patchouli_04", + } + }, + ["eirin"] = + { + ["eirin_kaguya"] = + { + ["delay"] = 2, + ["duration"] = 2, + ["abilityName"] = "thtd_eirin_01", + } + }, + ["kaguya"] = + { + ["eirin_kaguya"] = + { + ["delay"] = 2, + ["duration"] = 3, + ["abilityName"] = "thtd_kaguya_01", + } + }, + ["yukari"] = + { + ["reimu_yukari"] = + { + ["abilityName"] = "thtd_yukari_01", + }, + ["chen_yukari_ran"] = + { + ["abilityName"] = "thtd_yukari_04", + } + }, + ["remilia"] = + { + ["remilia_sakuya"] = + { + ["abilityName"] = "thtd_remilia_04", + }, + ["remilia_flandre"] = + { + ["abilityName"] = "thtd_remilia_02", + } + }, + ["reimu"] = + { + ["rumia_reimu"] = + { + ["abilityName"] = "thtd_reimu_01", + }, + ["reimu_marisa"] = + { + ["abilityName"] = "thtd_reimu_02", + }, + ["reimu_yukari"] = + { + ["abilityName"] = "thtd_reimu_04", + }, + }, + ["flandre"] = + { + ["remilia_flandre"] = + { + ["abilityName"] = "thtd_flandre_02", + } + }, + ["soga"] = + { + ["futo_soga"] = + { + ["abilityName"] = "thtd_soga_03", + } + }, + ["minamitsu"] = + { + ["nue_minamitsu"] = + { + ["abilityName"] = "thtd_minamitsu_02", + } + }, + ["futo"] = + { + ["futo_soga"] = + { + ["abilityName"] = "thtd_futo_02", + } + }, + ["sanae"] = + { + ["suwako_kanako_sanae"] = + { + ["abilityName"] = "thtd_sanae_04", + } + }, + ["tenshi"] = + { + ["tenshi_iku"] = + { + ["abilityName"] = "thtd_tenshi_03", + } + }, + ["mokou"] = + { + ["mokou_keine"] = + { + ["abilityName"] = "thtd_mokou_01", + } + }, + ["reisen"] = + { + ["youmu_reisen"] = + { + ["abilityName"] = "thtd_reisen_02", + } + }, + ["utsuho"] = + { + ["utsuho_rin"] = + { + ["abilityName"] = "thtd_utsuho_01", + } + }, + ["keine"] = + { + ["mokou_keine"] = + { + ["abilityName"] = "thtd_keine_03", + } + }, + ["ran"] = + { + ["chen_yukari_ran"] = + { + ["abilityName"] = "thtd_ran_03", + } + }, + ["yoshika"] = + { + ["yoshika_seiga"] = + { + ["abilityName"] = "thtd_yoshika_01", + } + }, + ["rumia"] = + { + ["rumia_reimu"] = + { + ["abilityName"] = "thtd_rumia_04", + } + }, + ["meirin"] = + { + ["meirin_sakuya"] = + { + ["abilityName"] = "thtd_meirin_02", + } + }, + ["iku"] = + { + ["tenshi_iku"] = + { + ["abilityName"] = "thtd_iku_01", + } + }, + ["junko"] = + { + ["junko_hecatia"] = + { + ["abilityName"] = "thtd_junko_01", + } + }, + ["hecatia"] = + { + ["junko_hecatia"] = + { + ["abilityName"] = "thtd_hecatia_03", + } + }, + ["daiyousei"] = + { + ["daiyousei_cirno"] = + { + ["abilityName"] = "thtd_daiyousei_03", + } + }, +} + +function HasCombo(combo,name) + for k,v in pairs(combo) do + if k == name then + return true + end + end + return false +end + +function CDOTA_BaseNPC:THTD_GetComboVoice(comboName) + local data = thtd_combo_table[self:GetUnitName()][comboName] + if data ~= nil and data["delay"] ~= nil then + data["comboName"] = comboName + else + data = nil + end + return data +end + +-- 设置组合技能的生效或关闭,返回组合语音数据组,组合影响:升级技能为2级(可设置此等级下光环开启)、增加buff、返回语音。(和或) +function CDOTA_BaseNPC:THTD_Set_Combo(combo) + local comboVoiceTable = {} + + local unitName = self:GetUnitName() + local comboList = thtd_combo_table[unitName] + if comboList == nil then + combo = {} + return comboVoiceTable + end + + for k,v in pairs(comboList) do + local isChange = false + + if v["abilityName"] ~= nil then + local ability = self:FindAbilityByName(v["abilityName"]) + if ability == nil then + print("----------- "..unitName..": combo error, combo: "..k..", ability: "..v["abilityName"]..", ability is nil") + combo = {} + return comboVoiceTable + end + + if ability:IsActivated() then + if HasCombo(combo, k) then + -- buff等级,如果为1,则仅开启buff不升级,否则升级,名称格式固定 + local buffOrLevel = ability:GetSpecialValueFor("has_combo_buff") + if buffOrLevel > 0 and self:HasModifier("modifier_"..v["abilityName"].."_combo_buff") == false then + isChange = true + ability:ApplyDataDrivenModifier(self, self, "modifier_"..v["abilityName"].."_combo_buff", nil) + end + + if ability:GetLevel() ~= 2 and buffOrLevel ~= 1 then + isChange = true + ability:SetLevel(2) + self[v["abilityName"].."bonus_level"] = nil + + -- 升级后是否存在光环技能,名称格式固定 + local auraName = "modifier_"..v["abilityName"].."_aura" + local auraLevel = ability:GetSpecialValueFor("open_aura_level") --开启等级要求 + if auraLevel == 2 and self:HasModifier(auraName) == false then + ability:ApplyDataDrivenModifier(self, self, auraName, nil) + end + end + else + -- buff等级,如果为1,则仅开启buff不升级,否则升级 + local buffOrLevel = ability:GetSpecialValueFor("has_combo_buff") + if buffOrLevel > 0 and self:HasModifier("modifier_"..v["abilityName"].."_combo_buff") then + isChange = true + self:RemoveModifierByName("modifier_"..v["abilityName"].."_combo_buff") + end + + if ability:GetLevel() > 1 and buffOrLevel ~= 1 then + isChange = true + ability:SetLevel(1) + self[v["abilityName"].."bonus_level"] = nil + local auraName = "modifier_"..v["abilityName"].."_aura" + local auraLevel = ability:GetSpecialValueFor("open_aura_level") + if auraLevel > 1 and self:HasModifier(auraName) then + self:RemoveModifierByName(auraName) + end + end + end + end + end + + if v["abilityName2"] ~= nil then + local ability = self:FindAbilityByName(v["abilityName2"]) + if ability == nil then + print("----------- "..unitName..": combo error, combo: "..k..", ability: "..v["abilityName2"]..", ability is nil") + combo = {} + return comboVoiceTable + end + + if ability:IsActivated() then + if HasCombo(combo, k) then + -- buff等级,如果为1,则仅开启buff不升级,否则升级,名称格式固定 + local buffOrLevel = ability:GetSpecialValueFor("has_combo_buff") + if buffOrLevel > 0 and self:HasModifier("modifier_"..v["abilityName2"].."_combo_buff") == false then + isChange = true + ability:ApplyDataDrivenModifier(self, self, "modifier_"..v["abilityName2"].."_combo_buff", nil) + end + + if ability:GetLevel() ~= 2 and buffOrLevel ~= 1 then + isChange = true + ability:SetLevel(2) + self[v["abilityName2"].."bonus_level"] = nil + + -- 升级后是否存在光环技能,名称格式固定 + local auraName = "modifier_"..v["abilityName2"].."_aura" + local auraLevel = ability:GetSpecialValueFor("open_aura_level") + if auraLevel == 2 and self:HasModifier(auraName) == false then + ability:ApplyDataDrivenModifier(self, self, auraName, nil) + end + end + else + -- buff等级,如果为1,则仅开启buff不升级,否则升级 + local buffOrLevel = ability:GetSpecialValueFor("has_combo_buff") + if buffOrLevel > 0 and self:HasModifier("modifier_"..v["abilityName2"].."_combo_buff") then + isChange = true + self:RemoveModifierByName("modifier_"..v["abilityName2"].."_combo_buff") + end + + if ability:GetLevel() > 1 and buffOrLevel ~= 1 then + isChange = true + ability:SetLevel(1) + self[v["abilityName2"].."bonus_level"] = nil + local auraName = "modifier_"..v["abilityName2"].."_aura" + local auraLevel = ability:GetSpecialValueFor("open_aura_level") + if auraLevel > 1 and self:HasModifier(auraName) then + self:RemoveModifierByName(auraName) + end + end + end + end + end + + if isChange then + local voiceData = self:THTD_GetComboVoice(k) + if voiceData ~= nil then + table.insert(comboVoiceTable, voiceData) + end + end + end + + combo = {} + return comboVoiceTable +end + + +function CDOTA_BaseNPC:THTD_chen_thtd_combo(combo) + local comboVoiceTable = {} + if HasCombo(combo,"chen_yukari_ran") then + if self.thtd_chen_01_distance_increase ~= 75 then + self.thtd_chen_01_distance_increase = 75 + end + else + if self.thtd_chen_01_distance_increase ~= 100 then + self.thtd_chen_01_distance_increase = 100 + end + end + combo = {} + return comboVoiceTable +end + +function CDOTA_BaseNPC:THTD_sunny_thtd_combo(combo) + local comboVoiceTable = {} + + if HasCombo(combo,"luna_star_sunny") and self.thtd_combo_fairyList == nil then + local hero = self:GetOwner() + local sunny = nil + local luna = nil + local star = nil + local sunnyList = {} + local lunaList = {} + local starList = {} + for k,v in pairs(hero.thtd_hero_tower_list) do + if v:GetUnitName() == "sunny" and v.thtd_is_in_fairy_combo~=true then + table.insert(sunnyList,v) + elseif v:GetUnitName() == "luna" and v.thtd_is_in_fairy_combo~=true then + table.insert(lunaList,v) + elseif v:GetUnitName() == "star" and v.thtd_is_in_fairy_combo~=true then + table.insert(starList,v) + end + end + if #sunnyList > 0 and #lunaList > 0 and #starList > 0 then + --最大连线距离 + local maxDistance = 2000 + for sunnyK,sunnyV in pairs(sunnyList) do + for lunaK,lunaV in pairs(lunaList) do + --计算连线距离,如果小于 + if math.floor(GetDistanceBetweenTwoVec2D(sunnyV:GetAbsOrigin(), lunaV:GetAbsOrigin()) + 0.5) <= maxDistance then + for starK,starV in pairs(starList) do + --计算连线距离,如果小于 + if math.floor(GetDistanceBetweenTwoVec2D(starV:GetAbsOrigin(), lunaV:GetAbsOrigin()) + 0.5) <= maxDistance and math.floor(GetDistanceBetweenTwoVec2D(starV:GetAbsOrigin(), sunnyV:GetAbsOrigin()) + 0.5) <= maxDistance then + sunny = sunnyV + luna = lunaV + star = starV + break + end + end + end + if sunny ~= nil then break end + end + if sunny ~= nil then break end + end + end + + if sunny~=nil and luna~=nil and star~=nil then + local sunny_effectIndex = ParticleManager:CreateParticle("particles/heroes/daiyousei/ability_daiyousei_03.vpcf", PATTACH_CUSTOMORIGIN, sunny) + ParticleManager:SetParticleControlEnt(sunny_effectIndex , 0, sunny, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(sunny_effectIndex , 1, luna, 5, "attach_hitloc", Vector(0,0,0), true) + + local luna_effectIndex = ParticleManager:CreateParticle("particles/heroes/daiyousei/ability_daiyousei_03.vpcf", PATTACH_CUSTOMORIGIN, luna) + ParticleManager:SetParticleControlEnt(luna_effectIndex , 0, luna, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(luna_effectIndex , 1, star, 5, "attach_hitloc", Vector(0,0,0), true) + + local star_effectIndex = ParticleManager:CreateParticle("particles/heroes/daiyousei/ability_daiyousei_03.vpcf", PATTACH_CUSTOMORIGIN, star) + ParticleManager:SetParticleControlEnt(star_effectIndex , 0, star, 5, "attach_hitloc", Vector(0,0,0), true) + ParticleManager:SetParticleControlEnt(star_effectIndex , 1, sunny, 5, "attach_hitloc", Vector(0,0,0), true) + + sunny.thtd_is_in_fairy_combo = true + star.thtd_is_in_fairy_combo = true + luna.thtd_is_in_fairy_combo = true + + self.thtd_combo_fairyList = + { + sunny = sunny, + star = star, + luna = luna, + } + self:SetContextThink(DoUniqueString("thtd_fairy_combo"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if THTD_IsValid(self) == false or THTD_IsValid(star) == false or THTD_IsValid(luna) == false then + ParticleManager:DestroyParticleSystem(luna_effectIndex,true) + luna.thtd_is_in_fairy_combo = nil + + ParticleManager:DestroyParticleSystem(star_effectIndex,true) + star.thtd_is_in_fairy_combo = nil + + ParticleManager:DestroyParticleSystem(sunny_effectIndex,true) + sunny.thtd_is_in_fairy_combo = nil + + sunny.thtd_combo_fairyList = nil + + self:GetOwner():THTD_HeroComboRefresh() + return nil + end + return 0.03 + end, + 0) + end + end + combo = {} + return comboVoiceTable +end + +function CDOTA_BaseNPC:THTD_wriggle_thtd_combo(combo) + local comboVoiceTable = {} + if HasCombo(combo,"wriggle_rumia") then + if self.thtd_wriggle_rumia_combo ~= true then + self.thtd_wriggle_rumia_combo = true + end + else + if self.thtd_wriggle_rumia_combo ~= false then + self.thtd_wriggle_rumia_combo = false + end + end + combo = {} + return comboVoiceTable +end + + +function UpdatePrismriverComboName(caster,target) + if target.thtd_prismriver_comboName == nil then + target.thtd_prismriver_comboName = {[1]="",[2]="",[3]=""} + end + target.thtd_prismriver_comboName[1] = target.thtd_prismriver_comboName[2] + target.thtd_prismriver_comboName[2] = target.thtd_prismriver_comboName[3] + target.thtd_prismriver_comboName[3] = caster:GetUnitName() +end + +function GetPrismriverComboName(target) + if target.thtd_prismriver_comboName == nil then + target.thtd_prismriver_comboName = {[1]="",[2]="",[3]=""} + end + return target.thtd_prismriver_comboName[1]..target.thtd_prismriver_comboName[2]..target.thtd_prismriver_comboName[3] +end + +function ResetPrismriverComboName(target) + target.thtd_prismriver_comboName = {[1]="",[2]="",[3]=""} +end + +function GetCountPrismriver(target) + if target.thtd_prismriver_comboName == nil then return 0 end + local count = 0 + if target.thtd_prismriver_comboName[1] ~= "" then + count = count + 1 + end + if target.thtd_prismriver_comboName[2] ~= "" then + count = count + 1 + end + if target.thtd_prismriver_comboName[3] ~= "" then + count = count + 1 + end + return count +end diff --git a/scripts/vscripts/system/custom_event.lua b/scripts/vscripts/system/custom_event.lua new file mode 100755 index 0000000..66695ad --- /dev/null +++ b/scripts/vscripts/system/custom_event.lua @@ -0,0 +1,626 @@ +-- 发送消息(左侧),例如 SendMsg(0, "test_tip", "总输出",90) "test_tip" "{s:player_name}上一波最终阵容{s:locstring_value}低于{d:int_value}%总血量,不计入有效波数" +-- 可用固有系统变量名称:{s:player_name} 玩家姓名(会显示玩家头像) +-- 可用变量(名称不可变):{s:locstring_value} 文本,可以是本地化字符如"#DOTA_Tooltip_Ability_item_life_rune",{d:int_value}数字,{s:ability_name}技能名称,%s1替代文本(用string_replace_token取代) +-- 可以直接发送非本地化的文字,使用上述变量 +function SendMsg(playerID, message_text, locstring_value, int_value, ability_name, string_replace) + local gameEvent = {} + gameEvent["player_id"] = playerID + gameEvent["locstring_value"] = locstring_value + gameEvent["teamnumber"] = -1 --DOTA_TEAM_GOODGUYS + gameEvent["int_value"] = int_value + gameEvent["message"] = message_text + gameEvent["string_replace_token"] = string_replace + gameEvent["ability_name"] = ability_name + FireGameEvent( "dota_combat_event_message", gameEvent ) +end + +if CustomEvent == nil then + CustomEvent = {} +end + +function CustomEvent:GetHero(data) + local player = PlayerResource:GetPlayer(data.PlayerID) + if player then + local hero = player:GetAssignedHero() + if hero then + return hero + end + end + return nil +end + +CustomEvent.on = function( event, func ) + CustomGameEventManager:RegisterListener(event, function(unused, data) func(data) end) +end + +-- 聊天栏显示消息,配合js实现变量化 +CustomEvent.on('custom_game_chat_msg', function(data) + GameRules:SendCustomMessage(data.msg, PlayerResource:GetTeam(data.PlayerID), 0) +end) + +-- 选择难度 +PlayersSelectedDifficulty = {} +CustomEvent.on('custom_game_select_difficulty', function(data) + if #PlayersSelectedDifficulty == 0 then + for i=0,PlayerResource:GetPlayerCount()-1 do + if PlayerResource:IsValidPlayer(i) then + PlayersSelectedDifficulty[i] = 0 + end + end + end + + local player = PlayerResource:GetPlayer(data.PlayerID) + if player ==nil then return end + + PlayersSelectedDifficulty[data.PlayerID] = data.level or 0 + CustomNetTables:SetTableValue("CustomGameInfo", "PlayersSelectedDifficulty", PlayersSelectedDifficulty ) +end) + +-- 完成状态 +local PlayersCompleteStatus = {} +CustomEvent.on('custom_game_complete_select_cards', function(data) + if PlayersCompleteStatus[data.PlayerID] == 1 then return end + + for k,v in pairs(data["cards"]) do + local itemTable = + { + ["itemName"] = k, + ["quality"]= towerNameList[k]["quality"], + ["count"]= v, + } + table.insert(towerPlayerList[data.PlayerID+1],itemTable) + end + + PlayersCompleteStatus[data.PlayerID] = 1 + CustomNetTables:SetTableValue("CustomGameInfo", "PlayersCompleteStatus", PlayersCompleteStatus ) + SetNetTableTowerPlayerList(data.PlayerID) +end) + +-- 投票踢人 +local playerVote = +{ + vote_time = 0, + vote_player = -1, + kicked_player = -1, + kicked_line = -1, + agree_players = {} +} + +CustomEvent.on('custom_game_kick_vote', function(data) + if SpawnSystem.CurWave > 50 + 20 then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(data.PlayerID), "display_custom_error", {msg="cannot_vote_when_over_some_waves"}) + return + end + local player = PlayerResource:GetPlayer(data.PlayerID) + if player ==nil then return end + local hero = player:GetAssignedHero() + if hero.is_game_over == true then return end + + if playerVote.kicked_player ~= - 1 and (math.floor(GameRules:GetGameTime()) - playerVote.vote_time) < 60 then + CustomGameEventManager:Send_ServerToPlayer(player, "show_message", {msg="player_in_vote", duration=10, params={count=playerVote.kicked_player+1}, color="#ff0"}) + return + end + + local kicked_player = -1 + local spawner = SpawnSystem.AttackingSpawner + if spawner == nil or #spawner == 0 then return end + for _, spawnerLine in pairs(spawner) do + if spawnerLine.index == data.line_index then + kicked_player = spawnerLine.hero.thtd_player_id + break + end + end + if kicked_player == -1 then return end + + playerVote.vote_time = math.floor(GameRules:GetGameTime()) + playerVote.vote_player = data.PlayerID + playerVote.kicked_player = kicked_player + playerVote.kicked_line = data.line_index + playerVote.agree_players = {} + CustomGameEventManager:Send_ServerToAllClients("kick_player", {vote_player=playerVote.vote_player, kicked_player=playerVote.kicked_player, kicked_line = playerVote.kicked_line}) +end) + +CustomEvent.on('custom_game_kick_accept', function(data) + local player = PlayerResource:GetPlayer(data.PlayerID) + if player ==nil then return end + local hero = player:GetAssignedHero() + if hero.is_game_over == true then return end + if playerVote.kicked_player == -1 then return end + + if data.accept == 1 then + table.insert(playerVote.agree_players, data.PlayerID) + local agrees = playerVote.agree_players + if #agrees >= (GetValidVotePlayerCount() - 1) then + KickPlayer() + end + else + playerVote.vote_time = 0 + playerVote.vote_player = -1 + playerVote.kicked_player = -1 + playerVote.kicked_line = - 1 + playerVote.agree_players = {} + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="player_vote_no_pass", duration=10, params={count=data.PlayerID+1}, color="#ff0"}) + end +end) + +function KickPlayer() + for index,hero in pairs(GameRules.HeroList) do + if hero ~= nil and hero.is_game_over ~= true and hero.thtd_player_id == playerVote.kicked_player then + SpawnSystem:GameOver(hero) + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="player_vote_pass", duration=10, params={count=playerVote.kicked_player+1}, color="#ff0"}) + break + end + end + playerVote.vote_time = 0 + playerVote.vote_player = -1 + playerVote.kicked_player = -1 + playerVote.kicked_line = - 1 + playerVote.agree_players = {} +end + +function GetValidVotePlayerCount() + local count = 0 + for index,hero in pairs(GameRules.HeroList) do + if hero~=nil and hero:IsNull()==false and hero:IsAlive() and hero.is_game_over~=true and hero.thtd_game_info["is_player_connected"] then + count = count + 1 + end + end + return count +end + + + +-- 选择初始卡 +CustomEvent.on('custom_game_select_start_card', function(data) + local player = PlayerResource:GetPlayer(data.PlayerID) + if player ==nil then return end + local hero = player:GetAssignedHero() + if hero:GetLevel() >= 6 then + CustomGameEventManager:Send_ServerToPlayer(player, "select_start_card_finish", {}) + return + end + if hero:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then + CustomGameEventManager:Send_ServerToPlayer(player, "display_custom_error", {msg="not_enough_item_slot"}) + return + end + local item = CreateItem(data.ItemName, nil, nil) + if item ~= nil then + item.owner_player_id = hero.thtd_player_id + item.is_bonus_item = true + hero:AddItem(item) + -- if data.ItemName == "item_0003" then + -- item = CreateItem("item_0088", nil, nil) + -- item.owner_player_id = hero.thtd_player_id + -- item.is_bonus_item = true + -- hero:AddItem(item) + -- end + for i=1,5 do + hero:HeroLevelUp(false) + end + -- hero:SetAbilityPoints(0) + CustomGameEventManager:Send_ServerToPlayer(player, "select_start_card_finish", {}) + end +end) + +-- 选择初始奖励卡 +CustomEvent.on('custom_game_select_bonus_card', function(data) + local player = PlayerResource:GetPlayer(data.PlayerID) + if player ==nil then return end + local hero = player:GetAssignedHero() + if hero:GetLevel() >= 9 then return end + if hero:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then + CustomGameEventManager:Send_ServerToPlayer(player, "select_bonus_card_no_finish", {}) + CustomGameEventManager:Send_ServerToPlayer(player, "display_custom_error", {msg="not_enough_item_slot"}) + return + end + local item = CreateItem(data.ItemName, nil, nil) + if item ~= nil then + item.owner_player_id = hero.thtd_player_id + item.is_bonus_item = true + hero:AddItem(item) + if data.ItemName == "item_3149" then + for i=1,3 do + local itemNew = CreateItem("item_3149", nil, nil) + if itemNew ~= nil then + itemNew.owner_player_id = playerId + itemNew:SetPurchaser(hero) + hero:AddItem(itemNew) + end + end + end + local cardName = item:THTD_GetCardName() + if item:THTD_IsCardHasVoice() == true then EmitSoundOn(THTD_GetVoiceEvent(cardName,"spawn"),hero) end + if item:THTD_IsCardHasPortrait() == true then + local portraits= item:THTD_GetPortraitPath(cardName) + local effectIndex = ParticleManager:CreateParticle(portraits, PATTACH_WORLDORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, Vector(-58,-80,0)) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(80,0,0)) + ParticleManager:DestroyParticleSystemTime(effectIndex,6.0) + effectIndex = ParticleManager:CreateParticle("particles/portraits/portraits_ssr_get_screen_effect.vpcf", PATTACH_WORLDORIGIN, nil) + ParticleManager:DestroyParticleSystemTime(effectIndex,4.0) + hero:EmitSound("Sound_THTD.thtd_draw_ssr") + end + for i=1,3 do + hero:HeroLevelUp(false) + end + end +end) + +-- 御币选择卡片 +CustomEvent.on('select_card', function(data) + local player = PlayerResource:GetPlayer(data.PlayerID) + if player==nil then return end + local caster = player:GetAssignedHero() + if caster == nil then return end + local itemName = data.itemname + if itemName ~= nil and THTD_GetItemCountByName(data.PlayerID,itemName) > 0 then + if caster.thtd_last_select_item~=nil and caster.thtd_last_select_item:IsNull()==false then + OnItemDestroyed(caster, caster.thtd_last_select_item, false) + caster:THTD_AddCardPoolItem(itemName) + end + end +end) + +-- 战利品奖励选择 +CustomEvent.on('select_battle_bonus_card', function(data) + local itemName = data.itemname + local hero = GameRules.HeroList[data.PlayerID] + + if hero.bb_buff == nil then hero.bb_buff = {} end + if #hero.bb_buff > 5 then return end + + if string.sub(itemName,1,6) == "item_3" then + if itemName == "item_3011" then + GameRules.player_bb_buff[data.PlayerID]["item_3011"] = GameRules.player_bb_buff[data.PlayerID]["item_3011"] + 30 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3011", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3012" then + GameRules.player_bb_buff[data.PlayerID]["item_3012"] = GameRules.player_bb_buff[data.PlayerID]["item_3012"] + 15 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3012", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3013" then + GameRules.player_bb_buff[data.PlayerID]["item_3013"] = GameRules.player_bb_buff[data.PlayerID]["item_3013"] * (1 - 0.5) + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3013", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3014" then + GameRules.player_bb_buff[data.PlayerID]["item_3014"] = GameRules.player_bb_buff[data.PlayerID]["item_3014"] + 1 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3014", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3015" then + GameRules.player_bb_buff[data.PlayerID]["item_3015"] = GameRules.player_bb_buff[data.PlayerID]["item_3015"] + 15 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3015", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3016" then + GameRules.player_bb_buff[data.PlayerID]["item_3016"] = GameRules.player_bb_buff[data.PlayerID]["item_3016"] + 1 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3016", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3017" then + GameRules.player_bb_buff[data.PlayerID]["item_3017"] = GameRules.player_bb_buff[data.PlayerID]["item_3017"] + 5 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3017", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3018" then + GameRules.player_bb_buff[data.PlayerID]["item_3018"] = GameRules.player_bb_buff[data.PlayerID]["item_3018"] * (1 - 0.2) + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3018", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3019" then + GameRules.player_bb_buff[data.PlayerID]["item_3019"] = GameRules.player_bb_buff[data.PlayerID]["item_3019"] + 50 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3019", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3020" then + GameRules.player_bb_buff[data.PlayerID]["item_3020"] = GameRules.player_bb_buff[data.PlayerID]["item_3020"] + 50 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3020", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3021" then + GameRules.player_bb_buff[data.PlayerID]["item_3021"] = GameRules.player_bb_buff[data.PlayerID]["item_3021"] + 75 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3021", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3022" then + local gold = 10000 + THTD_ModifyGoldEx(data.PlayerID, gold , true, DOTA_ModifyGold_Unspecified) + SendOverheadEventMessage(hero:GetPlayerOwner(), OVERHEAD_ALERT_GOLD, hero, gold, hero:GetPlayerOwner()) + hero:EmitSound("Sound_THTD.thtd_nazrin_01") + elseif itemName == "item_3023" then + GameRules.player_bb_buff[data.PlayerID]["item_3023"] = GameRules.player_bb_buff[data.PlayerID]["item_3023"] + 50 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3023", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3024" then + GameRules.player_bb_buff[data.PlayerID]["item_3024"] = GameRules.player_bb_buff[data.PlayerID]["item_3024"] + 50 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3024", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3025" then + GameRules.player_bb_buff[data.PlayerID]["item_3025"] = GameRules.player_bb_buff[data.PlayerID]["item_3025"] + 5 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3025", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3026" then + GameRules.player_bb_buff[data.PlayerID]["item_3026"] = GameRules.player_bb_buff[data.PlayerID]["item_3026"] + 30 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3026", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3027" then + GameRules.player_bb_buff[data.PlayerID]["item_3027"] = GameRules.player_bb_buff[data.PlayerID]["item_3027"] + 1 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3027", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3028" then + GameRules.player_bb_buff[data.PlayerID]["item_3028"] = GameRules.player_bb_buff[data.PlayerID]["item_3028"] + 1 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3028", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3029" then + GameRules.player_bb_buff[data.PlayerID]["item_3029"] = GameRules.player_bb_buff[data.PlayerID]["item_3029"] + 20 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3029", nil) + table.insert(hero.bb_buff, itemName) + elseif itemName == "item_3030" then + GameRules.player_bb_buff[data.PlayerID]["item_3030"] = GameRules.player_bb_buff[data.PlayerID]["item_3030"] + 50 + hero:AddNewModifier(hero, nil, "modifier_bb_buff_3030", nil) + table.insert(hero.bb_buff, itemName) + else + + end + else + local item = CreateItem(itemName, nil, nil) + if item ~= nil then + item.owner_player_id = hero.thtd_player_id + item:SetPurchaser(hero) + item:SetPurchaseTime(1.0) + + if hero:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then + CreateItemOnPositionSync(hero:GetAbsOrigin(), item) + else + hero:AddItem(item) + end + end + end +end) + +-- AI选择 +CustomEvent.on('custom_game_choose_ai', function(data) + local caster = EntIndexToHScript(data.entity) + if caster == nil then return end + if data.result == 1 or data.result == true then + caster["thtd_"..data.name.."_0"..tostring(data.skill).."_cast"] = true + else + caster["thtd_"..data.name.."_0"..tostring(data.skill).."_cast"] = false + end +end) + +CustomEvent.on('custom_game_command', function(data) + if data["cmd"] == "wave" then + SpawnSystem.ReachToWave = data["param"] + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="reach_to_wave", duration=20, params={count=data["param"]}, color="#ff0"}) + return + end + + if data["cmd"] == "add" then + PlayerResource:ModifyGold(data["PlayerID"], 95000 , true, DOTA_ModifyGold_Unspecified) + local player = PlayerResource:GetPlayer(data["PlayerID"]) + local itemName = "item_"..data["param"] + if string.len(itemName) ~= 9 then return end + local item = CreateItem(itemName, nil, nil) + if player ~= nil and item ~= nil then + local hero = player:GetAssignedHero() + if hero:GetNumItemsInInventory() < THTD_MAX_ITEM_SLOT then + item.owner_player_id = hero.thtd_player_id + hero:AddItem(item) + end + end + return + end + + if data["cmd"] == "tp" then + local pos = string.split(data["param"], ",") + if pos == nil or #pos < 2 then + local player = PlayerResource:GetPlayer(data["PlayerID"]) + local hero = player:GetAssignedHero() + local targets = THTD_FindUnitsInRadius(hero, hero:GetAbsOrigin(), 1000) + for k,v in pairs(targets) do + print("----------") + print(v.thtd_next_corner) + print(v.next_move_forward) + print(v.next_move_point) + hero:SetAbsOrigin(v.next_move_point) + break + end + return + end + local vec = Vector(tonumber(pos[1]), tonumber(pos[2]), 144) + if vec ~= nil then + local player = PlayerResource:GetPlayer(data["PlayerID"]) + local hero = player:GetAssignedHero() + hero:SetAbsOrigin(vec) + end + return + end + + if data["cmd"] == "clearrank" then + Service:ClearSameRank() + return + end + + if data["cmd"] == "lv" then + local player = PlayerResource:GetPlayer(data["PlayerID"]) + if player then + local hero = player:GetAssignedHero() + for k,v in pairs(hero.thtd_hero_tower_list) do + if v~=nil and v:IsNull()==false and v:IsAlive() and v:THTD_IsTower() then + v:THTD_SetAbilityLevelUp() + v:THTD_SetAbilityLevelUp() + v:THTD_SetAbilityLevelUp() + v:THTD_SetAbilityLevelUp() + if v:THTD_GetStar() < 5 then + v:THTD_SetStar(5) + end + if v:THTD_GetLevel() < THTD_MAX_LEVEL then + v:THTD_SetLevel(THTD_MAX_LEVEL) + end + end + end + end + return + end + + if data["cmd"] == "boss" then + SpawnSystem.AttackingSpawner[data["PlayerID"]+1].nextBossName = data["param"] + return + end +end) + +CustomEvent.on('custom_game_save_cardgroup', function(data) + Service:SaveCardGroup(data.PlayerID, data.groupkey, data.groupdata) +end) + +CustomEvent.on('custom_game_rank_detail', function(data) + local playerid = data.PlayerID + local rankdata = {} + rankdata['index'] = data.index + + local playerRankData + if data.type == 1 then + playerRankData = GameRules.players_rank_data[data.index] + else + playerRankData = GameRules.players_team_rank_data[data.index] + end + if tostring(PlayerResource:GetSteamID(playerid)) == tostring(playerRankData.steamid) then + rankdata['is_local_player'] = 1 + else + rankdata['is_local_player'] = 0 + end + rankdata['wave'] = playerRankData['wave'] + + for k,v in pairs(playerRankData) do + if string.sub(k,1,4) == "card" then + rankdata[k] = v + end + end + if data.type == 1 then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerid), "thtd_rank_detail", rankdata) + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerid), "thtd_team_rank_detail", rankdata) + end + rankdata = {} +end) + +CustomEvent.on('custom_game_rank_reset', function(data) + if tostring(PlayerResource:GetSteamID(data.PlayerID)) ~= GameRules.GameData.admin then return end + + if data.index > 0 then + if data.type == 1 then + Service:ResetRank(data.index,"S") + else + Service:ResetRank(data.index,"D") + end + else + if data.type == 1 then + local total = #GameRules.players_rank + local count = 1 + GameRules:GetGameModeEntity():SetContextThink(DoUniqueString("ResetRankAll"), + function() + Service:ResetRank(count,"S") + count = count + 1 + if count > total then + return nil + else + return 1.0 + end + end, + 0) + else + local total = #GameRules.players_team_rank + local count = 1 + GameRules:GetGameModeEntity():SetContextThink(DoUniqueString("ResetRankAll"), + function() + Service:ResetRank(count,"D") + count = count + 1 + if count > total then + return nil + else + return 1.0 + end + end, + 0) + end + end +end) + +CustomEvent.on('custom_game_train_card', function(data) + local playerid = data.PlayerID + local itemName = data.item_name + local levelUp = data.level_up + + if towerNameList[itemName] == nil then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerid), "thtd_train_card_complete", {code = 0, msg = "该卡牌还在制作中,请关注后续更新"}) + return + end + + local maxLevel = THTD_GetMaxPowerLevel(towerNameList[itemName]["cardname"]) + + if GameRules.PlayerData[playerid] == nil then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerid), "thtd_train_card_complete", {code = 0, msg = "没有用户数据"}) + elseif GameRules.PlayerData[playerid]["level_list"] == nil then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerid), "thtd_train_card_complete", {code = 0, msg = "获取已培养清单出错"}) + elseif GameRules.PlayerData[playerid]["level_list"][itemName] ~= nil and GameRules.PlayerData[playerid]["level_list"][itemName] >= maxLevel then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerid), "thtd_train_card_complete", {code = 0, msg = "已达到最大潜能"}) + else + local point = 10 + if towerNameList[itemName]["quality"] == 1 then + point = 5 + end + local addLevel = math.min(levelUp, maxLevel - (GameRules.PlayerData[playerid]["level_list"][itemName] or 0)) + point = point * addLevel + if GameRules.PlayerData[playerid]["point"] >= point then + Service:SaveCardLevel(playerid, itemName, addLevel) + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerid), "thtd_train_card_complete", {code = 0, msg = "符卡精华数量不足"}) + end + end +end) + +CustomEvent.on('custom_game_pay_select', function(data) + Service:CreateShopOrder(data.PlayerID, data.method, data.amount, data.price, data.type) +end) + +CustomEvent.on('custom_game_pay_query', function(data) + Service:PayCheck(data.PlayerID) +end) + +CustomEvent.on('custom_game_pay_auto_query', function(data) + Service:PayAutoCheck(data.PlayerID) +end) + +CustomEvent.on('custom_game_show_dps_card', function(data) + local ent = data.ent + if ent == 0 then return end + local unit = EntIndexToHScript(ent) + if not THTD_IsValid(unit) then return end + + if unit.show_pds_card ~= true then + unit.show_pds_card = true + local count = 5 + unit:SetContextThink(DoUniqueString("custom_game_show_dps_card"), + function() + count = count - 1 + if count < 0 then + unit:THTD_CreateLevelEffect() + unit.show_pds_card = nil + return nil + end + if count%2 == 0 then + unit:THTD_DestroyLevelEffect() + else + unit:THTD_CreateLevelEffect() + end + return 0.3 + end, + 0.3) + end +end) + +CustomEvent.on('custom_game_pause_game', function(data) + if GameRules:IsGamePaused() then + PauseGame(false) + else + PauseGame(true) + GameRules:SendCustomMessage("#pause_game_forever", DOTA_TEAM_GOODGUYS, 0) + end +end) + +CustomEvent.on('custom_game_update_data', function(data) + Service:GetPlayerBaseData(data.PlayerID) +end) diff --git a/scripts/vscripts/system/damage.lua b/scripts/vscripts/system/damage.lua new file mode 100755 index 0000000..f26833d --- /dev/null +++ b/scripts/vscripts/system/damage.lua @@ -0,0 +1,518 @@ +-- 生命移除伤害,只会计算少女之抵抗,参数:单位、目标、百分比值、是否按当前生命值 +function UnitDamageHpRemove(caster, target, percent, isCurrentHp) + if THTD_IsValid(caster) and THTD_IsValid(target) then + local tower = nil + if caster:THTD_IsTower() then + tower = caster + elseif THTD_IsValid(caster.thtd_spawn_unit_owner) and caster.thtd_spawn_unit_owner:THTD_IsTower() then + tower = caster.thtd_spawn_unit_owner + end + + local health = target:GetHealth() + local damage = 0 + if isCurrentHp == true then + damage = health * percent / 100 + else + damage = target:GetMaxHealth() * percent / 100 + end + + local factor = 1.0 + if target.unlimited_resist ~= nil then + factor = 1 - target.unlimited_resist/100 + end + + if damage * factor >= health then + if tower ~= nil then + tower:THTD_AddTowerDamage(health) + end + target:SetHealth(1) + local DamageTable = { + ability = nil, + victim = target, + attacker = caster, + damage = 10000, + damage_type = DAMAGE_TYPE_PURE, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + ApplyDamage(DamageTable) + else + target:SetHealth(health - damage * factor) + if tower ~= nil then + tower:THTD_AddTowerDamage(damage * factor) + end + end + end +end + +-- 强制击杀 +function CDOTA_BaseNPC:NpcKill(target) + if target == nil or target:IsNull() or target:IsAlive() == false then + return + end + local health = target:GetHealth() + target.diseble_buff = true + target:ForceKill(false) + self:THTD_AddTowerDamage(health) +end + +-- 卡牌秒杀技能,具有统一的上限 +function CDOTA_BaseNPC:AbilityKill(target, ability) + local tower + if self:THTD_IsTower() then + tower = self + elseif self.thtd_spawn_unit_owner ~= nil and self.thtd_spawn_unit_owner:THTD_IsTower() then + tower = self.thtd_spawn_unit_owner + else + print("----- error : AbilityKill is not a tower cast") + return + end + + -- if GameRules.player_bb_buff[playerid]["item_3019"] > 0 and GameRules.player_bb_buff[playerid]["item_3019_enable"] then + -- factor = 1 + GameRules.player_bb_buff[playerid]["item_3019"]/100 + -- end + + local damage = tower:GetKillDamage() + local damageType = DAMAGE_TYPE_PURE + if ability ~= nil then + damageType = ability:GetAbilityDamageType() + end + + local DamageTable = { + ability = ability, + victim = target, + attacker = tower, + damage = damage, + damage_type = damageType, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) +end + +-- 获取卡牌秒杀伤害 +function CDOTA_BaseNPC:GetKillDamage() + return self:THTD_GetStarDamage() * 100 +end + +-- 造成溢出伤害 +function THTD_OverDamage(caster, ability, damage, point, range) + if not THTD_IsValid(caster) then return end + if damage == nil or damage <= 0 then return end + + local targetRange = range or 400 + local damageType = DAMAGE_TYPE_PURE + if ability ~= nil then + damageType = ability:GetAbilityDamageType() + end + + caster:SetContextThink(DoUniqueString("thtd_over_damage"), + function() + if GameRules:IsGamePaused() then return 0.03 end + local targets = THTD_FindUnitsInRadius(caster,point,range) + for k,v in pairs(targets) do + local DamageTable = { + ability = ability, + victim = v, + attacker = caster, + damage = damage, + damage_type = damageType, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + UnitDamageTarget(DamageTable) + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_flandre/abiilty_flandre_02_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0 , v:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + return nil + end, + 0.1) +end + +-- 汇总式伤害结算 +function UnitDamageApply(unit) + if unit == nil or unit:IsNull() or unit:IsAlive() == false then return end + if unit.thtd_player_index == nil then return end + if unit.incoming_damage == nil or unit.incoming_damage == 0 then return end + + local DamageTable = { + ability = nil, + victim = unit, + attacker = GameRules.HeroList[unit.thtd_player_index], + damage = unit.incoming_damage, + damage_type = DAMAGE_TYPE_PURE, + damage_flags = DOTA_DAMAGE_FLAG_NONE + } + unit.incoming_damage = 0 + ApplyDamage(DamageTable) +end + +-- 汇总式伤害计算,如果isTest为true则返回生命/伤害占比,即目标当前生命值/本次伤害量的值,isAttack为普通攻击 +function UnitDamageTarget(DamageTable, isTest, isAttack) + local caster = DamageTable.attacker + local target = DamageTable.victim + -- local ability = DamageTable.ability + local damageType = DamageTable.damage_type + local damage = DamageTable.damage or 0 + local returnNull = 9999 + if damage <= 0 then return returnNull end + + if target == nil or target:IsNull() or target:IsAlive() == false then return returnNull end + if target.thtd_damage_lock == true then return returnNull end + + -- 召唤物继承主人的装备和buff效果 + local tower + if caster:THTD_IsTower() then + tower = caster + elseif caster.thtd_spawn_unit_owner ~= nil and caster.thtd_spawn_unit_owner:THTD_IsTower() then + tower = caster.thtd_spawn_unit_owner + else + return returnNull + end + + -- 伤害类型转换 + if tower:HasModifier("modifier_junko_01") then + damageType = DAMAGE_TYPE_PURE + elseif tower:HasModifier("modifier_daiyousei_03") then + damageType = DAMAGE_TYPE_MAGICAL + elseif tower:HasModifier("modifier_momiji_02") then + damageType = DAMAGE_TYPE_PHYSICAL + elseif target:HasModifier("modifier_sunny_02_debuff") then + damageType = DAMAGE_TYPE_PURE + end + + -- 附加星能伤害(如相机、BOSS键山雏) + local extra = tower:GetExtraStarDamagePercentage() + if extra >= 1000000 then + local down = math.floor(extra/10000) + local up = extra - down * 10000 - 5000 + if up ~= 0 then + damage = damage + tower:THTD_GetStarDamage() * up/100 + end + if damage > tower:THTD_GetStarDamage() * math.floor(down/100) then + damage = damage * (down - math.floor(down/100) * 100)/100 + end + elseif extra ~= 0 then + damage = damage + tower:THTD_GetStarDamage() * extra/100 + end + + -- 计算双抗伤害 + if isAttack == true then --普通攻击已经是税后伤害 + if damageType ~= DAMAGE_TYPE_PHYSICAL then + damage = damage / target:GetPhysicalFactor() + if damageType == DAMAGE_TYPE_MAGICAL then + damage = damage * target:GetMagicalFactor() + end + end + else + if damageType == DAMAGE_TYPE_MAGICAL then + damage = damage * target:GetMagicalFactor() + elseif damageType == DAMAGE_TYPE_PHYSICAL then + damage = damage * target:GetPhysicalFactor() + end + end + + -- 装备4件套 + if target:GetHealthPercent() > 70 and tower:HasModifier("modifier_item_2009_damage") then + damage = damage * 2 + end + if target:GetHealthPercent() < 30 and tower:HasModifier("modifier_item_2010_damage") then + damage = damage * 2 + end + + -- 爆击伤害 + if RollPercentage(tower:THTD_GetCritChance()) then + damage = damage * (1 + tower:THTD_GetCritDamage()/100) + end + + -- 增伤效果 + if damageType == DAMAGE_TYPE_PHYSICAL then + -- 攻击者物理增伤 + damage = damage * (1 + tower:GetDamageOutgoingPhysical()/100) + -- 被攻击者物理伤害加深 + damage = damage * (1 + target:GetDamageIncomingPhysical()/100) + -- 被攻击者物理伤害抵挡或附加 + -- print("---- damage : ", damage) + damage = damage - target:GetDamageBlockPhysical() + -- print("damage block: ", damage) + elseif damageType == DAMAGE_TYPE_MAGICAL then + -- 攻击者魔法增伤 + damage = damage * (1 + tower:GetDamageOutgoingMagical()/100) + -- 被攻击者魔法伤害加深 + damage = damage * (1 + target:GetDamageIncomingMagical()/100) + -- 被攻击者魔法伤害抵挡或附加 + damage = damage - target:GetDamageBlockMagical() + elseif damageType == DAMAGE_TYPE_PURE then + -- 攻击者纯粹增伤 + damage = damage * (1 + tower:GetDamageOutgoingPure()/100) + -- 被攻击者纯粹伤害加深 + damage = damage * (1 + target:GetDamageIncomingPure()/100) + -- 被攻击者纯粹伤害抵挡或附加 + damage = damage - target:GetDamageBlockPure() + end + + if damage <= 0 then return returnNull end + + -- 少女之抵抗 + if target.unlimited_resist ~= nil then + damage = damage * (1 - target.unlimited_resist/100) + end + + damage = math.floor(damage) + + -- 伤害统计 + if target.incoming_damage == nil then + target.incoming_damage = 0 + end + local health = math.max(0, target:GetHealth() - target.incoming_damage) + if isTest ~= true then + local towerName = tower:GetUnitName() + tower:THTD_AddTowerDamage(math.min(damage, health)) + -- 击杀则立即结算 + if damage >= health then + local isDamageLock = false + + if target.komachi_04_damage_lock == true then + isDamageLock = true + elseif target.flandre_damage_lock == true then + isDamageLock = true + if towerName == "flandre" then + if target.flandre_04_lock == true then + if DamageTable.ability ~= nil and DamageTable.ability:GetAbilityName() == "thtd_flandre_04" then + isDamageLock = false + end + else + isDamageLock = false + end + end + end + + if isDamageLock == true then + target.incoming_damage = target.incoming_damage + math.max(0, health - 100) + UnitDamageApply(target) + else + target.incoming_damage = target.incoming_damage + damage + UnitDamageOnKill(tower, target) + UnitDamageApply(target) + if towerName == "flandre" and damage - health > 100 then + THTD_OverDamage(tower, tower:FindAbilityByName("thtd_flandre_02"), damage - health, target:GetOrigin(), 400) + end + end + else + target.incoming_damage = target.incoming_damage + damage + end + return returnNull + else + return health/damage + end +end + +-- 技能的OnKill事件 +function UnitDamageOnKill(caster, target) + local unitName = caster:GetUnitName() + if unitName == "nue" then + if caster:FindAbilityByName("thtd_nue_03"):GetLevel() >= 1 then + caster:FindAbilityByName("thtd_nue_01"):EndCooldown() + caster:FindAbilityByName("thtd_nue_02"):EndCooldown() + end + elseif unitName == "rumia" then + if caster.rumia_01_bonus == nil then + caster.rumia_01_bonus = 0 + end + local max_count = caster:GetAbilityValue("thtd_rumia_01", "max_bonus") + if caster:IsPower999() then + if caster.rumia_01_bonus < max_count * 10 then + caster.rumia_01_bonus = caster.rumia_01_bonus + 1 + caster:THTD_AddBasePower(1) + end + else + if caster.rumia_01_bonus < max_count then + caster.rumia_01_bonus = caster.rumia_01_bonus + 1 + caster:THTD_AddBasePower(1) + elseif caster.rumia_01_bonus > max_count then + caster:THTD_AddBasePower(-(caster.rumia_01_bonus - max_count)) + caster.rumia_01_bonus = max_count + end + end + elseif unitName == "yuyuko" then + if caster:HasModifier("modifier_yuyuko_03_think") then + if caster.yuyuko_kill_bonus_count == nil then + caster.yuyuko_kill_bonus_count = 0 + end + + local max_count = caster:GetAbilityValue("thtd_yuyuko_03", "max_count") + local power_bonus = caster:GetAbilityValue("thtd_yuyuko_03", "power_bonus") + + if caster:IsPower999() then + if caster.yuyuko_kill_bonus_count < max_count * 3 then + caster.yuyuko_kill_bonus_count = caster.yuyuko_kill_bonus_count + 1 + caster:THTD_AddBasePower(power_bonus) + end + else + if caster.yuyuko_kill_bonus_count < max_count then + caster.yuyuko_kill_bonus_count = caster.yuyuko_kill_bonus_count + 1 + caster:THTD_AddBasePower(power_bonus) + elseif caster.yuyuko_kill_bonus_count > max_count then + caster:THTD_AddBasePower(-(caster.yuyuko_kill_bonus_count - max_count) * power_bonus) + caster.yuyuko_kill_bonus_count = max_count + end + end + end + elseif unitName == "koishi" then + if caster:HasModifier("passive_koishi_04_attack") then + local effectIndex = ParticleManager:CreateParticle("particles/heroes/moluo/ability_moluo03_explosion.vpcf", PATTACH_CUSTOMORIGIN, caster) + ParticleManager:SetParticleControl(effectIndex , 0, target:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex , 3, target:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + end + elseif unitName == "sanae" or unitName == "kanako" or unitName == "suwako" then + caster:THTD_AddFaith() + elseif unitName == "futo" then + local modifier = caster:FindModifierByName("modifier_futo_02_buff") + if modifier == nil then + local ability = caster:FindAbilityByName("thtd_futo_02") + if ability:IsActivated() then + modifier = ability:ApplyDataDrivenModifier(caster, caster, "modifier_futo_02_buff", {Duration = caster:GetAbilityValue("thtd_futo_02", "duration_time")}) + modifier:SetStackCount(1) + end + else + if modifier:GetStackCount() < caster:GetAbilityValue("thtd_futo_02", "max_count") then + modifier:IncrementStackCount() + end + modifier:SetDuration(caster:GetAbilityValue("thtd_futo_02", "duration_time"),false) + end + end + + if caster:HasModifier("modifier_shinki_01_buff_kill") and caster.thtd_shinki_01_kill_count < 100 then + caster.thtd_shinki_01_kill_count = caster.thtd_shinki_01_kill_count + 1 + caster:THTD_AddBasePower(1 * caster.thtd_shinki_01_kill_count, "thtd_shinki_01_kill") + caster:FindModifierByName("modifier_shinki_01_buff_kill"):SetStackCount(caster.thtd_shinki_01_kill_count) + end + + if target:HasModifier("modifier_thtd_yuuka_03_death") then + local modifier = target:FindModifierByName("modifier_thtd_yuuka_03_death") + local yuuka = modifier:GetCaster() + local max_count = yuuka:GetAbilityValue("thtd_yuuka_03", "max_count") + local damage_up = yuuka:GetAbilityValue("thtd_yuuka_03", "damage_up") + if yuuka.thtd_yuuka_03_kill_count == nil then + yuuka.thtd_yuuka_03_kill_count = 0 + end + if yuuka.thtd_yuuka_03_kill_count < max_count then + yuuka.thtd_yuuka_03_kill_count = yuuka.thtd_yuuka_03_kill_count + 1 + local bonus = yuuka.thtd_yuuka_03_kill_count * damage_up + yuuka:AddDamageOutgoingAll(bonus, "thtd_yuuka_03_kill_bonus") + yuuka:THTD_AddBaseAttack(bonus, "thtd_yuuka_03_kill_bonus") + yuuka:THTD_AddBasePower(bonus, "thtd_yuuka_03_kill_bonus") + elseif yuuka.thtd_yuuka_03_kill_count > max_count then + yuuka.thtd_yuuka_03_kill_count = max_count + yuuka:AddDamageOutgoingAll(max_count * damage_up, "thtd_yuuka_03_kill_bonus") + yuuka:THTD_AddBaseAttack(max_count * damage_up, "thtd_yuuka_03_kill_bonus") + yuuka:THTD_AddBasePower(max_count * damage_up, "thtd_yuuka_03_kill_bonus") + end + end +end + + +-- 魔法抗性百分比更新,正增负减,如果小于0则设置为0 +function CDOTA_BaseNPC:AddMagicalResist(addCount) + if addCount == nil or addCount == 0 then return end + addCount = math.floor(addCount) + + if self.base_magical_resistance == nil then + self.base_magical_resistance = self:GetBaseMagicalResistanceValue() + end + + if self.magical_resistance_to_zero == true then + self:SetBaseMagicalResistanceValue(0) + else + local magical_resistance = self.base_magical_resistance + addCount + self.base_magical_resistance = magical_resistance + if magical_resistance > 0 then + self:SetBaseMagicalResistanceValue(magical_resistance) + else + self:SetBaseMagicalResistanceValue(0) + end + end +end + +-- 移除魔法抗性,即一直设置为0 +function CDOTA_BaseNPC:RemoveMagicalResist() + self.magical_resistance_to_zero = true + self:SetBaseMagicalResistanceValue(0) +end + +-- 物理护甲更新,正增负减,如果小于0则设置为0,注意只用基础护甲,Dota2自带减甲类modifier不可使用 +function CDOTA_BaseNPC:AddPhysicalArmor(addCount) + if addCount == nil or addCount == 0 then return end + addCount = math.floor(addCount*100)/100 + + if self.base_armor == nil then + self.base_armor = self:GetPhysicalArmorBaseValue() + end + + if self.physical_armor_to_zero == true then + self:SetPhysicalArmorBaseValue(0) + else + local armor = self.base_armor + addCount + self.base_armor = armor + if armor > 0 then + self:SetPhysicalArmorBaseValue(armor) + else + self:SetPhysicalArmorBaseValue(0) + end + end +end + +-- 移除物理护甲,即强制一直设置为0 +function CDOTA_BaseNPC:RemovePhysicalArmor() + self.physical_armor_to_zero = true + self:SetPhysicalArmorBaseValue(0) +end + +-- 获取物理护甲后的伤害系数 +function CDOTA_BaseNPC:GetPhysicalFactor() + local armor = self:GetPhysicalArmorValue(false) + if armor > 0 then + return 1 - (0.06 * armor /(1 + 0.06 * armor)) -- 7.27版本护甲计算 + else + return 1 - (0.06 * armor /(1 - 0.06 * armor)) -- 7.27版本负护甲计算,负甲增伤 + end +end + +-- 获取魔法抗性后的伤害系数 +function CDOTA_BaseNPC:GetMagicalFactor() + return 1 - self:GetBaseMagicalResistanceValue()/100 +end + + +--增加毒的层数,创建或更新对应buff +function CDOTA_BaseNPC:AddPoison(stackCount, caster) + local modifierName = "modifier_touhoutd_poison" + local modifier = self:FindModifierByName(modifierName) + if stackCount == nil then stackCount = 1 end + if modifier == nil then + if stackCount > 0 then + if caster == nil then caster = self end + modifier = self:AddNewModifier(caster, nil, modifierName, nil) + if modifier == nil then return end + modifier:SetStackCount(stackCount) + end + else + local count = modifier:GetStackCount() + stackCount + if count > 0 then + modifier:SetStackCount(count) + else + self:RemoveModifierByName(modifierName) + end + end +end + +--获取毒的层数,没有则返回0 +function CDOTA_BaseNPC:GetPoisonCount() + local modifierName = "modifier_touhoutd_poison" + local modifier = self:FindModifierByName(modifierName) + if modifier == nil then + return 0 + else + return modifier:GetStackCount() + end +end \ No newline at end of file diff --git a/scripts/vscripts/system/items.lua b/scripts/vscripts/system/items.lua new file mode 100755 index 0000000..651e4fb --- /dev/null +++ b/scripts/vscripts/system/items.lua @@ -0,0 +1,164 @@ +function CDOTABaseAbility:THTD_UpdateItemStarLevel() + local tower = self:THTD_GetTower() + if tower == nil then + return + end + + local star = tower:THTD_GetStar() + local level = tower:THTD_GetLevel() + local item_level = (star-1) * 10 + level + self:SetLevel(item_level) -- 也可以用 self:GetSecondaryCharges() + -- star = math.floor((item_level-1)/10) + 1 + -- level = item_level - (star-1) * 10 +end + +function CDOTABaseAbility:THTD_GetTower() + return self.tower or nil +end + +function CDOTABaseAbility:THTD_RemoveItemInList(PlayerID) + local list_num = PlayerID+1 + local itemName = self:GetAbilityName() + + if itemName~=nil then + for k,v in pairs(towerPlayerList[list_num]) do + if v["itemName"] == itemName then + v["count"] = v["count"] - 1 + if v["count"] <= 0 then + table.remove(towerPlayerList[list_num],k) + end + SetNetTableTowerPlayerList(PlayerID) + return + end + end + end +end + +function THTD_AddItemToListByName(PlayerID,itemNameRelease) + local list_num = PlayerID+1 + local itemName = itemNameRelease + + if itemName~=nil then + for k,v in pairs(towerPlayerList[list_num]) do + if v["itemName"] == itemName then + v["count"] = v["count"] + 1 + SetNetTableTowerPlayerList(PlayerID) + return + end + end + local itemTable = + { + ["itemName"] = itemName, + ["quality"]= towerNameList[itemName]["quality"], + ["count"]= 1, + } + table.insert(towerPlayerList[PlayerID+1],itemTable) + SetNetTableTowerPlayerList(PlayerID) + end +end + +function CDOTABaseAbility:THTD_GetCardName() + if towerNameList[self:GetAbilityName()] ~= nil then + return towerNameList[self:GetAbilityName()]["cardname"] + else + return nil + end +end + +function CDOTABaseAbility:THTD_GetCardQuality() + local unitName = self:GetAbilityName() + if towerNameList[unitName] ~= nil then + return towerNameList[unitName]["quality"] + elseif unitName == "item_3150" or unitName == "item_3151" or unitName == "item_3152" then + return 5 + else + return nil + end +end + +function CDOTABaseAbility:THTD_IsCardHasPortrait() + if towerNameList[self:GetAbilityName()] ~= nil then + return towerNameList[self:GetAbilityName()]["hasPortrait"] + else + return nil + end +end + +function CDOTABaseAbility:THTD_GetPortraitPath(unitName) + return "particles/portraits/"..unitName.."/thtd_"..unitName.."_portraits.vpcf" +end + +function CDOTABaseAbility:THTD_IsCardHasVoice() + if towerNameList[self:GetAbilityName()] ~= nil then + return towerNameList[self:GetAbilityName()]["hasVoice"] + else + return nil + end +end + +function THTD_GetVoiceEvent(cardName,key) + return "Voice_THTD."..cardName.."."..key +end + +function THTD_GetItemCountByName(playerid,itemName) + for k,v in pairs(towerPlayerList[playerid+1]) do + if v["itemName"] == itemName then + return v["count"] + end + end + return 0 +end + +function ItemSetScale(item, scale) + if item == nil then return end + local box = item:GetContainer() + if box == nil then return end + box:SetModelScale(scale) +end + +local thtd_item_scale = +{ + ["kokoro"] = 0.55, + ["yoshika"] = 0.55, + ["aya"] = 0.55, + ["cirno"] = 0.55, + ["marisa"] = 0.55, + ["reimu"] = 0.55, + ["remilia"] = 0.65, + ["flandre"] = 0.65, + ["yukari"] = 0.45, + ["satori"] = 0.55, + ["patchouli"] = 0.55, + ["sakuya"] = 0.55, + ["youmu"] = 0.55, + ["tenshi"] = 0.55, + ["yuuka"] = 0.55, + ["clownpiece"] = 0.6, + ["wriggle"] = 1.3, + ["komachi"] = 0.55, + ["shikieiki"] = 0.65, + ["inaba"] = 0.65, + ["shinki"] = 0.50, + ["koishi"] = 0.55, +} + +function THTD_ItemSetScale(item) + if item == nil then return end + local cardName = item:THTD_GetCardName() + if cardName ~= nil then + if thtd_item_scale[cardName] == nil then + -- ItemSetScale(item, 1.0) + else + ItemSetScale(item, thtd_item_scale[cardName]) + end + end +end + +function THTD_HasItemScale(item) + if item == nil then return false end + local cardName = item:THTD_GetCardName() + if cardName ~= nil and thtd_item_scale[cardName] ~= nil then + return true + end + return false +end diff --git a/scripts/vscripts/system/service.lua b/scripts/vscripts/system/service.lua new file mode 100755 index 0000000..8b82d7d --- /dev/null +++ b/scripts/vscripts/system/service.lua @@ -0,0 +1,1065 @@ +-- local JSON = require( "component/dkjson") --系统自带json +-- local sha = require("libraries/sha") + +if Service == nil then + Service = class({}) +end + + +-- 配置项 start + SERVER_KEY = GetDedicatedServerKeyV2("mydota") + + + REQUEST_TIME_OUT = 30 + + Service.Config = table.loadkv("scripts/npc/config.txt") + + -- 游戏配置项 + GameRules.GameData = { + ver = "S8", + admin = Service.Config.admin, + max_food = 12, + code = "", -- 0000为正常完成,其它为错误发生 + msg = "", -- 出错消息 + game_code = "", + game_msg = "", + luck_card = "", + luck_crit = 0, + new_card_list = "", + open_day_list = "", + is_open_day = 0, + server_time = GetRealDateTime(), + } + +-- endregion + + +-- 通用方法 start + + -- 通用请求,fTimeout超时秒,不传则默认;hFunc(iStatusCode, sBody) + function Service:Request(method, url, hParams, hFunc, fTimeout) + local handle = CreateHTTPRequestScriptVM(method, url) -- 需要放在Load阶段后,即DOTA_GAMERULES_STATE_CUSTOM_GAME_SETUP及以后阶段 + handle:SetHTTPRequestHeaderValue("Content-Type", "application/json;charset=uft-8") + if hParams == nil then hParams = {} end + hParams.randomCode = tostring(RandomInt(1, 99999999)) + hParams.serverKey = SERVER_KEY + hParams.gameCode = self.Config.gameCode + if method == "get" or method == "GET" then + for k,v in pairs(hParams) do + handle:SetHTTPRequestGetOrPostParameter(tostring(k), tostring(v)) + end + else + handle:SetHTTPRequestRawPostBody("application/json", json.encode(hParams)) + end + handle:SetHTTPRequestAbsoluteTimeoutMS((fTimeout or REQUEST_TIME_OUT) * 1000) + handle:Send(function(response) + hFunc(response.StatusCode, response.Body) + end) + end + + -- 同步模式通用请求,需在 coroutine.wrap 中调用。 + function Service:RequestSync(method, url, hParams, fTimeout) + local co = coroutine.running() + self:Request(method, url, hParams, function(iStatusCode, sBody) + coroutine.resume(co, iStatusCode, sBody) + end, fTimeout) + return coroutine.yield() + end + + function Service:Get(url, params, func) + local req = CreateHTTPRequestScriptVM("GET", url) -- 需要放在Load阶段后,即DOTA_GAMERULES_STATE_CUSTOM_GAME_SETUP及以后阶段 + if params == nil then params = {} end + params.randomCode = RandomInt(1, 99999999) + params.serverKey = SERVER_KEY + params.gameCode = self.Config.gameCode + for k,v in pairs(params) do + req:SetHTTPRequestGetOrPostParameter(tostring(k), tostring(v)) + end + req:SetHTTPRequestAbsoluteTimeoutMS((REQUEST_TIME_OUT or 60) * 1000) + req:Send(function(response) + func(response.StatusCode, response.Body) + end) + end + + function Service:Post(url, data, func) + local req = CreateHTTPRequestScriptVM("POST", url) -- 需要放在Load阶段后,即DOTA_GAMERULES_STATE_CUSTOM_GAME_SETUP及以后阶段 + req:SetHTTPRequestHeaderValue("Content-Type", "application/json;charset=uft-8") + if data == nil then data = {} end + data.serverKey = SERVER_KEY + data.gameCode = self.Config.gameCode + req:SetHTTPRequestRawPostBody("application/json", json.encode(data)) + req:SetHTTPRequestAbsoluteTimeoutMS((REQUEST_TIME_OUT or 60) * 1000) + req:Send(function(response) + func(response.StatusCode, response.Body) + end) + end + +-- endregion + + +-- 编码 start + + -- 卡组数据明细解码,hex编码的卡组名称#卡牌及数量#卡牌及数量#...,卡牌及数量为卡牌物品后4位加数量,如00011表示item_0001,数量1个。 + -- 输入 string: e68891e79a84e58da1e7bb84#20084#00023#00801#00922#000410#00571#20044#20194#20204 + -- 返回 data : {"name":"我的卡组","item_2008":4,"item_0002":3,"item_0080":1,"item_0092":2,...} + function Service:decodeCardGroup(cardString) + local retData = {} + if cardString == nil or cardString == "" then return retData end + local a = string.split(cardString, "#") + if a == nil or #a < 2 then return retData end + retData["name"] = string.fromhex(a[1]) + for i=2, #a do + retData["item_"..string.sub(a[i],1,4)] = tonumber(string.sub(a[i],5,6)) + end + return retData + end + + -- 卡组数据明细编码,hex编码的卡组名称#卡牌及数量#卡牌及数量#...,卡牌及数量为卡牌物品后4位加数量,如00011表示item_0001,数量1个。 + -- 输入data = {"name":"我的卡组","item_2008":4,"item_0002":3,"item_0080":1,"item_0092":2,...} + -- 返回string: e68891e79a84e58da1e7bb84#20084#00023#00801#00922#000410#00571#20044#20194#20204#00583#20174#00362#20074#00522#20154#20241#20014#20064#00885#20231#00077#20164#00068#00973#00341#00962#20021#00162#00412 + function Service:encodeCardGroup(cardGroup) + local retString = "" + if cardGroup["name"] ~= nil then retString = string.tohex(cardGroup["name"]) end + for k,v in pairs(cardGroup) do + if k ~= "name" then + retString = retString.."#"..string.sub(k,6,9)..tostring(v) + end + end + return retString + end + + -- 等级解码 + function Service:decodeCardLevel(cardString) + local retData = {} + if cardString == nil or cardString == "" then return retData end + local a = string.split(cardString, "#") + if a == nil or #a < 1 then return retData end + for i=1, #a do + retData["item_0"..string.sub(a[i],1,3)] = tonumber(string.sub(a[i],4,9)) + end + return retData + end + + -- 等级编码 + function Service:encodeCardLevel(cardLevel) + local retString = "" + for k,v in pairs(cardLevel) do + if retString == "" then + retString = string.sub(k,7,9)..tostring(v) + elseif v ~= nil then + retString = retString.."#"..string.sub(k,7,9)..tostring(v) + end + end + return retString + end + +-- endregion + + +-- 加载游戏数据 start + + -- 获取游戏用户数据,按顺序 + function Service:LoadGameData() + coroutine.wrap(function() + print("----> start request game config : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + local iStatusCode, sBody = Service:RequestSync("get", self.Config.urlGameConfig) + print("<---- end request game config : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + self:InitGameConfig(iStatusCode, sBody) + + local input = {method = "get", ids = {}} + for i=0, PlayerResource:GetPlayerCount()-1 do + input.ids[i] = tostring(PlayerResource:GetSteamID(i)) + end + print("----> start request player data : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + local iStatusCode, sBody = Service:RequestSync("post", self.Config.urlPlayerData, input) + print("<---- end request player data : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + self:InitPlayerData(iStatusCode, sBody, input) + end)() + end + + -- 游戏配置 + function Service:InitGameConfig(iStatusCode, sBody) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + GameRules.GameData.code = data.code + GameRules.GameData.msg = data.msg + GameRules.GameData.game_code = data.game_code or "" + GameRules.GameData.game_msg = data.game_msg or "" + GameRules.GameData.luck_card = data.luck_card or "" + GameRules.GameData.luck_crit = data.luck_crit or 0 + GameRules.GameData.new_card_list = data.new_card_list or "" + GameRules.GameData.open_day_list = data.open_day_list or "" + GameRules.GameData.is_open_day = data.is_open_day or 0 + GameRules.GameData.server_time = data.server_time + else + GameRules.GameData.code = "0003" + GameRules.GameData.msg = "游戏配置数据解析失败" + end + else + GameRules.GameData.code = "0004" + GameRules.GameData.msg = "无法访问服务器" + end + + CustomNetTables:SetTableValue("CustomGameInfo", "GameData", GameRules.GameData) + end + + -- 玩家数据 + function Service:InitPlayerData(iStatusCode, sBody, input) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + for k,v in pairs(data.bo) do + for i=1,20 do + v["cardgroup"..i] = self:decodeCardGroup(v["cardgroup"..i]) + end + v["level_list"] = self:decodeCardLevel(v["level_list"]) + + local index = tonumber(k) + for key,value in pairs(v) do + GameRules.PlayerData[index][key] = value + end + end + else + for k,v in pairs(input.ids) do + GameRules.PlayerData[k].code = "0003" + GameRules.PlayerData[k].msg = "用户数据解析失败" + end + end + else + for k,v in pairs(input.ids) do + GameRules.PlayerData[k].code = "0004" + GameRules.PlayerData[k].msg = "无法访问服务器" + end + end + + for k,v in pairs(input.ids) do + CustomNetTables:SetTableValue("CustomGameInfo", "PlayerData_"..v, GameRules.PlayerData[k]) + -- print("--------- PlayerData "..tostring(k)) + -- DeepPrintTable(GameRules.PlayerData[k]) + end + end + +-- endregion + + +-- 加载排行榜数据 start + + -- 获取排行榜通用方法 + function Service:GetRank(rankType) + -- 初始化 + if GameRules.players_rank_ok == nil then + GameRules.players_rank_ok = false -- 是否载入成功 + + GameRules.players_rank = {} -- 排行榜基本数据 + GameRules.players_rank_data = {} -- 排行榜明细数据 + + GameRules.players_team_rank = {} + GameRules.players_team_rank_data = {} + end + + print("----> start request get rank : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local input = {} + input["rank_type"] = rankType or "all" --或取值SDT中一个, S 原始榜,D 巅峰榜,T 挑战榜 + + self:Get( + self.Config.urlRankData, + input, + function(iStatusCode, sBody) + print("<---- end request get rank : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + GameRules.players_rank_ok = true + + local datas = data.bo["S"] + if #datas > 0 then + local ranks = {} + for i = 1, #datas do + ranks[i] = { + ['steamid'] = datas[i].steamid, + ['userid'] = datas[i].userid, + ['username'] = string.fromhex(datas[i].username), + ['wave'] = datas[i].wave, + ['damage'] = datas[i].damage, + ['version'] = datas[i].version, + ['host'] = datas[i].host, + ['updatetime'] = datas[i].update_time + } + for k,v in pairs(datas[i]) do + if string.sub(k,1,4) == "card" then + datas[i][k] = json.decode(string.fromhex(v)) + end + end + + for id=0, PlayerResource:GetPlayerCount()-1 do + if PlayerResource:IsValidPlayerID(id) then + if GameRules.PlayerData[id].steamid == datas[i].steamid then + GameRules.PlayerData[id].max_wave = datas[i].wave + print("----- 玩家"..tostring(id).."原始榜波数:"..tostring(datas[i].wave)) + break + end + end + end + end + GameRules.players_rank = ranks + GameRules.players_rank_data = datas + ranks = {} + datas = {} + CustomNetTables:SetTableValue("CustomGameInfo", "PlayersRank", GameRules.players_rank) + end + + local datas = data.bo["D"] + if #datas > 0 then + local ranks = {} + for i = 1, #datas do + ranks[i] = { + ['steamid'] = datas[i].steamid, + ['userid'] = datas[i].userid, + ['username'] = string.fromhex(datas[i].username), + ['wave'] = datas[i].wave, + ['damage'] = datas[i].damage, + ['version'] = datas[i].version, + ['host'] = datas[i].host, + ['updatetime'] = datas[i].update_time + } + for k,v in pairs(datas[i]) do + if string.sub(k,1,4) == "card" then + datas[i][k] = json.decode(string.fromhex(v)) + end + end + + for id=0, PlayerResource:GetPlayerCount()-1 do + if PlayerResource:IsValidPlayerID(id) then + if GameRules.PlayerData[id].steamid == datas[i].steamid then + GameRules.PlayerData[id].max_team_wave = datas[i].wave + print("----- 玩家"..tostring(id).."巅峰榜波数:"..tostring(datas[i].wave)) + break + end + end + end + end + GameRules.players_team_rank = ranks + GameRules.players_team_rank_data = datas + ranks = {} + datas = {} + CustomNetTables:SetTableValue("CustomGameInfo", "PlayersTeamRank", GameRules.players_team_rank) + end + else + CustomGameEventManager:Send_ServerToAllClients("thtd_server_msg", {code = "0005", msg = data.msg, duration = 10, pos = 200}) + end + else + CustomGameEventManager:Send_ServerToAllClients("thtd_server_msg", {code = "0003", msg = "获取排行榜数据出错,本次游戏将无法上传原始榜,数据解析失败", duration = 10, pos = 200}) + end + else + CustomGameEventManager:Send_ServerToAllClients("thtd_server_msg", {code = "0004", msg = "获取排行榜数据出错,本次游戏将无法上传原始榜,StatusCode: "..tostring(iStatusCode), duration = 10, pos = 200}) + end + end + ) + end + + -- 重置排行榜 + function Service:ResetRank(index, rankType) + print("----> start request reset rank : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local input = {method = "reset"} + input["rank_type"] = rankType + if rankType == "S" then + input["steamid"] = GameRules.players_rank[index].steamid + input["userid"] = GameRules.players_rank[index].userid + elseif rankType == "D" then + input["steamid"] = GameRules.players_team_rank[index].steamid + input["userid"] = GameRules.players_team_rank[index].userid + else + return + end + + self:Post( + self.Config.urlRankData, + input, + function(iStatusCode, sBody) + print("<---- end request reset rank : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + if rankType == "S" then + CustomGameEventManager:Send_ServerToAllClients("thtd_reset_rank", {index = index, msg = ""}) + elseif rankType == "D" then + CustomGameEventManager:Send_ServerToAllClients("thtd_reset_team_rank", {index = index, msg = ""}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = data.code, msg = "重置排行榜失败,"..data.msg, duration = 5, pos = 100}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0003", msg = "重置排行榜失败,无法解析数据", duration = 5, pos = 100}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0004", msg = "重置排行榜失败,无法连接服务器", duration = 5, pos = 100}) + end + end + ) + end + + -- 上传排行榜 + function Service:UploadRank(playerId, rankType, wavedata) + print("----> start request upload rank : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local steamid = tostring(PlayerResource:GetSteamID(playerId)) + local input = {method = "update"} + input["rank_type"] = rankType + input["steamid"] = steamid + input["userid"] = tostring(PlayerResource:GetSteamAccountID(playerId)) + input["username"] = string.tohex(PlayerResource:GetPlayerName(playerId)) + input["version"] = GameRules.GameData.ver + input["wave"] = wavedata["wave"] + input["damage"] = wavedata["damage"] + for k,v in pairs(wavedata) do + if string.sub(k,1,4) == "card" then + input[k] = string.tohex(json.encode(v)) + end + end + local teamText = "" + if rankType == "D" then + teamText = "巅峰" + elseif rankType == "S" then + teamText = "原始" + end + + local bonus = 10 + if wavedata["rank_index"] <= 4 then + bonus = 500 - (wavedata["rank_index"] - 1) * 100 + elseif wavedata["rank_index"] <= 9 then + bonus = 170 - (wavedata["rank_index"] - 5) * 10 + elseif wavedata["rank_index"] <= 15 then + bonus = 125 - (wavedata["rank_index"] - 10) * 5 + elseif wavedata["rank_index"] <= 25 then + bonus = 96 - (wavedata["rank_index"] - 16) * 4 + elseif wavedata["rank_index"] <= 50 then + bonus = 58 - (wavedata["rank_index"] - 26) * 2 + end + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0000", msg = "恭喜上榜,排名:".. wavedata["rank_index"] ..",此排名赛季结算奖励:符卡精华 ×"..tostring(bonus), duration = 30, pos = -100}) + + self:Post( + self.Config.urlRankData, + input, + function(iStatusCode, sBody) + print("<---- end request upload rank : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0000", msg = "恭喜!你打破了历史记录,达到了新的最高波数,上传"..teamText.."排行榜成功!", duration = 30}) + if SpawnSystem:GetCount() == 0 then Service:ClearSameRank() end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = data.code, msg = "上传排行榜失败,"..data.msg, duration = 10}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0003", msg = "上传排行榜失败,无法解析数据", duration = 10}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0004",msg = "上传排行榜失败,无法连接服务器", duration = 10}) + end + end + ) + end + + -- 清除相同的排行榜 + function Service:ClearSameRank() + if GameRules.GameData.is_clear_rank == true then return end + GameRules.GameData.is_clear_rank = true + + local toplist + local isTeam = GameRules.HeroList[0].is_team_mode + if isTeam == true then + toplist = GameRules.players_team_rank_data + else + toplist = GameRules.players_rank_data + end + if #toplist == 0 then return end + + local toDelList = {} + for i=1,#toplist-1 do + local wavedata = toplist[i] + if table.hasvalue(toDelList, i) == false then + for j=i+1,#toplist do + local topdata = toplist[j] + local isSameRank = false + + if wavedata["card1"] ~= "" and wavedata["card1"] ~= nil and topdata["card1"] ~= "" and topdata["card1"] ~= nil and wavedata["card1"]["itemname"] == topdata["card1"]["itemname"] then + if wavedata["card1"]["damage"] / (10000 * wavedata["damage"]) >= 0.6 and topdata["card1"]["damage"] / (10000 * topdata["damage"]) >= 0.6 then + isSameRank = true + end + end + + if isSameRank == false then + local topDamage1 = 0 + local topDamage2 = 0 + local topNum = 0 + for x=1,12 do + if wavedata["card"..tostring(x)] ~= "" and wavedata["card"..tostring(x)] ~= nil then + topDamage1 = topDamage1 + wavedata["card"..tostring(x)]["damage"] + end + if topdata["card"..tostring(x)] ~= "" and topdata["card"..tostring(x)] ~= nil then + topDamage2 = topDamage2 + topdata["card"..tostring(x)]["damage"] + end + if topDamage1 / (10000 * wavedata["damage"]) >= 0.8 and topDamage2 / (10000 * topdata["damage"]) >= 0.8 then + topNum = x + break + end + end + if topNum > 0 then + local sameCount = 0 + local usedIndex = "" + for x=1,topNum do + for y=1,topNum do + if string.find(usedIndex,tostring(y)) == nil and wavedata["card"..tostring(x)] ~= "" and topdata["card"..tostring(y)] ~= "" and topdata["card"..tostring(y)] ~= nil and wavedata["card"..tostring(x)]["itemname"] == topdata["card"..tostring(y)]["itemname"] then + sameCount = sameCount + 1 + usedIndex = usedIndex..tostring(y).."," + break + end + end + end + if sameCount == topNum then isSameRank = true end + end + end + + if isSameRank == true then + table.insert(toDelList, j) + end + end + end + end + + for k,v in pairs(toDelList) do + if isTeam == true then + Service:ResetRank(v, "D") + else + Service:ResetRank(v, "S") + end + end + print("---------- the same rank : ", json.encode(toDelList)) + end + + +-- endregion + + +-- 玩家数据 start + + -- 保存玩家卡组 + function Service:SaveCardGroup(playerId, groupKey, groupData) + print("----> start request save card group : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local steamid = tostring(PlayerResource:GetSteamID(playerId)) + local input = {method = "save_card_group"} + input["steamid"] = steamid + input["userid"] = tostring(PlayerResource:GetSteamAccountID(playerId)) + input["group_key"] = groupKey + input["group_data"] = self:encodeCardGroup(groupData) + + self:Post( + self.Config.urlPlayerData, + input, + function(iStatusCode, sBody) + print("<---- end request save card group : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_save_cardgroup", {code = data.code, msg = ""}) + GameRules.PlayerData[playerId][groupKey] = groupData + CustomNetTables:SetTableValue("CustomGameInfo", "PlayerData_"..steamid, GameRules.PlayerData[playerId]) + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_save_cardgroup", {code = data.code, msg = data.msg}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_save_cardgroup", {code = "0005", msg = "数据解析失败:"..sBody}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_save_cardgroup", {code = "0009", msg = "无法连接服务器,StatusCode: "..tostring(iStatusCode)}) + end + end + ) + end + + -- 获取玩家基础数据 + function Service:GetPlayerBaseData(playerId) + local steamid = tostring(PlayerResource:GetSteamID(playerId)) + print("----> start request player base data : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + self:Get( + self.Config.urlPlayerBaseData, + {id = steamid}, + function(iStatusCode, sBody) + print("<---- end request player base data : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + self:UpdatePlayerData(playerId, data) + end + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_update_player_data", data) + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_update_player_data", {code = "0003", msg = "返回数据解析失败"}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_update_player_data", {code = "0004", msg = "无法连接服务器,StatusCode: "..tostring(iStatusCode)}) + end + end + ) + end + + -- 更新玩家基础数据信息 + function Service:UpdatePlayerData(playerId, data) + GameRules.PlayerData[playerId].point = data.point + GameRules.PlayerData[playerId].level_list = self:decodeCardLevel(data.level_list) + GameRules.PlayerData[playerId].pet_level = data.pet_level + GameRules.PlayerData[playerId].end_time = data.end_time + GameRules.PlayerData[playerId].key_total = data.key_total + GameRules.PlayerData[playerId].key_save_date = data.key_save_date + GameRules.PlayerData[playerId].vip = data.vip + + if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then + -- 更新宠物等级 + local hero = GameRules.HeroList[playerId] + local pet = hero.reimu_pet + if pet ~= nil and pet.pet_level ~= data.pet_level then + local oldLevel = pet.pet_level + pet.pet_level = data.pet_level + pet:FindModifierByName("modifier_reimu_pet_01_level"):SetStackCount(data.pet_level) + pet:CreatureLevelUp(data.pet_level - oldLevel) + end + + -- 更新钥匙数量 + local item = hero:FindItemInInventory("item_3121") + if item ~= nil then + if data.key_total ~= item:GetCurrentCharges() then + item:SetCurrentCharges(data.key_total) + if data.key_total <= 0 then + hero:RemoveItem(item) + end + end + elseif data.key_total > 0 then + item = CreateItem("item_3121", nil, nil) + if item ~= nil then + item.owner_player_id = playerId + item:SetPurchaser(hero) + item:SetCurrentCharges(data.key_total) + hero:AddItem(item) + end + end + end + + CustomNetTables:SetTableValue("CustomGameInfo", "PlayerData_"..tostring(PlayerResource:GetSteamID(playerId)), GameRules.PlayerData[playerId]) + end + + -- 培养卡牌 + function Service:SaveCardLevel(playerId, card, level) + print("----> start request save card group : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local steamid = tostring(PlayerResource:GetSteamID(playerId)) + local input = {method = "save_card_level"} + input["steamid"] = steamid + input["userid"] = tostring(PlayerResource:GetSteamAccountID(playerId)) + input["card"] = card --item_0001 + input["level"] = level --增加等级 + + self:Post( + self.Config.urlPlayerData, + input, + function(iStatusCode, sBody) + print("<---- end request save card group : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + GameRules.PlayerData[playerId].point = GameRules.PlayerData[playerId].point - data.cost_point + GameRules.PlayerData[playerId]["level_list"][card] = (GameRules.PlayerData[playerId]["level_list"][card] or 0) + level + CustomNetTables:SetTableValue("CustomGameInfo", "PlayerData_"..steamid, GameRules.PlayerData[playerId]) + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_update_game_point", {point = GameRules.PlayerData[playerId].point}) + data.level_list = GameRules.PlayerData[playerId]["level_list"] + end + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_train_card_complete", data) + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_train_card_complete", {code = "0003", msg = "返回数据解析失败"}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_train_card_complete", {code = "0004", msg = "无法连接服务器,StatusCode: "..tostring(iStatusCode)}) + end + end + ) + end + + -- 保存宠物 + function Service:SavePetCustom(playerId) + print("----> start request save pet custom : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local steamid = tostring(PlayerResource:GetSteamID(playerId)) + local input = {method = "save_pet_custom"} + input["steamid"] = steamid + input["userid"] = tostring(PlayerResource:GetSteamAccountID(playerId)) + input["pet_model"] = GameRules.PlayerData[playerId].pet_model + input["pet_effect"] = GameRules.PlayerData[playerId].pet_effect + + self:Post( + self.Config.urlPlayerData, + input, + function(iStatusCode, sBody) + print("<---- end request save pet custom : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "show_message", {msg="pet_cumstom_saved", duration=15, params={}, color="#ff0"}) + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = data.code, msg = data.msg}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "display_custom_error", {msg="user_server_error"}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "display_custom_error", {msg="connect_server_error"}) + end + end + ) + end + + -- 购买魔法钥匙 + function Service:BuyMagicKey(playerId, count) + print("----> start request buy magic key : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local steamid = tostring(PlayerResource:GetSteamID(playerId)) + local input = {method = "buy_key"} + input["steamid"] = steamid + input["userid"] = tostring(PlayerResource:GetSteamAccountID(playerId)) + input["count"] = count + + self:Post( + self.Config.urlPlayerData, + input, + function(iStatusCode, sBody) + print("<---- end request buy magic key : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + GameRules.PlayerData[playerId]["point"] = GameRules.PlayerData[playerId]["point"] - data.cost_point + CustomNetTables:SetTableValue("CustomGameInfo", "PlayerData_"..steamid, GameRules.PlayerData[playerId]) + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_update_game_point", {point = GameRules.PlayerData[playerId]["point"]}) + + local hero = GameRules.HeroList[playerId] + local item = hero:FindItemInInventory("item_3121") + if item ~= nil then + item:SetCurrentCharges(item:GetCurrentCharges() + count) + else + item = CreateItem("item_3121", nil, nil) + if item ~= nil then + item.owner_player_id = playerId + item:SetPurchaser(hero) + item:SetCurrentCharges(count) + hero:AddItem(item) + end + end + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "show_message", {msg="key_made_tip", duration=3, params={}, color="#ff0"}) + ParticleManager:DestroyParticleSystem(hero.thtd_emoji_effect,true) + hero.thtd_emoji_effect = ParticleManager:CreateParticle("particles/thtd/emoji/thtd_msg_hongliange.vpcf", PATTACH_OVERHEAD_FOLLOW, hero) + ParticleManager:SetParticleControlEnt(hero.thtd_emoji_effect , 0, hero, PATTACH_OVERHEAD_FOLLOW, "attach_hitloc", Vector(0,0,0), true) --灵梦用 attach_emoji + ParticleManager:SetParticleControl(hero.thtd_emoji_effect, 3, Vector(1,0,0)) + ParticleManager:DestroyParticleSystemTime(hero.thtd_emoji_effect,5.0) + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = data.code, msg = "购买钥匙失败,"..data.msg}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "display_custom_error", {msg="user_server_error"}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "display_custom_error", {msg="connect_server_error"}) + end + end + ) + end + + -- 保存魔法钥匙 + function Service:SaveKeyCount(playerId) + if GameRules.PlayerData[playerId].code ~= "0000" then + return + end + + local keyCount = 0 + local hero = GameRules.HeroList[playerId] + local itemTpSlot = hero:GetItemInSlot(DOTA_ITEM_TP_SCROLL) --15 + if itemTpSlot then + keyCount = itemTpSlot:GetCurrentCharges() + end + if keyCount == GameRules.PlayerData[playerId]["key_total"] then + return + end + + print("----> start request save key count : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local steamid = tostring(PlayerResource:GetSteamID(playerId)) + local input = {method = "save_key_count"} + input["steamid"] = steamid + input["userid"] = tostring(PlayerResource:GetSteamAccountID(playerId)) + input["key_total"] = keyCount + input["key_use_count"] = GameRules.PlayerData[playerId]["key_use_count"] + + self:Post( + self.Config.urlPlayerData, + input, + function(iStatusCode, sBody) + print("<---- end request save key count : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + GameRules.PlayerData[playerId]["key_total"] = keyCount + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = data.code, msg = "保存钥匙数量失败,"..data.msg, duration = 10, pos = 150}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0003", msg = "保存钥匙数量失败,无法解析数据", duration = 10, pos = 150}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0004", msg = "保存钥匙数量失败,无法连接服务器", duration = 10, pos = 150}) + end + end + ) + end + + -- 保存凤凰之灵 + function Service:SavePowerMaxCount(playerId, isAdd) + print("----> start request save power max count : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local steamid = tostring(PlayerResource:GetSteamID(playerId)) + local input = {method = "save_power_max"} + input["steamid"] = steamid + input["userid"] = tostring(PlayerResource:GetSteamAccountID(playerId)) + if isAdd == true then + input["op"] = "add" + else + input["op"] = "sub" + end + + self:Post( + self.Config.urlPlayerData, + input, + function(iStatusCode, sBody) + print("<---- end request save power max count : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + print("----- 玩家"..tostring(playerId).."的凤凰之灵已保存") + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = data.code, msg = "保存凤凰之灵失败,"..data.msg, duration = 10}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0003", msg = "保存凤凰之灵失败,无法解析数据", duration = 10}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0004", msg = "保存凤凰之灵失败,无法连接服务器", duration = 10}) + end + end + ) + end + + -- 首胜奖励 + function Service:GiveDayFirstWinBonus(playerId) + print("----> start request day first win : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local steamid = tostring(PlayerResource:GetSteamID(playerId)) + local input = {method = "day_first_win"} + input["steamid"] = steamid + input["userid"] = tostring(PlayerResource:GetSteamAccountID(playerId)) + + self:Post( + self.Config.urlPlayerData, + input, + function(iStatusCode, sBody) + print("<---- end request day first win : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + GameRules.PlayerData[playerId]["point"] = GameRules.PlayerData[playerId]["point"] + data.bonus_point + CustomNetTables:SetTableValue("CustomGameInfo", "PlayerData_"..steamid, GameRules.PlayerData[playerId]) + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_update_game_point", {point = GameRules.PlayerData[playerId]["point"]}) + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0000", msg = "获得 符卡精华 x"..tostring(data.bonus_point)}) + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = data.code, msg = "每日开箱奖励失败,"..data.msg}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0003", msg = "每日开箱奖励失败,无法解析数据"}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_server_msg", {code = "0004", msg = "每日开箱奖励失败,无法连接服务器"}) + end + end + ) + end + + +-- endregion + + +-- 赞助 start + + -- 创建订单 + function Service:CreateShopOrder(playerId, payType, amount, price, goods) + print("----> start request buy order : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local current = 0 + local tips = "" + if goods == "fairy" then + current = GameRules.PlayerData[playerId].point + tips = "获得:符卡精华 ×"..tostring(amount) + elseif goods == "pet" then + current = GameRules.PlayerData[playerId].pet_level + tips = "宠物等级提升 "..tostring(amount).." 级,特别奖励时间增加 "..tostring(amount*2).." 个月" + end + + local steamid = tostring(PlayerResource:GetSteamID(playerId)) + local input = {method = "create_shop_order"} + input["steamid"] = steamid + input["userid"] = tostring(PlayerResource:GetSteamAccountID(playerId)) + input["pay_type"] = payType -- 1支付宝,2微信 + input["amount"] = amount -- 订单数量 + input["price"] = price -- 价格,整数,分 + input["goods"] = goods -- 商品 + input["current"] = current -- 当前数量 + + GameRules.PlayerData[playerId].order_tips = "没有生成订单" + + self:Post( + self.Config.urlPlayerData, + input, + function(iStatusCode, sBody) + print("<---- end request buy order : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + GameRules.PlayerData[playerId].order_no = data.order_no + GameRules.PlayerData[playerId].order_tips = tips + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_pay_post", {code = 1, method = payType}) + + local time = 45 + local tick = 1.5 + GameRules:GetGameModeEntity():SetContextThink(DoUniqueString("Query_Order_State"), + function() + if GameRules.PlayerData[playerId].order_no == nil then return nil end + if time < 0 then return nil end + self:PayAutoCheck(playerId) + time = time - tick + return tick + end, + tick) + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_pay_post", {code = 505, msg = data.msg}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_pay_post", {code = 505, msg = "无法解析数据,"..sBody}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_pay_post", {code = 201, msg = "无法连接,StatusCode: "..tostring(iStatusCode)}) + end + end + ) + end + + -- 支付检查,自动模式 + function Service:PayAutoCheck(playerId) + + if GameRules.PlayerData[playerId].order_no == nil then + return + end + + if GameRules.PlayerData[playerId].query_order == 1 then + return + end + GameRules.PlayerData[playerId].query_order = 1 + + print("----> start request query pay order : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local steamid = tostring(PlayerResource:GetSteamID(playerId)) + local input = {method = "query_order"} + input["steamid"] = steamid + input["userid"] = tostring(PlayerResource:GetSteamAccountID(playerId)) + input["order_no"] = GameRules.PlayerData[playerId].order_no + + self:Post( + self.Config.urlPlayerData, + input, + function(iStatusCode, sBody) + print("<---- end request query pay order : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + GameRules.PlayerData[playerId].query_order = nil + + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + data.msg = GameRules.PlayerData[playerId].order_tips + GameRules.PlayerData[playerId].order_no = nil + GameRules.PlayerData[playerId].order_tips = "订单已经处理完成" + self:UpdatePlayerData(playerId, data) + data.hide = 1 + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_update_player_data", data) + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_pay_result", data) + end + end + end + end + ) + end + + -- 支付检查 + function Service:PayCheck(playerId) + if GameRules.PlayerData[playerId].order_no == nil then + local data = {code = "0001", msg = GameRules.PlayerData[playerId].order_tips} + if data.msg == "订单已经处理完成" then data.code = "0000" end + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_pay_result", data) + return + end + + print("----> start request query pay order : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + + local steamid = tostring(PlayerResource:GetSteamID(playerId)) + local input = {method = "query_order"} + input["steamid"] = steamid + input["userid"] = tostring(PlayerResource:GetSteamAccountID(playerId)) + input["order_no"] = GameRules.PlayerData[playerId].order_no + + self:Post( + self.Config.urlPlayerData, + input, + function(iStatusCode, sBody) + print("<---- end request query pay order : ", tostring(math.floor(GameRules:GetGameTime()*100 + 0.5)/100)) + if iStatusCode == 200 then + local data = json.decode(sBody) + if data then + if data.code == "0000" then + data.msg = GameRules.PlayerData[playerId].order_tips + GameRules.PlayerData[playerId].order_no = nil + GameRules.PlayerData[playerId].order_tips = "订单已经处理完成" + self:UpdatePlayerData(playerId, data) + data.hide = 1 + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_update_player_data", data) + end + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_pay_result", data) + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_pay_result", {code = "0003", msg = "查询订单返回数据解析失败,稍后会人工处理,处理完请点击刷新即可,加急请进群联系作者", hide = hideMsg}) + end + else + CustomGameEventManager:Send_ServerToPlayer(PlayerResource:GetPlayer(playerId), "thtd_pay_result", {code = "0004", msg = "查询订单无法连接服务器,稍后会人工处理,处理完请点击刷新即可,加急请进群联系作者", hide = hideMsg}) + end + end + ) + end + +-- endregion + + + diff --git a/scripts/vscripts/system/spawner.lua b/scripts/vscripts/system/spawner.lua new file mode 100755 index 0000000..8099d5e --- /dev/null +++ b/scripts/vscripts/system/spawner.lua @@ -0,0 +1,1955 @@ +if SpawnSystem == nil then + SpawnSystem = {} + SpawnSystem.Spawner = {} -- 刷怪基本数据 + SpawnSystem.AttackingSpawner = {} -- 刷怪实体 + SpawnSystem.CurWave = 0 -- 当前波数 + SpawnSystem.CurTime = 0 -- 当前时间 + SpawnSystem.IsUnLimited = false -- 是否无尽 + SpawnSystem.ReachToWave = nil --跳关 + SpawnSystem.RankMinWave = 130 --开始计算排行榜的波数 + SpawnSystem.GameOverPlayerId = {} -- 失败玩家id + + SpawnSystem.SpawnOrigin = -- 玩家出生地点 + { + [1] = Vector(-3424,2816,144), + [2] = Vector(3424,2816,144), + [3] = Vector(3424,-2816,144), + [4] = Vector(-3424,-2816,144) + } + SpawnSystem.ShopOrigin = -- 玩家商店地点 + { + [1] = Vector(-2454,2989,142), + [2] = Vector(2227,2922,142), + [3] = Vector(2259,-2806,142), + [4] = Vector(-2454,-2867,142) + } + SpawnSystem.ShopForward = -- 玩家商店朝向 + { + [1] = Vector(-math.cos(math.pi/4),-math.sin(math.pi/4),0), + [2] = Vector(math.cos(math.pi/4),-math.sin(math.pi/4),0), + [3] = Vector(math.cos(math.pi/4),math.sin(math.pi/4),0), + [4] = Vector(-math.cos(math.pi/4),math.sin(math.pi/4),0) + } +end + +NORMAL_MODE = 1 +EXTRA_MODE = 2 +UNLIMITED_MODE = 3 +RANDOM_MODE = 4 +CHALLENGE_MODE = 5 +FUNNY_MODE = 6 +PVE_MODE = 7 + +MAX_HEALTH = 2000000000 + +THTD_EntitiesRectInner = { [0] = {}, [1] = {}, [2] = {},[3] = {} } -- 内圈怪按玩家逄 +THTD_EntitiesRectOuter = { } -- 外圈怪统一算 +thtd_bosses_list = +{ + "alice", + "aya", + "hina", + "kaguya", + "keine", + "kisume", + "marisa", + "minoriko", + "mokou", + "rumia", + "yuugi", +} + +function SpawnSystem:GetCount() + local spawner = SpawnSystem.AttackingSpawner + if spawner == nil or #spawner == 0 then return 0 end + local i = 0 + for _, spawnerLine in pairs(spawner) do + if spawnerLine.hero.is_game_over ~= true then + i = i + 1 + end + end + return i +end + + +function RefreshItemListNetTable(hero) + if hero == nil or hero.is_game_over == true then return end + hero.thtd_hero_damage_list = {} + for k,v in pairs(hero.thtd_hero_tower_list) do + hero.thtd_hero_damage_list[tostring(v:GetEntityIndex())] = math.floor(v:THTD_GetTowerDamage()) + end + local steamid = PlayerResource:GetSteamID(hero:GetPlayerOwnerID()) + CustomNetTables:SetTableValue("TowerListInfo", "damagelist"..tostring(steamid), hero.thtd_hero_damage_list) + CustomNetTables:SetTableValue("CustomGameInfo", "game_info"..tostring(steamid), hero.thtd_game_info) +end + +function RefreshItemListNetTableAll() + if SpawnSystem.AttackingSpawner == nil or #SpawnSystem.AttackingSpawner == 0 then return end + for k,v in pairs(SpawnSystem.AttackingSpawner) do + RefreshItemListNetTable(v.hero) + end +end + + + +-- todo 使用buff的think实现 + +function RefreshHeroBuff3011(hero) + if GameRules.player_bb_buff[hero.thtd_player_id]["item_3011"] <= 0 and GameRules.player_bb_buff[hero.thtd_player_id]["item_3011_effect"] <= 0 then + return + end + + local targets = {} + local comboCount = 0 + local hasSatori = false + local hasKoishi = false + local hasRin = false + local hasUtsuho = false + for _,tower in pairs(hero.thtd_hero_tower_list) do + local unitName = tower:GetUnitName() + if unitName == "satori" then + hasSatori = true + table.insert(targets, tower) + elseif unitName == "koishi" then + hasKoishi = true + table.insert(targets, tower) + elseif unitName == "rin" then + hasRin = true + table.insert(targets, tower) + elseif unitName == "utsuho" then + hasUtsuho = true + table.insert(targets, tower) + end + end + if hasSatori and hasKoishi then + comboCount = comboCount + 1 + end + if hasRin and hasUtsuho then + comboCount = comboCount + 1 + end + + GameRules.player_bb_buff[hero.thtd_player_id]["item_3011_effect"] = GameRules.player_bb_buff[hero.thtd_player_id]["item_3011"] * comboCount + + if GameRules.player_bb_buff[hero.thtd_player_id]["item_3011_effect"] > 0 then + for k,v in pairs(targets) do + if not v:HasModifier("modifier_bb_buff_3011_effect") then + v:AddNewModifier(v, nil, "modifier_bb_buff_3011_effect", nil) + elseif v.thtd_hero_3011_damage_up ~= GameRules.player_bb_buff[hero.thtd_player_id]["item_3011_effect"] then + v:RemoveModifierByName("modifier_bb_buff_3011_effect") + v:AddNewModifier(v, nil, "modifier_bb_buff_3011_effect", nil) + end + end + else + for k,v in pairs(targets) do + if v:HasModifier("modifier_bb_buff_3011_effect") then + v:RemoveModifierByName("modifier_bb_buff_3011_effect") + end + end + end +end + +function RefreshHeroBuff3015(hero) + if GameRules.player_bb_buff[hero.thtd_player_id]["item_3015"] <= 0 and GameRules.player_bb_buff[hero.thtd_player_id]["item_3015_effect"] <= 0 then + return + end + + local targets = {} + local count = 0 + local hasEirin = false + local hasKaguya = false + local hasReisen = false + local hasInaba = false + for _,tower in pairs(hero.thtd_hero_tower_list) do + local unitName = tower:GetUnitName() + if unitName == "eirin" then + hasEirin = true + table.insert(targets, tower) + elseif unitName == "kaguya" then + hasKaguya = true + table.insert(targets, tower) + elseif unitName == "reisen" then + hasReisen = true + table.insert(targets, tower) + elseif unitName == "inaba" then + hasInaba = true + table.insert(targets, tower) + end + end + if hasEirin then + count = count + 1 + end + if hasKaguya then + count = count + 1 + end + if hasReisen then + count = count + 1 + end + if hasInaba then + count = count + 1 + end + + GameRules.player_bb_buff[hero.thtd_player_id]["item_3015_effect"] = GameRules.player_bb_buff[hero.thtd_player_id]["item_3015"] * count + + if GameRules.player_bb_buff[hero.thtd_player_id]["item_3015_effect"] > 0 then + for k,v in pairs(targets) do + if not v:HasModifier("modifier_bb_buff_3015_effect") then + v:AddNewModifier(v, nil, "modifier_bb_buff_3015_effect", nil) + elseif v.thtd_hero_3015_damage_up ~= GameRules.player_bb_buff[hero.thtd_player_id]["item_3015_effect"] then + v:RemoveModifierByName("modifier_bb_buff_3015_effect") + v:AddNewModifier(v, nil, "modifier_bb_buff_3015_effect", nil) + end + end + else + for k,v in pairs(targets) do + if v:HasModifier("modifier_bb_buff_3015_effect") then + v:RemoveModifierByName("modifier_bb_buff_3015_effect") + end + end + end +end + +function RefreshHeroBuff3028(hero) + if GameRules.player_bb_buff[hero.thtd_player_id]["item_3028"] <= 0 and GameRules.player_bb_buff[hero.thtd_player_id]["item_3028_effect"] <= 0 then + return + end + + local targets = {} + for _,tower in pairs(hero.thtd_hero_tower_list) do + local unitName = tower:GetUnitName() + if unitName == "yuugi" or unitName == "suika" then + table.insert(targets, tower) + end + end + + GameRules.player_bb_buff[hero.thtd_player_id]["item_3028_effect"] = GameRules.player_bb_buff[hero.thtd_player_id]["item_3028"] + + if GameRules.player_bb_buff[hero.thtd_player_id]["item_3028_effect"] > 0 then + for k,v in pairs(targets) do + local ability = v:FindAbilityByName("faceless_void_time_lock") + if ability == nil then + ability = v:AddAbility("faceless_void_time_lock") + end + if ability:GetLevel() ~= GameRules.player_bb_buff[hero.thtd_player_id]["item_3028_effect"] then + ability:SetLevel(GameRules.player_bb_buff[hero.thtd_player_id]["item_3028_effect"]) + ability:SetActivated(true) + end + end + else + for k,v in pairs(targets) do + if v:HasAbility("faceless_void_time_lock") then + v:RemoveAbility("faceless_void_time_lock") + end + end + end +end + + + +-- 刷怪准备,DOTA_GAMERULES_STATE_PRE_GAME 时调用 +function SpawnSystem:PreSpawn() + -- 载入刷怪数据 + SpawnSystem.Spawner = LoadKeyValues("scripts/npc/Spawner.txt") + + -- 显示准备倒计时 + local maxTime = math.floor(GameRules:GetGameTime() + 0.5) + 30 + local uiWaveInfo = + { + ["Wave"] = 0, + ["RemainingTime"] = maxTime + } + + GameRules:GetGameModeEntity():SetContextThink(DoUniqueString("PreSpawn") , + function() + if GameRules:IsGamePaused() then return 0.1 end + if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then return nil end + if uiWaveInfo["RemainingTime"] == 0 then + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="item_locked_tip", duration=60, params={}, color="#ff0"}) + return nil + end + uiWaveInfo["RemainingTime"] = math.max(math.floor(maxTime - GameRules:GetGameTime()),0) + SpawnSystem.CurTime = uiWaveInfo["RemainingTime"] + CustomNetTables:SetTableValue("CustomGameInfo", "attacking_process", uiWaveInfo) + RefreshItemListNetTableAll() + if (GameRules:IsCheatMode() and IsInToolsMode() == false) then -- or SERVER_KEY == "Invalid_NotOnDedicatedServer" then + SpawnSystem:GameEnd() + return nil + end + + -- 初始化刷怪点 + if uiWaveInfo["RemainingTime"] <= 25 and SpawnSystem:GetCount() == 0 then + SpawnSystem:SpawnLine() + SpawnSystem:RefreshCreepMaxCount() + SpawnSystem:SpawnChest() + -- SendMsg(0, "test_tip", "总伤害",90) + -- 通知提示 + local difficulty = GameRules:GetCustomGameDifficulty() + if difficulty == CHALLENGE_MODE then + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="challenge_game_on", duration=25, params={}, color="#ff0"}) + elseif difficulty >= FUNNY_MODE then + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="funny_game_on", duration=25, params={}, color="#ff0"}) + end + end + + -- 同步UI数据 + RefreshItemListNetTableAll() + + -- 提示 + if SpawnSystem.CurTime == 15 then + GameRules:SendCustomMessage("#game_keyboard_tip", DOTA_TEAM_GOODGUYS, 0) + elseif SpawnSystem.CurTime == 8 then + GameRules:SendCustomMessage("#power_view_tip", DOTA_TEAM_GOODGUYS, 0) + end + + return 1 + end, + 0) +end + +-- 绑定刷怪点 +function SpawnSystem:SpawnLine() + local spawner = SpawnSystem.AttackingSpawner + local heroes = {} + for k,v in pairs(GameRules.HeroList) do + if v ~= nil then + table.insert(heroes, v) + end + end + if heroes == nil or #heroes == 0 then return end + table.sort(heroes, function(a,b) return (a.thtd_player_id < b.thtd_player_id) end) + local j = 1 + for _,hero in pairs(heroes) do + if hero.is_game_over ~= true then + local entity = Entities:FindByName(nil, "spanwer_player"..tostring(j)) + if entity ~= nil then + entity.index = j + entity.hero = hero + hero.spawn_index = j + hero.spawn_position = SpawnSystem.SpawnOrigin[j] + if GetDistanceBetweenTwoVec2D(hero:GetAbsOrigin(), hero.spawn_position) > 1000 then + hero:SetAbsOrigin(hero.spawn_position) + hero.shop:SetAbsOrigin(SpawnSystem.ShopOrigin[j]) + hero.shop:MoveToPosition(SpawnSystem.ShopOrigin[j]+SpawnSystem.ShopForward[j]) + end + + if j == 1 then + entity.first_point = "corner_M1408_1056" + entity.first_forward = "left" + entity.second_point = "corner_M2771_1056" + entity.second_forward = "up" + elseif j == 2 then + entity.first_point = "corner_1408_1056" + entity.first_forward = "right" + entity.second_point = "corner_2771_1056" + entity.second_forward = "up" + elseif j == 3 then + entity.first_point = "corner_1408_M1056" + entity.first_forward = "right" + entity.second_point = "corner_2771_M1056" + entity.second_forward = "down" + elseif j == 4 then + entity.first_point = "corner_M1408_M1056" + entity.first_forward = "left" + entity.second_point = "corner_M2771_M1056" + entity.second_forward = "down" + end + table.insert(spawner, entity) + j = j + 1 + end + end + end +end + + +-- 刷怪开始,DOTA_GAMERULES_STATE_GAME_IN_PROGRESS 时调用 +function SpawnSystem:InitSpawn() + local spawner = SpawnSystem.AttackingSpawner + + local max_time = 0 + local left_time = 0 + local uiWaveInfo = + { + ["Wave"] = 1, + ["RemainingTime"] = max_time + } + local wave = 0 + local difficulty = GameRules:GetCustomGameDifficulty() + local GameMode = GameRules:GetGameModeEntity() + GameMode:SetContextThink(DoUniqueString("AttackSpawn"), + function() + if GameRules:IsGamePaused() then return 0.1 end + + -- 每波开始 + if left_time <= 0 then + SpawnSystem:WaveEndForEach() + + if SpawnSystem.ReachToWave ~= nil then + SpawnSystem.CurWave = SpawnSystem.ReachToWave + 50 + SpawnSystem.RankMinWave = SpawnSystem.CurWave + 4 + SpawnSystem.ReachToWave = nil + elseif SpawnSystem.CurWave == 50 and difficulty >= CHALLENGE_MODE then + SpawnSystem.CurWave = 50 + 70 + elseif difficulty >= FUNNY_MODE and SpawnSystem.CurWave < 50 then + SpawnSystem.CurWave = SpawnSystem.CurWave + 2 + else + SpawnSystem.CurWave = SpawnSystem.CurWave + 1 + end + wave = SpawnSystem.CurWave + + if wave > 130 and wave < SpawnSystem.RankMinWave then + GameRules:SendCustomMessage("#skip_wave_rank_tip", DOTA_TEAM_GOODGUYS, 0) + end + + -- 普通和Extra胜利 + if difficulty < UNLIMITED_MODE and wave > 120 then + SpawnSystem:GameEnd() + return nil + end + + -- 无尽前提示 + if wave == 50 then + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="spawn_unlimited", duration=133, params={count=50}, color="#0ff"}) + end + + -- 进入无尽 + if wave > 50 and SpawnSystem.IsUnLimited == false then + SpawnSystem:StartUnlimited() + end + + -- 100波以后取消刷文文 + if wave == 151 then + SpawnSystem:RemoveBoss(true) + end + + -- 每波怪的计时 + if wave <= 51 then + max_time = math.floor(SpawnSystem.Spawner["Attacking"]["Wave".. tostring(wave)]["BreakTime"] + + SpawnSystem.Spawner["Attacking"]["Wave".. tostring(wave)]["Times"] * + SpawnSystem.Spawner["Attacking"]["Wave".. tostring(wave)]["Interval"] + 0.5) + elseif max_time > 30 then + max_time = math.floor(SpawnSystem.Spawner["Attacking"]["Wave51"]["BreakTime"] + + SpawnSystem.Spawner["Attacking"]["Wave51"]["Times"] * + SpawnSystem.Spawner["Attacking"]["Wave51"]["Interval"] + 0.5) + end + + left_time = max_time + + SpawnSystem:ClearRemovedSpawner() + SpawnSystem:StartSpawn() + end + + -- 增加无尽准备时间 + if wave == 50 and SpawnSystem.IsUnLimited == false and left_time == 0.5 then + SpawnSystem:WaveEndForEach() + SpawnSystem:StartUnlimited() + max_time = 180.5 + left_time = max_time + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="start_unlimited", duration=180, params={}, color="#ff0"}) + if difficulty == CHALLENGE_MODE then + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="challenge_game_on", duration=180, params={}, color="#ff0"}) + elseif difficulty >= FUNNY_MODE then + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="funny_game_on", duration=180, params={}, color="#ff0"}) + end + end + + -- 更新进度 + left_time = left_time - 0.5 + if wave == 50 and SpawnSystem.IsUnLimited then + uiWaveInfo["Wave"] = 0 + else + uiWaveInfo["Wave"] = wave + end + uiWaveInfo["RemainingTime"] = math.floor(left_time) + CustomNetTables:SetTableValue("CustomGameInfo", "attacking_process", uiWaveInfo) + SpawnSystem.CurTime = uiWaveInfo["RemainingTime"] + + -- 检查漏怪 + if not SpawnSystem:CreepCheck() then + return nil + end + + -- 同步UI数据 + RefreshItemListNetTableAll() + + if left_time%5 == 0 then + SpawnSystem:SpawnChest() + end + + return 0.5 + end, + 0) + +end + +-- 进入无尽相关设置 +function SpawnSystem:StartUnlimited() + SpawnSystem.IsUnLimited = true + local entities = Entities:FindAllByClassname("npc_dota_creature") + for k,v in pairs(entities) do + local findNum = string.find(v:GetUnitName(), 'creature') + if findNum ~= nil and v~=nil and v:IsNull()==false and v:IsAlive() then + v:ForceKill(false) + end + end + for _,hero in pairs(GameRules.HeroList) do + if hero~=nil and hero:IsNull()==false and hero.is_game_over ~= true then + hero.thtd_game_info["creature_kill_count"] = 0 + hero.thtd_minoriko_02_change = 0 + end + end + SpawnSystem:RefreshCreepMaxCount() +end + +-- 无尽高波移除特定BOSS +function SpawnSystem:RemoveBoss(showMsg) + if showMsg then + GameRules:SendCustomMessage("#one_hundred_wave_tip", DOTA_TEAM_GOODGUYS, 0) + end + for k,v in pairs(thtd_bosses_list) do + if v == "aya" then + table.remove(thtd_bosses_list, k) + break + end + end +end + +-- 漏怪检查,返回是否可接受范围内 +function SpawnSystem:CreepCheck() + local spawner = SpawnSystem.AttackingSpawner + if spawner == nil or #spawner == 0 then return true end + local wave = SpawnSystem.CurWave + local difficulty = GameRules:GetCustomGameDifficulty() + + CheckPlayerConnect() + + -- 无尽前 + if not SpawnSystem.IsUnLimited then + local count = 0 + for _,inner in pairs(THTD_EntitiesRectInner) do + if inner ~= nil then count = count + #inner end + end + if THTD_EntitiesRectOuter ~= nil then count = count + #THTD_EntitiesRectOuter end + local isEndGame = false + for spawnerIndex,spawnerLine in pairs(spawner) do + local hero = spawnerLine.hero + if hero.is_game_over ~= true then + hero.thtd_game_info["creep_count"] = count + if count > hero.thtd_game_info["creep_count_max"] and isEndGame == false then + isEndGame = true + end + end + end + if isEndGame then + for spawnerIndex,spawnerLine in pairs(spawner) do + local hero = spawnerLine.hero + if hero.is_game_over ~= true and hero.reimu_pet ~= nil and hero.reimu_pet.pet_level >= 2 then + for i=0,5 do + local targetItem = hero.reimu_pet:GetItemInSlot(i) + if targetItem~=nil and targetItem:IsNull()==false and targetItem:GetAbilityName() == "item_2001" then + hero.reimu_pet:CastAbilityNoTarget(targetItem, hero:GetPlayerOwnerID()) + isEndGame = false + break + end + end + if not isEndGame then break end + end + end + if not isEndGame then + for spawnerIndex,spawnerLine in pairs(spawner) do + local hero = spawnerLine.hero + hero.thtd_game_info["creep_count"] = 0 + end + return true + else + RefreshItemListNetTableAll() + SpawnSystem:GameEnd() + return false + end + else + return true + end + end + + -- 无尽波数 + -- local entities = Entities:FindAllByClassname("npc_dota_creature") + for spawnerIndex,spawnerLine in pairs(spawner) do + local hero = spawnerLine.hero + if hero.is_game_over ~= true then + local count = 0 + + -- for k,v in pairs(entities) do + -- if v ~= nil and v:IsNull() == false and v:IsAlive() and v.thtd_player_index == hero.thtd_player_id and v:GetHealth() > 0 then + -- if string.find(v:GetUnitName(), 'creature_unlimited') ~= nil or string.find(v:GetUnitName(), 'creature_bosses') ~= nil then + -- count = count + 1 + -- end + -- end + -- end + + -- 方法二,可以去掉 entities + for k,v in pairs(THTD_EntitiesRectInner[hero.thtd_player_id]) do + if v ~= nil and v:IsNull() == false and v:IsAlive() and v:GetHealth() > 0 then + count = count + 1 + end + end + for k,v in pairs(THTD_EntitiesRectOuter) do + if v ~= nil and v:IsNull() == false and v:IsAlive() and v.thtd_player_index == hero.thtd_player_id and v:GetHealth() > 0 then + count = count + 1 + end + end + + hero.thtd_game_info["creep_count"] = count + if count == hero.thtd_game_info["creep_count_max"] and GameRules.player_bb_buff[hero.thtd_player_id]["item_3019"] > 0 and GameRules.player_bb_buff[hero.thtd_player_id]["item_3019_enable"] == false and SpawnSystem.CurWave > 50 and SpawnSystem.CurTime <= 5 then + GameRules.player_bb_buff[hero.thtd_player_id]["item_3019_enable"] = true + hero:SetContextThink(DoUniqueString("modifier_bb_buff_3019"), + function() + GameRules.player_bb_buff[hero.thtd_player_id]["item_3019_enable"] = false + return nil + end, + 5.0) + end + if count > hero.thtd_game_info["creep_count_max"] then + if hero.reimu_pet ~= nil and hero.reimu_pet.pet_level >= 2 then + for i=0,5 do + local targetItem = hero.reimu_pet:GetItemInSlot(i) + if targetItem~=nil and targetItem:IsNull()==false and targetItem:GetAbilityName() == "item_2001" then + hero.reimu_pet:CastAbilityNoTarget(targetItem, hero:GetPlayerOwnerID()) + hero.thtd_game_info["creep_count"] = 0 + break + end + end + end + if hero.thtd_game_info["creep_count"] > 0 then + SpawnSystem:GameOver(hero) + if SpawnSystem:GetCount() == 0 then return false end + end + end + end + end + + return true +end + +-- 指定玩家游戏结束 +function SpawnSystem:GameOver(hero) + if hero~=nil and hero:IsNull()==false and hero:IsAlive() and hero.is_game_over ~= true then + RefreshItemListNetTable(hero) + hero.is_game_over = true + table.insert(SpawnSystem.GameOverPlayerId, hero.thtd_player_id) + + if hero.reimu_pet ~= nil then + if hero.reimu_pet.pet_tree ~= nil then + UTIL_Remove(hero.reimu_pet.pet_tree) + end + UnitStunTarget(hero.reimu_pet,hero.reimu_pet,-1) + hero.reimu_pet:SetAbsOrigin(Vector(0,0,0)) + hero.reimu_pet:AddNoDraw() + end + UnitStunTarget(hero,hero,-1) + hero:THTD_DropItemAll() + hero:SetAbsOrigin(Vector(0,0,0)) + hero:AddNoDraw() + THTD_EntitiesRectInner[hero.thtd_player_id] = {} + + local wave = SpawnSystem.CurWave + local entities = Entities:FindAllByClassname("npc_dota_creature") + local killed = false + for k,v in pairs(entities) do + killed = false + if SpawnSystem.IsUnLimited then + local findNum = string.find(v:GetUnitName(), 'creature_unlimited') + local findNum2 = string.find(v:GetUnitName(), 'creature_bosses') + if (findNum ~= nil or findNum2 ~= nil) and v~=nil and v:IsNull()==false and v:IsAlive() and v.thtd_player_index == hero.thtd_player_id then + v.diseble_buff = true + v:ForceKill(false) + killed = true + end + else + local findNum = string.find(v:GetUnitName(), 'creature') + if findNum ~= nil and v~=nil and v:IsNull()==false and v:IsAlive() and v.thtd_player_index == hero.thtd_player_id then + v:ForceKill(false) + killed = true + end + end + + if killed==false and SpawnSystem:GetCount() > 0 and v~=nil and v:IsNull()==false and v:IsAlive() and v:THTD_IsTower() and v:GetOwner() == hero then + v:THTD_DropItemAll() + v:THTD_DestroyLevelEffect() + hero:AddItem(v.thtd_item) + hero:THTD_DropItemAll() + v:SetAbsOrigin(Vector(0,0,0)) + v:AddNoDraw() + v:AddNewModifier(hero, nil, "modifier_touhoutd_release_hidden", {}) + for _,u in pairs(entities) do + if u~=nil and u:IsNull()==false and u:IsAlive() and u.thtd_spawn_unit_owner~=nil and u.thtd_spawn_unit_owner==v then + u:AddNoDraw() + u:ForceKill(false) + end + end + end + end + + -- 过挑战第一波BOSS算上榜 + if wave > 100 then + CheckRank(hero) + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="power_game_end_info", duration=60, params={wave=hero.thtd_game_info["max_wave"],name=PlayerResource:GetPlayerName(hero:GetPlayerID())}, color="#ff0"}) + ShowDetail(hero) + elseif wave > 50 then + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="normal_game_end_info", duration=30, params={wave=wave-51,name=PlayerResource:GetPlayerName(hero:GetPlayerID())}, color="#f00"}) + end + SpawnSystem:RefreshCreepMaxCount() + end + + if SpawnSystem:GetCount() == 0 then + SpawnSystem:GameEnd() + end +end + +-- 全部游戏结束 +function SpawnSystem:GameEnd() + local difficulty = GameRules:GetCustomGameDifficulty() + local wave = SpawnSystem.CurWave + + if difficulty < UNLIMITED_MODE and wave > 100 then + GameRules:GetGameModeEntity():SetContextThink(DoUniqueString("thtd_end_game"), + function() + GameRules:SetGameWinner(DOTA_TEAM_GOODGUYS) + return nil + end, + 1) + return + end + + if wave > 100 then + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="game_will_end", duration=60, params={}, color="#ff0"}) + GameRules:GetGameModeEntity():SetContextThink(DoUniqueString("thtd_end_game"), + function() + GameRules:SetGameWinner(DOTA_TEAM_GOODGUYS) + return nil + end, + 60) + else + GameRules:GetGameModeEntity():SetContextThink(DoUniqueString("thtd_end_game"), + function() + Entities:FindByName(nil, "dota_goodguys_fort"):ForceKill(false) + return nil + end, + 1) + end +end + +-- 检查是否能上排行榜 +function CheckRank(hero) + if GameRules.players_rank_ok ~= true then return end + if hero.thtd_game_info["max_wave"] == nil or hero.thtd_game_info["max_wave"] == 0 then return end + if hero.cards == nil then return end + + local RANK_COUNT = 50 --排行榜排名人数 + + local playerid = hero:GetPlayerOwnerID() + local steamid = tostring(PlayerResource:GetSteamID(playerid)) + + local wavedata = {} + wavedata["wave"] = hero.thtd_game_info["max_wave"] + wavedata["damage"] = hero.thtd_game_info["max_wave_damage"] / 10000 + for i=0,12 do + if (i+1) <= #hero.cards then + wavedata["card"..tostring(i)] = hero.cards[i+1] + else + wavedata["card"..tostring(i)] = "" + end + end + + -- 确定上传的排行榜 + local isTeamMode = hero.is_team_mode + if not isTeamMode then + for i=1,3 do + if wavedata["card"..tostring(i)] ~= nil and wavedata["card"..tostring(i)]["itemname"] ~= nil and (towerNameList[wavedata["card"..tostring(i)]["itemname"]]["cardname"] == GameRules.GameData.luck_card or GameRules.GameData.luck_card == "all") then + isTeamMode = true + hero.is_team_mode = true + break + end + end + end + + if isTeamMode then + if wavedata["wave"] <= GameRules.PlayerData[playerid].max_team_wave then return end + if #GameRules.players_team_rank >= RANK_COUNT and wavedata["wave"] <= GameRules.players_team_rank[RANK_COUNT].wave then return end + else + if wavedata["wave"] <= GameRules.PlayerData[playerid].max_wave then return end + if #GameRules.players_rank >= RANK_COUNT and wavedata["wave"] <= GameRules.players_rank[RANK_COUNT].wave then return end + end + + local toplist + if isTeamMode then + toplist = GameRules.players_team_rank_data + else + toplist = GameRules.players_rank_data + end + + local toDelList = {} + local isTop = true + local rankIndex = 0 --排名 + local bestWave = 0 + + if #toplist > 0 then + for i=1,#toplist do + local topdata = toplist[i] + if rankIndex == 0 and wavedata["wave"] > topdata["wave"] then + rankIndex = i + end + + if steamid ~= topdata["steamid"] then + local isSameRank = false + + if wavedata["card1"] ~= "" and topdata["card1"] ~= "" and topdata["card1"] ~= nil and wavedata["card1"]["itemname"] == topdata["card1"]["itemname"] then + if wavedata["card1"]["damage"] / (10000 * wavedata["damage"]) >= 0.6 and topdata["card1"]["damage"] / (10000 * topdata["damage"]) >= 0.6 then + isSameRank = true + end + end + + if isSameRank ~= true then + local topDamage1 = 0 + local topDamage2 = 0 + local topNum = 0 + for x=1,12 do + if wavedata["card"..tostring(x)] ~= "" then + topDamage1 = topDamage1 + wavedata["card"..tostring(x)]["damage"] + end + if topdata["card"..tostring(x)] ~= "" and topdata["card"..tostring(x)] ~= nil then + topDamage2 = topDamage2 + topdata["card"..tostring(x)]["damage"] + end + if topDamage1 / (10000 * wavedata["damage"]) >= 0.8 and topDamage2 / (10000 * topdata["damage"]) >= 0.8 then + topNum = x + break + end + end + if topNum > 0 then + local usedIndex = "" + local sameCount = 0 + for x=1,topNum do + for y=1,topNum do + if string.find(usedIndex,tostring(y)) == nil and wavedata["card"..tostring(x)] ~= "" and topdata["card"..tostring(y)] ~= "" and topdata["card"..tostring(y)] ~= nil and wavedata["card"..tostring(x)]["itemname"] == topdata["card"..tostring(y)]["itemname"] then + sameCount = sameCount + 1 + usedIndex = usedIndex..tostring(y).."," + break + end + end + end + if sameCount == topNum then isSameRank = true end + end + end + + if isSameRank == true then + if wavedata["wave"] <= topdata["wave"] then + if isTop ~= false then isTop = false end + if bestWave == 0 then bestWave = topdata["wave"] end + else + table.insert(toDelList, i) + end + end + end + end + end + + for k,v in pairs(toDelList) do + if isTeamMode then + Service:ResetRank(v,"D") + else + Service:ResetRank(v,"S") + end + end + GameRules:SendCustomMessage("clear the same rank : "..json.encode(toDelList).."", DOTA_TEAM_GOODGUYS, 0) + + if not isTop then + CustomGameEventManager:Send_ServerToPlayer(hero:GetPlayerOwner(), "thtd_server_msg", {code = "0000", msg = "你打破了自己的历史记录,但没有超过该阵容的最高波数 "..bestWave..",请再接再厉!", duration = 30}) + return + end + + if rankIndex == 0 then rankIndex = #toplist + 1 end + wavedata["rank_index"] = rankIndex + + if isTeamMode then + Service:UploadRank(playerid, "D", wavedata) + else + Service:UploadRank(playerid, "S", wavedata) + end +end + +-- 显示最大波数信息 +function ShowDetail(hero) + if hero.cards == nil or #hero.cards == 0 then return end + + local wavedata = {} + for i=0,12 do + if (i+1) <= #hero.cards then + wavedata["card"..tostring(i)] = hero.cards[i+1] + else + wavedata["card"..tostring(i)] = "" + end + end + wavedata['wave'] = hero.thtd_game_info["max_wave"] + + CustomGameEventManager:Send_ServerToPlayer(hero:GetPlayerOwner(), "thtd_game_over_detail", wavedata) +end + +-- 检查玩家是否掉线 +function CheckPlayerConnect() + local spawner = SpawnSystem.AttackingSpawner + if spawner == nil or #spawner == 0 then return end + for spawnerIndex,spawnerLine in pairs(spawner) do + local hero = spawnerLine.hero + if (hero:GetPlayerOwner() == nil or hero:GetPlayerOwner():IsNull()) then + if hero.thtd_game_info["is_player_connected"] then + hero.thtd_game_info["is_player_connected"] = false + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="player_disconnect", duration=15, params={count=1}, color="#0ff"} ) + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="{d:count}", duration=15, params={count=hero.thtd_player_id+1}, color="#ff0"}) + CustomGameEventManager:Send_ServerToAllClients("show_message", {msg="pause_game", duration=15, params={}, color="#ff0"}) + if GameRules:IsGamePaused() then PauseGame(false) end + PauseGame(true) + end + else + if not hero.thtd_game_info["is_player_connected"] then hero.thtd_game_info["is_player_connected"] = true end + end + end +end + +-- 每波刷怪结束各线路数据更新,伤害清零,统计更新 +function SpawnSystem:WaveEndForEach() + local spawner = SpawnSystem.AttackingSpawner + if spawner == nil or #spawner == 0 then return end + local wave = SpawnSystem.CurWave + local difficulty = GameRules:GetCustomGameDifficulty() + for spawnerIndex,spawnerLine in pairs(spawner) do + local hero = spawnerLine.hero + if hero.is_game_over ~= true then + local isMaxWave = false + if wave >= SpawnSystem.RankMinWave then + local totalDamage = 0 + for k,v in pairs(hero.thtd_hero_tower_list) do + if v~=nil and v:IsNull()==false then + totalDamage = totalDamage + v:THTD_GetTowerDamage() + end + end + if totalDamage < hero.thtd_wave_total_health * 0.9 then + CustomGameEventManager:Send_ServerToPlayer(hero:GetPlayerOwner(), "display_chat_msg", {msg="damage_less_rank_tip", params={player_name=PlayerResource:GetPlayerName(hero:GetPlayerOwnerID())}}) + else + isMaxWave = true + end + end + -- todo test + -- isMaxWave = true + if isMaxWave then + hero.thtd_game_info["max_wave"] = wave - 50 + hero.thtd_game_info["max_wave_damage"] = 0 + hero.cards = {} + end + + for k,v in pairs(hero.thtd_hero_tower_list) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + if isMaxWave then + hero.thtd_game_info["max_wave_damage"] = hero.thtd_game_info["max_wave_damage"] + v:THTD_GetTowerDamage()/100 + local card = {} + card["itemname"] = v.thtd_item:GetAbilityName() + card["star"] = v:THTD_GetStar() + card["damage"] = math.floor(v:THTD_GetTowerDamage()/100) + card["power"] = math.floor(v:THTD_GetPower() or 0) + card["attack"] = math.floor(v:THTD_GetAttack() or 0) + card["equip"] = {} + for i=0,5 do + local targetItem = v:GetItemInSlot(i) + if targetItem~=nil and targetItem:IsNull()==false then + table.insert(card["equip"], targetItem:GetAbilityName()) + end + end + if #card["equip"] == 0 then card["equip"] = nil end + table.insert(hero.cards, card) + end + if not SpawnSystem.IsUnLimited then + if v:GetUnitName() == "toramaru" and GameRules:GetCustomGameDifficulty() < FUNNY_MODE then + local gold = math.floor(v:THTD_GetTowerDamage() * v:GetAbilityValue("thtd_toramaru_01", "gold_damage_percent")) + THTD_ModifyGoldEx(v:GetPlayerOwnerID(),gold,true,DOTA_ModifyGold_CreepKill) + SendOverheadEventMessage(v:GetPlayerOwner(),OVERHEAD_ALERT_GOLD,v,gold,v:GetPlayerOwner() ) + end + end + v:THTD_ResetTowerDamage() + end + end + hero.thtd_wave_total_health = 0 + + if isMaxWave then + hero.thtd_game_info["max_wave_damage"] = math.floor(hero.thtd_game_info["max_wave_damage"] + 0.5) + table.sort(hero.cards, function(a,b) return a["damage"] > b["damage"] end) --坑:使用 a.damage >= b.damage 会失败 + + local card = {} + card["itemname"] = "item_0028" + card["star"] = 0 + card["damage"] = hero.next_boss_name or 0 -- 最后BOSS + card["power"] = hero.use_item2001_count or 0 --爆弹数量 + card["attack"] = 0 --核心数,js计算 + card["equip"] = hero.bb_buff or {} + if #card["equip"] == 0 then + for i=0,5 do + local targetItem = hero:GetItemInSlot(i) + if targetItem~=nil and targetItem:IsNull()==false then + table.insert(card["equip"], targetItem:GetAbilityName()) + end + end + end + if #card["equip"] == 0 then card["equip"] = nil end + table.insert(hero.cards, 1, card) + end + + -- 清空空值 + local inner = THTD_EntitiesRectInner[hero.thtd_player_id] + if inner ~= nil then + for i = #inner, 1, -1 do + if inner[i]==nil or inner[i]:IsNull() or inner[i]:IsAlive()==false then + table.remove(inner, i) + end + end + end + + if SpawnSystem.IsUnLimited == false and wave >= 30 and wave < 50 and GameRules:GetCustomGameDifficulty() >= FUNNY_MODE then + for i=1,4 do + local item = CreateItem("item_1006", nil, nil) + item.owner_player_id = hero.thtd_player_id + item:SetPurchaser(hero) + item:SetPurchaseTime(1.0) + local pos = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, (i-1) * 130, 150) + CreateItemOnPositionSync(pos, item) + end + end + + -- 战利品奖励关 + SpawnSystem:OnBattleBonusWave(hero) + + -- 战斗中铸就 + if wave > 50 and wave < 1050 and GameRules.player_bb_buff[hero.thtd_player_id]["item_3014"] > 0 then + local bonusTargets = {} + for k,v in pairs(hero.thtd_hero_tower_list) do + local unitName = v:GetUnitName() + if unitName == "reimu" or unitName == "marisa" or unitName == "sanae" or unitName == "alice" then + table.insert(bonusTargets, v) + end + end + if #bonusTargets > 0 then + local bonusWave = SpawnSystem.CurWave - (hero.bb_buff3014_last_wave or 50) + hero.bb_buff3014_last_wave = SpawnSystem.CurWave + local bonusPower = GameRules.player_bb_buff[hero.thtd_player_id]["item_3014"] * bonusWave + for k,v in pairs(bonusTargets) do + v:THTD_AddBasePower(bonusPower) + end + bonusTargets = {} + end + end + + -- 封兽鵺跳关扣减层数 + if SpawnSystem.ReachToWave ~= nil then + local deCount = math.max(0, SpawnSystem.ReachToWave + 50 - wave) * 20 + if deCount > 0 then + for k,v in pairs(hero.thtd_hero_tower_list) do + local unitName = v:GetUnitName() + if unitName == "nue" then + local modifier = v:FindModifierByName("modifier_nue_01_extradamage") + if modifier ~= nil then + modifier:SetStackCount(math.max(1, modifier:GetStackCount() - deCount)) + end + end + end + end + end + + end + end + + -- 清空空值 + if THTD_EntitiesRectOuter ~= nil then + for i = #THTD_EntitiesRectOuter, 1, -1 do + if THTD_EntitiesRectOuter[i]==nil or THTD_EntitiesRectOuter[i]:IsNull() or THTD_EntitiesRectOuter[i]:IsAlive()==false then + table.remove(THTD_EntitiesRectOuter, i) + end + end + end +end + +-- 代替触发器 +local UnitMoveRect = { + [0] = { + [1] = { + ["center"] = {-2200, 1550}, + ["radius"] = 200, + ["tag"] = {2} + }, + [2] = { + ["center"] = {-4100, 1600}, + ["radius"] = 100, + ["tag"] = {3} + }, + [3] = { + ["center"] = {-4100, 4120}, + ["radius"] = 100, + ["tag"] = {4, 7} + }, + [4] = { + ["center"] = {6750, 4120}, + ["radius"] = 100, + ["tag"] = {5, 7} + }, + [5] = { + ["center"] = {6750, -4120}, + ["radius"] = 100, + ["tag"] = {4, 6} + }, + [6] = { + ["center"] = {-6750, -4120}, + ["radius"] = 100, + ["tag"] = {5, 7} + }, + [7] = { + ["center"] = {-6750, 4120}, + ["radius"] = 100, + ["tag"] = {4, 6} + }, + }, + [1] = { + [1] = { + ["center"] = {2200, 1550}, + ["radius"] = 200, + ["tag"] = {2 } + }, + [2] = { + ["center"] = {4100, 1600}, + ["radius"] = 100, + ["tag"] = {3 } + }, + [3] = { + ["center"] = {4100, 4120}, + ["radius"] = 100, + ["tag"] = {4, 7} + }, + [4] = { + ["center"] = {6750, 4120}, + ["radius"] = 100, + ["tag"] = {5, 7} + }, + [5] = { + ["center"] = {6750, -4120}, + ["radius"] = 100, + ["tag"] = {4, 6} + }, + [6] = { + ["center"] = {-6750, -4120}, + ["radius"] = 100, + ["tag"] = {5, 7} + }, + [7] = { + ["center"] = {-6750, 4120}, + ["radius"] = 100, + ["tag"] = {4, 6} + }, + }, + [2] = { + [1] = { + ["center"] = {2200, -1550}, + ["radius"] = 200, + ["tag"] = {2 } + }, + [2] = { + ["center"] = {4100, -1600}, + ["radius"] = 100, + ["tag"] = {3 } + }, + [3] = { + ["center"] = {4100, -4120}, + ["radius"] = 100, + ["tag"] = {5, 6} + }, + [4] = { + ["center"] = {6750, 4120}, + ["radius"] = 100, + ["tag"] = {5, 7} + }, + [5] = { + ["center"] = {6750, -4120}, + ["radius"] = 100, + ["tag"] = {4, 6} + }, + [6] = { + ["center"] = {-6750, -4120}, + ["radius"] = 100, + ["tag"] = {5, 7} + }, + [7] = { + ["center"] = {-6750, 4120}, + ["radius"] = 100, + ["tag"] = {4, 6} + }, + }, + [3] = { + [1] = { + ["center"] = {-2200, -1550}, + ["radius"] = 200, + ["tag"] = {2 } + }, + [2] = { + ["center"] = {-4100, -1600}, + ["radius"] = 100, + ["tag"] = {3 } + }, + [3] = { + ["center"] = {-4100, -4120}, + ["radius"] = 100, + ["tag"] = {5, 6} + }, + [4] = { + ["center"] = {6750, 4120}, + ["radius"] = 100, + ["tag"] = {5, 7} + }, + [5] = { + ["center"] = {6750, -4120}, + ["radius"] = 100, + ["tag"] = {4, 6} + }, + [6] = { + ["center"] = {-6750, -4120}, + ["radius"] = 100, + ["tag"] = {5, 7} + }, + [7] = { + ["center"] = {-6750, 4120}, + ["radius"] = 100, + ["tag"] = {4, 6} + }, + } +} + +-- 代替触发器 +local UnitMoveRectAll = { + [1] = { + ["center"] = {-2200, 1550}, + ["radius"] = 200, + ["tag"] = { + ["left"] = { + { + ["forward"] = "left", + ["index"] = 2 + }, + }, + } + }, + [2] = { + ["center"] = {-4100, 1600}, + ["radius"] = 100, + ["tag"] = { + ["left"] = { + { + ["forward"] = "up", + ["index"] = 3 + }, + }, + } + }, + [3] = { + ["center"] = {-4100, 4120}, + ["radius"] = 100, + ["tag"] = { + ["up"] = { + { + ["forward"] = "left", + ["index"] = 4 + }, + { + ["forward"] = "right", + ["index"] = 5 + }, + }, + } + }, + [4] = { + ["center"] = {-6750, 4120}, + ["radius"] = 100, + ["tag"] = { } + }, + [5] = { + ["center"] = {10, 4120}, + ["radius"] = 100, + ["tag"] = { } + }, +} + +-- 随机BOSS自带buff +local RandomBossBuff = { + "modifier_bosses_random_aura_dark", + "modifier_bosses_random_attack_speed_aura", + "modifier_bosses_random_move_aura", + "modifier_bosses_random_health_aura", + "modifier_bosses_random_dead_heal" +} + +-- 解决草地问题 +local UnitPathFixRect = { + [0] = { + [0] = { -- 靠商店侧 + [1] = Vector(-3600, 1800, 128), --左下角 + [2] = Vector(-2100, 2600, 128), --右上角 + }, + [1] = { -- 靠商店侧 + [1] = Vector(-2100, 1700, 128), --左下角 + [2] = Vector(-1020, 2600, 128), --右上角 + }, + [2] = { -- 拐角 + [1] = Vector(-1900, 1420, 128), --靠内上角 + [2] = Vector(-2700, 100, 128), --靠外下角 + }, + }, + [1] = { + [0] = { -- 靠商店侧 + [1] = Vector(2100, 1800, 128), --左下角 + [2] = Vector(3600, 2600, 128), --右上角 + }, + [1] = { -- 靠商店侧 + [1] = Vector(1020, 1700, 128), + [2] = Vector(2100, 2600, 128), + }, + [2] = { -- 拐角 + [1] = Vector(1900, 1420, 128), + [2] = Vector(2700, 100, 128), + }, + }, + [2] = { + [0] = { -- 靠商店侧 + [1] = Vector(2100, -2600, 128), --左下角 + [2] = Vector(3600, -1800, 128), --右上角 + }, + [1] = { -- 靠商店侧 + [1] = Vector(1020, -2600, 128), + [2] = Vector(2100, -1700, 128), + }, + [2] = { -- 拐角 + [1] = Vector(1900, -1420, 128), + [2] = Vector(2700, -100, 128), + }, + }, + [3] = { + [0] = { -- 靠商店侧 + [1] = Vector(-3600, -2600, 128), --左下角 + [2] = Vector(-2100, -1800, 128), --右上角 + }, + [1] = { -- 靠商店侧 + [1] = Vector(-2100, -2600, 128), + [2] = Vector(-1020, -1700, 128), + }, + [2] = { -- 拐角 + [1] = Vector(-1900, -1420, 128), + [2] = Vector(-2700, -100, 128), + }, + } +} + +-- 刷怪 +function SpawnSystem:StartSpawn() + local spawner = SpawnSystem.AttackingSpawner + if spawner == nil or #spawner == 0 then return end + local difficulty = GameRules:GetCustomGameDifficulty() + + local wave = SpawnSystem.CurWave + local waveInfo = nil + if wave <= 51 then + waveInfo = SpawnSystem.Spawner["Attacking"]["Wave"..tostring(wave)] + else + waveInfo = SpawnSystem.Spawner["Attacking"]["Wave51"] + end + + local count = waveInfo["Count"] + local times = waveInfo["Times"] + local interval = waveInfo["Interval"] + + for spawnerIndex,spawnerLine in pairs(spawner) do + local hero = spawnerLine.hero + if hero.is_game_over ~= true then + local player = hero:GetPlayerOwner() + local playerId = hero:GetPlayerOwnerID() + -- 刷新BOSS信息并重置秋 + if difficulty >= EXTRA_MODE then + if wave > 50 and wave%4 == 3 then + hero.thtd_minoriko_02_change = 0 + THTD_ModifyGoldEx(playerId,3500,true,DOTA_ModifyGold_CreepKill) + for k,v in pairs(hero.thtd_hero_tower_list) do + if v~=nil and v:IsNull()==false and v:IsAlive() then + if v:THTD_IsTower() and v:THTD_GetLevel() times then return nil end + + for i = 1, count do + if hero.is_game_over == true then return nil end + + local spawn_unit = waveInfo["Unit"] + + if difficulty >= EXTRA_MODE and wave > 50 and wave%4 == 0 and spawnerLine.nextBossName ~= nil then + spawn_unit = "creature_bosses_"..spawnerLine.nextBossName + end + + local unit = CreateUnitByName(spawn_unit, spawnerLine:GetOrigin() + RandomVector(400), true, nil, nil, DOTA_TEAM_BADGUYS ) + if unit ~= nil then + unit.thtd_player_index = hero.thtd_player_id + + unit.thtd_damage_incoming_magical_percentage = 0 + unit.thtd_damage_incoming_physical_percentage = 0 + unit.thtd_damage_incoming_pure_percentage = 0 + unit.thtd_damage_block_pure = 0 + unit.thtd_damage_block_physical = 0 + unit.thtd_damage_block_magical = 0 + + unit:AddNewModifier(unit, nil, "modifier_phased", {}) + + if wave > 50 then + local health = math.min(MAX_HEALTH, unit:GetBaseMaxHealth() * SpawnSystem:GetWaveHpFactor()) + unit:SetBaseMaxHealth(health) + unit:SetMaxHealth(health) + unit:SetHealth(health) + + if difficulty >= EXTRA_MODE then + if wave%4 == 0 and spawnerLine.nextBossName ~= nil then + unit:AddNewModifier(unit, nil, "modifier_bosses_"..spawnerLine.nextBossName, nil) + elseif wave%4 ~= 0 and curTimes == randomBossIndex then + unit.is_random_boss = true + health = math.min(MAX_HEALTH, health * 1.5) + unit:SetBaseMaxHealth(health) + unit:SetMaxHealth(health) + unit:SetHealth(health) + unit:SetModelScale(unit:GetModelScale() * 1.5) + + -- 随机Buff + local bossBuffChance = 25 + if wave >= 200 then + bossBuffChance = 100 + elseif wave >= 150 then + bossBuffChance = 75 + elseif wave >= 100 then + bossBuffChance = 50 + end + if RollPercentage(bossBuffChance) then + local modifierName = RandomBossBuff[RandomInt(1, #RandomBossBuff)] + unit:AddNewModifier(unit, nil, modifierName, {}) + if player ~= nil then + CustomGameEventManager:Send_ServerToPlayer(player,"show_message", {msg="random_boss_has_buff", duration=20, params={}, color="#0ff"}) + CustomGameEventManager:Send_ServerToPlayer(player,"show_message", {msg="DOTA_Tooltip_"..modifierName.."_Description", duration=20, params={}, color="#0ff"}) + end + end + end + end + + if GameRules.player_bb_buff[hero.thtd_player_id]["item_3026"] > 0 then + local modifier = unit:AddNewModifier(unit, nil, "modifier_move_speed", nil) + modifier:SetStackCount(800+GameRules.player_bb_buff[hero.thtd_player_id]["item_3026"]) + end + + -- 少女之抵抗 + if wave >= 50 + 250 + 30 then + local unlimitedResist = 0 + if wave <= 50 + 3220 then + unlimitedResist = math.floor((wave - 50 - 250)/30) + else --max: 无尽5218 + unlimitedResist = 99 + math.min(0.999, 0.001 * math.floor((wave - 50 - 3220) / 2)) + end + local modifier = unit:AddNewModifier(unit, nil, "modifier_touhoutd_unlimited_resist", {}) + if modifier ~= nil then + modifier:SetStackCount(math.floor(unlimitedResist)) + end + unit.unlimited_resist = unlimitedResist + end + + hero.thtd_wave_total_health = hero.thtd_wave_total_health + health/100 + else + local modifier = unit:AddNewModifier(unit, nil, "modifier_move_speed", nil) + if modifier ~= nil then + modifier:SetStackCount(math.floor(wave/4)*20) + end + if difficulty == NORMAL_MODE then + unit:AddDamageIncomingAll(30) + end + end + + table.insert(THTD_EntitiesRectInner[hero.thtd_player_id], unit) + + unit.thtd_first_corner = spawnerLine.first_point + unit.first_move_forward = spawnerLine.first_forward + unit.first_move_point = G_path_corner[unit.thtd_first_corner].Vector * 1.5 + + unit.thtd_second_corner = spawnerLine.second_point + unit.second_move_forward = spawnerLine.second_forward + unit.second_move_point = G_path_corner[unit.thtd_second_corner].Vector * 1.5 + + unit.thtd_next_corner = unit.thtd_first_corner + unit.next_move_forward = unit.first_move_forward + unit.next_move_point = unit.first_move_point + + unit:SetContextThink(DoUniqueString("AttackingBase"), + function () + if GameRules:IsGamePaused() then return 0.1 end + if unit == nil or unit:IsNull() or unit:IsAlive() == false then return nil end + + local origin = unit:GetOrigin() + if unit.thtd_is_outer ~= true then + if not(origin.x < 4432 and origin.x > -4432 and origin.y < 3896 and origin.y > -3896) then + unit.thtd_is_outer = true + table.insert(THTD_EntitiesRectOuter,unit) + for k,v in pairs(THTD_EntitiesRectInner[hero.thtd_player_id]) do + if v == unit then + table.remove(THTD_EntitiesRectInner[hero.thtd_player_id],k) + break + end + end + end + + -- 修正卡怪问题 + if unit.thtd_is_fearing ~= true then + if math.abs(origin.x) < math.abs(unit.first_move_point.x) - 150 then + if unit.next_move_point ~= unit.first_move_point then + unit.thtd_next_corner = unit.thtd_first_corner + unit.next_move_forward = unit.first_move_forward + unit.next_move_point = unit.first_move_point + end + else + if math.abs(origin.x) < math.abs(unit.second_move_point.x) - 300 and unit.next_move_point ~= unit.second_move_point then + unit.thtd_next_corner = unit.thtd_second_corner + unit.next_move_forward = unit.second_move_forward + unit.next_move_point = unit.second_move_point + end + end + end + end + unit:MoveToPosition(unit.next_move_point) + + -- 草地路径修正 + if + origin.x > UnitPathFixRect[unit.thtd_player_index][0][1].x and + origin.x < UnitPathFixRect[unit.thtd_player_index][0][2].x and + origin.y > UnitPathFixRect[unit.thtd_player_index][0][1].y and + origin.y < UnitPathFixRect[unit.thtd_player_index][0][2].y then + if unit.thtd_player_index <= 1 then + unit:SetAbsOrigin(Vector(origin.x, UnitPathFixRect[unit.thtd_player_index][0][1].y - 5, UnitPathFixRect[unit.thtd_player_index][0][1].z)) + else + unit:SetAbsOrigin(Vector(origin.x, UnitPathFixRect[unit.thtd_player_index][0][2].y + 10, UnitPathFixRect[unit.thtd_player_index][0][2].z)) + end + elseif + origin.x > UnitPathFixRect[unit.thtd_player_index][1][1].x and + origin.x < UnitPathFixRect[unit.thtd_player_index][1][2].x and + origin.y > UnitPathFixRect[unit.thtd_player_index][1][1].y and + origin.y < UnitPathFixRect[unit.thtd_player_index][1][2].y then + if unit.thtd_player_index <= 1 then + unit:SetAbsOrigin(Vector(origin.x, UnitPathFixRect[unit.thtd_player_index][1][1].y - 5, UnitPathFixRect[unit.thtd_player_index][1][1].z)) + else + unit:SetAbsOrigin(Vector(origin.x, UnitPathFixRect[unit.thtd_player_index][1][2].y + 7, UnitPathFixRect[unit.thtd_player_index][1][2].z)) + end + elseif unit.thtd_player_index == 0 then + if origin.x > UnitPathFixRect[unit.thtd_player_index][2][2].x and + origin.x < UnitPathFixRect[unit.thtd_player_index][2][1].x and + origin.y > UnitPathFixRect[unit.thtd_player_index][2][2].y and + origin.y < UnitPathFixRect[unit.thtd_player_index][2][1].y then + if math.abs(origin.x - UnitPathFixRect[unit.thtd_player_index][2][1].x) > math.abs(origin.y - UnitPathFixRect[unit.thtd_player_index][2][1].y) then + unit:SetAbsOrigin(Vector(origin.x, UnitPathFixRect[unit.thtd_player_index][2][1].y + 10, UnitPathFixRect[unit.thtd_player_index][2][2].z)) + else --y增量要大于移速,防止已切换移动到第二个点拉回来卡住 + unit:SetAbsOrigin(Vector(UnitPathFixRect[unit.thtd_player_index][2][1].x + 5, origin.y + 100, UnitPathFixRect[unit.thtd_player_index][1][1].z)) + end + end + elseif unit.thtd_player_index == 1 then + if origin.x > UnitPathFixRect[unit.thtd_player_index][2][1].x and + origin.x < UnitPathFixRect[unit.thtd_player_index][2][2].x and + origin.y > UnitPathFixRect[unit.thtd_player_index][2][2].y and + origin.y < UnitPathFixRect[unit.thtd_player_index][2][1].y then + if math.abs(origin.x - UnitPathFixRect[unit.thtd_player_index][2][1].x) > math.abs(origin.y - UnitPathFixRect[unit.thtd_player_index][2][1].y) then + unit:SetAbsOrigin(Vector(origin.x, UnitPathFixRect[unit.thtd_player_index][2][1].y + 5, UnitPathFixRect[unit.thtd_player_index][2][2].z)) + else + unit:SetAbsOrigin(Vector(UnitPathFixRect[unit.thtd_player_index][2][1].x - 5, origin.y + 100, UnitPathFixRect[unit.thtd_player_index][1][1].z)) + end + end + elseif unit.thtd_player_index == 2 then + if origin.x > UnitPathFixRect[unit.thtd_player_index][2][1].x and + origin.x < UnitPathFixRect[unit.thtd_player_index][2][2].x and + origin.y > UnitPathFixRect[unit.thtd_player_index][2][1].y and + origin.y < UnitPathFixRect[unit.thtd_player_index][2][2].y then + if math.abs(origin.x - UnitPathFixRect[unit.thtd_player_index][2][1].x) > math.abs(origin.y - UnitPathFixRect[unit.thtd_player_index][2][1].y) then + unit:SetAbsOrigin(Vector(origin.x, UnitPathFixRect[unit.thtd_player_index][2][1].y - 5, UnitPathFixRect[unit.thtd_player_index][2][2].z)) + else + unit:SetAbsOrigin(Vector(UnitPathFixRect[unit.thtd_player_index][2][1].x - 5, origin.y - 100, UnitPathFixRect[unit.thtd_player_index][1][1].z)) + end + end + elseif unit.thtd_player_index == 3 then + if origin.x > UnitPathFixRect[unit.thtd_player_index][2][2].x and + origin.x < UnitPathFixRect[unit.thtd_player_index][2][1].x and + origin.y > UnitPathFixRect[unit.thtd_player_index][2][1].y and + origin.y < UnitPathFixRect[unit.thtd_player_index][2][2].y then + if math.abs(origin.x - UnitPathFixRect[unit.thtd_player_index][2][1].x) > math.abs(origin.y - UnitPathFixRect[unit.thtd_player_index][2][1].y) then + unit:SetAbsOrigin(Vector(origin.x, UnitPathFixRect[unit.thtd_player_index][2][1].y - 5, UnitPathFixRect[unit.thtd_player_index][2][2].z)) + else + unit:SetAbsOrigin(Vector(UnitPathFixRect[unit.thtd_player_index][2][1].x + 5, origin.y - 100, UnitPathFixRect[unit.thtd_player_index][1][1].z)) + end + end + end + + -- 替代触发器 + -- for k,v in pairs(UnitMoveRect[unit.thtd_player_index]) do + -- if GetDistanceBetweenTwoVec2D(unit:GetOrigin(), Vector(v["center"][1],v["center"][2]),0) <= v["radius"] then + -- if unit.current_rect_id ~= k then + -- unit.current_rect_id = k + -- local tagIndex = v["tag"][RandomInt(1, #v["tag"])] + -- unit.next_move_point = Vector(UnitMoveRect[unit.thtd_player_index][tagIndex]["center"][1],UnitMoveRect[unit.thtd_player_index][tagIndex]["center"][2],0) + -- unit:MoveToPosition(unit.next_move_point) + -- end + -- break + -- end + -- end + + UnitDamageApply(unit) + + return 0.15 + end, + 0) + end + end + + curTimes = curTimes + 1 + return interval + end, + 0) + end + end +end + + +-- 刷新宝箱 +local chest_list = { + [1] = { + ["chest"] = nil, + ["pos"] = Vector(-2245, 2866, 0) + }, + [2] = { + ["chest"] = nil, + ["pos"] = Vector(2320, 3176, 0) + }, + [3] = { + ["chest"] = nil, + ["pos"] = Vector(2360, -2607, 0) + }, + [4] = { + ["chest"] = nil, + ["pos"] = Vector(-2230, -3013, 0) + }, +} +function SpawnSystem:SpawnChest() + for i=1,#SpawnSystem.AttackingSpawner do + if IsValidEntity(chest_list[i]["chest"]) == false then + local item = CreateItem("item_310"..tostring(RandomInt(1, 3)), nil, nil) + if item ~= nil then + local drop = CreateItemOnPositionSync(Vector(0, 0, 0), item) + if drop ~= nil then + drop:SetModelScale(drop:GetModelScale() * 2) + item:LaunchLoot(false, 600, 0.75, chest_list[i]["pos"]) + chest_list[i]["chest"] = item + end + end + end + end +end + +-- 无尽生命成长倍数,addWave为取前后多少波(负前正后),默认为当前波 +function SpawnSystem:GetWaveHpFactor() + local wave = SpawnSystem.CurWave - 50 + + if wave > 250 then + return (wave - 250) * 100 + 9700 + elseif wave > 240 then + return (wave - 240) * 95 + 8750 + elseif wave > 230 then + return (wave - 230) * 90 + 7850 + elseif wave > 220 then + return (wave - 220) * 85 + 7000 + elseif wave > 210 then + return (wave - 210) * 80 + 6200 + elseif wave > 200 then + return (wave - 200) * 75 + 5450 + elseif wave > 190 then + return (wave - 190) * 70 + 4750 + elseif wave > 180 then + return (wave - 180) * 65 + 4100 + elseif wave > 170 then + return (wave - 170) * 60 + 3500 + elseif wave > 160 then + return (wave - 160) * 55 + 2950 + elseif wave > 150 then + return (wave - 150) * 50 + 2450 + elseif wave > 140 then + return (wave - 140) * 45 + 2000 + elseif wave > 130 then + return (wave - 130) * 40 + 1600 + elseif wave > 120 then + return (wave - 120) * 35 + 1250 + elseif wave > 110 then + return (wave - 110) * 30 + 950 + elseif wave > 100 then + return (wave - 100) * 25 + 700 + elseif wave > 90 then + return (wave - 90) * 20 + 500 + elseif wave > 80 then + return (wave - 80) * 16 + 340 + elseif wave > 70 then + return (wave - 70) * 12 + 220 + elseif wave > 60 then + return (wave - 60) * 8 + 140 + elseif wave > 50 then + return (wave - 50) * 4 + 100 + elseif wave > 0 then + return wave * 2 + else + return 1 + end +end + +-- 清除已移除刷怪点 +function SpawnSystem:ClearRemovedSpawner() + local spawner = SpawnSystem.AttackingSpawner + if spawner == nil or #spawner == 0 then return end + for i = #spawner, 1, -1 do + if spawner[i].hero.is_game_over == true then + THTD_EntitiesRectInner[spawner[i].hero.thtd_player_id] = {} + table.remove(spawner, i) + end + end +end + +-- 刷新漏怪最大数 +function SpawnSystem:RefreshCreepMaxCount() + for _,hero in pairs(GameRules.HeroList) do + if SpawnSystem.IsUnLimited then + hero.thtd_game_info["creep_count_max"] = 20 + else + hero.thtd_game_info["creep_count_max"] = 30 * SpawnSystem:GetCount() + end + end +end + + +-- 战利品奖励,同步更新下pet对应技能 + +local T1 = { + "item_2004", + "item_3022", --金币满箱 +} +local T2 = { + "item_2022", + "item_2003", + + "item_3012", --幸运者的烦恼 + "item_3018", --亲友折扣 + "item_3029", --四季馈赠 +} +local T3 = { + "item_2002", + "item_2012", + "item_2013", + "item_2014", + + "item_3017", --一线希望 + "item_3019", --绝望手段 + "item_3020", --扩大阵容 + "item_3026", --口袋细沙 +} +local T4 = { + "item_2001", + + "item_3013", --无敌意识 负页效果降低 + "item_3014", --战斗中铸就 主角 + "item_3016", --召唤神石 + "item_3030", --人多力量大 分身 + "item_3021", --邪恶意念 秒杀 +} +local T5 = { + "item_3011", --烁热同盟 地灵殿 + "item_3015", --失去天恩 月之民 + "item_3028", --大力一击 鬼族 + "item_3023", --虹吸意图 神灵庙 + "item_3024", --香火长存 守矢神社 + "item_3025", --终极闪烁 红魔馆 + "item_3027", --鉴宝大师 星莲船 +} + +local battle_bonus_list = +{ + [10] = { + [1] = T1, + [2] = T2, + }, + [20] = { + [1] = T2, + [2] = T3, + }, + [30] = { + [1] = T3, + [2] = T4, + }, + [40] = { + [1] = T4, + [2] = T5, + }, + [50] = { + [1] = T5, + [2] = {}, + }, +} + +-- 战利品奖励 +function SpawnSystem:OnBattleBonusWaveOld(hero) + if SpawnSystem.IsUnLimited then return end + + local wave = SpawnSystem.CurWave + if battle_bonus_list[wave] == nil then return end + + local bonusList1 = {} + local bonusList2 = {} + + for k,v in pairs(battle_bonus_list[wave][1]) do + table.insert(bonusList1, v) + end + for k,v in pairs(battle_bonus_list[wave][2]) do + table.insert(bonusList2, v) + end + + local maxCount = 2 + if hero.reimu_pet.pet_level >= 20 then + maxCount = 4 + math.floor(hero.reimu_pet.pet_level/20) + elseif hero.reimu_pet.pet_level >= 10 then + maxCount = 4 + elseif hero.reimu_pet.pet_level >= 5 then + maxCount = 3 + end + if GameRules.GameData.is_open_day == 1 then maxCount = math.max(5, maxCount) end + + local select_cards = {} + + for i=1,maxCount do + local chance = RandomInt(1,100) + if #bonusList2 == 0 then chance = 100 end + if chance > 30 and #bonusList1 > 0 then + local k = RandomInt(1, #bonusList1) + select_cards[bonusList1[k]] = bonusList1[k] + table.remove(bonusList1, k) + elseif #bonusList2 > 0 then + local k = RandomInt(1, #bonusList2) + select_cards[bonusList2[k]] = bonusList2[k] + table.remove(bonusList2, k) + end + end + + bonusList1 = {} + bonusList2 = {} + + for i=maxCount+1, 5 do + select_cards["item_3050_"..tostring(i)] = "item_3050" + end + + CustomGameEventManager:Send_ServerToPlayer(hero:GetPlayerOwner(), "show_select_bonus_card_panel", {cards=select_cards}) +end + +-- 战利品奖励 +function SpawnSystem:OnBattleBonusWave(hero) + if SpawnSystem.IsUnLimited then return end + + local wave = SpawnSystem.CurWave + if battle_bonus_list[wave] == nil then return end + + -- 调整为改善运营 + + local bonusList1 = {} + local bonusList2 = {} + local chanceBonusPoint = 30 + + if wave == 10 then + for k,v in pairs(towerNameList) do + if v["quality"] == 2 and v["cardname"] ~= "BonusEgg" then + table.insert(bonusList1, k) + end + end + elseif wave == 20 then + for k,v in pairs(towerNameList) do + if v["quality"] == 2 and v["cardname"] ~= "BonusEgg" then + table.insert(bonusList1, k) + elseif v["quality"] == 3 and v["cardname"] ~= "BonusEgg" then + table.insert(bonusList2, k) + end + end + elseif wave == 30 then + for k,v in pairs(towerNameList) do + if v["quality"] == 3 and v["cardname"] ~= "BonusEgg" then + table.insert(bonusList1, k) + elseif v["quality"] == 4 and v["cardname"] ~= "BonusEgg" then + table.insert(bonusList2, k) + end + end + elseif wave == 40 then + chanceBonusPoint = 50 + for k,v in pairs(towerNameList) do + if v["quality"] == 3 and v["cardname"] ~= "BonusEgg" then + table.insert(bonusList1, k) + elseif v["quality"] == 4 and v["cardname"] ~= "BonusEgg" then + table.insert(bonusList2, k) + end + end + elseif wave == 50 then + for k,v in pairs(towerNameList) do + if v["quality"] == 4 and v["cardname"] ~= "BonusEgg" then + table.insert(bonusList1, k) + end + end + end + + local maxCount = 3 + if hero.reimu_pet.pet_level >= 5 then + maxCount = 3 + math.floor(hero.reimu_pet.pet_level/5) + end + if GameRules.GameData.is_open_day == 1 then maxCount = math.max(6, maxCount) end + + local select_cards = {} + + for i=1,maxCount do + local chance = RandomInt(1,100) + if #bonusList2 == 0 then chance = 100 end + if chance > chanceBonusPoint and #bonusList1 > 0 then + local k = RandomInt(1, #bonusList1) + select_cards[bonusList1[k]] = bonusList1[k] + table.remove(bonusList1, k) + elseif #bonusList2 > 0 then + local k = RandomInt(1, #bonusList2) + select_cards[bonusList2[k]] = bonusList2[k] + table.remove(bonusList2, k) + end + end + + if maxCount < #bonusList1 + #bonusList2 then + select_cards["item_3050"] = "item_3050" + end + + bonusList1 = {} + bonusList2 = {} + + CustomGameEventManager:Send_ServerToPlayer(hero:GetPlayerOwner(), "show_select_bonus_card_panel", {cards=select_cards}) +end \ No newline at end of file diff --git a/scripts/vscripts/system/tower.lua b/scripts/vscripts/system/tower.lua new file mode 100755 index 0000000..2e78a1e --- /dev/null +++ b/scripts/vscripts/system/tower.lua @@ -0,0 +1,2643 @@ +THTD_MAX_LEVEL = 10 +THTD_MAX_ITEM_SLOT = 9 +THTD_ITEM_TPSCROLL_SLOT = 15 +THTD_ITEM_Neutral_SLOT = 16 + +thtd_exp_table={200,500,900,1400,2000,2700,3500,4400,5400} +thtd_exp_star_table={1,2/3,1/3,1/5,1/15} +-- 总和5400 +-- 经验分配规则 保底 1X每只30点 2X每只20点,3X每只10点,4X每只6点,5X每只3点 +-- 单吃一个兵经验 300点 200点 100点 60点 30点 +-- 经验获取率1X 100% 2X 2/3 3X 1/3 4X 1/5 5X 1/10 +-- 素材培养 (1000+素材卡牌经验/5)* 星级 + +towerPlayerList = {[1] = {}, [2] = {}, [3] = {},[4] = {}} + +towerNameList = table.loadkv("scripts/npc/tower.txt") + +local thtd_power_table = table.loadkv("scripts/npc/power_table.txt") +local thtd_attack_factor = table.loadkv("scripts/npc/attack_factor.txt") +local thtd_ability_table = table.loadkv("scripts/npc/ability_table.txt") +local thtd_combo_table = table.loadkv("scripts/npc/combo_table.txt") + + + +-------------------------------------------------- + +-- 初始化tower +function CDOTA_BaseNPC:THTD_InitExp() + self.thtd_star = 1 + self.thtd_level = 1 + self.thtd_exp = 0 + self.thtd_is_ex = false + self.thtd_is_tower = true + self.thtd_close_ai = false + self.thtd_tower_damage = 0 + + if self:GetUnitName() == "minoriko" or self:GetUnitName() == "sizuha" then + if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE and self:GetUnitName() == "minoriko" then + self.thtd_star = 3 + end + self.thtd_level = THTD_MAX_LEVEL + self.thtd_exp = thtd_exp_table[THTD_MAX_LEVEL - 1] + self.thtd_is_changed = false + if GameRules:GetCustomGameDifficulty() < FUNNY_MODE and SpawnSystem.IsUnLimited ~= true then + local time_count = 0 + local add = 0 + self:SetContextThink(DoUniqueString("thtd_minoriko_star_up_listen"), + function() + if GameRules:IsGamePaused() then return 0.03 end + if self == nil or self:IsNull() or self:IsAlive() == false then return nil end + if SpawnSystem.IsUnLimited then return nil end + + if self.thtd_star < 5 and self:THTD_IsHidden() == false then + if self.thtd_is_changed == true then + time_count = 0 + self.thtd_is_changed = false + end + + local totalTime = self:GetAbilityValue("thtd_"..self:GetUnitName().."_01", "grow_time") + + add = 1 + self:GetAbilityValue("ability_common_star_up_speed", "speed_tooltips", true) + time_count = time_count + add + + -- OVERHEAD_ALERT_OUTGOING_DAMAGE + SendOverheadEventMessage(self:GetPlayerOwner(), OVERHEAD_ALERT_BONUS_POISON_DAMAGE, self, math.max(0, totalTime - time_count), self:GetPlayerOwner() ) + + if time_count >= totalTime then + self.thtd_star = self.thtd_star + 1 + self:THTD_OpenAbility() + self:THTD_DestroyLevelEffect() + self:THTD_CreateLevelEffect() + time_count = 0 + if self.thtd_star == 5 then + EmitSoundOn(THTD_GetVoiceEvent(self:GetUnitName(),"spawn"),self) + CustomGameEventManager:Send_ServerToPlayer(self:GetPlayerOwner() , "show_message", {msg=self:GetUnitName().."_up_to_5_star", duration=30, params={}, color="#ff0"} ) + end + end + end + return 1.0 + end, + 1.0) + end + end + + self.thtd_power = self:THTD_GetGrowPower() + self.thtd_power_percentage = 0 + + self.thtd_attack = self:THTD_GetGrowAttack() + self.thtd_attack_percentage = 0 + + self.thtd_crit_chance = 0 + self.thtd_crit_damage = 0 + self:THTD_AddCritDamage(50) + self:THTD_AddCritChance(5) + + self.thtd_mana_regen = self:GetManaRegen() + self.thtd_mana_regen_percentage = 0 + self.thtd_mana_cost_reduce_percentage = 0 + + self.thtd_attack_speed_bonus = 0 + self.thtd_cooldown_percentage = 0 + + self.thtd_extra_star_damage = 0 + + self.thtd_damage_magical_percentage = 0 + self.thtd_damage_physical_percentage = 0 + self.thtd_damage_pure_percentage = 0 + + self:THTD_CreateLevelEffect() + self:SetHasInventory(true) + self:THTD_OpenAbility() + + self:THTD_RefreshPowerUI() + self:THTD_RefreshAttack() +end + + + +-------------------------------------------------- + +function CDOTA_BaseNPC:THTD_IsTower() + return self.thtd_is_tower or false +end + +function CDOTA_BaseNPC:THTD_IsHidden() + if self:HasModifier("modifier_touhoutd_release_hidden") then + return true + end + return false +end + +function CDOTA_BaseNPC:GetHero() + if self:GetTeamNumber() == DOTA_TEAM_GOODGUYS then + -- local player = PlayerResource:GetPlayer(self:GetPlayerOwnerID()) + -- return player:GetAssignedHero() + return GameRules.HeroList[self:GetPlayerOwnerID()] + elseif self.thtd_player_index ~= nil then + return GameRules.HeroList[self.thtd_player_index] + end + return nil +end + +function THTD_IsTowerInList(hero,towername) + for k,v in pairs(hero.thtd_hero_tower_list) do + if v~=nil and v:IsNull() == false then + if v:GetUnitName() == towername then + return true + end + end + end + return false +end + +function THTD_GetCombo(tower) + local comboTable = {} + for index,value in pairs(thtd_combo_table) do + local count = 0 + local isInCombo = false + + for k,v in pairs(value) do + if THTD_IsTowerInList(tower:GetOwner(),v) == true then + count = count + 1 + end + if tower:GetUnitName() == v then + isInCombo = true + end + end + if count == #value and isInCombo == true then + comboTable[index] = value + end + end + + if comboTable ~= nil then + return comboTable + end + return nil +end + +function CDOTA_BaseNPC:THTD_HeroComboRefresh() + local hero = GameRules.HeroList[self:GetPlayerOwnerID()] + if hero == nil then return end + + for index,tower in pairs(hero.thtd_hero_tower_list) do + if THTD_IsValid(tower) then + local combo = THTD_GetCombo(tower) + local func = tower["THTD_"..tower:GetUnitName().."_thtd_combo"] + if func then + local changeCombo = func(tower,combo) + if changeCombo ~= nil and #changeCombo > 0 then + for k,v in pairs(changeCombo) do + v["unit"] = tower + local exist = false + for k2,v2 in pairs(hero.thtd_combo_voice_array) do + if v2["unit"] == v["unit"] then + exist = true + break + end + end + if exist == false then + table.insert(hero.thtd_combo_voice_array, v) + end + end + changeCombo = {} + end + else + local changeCombo = tower:THTD_Set_Combo(combo) + if changeCombo ~= nil and #changeCombo > 0 then + for k,v in pairs(changeCombo) do + v["unit"] = tower + local exist = false + for k2,v2 in pairs(hero.thtd_combo_voice_array) do + if v2["unit"] == v["unit"] then + exist = true + break + end + end + if exist == false then + table.insert(hero.thtd_combo_voice_array, v) + end + end + changeCombo = {} + end + end + end + end + + hero:SetContextThink(DoUniqueString("thtd_combo_voice_array"), + function() + if hero.is_game_over == true then return nil end + if hero.thtd_combo_voice_array == nil or #hero.thtd_combo_voice_array == 0 then + hero.sound_lock = nil + return nil + end + + for k,v in pairs(hero.thtd_combo_voice_array) do + if v~=nil and v["comboName"] == "lyrica_lunasa_merlin" then + if v["unit"]~=nil and v["unit"]:IsNull()==false then + EmitSoundOn(THTD_GetVoiceEvent(v["unit"]:GetUnitName(),"combo."..v["comboName"]),v["unit"]) + table.remove(hero.thtd_combo_voice_array,k) + end + elseif v~=nil and hero.sound_lock == nil then + hero.sound_lock = true + hero:SetContextThink(DoUniqueString("wait_voice_play_end"), + function() + hero.sound_lock = false + return nil + end, + v["delay"]+0.5) + elseif v~=nil and hero.sound_lock == false then + hero.sound_lock = true + if v["unit"]~=nil and v["unit"]:IsNull()==false then + EmitSoundOn(THTD_GetVoiceEvent(v["unit"]:GetUnitName(),"combo."..v["comboName"]),v["unit"]) + end + hero:SetContextThink(DoUniqueString("wait_voice_play_end"), + function() + hero.sound_lock = false + table.remove(hero.thtd_combo_voice_array,k) + return nil + end, + v["duration"]+0.5) + end + end + return 0.5 + end, + 0) +end + + + +-------------------------------------------------- + +function CDOTA_BaseNPC:THTD_GetExp() + return self.thtd_exp +end + +function CDOTA_BaseNPC:THTD_AddExp(exp) + self.thtd_exp = self.thtd_exp + exp * thtd_exp_star_table[self.thtd_star] + self:THTD_ExpToLevelUp() +end + +function CDOTA_BaseNPC:THTD_ExpToLevelUp() + if self:THTD_GetLevel() < THTD_MAX_LEVEL then + if self.thtd_exp >= thtd_exp_table[self.thtd_level] then + if self.thtd_exp >= thtd_exp_table[THTD_MAX_LEVEL-1] then + self:THTD_SetLevel(THTD_MAX_LEVEL) + return + end + for i=self.thtd_level,(THTD_MAX_LEVEL-1) do + if self.thtd_exp < thtd_exp_table[i] then + self:THTD_SetLevel(i) + return + end + end + end + end +end + +function CDOTA_BaseNPC:THTD_GetLevel() + return self.thtd_level +end + +function CDOTA_BaseNPC:THTD_SetLevel(level) + if level > THTD_MAX_LEVEL then + level = THTD_MAX_LEVEL + end + if level == self.thtd_level then + return + end + + local lastPower = self:THTD_GetGrowPower() + local lastAttack = self:THTD_GetGrowAttack() + + self.thtd_level = level + if self.thtd_level == THTD_MAX_LEVEL then + self.thtd_exp = thtd_exp_table[THTD_MAX_LEVEL-1] + 1 + end + + self.thtd_power = self.thtd_power - lastPower + self:THTD_GetGrowPower() + self.thtd_attack = self.thtd_attack - lastAttack + self:THTD_GetGrowAttack() + + local effectIndex = ParticleManager:CreateParticle("particles/econ/events/ti6/hero_levelup_ti6_godray.vpcf", PATTACH_CUSTOMORIGIN, self) + ParticleManager:SetParticleControl(effectIndex, 0, self:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + self:EmitSound("Sound_THTD.thtd_level_up") + + self:THTD_DestroyLevelEffect() + self:THTD_CreateLevelEffect() + + self:THTD_RefreshPowerUI() + self:THTD_RefreshAttack() +end + +function CDOTA_BaseNPC:THTD_LevelUp(level) + if self.thtd_level == THTD_MAX_LEVEL then + return + end + if level == nil then + level = 1 + end + + local lastPower = self:THTD_GetGrowPower() + local lastAttack = self:THTD_GetGrowAttack() + + self.thtd_level = math.min(THTD_MAX_LEVEL, self.thtd_level + level) + self.thtd_exp = thtd_exp_table[self.thtd_level-1] + + self.thtd_power = self.thtd_power - lastPower + self:THTD_GetGrowPower() + self.thtd_attack = self.thtd_attack - lastAttack + self:THTD_GetGrowAttack() + + local effectIndex = ParticleManager:CreateParticle("particles/econ/events/ti6/hero_levelup_ti6_godray.vpcf", PATTACH_CUSTOMORIGIN, self) + ParticleManager:SetParticleControl(effectIndex, 0, self:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + self:EmitSound("Sound_THTD.thtd_level_up") + + self:THTD_DestroyLevelEffect() + self:THTD_CreateLevelEffect() + + self:THTD_RefreshPowerUI() + self:THTD_RefreshAttack() +end + + + +-------------------------------------------------- + +function CDOTA_BaseNPC:THTD_GetStar() + return self.thtd_star +end + +function CDOTA_BaseNPC:THTD_SetStar(star) + if star > 5 then + star = 5 + end + if star == self.thtd_star then + return + end + + local lastPower = self:THTD_GetGrowPower() + local lastAttack = self:THTD_GetGrowAttack() + + self.thtd_star = star + self.thtd_level = 1 + self.thtd_exp = 0 + + self.thtd_power = self.thtd_power - lastPower + self:THTD_GetGrowPower() + self.thtd_attack = self.thtd_attack - lastAttack + self:THTD_GetGrowAttack() + + self:THTD_DestroyLevelEffect() + self:THTD_CreateLevelEffect() + self:SetMana(0) + self:THTD_OpenAbility() + + self:EmitSound("Sound_THTD.thtd_star_up") + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/byakuren/ability_byakuren_02.vpcf", PATTACH_CUSTOMORIGIN, self) + ParticleManager:SetParticleControl(effectIndex, 0, self:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, self:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + self:THTD_RefreshPowerUI() + self:THTD_RefreshAttack() + self:THTD_HeroComboRefresh() +end + +function CDOTA_BaseNPC:THTD_StarUp() + if self.thtd_star == 5 then + return + end + + local lastPower = self:THTD_GetGrowPower() + local lastAttack = self:THTD_GetGrowAttack() + + self.thtd_star = self.thtd_star + 1 + self.thtd_level = 1 + self.thtd_exp = 0 + + self.thtd_power = self.thtd_power - lastPower + self:THTD_GetGrowPower() + self.thtd_attack = self.thtd_attack - lastAttack + self:THTD_GetGrowAttack() + + self:THTD_DestroyLevelEffect() + self:THTD_CreateLevelEffect() + self:SetMana(0) + self:THTD_OpenAbility() + + self:EmitSound("Sound_THTD.thtd_star_up") + + local effectIndex = ParticleManager:CreateParticle("particles/heroes/byakuren/ability_byakuren_02.vpcf", PATTACH_CUSTOMORIGIN, self) + ParticleManager:SetParticleControl(effectIndex, 0, self:GetOrigin()) + ParticleManager:SetParticleControl(effectIndex, 1, self:GetOrigin()) + ParticleManager:DestroyParticleSystem(effectIndex,false) + + self:THTD_RefreshPowerUI() + self:THTD_RefreshAttack() + self:THTD_HeroComboRefresh() +end + +function CDOTA_BaseNPC:THTD_CreateLevelEffect() + if self.thtd_is_effect_open == true then return end + self.thtd_level_effect = ParticleManager:CreateParticle("particles/thtd/msg/thtd_msg_level.vpcf", PATTACH_CUSTOMORIGIN, self) + if self.thtd_level < 10 then + ParticleManager:SetParticleControl(self.thtd_level_effect, 0, self:GetOrigin()) + ParticleManager:SetParticleControl(self.thtd_level_effect, 2, Vector(0,1,0)) + ParticleManager:SetParticleControl(self.thtd_level_effect, 3, Vector(0,self.thtd_level,0)) + else + ParticleManager:SetParticleControl(self.thtd_level_effect, 0, self:GetOrigin()) + ParticleManager:SetParticleControl(self.thtd_level_effect, 2, Vector(0,2,0)) + ParticleManager:SetParticleControl(self.thtd_level_effect, 3, Vector(0,10,0)) + end + + self.thtd_star_effect = ParticleManager:CreateParticle("particles/thtd/msg/thtd_msg_star.vpcf", PATTACH_CUSTOMORIGIN, self) + + ParticleManager:SetParticleControl(self.thtd_star_effect, 0, self:GetOrigin()) + ParticleManager:SetParticleControl(self.thtd_star_effect, 2, Vector(0,self.thtd_star,0)) + ParticleManager:SetParticleControl(self.thtd_star_effect, 3, Vector(0,0,0)) + self.thtd_is_effect_open = true +end + +function CDOTA_BaseNPC:THTD_DestroyLevelEffect() + ParticleManager:DestroyParticleSystem(self.thtd_level_effect,true) + ParticleManager:DestroyParticleSystem(self.thtd_star_effect,true) + self.thtd_is_effect_open = false +end + +local thtd_bonus_ability_table = +{ + "ability_common_attack_speed_buff", + "ability_common_power_buff", + "ability_common_mana_regen_buff", + "ability_common_decrease_armor_buff", + "ability_common_decrease_magic_armor_buff", + "ability_common_star_up_speed", +} + +function CDOTA_BaseNPC:THTD_SetAbilityLevelUp() + for k,v in pairs(thtd_bonus_ability_table) do + local ability=self:FindAbilityByName(v) + if ability ~= nil then + if ability:GetLevel() < ability:GetMaxLevel() then + ability:SetLevel(ability:GetLevel()+1) + end + end + end +end + +function CDOTA_BaseNPC:THTD_OpenAbility() + local unitName = self:GetUnitName() + if self:THTD_IsTowerEx() == true then + unitName = unitName.."_ex" + end + -- 如果技能有光环,需要设置光环非被动,命名固定为 modifier_技能名_aura,且在 AbilitySpecial 中定义 open_aura_level 大于0,技能类型必须为 ability_datadriven + for k,v in pairs(thtd_ability_table[unitName]) do + for abilityName,level in pairs(v) do + local ability = self:FindAbilityByName(abilityName) + if ability ~= nil then + if self:THTD_GetStar() == k then + if ability:GetLevel() ~= level then + local auraName = "modifier_"..abilityName.."_aura" + if level < 1 then + local auraLevel = ability:GetSpecialValueFor("open_aura_level") + if auraLevel > 0 and self:HasModifier(auraName) then + self:RemoveModifierByName(auraName) + end + ability:SetLevel(level) + ability:SetActivated(false) + self[abilityName.."bonus_level"] = nil + else + ability:SetActivated(true) + ability:SetLevel(level) + self[abilityName.."bonus_level"] = nil + local auraLevel = ability:GetSpecialValueFor("open_aura_level") + if auraLevel > 0 then + if level >= auraLevel then + if self:HasModifier(auraName) == false then + ability:ApplyDataDrivenModifier(self, self, auraName, nil) + end + else + if self:HasModifier(auraName) then + self:RemoveModifierByName(auraName) + end + end + end + end + end + + -- local kv = ability:GetAbilityKeyValues() + -- if kv["Modifiers"] ~= nil then + -- for k2,v2 in pairs(kv["Modifiers"]) do + -- print(k2) + -- PrintTable(v2) + -- if v2["Passive"] == 1 and self:HasModifier(k2) == false then + -- print("-----------add") + -- ability:ApplyDataDrivenModifier(self, self, k2, nil) + -- end + -- end + -- end + + end + end + end + end +end + +function CDOTA_BaseNPC:THTD_UpgradeEx() + local unitName = self:GetUnitName() + local star = self:THTD_GetStar() + local level = self:THTD_GetLevel() + + for k,v in pairs(thtd_ability_table[unitName]) do + for abilityName,level in pairs(v) do + if self:THTD_GetStar() == k then + self:RemoveAbility(abilityName) + end + end + end + unitName = self:GetUnitName().."_ex" + + for k,v in pairs(thtd_ability_table[unitName]) do + for abilityName,level in pairs(v) do + if self:THTD_GetStar() == k then + local ability=self:AddAbility(abilityName) + ability:SetLevel(level) + end + end + end + + self:THTD_SetStar(1) + self:THTD_SetLevel(1) + self.thtd_is_ex = true + self:THTD_SetStar(star) + self:THTD_SetLevel(level) +end + +function CDOTA_BaseNPC:THTD_IsTowerEx() + return self.thtd_is_ex or false +end + + +-- 获取每波塔的总伤害量,单位百 +function CDOTA_BaseNPC:THTD_GetTowerDamage() + if not self:THTD_IsTower() then + return 0 + end + return self.thtd_tower_damage +end + +-- 累计塔的伤害量,自动除以100 +function CDOTA_BaseNPC:THTD_AddTowerDamage(damage) + if not self:THTD_IsTower() then + return + end + self.thtd_tower_damage = self.thtd_tower_damage + damage/100 +end + +-- 重置塔的伤害量 +function CDOTA_BaseNPC:THTD_ResetTowerDamage() + if not self:THTD_IsTower() then + return + end + self.thtd_tower_damage = 0 +end + + + +-------------------------------------------------- + +local thtd_mana_regen_black_list = +{ + "lily", +} + +function CDOTA_BaseNPC:IsInManaRegenBlackList() + for k,v in pairs(thtd_mana_regen_black_list) do + if self:GetUnitName() == v then + return true + end + end + return false +end + +-- 增加魔法恢复百分比并刷新,线性叠加 +function CDOTA_BaseNPC:THTD_AddManaRegenPercentage(bonus, uniqueString) + if self.thtd_mana_regen_percentage == nil then + return + end + if self:IsInManaRegenBlackList() then + return + end + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_mana_regen" + if self[uniqueString] ~= nil then + self.thtd_mana_regen_percentage = self.thtd_mana_regen_percentage - self[uniqueString] + self[uniqueString] = nil + end + else + if uniqueString == nil then + self.thtd_mana_regen_percentage = self.thtd_mana_regen_percentage + bonus + else + uniqueString = uniqueString.."_mana_regen" + self.thtd_mana_regen_percentage = self.thtd_mana_regen_percentage + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + -- print("----- THTD_AddManaRegenPercentage : ", bonus) + -- print("thtd_mana_regen_percentage : ", self.thtd_mana_regen_percentage) + self:THTD_RefreshManaRegen() +end + +-- 获取魔法恢复百分比 +function CDOTA_BaseNPC:THTD_GetManaRegenPercentage() + if self.thtd_mana_regen_percentage == nil then + return 0 + end + return math.max(-100, self.thtd_mana_regen_percentage) +end + +function CDOTA_BaseNPC:THTD_RefreshManaRegen() + if self.thtd_mana_regen == nil then + return + end + local mana_regen = self.thtd_mana_regen * (1 + self:THTD_GetManaRegenPercentage()/100) + if math.abs(self:GetManaRegen() - mana_regen) > 0.1 then + self:SetBaseManaRegen(mana_regen) + end +end + + + +-------------------------------------------------- + +-- 增加魔法消耗降低百分比,乘法叠加,0-99 +function CDOTA_BaseNPC:AddManaCostReducePercent(bonus, uniqueString) + if self.thtd_mana_cost_reduce_percentage == nil then + return + end + + if self.mana_cost_reduce_table == nil then + self.mana_cost_reduce_table = {} + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_mana_cost_reduce" + if self.mana_cost_reduce_table[uniqueString] ~= nil then + local percent = 100 + for k,v in pairs(self.mana_cost_reduce_table) do + if k ~= uniqueString and v ~= nil then + percent = percent * (1-v/100) + end + end + self.thtd_mana_cost_reduce_percentage = math.floor(100 - percent) + self.mana_cost_reduce_table[uniqueString] = nil + end + else + if bonus == nil then + bonus = 0 + end + if uniqueString == nil then + uniqueString = "common" + end + uniqueString = uniqueString.."_mana_cost_reduce" + self.mana_cost_reduce_table[uniqueString] = bonus + local percent = 100 + for k,v in pairs(self.mana_cost_reduce_table) do + if v ~= nil then + percent = percent * (1-v/100) + end + end + self.thtd_mana_cost_reduce_percentage = math.floor(100 - percent) + end + + local modifierName = "modifier_manacost_reduce_percent" + local count = self:GetManaCostReducePercent() + if count == 0 then + self:RemoveModifierByName(modifierName) + return + end + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, {}) + modifier:SetStackCount(count) +end + +-- 获取魔法消耗降低百分比,0-99 +function CDOTA_BaseNPC:GetManaCostReducePercent() + return math.min(99, math.max(0, self.thtd_mana_cost_reduce_percentage or 0)) +end + +-- 获取技能真实魔法消耗,技能未激活测为0 +function CDOTA_BaseNPC:GetRealManaCost(ability) + if ability:GetLevel() < 1 then + return 0 + end + return ability:GetManaCost(-1) * (1 - self:GetManaCostReducePercent()/100) + -- ability:GetManaCost(-1) 和 ability:GetManaCost(ability:GetLevel()-1)都是当前等级数值 +end + + + +-------------------------------------------------- + +-- 获取卡名对应的种类(大写SSR SR R N),无则返回字符NULL +function THTD_GetCardQualityText(unitName) + local quality = 0 + for k,v in pairs(towerNameList) do + if v["cardname"] == unitName then + quality = v["quality"] + break + end + end + if quality == 1 then + return "N" + elseif quality == 2 then + return "R" + elseif quality == 3 then + return "SR" + elseif quality == 4 then + return "SSR" + else + return "NULL" + end +end + +-- 获取成长属性能量 +function CDOTA_BaseNPC:THTD_GetGrowPower() + local unitName = self:GetUnitName() + if self:THTD_IsTowerEx() == true then + unitName = unitName.."_ex" + end + if thtd_power_table[unitName] == nil then + thtd_power_table[unitName] = thtd_power_table[THTD_GetCardQualityText(unitName)] + end + return math.floor(thtd_power_table[unitName][self.thtd_star][1] + thtd_power_table[unitName][self.thtd_star][2] * (self:THTD_GetLevel()-1)) +end + +-- 增加基础能量值 +function CDOTA_BaseNPC:THTD_AddBasePower(bonus, uniqueString) + if self.thtd_power == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_power" + if self[uniqueString] ~= nil then + self.thtd_power = self.thtd_power - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_power = self.thtd_power + bonus + else + uniqueString = uniqueString.."_power" + self.thtd_power = self.thtd_power + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + self:THTD_RefreshPowerUI() +end + +-- 获取基础能量 +function CDOTA_BaseNPC:THTD_GetBasePower() + return math.max(0, self.thtd_power or 0) +end + +-- 增加能量提升百分比,线性叠加 +function CDOTA_BaseNPC:THTD_AddPowerPercentage(bonus, uniqueString) + if self.thtd_power_percentage == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_power_percent" + if self[uniqueString] ~= nil then + self.thtd_power_percentage = self.thtd_power_percentage - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_power_percentage = self.thtd_power_percentage + bonus + else + uniqueString = uniqueString.."_power_percent" + self.thtd_power_percentage = self.thtd_power_percentage + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + self:THTD_RefreshPowerUI() +end + +-- 获取能量提升百分比 +function CDOTA_BaseNPC:THTD_GetPowerPercentage() + return math.max(-100, self.thtd_power_percentage or 0) +end + +-- 获取最终能量 +function CDOTA_BaseNPC:THTD_GetPower() + if self.thtd_power == nil then + return 0 + end + local base = self:THTD_GetBasePower() + return base + math.floor(base * self:THTD_GetPowerPercentage()/100) +end + +-- 更新UI显示,单位视野必须设置为800 +function CDOTA_BaseNPC:THTD_RefreshPowerUI() + self:SetDayTimeVisionRange(self:THTD_GetBasePower() + 800) + self:SetNightTimeVisionRange(self:THTD_GetPowerPercentage() + 800) +end + + + +-------------------------------------------------- + +-- 获取成长属性攻击力 +function CDOTA_BaseNPC:THTD_GetGrowAttack() + local unitName = self:GetUnitName() + if self:THTD_IsTowerEx() == true then + unitName = unitName.."_ex" + end + local power = self:THTD_GetGrowPower() + if thtd_attack_factor[unitName] == nil then + thtd_attack_factor[unitName] = 1 + end + return math.floor(power * thtd_attack_factor[unitName]) +end + +-- 增加基础攻击力 +function CDOTA_BaseNPC:THTD_AddBaseAttack(bonus, uniqueString) + if self.thtd_attack == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_attack" + if self[uniqueString] ~= nil then + self.thtd_attack = self.thtd_attack - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_attack = self.thtd_attack + bonus + else + uniqueString = uniqueString.."_attack" + self.thtd_attack = self.thtd_attack + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + self:THTD_RefreshAttack() +end + +-- 获取基础攻击力 +function CDOTA_BaseNPC:THTD_GetBaseAttack() + return math.max(0, self.thtd_attack or 0) +end + +-- 增加攻击力提升百分比,线性叠加 +function CDOTA_BaseNPC:THTD_AddAttackPercentage(bonus, uniqueString) + if self.thtd_attack_percentage == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_attack_percent" + if self[uniqueString] ~= nil then + self.thtd_attack_percentage = self.thtd_attack_percentage - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_attack_percentage = self.thtd_attack_percentage + bonus + else + uniqueString = uniqueString.."_attack_percent" + self.thtd_attack_percentage = self.thtd_attack_percentage + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + self:THTD_RefreshAttack() +end + +-- 获取攻击力提升百分比 +function CDOTA_BaseNPC:THTD_GetAttackPercentage() + return math.max(-100, self.thtd_attack_percentage or 0) +end + +-- 获取总攻击力 +function CDOTA_BaseNPC:THTD_GetAttack() + if self.thtd_attack == nil then + return 0 + end + local base = self:THTD_GetBaseAttack() + return base + math.floor(base * self:THTD_GetAttackPercentage()/100) +end + +-- 更新攻击力 +function CDOTA_BaseNPC:THTD_RefreshAttack() + self:SetBaseDamageMin(self:THTD_GetBaseAttack()) + self:SetBaseDamageMax(self:THTD_GetBaseAttack()) + + local modifierName = "modifier_base_attack_bonus_percent" + local count = self:THTD_GetAttackPercentage() + if count == 0 then + self:RemoveModifierByName(modifierName) + return + end + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, {}) + if count > 0 then + modifier:SetStackCount(count) + else + modifier:SetStackCount(5000-count) + end +end + + + +-------------------------------------------------- + +-- 获取单位技能伤害:星级 * 能量 +function CDOTA_BaseNPC:THTD_GetStarDamage() + if self.thtd_power == nil then + return 0 + end + return self:THTD_GetStar() * self:THTD_GetPower() +end + +-- 获取技能伤害,能量点*星级*系数,系数在技能的 AbilitySpecial 中定义,固定名称 power_damage,如果有多个则为 power_damage1,power_damage2,... +function CDOTA_BaseNPC:THTD_GetAbilityPowerDamage(ability, index) + if not self:THTD_IsTower() then + print("---------- THTD_GetAbilityPowerDamage Error!") + print(self:GetUnitName().." is not tower") + return 0 + end + + if ability == nil then + print("---------- THTD_GetAbilityPowerDamage Error!") + print("ability is nil") + return 0 + end + + -- 如果没有定义则会返回0 + local itemName = "power_damage" + if index ~= nil then + itemName = itemName..tostring(index) + end + local v = ability:GetSpecialValueFor(itemName) + + return self:THTD_GetStarDamage() * v +end + + + +-------------------------------------------------- + +local thtd_attack_speed_black_list = +{ + "nazrin", + "iku" +} + +function CDOTA_BaseNPC:IsInAttackSpeedBlackList() + if SpawnSystem.IsUnLimited then + return false + end + for k,v in pairs(thtd_attack_speed_black_list) do + if self:GetUnitName() == v then + return true + end + end + return false +end + +-- 增加攻速,可负值,并刷新 +function CDOTA_BaseNPC:THTD_AddAttackSpeed(bonus, uniqueString, is_no_black) + if self.thtd_attack_speed_bonus == nil then + return + end + if is_no_black ~= true and self:IsInAttackSpeedBlackList() then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_attack_speed" + if self[uniqueString] ~= nil then + self.thtd_attack_speed_bonus = self.thtd_attack_speed_bonus - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_attack_speed_bonus = self.thtd_attack_speed_bonus + bonus + else + uniqueString = uniqueString.."_attack_speed" + self.thtd_attack_speed_bonus = self.thtd_attack_speed_bonus + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + local modifierName = "modifier_attack_speed" + local count = self.thtd_attack_speed_bonus + if count == 0 then + self:RemoveModifierByName(modifierName) + return + end + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, {}) + if count > 0 then + modifier:SetStackCount(count) + else + modifier:SetStackCount(800-count) + end +end + +-- 攻速及攻击力继承主人 +local inherit_attack_modifiers = +{ + "modifier_attack_speed", + "modifier_base_attack_bonus_percent", + "modifier_touhoutd_crit_damage", + "modifier_touhoutd_crit_chance", +} + +function CDOTA_BaseNPC:InheritOwnerBuff(caster) + for _,v in pairs(inherit_attack_modifiers) do + local modifier = caster:FindModifierByName(v) + if modifier ~= nil then + local modifier2 = self:FindModifierByName(v) or self:AddNewModifier(caster, nil, v, {}) + if modifier2 ~= nil then + modifier2:SetStackCount(modifier:GetStackCount()) + end + elseif self:HasModifier(v) then + self:RemoveModifierByName(v) + end + end +end + + + +-------------------------------------------------- + +local thtd_cooldown_black_list = +{ + "daiyousei", + "toramaru", +} + +function CDOTA_BaseNPC:IsInCooldownBlackList() + for k,v in pairs(thtd_cooldown_black_list) do + if self:GetUnitName() == v then + return true + end + end + return false +end + +-- CD降低百分比,加法叠加,负值增加CD +function CDOTA_BaseNPC:THTD_AddCooldownPercentage(bonus, uniqueString) + if self.thtd_cooldown_percentage == nil then + return + end + if self:IsInCooldownBlackList() then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_cooldown" + if self[uniqueString] ~= nil then + self.thtd_cooldown_percentage = self.thtd_cooldown_percentage - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_cooldown_percentage = self.thtd_cooldown_percentage + bonus + else + uniqueString = uniqueString.."_cooldown" + self.thtd_cooldown_percentage = self.thtd_cooldown_percentage + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + local modifierName = "modifier_cooldown_reduce" + local count = self.thtd_cooldown_percentage + if count == 0 then + self:RemoveModifierByName(modifierName) + return + end + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, {}) + if count > 0 then + modifier:SetStackCount(count) + else + modifier:SetStackCount(800-count) + end +end + +-- ability:GetCooldownTime()获取技能各种加成后的实际总冷却时间, +-- ability:GetCooldown(ability:GetLevel()-1)或ability:GetCooldown(-1)获取当前技能等级原本总冷却时间 + +-- 技能重新进入冷却,todo删除 +function CDOTA_BaseNPC:ReCooldown(ability, substractCd) + ability:EndCooldown() + ability:StartCooldown(ability:GetCooldown(-1)-substractCd) +end + + + +-------------------------------------------------- + +-- 增加爆击伤害 +function CDOTA_BaseNPC:THTD_AddCritDamage(bonus, uniqueString) + if self.thtd_crit_damage == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_crit" + if self[uniqueString] ~= nil then + self.thtd_crit_damage = self.thtd_crit_damage - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_crit_damage = self.thtd_crit_damage + bonus + else + uniqueString = uniqueString.."_crit" + self.thtd_crit_damage = self.thtd_crit_damage + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + local modifierName = "modifier_touhoutd_crit_damage" + local count = self:THTD_GetCritDamage() + if count == 0 then + self:RemoveModifierByName(modifierName) + return + end + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, {}) + modifier:SetStackCount(count) +end + +-- 获取爆击伤害,最低值为0 +function CDOTA_BaseNPC:THTD_GetCritDamage() + return math.max(0, self.thtd_crit_damage or 0) +end + +-- 增加爆击概率 +function CDOTA_BaseNPC:THTD_AddCritChance(bonus, uniqueString) + if self.thtd_crit_chance == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_chance" + if self[uniqueString] ~= nil then + self.thtd_crit_chance = self.thtd_crit_chance - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_crit_chance = self.thtd_crit_chance + bonus + else + uniqueString = uniqueString.."_chance" + self.thtd_crit_chance = self.thtd_crit_chance + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + local modifierName = "modifier_touhoutd_crit_chance" + local count = self:THTD_GetCritChance() + if count == 0 then + self:RemoveModifierByName(modifierName) + return + end + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, {}) + modifier:SetStackCount(count) +end + +-- 获取爆击伤害,最低值为0 +function CDOTA_BaseNPC:THTD_GetCritChance() + return math.max(0, self.thtd_crit_chance or 0) +end + + + +-------------------------------------------------- + +-- 卡牌附加星能伤害,百分比,正负值,如果值为7位数,则在指定条件时降低伤害,如4505000表示伤害超过4星能时则降低50%,后面的5000为固定部分 +function CDOTA_BaseNPC:AddExtraStarDamagePercentage(bonus, uniqueString) + if self.thtd_extra_star_damage == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_star_damage_percent" + if self[uniqueString] ~= nil then + self.thtd_extra_star_damage = self.thtd_extra_star_damage - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_extra_star_damage = self.thtd_extra_star_damage + bonus + else + uniqueString = uniqueString.."_star_damage_percent" + self.thtd_extra_star_damage = self.thtd_extra_star_damage + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end +end + +--获取卡牌附加星能伤害,百分比,正值为增加,负值为降低 +function CDOTA_BaseNPC:GetExtraStarDamagePercentage() + return self.thtd_extra_star_damage or 0 +end + + + +-------------------------------------------------- + +-- 卡牌增加魔法输出提升百分比,0到999 +function CDOTA_BaseNPC:AddDamageOutgoingMagical(bonus, uniqueString) + if self.thtd_damage_magical_percentage == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_out_magical" + if self[uniqueString] ~= nil then + self.thtd_damage_magical_percentage = self.thtd_damage_magical_percentage - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_damage_magical_percentage = self.thtd_damage_magical_percentage + bonus + else + uniqueString = uniqueString.."_out_magical" + self.thtd_damage_magical_percentage = self.thtd_damage_magical_percentage + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + self.thtd_damage_magical_percentage = math.min(999, math.max(0, self.thtd_damage_magical_percentage)) + + local modifierName = "modifier_touhoutd_damage_outgoing_magical" + local count = self.thtd_damage_magical_percentage + + if count == 0 then + self:RemoveModifierByName(modifierName) + return + end + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, {}) + modifier:SetStackCount(count) +end + +--获取卡牌魔法输出提升,没有则返回0 +function CDOTA_BaseNPC:GetDamageOutgoingMagical() + return self.thtd_damage_magical_percentage or 0 +end + +-- 卡牌增加物理输出提升百分比,0到999 +function CDOTA_BaseNPC:AddDamageOutgoingPhysical(bonus, uniqueString) + if self.thtd_damage_physical_percentage == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_out_physical" + if self[uniqueString] ~= nil then + self.thtd_damage_physical_percentage = self.thtd_damage_physical_percentage - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_damage_physical_percentage = self.thtd_damage_physical_percentage + bonus + else + uniqueString = uniqueString.."_out_physical" + self.thtd_damage_physical_percentage = self.thtd_damage_physical_percentage + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + self.thtd_damage_physical_percentage = math.min(999, math.max(0, self.thtd_damage_physical_percentage)) + + local modifierName = "modifier_touhoutd_damage_outgoing_physical" + local count = self.thtd_damage_physical_percentage + if count == 0 then + self:RemoveModifierByName(modifierName) + return + end + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, {}) + modifier:SetStackCount(count) +end + +--获取卡牌物理输出提升,没有则返回0 +function CDOTA_BaseNPC:GetDamageOutgoingPhysical() + return self.thtd_damage_physical_percentage or 0 +end + +-- 卡牌增加纯粹输出提升百分比,0到999 +function CDOTA_BaseNPC:AddDamageOutgoingPure(bonus, uniqueString) + if self.thtd_damage_pure_percentage == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_out_pure" + if self[uniqueString] ~= nil then + self.thtd_damage_pure_percentage = self.thtd_damage_pure_percentage - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_damage_pure_percentage = self.thtd_damage_pure_percentage + bonus + else + uniqueString = uniqueString.."_out_pure" + self.thtd_damage_pure_percentage = self.thtd_damage_pure_percentage + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + self.thtd_damage_pure_percentage = math.min(999, math.max(0, self.thtd_damage_pure_percentage)) + + local modifierName = "modifier_touhoutd_damage_outgoing_pure" + local count = self.thtd_damage_pure_percentage + if count == 0 then + self:RemoveModifierByName(modifierName) + return + end + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, {}) + modifier:SetStackCount(count) +end + +--获取卡牌纯粹输出提升,没有则返回0,百分比已转换为小数 +function CDOTA_BaseNPC:GetDamageOutgoingPure() + return self.thtd_damage_pure_percentage or 0 +end + +-- 卡牌增加所有类型输出提升百分比,0到999 +function CDOTA_BaseNPC:AddDamageOutgoingAll(bonus, uniqueString) + self:AddDamageOutgoingMagical(bonus, uniqueString) + self:AddDamageOutgoingPhysical(bonus, uniqueString) + self:AddDamageOutgoingPure(bonus, uniqueString) +end + + + +-------------------------------------------------- + +-- 怪受到纯粹伤害加深百分比,0到999 +function CDOTA_BaseNPC:AddDamageIncomingPure(bonus, uniqueString) + if self.thtd_damage_incoming_pure_percentage == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_in_pure" + if self[uniqueString] ~= nil then + self.thtd_damage_incoming_pure_percentage = self.thtd_damage_incoming_pure_percentage - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_damage_incoming_pure_percentage = self.thtd_damage_incoming_pure_percentage + bonus + else + uniqueString = uniqueString.."_in_pure" + self.thtd_damage_incoming_pure_percentage = self.thtd_damage_incoming_pure_percentage + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + self.thtd_damage_incoming_pure_percentage = math.min(999, math.max(0, self.thtd_damage_incoming_pure_percentage)) + + local modifierName = "modifier_touhoutd_damage_incoming_pure" + local count = self.thtd_damage_incoming_pure_percentage + if count == 0 then + self:RemoveModifierByName(modifierName) + return + end + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, {}) + modifier:SetStackCount(count) +end + +--获取怪受到纯粹伤害加深,没有则返回0 +function CDOTA_BaseNPC:GetDamageIncomingPure() + return self.thtd_damage_incoming_pure_percentage or 0 +end + +-- 怪受到物理伤害加深百分比,0到999 +function CDOTA_BaseNPC:AddDamageIncomingPhysical(bonus, uniqueString) + if self.thtd_damage_incoming_physical_percentage == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_in_physical" + if self[uniqueString] ~= nil then + self.thtd_damage_incoming_physical_percentage = self.thtd_damage_incoming_physical_percentage - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_damage_incoming_physical_percentage = self.thtd_damage_incoming_physical_percentage + bonus + else + uniqueString = uniqueString.."_in_physical" + self.thtd_damage_incoming_physical_percentage = self.thtd_damage_incoming_physical_percentage + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + self.thtd_damage_incoming_physical_percentage = math.min(999, math.max(0, self.thtd_damage_incoming_physical_percentage)) + + local modifierName = "modifier_touhoutd_damage_incoming_physical" + local count = self.thtd_damage_incoming_physical_percentage + if count == 0 then + self:RemoveModifierByName(modifierName) + return + end + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, {}) + modifier:SetStackCount(count) +end + +--获取怪受到物理伤害加深,没有则返回0 +function CDOTA_BaseNPC:GetDamageIncomingPhysical() + return self.thtd_damage_incoming_physical_percentage or 0 +end + +-- 怪受到魔法伤害加深百分比,0到999 +function CDOTA_BaseNPC:AddDamageIncomingMagical(bonus, uniqueString) + if self.thtd_damage_incoming_magical_percentage == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_in_magical" + if self[uniqueString] ~= nil then + self.thtd_damage_incoming_magical_percentage = self.thtd_damage_incoming_magical_percentage - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_damage_incoming_magical_percentage = self.thtd_damage_incoming_magical_percentage + bonus + else + uniqueString = uniqueString.."_in_magical" + self.thtd_damage_incoming_magical_percentage = self.thtd_damage_incoming_magical_percentage + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end + + self.thtd_damage_incoming_magical_percentage = math.min(999, math.max(0, self.thtd_damage_incoming_magical_percentage)) + + local modifierName = "modifier_touhoutd_damage_incoming_magical" + local count = self.thtd_damage_incoming_magical_percentage + if count == 0 then + self:RemoveModifierByName(modifierName) + return + end + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, {}) + modifier:SetStackCount(count) +end + +--获取怪受到魔法伤害加深,没有则返回0 +function CDOTA_BaseNPC:GetDamageIncomingMagical() + return self.thtd_damage_incoming_magical_percentage or 0 +end + +-- 怪受到所有类型伤害加深百分比,0到999 +function CDOTA_BaseNPC:AddDamageIncomingAll(bonus, uniqueString) + self:AddDamageIncomingMagical(bonus, uniqueString) + self:AddDamageIncomingPhysical(bonus, uniqueString) + self:AddDamageIncomingPure(bonus, uniqueString) +end + + + +-------------------------------------------------- + +-- 怪抵挡纯粹伤害数据,正值为抵挡,负值为附加 +function CDOTA_BaseNPC:AddDamageBlockPure(bonus, uniqueString) + if self.thtd_damage_block_pure == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_block_pure" + if self[uniqueString] ~= nil then + self.thtd_damage_block_pure = self.thtd_damage_block_pure - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_damage_block_pure = self.thtd_damage_block_pure + bonus + else + uniqueString = uniqueString.."_block_pure" + self.thtd_damage_block_pure = self.thtd_damage_block_pure + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end +end + +--获取怪抵挡纯粹伤害数据,正值为抵挡,负值为附加 +function CDOTA_BaseNPC:GetDamageBlockPure() + return self.thtd_damage_block_pure or 0 +end + +-- 怪抵挡物理伤害数据,正值为抵挡,负值为附加 +function CDOTA_BaseNPC:AddDamageBlockPhysical(bonus, uniqueString) + if self.thtd_damage_block_physical == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_block_physical" + if self[uniqueString] ~= nil then + self.thtd_damage_block_physical = self.thtd_damage_block_physical - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_damage_block_physical = self.thtd_damage_block_physical + bonus + else + uniqueString = uniqueString.."_block_physical" + self.thtd_damage_block_physical = self.thtd_damage_block_physical + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end +end + +--获取怪抵挡物理伤害数据,正值为抵挡,负值为附加 +function CDOTA_BaseNPC:GetDamageBlockPhysical() + return self.thtd_damage_block_physical or 0 +end + +-- 怪抵挡魔法伤害数据,正值为抵挡,负值为附加 +function CDOTA_BaseNPC:AddDamageBlockMagical(bonus, uniqueString) + if self.thtd_damage_block_magical == nil then + return + end + + if type(bonus) == "string" and uniqueString == nil then + uniqueString = bonus.."_block_magical" + if self[uniqueString] ~= nil then + self.thtd_damage_block_magical = self.thtd_damage_block_magical - self[uniqueString] + self[uniqueString] = nil + end + else + bonus = math.floor(bonus + 0.5) + if uniqueString == nil then + self.thtd_damage_block_magical = self.thtd_damage_block_magical + bonus + else + uniqueString = uniqueString.."_block_magical" + self.thtd_damage_block_magical = self.thtd_damage_block_magical + bonus - (self[uniqueString] or 0) + self[uniqueString] = bonus + end + end +end + +--获取怪抵挡魔法伤害数据,正值为抵挡,负值为附加 +function CDOTA_BaseNPC:GetDamageBlockMagical() + return self.thtd_damage_block_magical or 0 +end + +-- 怪受到所有类型伤害加深百分比,0到999 +function CDOTA_BaseNPC:AddDamageBlockAll(bonus, uniqueString) + self:AddDamageBlockMagical(bonus, uniqueString) + self:AddDamageBlockPhysical(bonus, uniqueString) + self:AddDamageBlockPure(bonus, uniqueString) +end + + + +-------------------------------------------------- + +function CDOTA_BaseNPC:THTD_GetFaith() + if not self:HasModifier("modifier_sanae_04_combo_buff") then + return 0 + end + + local hero = GameRules.HeroList[self:GetPlayerOwnerID()] + if hero == nil then return 0 end + return hero.thtd_ss_faith or 0 +end + +function CDOTA_BaseNPC:THTD_AddFaith() + if not self:HasModifier("modifier_sanae_04_combo_buff") then + return + end + + local hero = GameRules.HeroList[self:GetPlayerOwnerID()] + if hero == nil then return end + + if hero.thtd_ss_faith == nil then + hero.thtd_ss_faith = 0 + end + + if hero.thtd_ss_faith == 999 then + return + end + + hero.thtd_ss_faith = math.min(999, hero.thtd_ss_faith + 1) + for k,v in pairs(hero.thtd_hero_tower_list) do + if v:HasModifier("modifier_sanae_04_combo_buff") then + v:FindModifierByName("modifier_sanae_04_combo_buff"):SetStackCount(hero.thtd_ss_faith) + v:THTD_AddBasePower(math.floor(hero.thtd_ss_faith/3), "thtd_sanae_04_combo_buff") + end + end +end + + + +local thtd_Unique_Slow_Buff = +{ + "modifier_cirno_01_slow_buff", + "modifier_merlin_01_debuff", + "modifier_satori_01_debuff", + "modifier_thdots_ran02_debuff", + "modifier_sanae_debuff", + "modifier_minamitsu_01_slow_buff", + "modifier_yoshika_01_slow", + "modifier_medicine_01_slow", + "modifier_star_01_slow", + "modifier_suika_01_slow_debuff", + "modifier_hina_01_slow_debuff", + "modifier_earthshock_debuff_datadriven", +} + +function THTD_IsUniqueSlowBuff(modifierName) + for index,name in pairs(thtd_Unique_Slow_Buff) do + if name == modifierName then + return true + end + end + return false +end + +function CDOTA_BaseNPC:THTD_HasUniqueSlowBuff() + local modifiers = self:FindAllModifiers() + local count = 0 + + for k,v in pairs(modifiers) do + for index,name in pairs(thtd_Unique_Slow_Buff) do + if v:GetName() == name then + count = count + 1 + end + end + end + if count > 1 then + return true + end + + return false +end + + + +-------------------------------------------------- + +local thtd_equip_table = +{ + ["item_2005"] = + { + ["single"] = + { + ["attack_percentage"] = 10, + }, + ["suit"] = + { + [2] = { + ["attack_percentage"] = 30, + }, + [4] = { + ["modifier"] = "modifier_item_2005_attack_aura", + }, + }, + }, + ["item_2006"] = + { + ["single"] = + { + ["mana_regen_percentage"] = 4, + }, + ["suit"] = + { + [2] = { + ["mana_regen_percentage"] = 10, + }, + [4] = { + ["modifier"] = "modifier_item_2006_mana_regen_aura", + }, + }, + }, + ["item_2007"] = + { + ["single"] = + { + ["mana_regen_percentage"] = 4, + }, + ["suit"] = + { + [2] = { + ["mana_regen_percentage"] = 10, + }, + [4] = { + ["modifier"] = "modifier_item_2008_slow_aura", + }, + }, + }, + ["item_2008"] = + { + ["single"] = + { + ["crit_chance"] = 4, + }, + ["suit"] = + { + [2] = { + ["crit_chance"] = 10, + }, + [4] = { + ["crit_damage"] = 100, + }, + }, + }, + ["item_2009"] = + { + ["single"] = + { + ["magical_damage_percentage"] = 5, + ["power"] = 10, + }, + ["suit"] = + { + [2] = { + ["magical_damage_percentage"] = 15, + ["power"] = 25, + }, + [4] = { + ["modifier"] = "modifier_item_2009_damage", + }, + }, + }, + ["item_2010"] = + { + ["single"] = + { + ["physical_damage_percentage"] = 5, + ["power"] = 10, + }, + ["suit"] = + { + [2] = { + ["physical_damage_percentage"] = 15, + ["power"] = 25, + }, + [4] = { + ["modifier"] = "modifier_item_2010_damage", + }, + }, + }, + ["item_2011"] = + { + ["single"] = + { + ["attack"] = 20, + ["power"] = 10, + }, + ["suit"] = + { + [2] = { + ["attack"] = 50, + ["power"] = 25, + }, + [4] = { + ["crit_damage"] = 150, + ["modifier"] = "modifier_item_2011_attack_stun", + }, + }, + }, + ["item_2012"] = + { + ["single"] = + { + ["magical_damage_percentage"] = 10, + }, + ["suit"] = + { + [2] = { + ["magical_damage_percentage"] = 25, + }, + [4] = { + ["modifier"] = "modifier_item_2012_magical_damage_aura", + }, + }, + }, + ["item_2013"] = + { + ["single"] = + { + ["physical_damage_percentage"] = 10, + }, + ["suit"] = + { + [2] = { + ["physical_damage_percentage"] = 25, + }, + [4] = { + ["modifier"] = "modifier_item_2013_physical_damage_aura", + }, + }, + }, + ["item_2014"] = + { + ["single"] = + { + ["damage_percentage"] = 10, + }, + ["suit"] = + { + [2] = { + ["damage_percentage"] = 20, + }, + [4] = { + ["modifier"] = "modifier_item_2014_damage_aura", + }, + }, + }, + ["item_2015"] = + { + ["single"] = + { + ["crit_chance"] = 5, + }, + ["suit"] = + { + [2] = { + ["crit_chance"] = 20, + }, + [4] = { + ["crit_chance"] = 45, + }, + }, + }, + ["item_2016"] = + { + ["single"] = + { + ["damage_percentage"] = 5, + ["mana_regen_percentage"] = 5, + }, + ["suit"] = + { + [2] = { + ["damage_percentage"] = 6, + ["mana_regen_percentage"] = 10, + }, + [4] = { + ["cooldown"] = 25, + }, + }, + }, + ["item_2017"] = + { + ["single"] = + { + ["attack_speed"] = 10, + }, + ["suit"] = + { + [2] = { + ["attack_speed"] = 25, + }, + [4] = { + ["attack_speed"] = 45, + }, + }, + }, + ["item_2018"] = + { + ["single"] = + { + ["attack"] = 15, + ["power"] = 5, + }, + ["suit"] = + { + [2] = { + ["attack"] = 45, + ["power"] = 15, + }, + [4] = { + ["attack"] = 70, + ["crit_chance"] = 30, + -- ["modifier"] = "modifier_item_2018_bonus_attack_range", + }, + }, + }, + ["item_2019"] = + { + ["single"] = + { + ["power_percentage"] = 4, + }, + ["suit"] = + { + [2] = { + ["power_percentage"] = 12, + }, + [4] = { + ["power"] = 40, + }, + }, + }, + ["item_2020"] = + { + ["single"] = + { + ["power"] = 20, + }, + ["suit"] = + { + [2] = { + ["power"] = 60, + }, + [4] = { + ["extra_star_percentage"] = 200, + }, + }, + }, +} + +local equip_bonus_table = +{ + ["mana_regen_percentage"] = "THTD_AddManaRegenPercentage", + ["cooldown"] = "THTD_AddCooldownPercentage", + ["attack"] = "THTD_AddBaseAttack", + ["attack_percentage"] = "THTD_AddAttackPercentage", + ["attack_speed"] = "THTD_AddAttackSpeed", + ["crit_chance"] = "THTD_AddCritChance", + ["crit_damage"] = "THTD_AddCritDamage", + ["power"] = "THTD_AddBasePower", + ["power_percentage"] = "THTD_AddPowerPercentage", + ["magical_damage_percentage"] = "AddDamageOutgoingMagical", + ["physical_damage_percentage"] = "AddDamageOutgoingPhysical", + ["damage_percentage"] = "AddDamageOutgoingAll", + ["extra_star_percentage"] = "AddExtraStarDamagePercentage", +} + +function CDOTA_BaseNPC:GetItemEquipCount(itemName, exclude_item) + -- OnEquip和OnUnequip有bug,需要一个延时 + local count = 0 + for i=0,5 do + local targetItem = self:GetItemInSlot(i) + if targetItem ~= nil and targetItem:IsNull() == false then + if targetItem:GetAbilityName() == itemName and targetItem ~= exclude_item then + count = count + 1 + end + end + end + return count +end + +function CDOTA_BaseNPC:ItemEquipBonus(item) + local itemName = item:GetAbilityName() + local itemCount = self:GetItemEquipCount(itemName) + print(itemName.." count : ", itemCount) + + local playerid = self:GetPlayerOwnerID() + local countBonus = 0 + if GameRules.player_bb_buff[playerid]["item_3027"] > 0 and THTD_IsStarLotusTower(self) then + countBonus = GameRules.player_bb_buff[playerid]["item_3027"] + end + + if (itemCount + countBonus) >= 4 then + for bonusName,bonus in pairs(thtd_equip_table[itemName]["single"]) do + self:ItemBonusAdd(itemName, bonusName, "single", bonus * itemCount) + end + for bonusName,bonus in pairs(thtd_equip_table[itemName]["suit"][2]) do + self:ItemBonusAdd(itemName, bonusName, "suit2", bonus) + end + for bonusName,bonus in pairs(thtd_equip_table[itemName]["suit"][4]) do + self:ItemBonusAdd(itemName, bonusName, "suit4", bonus) + end + elseif itemCount >= 2 then + for bonusName,bonus in pairs(thtd_equip_table[itemName]["single"]) do + self:ItemBonusAdd(itemName, bonusName, "single", bonus * itemCount) + end + for bonusName,bonus in pairs(thtd_equip_table[itemName]["suit"][2]) do + self:ItemBonusAdd(itemName, bonusName, "suit2", bonus) + end + for bonusName,bonus in pairs(thtd_equip_table[itemName]["suit"][4]) do + self:ItemBonusRemove(itemName, bonusName, "suit4", bonus) + end + elseif itemCount > 0 then + for bonusName,bonus in pairs(thtd_equip_table[itemName]["single"]) do + self:ItemBonusAdd(itemName, bonusName, "single", bonus * itemCount) + end + for bonusName,bonus in pairs(thtd_equip_table[itemName]["suit"][2]) do + self:ItemBonusRemove(itemName, bonusName, "suit2", bonus) + end + for bonusName,bonus in pairs(thtd_equip_table[itemName]["suit"][4]) do + self:ItemBonusRemove(itemName, bonusName, "suit4", bonus) + end + else + for bonusName,bonus in pairs(thtd_equip_table[itemName]["single"]) do + self:ItemBonusRemove(itemName, bonusName, "single", bonus) + end + for bonusName,bonus in pairs(thtd_equip_table[itemName]["suit"][2]) do + self:ItemBonusRemove(itemName, bonusName, "suit2", bonus) + end + for bonusName,bonus in pairs(thtd_equip_table[itemName]["suit"][4]) do + self:ItemBonusRemove(itemName, bonusName, "suit4", bonus) + end + end +end + +function CDOTA_BaseNPC:ItemBonusAdd(itemName, bonusName, type, bonus) + local uniqueString = itemName.."_"..bonusName.."_"..type.."_bonus" + if bonusName == "modifier" then + if not self:HasModifier(bonus) then + self:AddNewModifier(self, nil, bonus, {}) + end + else + local add = bonus - (self[uniqueString] or 0) + local func = self[equip_bonus_table[bonusName]] + if func then + func(self, add) + self[uniqueString] = bonus + end + end +end + +function CDOTA_BaseNPC:ItemBonusRemove(itemName, bonusName, type, bonus) + local uniqueString = itemName.."_"..bonusName.."_"..type.."_bonus" + if bonusName == "modifier" then + if self:HasModifier(bonus) then + self:RemoveModifierByName(bonus) + end + else + if self[uniqueString] ~= nil then + local func = self[equip_bonus_table[bonusName]] + if func then + func(self, -self[uniqueString]) + end + self[uniqueString] = nil + end + end +end + + + +-------------------------------------------------- + +function CDOTA_BaseNPC:THTD_DropItemAll() + local items = {} + for i=0,THTD_MAX_ITEM_SLOT-1 do + local targetItem = self:GetItemInSlot(i) + if targetItem~=nil and targetItem:IsNull()==false and targetItem:GetAbilityName() ~= "item_3121" and targetItem:GetAbilityName() ~= "item_3149" then + table.insert(items,targetItem) + end + end + local targetItem = self:GetItemInSlot(THTD_ITEM_Neutral_SLOT) + if targetItem~=nil and targetItem:IsNull()==false then + table.insert(items,targetItem) + end + + for _,targetItem in pairs(items) do + if self:GetUnitName() == "chen" or self:GetUnitName() == "aya" then + self:DropItemAtPositionImmediate(targetItem, self:GetOwner():GetOrigin()) + else + self:DropItemAtPositionImmediate(targetItem, self:GetOrigin()) + end + end + + items = {} +end + +function CDOTA_BaseNPC:THTD_AddCardPoolItem(itemName) + if self:IsRealHero() == false or itemName==nil then return true end + + local item = CreateItem(itemName, nil, nil) + if item == nil then return false end + item.card_poor_player_id = self.thtd_player_id + item.owner_player_id = self.thtd_player_id + self:AddItem(item) + item:THTD_RemoveItemInList(self.thtd_player_id) + + local cardName = item:THTD_GetCardName() + if item:THTD_IsCardHasVoice() == true then + EmitSoundOn(THTD_GetVoiceEvent(cardName,"spawn"), self) + -- local player = self:GetPlayerOwner() + -- if player then + -- -- 这两个声音太小 + -- -- EmitSoundOnClient(THTD_GetVoiceEvent(cardName,"spawn"),player) + -- -- EmitAnnouncerSoundForPlayer(THTD_GetVoiceEvent(cardName,"spawn"), self:GetPlayerOwnerID()) + -- end + + -- 不在视野也会听到这个音效 + -- EmitSoundOnLocationWithCaster(vLocation, soundName, hCaster) + end + + if item:THTD_IsCardHasPortrait() == true then + local portraits= item:THTD_GetPortraitPath(cardName) + local quality = item:THTD_GetCardQuality() + if quality == 1 then + local effectIndex = ParticleManager:CreateParticleForPlayer(portraits, PATTACH_WORLDORIGIN, self, self:GetPlayerOwner()) + ParticleManager:SetParticleControl(effectIndex, 0, Vector(-58,-80,0)) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(80,0,0)) + ParticleManager:DestroyParticleSystemTime(effectIndex,6.0) + self:EmitSound("Sound_THTD.thtd_draw_n") + elseif quality == 2 then + local effectIndex = ParticleManager:CreateParticleForPlayer(portraits, PATTACH_WORLDORIGIN, self, self:GetPlayerOwner()) + ParticleManager:SetParticleControl(effectIndex, 0, Vector(-58,-80,0)) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(80,0,0)) + ParticleManager:DestroyParticleSystemTime(effectIndex,6.0) + self:EmitSound("Sound_THTD.thtd_draw_r") + elseif quality == 3 then + local effectIndex = ParticleManager:CreateParticleForPlayer(portraits, PATTACH_WORLDORIGIN, self, self:GetPlayerOwner()) + ParticleManager:SetParticleControl(effectIndex, 0, Vector(-58,-80,0)) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(80,0,0)) + ParticleManager:DestroyParticleSystemTime(effectIndex,6.0) + self:EmitSound("Sound_THTD.thtd_draw_sr") + elseif quality == 4 then + local effectIndex = ParticleManager:CreateParticle(portraits, PATTACH_WORLDORIGIN, nil) + ParticleManager:SetParticleControl(effectIndex, 0, Vector(-58,-80,0)) + ParticleManager:SetParticleControl(effectIndex, 1, Vector(80,0,0)) + ParticleManager:DestroyParticleSystemTime(effectIndex,6.0) + effectIndex = ParticleManager:CreateParticle("particles/portraits/portraits_ssr_get_screen_effect.vpcf", PATTACH_WORLDORIGIN, nil) + ParticleManager:DestroyParticleSystemTime(effectIndex,4.0) + self:EmitSound("Sound_THTD.thtd_draw_ssr") + end + end + + return true +end + +local thtd_remain_buff = +{ + "modifier_miko_02_buff", + "modifier_miko_02_ready", + "modifier_byakuren_03_buff", + "modifier_sakuya_02_buff", +} + +function THTD_IsRemainBuff(modifierName) + for index,name in pairs(thtd_remain_buff) do + if name == modifierName then + return true + end + end + return false +end + + +-------------------------------------------------- + +local thtd_spell_lock = { + [0] = { }, + [1] = { }, + [2] = { }, + [3] = { }, +} + +-- 控制链 +local thtd_stun_group = { + -- "thtd_patchouli_04_start_stun", 有延迟生效 + "thtd_patchouli_04_in_stun", + "thtd_sakuya_03", + "thtd_utsuho_03", + "thtd_medicine_02", + "thtd_wriggle_02", + "thtd_hecatia_03", + "thtd_komachi_02", + "thtd_kokoro_02", + "thtd_reimu_03", + "thtd_kyouko_02", + "thtd_shikieiki_04", +} + +function THTD_SetSpellLock(caster, abilityName, time) + local id = caster:GetPlayerOwnerID() + if thtd_spell_lock[id] == nil then thtd_spell_lock[id] = {} end + thtd_spell_lock[id][abilityName] = GameRules:GetGameTime() + time -- 有时实际时间要加一个AI运行间隔 + -- ability:GetCastPoint() --施法前摇 +end + +function THTD_IsSpellLock(caster, abilityName) + local id = caster:GetPlayerOwnerID() + if thtd_spell_lock[id] == nil then + thtd_spell_lock[id] = {} + end + + local isInGroup = false + local isGroupLock = false + for k,v in pairs(thtd_stun_group) do + if v == abilityName then + isInGroup = true + end + if thtd_spell_lock[id][v] ~= nil and thtd_spell_lock[id][v] > GameRules:GetGameTime() then + isGroupLock = true + end + if isInGroup and isGroupLock then + return true + end + end + + if thtd_spell_lock[id][abilityName] ~= nil and thtd_spell_lock[id][abilityName] > GameRules:GetGameTime() then + return true + else + return false + end +end + + + +-------------------------------------------------- + +-- 潜能设置 +local thtd_potency_table = +{ + ["cirno"] = { + ["thtd_cirno_02"] = { + [1] = {3, 4}, + [2] = {6, 8}, + [3] = {9, 16}, + }, + ["thtd_cirno_04"] = { + [1] = {3}, + [2] = {6}, + [3] = {9}, + }, + }, + + ["clownpiece"] = { + ["thtd_clownpiece_01"] = { + [1] = {100}, + [2] = {200}, + [3] = {400}, + }, + ["thtd_clownpiece_02"] = { + [1] = {0, 0, 0}, + [2] = {200, 2, 1}, + [3] = {400, 4, 2}, + }, + ["thtd_clownpiece_03"] = { + [1] = {5, 0}, + [2] = {10, 0}, + [3] = {20, 5}, + }, + }, + + ["hanadayousei"] = { + ["thtd_hanadayousei_01"] = { + [1] = {3, 100}, + [2] = {6, 200}, + [3] = {99, 400}, + }, + }, + + ["kogasa"] = { + ["thtd_kogasa_01"] = { + [1] = {100, 2, 2}, + [2] = {200, 4, 4}, + [3] = {400, 8, 8}, + }, + }, + + ["letty"] = { + ["thtd_letty_01"] = { + [1] = {1, 1}, + [2] = {2, 2}, + [3] = {4, 4}, + }, + }, + + ["mugiyousei"] = { + ["thtd_mugiyousei_01"] = { + [1] = {3, 3}, + [2] = {6, 6}, + [3] = {9, 9}, + }, + }, + + ["aya"] = { + ["thtd_aya_01"] = { + [1] = {1, 0}, + [2] = {2, 1}, + [3] = {4, 2}, + }, + ["thtd_aya_02"] = { + [1] = {2}, + [2] = {4}, + [3] = {8}, + }, + }, + + ["kisume"] = { + ["thtd_kisume_01"] = { + [1] = {2}, + [2] = {4}, + [3] = {8}, + }, + ["thtd_kisume_02"] = { + [1] = {2, 0}, + [2] = {4, 0}, + [3] = {8, 1}, + }, + }, + + ["minamitsu"] = { + ["thtd_minamitsu_02"] = { + [1] = {25, 2}, + [2] = {50, 4}, + [3] = {75, 7}, + }, + ["thtd_minamitsu_04"] = { + [1] = {5, 0}, + [2] = {10, 2}, + [3] = {20, 4}, + }, + }, + + ["kagerou"] = { + ["thtd_kagerou_02"] = { + [1] = {2}, + [2] = {5}, + [3] = {10}, + }, + ["thtd_kagerou_03"] = { + [1] = {100, 2, 10}, + [2] = {200, 4, 20}, + [3] = {300, 8, 30}, + }, + }, + + ["marisa"] = { + ["thtd_marisa_02"] = { + [1] = {100}, + [2] = {200}, + [3] = {400}, + }, + ["thtd_marisa_03"] = { + [1] = {8, 40}, + [2] = {18, 80}, + [3] = {28, 160}, + }, + }, + + ["alice"] = { + ["thtd_alice_02"] = { + [1] = {1}, + [2] = {2}, + [3] = {3}, + }, + ["thtd_alice_03"] = { + [1] = {100}, + [2] = {200}, + [3] = {400}, + }, + }, + + ["patchouli"] = { + ["thtd_patchouli_01"] = { + [1] = {50}, + [2] = {100}, + [3] = {200}, + }, + ["thtd_patchouli_04"] = { + [1] = {15}, + [2] = {30}, + [3] = {60}, + }, + }, + + ["sakuya"] = { + ["thtd_sakuya_01"] = { + [1] = {5}, + [2] = {10}, + [3] = {15}, + }, + ["thtd_sakuya_03"] = { + [1] = {5}, + [2] = {10}, + [3] = {15}, + }, + }, + + ["tenshi"] = { + ["thtd_tenshi_02"] = { + [1] = {10}, + [2] = {20}, + [3] = {40}, + }, + ["thtd_tenshi_03"] = { + [1] = {10}, + [2] = {20}, + [3] = {40}, + }, + }, + + ["youmu"] = { + ["thtd_youmu_02"] = { + [1] = {10}, + [2] = {20}, + [3] = {30}, + }, + ["thtd_youmu_03"] = { + [1] = {10}, + [2] = {20}, + [3] = {40}, + }, + }, + + ["yuyuko"] = { + ["thtd_yuyuko_02"] = { + [1] = {5}, + [2] = {10}, + [3] = {15}, + }, + ["thtd_yuyuko_03"] = { + [1] = {10}, + [2] = {20}, + [3] = {30}, + }, + }, + + ["rumia"] = { + ["thtd_rumia_02"] = { + [1] = {2}, + [2] = {4}, + [3] = {6}, + }, + ["thtd_rumia_04"] = { + [1] = {3}, + [2] = {8}, + [3] = {13}, + }, + }, + + ["satori"] = { + ["thtd_satori_02"] = { + [1] = {50}, + [2] = {100}, + [3] = {150}, + }, + }, + + ["kyouko"] = { + ["thtd_kyouko_01"] = { + [1] = {5}, + [2] = {25}, + [3] = {50}, + }, + ["thtd_kyouko_02"] = { + [1] = {10}, + [2] = {20}, + [3] = {40}, + }, + }, + + ["kokoro"] = { + ["thtd_kokoro_04"] = { + [1] = {1}, + [2] = {5}, + [3] = {10}, + } + }, + + ["hina"] = { + ["thtd_hina_02"] = { + [1] = {7}, + [2] = {15}, + [3] = {30}, + } + }, + + ["inaba"] = { + ["thtd_inaba_02"] = { + [1] = {5}, + [2] = {10}, + [3] = {20}, + } + }, + +} + +-- 获取觉醒后对应技能的潜能数值表,无则返回 nil +function CDOTA_BaseNPC:GetAbilityPowerValue(abilityName) + local powerLevel = self:GetTowerPowerLevel() + if powerLevel < 1 then + return nil + end + local level = math.min(3, powerLevel) + local unitName = self:GetUnitName() + if thtd_potency_table[unitName] == nil then return nil end + if thtd_potency_table[unitName][abilityName] == nil then return nil end + return thtd_potency_table[unitName][abilityName][level] +end + +-- 获取觉醒后的潜能等级,-1未开启,0小于10级,1为10级效果,2为50级效果,3为100级效果,4为666级,5为999级 +function CDOTA_BaseNPC:GetTowerPowerLevel() + if self.thtd_power_level == nil then + return -1 + elseif self.thtd_power_level >= 999 then + return 5 + elseif self.thtd_power_level >= 666 then + return 4 + elseif self.thtd_power_level >= 100 then + return 3 + elseif self.thtd_power_level >= 50 then + return 2 + elseif self.thtd_power_level >= 10 then + return 1 + else + return 0 + end +end + +-- 是否达到觉醒后潜能666等级 +function CDOTA_BaseNPC:IsPower666() + return self.thtd_power_level ~= nil and self.thtd_power_level >= 666 +end + +-- 是否达到觉醒后潜能999等级 +function CDOTA_BaseNPC:IsPower999() + return self.thtd_power_level ~= nil and self.thtd_power_level >= 999 +end + +-- 设置觉醒后潜能奖励 +function CDOTA_BaseNPC:AddPowerBonus() + local level = self:GetTowerPowerLevel() + if level >= 0 then + self:THTD_AddBaseAttack(self.thtd_power_level * 3, "thtd_tower_power_bonus") + self:THTD_AddBasePower(self.thtd_power_level * 3, "thtd_tower_power_bonus") + end + + local modifierName = "modifier_ability_power_"..self:GetUnitName() + if level >= 1 then + local modifier = self:FindModifierByName(modifierName) or self:AddNewModifier(self, nil, modifierName, nil) + if modifier ~= nil then + modifier:SetStackCount(level) + end + else + self:RemoveModifierByName(modifierName) + end +end + +-- 移除觉醒后潜能奖励 +function CDOTA_BaseNPC:RemovePowerBonus() + self:THTD_AddBaseAttack("thtd_tower_power_bonus") + self:THTD_AddBasePower("thtd_tower_power_bonus") + self:RemoveModifierByName("modifier_ability_power_"..self:GetUnitName()) +end + +-- 获取最大潜能等级,秋姐妹、大妖精和N卡为100,其它999 +function CDOTA_BaseNPC:GetMaxPowerLevel() + local unitName = self:GetUnitName() + if unitName == "minoriko" or unitName == "sizuha" or unitName == "nazrin" or unitName == "lily" or unitName == "daiyousei" or unitName == "mugiyousei" or unitName == "shanghainingyou" or unitName == "hourainingyou" or unitName == "hanadayousei" or unitName == "maidyousei" then + return 100 + else + return 999 + end +end + +function THTD_GetMaxPowerLevel(unitName) + if unitName == "minoriko" or unitName == "sizuha" or unitName == "nazrin" or unitName == "lily" or unitName == "daiyousei" or unitName == "mugiyousei" or unitName == "shanghainingyou" or unitName == "hourainingyou" or unitName == "hanadayousei" or unitName == "maidyousei" then + return 100 + else + return 999 + end +end + + + +-------------------------------------------------- + +-- 设置幸运日 +function CDOTA_BaseNPC:SetLuckDay() + if self:THTD_IsTower() then + local crit = 0 + if self:GetUnitName() == GameRules.GameData.luck_card or GameRules.GameData.luck_card == "all" then + crit = GameRules.GameData.luck_crit + end + if crit > 0 then + if self:HasModifier("modifier_touhoutd_luck") == false then + self:AddNewModifier(self, nil, "modifier_touhoutd_luck", {}) + end + elseif self:HasModifier("modifier_touhoutd_luck") then + self:RemoveModifierByName("modifier_touhoutd_luck") + end + end +end diff --git a/scripts/vscripts/trigger/passcorner.lua b/scripts/vscripts/trigger/passcorner.lua new file mode 100755 index 0000000..1b9f18f --- /dev/null +++ b/scripts/vscripts/trigger/passcorner.lua @@ -0,0 +1,320 @@ +function OnPassTheCorner(data) + local target = data.activator + + local findNum = string.find(target:GetUnitName(), 'creature') + if findNum == nil and target:GetUnitName() ~= "yukari_train" then return end + if target == nil or target:IsNull() then return end + if target.thtd_is_fearing == true then return end + + local caller = data.caller + local vecLocation = thisEntity:GetOrigin() + local vecTarget = target:GetOrigin() + + if target:GetUnitName() == "yukari_train" then + target.next_move_point = THTD_GetTrainNextPathForUnit(target,thisEntity:GetName()) + target:SetBaseMoveSpeed(2500) + target:SetContextThink(DoUniqueString("AttackingBase"), + function () + target:SetBaseMoveSpeed(2000) + return nil + end, + 0.5) + else + target.next_move_point = THTD_GetNextPathForUnit(target,thisEntity:GetName()) + end +end + +function THTD_GetTrainNextPathForUnit(target,corner) + local vecTable = {} + + for i=1,4 do + local forward = THTD_GetForward(i) + + if G_path_corner[corner][forward] ~= nil then + if target.next_move_forward == nil or forward~=GetContraryForward(target.next_move_forward) then + table.insert(vecTable,forward) + end + end + end + + local nextForward = vecTable[RandomInt(1,#vecTable)] + + if target.FirstTrain == nil then + target.next_corner_table[corner] = nextForward + else + nextForward = target.FirstTrain.next_corner_table[corner] + end + + if nextForward ~= nil then + local vecRun = G_path_corner[corner][nextForward] + + target.next_move_forward = nextForward + + if vecRun~=nil then + return G_path_corner[vecRun].Vector * 1.5 + else + return target.next_move_point + end + else + target:AddNoDraw() + target:ForceKill(true) + end +end + +function THTD_GetNextPathForUnit(target,corner) + local vecTable = {} + + for i=1,4 do + local forward = THTD_GetForward(i) + + if G_path_corner[corner][forward] ~= nil then + if target.next_move_forward == nil or forward~=GetContraryForward(target.next_move_forward) then + table.insert(vecTable,forward) + end + end + end + + local nextForward = vecTable[RandomInt(1,#vecTable)] + + if nextForward ~= nil then + local vecRun = G_path_corner[corner][nextForward] + + target.next_move_forward = nextForward + + if vecRun~=nil then + target.thtd_next_corner = vecRun + return G_path_corner[vecRun].Vector * 1.5 + else + return target.next_move_point + end + else + target.next_move_forward = nil + end +end + +function GetContraryForward(forward) + if forward == "up" then + return "down" + elseif forward == "down" then + return "up" + elseif forward == "left" then + return "right" + elseif forward == "right" then + return "left" + end + return forward +end + +function THTD_GetForward(num) + if num == 1 then + return "up" + elseif num == 2 then + return "down" + elseif num == 3 then + return "left" + elseif num == 4 then + return "right" + end + return "left" +end + + +G_path_corner = +{ + ["corner_0_M2768"] = { + Vector = Vector(0,-2768,137), + ["up"] = nil, + ["down"] = "corner_0_M3808", + ["left"] = "corner_M2771_M2768", + ["right"] = "corner_2771_M2768", + }, + ["corner_2771_M2768"] = { + Vector = Vector(2771,-2768,137), + ["up"] = nil, + ["down"] = nil, + ["left"] = "corner_0_M2768", + ["right"] = "corner_4544_M2768", + }, + ["corner_M2771_2768"] = { + Vector = Vector(-2771,2768,137), + ["up"] = nil, + ["down"] = nil, + ["left"] = "corner_M4544_2768", + ["right"] = "corner_0_2768", + }, + ["corner_5584_M3808"] = { + Vector = Vector(5584,-3808,137), + ["up"] = "corner_5584_0", + ["down"] = nil, + ["left"] = "corner_0_M3808", + ["right"] = nil, + }, + ["corner_M5584_M3808"] = { + Vector = Vector(-5584,-3808,137), + ["up"] = "corner_M5584_0", + ["down"] = nil, + ["left"] = nil, + ["right"] = "corner_0_M3808", + }, + ["corner_0_3808"] = { + Vector = Vector(0,3808,137), + ["up"] = nil, + ["down"] = "corner_0_2768", + ["left"] = "corner_M5584_3808", + ["right"] = "corner_5584_3808", + }, + ["corner_M2771_M2768"] = { + Vector = Vector(-2771,-2768,137), + ["up"] = nil, + ["down"] = nil, + ["left"] = "corner_M4544_M2768", + ["right"] = "corner_0_M2768", + }, + ["corner_2771_1056"] = { + Vector = Vector(2771,1056,137), + ["up"] = "corner_2771_2768", + ["down"] = nil, + ["left"] = nil, + ["right"] = nil, + }, + ["corner_4544_M2768"] = { + Vector = Vector(4544,-2768,137), + ["up"] = "corner_4544_0", + ["down"] = nil, + ["left"] = "corner_2771_M2768", + ["right"] = nil, + }, + ["corner_M4544_M2768"] = { + Vector = Vector(-4544,-2768,137), + ["up"] = "corner_M4544_0", + ["down"] = nil, + ["left"] = nil, + ["right"] = "corner_M2771_M2768", + }, + ["corner_M4544_0"] = { + Vector = Vector(-4544,0,137), + ["up"] = "corner_M4544_2768", + ["down"] = "corner_M4544_M2768", + ["left"] = "corner_M5584_0", + ["right"] = nil, + }, + ["corner_M5584_0"] = { + Vector = Vector(-5584,0,137), + ["up"] = "corner_M5584_3808", + ["down"] = "corner_M5584_M3808", + ["left"] = nil, + ["right"] = "corner_M4544_0", + }, + ["corner_5584_0"] = { + Vector = Vector(5584,0,137), + ["up"] = "corner_5584_3808", + ["down"] = "corner_5584_M3808", + ["left"] = "corner_4544_0", + ["right"] = nil, + }, + ["corner_4544_0"] = { + Vector = Vector(4544,0,137), + ["up"] = "corner_4544_2768", + ["down"] = "corner_4544_M2768", + ["left"] = nil, + ["right"] = "corner_5584_0", + }, + ["corner_0_2768"] = { + Vector = Vector(0,2768,137), + ["up"] = "corner_0_3808", + ["down"] = nil, + ["left"] = "corner_M2771_2768", + ["right"] = "corner_2771_2768", + }, + ["corner_0_M3808"] = { + Vector = Vector(0,-3808,137), + ["up"] = "corner_0_M2768", + ["down"] = nil, + ["left"] = "corner_M5584_M3808", + ["right"] = "corner_5584_M3808", + }, + ["corner_4544_2768"] = { + Vector = Vector(4544,2768,137), + ["up"] = nil, + ["down"] = "corner_4544_0", + ["left"] = "corner_2771_2768", + ["right"] = nil, + }, + ["corner_M5584_3808"] = { + Vector = Vector(-5584,3808,137), + ["up"] = nil, + ["down"] = "corner_M5584_0", + ["left"] = nil, + ["right"] = "corner_0_3808", + }, + ["corner_5584_3808"] = { + Vector = Vector(5584,3808,137), + ["up"] = nil, + ["down"] = "corner_5584_0", + ["left"] = "corner_0_3808", + ["right"] = nil, + }, + ["corner_2771_2768"] = { + Vector = Vector(2771,2768,137), + ["up"] = nil, + ["down"] = nil, + ["left"] = "corner_0_2768", + ["right"] = "corner_4544_2768", + }, + ["corner_M2771_M1056"] = { + Vector = Vector(-2771,-1056,137), + ["up"] = nil, + ["down"] = "corner_M2771_M2768", + ["left"] = nil, + ["right"] = nil, + }, + ["corner_2771_M1056"] = { + Vector = Vector(2771,-1056,137), + ["up"] = nil, + ["down"] = "corner_2771_M2768", + ["left"] = nil, + ["right"] = nil, + }, + ["corner_M2771_1056"] = { + Vector = Vector(-2771,1056,137), + ["up"] = "corner_M2771_2768", + ["down"] = nil, + ["left"] = nil, + ["right"] = nil, + }, + ["corner_1408_M1056"] = { + Vector = Vector(1408,-1056,137), + ["up"] = nil, + ["down"] = nil, + ["left"] = nil, + ["right"] = "corner_2771_M1056", + }, + ["corner_M1408_M1056"] = { + Vector = Vector(-1408,-1056,137), + ["up"] = nil, + ["down"] = nil, + ["left"] = "corner_M2771_M1056", + ["right"] = nil, + }, + ["corner_M1408_1056"] = { + Vector = Vector(-1408,1056,137), + ["up"] = nil, + ["down"] = nil, + ["left"] = "corner_M2771_1056", + ["right"] = nil, + }, + ["corner_1408_1056"] = { + Vector = Vector(1408,1056,137), + ["up"] = nil, + ["down"] = nil, + ["left"] = nil, + ["right"] = "corner_2771_1056", + }, + ["corner_M4544_2768"] = { + Vector = Vector(-4544,2768,137), + ["up"] = nil, + ["down"] = "corner_M4544_0", + ["left"] = nil, + ["right"] = "corner_M2771_2768", + }, +} \ No newline at end of file diff --git a/scripts/vscripts/util.lua b/scripts/vscripts/util.lua new file mode 100755 index 0000000..d2d9ae1 --- /dev/null +++ b/scripts/vscripts/util.lua @@ -0,0 +1,1193 @@ +-- 打印表格 +function PrintTable(t, indent, done) + --print ( string.format ('PrintTable type %s', type(keys)) ) + if type(t) ~= "table" then return end + + done = done or {} + done[t] = true + indent = indent or 0 + + local l = {} + for k, v in pairs(t) do + table.insert(l, k) + end + + table.sort(l) + for k, v in ipairs(l) do + -- Ignore FDesc + if v ~= 'FDesc' then + local value = t[v] + + if type(value) == "table" and not done[value] then + done [value] = true + print(string.rep ("\t", indent)..tostring(v)..":") + PrintTable (value, indent + 2, done) + elseif type(value) == "userdata" and not done[value] then + done [value] = true + print(string.rep ("\t", indent)..tostring(v)..": "..tostring(value)) + PrintTable ((getmetatable(value) and getmetatable(value).__index) or getmetatable(value), indent + 2, done) + else + if t.FDesc and t.FDesc[v] then + print(string.rep ("\t", indent)..tostring(t.FDesc[v])) + else + print(string.rep ("\t", indent)..tostring(v)..": "..tostring(value)) + end + end + end + end +end + + + +-- ***** string 功能扩展开始 ****** + + -- RC4 + -- http://en.wikipedia.org/wiki/RC4 + function RC4encrypt(text,key) + + function KSA(key) + local key_len = string.len(key) + local S = {} + local key_byte = {} + + for i = 0, 255 do + S[i] = i + end + + for i = 1, key_len do + key_byte[i-1] = string.byte(key, i, i) + end + + local j = 0 + for i = 0, 255 do + j = (j + S[i] + key_byte[i % key_len]) % 256 + S[i], S[j] = S[j], S[i] + end + return S + end + + function PRGA(S, text_len) + local i = 0 + local j = 0 + local K = {} + + for n = 1, text_len do + + i = (i + 1) % 256 + j = (j + S[i]) % 256 + + S[i], S[j] = S[j], S[i] + K[n] = S[(S[i] + S[j]) % 256] + end + return K + end + + function RC4(key, text) + local text_len = string.len(text) + + local S = KSA(key) + local K = PRGA(S, text_len) + return output(K, text) + end + + function output(S, text) + local len = string.len(text) + local c = nil + local res = {} + for i = 1, len do + c = string.byte(text, i, i) + res[i] = string.char(bxor(S[i], c)) + end + return table.concat(res) + end + + + ------------------------------- + -------------bit wise----------- + ------------------------------- + + local bit_op = {} + function bit_op.cond_and(r_a, r_b) + return (r_a + r_b == 2) and 1 or 0 + end + + function bit_op.cond_xor(r_a, r_b) + return (r_a + r_b == 1) and 1 or 0 + end + + function bit_op.cond_or(r_a, r_b) + return (r_a + r_b > 0) and 1 or 0 + end + + function bit_op.base(op_cond, a, b) + -- bit operation + if a < b then + a, b = b, a + end + local res = 0 + local shift = 1 + while a ~= 0 do + r_a = a % 2 + r_b = b % 2 + + res = shift * bit_op[op_cond](r_a, r_b) + res + shift = shift * 2 + + a = math.modf(a / 2) + b = math.modf(b / 2) + end + return res + end + + function bxor(a, b) + return bit_op.base('cond_xor', a, b) + end + + function band(a, b) + return bit_op.base('cond_and', a, b) + end + + function bor(a, b) + return bit_op.base('cond_or', a, b) + end + + local textLen = string.len(text) + local schedule = KSA(key) + local k = PRGA(schedule, textLen) + return output(k, text) + end + + + --将字符串按格式转为16进制串 + function string.tohex(str) + --判断输入类型 + if (type(str)~="string") then + return nil,"string2hex invalid input type" + end + --拼接字符串 + local index=1 + local ret="" + for index=1,str:len() do + ret=ret..string.format("%02X",str:sub(index):byte()) + end + + return ret + end + + --将16进制串转换为字符串 + function string.fromhex(hex) + --判断输入类型 + if (type(hex)~="string") then + return nil,"hex2string invalid input type" + end + --滤掉分隔符 + hex=hex:gsub("[%s%p]",""):upper() + --检查内容是否合法 + if(hex:find("[^0-9A-Fa-f]")~=nil) then + return nil,"hex2string invalid input content" + end + --检查字符串长度 + if(hex:len()%2~=0) then + return nil,"hex2string invalid input lenth" + end + --拼接字符串 + local index=1 + local ret="" + for index=1,hex:len(),2 do + ret=ret..string.char(tonumber(hex:sub(index,index+1),16)) + end + + return ret + end + + + -- 字符串编码 + function string.encode(text, key) + if text == nil or string.len(text) == 0 then return text end + return string.tohex(RC4encrypt(text, key)) + end + + -- 字符串解码 + function string.decode(text, key) + if text == nil or string.len(text) == 0 then return text end + local s,e = string.fromhex(text) + if s == nil then + return s,e + else + return RC4encrypt(s, key) + end + end + + -- 字符串分割,返回分割后子串数组 + function string.split(input, delimiter) + input = tostring(input) + delimiter = tostring(delimiter) + if (delimiter=='') then return false end + local pos,arr = 0, {} + for st,sp in function() return string.find(input, delimiter, pos, true) end do + table.insert(arr, string.sub(input, pos, st - 1)) + pos = sp + 1 + end + table.insert(arr, string.sub(input, pos)) + return arr + end + + -- 字符串输出到文件 + function string.tofile(str, path) + local out = io.open(path,"w") + if out then + out:write(str) + out:close() + end + end + + -- 超长字符串格式化的方式输出到文件,使用方法 table.concat(t) + function string.tablefile(str, path) + local out = io.open(path,"w") + if out then + out:write('{\n') + local len = string.len(str) + local step = 255 + local n = math.floor(len/step) + for i=0,n-1 do + out:write(' "'..string.sub(str, i*step+1, (i+1)*step)..'",\n') + end + out:write(' "'..string.sub(str, n*step+1, (n+1)*step)..'"\n}') + out:close() + end + end + + -- 从kv文件中载入字符串,对应 string.savekvfile 的输出 + function string.loadkvfile(path) + local t = LoadKeyValues(path) + if t == nil or t["1"] == nil then return nil end + + local ret = t["1"] + local i = 2 + while(t[tostring(i)] ~= nil) + do + ret = ret..t[tostring(i)] + i = i + 1 + end + t = {} + return ret + end + + --[[ + 以字符串内容写入文件,成功返回 true,失败返回 false + "mode 写入模式" 参数决定 io.writefile() 如何写入内容,可用的值如下: + - "w+" : 覆盖文件已有内容,如果文件不存在则创建新文件 + - "a+" : 追加内容到文件尾部,如果文件不存在则创建文件 + 此外,还可以在 "写入模式" 参数最后追加字符 "b" ,表示以二进制方式写入数据,这样可以避免内容写入不完整。 + - 默认值为 "w+b" + path 文件完全路径 + content 要写入的内容 + --]] + function string.writefile(content, path, mode) + mode = mode or "w+b" + local file = io.open(path, mode) + if file then + if file:write(content) == nil then return false end + io.close(file) + return true + else + return false + end + end + +-- ***** string 功能扩展结束 ****** + + + +-- ***** table 功能扩展开始 ****** + + -- table和string的互转 + function table.tostring(t) + + function ToStringEx(value) + if type(value)=='table' then + return table.tostring(value) + elseif type(value)=='string' then + return "\'"..value.."\'" + else + return tostring(value) + end + end + + if t == nil then return "" end + local retstr= "{" + + local i = 1 + for key,value in pairs(t) do + local signal = "," + if i==1 then + signal = "" + end + + if key == i then + retstr = retstr..signal..ToStringEx(value) + else + if type(key)=='number' or type(key) == 'string' then + retstr = retstr..signal..'['..ToStringEx(key).."]="..ToStringEx(value) + else + if type(key)=='userdata' then + retstr = retstr..signal.."*s"..table.tostring(getmetatable(key)).."*e".."="..ToStringEx(value) + else + retstr = retstr..signal..key.."="..ToStringEx(value) + end + end + end + + i = i+1 + end + + retstr = retstr.."}" + return retstr + end + + -- table和string的互转 + function table.fromstring(str) + if str == nil or type(str) ~= "string" then + return + end + print(str) + -- loadstring在lua5.2中已经被弃用了 + --return loadstring("return " .. str)() + return load("return " .. str)() + end + + -- table按键名排序遍历,默认为升序 + -- t为table, method为排序方式,asc或desc,func为遍历回调 + -- lua中table是按照hash排列的,ipairs可以顺序遍历,但是不一定全部结果都能遍历出来,pairs能够全部遍历,但是遍历出来的结果是随机的,故需使用此方法 + function table.sorteach(t, func, method) + local tableTemp = {} + for i in pairs(t) do + if i ~= nil then + table.insert(tableTemp, i) + end + end + if method == "desc" or method == "DESC" then + -- 降序 + table.sort(tableTemp, function(a,b) return (a > b) end) + else + -- 升序 + table.sort(tableTemp, function(a,b) return (a < b) end) + end + + -- 遍历 + for _, key in pairs(tableTemp) do + if type(func) == "function" then func(key, t[key]) end + end + tableTemp = {} + end + + -- 深度复制表 + function table.deepcopy(object) + local lookup_table = {} + local function _copy(object) + if type(object) ~= "table" then + return object + elseif lookup_table[object] then + return lookup_table[object] + end + local new_table = {} + lookup_table[object] = new_table + for index, value in pairs(object) do + new_table[_copy(index)] = _copy(value) + end + return setmetatable(new_table, getmetatable(object)) + end + return _copy(object) + end + + -- 判断键是否在table中 + function table.haskey(t, key) + for k,v in pairs(t) do + if k == key then return true end + end + return false + end + + -- 判断值是否在table中 + function table.hasvalue(t, value) + for k,v in pairs(t) do + if v == value then return true end + end + return false + end + + -- 从文件中载入数据,来源对应加密数据 + function table.loadkv(path) + --return table.fromstring(string.decode(string.loadkvfile(path), "")) + return table.fromstring(string.decode(string.loadkvfile(path), SERVER_KEY)) + end + + -- 获取表中值元素的长度,不计nil + function table.count(t) + if type(t) ~= "table" then + return 0 + end + local len = 0 + for k,v in pairs(t) do + if v ~= nil then + len = len + 1 + end + end + return len + end + + -- 获取表按升序排列的第index元素对应的key(排除值为nil的元素),异常返回 nil + function table.getkey(t, index) + if type(t) ~= "table" or index == nil then + return nil + end + + local tableTemp = {} + for k in pairs(t) do + if k ~= nil then + table.insert(tableTemp, k) + end + end + -- 降序 + -- table.sort(tableTemp, function(a,b) return (a > b) end) + -- 升序 + table.sort(tableTemp, function(a,b) return (a < b) end) + + local key = nil + local count = 0 + if index >= 1 or index <= #tableTemp then + key = tableTemp[index] + end + tableTemp = {} + return key + end + + -- 按 key 顺序循环,f为可选参数,用于指定排序顺序 + function pairsByKeys(t,f) + local a = {} + for n in pairs(t) do a[#a + 1] = n end + table.sort(a, f) + local i = 0 + return function() + i = i + 1 + return a[i], t[a[i]] + end + end + --~ 使用上述迭代器: + -- for k,v in pairsByKeys(inputTable) do + -- print(k, v) + -- end + + -- 按 key 顺序获取指定key的序号 + function table.keyindex(t, key) + local index = 0 + for k,v in pairsByKeys(t) do + index = index + 1 + if k == key then + return index + end + end + return nil + end + +-- ***** table 功能扩展结束 ****** + + + +-- ***** MD5 功能开始 ****** + + -- 使用 md5.sumhexa(message) + md5 = { + _VERSION = "md5.lua 1.1.0", + _DESCRIPTION = "MD5 computation in Lua (5.1-3, LuaJIT)", + _URL = "https://github.com/kikito/md5.lua", + _LICENSE = [[ + MIT LICENSE + + Copyright (c) 2013 Enrique García Cota + Adam Baldwin + hanzao + Equi 4 Software + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ]] + } + + -- bit lib implementions + + local char, byte, format, rep, sub = + string.char, string.byte, string.format, string.rep, string.sub + local bit_or, bit_and, bit_not, bit_xor, bit_rshift, bit_lshift + + local ok, bit = pcall(require, 'bit') + if ok then + bit_or, bit_and, bit_not, bit_xor, bit_rshift, bit_lshift = bit.bor, bit.band, bit.bnot, bit.bxor, bit.rshift, bit.lshift + else + ok, bit = pcall(require, 'bit32') + + if ok then + + bit_not = bit.bnot + + local tobit = function(n) + return n <= 0x7fffffff and n or -(bit_not(n) + 1) + end + + local normalize = function(f) + return function(a,b) return tobit(f(tobit(a), tobit(b))) end + end + + bit_or, bit_and, bit_xor = normalize(bit.bor), normalize(bit.band), normalize(bit.bxor) + bit_rshift, bit_lshift = normalize(bit.rshift), normalize(bit.lshift) + + else + + local function tbl2number(tbl) + local result = 0 + local power = 1 + for i = 1, #tbl do + result = result + tbl[i] * power + power = power * 2 + end + return result + end + + local function expand(t1, t2) + local big, small = t1, t2 + if(#big < #small) then + big, small = small, big + end + -- expand small + for i = #small + 1, #big do + small[i] = 0 + end + end + + local to_bits -- needs to be declared before bit_not + + bit_not = function(n) + local tbl = to_bits(n) + local size = math.max(#tbl, 32) + for i = 1, size do + if(tbl[i] == 1) then + tbl[i] = 0 + else + tbl[i] = 1 + end + end + return tbl2number(tbl) + end + + -- defined as local above + to_bits = function (n) + if(n < 0) then + -- negative + return to_bits(bit_not(math.abs(n)) + 1) + end + -- to bits table + local tbl = {} + local cnt = 1 + local last + while n > 0 do + last = n % 2 + tbl[cnt] = last + n = (n-last)/2 + cnt = cnt + 1 + end + + return tbl + end + + bit_or = function(m, n) + local tbl_m = to_bits(m) + local tbl_n = to_bits(n) + expand(tbl_m, tbl_n) + + local tbl = {} + for i = 1, #tbl_m do + if(tbl_m[i]== 0 and tbl_n[i] == 0) then + tbl[i] = 0 + else + tbl[i] = 1 + end + end + + return tbl2number(tbl) + end + + bit_and = function(m, n) + local tbl_m = to_bits(m) + local tbl_n = to_bits(n) + expand(tbl_m, tbl_n) + + local tbl = {} + for i = 1, #tbl_m do + if(tbl_m[i]== 0 or tbl_n[i] == 0) then + tbl[i] = 0 + else + tbl[i] = 1 + end + end + + return tbl2number(tbl) + end + + bit_xor = function(m, n) + local tbl_m = to_bits(m) + local tbl_n = to_bits(n) + expand(tbl_m, tbl_n) + + local tbl = {} + for i = 1, #tbl_m do + if(tbl_m[i] ~= tbl_n[i]) then + tbl[i] = 1 + else + tbl[i] = 0 + end + end + + return tbl2number(tbl) + end + + bit_rshift = function(n, bits) + local high_bit = 0 + if(n < 0) then + -- negative + n = bit_not(math.abs(n)) + 1 + high_bit = 0x80000000 + end + + local floor = math.floor + + for i=1, bits do + n = n/2 + n = bit_or(floor(n), high_bit) + end + return floor(n) + end + + bit_lshift = function(n, bits) + if(n < 0) then + -- negative + n = bit_not(math.abs(n)) + 1 + end + + for i=1, bits do + n = n*2 + end + return bit_and(n, 0xFFFFFFFF) + end + end + end + + -- convert little-endian 32-bit int to a 4-char string + local function lei2str(i) + local f=function (s) return char( bit_and( bit_rshift(i, s), 255)) end + return f(0)..f(8)..f(16)..f(24) + end + + -- convert raw string to big-endian int + local function str2bei(s) + local v=0 + for i=1, #s do + v = v * 256 + byte(s, i) + end + return v + end + + -- convert raw string to little-endian int + local function str2lei(s) + local v=0 + for i = #s,1,-1 do + v = v*256 + byte(s, i) + end + return v + end + + -- cut up a string in little-endian ints of given size + local function cut_le_str(s,...) + local o, r = 1, {} + local args = {...} + for i=1, #args do + table.insert(r, str2lei(sub(s, o, o + args[i] - 1))) + o = o + args[i] + end + return r + end + + local swap = function (w) return str2bei(lei2str(w)) end + + -- An MD5 mplementation in Lua, requires bitlib (hacked to use LuaBit from above, ugh) + -- 10/02/2001 jcw@equi4.com + + local CONSTS = { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391, + 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 + } + + local f=function (x,y,z) return bit_or(bit_and(x,y),bit_and(-x-1,z)) end + local g=function (x,y,z) return bit_or(bit_and(x,z),bit_and(y,-z-1)) end + local h=function (x,y,z) return bit_xor(x,bit_xor(y,z)) end + local i=function (x,y,z) return bit_xor(y,bit_or(x,-z-1)) end + local z=function (ff,a,b,c,d,x,s,ac) + a=bit_and(a+ff(b,c,d)+x+ac,0xFFFFFFFF) + -- be *very* careful that left shift does not cause rounding! + return bit_or(bit_lshift(bit_and(a,bit_rshift(0xFFFFFFFF,s)),s),bit_rshift(a,32-s))+b + end + + local function transform(A,B,C,D,X) + local a,b,c,d=A,B,C,D + local t=CONSTS + + a=z(f,a,b,c,d,X[ 0], 7,t[ 1]) + d=z(f,d,a,b,c,X[ 1],12,t[ 2]) + c=z(f,c,d,a,b,X[ 2],17,t[ 3]) + b=z(f,b,c,d,a,X[ 3],22,t[ 4]) + a=z(f,a,b,c,d,X[ 4], 7,t[ 5]) + d=z(f,d,a,b,c,X[ 5],12,t[ 6]) + c=z(f,c,d,a,b,X[ 6],17,t[ 7]) + b=z(f,b,c,d,a,X[ 7],22,t[ 8]) + a=z(f,a,b,c,d,X[ 8], 7,t[ 9]) + d=z(f,d,a,b,c,X[ 9],12,t[10]) + c=z(f,c,d,a,b,X[10],17,t[11]) + b=z(f,b,c,d,a,X[11],22,t[12]) + a=z(f,a,b,c,d,X[12], 7,t[13]) + d=z(f,d,a,b,c,X[13],12,t[14]) + c=z(f,c,d,a,b,X[14],17,t[15]) + b=z(f,b,c,d,a,X[15],22,t[16]) + + a=z(g,a,b,c,d,X[ 1], 5,t[17]) + d=z(g,d,a,b,c,X[ 6], 9,t[18]) + c=z(g,c,d,a,b,X[11],14,t[19]) + b=z(g,b,c,d,a,X[ 0],20,t[20]) + a=z(g,a,b,c,d,X[ 5], 5,t[21]) + d=z(g,d,a,b,c,X[10], 9,t[22]) + c=z(g,c,d,a,b,X[15],14,t[23]) + b=z(g,b,c,d,a,X[ 4],20,t[24]) + a=z(g,a,b,c,d,X[ 9], 5,t[25]) + d=z(g,d,a,b,c,X[14], 9,t[26]) + c=z(g,c,d,a,b,X[ 3],14,t[27]) + b=z(g,b,c,d,a,X[ 8],20,t[28]) + a=z(g,a,b,c,d,X[13], 5,t[29]) + d=z(g,d,a,b,c,X[ 2], 9,t[30]) + c=z(g,c,d,a,b,X[ 7],14,t[31]) + b=z(g,b,c,d,a,X[12],20,t[32]) + + a=z(h,a,b,c,d,X[ 5], 4,t[33]) + d=z(h,d,a,b,c,X[ 8],11,t[34]) + c=z(h,c,d,a,b,X[11],16,t[35]) + b=z(h,b,c,d,a,X[14],23,t[36]) + a=z(h,a,b,c,d,X[ 1], 4,t[37]) + d=z(h,d,a,b,c,X[ 4],11,t[38]) + c=z(h,c,d,a,b,X[ 7],16,t[39]) + b=z(h,b,c,d,a,X[10],23,t[40]) + a=z(h,a,b,c,d,X[13], 4,t[41]) + d=z(h,d,a,b,c,X[ 0],11,t[42]) + c=z(h,c,d,a,b,X[ 3],16,t[43]) + b=z(h,b,c,d,a,X[ 6],23,t[44]) + a=z(h,a,b,c,d,X[ 9], 4,t[45]) + d=z(h,d,a,b,c,X[12],11,t[46]) + c=z(h,c,d,a,b,X[15],16,t[47]) + b=z(h,b,c,d,a,X[ 2],23,t[48]) + + a=z(i,a,b,c,d,X[ 0], 6,t[49]) + d=z(i,d,a,b,c,X[ 7],10,t[50]) + c=z(i,c,d,a,b,X[14],15,t[51]) + b=z(i,b,c,d,a,X[ 5],21,t[52]) + a=z(i,a,b,c,d,X[12], 6,t[53]) + d=z(i,d,a,b,c,X[ 3],10,t[54]) + c=z(i,c,d,a,b,X[10],15,t[55]) + b=z(i,b,c,d,a,X[ 1],21,t[56]) + a=z(i,a,b,c,d,X[ 8], 6,t[57]) + d=z(i,d,a,b,c,X[15],10,t[58]) + c=z(i,c,d,a,b,X[ 6],15,t[59]) + b=z(i,b,c,d,a,X[13],21,t[60]) + a=z(i,a,b,c,d,X[ 4], 6,t[61]) + d=z(i,d,a,b,c,X[11],10,t[62]) + c=z(i,c,d,a,b,X[ 2],15,t[63]) + b=z(i,b,c,d,a,X[ 9],21,t[64]) + + return bit_and(A+a,0xFFFFFFFF),bit_and(B+b,0xFFFFFFFF), + bit_and(C+c,0xFFFFFFFF),bit_and(D+d,0xFFFFFFFF) + end + + ---------------------------------------------------------------- + + local function md5_update(self, s) + self.pos = self.pos + #s + s = self.buf .. s + for ii = 1, #s - 63, 64 do + local X = cut_le_str(sub(s,ii,ii+63),4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4) + assert(#X == 16) + X[0] = table.remove(X,1) -- zero based! + self.a,self.b,self.c,self.d = transform(self.a,self.b,self.c,self.d,X) + end + self.buf = sub(s, math.floor(#s/64)*64 + 1, #s) + return self + end + + local function md5_finish(self) + local msgLen = self.pos + local padLen = 56 - msgLen % 64 + + if msgLen % 64 > 56 then padLen = padLen + 64 end + + if padLen == 0 then padLen = 64 end + + local s = char(128) .. rep(char(0),padLen-1) .. lei2str(bit_and(8*msgLen, 0xFFFFFFFF)) .. lei2str(math.floor(msgLen/0x20000000)) + md5_update(self, s) + + assert(self.pos % 64 == 0) + return lei2str(self.a) .. lei2str(self.b) .. lei2str(self.c) .. lei2str(self.d) + end + + ---------------------------------------------------------------- + + function md5.new() + return { a = CONSTS[65], b = CONSTS[66], c = CONSTS[67], d = CONSTS[68], + pos = 0, + buf = '', + update = md5_update, + finish = md5_finish } + end + + function md5.tohex(s) + return format("%08x%08x%08x%08x", str2bei(sub(s, 1, 4)), str2bei(sub(s, 5, 8)), str2bei(sub(s, 9, 12)), str2bei(sub(s, 13, 16))) + end + + function md5.sum(s) + return md5.new():update(s):finish() + end + + function md5.sumhexa(s) + return md5.tohex(md5.sum(s)) + end + +-- ***** MD5 功能结束 ****** + + +-- ***** datetime 功能开始 ****** + datetime = {} + + --[[ + |========================================================================= + | 判断是否为闰年 + |========================================================================= + | @param {int} year + | @return boolean + ]] + function datetime.isLeapYear(year) + return (year%4 == 0 and year%100 ~= 0) or (year%400 == 0) + end + + --[[ + |========================================================================= + | 获取UNIX时间戳 + |========================================================================= + | 以UTC时间为标准 + | + | @param {string} datetime 只支持格式'2016-10-13 01:01:01' + | @return int + ]] + function datetime.toUnixTime(datetimeString) + local datetimeTable = string.split(datetimeString,' ') + local datepart = string.split(datetimeTable[1],'-') + local timepart = string.split(datetimeTable[2],':') + local sec = tonumber(timepart[3]) + tonumber(timepart[2])*60 + tonumber(timepart[1])*60*60 + (tonumber(datepart[3]) - 1)*86400 + + local year = tonumber(datepart[1]) + local m = tonumber(datepart[2]) - 1 + for i=1,m do + if i==1 or i==3 or i==5 or i==7 or i==8 or i==10 or i==12 then + sec = sec + 31 * 86400 + elseif i==4 or i==6 or i==9 or i==11 then + sec = sec + 30 * 86400 + else + if datetime.isLeapYear(year) then + sec = sec + 29 * 86400 + else + sec = sec + 28 * 86400 + end + end + end + + local day = 0 + for i=1970,year-1 do + if datetime.isLeapYear(i) then + day = day + 366 + else + day = day + 365 + end + end + sec = sec + day * 86400 + + return sec + end + + --[[ + |========================================================================= + | 把UNIX时间戳转换成日期格式 + |========================================================================= + | 以UTC时间为标准,输出格式'2016-10-13 01:01:01' + | + | @param {int} unixtime + | @param {boolean} [returnTable] 可选,如果为true返回table + | @return string|table + ]] + function datetime.toDatetime(unixtime, returnTable ) + local day = math.floor(unixtime/86400) + local year = 1970 + while day >= 365 do + if datetime.isLeapYear(year) then + day = day - 366 + unixtime = unixtime - 366*86400 + else + day = day - 365 + unixtime = unixtime - 365*86400 + end + year = year + 1 + end + + _day = 0 + local month = 0 + for i=1,12 do + local d + if i==1 or i==3 or i==5 or i==7 or i==8 or i==10 or i==12 then + d = 31 + elseif i==4 or i==6 or i==9 or i==11 then + d = 30 + else + if datetime.isLeapYear(year) then + d = 29 + else + d = 28 + end + end + _day = _day + d + if day < _day then + month = i + unixtime = unixtime - (_day-d)*86400 + break + end + end + + day = math.floor(unixtime/86400) + unixtime = unixtime - day*86400 + + local h = math.floor(unixtime/3600) + unixtime = unixtime - h*3600 + local m = math.floor(unixtime/60) + unixtime = unixtime - m*60 + + if returnTable then + return { + year = year, + month = month, + day = day+1, + hour = h, + min = m, + second = unixtime, + } + end + + return string.format('%d-%02d-%02d %02d:%02d:%02d',year,month,day+1,h,m,unixtime) + end + + --[[ + |========================================================================= + | 获取服务器当前时间,返回标准格式时间,UNIX时间 + |========================================================================= + | @return string,int + ]] + function datetime.now() + local time = math.floor(UTC_TIME + GameRules:GetGameTime()) + return datetime.toDatetime(time),time + end + + --[[ + |========================================================================= + | 判断星期几,默认当前时间 + |========================================================================= + | @param {int} week 区间[1,7] + | @return boolean + ]] + function datetime.isWeek(week, datetimeString) + local date = {} + if datetimeString == nil then + date = datetime.toDatetime(math.floor(UTC_TIME + GameRules:GetGameTime()),true) + else + date = datetime.toDatetime(datetime.toUnixTime(datetimeString),true) + end + local y = date.year + local m = date.month + local d = date.day + if m == 1 or m == 2 then + m = m + 12 + y = y - 1 + end + local w = math.floor((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) % 7) + if w == 0 then w = 7 end + -- print(currentWeek) + return w == week + end + + --[[ + |========================================================================= + | 根据日期获取星期几 返回1-7,默认当前时间 + |========================================================================= + | @param {table} date or string + | @return int + ]] + function datetime.getWeek(date) + if date == nil then + local time = math.floor(UTC_TIME + GameRules:GetGameTime()) + date = datetime.toDatetime(time,true) + elseif type(date) == "string" then + date = datetime.toDatetime(datetime.toUnixTime(date),true) + end + local y = date.year + local m = date.month + local d = date.day + + if m == 1 or m == 2 then + y = y - 1 + m = m + 12 + end + + local w = (d+2*m+math.floor(3*(m+1)/5)+y+math.floor(y/4)-math.floor(y/100)+math.floor(y/400)) % 7 + 1 + + if w == 0 then + w = 7 + end + + return w + end + + --[[ + |========================================================================= + | 判断是否当月最后一天 + |========================================================================= + | @return boolean + ]] + function datetime.isLastDay(datetimeAny) + local data + if type(datetimeAny) == "string" then + data = datetime.toDatetime(datetime.toUnixTime(datetimeAny), true) + elseif type(datetimeAny) == "table" then + data = datetimeAny + elseif type(datetimeAny) == "number" then + data = datetime.toDatetime(datetimeAny, true) + else + print("Invalid datetime") + end + + local i = data.month + if i > 12 or i < 1 then + print("Invalid datetime") + end + if i==1 or i==3 or i==5 or i==7 or i==8 or i==10 or i==12 then + return data.day == 31 + elseif i==4 or i==6 or i==9 or i==11 then + return data.day == 30 + else + if datetime.isLeapYear(data.year) then + return data.day == 29 + else + return data.day == 28 + end + end + end + + --[[ + |========================================================================= + | 获取当月最后一天,传入参数以 yyyy-MM 开头 + |========================================================================= + | @return boolean + ]] + function datetime.getLastDay(datetimeString) + local i = tonumber(string.sub(datetimeString, 6, 7)) + if i==1 or i==3 or i==5 or i==7 or i==8 or i==10 or i==12 then + return 31 + elseif i==4 or i==6 or i==9 or i==11 then + return 30 + else + if datetime.isLeapYear(tonumber(string.sub(datetimeString, 1, 4))) then + return 29 + else + return 28 + end + end + end + + --[[ + |========================================================================= + | 获取增加x个月后的时间,一个月按30天计算 + |========================================================================= + | @return string + ]] + function datetime.addMonth(datetimeString, month) + return datetime.toDatetime(datetime.toUnixTime(datetimeString) + month * 30 * 24 * 3600) + end + + --[[ + |========================================================================= + | 获取增加x天后的时间 + |========================================================================= + | @return string + ]] + function datetime.addDay(datetimeString, day) + return datetime.toDatetime(datetime.toUnixTime(datetimeString) + day * 24 * 3600) + end + + --[[ + |========================================================================= + | 获取两个日期相差多少天,只取日期部分 + |========================================================================= + | @return number + ]] + function datetime.getDaysByTwoDate(dateStart, dateEnd) + local time1 = datetime.toUnixTime(string.sub(dateStart,1,10).." 00:00:00") + local time2 = datetime.toUnixTime(string.sub(dateEnd,1,10).." 00:00:00") + return math.floor((time2-time1)/(24*3600)) + end + + --[[ + |========================================================================= + | 获取两个日期相差多少秒,结果可用于判定日期前后 + |========================================================================= + | @return number + ]] + function datetime.subtracte(dateStart, dateEnd) + return datetime.toUnixTime(dateEnd) - datetime.toUnixTime(dateStart) + end + +-- ***** datetime 功能结束 ****** diff --git a/sm/2012eye_glow_international_2012.vpcf_c b/sm/2012eye_glow_international_2012.vpcf_c new file mode 100755 index 0000000..eb24f49 Binary files /dev/null and b/sm/2012eye_glow_international_2012.vpcf_c differ diff --git a/sm/2012eye_glow_international_2012b.vpcf_c b/sm/2012eye_glow_international_2012b.vpcf_c new file mode 100755 index 0000000..8e032cf Binary files /dev/null and b/sm/2012eye_glow_international_2012b.vpcf_c differ diff --git a/sm/2014_glow.vpcf_c b/sm/2014_glow.vpcf_c new file mode 100755 index 0000000..1e7031b Binary files /dev/null and b/sm/2014_glow.vpcf_c differ diff --git a/sm/2014_halo.vpcf_c b/sm/2014_halo.vpcf_c new file mode 100755 index 0000000..af0e5c7 Binary files /dev/null and b/sm/2014_halo.vpcf_c differ diff --git a/sm/2014_roil.vpcf_c b/sm/2014_roil.vpcf_c new file mode 100755 index 0000000..fce0297 Binary files /dev/null and b/sm/2014_roil.vpcf_c differ diff --git a/sm/2014_wisp.vpcf_c b/sm/2014_wisp.vpcf_c new file mode 100755 index 0000000..52fe427 Binary files /dev/null and b/sm/2014_wisp.vpcf_c differ diff --git a/sm/_b.vpcf_c b/sm/_b.vpcf_c new file mode 100755 index 0000000..6f87461 Binary files /dev/null and b/sm/_b.vpcf_c differ diff --git a/sm/_c.vpcf_c b/sm/_c.vpcf_c new file mode 100755 index 0000000..dd680aa Binary files /dev/null and b/sm/_c.vpcf_c differ diff --git a/sm/_d.vpcf_c b/sm/_d.vpcf_c new file mode 100755 index 0000000..8d0997e Binary files /dev/null and b/sm/_d.vpcf_c differ diff --git a/sm/ambient.vpcf_c b/sm/ambient.vpcf_c new file mode 100755 index 0000000..584ce74 Binary files /dev/null and b/sm/ambient.vpcf_c differ diff --git a/sm/baoshiguangze.vpcf_c b/sm/baoshiguangze.vpcf_c new file mode 100755 index 0000000..9809f19 Binary files /dev/null and b/sm/baoshiguangze.vpcf_c differ diff --git a/sm/baoshiguangze_b.vpcf_c b/sm/baoshiguangze_b.vpcf_c new file mode 100755 index 0000000..9268eb3 Binary files /dev/null and b/sm/baoshiguangze_b.vpcf_c differ diff --git a/sm/baoshiguangze_beams.vpcf_c b/sm/baoshiguangze_beams.vpcf_c new file mode 100755 index 0000000..4663737 Binary files /dev/null and b/sm/baoshiguangze_beams.vpcf_c differ diff --git a/sm/baoshiguangze_c.vpcf_c b/sm/baoshiguangze_c.vpcf_c new file mode 100755 index 0000000..861fcc0 Binary files /dev/null and b/sm/baoshiguangze_c.vpcf_c differ diff --git a/sm/baoshiguangze_dust_mote.vpcf_c b/sm/baoshiguangze_dust_mote.vpcf_c new file mode 100755 index 0000000..e8fd824 Binary files /dev/null and b/sm/baoshiguangze_dust_mote.vpcf_c differ diff --git a/sm/baoshiguangze_ground.vpcf_c b/sm/baoshiguangze_ground.vpcf_c new file mode 100755 index 0000000..40c984d Binary files /dev/null and b/sm/baoshiguangze_ground.vpcf_c differ diff --git a/sm/baoshiguangze_ground_b.vpcf_c b/sm/baoshiguangze_ground_b.vpcf_c new file mode 100755 index 0000000..72f66f0 Binary files /dev/null and b/sm/baoshiguangze_ground_b.vpcf_c differ diff --git a/sm/baoshiguangze_ground_c.vpcf_c b/sm/baoshiguangze_ground_c.vpcf_c new file mode 100755 index 0000000..39a0277 Binary files /dev/null and b/sm/baoshiguangze_ground_c.vpcf_c differ diff --git a/sm/baoshiguangze_ground_d.vpcf_c b/sm/baoshiguangze_ground_d.vpcf_c new file mode 100755 index 0000000..e26600f Binary files /dev/null and b/sm/baoshiguangze_ground_d.vpcf_c differ diff --git a/sm/baoshiguangze_light.vpcf_c b/sm/baoshiguangze_light.vpcf_c new file mode 100755 index 0000000..b2a916a Binary files /dev/null and b/sm/baoshiguangze_light.vpcf_c differ diff --git a/sm/baoshiguangze_sparkle.vpcf_c b/sm/baoshiguangze_sparkle.vpcf_c new file mode 100755 index 0000000..9329d00 Binary files /dev/null and b/sm/baoshiguangze_sparkle.vpcf_c differ diff --git a/sm/bingroushan.vpcf_c b/sm/bingroushan.vpcf_c new file mode 100755 index 0000000..0eb12e3 Binary files /dev/null and b/sm/bingroushan.vpcf_c differ diff --git a/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012.vpcf_c b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012.vpcf_c new file mode 100755 index 0000000..e3bf7b5 Binary files /dev/null and b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012.vpcf_c differ diff --git a/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_body.vpcf_c b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_body.vpcf_c new file mode 100755 index 0000000..bcf9e0e Binary files /dev/null and b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_body.vpcf_c differ diff --git a/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_body_b.vpcf_c b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_body_b.vpcf_c new file mode 100755 index 0000000..4a59781 Binary files /dev/null and b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_body_b.vpcf_c differ diff --git a/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_body_c.vpcf_c b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_body_c.vpcf_c new file mode 100755 index 0000000..9cbf9f7 Binary files /dev/null and b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_body_c.vpcf_c differ diff --git a/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_drifts.vpcf_c b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_drifts.vpcf_c new file mode 100755 index 0000000..0421952 Binary files /dev/null and b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_drifts.vpcf_c differ diff --git a/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_snow.vpcf_c b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_snow.vpcf_c new file mode 100755 index 0000000..7c8f300 Binary files /dev/null and b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_snow.vpcf_c differ diff --git a/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_snow_b.vpcf_c b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_snow_b.vpcf_c new file mode 100755 index 0000000..a55eac2 Binary files /dev/null and b/sm/bingxueecon/courier/courier_trail_winter_2012/courier_trail_winter_2012_snow_b.vpcf_c differ diff --git a/sm/bingxuerain_fx/snow_drift_b.vpcf_c b/sm/bingxuerain_fx/snow_drift_b.vpcf_c new file mode 100755 index 0000000..a126740 Binary files /dev/null and b/sm/bingxuerain_fx/snow_drift_b.vpcf_c differ diff --git a/sm/bingxuerain_fx/snow_fallback.vpcf_c b/sm/bingxuerain_fx/snow_fallback.vpcf_c new file mode 100755 index 0000000..a851b34 Binary files /dev/null and b/sm/bingxuerain_fx/snow_fallback.vpcf_c differ diff --git a/sm/bingxuerain_fx/snow_fallback_2.vpcf_c b/sm/bingxuerain_fx/snow_fallback_2.vpcf_c new file mode 100755 index 0000000..38cd646 Binary files /dev/null and b/sm/bingxuerain_fx/snow_fallback_2.vpcf_c differ diff --git a/sm/butterflies.vpcf_c b/sm/butterflies.vpcf_c new file mode 100755 index 0000000..c5d1098 Binary files /dev/null and b/sm/butterflies.vpcf_c differ diff --git a/sm/butterfly_blue.vpcf_c b/sm/butterfly_blue.vpcf_c new file mode 100755 index 0000000..8c46b5e Binary files /dev/null and b/sm/butterfly_blue.vpcf_c differ diff --git a/sm/butterfly_orange.vpcf_c b/sm/butterfly_orange.vpcf_c new file mode 100755 index 0000000..05e478b Binary files /dev/null and b/sm/butterfly_orange.vpcf_c differ diff --git a/sm/circle1.vpcf_c b/sm/circle1.vpcf_c new file mode 100755 index 0000000..ed352d4 Binary files /dev/null and b/sm/circle1.vpcf_c differ diff --git a/sm/cm_ti7_immortal_base_attack_snowball_2.vpcf_c b/sm/cm_ti7_immortal_base_attack_snowball_2.vpcf_c new file mode 100755 index 0000000..39151c9 Binary files /dev/null and b/sm/cm_ti7_immortal_base_attack_snowball_2.vpcf_c differ diff --git a/sm/econ/items/techies/techies_arcana/techies_suicide_arcana.vpcf_c b/sm/econ/items/techies/techies_arcana/techies_suicide_arcana.vpcf_c new file mode 100755 index 0000000..d8b4d45 Binary files /dev/null and b/sm/econ/items/techies/techies_arcana/techies_suicide_arcana.vpcf_c differ diff --git a/sm/econ/items/techies/techies_arcana/techies_suicide_fireworks_a_trail.vpcf_c b/sm/econ/items/techies/techies_arcana/techies_suicide_fireworks_a_trail.vpcf_c new file mode 100755 index 0000000..2d9e399 Binary files /dev/null and b/sm/econ/items/techies/techies_arcana/techies_suicide_fireworks_a_trail.vpcf_c differ diff --git a/sm/econ/items/techies/techies_arcana/techies_suicide_fireworks_a_trailflikr.vpcf_c b/sm/econ/items/techies/techies_arcana/techies_suicide_fireworks_a_trailflikr.vpcf_c new file mode 100755 index 0000000..120a20a Binary files /dev/null and b/sm/econ/items/techies/techies_arcana/techies_suicide_fireworks_a_trailflikr.vpcf_c differ diff --git a/sm/econ/items/techies/techies_arcana/techies_suicide_fireworks_boom_a.vpcf_c b/sm/econ/items/techies/techies_arcana/techies_suicide_fireworks_boom_a.vpcf_c new file mode 100755 index 0000000..5909374 Binary files /dev/null and b/sm/econ/items/techies/techies_arcana/techies_suicide_fireworks_boom_a.vpcf_c differ diff --git a/sm/econ/items/techies/techies_arcana/techies_suicide_fireworks_rockets_b.vpcf_c b/sm/econ/items/techies/techies_arcana/techies_suicide_fireworks_rockets_b.vpcf_c new file mode 100755 index 0000000..6844250 Binary files /dev/null and b/sm/econ/items/techies/techies_arcana/techies_suicide_fireworks_rockets_b.vpcf_c differ diff --git a/sm/emochibang.vpcf_c b/sm/emochibang.vpcf_c new file mode 100755 index 0000000..322978e Binary files /dev/null and b/sm/emochibang.vpcf_c differ diff --git a/sm/emochibang_edge.vpcf_c b/sm/emochibang_edge.vpcf_c new file mode 100755 index 0000000..f3ead19 Binary files /dev/null and b/sm/emochibang_edge.vpcf_c differ diff --git a/sm/emochibang_edge_b.vpcf_c b/sm/emochibang_edge_b.vpcf_c new file mode 100755 index 0000000..6573b49 Binary files /dev/null and b/sm/emochibang_edge_b.vpcf_c differ diff --git a/sm/emochibang_edge_c.vpcf_c b/sm/emochibang_edge_c.vpcf_c new file mode 100755 index 0000000..4472e47 Binary files /dev/null and b/sm/emochibang_edge_c.vpcf_c differ diff --git a/sm/emochibang_edge_d.vpcf_c b/sm/emochibang_edge_d.vpcf_c new file mode 100755 index 0000000..5972a5f Binary files /dev/null and b/sm/emochibang_edge_d.vpcf_c differ diff --git a/sm/emochibang_feathers.vpcf_c b/sm/emochibang_feathers.vpcf_c new file mode 100755 index 0000000..f5f1b62 Binary files /dev/null and b/sm/emochibang_feathers.vpcf_c differ diff --git a/sm/emochibang_smoke.vpcf_c b/sm/emochibang_smoke.vpcf_c new file mode 100755 index 0000000..2b1ae09 Binary files /dev/null and b/sm/emochibang_smoke.vpcf_c differ diff --git a/sm/emochibang_smoke_shad.vpcf_c b/sm/emochibang_smoke_shad.vpcf_c new file mode 100755 index 0000000..c444341 Binary files /dev/null and b/sm/emochibang_smoke_shad.vpcf_c differ diff --git a/sm/emochibang_smoke_trail.vpcf_c b/sm/emochibang_smoke_trail.vpcf_c new file mode 100755 index 0000000..5589b9c Binary files /dev/null and b/sm/emochibang_smoke_trail.vpcf_c differ diff --git a/sm/emochibang_tailspark.vpcf_c b/sm/emochibang_tailspark.vpcf_c new file mode 100755 index 0000000..9d394eb Binary files /dev/null and b/sm/emochibang_tailspark.vpcf_c differ diff --git a/sm/emochibang_trails.vpcf_c b/sm/emochibang_trails.vpcf_c new file mode 100755 index 0000000..6292500 Binary files /dev/null and b/sm/emochibang_trails.vpcf_c differ diff --git a/sm/emochibang_trails_high.vpcf_c b/sm/emochibang_trails_high.vpcf_c new file mode 100755 index 0000000..1facf06 Binary files /dev/null and b/sm/emochibang_trails_high.vpcf_c differ diff --git a/sm/emochibang_trails_source.vpcf_c b/sm/emochibang_trails_source.vpcf_c new file mode 100755 index 0000000..dcfcb21 Binary files /dev/null and b/sm/emochibang_trails_source.vpcf_c differ diff --git a/sm/firefly.vpcf_c b/sm/firefly.vpcf_c new file mode 100755 index 0000000..525068b Binary files /dev/null and b/sm/firefly.vpcf_c differ diff --git a/sm/glow.vpcf_c b/sm/glow.vpcf_c new file mode 100755 index 0000000..2e01a2a Binary files /dev/null and b/sm/glow.vpcf_c differ diff --git a/sm/grass/03.vpcf_c b/sm/grass/03.vpcf_c new file mode 100755 index 0000000..6628487 Binary files /dev/null and b/sm/grass/03.vpcf_c differ diff --git a/sm/grass/03_bugs.vpcf_c b/sm/grass/03_bugs.vpcf_c new file mode 100755 index 0000000..2816f38 Binary files /dev/null and b/sm/grass/03_bugs.vpcf_c differ diff --git a/sm/grass/03_butterfly.vpcf_c b/sm/grass/03_butterfly.vpcf_c new file mode 100755 index 0000000..cb90d47 Binary files /dev/null and b/sm/grass/03_butterfly.vpcf_c differ diff --git a/sm/grass/03_butterfly_b.vpcf_c b/sm/grass/03_butterfly_b.vpcf_c new file mode 100755 index 0000000..3b593bc Binary files /dev/null and b/sm/grass/03_butterfly_b.vpcf_c differ diff --git a/sm/grass/03b.vpcf_c b/sm/grass/03b.vpcf_c new file mode 100755 index 0000000..24cb3f9 Binary files /dev/null and b/sm/grass/03b.vpcf_c differ diff --git a/sm/grass/03c.vpcf_c b/sm/grass/03c.vpcf_c new file mode 100755 index 0000000..760966a Binary files /dev/null and b/sm/grass/03c.vpcf_c differ diff --git a/sm/grass/03d.vpcf_c b/sm/grass/03d.vpcf_c new file mode 100755 index 0000000..13e729a Binary files /dev/null and b/sm/grass/03d.vpcf_c differ diff --git a/sm/grass/grass.vpcf_c b/sm/grass/grass.vpcf_c new file mode 100755 index 0000000..68776ad Binary files /dev/null and b/sm/grass/grass.vpcf_c differ diff --git a/sm/guang1econ/items/crystal_maiden/crystal_maiden_maiden_of_icewrack/cm_arcana_pup_lvlup_glow.vpcf_c b/sm/guang1econ/items/crystal_maiden/crystal_maiden_maiden_of_icewrack/cm_arcana_pup_lvlup_glow.vpcf_c new file mode 100755 index 0000000..c3a08e7 Binary files /dev/null and b/sm/guang1econ/items/crystal_maiden/crystal_maiden_maiden_of_icewrack/cm_arcana_pup_lvlup_glow.vpcf_c differ diff --git a/sm/guang1econ/items/crystal_maiden/crystal_maiden_maiden_of_icewrack/cm_arcana_pup_lvlup_godray_ember.vpcf_c b/sm/guang1econ/items/crystal_maiden/crystal_maiden_maiden_of_icewrack/cm_arcana_pup_lvlup_godray_ember.vpcf_c new file mode 100755 index 0000000..995acc8 Binary files /dev/null and b/sm/guang1econ/items/crystal_maiden/crystal_maiden_maiden_of_icewrack/cm_arcana_pup_lvlup_godray_ember.vpcf_c differ diff --git a/sm/guang1econ/items/crystal_maiden/crystal_maiden_maiden_of_icewrack/cm_arcana_pup_lvlup_godray_hit_flare.vpcf_c b/sm/guang1econ/items/crystal_maiden/crystal_maiden_maiden_of_icewrack/cm_arcana_pup_lvlup_godray_hit_flare.vpcf_c new file mode 100755 index 0000000..742ab4e Binary files /dev/null and b/sm/guang1econ/items/crystal_maiden/crystal_maiden_maiden_of_icewrack/cm_arcana_pup_lvlup_godray_hit_flare.vpcf_c differ diff --git a/sm/guang1vr/player_light_godray.vpcf_c b/sm/guang1vr/player_light_godray.vpcf_c new file mode 100755 index 0000000..5b44cbf Binary files /dev/null and b/sm/guang1vr/player_light_godray.vpcf_c differ diff --git a/sm/guanghuisuiyue.vpcf_c b/sm/guanghuisuiyue.vpcf_c new file mode 100755 index 0000000..0f6a6e5 Binary files /dev/null and b/sm/guanghuisuiyue.vpcf_c differ diff --git a/sm/guanghuisuiyue_a.vpcf_c b/sm/guanghuisuiyue_a.vpcf_c new file mode 100755 index 0000000..08739cb Binary files /dev/null and b/sm/guanghuisuiyue_a.vpcf_c differ diff --git a/sm/guanghuisuiyue_b.vpcf_c b/sm/guanghuisuiyue_b.vpcf_c new file mode 100755 index 0000000..83c339a Binary files /dev/null and b/sm/guanghuisuiyue_b.vpcf_c differ diff --git a/sm/hapi.vpcf_c b/sm/hapi.vpcf_c new file mode 100755 index 0000000..42b61f0 Binary files /dev/null and b/sm/hapi.vpcf_c differ diff --git a/sm/hongxin/ambient.vpcf_c b/sm/hongxin/ambient.vpcf_c new file mode 100755 index 0000000..2ff5864 Binary files /dev/null and b/sm/hongxin/ambient.vpcf_c differ diff --git a/sm/hongxin/ambient_back.vpcf_c b/sm/hongxin/ambient_back.vpcf_c new file mode 100755 index 0000000..9e51ee4 Binary files /dev/null and b/sm/hongxin/ambient_back.vpcf_c differ diff --git a/sm/hongxin/ambient_back_trail.vpcf_c b/sm/hongxin/ambient_back_trail.vpcf_c new file mode 100755 index 0000000..be10c4b Binary files /dev/null and b/sm/hongxin/ambient_back_trail.vpcf_c differ diff --git a/sm/hongxin/ambient_backblue.vpcf_c b/sm/hongxin/ambient_backblue.vpcf_c new file mode 100755 index 0000000..5bc288d Binary files /dev/null and b/sm/hongxin/ambient_backblue.vpcf_c differ diff --git a/sm/hongxin/ambient_cuff.vpcf_c b/sm/hongxin/ambient_cuff.vpcf_c new file mode 100755 index 0000000..272d609 Binary files /dev/null and b/sm/hongxin/ambient_cuff.vpcf_c differ diff --git a/sm/hongxin/ambient_front.vpcf_c b/sm/hongxin/ambient_front.vpcf_c new file mode 100755 index 0000000..a659491 Binary files /dev/null and b/sm/hongxin/ambient_front.vpcf_c differ diff --git a/sm/hongxin/ambient_pedals.vpcf_c b/sm/hongxin/ambient_pedals.vpcf_c new file mode 100755 index 0000000..e5c99fa Binary files /dev/null and b/sm/hongxin/ambient_pedals.vpcf_c differ diff --git a/sm/hongxin/cuffsmoke.vpcf_c b/sm/hongxin/cuffsmoke.vpcf_c new file mode 100755 index 0000000..4a02216 Binary files /dev/null and b/sm/hongxin/cuffsmoke.vpcf_c differ diff --git a/sm/hongxin/cuffsmoke_b.vpcf_c b/sm/hongxin/cuffsmoke_b.vpcf_c new file mode 100755 index 0000000..ca4f344 Binary files /dev/null and b/sm/hongxin/cuffsmoke_b.vpcf_c differ diff --git a/sm/hongxin/flares.vpcf_c b/sm/hongxin/flares.vpcf_c new file mode 100755 index 0000000..41a2a3d Binary files /dev/null and b/sm/hongxin/flares.vpcf_c differ diff --git a/sm/hongxin/hearts.vpcf_c b/sm/hongxin/hearts.vpcf_c new file mode 100755 index 0000000..cc7b024 Binary files /dev/null and b/sm/hongxin/hearts.vpcf_c differ diff --git a/sm/jinbi_soft_smoke.vpcf_c b/sm/jinbi_soft_smoke.vpcf_c new file mode 100755 index 0000000..588546a Binary files /dev/null and b/sm/jinbi_soft_smoke.vpcf_c differ diff --git a/sm/lizizhiqiambient.vpcf_c b/sm/lizizhiqiambient.vpcf_c new file mode 100755 index 0000000..69be911 Binary files /dev/null and b/sm/lizizhiqiambient.vpcf_c differ diff --git a/sm/lizizhiqiambient_b.vpcf_c b/sm/lizizhiqiambient_b.vpcf_c new file mode 100755 index 0000000..1769ae6 Binary files /dev/null and b/sm/lizizhiqiambient_b.vpcf_c differ diff --git a/sm/lizizhiqiambient_c.vpcf_c b/sm/lizizhiqiambient_c.vpcf_c new file mode 100755 index 0000000..342f4e5 Binary files /dev/null and b/sm/lizizhiqiambient_c.vpcf_c differ diff --git a/sm/lizizhiqiambient_d.vpcf_c b/sm/lizizhiqiambient_d.vpcf_c new file mode 100755 index 0000000..b005ce9 Binary files /dev/null and b/sm/lizizhiqiambient_d.vpcf_c differ diff --git a/sm/lizizhiqiambient_e.vpcf_c b/sm/lizizhiqiambient_e.vpcf_c new file mode 100755 index 0000000..7fd720d Binary files /dev/null and b/sm/lizizhiqiambient_e.vpcf_c differ diff --git a/sm/lizizhiqiambient_f.vpcf_c b/sm/lizizhiqiambient_f.vpcf_c new file mode 100755 index 0000000..43b77e0 Binary files /dev/null and b/sm/lizizhiqiambient_f.vpcf_c differ diff --git a/sm/lizizhiqieye.vpcf_c b/sm/lizizhiqieye.vpcf_c new file mode 100755 index 0000000..bd2b8df Binary files /dev/null and b/sm/lizizhiqieye.vpcf_c differ diff --git a/sm/lizizhiqieyes.vpcf_c b/sm/lizizhiqieyes.vpcf_c new file mode 100755 index 0000000..5e2001c Binary files /dev/null and b/sm/lizizhiqieyes.vpcf_c differ diff --git a/sm/lizizhiqieyes_b.vpcf_c b/sm/lizizhiqieyes_b.vpcf_c new file mode 100755 index 0000000..38033bb Binary files /dev/null and b/sm/lizizhiqieyes_b.vpcf_c differ diff --git a/sm/lizizhiqieyes_c.vpcf_c b/sm/lizizhiqieyes_c.vpcf_c new file mode 100755 index 0000000..da3cdae Binary files /dev/null and b/sm/lizizhiqieyes_c.vpcf_c differ diff --git a/sm/lizizhiqieyes_d.vpcf_c b/sm/lizizhiqieyes_d.vpcf_c new file mode 100755 index 0000000..ff0a8f8 Binary files /dev/null and b/sm/lizizhiqieyes_d.vpcf_c differ diff --git a/sm/loveblack.vpcf_c b/sm/loveblack.vpcf_c new file mode 100755 index 0000000..122bd79 Binary files /dev/null and b/sm/loveblack.vpcf_c differ diff --git a/sm/loveblack_trail.vpcf_c b/sm/loveblack_trail.vpcf_c new file mode 100755 index 0000000..9a50177 Binary files /dev/null and b/sm/loveblack_trail.vpcf_c differ diff --git a/sm/loveblack_trail_detail.vpcf_c b/sm/loveblack_trail_detail.vpcf_c new file mode 100755 index 0000000..ac86c0b Binary files /dev/null and b/sm/loveblack_trail_detail.vpcf_c differ diff --git a/sm/loveblack_trail_embers.vpcf_c b/sm/loveblack_trail_embers.vpcf_c new file mode 100755 index 0000000..9b6cd89 Binary files /dev/null and b/sm/loveblack_trail_embers.vpcf_c differ diff --git a/sm/mogu.vpcf_c b/sm/mogu.vpcf_c new file mode 100755 index 0000000..c6545a0 Binary files /dev/null and b/sm/mogu.vpcf_c differ diff --git a/sm/mogu_b.vpcf_c b/sm/mogu_b.vpcf_c new file mode 100755 index 0000000..76c5b53 Binary files /dev/null and b/sm/mogu_b.vpcf_c differ diff --git a/sm/mogu_c.vpcf_c b/sm/mogu_c.vpcf_c new file mode 100755 index 0000000..2e80ade Binary files /dev/null and b/sm/mogu_c.vpcf_c differ diff --git a/sm/mogu_d.vpcf_c b/sm/mogu_d.vpcf_c new file mode 100755 index 0000000..e6d7a4a Binary files /dev/null and b/sm/mogu_d.vpcf_c differ diff --git a/sm/mogu_e.vpcf_c b/sm/mogu_e.vpcf_c new file mode 100755 index 0000000..3e904d4 Binary files /dev/null and b/sm/mogu_e.vpcf_c differ diff --git a/sm/mogu_f.vpcf_c b/sm/mogu_f.vpcf_c new file mode 100755 index 0000000..73003df Binary files /dev/null and b/sm/mogu_f.vpcf_c differ diff --git a/sm/mogu_g.vpcf_c b/sm/mogu_g.vpcf_c new file mode 100755 index 0000000..d9ca83c Binary files /dev/null and b/sm/mogu_g.vpcf_c differ diff --git a/sm/nihonghudieglow_blue.vpcf_c b/sm/nihonghudieglow_blue.vpcf_c new file mode 100755 index 0000000..45fa0c5 Binary files /dev/null and b/sm/nihonghudieglow_blue.vpcf_c differ diff --git a/sm/nihonghudiemagic_blue.vpcf_c b/sm/nihonghudiemagic_blue.vpcf_c new file mode 100755 index 0000000..11c48f2 Binary files /dev/null and b/sm/nihonghudiemagic_blue.vpcf_c differ diff --git a/sm/ring_black.vpcf_c b/sm/ring_black.vpcf_c new file mode 100755 index 0000000..c2fbb29 Binary files /dev/null and b/sm/ring_black.vpcf_c differ diff --git a/sm/ring_white.vpcf_c b/sm/ring_white.vpcf_c new file mode 100755 index 0000000..43000f1 Binary files /dev/null and b/sm/ring_white.vpcf_c differ diff --git a/sm/rongyanroushan.vpcf_c b/sm/rongyanroushan.vpcf_c new file mode 100755 index 0000000..4090a6c Binary files /dev/null and b/sm/rongyanroushan.vpcf_c differ diff --git a/sm/rongyanroushan_ember.vpcf_c b/sm/rongyanroushan_ember.vpcf_c new file mode 100755 index 0000000..d77cc07 Binary files /dev/null and b/sm/rongyanroushan_ember.vpcf_c differ diff --git a/sm/rongyanroushan_eyes.vpcf_c b/sm/rongyanroushan_eyes.vpcf_c new file mode 100755 index 0000000..c23c1b2 Binary files /dev/null and b/sm/rongyanroushan_eyes.vpcf_c differ diff --git a/sm/rongyanroushan_eyes_b.vpcf_c b/sm/rongyanroushan_eyes_b.vpcf_c new file mode 100755 index 0000000..cc9760d Binary files /dev/null and b/sm/rongyanroushan_eyes_b.vpcf_c differ diff --git a/sm/rongyanroushan_eyes_c.vpcf_c b/sm/rongyanroushan_eyes_c.vpcf_c new file mode 100755 index 0000000..10abbcb Binary files /dev/null and b/sm/rongyanroushan_eyes_c.vpcf_c differ diff --git a/sm/rongyanroushan_eyes_d.vpcf_c b/sm/rongyanroushan_eyes_d.vpcf_c new file mode 100755 index 0000000..f382aa3 Binary files /dev/null and b/sm/rongyanroushan_eyes_d.vpcf_c differ diff --git a/sm/rongyanroushan_fire.vpcf_c b/sm/rongyanroushan_fire.vpcf_c new file mode 100755 index 0000000..0c870a4 Binary files /dev/null and b/sm/rongyanroushan_fire.vpcf_c differ diff --git a/sm/rongyanroushan_ground.vpcf_c b/sm/rongyanroushan_ground.vpcf_c new file mode 100755 index 0000000..ff60082 Binary files /dev/null and b/sm/rongyanroushan_ground.vpcf_c differ diff --git a/sm/rongyanroushan_halo.vpcf_c b/sm/rongyanroushan_halo.vpcf_c new file mode 100755 index 0000000..a29c838 Binary files /dev/null and b/sm/rongyanroushan_halo.vpcf_c differ diff --git a/sm/rongyanroushan_steam.vpcf_c b/sm/rongyanroushan_steam.vpcf_c new file mode 100755 index 0000000..8aa527c Binary files /dev/null and b/sm/rongyanroushan_steam.vpcf_c differ diff --git a/sm/ruby.vpcf_c b/sm/ruby.vpcf_c new file mode 100755 index 0000000..960d8fd Binary files /dev/null and b/sm/ruby.vpcf_c differ diff --git a/sm/ruby_c.vpcf_c b/sm/ruby_c.vpcf_c new file mode 100755 index 0000000..abb18d6 Binary files /dev/null and b/sm/ruby_c.vpcf_c differ diff --git a/sm/ruby_d.vpcf_c b/sm/ruby_d.vpcf_c new file mode 100755 index 0000000..3c96490 Binary files /dev/null and b/sm/ruby_d.vpcf_c differ diff --git a/sm/ruby_e.vpcf_c b/sm/ruby_e.vpcf_c new file mode 100755 index 0000000..fc0f3ac Binary files /dev/null and b/sm/ruby_e.vpcf_c differ diff --git a/sm/uicide_fire_geo.vpcf_c b/sm/uicide_fire_geo.vpcf_c new file mode 100755 index 0000000..7c96674 Binary files /dev/null and b/sm/uicide_fire_geo.vpcf_c differ diff --git a/sm/uicide_flash_e.vpcf_c b/sm/uicide_flash_e.vpcf_c new file mode 100755 index 0000000..b182d15 Binary files /dev/null and b/sm/uicide_flash_e.vpcf_c differ diff --git a/sm/uicide_fluidlarge.vpcf_c b/sm/uicide_fluidlarge.vpcf_c new file mode 100755 index 0000000..dafe0d4 Binary files /dev/null and b/sm/uicide_fluidlarge.vpcf_c differ diff --git a/sm/uicide_model.vpcf_c b/sm/uicide_model.vpcf_c new file mode 100755 index 0000000..dc8c2c0 Binary files /dev/null and b/sm/uicide_model.vpcf_c differ diff --git a/sm/uicide_shockwave.vpcf_c b/sm/uicide_shockwave.vpcf_c new file mode 100755 index 0000000..2c4a458 Binary files /dev/null and b/sm/uicide_shockwave.vpcf_c differ diff --git a/sm/uicide_smokelarge.vpcf_c b/sm/uicide_smokelarge.vpcf_c new file mode 100755 index 0000000..645e83c Binary files /dev/null and b/sm/uicide_smokelarge.vpcf_c differ diff --git a/sm/uicide_sparks.vpcf_c b/sm/uicide_sparks.vpcf_c new file mode 100755 index 0000000..26a39a1 Binary files /dev/null and b/sm/uicide_sparks.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_smoketrail.vpcf_c b/sm/units/heroes/hero_techies/techies_smoketrail.vpcf_c new file mode 100755 index 0000000..805c017 Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_smoketrail.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_ss_death_streak.vpcf_c b/sm/units/heroes/hero_techies/techies_ss_death_streak.vpcf_c new file mode 100755 index 0000000..2f7e899 Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_ss_death_streak.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_ss_death_streak_hard.vpcf_c b/sm/units/heroes/hero_techies/techies_ss_death_streak_hard.vpcf_c new file mode 100755 index 0000000..5b02303 Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_ss_death_streak_hard.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_ss_explosion_fingers.vpcf_c b/sm/units/heroes/hero_techies/techies_ss_explosion_fingers.vpcf_c new file mode 100755 index 0000000..00fd6ca Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_ss_explosion_fingers.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_suicide_base.vpcf_c b/sm/units/heroes/hero_techies/techies_suicide_base.vpcf_c new file mode 100755 index 0000000..e32f08a Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_suicide_base.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_suicide_fire.vpcf_c b/sm/units/heroes/hero_techies/techies_suicide_fire.vpcf_c new file mode 100755 index 0000000..4c59f45 Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_suicide_fire.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_suicide_fire_geo.vpcf_c b/sm/units/heroes/hero_techies/techies_suicide_fire_geo.vpcf_c new file mode 100755 index 0000000..041f663 Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_suicide_fire_geo.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_suicide_flash_e.vpcf_c b/sm/units/heroes/hero_techies/techies_suicide_flash_e.vpcf_c new file mode 100755 index 0000000..8d4ad33 Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_suicide_flash_e.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_suicide_fluidlarge.vpcf_c b/sm/units/heroes/hero_techies/techies_suicide_fluidlarge.vpcf_c new file mode 100755 index 0000000..94764d4 Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_suicide_fluidlarge.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_suicide_model.vpcf_c b/sm/units/heroes/hero_techies/techies_suicide_model.vpcf_c new file mode 100755 index 0000000..ac48b65 Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_suicide_model.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_suicide_shockwave.vpcf_c b/sm/units/heroes/hero_techies/techies_suicide_shockwave.vpcf_c new file mode 100755 index 0000000..dc575dc Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_suicide_shockwave.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_suicide_smokelarge.vpcf_c b/sm/units/heroes/hero_techies/techies_suicide_smokelarge.vpcf_c new file mode 100755 index 0000000..bf43a33 Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_suicide_smokelarge.vpcf_c differ diff --git a/sm/units/heroes/hero_techies/techies_suicide_sparks.vpcf_c b/sm/units/heroes/hero_techies/techies_suicide_sparks.vpcf_c new file mode 100755 index 0000000..1d29edb Binary files /dev/null and b/sm/units/heroes/hero_techies/techies_suicide_sparks.vpcf_c differ diff --git a/sm/wuwuwuwuwu.vpcf_c b/sm/wuwuwuwuwu.vpcf_c new file mode 100755 index 0000000..c0834a2 Binary files /dev/null and b/sm/wuwuwuwuwu.vpcf_c differ diff --git a/sm/xianqichanrao_glow.vpcf_c b/sm/xianqichanrao_glow.vpcf_c new file mode 100755 index 0000000..f2fb545 Binary files /dev/null and b/sm/xianqichanrao_glow.vpcf_c differ diff --git a/sm/xianqichanrao_glow_rev.vpcf_c b/sm/xianqichanrao_glow_rev.vpcf_c new file mode 100755 index 0000000..be07ff2 Binary files /dev/null and b/sm/xianqichanrao_glow_rev.vpcf_c differ diff --git a/sm/xiehuodefault.vpcf_c b/sm/xiehuodefault.vpcf_c new file mode 100755 index 0000000..8a25f22 Binary files /dev/null and b/sm/xiehuodefault.vpcf_c differ diff --git a/sm/xiehuoember_base.vpcf_c b/sm/xiehuoember_base.vpcf_c new file mode 100755 index 0000000..f54c447 Binary files /dev/null and b/sm/xiehuoember_base.vpcf_c differ diff --git a/sm/xiehuoglow.vpcf_c b/sm/xiehuoglow.vpcf_c new file mode 100755 index 0000000..e0bb355 Binary files /dev/null and b/sm/xiehuoglow.vpcf_c differ diff --git a/sm/xiehuoswirl.vpcf_c b/sm/xiehuoswirl.vpcf_c new file mode 100755 index 0000000..31e3fc3 Binary files /dev/null and b/sm/xiehuoswirl.vpcf_c differ diff --git a/sm/xingxingc.vpcf_c b/sm/xingxingc.vpcf_c new file mode 100755 index 0000000..c6cc68d Binary files /dev/null and b/sm/xingxingc.vpcf_c differ diff --git a/sm/xingxingold.vpcf_c b/sm/xingxingold.vpcf_c new file mode 100755 index 0000000..a6131d5 Binary files /dev/null and b/sm/xingxingold.vpcf_c differ diff --git a/sm/xuehua.vpcf_c b/sm/xuehua.vpcf_c new file mode 100755 index 0000000..2e08024 Binary files /dev/null and b/sm/xuehua.vpcf_c differ diff --git a/sm/zisexingyunglow.vpcf_c b/sm/zisexingyunglow.vpcf_c new file mode 100755 index 0000000..fea7410 Binary files /dev/null and b/sm/zisexingyunglow.vpcf_c differ diff --git a/sm/zisexingyunrays.vpcf_c b/sm/zisexingyunrays.vpcf_c new file mode 100755 index 0000000..3bdb9e7 Binary files /dev/null and b/sm/zisexingyunrays.vpcf_c differ diff --git a/sm/zisexingyunsecondary_flare.vpcf_c b/sm/zisexingyunsecondary_flare.vpcf_c new file mode 100755 index 0000000..e38c206 Binary files /dev/null and b/sm/zisexingyunsecondary_flare.vpcf_c differ diff --git a/sm/zisexingyuntrail_secondary.vpcf_c b/sm/zisexingyuntrail_secondary.vpcf_c new file mode 100755 index 0000000..c57d37f Binary files /dev/null and b/sm/zisexingyuntrail_secondary.vpcf_c differ diff --git a/sm/ziyuangeneric/courier_greevil_body_generic.vpcf_c b/sm/ziyuangeneric/courier_greevil_body_generic.vpcf_c new file mode 100755 index 0000000..54e5e79 Binary files /dev/null and b/sm/ziyuangeneric/courier_greevil_body_generic.vpcf_c differ diff --git a/sm/ziyuangeneric/courier_greevil_body_generic_b.vpcf_c b/sm/ziyuangeneric/courier_greevil_body_generic_b.vpcf_c new file mode 100755 index 0000000..82709cf Binary files /dev/null and b/sm/ziyuangeneric/courier_greevil_body_generic_b.vpcf_c differ diff --git a/sm/ziyuangeneric/courier_greevil_eye_generic.vpcf_c b/sm/ziyuangeneric/courier_greevil_eye_generic.vpcf_c new file mode 100755 index 0000000..10e15ce Binary files /dev/null and b/sm/ziyuangeneric/courier_greevil_eye_generic.vpcf_c differ diff --git a/sm/ziyuangeneric/courier_greevil_eye_generic_a.vpcf_c b/sm/ziyuangeneric/courier_greevil_eye_generic_a.vpcf_c new file mode 100755 index 0000000..1f2627c Binary files /dev/null and b/sm/ziyuangeneric/courier_greevil_eye_generic_a.vpcf_c differ diff --git a/sm/ziyuangeneric/courier_greevil_eye_generic_b.vpcf_c b/sm/ziyuangeneric/courier_greevil_eye_generic_b.vpcf_c new file mode 100755 index 0000000..40860e0 Binary files /dev/null and b/sm/ziyuangeneric/courier_greevil_eye_generic_b.vpcf_c differ diff --git a/sm/ziyuangeneric/courier_greevil_eye_generic_c.vpcf_c b/sm/ziyuangeneric/courier_greevil_eye_generic_c.vpcf_c new file mode 100755 index 0000000..3f96bec Binary files /dev/null and b/sm/ziyuangeneric/courier_greevil_eye_generic_c.vpcf_c differ diff --git a/sm/ziyuanpurple/courier_greevil_purple_ambient_3.vpcf_c b/sm/ziyuanpurple/courier_greevil_purple_ambient_3.vpcf_c new file mode 100755 index 0000000..8e52ef8 Binary files /dev/null and b/sm/ziyuanpurple/courier_greevil_purple_ambient_3.vpcf_c differ diff --git a/sm/ziyuanpurple/courier_greevil_purple_ambient_3_a.vpcf_c b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_a.vpcf_c new file mode 100755 index 0000000..bb7ad17 Binary files /dev/null and b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_a.vpcf_c differ diff --git a/sm/ziyuanpurple/courier_greevil_purple_ambient_3_a_pop.vpcf_c b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_a_pop.vpcf_c new file mode 100755 index 0000000..4729e34 Binary files /dev/null and b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_a_pop.vpcf_c differ diff --git a/sm/ziyuanpurple/courier_greevil_purple_ambient_3_b.vpcf_c b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_b.vpcf_c new file mode 100755 index 0000000..6089c58 Binary files /dev/null and b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_b.vpcf_c differ diff --git a/sm/ziyuanpurple/courier_greevil_purple_ambient_3_c.vpcf_c b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_c.vpcf_c new file mode 100755 index 0000000..cc4f76c Binary files /dev/null and b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_c.vpcf_c differ diff --git a/sm/ziyuanpurple/courier_greevil_purple_ambient_3_e.vpcf_c b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_e.vpcf_c new file mode 100755 index 0000000..2ecf477 Binary files /dev/null and b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_e.vpcf_c differ diff --git a/sm/ziyuanpurple/courier_greevil_purple_ambient_3_f.vpcf_c b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_f.vpcf_c new file mode 100755 index 0000000..d08c47f Binary files /dev/null and b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_f.vpcf_c differ diff --git a/sm/ziyuanpurple/courier_greevil_purple_ambient_3_g.vpcf_c b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_g.vpcf_c new file mode 100755 index 0000000..bd53d44 Binary files /dev/null and b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_g.vpcf_c differ diff --git a/sm/ziyuanpurple/courier_greevil_purple_ambient_3_h.vpcf_c b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_h.vpcf_c new file mode 100755 index 0000000..a05963c Binary files /dev/null and b/sm/ziyuanpurple/courier_greevil_purple_ambient_3_h.vpcf_c differ diff --git a/soundevents/custom_game/store.vsndevts_c b/soundevents/custom_game/store.vsndevts_c new file mode 100755 index 0000000..369eb9c Binary files /dev/null and b/soundevents/custom_game/store.vsndevts_c differ diff --git a/soundevents/custom_game/ui.vsndevts_c b/soundevents/custom_game/ui.vsndevts_c new file mode 100755 index 0000000..f258f31 Binary files /dev/null and b/soundevents/custom_game/ui.vsndevts_c differ diff --git a/soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts_c b/soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts_c new file mode 100755 index 0000000..1d53902 Binary files /dev/null and b/soundevents/game_sounds/thdots_tower_attack_sounds.vsndevts_c differ diff --git a/soundevents/game_sounds/thdots_tower_sound_voice.vsndevts_c b/soundevents/game_sounds/thdots_tower_sound_voice.vsndevts_c new file mode 100755 index 0000000..53ec3d4 Binary files /dev/null and b/soundevents/game_sounds/thdots_tower_sound_voice.vsndevts_c differ diff --git a/soundevents/game_sounds/thdots_tower_sounds.vsndevts_c b/soundevents/game_sounds/thdots_tower_sounds.vsndevts_c new file mode 100755 index 0000000..09fb096 Binary files /dev/null and b/soundevents/game_sounds/thdots_tower_sounds.vsndevts_c differ diff --git a/soundevents/game_sounds_custom.vsndevts_c b/soundevents/game_sounds_custom.vsndevts_c new file mode 100755 index 0000000..59fba02 Binary files /dev/null and b/soundevents/game_sounds_custom.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_alice_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_alice_sounds.vsndevts_c new file mode 100755 index 0000000..1f8d286 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_alice_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_aya_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_aya_sounds.vsndevts_c new file mode 100755 index 0000000..7bde893 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_aya_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_cirno_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_cirno_sounds.vsndevts_c new file mode 100755 index 0000000..1672921 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_cirno_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_flandre_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_flandre_sounds.vsndevts_c new file mode 100755 index 0000000..dc00978 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_flandre_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_iku_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_iku_sounds.vsndevts_c new file mode 100755 index 0000000..e936594 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_iku_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_kaguya_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_kaguya_sounds.vsndevts_c new file mode 100755 index 0000000..b2d05bd Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_kaguya_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_kanako_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_kanako_sounds.vsndevts_c new file mode 100755 index 0000000..9427ca3 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_kanako_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_koishi_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_koishi_sounds.vsndevts_c new file mode 100755 index 0000000..88ef01a Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_koishi_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_marisa_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_marisa_sounds.vsndevts_c new file mode 100755 index 0000000..0073ec0 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_marisa_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_minamitsu_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_minamitsu_sounds.vsndevts_c new file mode 100755 index 0000000..acaf45f Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_minamitsu_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_minoriko_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_minoriko_sounds.vsndevts_c new file mode 100755 index 0000000..9c0fb89 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_minoriko_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_momiji_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_momiji_sounds.vsndevts_c new file mode 100755 index 0000000..ab88b95 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_momiji_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_nue_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_nue_sounds.vsndevts_c new file mode 100755 index 0000000..e3fab63 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_nue_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_ran_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_ran_sounds.vsndevts_c new file mode 100755 index 0000000..ffc4cb3 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_ran_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_reimu_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_reimu_sounds.vsndevts_c new file mode 100755 index 0000000..588bae3 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_reimu_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_reisen_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_reisen_sounds.vsndevts_c new file mode 100755 index 0000000..e54a38c Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_reisen_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_remilia_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_remilia_sounds.vsndevts_c new file mode 100755 index 0000000..a8e4be9 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_remilia_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_sakuya_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_sakuya_sounds.vsndevts_c new file mode 100755 index 0000000..9b592bb Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_sakuya_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_sanae_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_sanae_sounds.vsndevts_c new file mode 100755 index 0000000..1c207d6 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_sanae_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_shikieiki_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_shikieiki_sounds.vsndevts_c new file mode 100755 index 0000000..8448c85 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_shikieiki_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_tenshi_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_tenshi_sounds.vsndevts_c new file mode 100755 index 0000000..232f0c6 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_tenshi_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_utsuho_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_utsuho_sounds.vsndevts_c new file mode 100755 index 0000000..1f444bc Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_utsuho_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_youmu_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_youmu_sounds.vsndevts_c new file mode 100755 index 0000000..8c0e9e8 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_youmu_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_yukari_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_yukari_sounds.vsndevts_c new file mode 100755 index 0000000..49f7873 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_yukari_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_yumemi_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_yumemi_sounds.vsndevts_c new file mode 100755 index 0000000..0b6112e Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_yumemi_sounds.vsndevts_c differ diff --git a/soundevents/thdots_hero_sounds/thdots_yuyuko_sounds.vsndevts_c b/soundevents/thdots_hero_sounds/thdots_yuyuko_sounds.vsndevts_c new file mode 100755 index 0000000..a2e50e2 Binary files /dev/null and b/soundevents/thdots_hero_sounds/thdots_yuyuko_sounds.vsndevts_c differ diff --git a/sounds/ability/0001_lily_ability1.vsnd_c b/sounds/ability/0001_lily_ability1.vsnd_c new file mode 100755 index 0000000..f465d80 Binary files /dev/null and b/sounds/ability/0001_lily_ability1.vsnd_c differ diff --git a/sounds/ability/0014_marlin_ability1_01.vsnd_c b/sounds/ability/0014_marlin_ability1_01.vsnd_c new file mode 100755 index 0000000..91198f7 Binary files /dev/null and b/sounds/ability/0014_marlin_ability1_01.vsnd_c differ diff --git a/sounds/ability/0014_marlin_ability1_02.vsnd_c b/sounds/ability/0014_marlin_ability1_02.vsnd_c new file mode 100755 index 0000000..1e53dcc Binary files /dev/null and b/sounds/ability/0014_marlin_ability1_02.vsnd_c differ diff --git a/sounds/ability/0019_marisa_ability1_5s.vsnd_c b/sounds/ability/0019_marisa_ability1_5s.vsnd_c new file mode 100755 index 0000000..ca419b9 Binary files /dev/null and b/sounds/ability/0019_marisa_ability1_5s.vsnd_c differ diff --git a/sounds/ability/0019_marisa_ability1_7s.vsnd_c b/sounds/ability/0019_marisa_ability1_7s.vsnd_c new file mode 100755 index 0000000..07b8a1d Binary files /dev/null and b/sounds/ability/0019_marisa_ability1_7s.vsnd_c differ diff --git a/sounds/ability/0019_marisa_ability3_5s.vsnd_c b/sounds/ability/0019_marisa_ability3_5s.vsnd_c new file mode 100755 index 0000000..666e0fe Binary files /dev/null and b/sounds/ability/0019_marisa_ability3_5s.vsnd_c differ diff --git a/sounds/ability/0019_marisa_ability3_7s.vsnd_c b/sounds/ability/0019_marisa_ability3_7s.vsnd_c new file mode 100755 index 0000000..facba68 Binary files /dev/null and b/sounds/ability/0019_marisa_ability3_7s.vsnd_c differ diff --git a/sounds/ability/0021_pachouli_ability1_3.vsnd_c b/sounds/ability/0021_pachouli_ability1_3.vsnd_c new file mode 100755 index 0000000..5129a4c Binary files /dev/null and b/sounds/ability/0021_pachouli_ability1_3.vsnd_c differ diff --git a/sounds/ability/0023_reisen_ability2.vsnd_c b/sounds/ability/0023_reisen_ability2.vsnd_c new file mode 100755 index 0000000..7a45fb0 Binary files /dev/null and b/sounds/ability/0023_reisen_ability2.vsnd_c differ diff --git a/sounds/ability/0023_reisen_ability3.vsnd_c b/sounds/ability/0023_reisen_ability3.vsnd_c new file mode 100755 index 0000000..8711fc1 Binary files /dev/null and b/sounds/ability/0023_reisen_ability3.vsnd_c differ diff --git a/sounds/ability/0024_yuyuko_ability1.vsnd_c b/sounds/ability/0024_yuyuko_ability1.vsnd_c new file mode 100755 index 0000000..fd63f1a Binary files /dev/null and b/sounds/ability/0024_yuyuko_ability1.vsnd_c differ diff --git a/sounds/ability/0025_youmu_ability3.vsnd_c b/sounds/ability/0025_youmu_ability3.vsnd_c new file mode 100755 index 0000000..ca0bebe Binary files /dev/null and b/sounds/ability/0025_youmu_ability3.vsnd_c differ diff --git a/sounds/ability/0026_rin_ability1.vsnd_c b/sounds/ability/0026_rin_ability1.vsnd_c new file mode 100755 index 0000000..a0dcf12 Binary files /dev/null and b/sounds/ability/0026_rin_ability1.vsnd_c differ diff --git a/sounds/ability/0028_reimu_ability1.vsnd_c b/sounds/ability/0028_reimu_ability1.vsnd_c new file mode 100755 index 0000000..aef2048 Binary files /dev/null and b/sounds/ability/0028_reimu_ability1.vsnd_c differ diff --git a/sounds/ability/0028_reimu_ability2.vsnd_c b/sounds/ability/0028_reimu_ability2.vsnd_c new file mode 100755 index 0000000..135840a Binary files /dev/null and b/sounds/ability/0028_reimu_ability2.vsnd_c differ diff --git a/sounds/ability/0028_reimu_ability3_1.vsnd_c b/sounds/ability/0028_reimu_ability3_1.vsnd_c new file mode 100755 index 0000000..11da997 Binary files /dev/null and b/sounds/ability/0028_reimu_ability3_1.vsnd_c differ diff --git a/sounds/ability/0028_reimu_ability3_2.vsnd_c b/sounds/ability/0028_reimu_ability3_2.vsnd_c new file mode 100755 index 0000000..e115d9a Binary files /dev/null and b/sounds/ability/0028_reimu_ability3_2.vsnd_c differ diff --git a/sounds/ability/0028_reimu_ability4_1.vsnd_c b/sounds/ability/0028_reimu_ability4_1.vsnd_c new file mode 100755 index 0000000..5c216d7 Binary files /dev/null and b/sounds/ability/0028_reimu_ability4_1.vsnd_c differ diff --git a/sounds/ability/0028_reimu_ability4_2_1.vsnd_c b/sounds/ability/0028_reimu_ability4_2_1.vsnd_c new file mode 100755 index 0000000..887ab9c Binary files /dev/null and b/sounds/ability/0028_reimu_ability4_2_1.vsnd_c differ diff --git a/sounds/ability/0028_reimu_ability4_2_2.vsnd_c b/sounds/ability/0028_reimu_ability4_2_2.vsnd_c new file mode 100755 index 0000000..6ed303e Binary files /dev/null and b/sounds/ability/0028_reimu_ability4_2_2.vsnd_c differ diff --git a/sounds/ability/0029_daiyousei_ability1.vsnd_c b/sounds/ability/0029_daiyousei_ability1.vsnd_c new file mode 100755 index 0000000..d71ea48 Binary files /dev/null and b/sounds/ability/0029_daiyousei_ability1.vsnd_c differ diff --git a/sounds/ability/0030_remilia_ability3.vsnd_c b/sounds/ability/0030_remilia_ability3.vsnd_c new file mode 100755 index 0000000..173879d Binary files /dev/null and b/sounds/ability/0030_remilia_ability3.vsnd_c differ diff --git a/sounds/ability/0030_remilia_ability4.vsnd_c b/sounds/ability/0030_remilia_ability4.vsnd_c new file mode 100755 index 0000000..fc9010b Binary files /dev/null and b/sounds/ability/0030_remilia_ability4.vsnd_c differ diff --git a/sounds/ability/0035_yuuka_ability1_2_1.vsnd_c b/sounds/ability/0035_yuuka_ability1_2_1.vsnd_c new file mode 100755 index 0000000..27f83fe Binary files /dev/null and b/sounds/ability/0035_yuuka_ability1_2_1.vsnd_c differ diff --git a/sounds/ability/0035_yuuka_ability1_2_2.vsnd_c b/sounds/ability/0035_yuuka_ability1_2_2.vsnd_c new file mode 100755 index 0000000..52b916b Binary files /dev/null and b/sounds/ability/0035_yuuka_ability1_2_2.vsnd_c differ diff --git a/sounds/ability/0035_yuuka_ability2_1.vsnd_c b/sounds/ability/0035_yuuka_ability2_1.vsnd_c new file mode 100755 index 0000000..b29c252 Binary files /dev/null and b/sounds/ability/0035_yuuka_ability2_1.vsnd_c differ diff --git a/sounds/ability/0035_yuuka_ability2_2.vsnd_c b/sounds/ability/0035_yuuka_ability2_2.vsnd_c new file mode 100755 index 0000000..8217b52 Binary files /dev/null and b/sounds/ability/0035_yuuka_ability2_2.vsnd_c differ diff --git a/sounds/ability/0035_yuuka_ability2_3.vsnd_c b/sounds/ability/0035_yuuka_ability2_3.vsnd_c new file mode 100755 index 0000000..a725186 Binary files /dev/null and b/sounds/ability/0035_yuuka_ability2_3.vsnd_c differ diff --git a/sounds/ability/0035_yuuka_ability4.vsnd_c b/sounds/ability/0035_yuuka_ability4.vsnd_c new file mode 100755 index 0000000..095dea6 Binary files /dev/null and b/sounds/ability/0035_yuuka_ability4.vsnd_c differ diff --git a/sounds/ability/0036_yukari_ability4_1.vsnd_c b/sounds/ability/0036_yukari_ability4_1.vsnd_c new file mode 100755 index 0000000..13e7def Binary files /dev/null and b/sounds/ability/0036_yukari_ability4_1.vsnd_c differ diff --git a/sounds/ability/0036_yukari_ability4_2.vsnd_c b/sounds/ability/0036_yukari_ability4_2.vsnd_c new file mode 100755 index 0000000..8ceafa2 Binary files /dev/null and b/sounds/ability/0036_yukari_ability4_2.vsnd_c differ diff --git a/sounds/ability/0037_ran_ability2.vsnd_c b/sounds/ability/0037_ran_ability2.vsnd_c new file mode 100755 index 0000000..f9061a9 Binary files /dev/null and b/sounds/ability/0037_ran_ability2.vsnd_c differ diff --git a/sounds/ability/0039_eirin_ability4.vsnd_c b/sounds/ability/0039_eirin_ability4.vsnd_c new file mode 100755 index 0000000..26828ba Binary files /dev/null and b/sounds/ability/0039_eirin_ability4.vsnd_c differ diff --git a/sounds/ability/0043_hatate_ability01.vsnd_c b/sounds/ability/0043_hatate_ability01.vsnd_c new file mode 100755 index 0000000..3f7fbbf Binary files /dev/null and b/sounds/ability/0043_hatate_ability01.vsnd_c differ diff --git a/sounds/ability/0046_sanae_ability03.vsnd_c b/sounds/ability/0046_sanae_ability03.vsnd_c new file mode 100755 index 0000000..0499d25 Binary files /dev/null and b/sounds/ability/0046_sanae_ability03.vsnd_c differ diff --git a/sounds/ability/0048_suwako_ability4.vsnd_c b/sounds/ability/0048_suwako_ability4.vsnd_c new file mode 100755 index 0000000..d72c039 Binary files /dev/null and b/sounds/ability/0048_suwako_ability4.vsnd_c differ diff --git a/sounds/ability/0049_minamitsu_ability01.vsnd_c b/sounds/ability/0049_minamitsu_ability01.vsnd_c new file mode 100755 index 0000000..3d55266 Binary files /dev/null and b/sounds/ability/0049_minamitsu_ability01.vsnd_c differ diff --git a/sounds/ability/0049_minamitsu_ability04.vsnd_c b/sounds/ability/0049_minamitsu_ability04.vsnd_c new file mode 100755 index 0000000..52077f5 Binary files /dev/null and b/sounds/ability/0049_minamitsu_ability04.vsnd_c differ diff --git a/sounds/ability/0052_miko_ability01.vsnd_c b/sounds/ability/0052_miko_ability01.vsnd_c new file mode 100755 index 0000000..94b2314 Binary files /dev/null and b/sounds/ability/0052_miko_ability01.vsnd_c differ diff --git a/sounds/ability/0052_miko_ability04_1.vsnd_c b/sounds/ability/0052_miko_ability04_1.vsnd_c new file mode 100755 index 0000000..63cfcd0 Binary files /dev/null and b/sounds/ability/0052_miko_ability04_1.vsnd_c differ diff --git a/sounds/ability/0052_miko_ability04_2.vsnd_c b/sounds/ability/0052_miko_ability04_2.vsnd_c new file mode 100755 index 0000000..a1f1d0f Binary files /dev/null and b/sounds/ability/0052_miko_ability04_2.vsnd_c differ diff --git a/sounds/ability/0058_luna_ability01.vsnd_c b/sounds/ability/0058_luna_ability01.vsnd_c new file mode 100755 index 0000000..9f99501 Binary files /dev/null and b/sounds/ability/0058_luna_ability01.vsnd_c differ diff --git a/sounds/ability/0061_keine_ability01.vsnd_c b/sounds/ability/0061_keine_ability01.vsnd_c new file mode 100755 index 0000000..efd8cab Binary files /dev/null and b/sounds/ability/0061_keine_ability01.vsnd_c differ diff --git a/sounds/ability/0080_shinki_ability01.vsnd_c b/sounds/ability/0080_shinki_ability01.vsnd_c new file mode 100755 index 0000000..043e306 Binary files /dev/null and b/sounds/ability/0080_shinki_ability01.vsnd_c differ diff --git a/sounds/ability/0088_sizuha_ability01.vsnd_c b/sounds/ability/0088_sizuha_ability01.vsnd_c new file mode 100755 index 0000000..df12324 Binary files /dev/null and b/sounds/ability/0088_sizuha_ability01.vsnd_c differ diff --git a/sounds/ability/0092_medicine_ability02.vsnd_c b/sounds/ability/0092_medicine_ability02.vsnd_c new file mode 100755 index 0000000..c2e7e32 Binary files /dev/null and b/sounds/ability/0092_medicine_ability02.vsnd_c differ diff --git a/sounds/ability/0095_futo_ability03.vsnd_c b/sounds/ability/0095_futo_ability03.vsnd_c new file mode 100755 index 0000000..9daf00a Binary files /dev/null and b/sounds/ability/0095_futo_ability03.vsnd_c differ diff --git a/sounds/abilityvoice/0019_marisa_ability4_voice.vsnd_c b/sounds/abilityvoice/0019_marisa_ability4_voice.vsnd_c new file mode 100755 index 0000000..713e67b Binary files /dev/null and b/sounds/abilityvoice/0019_marisa_ability4_voice.vsnd_c differ diff --git a/sounds/abilityvoice/0021_pachouli_ability4_voice.vsnd_c b/sounds/abilityvoice/0021_pachouli_ability4_voice.vsnd_c new file mode 100755 index 0000000..24a7872 Binary files /dev/null and b/sounds/abilityvoice/0021_pachouli_ability4_voice.vsnd_c differ diff --git a/sounds/abilityvoice/0022_sakuya_ability3_voice.vsnd_c b/sounds/abilityvoice/0022_sakuya_ability3_voice.vsnd_c new file mode 100755 index 0000000..f5c95bb Binary files /dev/null and b/sounds/abilityvoice/0022_sakuya_ability3_voice.vsnd_c differ diff --git a/sounds/abilityvoice/0035_yuuka_ability3_voice.vsnd_c b/sounds/abilityvoice/0035_yuuka_ability3_voice.vsnd_c new file mode 100755 index 0000000..88fc018 Binary files /dev/null and b/sounds/abilityvoice/0035_yuuka_ability3_voice.vsnd_c differ diff --git a/sounds/abilityvoice/abilityalice011.vsnd_c b/sounds/abilityvoice/abilityalice011.vsnd_c new file mode 100755 index 0000000..11597da Binary files /dev/null and b/sounds/abilityvoice/abilityalice011.vsnd_c differ diff --git a/sounds/abilityvoice/abilityalice012.vsnd_c b/sounds/abilityvoice/abilityalice012.vsnd_c new file mode 100755 index 0000000..3479399 Binary files /dev/null and b/sounds/abilityvoice/abilityalice012.vsnd_c differ diff --git a/sounds/abilityvoice/abilityalice022.vsnd_c b/sounds/abilityvoice/abilityalice022.vsnd_c new file mode 100755 index 0000000..9e52515 Binary files /dev/null and b/sounds/abilityvoice/abilityalice022.vsnd_c differ diff --git a/sounds/abilityvoice/abilityalice03.vsnd_c b/sounds/abilityvoice/abilityalice03.vsnd_c new file mode 100755 index 0000000..689fadb Binary files /dev/null and b/sounds/abilityvoice/abilityalice03.vsnd_c differ diff --git a/sounds/abilityvoice/abilityalice031.vsnd_c b/sounds/abilityvoice/abilityalice031.vsnd_c new file mode 100755 index 0000000..79c53c0 Binary files /dev/null and b/sounds/abilityvoice/abilityalice031.vsnd_c differ diff --git a/sounds/abilityvoice/abilityaliceex.vsnd_c b/sounds/abilityvoice/abilityaliceex.vsnd_c new file mode 100755 index 0000000..61dd560 Binary files /dev/null and b/sounds/abilityvoice/abilityaliceex.vsnd_c differ diff --git a/sounds/abilityvoice/abilityaya04.vsnd_c b/sounds/abilityvoice/abilityaya04.vsnd_c new file mode 100755 index 0000000..2a298bc Binary files /dev/null and b/sounds/abilityvoice/abilityaya04.vsnd_c differ diff --git a/sounds/abilityvoice/abilitycirno04.vsnd_c b/sounds/abilityvoice/abilitycirno04.vsnd_c new file mode 100755 index 0000000..d25ce94 Binary files /dev/null and b/sounds/abilityvoice/abilitycirno04.vsnd_c differ diff --git a/sounds/abilityvoice/abilitycirno041.vsnd_c b/sounds/abilityvoice/abilitycirno041.vsnd_c new file mode 100755 index 0000000..80a0a8b Binary files /dev/null and b/sounds/abilityvoice/abilitycirno041.vsnd_c differ diff --git a/sounds/abilityvoice/abilityflandre04.vsnd_c b/sounds/abilityvoice/abilityflandre04.vsnd_c new file mode 100755 index 0000000..7c80432 Binary files /dev/null and b/sounds/abilityvoice/abilityflandre04.vsnd_c differ diff --git a/sounds/abilityvoice/abilityiku04.vsnd_c b/sounds/abilityvoice/abilityiku04.vsnd_c new file mode 100755 index 0000000..44be694 Binary files /dev/null and b/sounds/abilityvoice/abilityiku04.vsnd_c differ diff --git a/sounds/abilityvoice/abilitykaguya03.vsnd_c b/sounds/abilityvoice/abilitykaguya03.vsnd_c new file mode 100755 index 0000000..52e5a4f Binary files /dev/null and b/sounds/abilityvoice/abilitykaguya03.vsnd_c differ diff --git a/sounds/abilityvoice/abilitykaguya04.vsnd_c b/sounds/abilityvoice/abilitykaguya04.vsnd_c new file mode 100755 index 0000000..6751066 Binary files /dev/null and b/sounds/abilityvoice/abilitykaguya04.vsnd_c differ diff --git a/sounds/abilityvoice/abilitykanako01.vsnd_c b/sounds/abilityvoice/abilitykanako01.vsnd_c new file mode 100755 index 0000000..8f0eaba Binary files /dev/null and b/sounds/abilityvoice/abilitykanako01.vsnd_c differ diff --git a/sounds/abilityvoice/abilitykanako03.vsnd_c b/sounds/abilityvoice/abilitykanako03.vsnd_c new file mode 100755 index 0000000..1605fad Binary files /dev/null and b/sounds/abilityvoice/abilitykanako03.vsnd_c differ diff --git a/sounds/abilityvoice/abilitykanako04.vsnd_c b/sounds/abilityvoice/abilitykanako04.vsnd_c new file mode 100755 index 0000000..776e067 Binary files /dev/null and b/sounds/abilityvoice/abilitykanako04.vsnd_c differ diff --git a/sounds/abilityvoice/abilitykanako041.vsnd_c b/sounds/abilityvoice/abilitykanako041.vsnd_c new file mode 100755 index 0000000..b1e9c5d Binary files /dev/null and b/sounds/abilityvoice/abilitykanako041.vsnd_c differ diff --git a/sounds/abilityvoice/abilitykanako043.vsnd_c b/sounds/abilityvoice/abilitykanako043.vsnd_c new file mode 100755 index 0000000..7d6054a Binary files /dev/null and b/sounds/abilityvoice/abilitykanako043.vsnd_c differ diff --git a/sounds/abilityvoice/abilitykoishi041.vsnd_c b/sounds/abilityvoice/abilitykoishi041.vsnd_c new file mode 100755 index 0000000..d339af8 Binary files /dev/null and b/sounds/abilityvoice/abilitykoishi041.vsnd_c differ diff --git a/sounds/abilityvoice/abilitykoishi042.vsnd_c b/sounds/abilityvoice/abilitykoishi042.vsnd_c new file mode 100755 index 0000000..87c2761 Binary files /dev/null and b/sounds/abilityvoice/abilitykoishi042.vsnd_c differ diff --git a/sounds/abilityvoice/abilitymarisa04.vsnd_c b/sounds/abilityvoice/abilitymarisa04.vsnd_c new file mode 100755 index 0000000..a18f25c Binary files /dev/null and b/sounds/abilityvoice/abilitymarisa04.vsnd_c differ diff --git a/sounds/abilityvoice/abilityminamitsu021.vsnd_c b/sounds/abilityvoice/abilityminamitsu021.vsnd_c new file mode 100755 index 0000000..ec515a4 Binary files /dev/null and b/sounds/abilityvoice/abilityminamitsu021.vsnd_c differ diff --git a/sounds/abilityvoice/abilityminamitsu022.vsnd_c b/sounds/abilityvoice/abilityminamitsu022.vsnd_c new file mode 100755 index 0000000..dd269e8 Binary files /dev/null and b/sounds/abilityvoice/abilityminamitsu022.vsnd_c differ diff --git a/sounds/abilityvoice/abilityminamitsu03.vsnd_c b/sounds/abilityvoice/abilityminamitsu03.vsnd_c new file mode 100755 index 0000000..8096580 Binary files /dev/null and b/sounds/abilityvoice/abilityminamitsu03.vsnd_c differ diff --git a/sounds/abilityvoice/abilityminamitsu041.vsnd_c b/sounds/abilityvoice/abilityminamitsu041.vsnd_c new file mode 100755 index 0000000..bcc7a7a Binary files /dev/null and b/sounds/abilityvoice/abilityminamitsu041.vsnd_c differ diff --git a/sounds/abilityvoice/abilityminamitsu042.vsnd_c b/sounds/abilityvoice/abilityminamitsu042.vsnd_c new file mode 100755 index 0000000..0d2ea19 Binary files /dev/null and b/sounds/abilityvoice/abilityminamitsu042.vsnd_c differ diff --git a/sounds/abilityvoice/abilitymomiji02.vsnd_c b/sounds/abilityvoice/abilitymomiji02.vsnd_c new file mode 100755 index 0000000..b8d2c3c Binary files /dev/null and b/sounds/abilityvoice/abilitymomiji02.vsnd_c differ diff --git a/sounds/abilityvoice/abilityran01.vsnd_c b/sounds/abilityvoice/abilityran01.vsnd_c new file mode 100755 index 0000000..0a8936c Binary files /dev/null and b/sounds/abilityvoice/abilityran01.vsnd_c differ diff --git a/sounds/abilityvoice/abilityranex.vsnd_c b/sounds/abilityvoice/abilityranex.vsnd_c new file mode 100755 index 0000000..e613302 Binary files /dev/null and b/sounds/abilityvoice/abilityranex.vsnd_c differ diff --git a/sounds/abilityvoice/abilityreimu04.vsnd_c b/sounds/abilityvoice/abilityreimu04.vsnd_c new file mode 100755 index 0000000..0e31db5 Binary files /dev/null and b/sounds/abilityvoice/abilityreimu04.vsnd_c differ diff --git a/sounds/abilityvoice/abilityreisen01.vsnd_c b/sounds/abilityvoice/abilityreisen01.vsnd_c new file mode 100755 index 0000000..daf3364 Binary files /dev/null and b/sounds/abilityvoice/abilityreisen01.vsnd_c differ diff --git a/sounds/abilityvoice/abilityreisen02.vsnd_c b/sounds/abilityvoice/abilityreisen02.vsnd_c new file mode 100755 index 0000000..a75b88b Binary files /dev/null and b/sounds/abilityvoice/abilityreisen02.vsnd_c differ diff --git a/sounds/abilityvoice/abilityreisen03.vsnd_c b/sounds/abilityvoice/abilityreisen03.vsnd_c new file mode 100755 index 0000000..07445c2 Binary files /dev/null and b/sounds/abilityvoice/abilityreisen03.vsnd_c differ diff --git a/sounds/abilityvoice/abilityreisen041.vsnd_c b/sounds/abilityvoice/abilityreisen041.vsnd_c new file mode 100755 index 0000000..f564f7d Binary files /dev/null and b/sounds/abilityvoice/abilityreisen041.vsnd_c differ diff --git a/sounds/abilityvoice/abilityreisen042.vsnd_c b/sounds/abilityvoice/abilityreisen042.vsnd_c new file mode 100755 index 0000000..fb7d3b3 Binary files /dev/null and b/sounds/abilityvoice/abilityreisen042.vsnd_c differ diff --git a/sounds/abilityvoice/abilityremilia01.vsnd_c b/sounds/abilityvoice/abilityremilia01.vsnd_c new file mode 100755 index 0000000..bc7ad88 Binary files /dev/null and b/sounds/abilityvoice/abilityremilia01.vsnd_c differ diff --git a/sounds/abilityvoice/abilityremilia021.vsnd_c b/sounds/abilityvoice/abilityremilia021.vsnd_c new file mode 100755 index 0000000..86b6488 Binary files /dev/null and b/sounds/abilityvoice/abilityremilia021.vsnd_c differ diff --git a/sounds/abilityvoice/abilityremilia022.vsnd_c b/sounds/abilityvoice/abilityremilia022.vsnd_c new file mode 100755 index 0000000..33439d6 Binary files /dev/null and b/sounds/abilityvoice/abilityremilia022.vsnd_c differ diff --git a/sounds/abilityvoice/abilityremilia03.vsnd_c b/sounds/abilityvoice/abilityremilia03.vsnd_c new file mode 100755 index 0000000..0716db1 Binary files /dev/null and b/sounds/abilityvoice/abilityremilia03.vsnd_c differ diff --git a/sounds/abilityvoice/abilityremilia04.vsnd_c b/sounds/abilityvoice/abilityremilia04.vsnd_c new file mode 100755 index 0000000..0451c3e Binary files /dev/null and b/sounds/abilityvoice/abilityremilia04.vsnd_c differ diff --git a/sounds/abilityvoice/abilitysakuya04.vsnd_c b/sounds/abilityvoice/abilitysakuya04.vsnd_c new file mode 100755 index 0000000..33b9231 Binary files /dev/null and b/sounds/abilityvoice/abilitysakuya04.vsnd_c differ diff --git a/sounds/abilityvoice/abilitysanae04.vsnd_c b/sounds/abilityvoice/abilitysanae04.vsnd_c new file mode 100755 index 0000000..08bfacf Binary files /dev/null and b/sounds/abilityvoice/abilitysanae04.vsnd_c differ diff --git a/sounds/abilityvoice/abilityshikieiki04.vsnd_c b/sounds/abilityvoice/abilityshikieiki04.vsnd_c new file mode 100755 index 0000000..b4ee6c4 Binary files /dev/null and b/sounds/abilityvoice/abilityshikieiki04.vsnd_c differ diff --git a/sounds/abilityvoice/abilitytenshi04.vsnd_c b/sounds/abilityvoice/abilitytenshi04.vsnd_c new file mode 100755 index 0000000..2078cbe Binary files /dev/null and b/sounds/abilityvoice/abilitytenshi04.vsnd_c differ diff --git a/sounds/abilityvoice/abilityutsuho04.vsnd_c b/sounds/abilityvoice/abilityutsuho04.vsnd_c new file mode 100755 index 0000000..9dad665 Binary files /dev/null and b/sounds/abilityvoice/abilityutsuho04.vsnd_c differ diff --git a/sounds/abilityvoice/abilitywriggle02.vsnd_c b/sounds/abilityvoice/abilitywriggle02.vsnd_c new file mode 100755 index 0000000..82546b7 Binary files /dev/null and b/sounds/abilityvoice/abilitywriggle02.vsnd_c differ diff --git a/sounds/abilityvoice/abilitywriggle04.vsnd_c b/sounds/abilityvoice/abilitywriggle04.vsnd_c new file mode 100755 index 0000000..a709558 Binary files /dev/null and b/sounds/abilityvoice/abilitywriggle04.vsnd_c differ diff --git a/sounds/abilityvoice/abilityyoumu04.vsnd_c b/sounds/abilityvoice/abilityyoumu04.vsnd_c new file mode 100755 index 0000000..7f5f4ba Binary files /dev/null and b/sounds/abilityvoice/abilityyoumu04.vsnd_c differ diff --git a/sounds/abilityvoice/abilityyukari03.vsnd_c b/sounds/abilityvoice/abilityyukari03.vsnd_c new file mode 100755 index 0000000..8416105 Binary files /dev/null and b/sounds/abilityvoice/abilityyukari03.vsnd_c differ diff --git a/sounds/abilityvoice/abilityyumemi04.vsnd_c b/sounds/abilityvoice/abilityyumemi04.vsnd_c new file mode 100755 index 0000000..5823d75 Binary files /dev/null and b/sounds/abilityvoice/abilityyumemi04.vsnd_c differ diff --git a/sounds/abilityvoice/abilityyuyuko04.vsnd_c b/sounds/abilityvoice/abilityyuyuko04.vsnd_c new file mode 100755 index 0000000..77c89ff Binary files /dev/null and b/sounds/abilityvoice/abilityyuyuko04.vsnd_c differ diff --git a/sounds/attack/0002_nazrin_attack01.vsnd_c b/sounds/attack/0002_nazrin_attack01.vsnd_c new file mode 100755 index 0000000..ffd44d1 Binary files /dev/null and b/sounds/attack/0002_nazrin_attack01.vsnd_c differ diff --git a/sounds/attack/0002_nazrin_attack02.vsnd_c b/sounds/attack/0002_nazrin_attack02.vsnd_c new file mode 100755 index 0000000..6c8912c Binary files /dev/null and b/sounds/attack/0002_nazrin_attack02.vsnd_c differ diff --git a/sounds/attack/0010_kogasa_attack01.vsnd_c b/sounds/attack/0010_kogasa_attack01.vsnd_c new file mode 100755 index 0000000..cd48e26 Binary files /dev/null and b/sounds/attack/0010_kogasa_attack01.vsnd_c differ diff --git a/sounds/attack/0010_kogasa_attack02.vsnd_c b/sounds/attack/0010_kogasa_attack02.vsnd_c new file mode 100755 index 0000000..45f0d3f Binary files /dev/null and b/sounds/attack/0010_kogasa_attack02.vsnd_c differ diff --git a/sounds/attack/0012_lyrica_attack01.vsnd_c b/sounds/attack/0012_lyrica_attack01.vsnd_c new file mode 100755 index 0000000..36e5753 Binary files /dev/null and b/sounds/attack/0012_lyrica_attack01.vsnd_c differ diff --git a/sounds/attack/0012_lyrica_attack02.vsnd_c b/sounds/attack/0012_lyrica_attack02.vsnd_c new file mode 100755 index 0000000..db74ce8 Binary files /dev/null and b/sounds/attack/0012_lyrica_attack02.vsnd_c differ diff --git a/sounds/attack/0013_lunasa_attack01.vsnd_c b/sounds/attack/0013_lunasa_attack01.vsnd_c new file mode 100755 index 0000000..72e24c6 Binary files /dev/null and b/sounds/attack/0013_lunasa_attack01.vsnd_c differ diff --git a/sounds/attack/0013_lunasa_attack02.vsnd_c b/sounds/attack/0013_lunasa_attack02.vsnd_c new file mode 100755 index 0000000..6f75092 Binary files /dev/null and b/sounds/attack/0013_lunasa_attack02.vsnd_c differ diff --git a/sounds/attack/0013_lunasa_attack03.vsnd_c b/sounds/attack/0013_lunasa_attack03.vsnd_c new file mode 100755 index 0000000..9302045 Binary files /dev/null and b/sounds/attack/0013_lunasa_attack03.vsnd_c differ diff --git a/sounds/attack/0014_marlin_attack01.vsnd_c b/sounds/attack/0014_marlin_attack01.vsnd_c new file mode 100755 index 0000000..fca9c7b Binary files /dev/null and b/sounds/attack/0014_marlin_attack01.vsnd_c differ diff --git a/sounds/attack/0019_marisa_attack01.vsnd_c b/sounds/attack/0019_marisa_attack01.vsnd_c new file mode 100755 index 0000000..3f9363e Binary files /dev/null and b/sounds/attack/0019_marisa_attack01.vsnd_c differ diff --git a/sounds/attack/0019_marisa_attack02.vsnd_c b/sounds/attack/0019_marisa_attack02.vsnd_c new file mode 100755 index 0000000..1ff2a4c Binary files /dev/null and b/sounds/attack/0019_marisa_attack02.vsnd_c differ diff --git a/sounds/attack/0027_utsuho_attack.vsnd_c b/sounds/attack/0027_utsuho_attack.vsnd_c new file mode 100755 index 0000000..9c050e2 Binary files /dev/null and b/sounds/attack/0027_utsuho_attack.vsnd_c differ diff --git a/sounds/attack/0028_reimu_attack01.vsnd_c b/sounds/attack/0028_reimu_attack01.vsnd_c new file mode 100755 index 0000000..adc84b3 Binary files /dev/null and b/sounds/attack/0028_reimu_attack01.vsnd_c differ diff --git a/sounds/attack/0028_reimu_attack02.vsnd_c b/sounds/attack/0028_reimu_attack02.vsnd_c new file mode 100755 index 0000000..f09de74 Binary files /dev/null and b/sounds/attack/0028_reimu_attack02.vsnd_c differ diff --git a/sounds/attack/0043_hatate_attack01.vsnd_c b/sounds/attack/0043_hatate_attack01.vsnd_c new file mode 100755 index 0000000..3fd48b8 Binary files /dev/null and b/sounds/attack/0043_hatate_attack01.vsnd_c differ diff --git a/sounds/attack/0043_hatate_attack02.vsnd_c b/sounds/attack/0043_hatate_attack02.vsnd_c new file mode 100755 index 0000000..770bd0c Binary files /dev/null and b/sounds/attack/0043_hatate_attack02.vsnd_c differ diff --git a/sounds/attack/0048_suwako_attack01.vsnd_c b/sounds/attack/0048_suwako_attack01.vsnd_c new file mode 100755 index 0000000..b9ab2b3 Binary files /dev/null and b/sounds/attack/0048_suwako_attack01.vsnd_c differ diff --git a/sounds/attack/0048_suwako_attack02.vsnd_c b/sounds/attack/0048_suwako_attack02.vsnd_c new file mode 100755 index 0000000..f75b159 Binary files /dev/null and b/sounds/attack/0048_suwako_attack02.vsnd_c differ diff --git a/sounds/attack/0048_suwako_attack03.vsnd_c b/sounds/attack/0048_suwako_attack03.vsnd_c new file mode 100755 index 0000000..527026b Binary files /dev/null and b/sounds/attack/0048_suwako_attack03.vsnd_c differ diff --git a/sounds/blink.vsnd_c b/sounds/blink.vsnd_c new file mode 100755 index 0000000..8a99494 Binary files /dev/null and b/sounds/blink.vsnd_c differ diff --git a/sounds/buy_normal_card.vsnd_c b/sounds/buy_normal_card.vsnd_c new file mode 100755 index 0000000..4afb9bc Binary files /dev/null and b/sounds/buy_normal_card.vsnd_c differ diff --git a/sounds/buy_senior_card.vsnd_c b/sounds/buy_senior_card.vsnd_c new file mode 100755 index 0000000..2276b11 Binary files /dev/null and b/sounds/buy_senior_card.vsnd_c differ diff --git a/sounds/create_voice/0002_nazrin.vsnd_c b/sounds/create_voice/0002_nazrin.vsnd_c new file mode 100755 index 0000000..d29a191 Binary files /dev/null and b/sounds/create_voice/0002_nazrin.vsnd_c differ diff --git a/sounds/create_voice/0003_minoriko.vsnd_c b/sounds/create_voice/0003_minoriko.vsnd_c new file mode 100755 index 0000000..ac07fda Binary files /dev/null and b/sounds/create_voice/0003_minoriko.vsnd_c differ diff --git a/sounds/create_voice/0010_kogasa_1.vsnd_c b/sounds/create_voice/0010_kogasa_1.vsnd_c new file mode 100755 index 0000000..2b3fdc1 Binary files /dev/null and b/sounds/create_voice/0010_kogasa_1.vsnd_c differ diff --git a/sounds/create_voice/0010_kogasa_2.vsnd_c b/sounds/create_voice/0010_kogasa_2.vsnd_c new file mode 100755 index 0000000..b24c085 Binary files /dev/null and b/sounds/create_voice/0010_kogasa_2.vsnd_c differ diff --git a/sounds/create_voice/0011_letty.vsnd_c b/sounds/create_voice/0011_letty.vsnd_c new file mode 100755 index 0000000..2b0413e Binary files /dev/null and b/sounds/create_voice/0011_letty.vsnd_c differ diff --git a/sounds/create_voice/0012_lyrica.vsnd_c b/sounds/create_voice/0012_lyrica.vsnd_c new file mode 100755 index 0000000..e975172 Binary files /dev/null and b/sounds/create_voice/0012_lyrica.vsnd_c differ diff --git a/sounds/create_voice/0012_lyrica_to_14merlin_13lunasa.vsnd_c b/sounds/create_voice/0012_lyrica_to_14merlin_13lunasa.vsnd_c new file mode 100755 index 0000000..bda4d1e Binary files /dev/null and b/sounds/create_voice/0012_lyrica_to_14merlin_13lunasa.vsnd_c differ diff --git a/sounds/create_voice/0013_lunasa.vsnd_c b/sounds/create_voice/0013_lunasa.vsnd_c new file mode 100755 index 0000000..8d08932 Binary files /dev/null and b/sounds/create_voice/0013_lunasa.vsnd_c differ diff --git a/sounds/create_voice/0013_lunasa_to_12lyrica_14merlin.vsnd_c b/sounds/create_voice/0013_lunasa_to_12lyrica_14merlin.vsnd_c new file mode 100755 index 0000000..42c7502 Binary files /dev/null and b/sounds/create_voice/0013_lunasa_to_12lyrica_14merlin.vsnd_c differ diff --git a/sounds/create_voice/0014_merlin.vsnd_c b/sounds/create_voice/0014_merlin.vsnd_c new file mode 100755 index 0000000..f1d7a93 Binary files /dev/null and b/sounds/create_voice/0014_merlin.vsnd_c differ diff --git a/sounds/create_voice/0014_merlin_to_0013_lunasa_12lyrica.vsnd_c b/sounds/create_voice/0014_merlin_to_0013_lunasa_12lyrica.vsnd_c new file mode 100755 index 0000000..9bf544c Binary files /dev/null and b/sounds/create_voice/0014_merlin_to_0013_lunasa_12lyrica.vsnd_c differ diff --git a/sounds/create_voice/0015_rumia.vsnd_c b/sounds/create_voice/0015_rumia.vsnd_c new file mode 100755 index 0000000..87620d5 Binary files /dev/null and b/sounds/create_voice/0015_rumia.vsnd_c differ diff --git a/sounds/create_voice/0016_satori.vsnd_c b/sounds/create_voice/0016_satori.vsnd_c new file mode 100755 index 0000000..694d9ba Binary files /dev/null and b/sounds/create_voice/0016_satori.vsnd_c differ diff --git a/sounds/create_voice/0016_satori_cp_26rin.vsnd_c b/sounds/create_voice/0016_satori_cp_26rin.vsnd_c new file mode 100755 index 0000000..5226ec5 Binary files /dev/null and b/sounds/create_voice/0016_satori_cp_26rin.vsnd_c differ diff --git a/sounds/create_voice/0018_mystia.vsnd_c b/sounds/create_voice/0018_mystia.vsnd_c new file mode 100755 index 0000000..c8cd261 Binary files /dev/null and b/sounds/create_voice/0018_mystia.vsnd_c differ diff --git a/sounds/create_voice/0019_marisa.vsnd_c b/sounds/create_voice/0019_marisa.vsnd_c new file mode 100755 index 0000000..196386f Binary files /dev/null and b/sounds/create_voice/0019_marisa.vsnd_c differ diff --git a/sounds/create_voice/0019_marisa_cp_09cirno.vsnd_c b/sounds/create_voice/0019_marisa_cp_09cirno.vsnd_c new file mode 100755 index 0000000..ec9558b Binary files /dev/null and b/sounds/create_voice/0019_marisa_cp_09cirno.vsnd_c differ diff --git a/sounds/create_voice/0019_marisa_cp_21pachouli.vsnd_c b/sounds/create_voice/0019_marisa_cp_21pachouli.vsnd_c new file mode 100755 index 0000000..211f21f Binary files /dev/null and b/sounds/create_voice/0019_marisa_cp_21pachouli.vsnd_c differ diff --git a/sounds/create_voice/0019_marisa_cp_28reimu.vsnd_c b/sounds/create_voice/0019_marisa_cp_28reimu.vsnd_c new file mode 100755 index 0000000..60e54ba Binary files /dev/null and b/sounds/create_voice/0019_marisa_cp_28reimu.vsnd_c differ diff --git a/sounds/create_voice/0019_marisa_cp_35yuuka.vsnd_c b/sounds/create_voice/0019_marisa_cp_35yuuka.vsnd_c new file mode 100755 index 0000000..3277b09 Binary files /dev/null and b/sounds/create_voice/0019_marisa_cp_35yuuka.vsnd_c differ diff --git a/sounds/create_voice/0019_marisa_cp_58mima.vsnd_c b/sounds/create_voice/0019_marisa_cp_58mima.vsnd_c new file mode 100755 index 0000000..dceebff Binary files /dev/null and b/sounds/create_voice/0019_marisa_cp_58mima.vsnd_c differ diff --git a/sounds/create_voice/0019_marisa_cp_67alice.vsnd_c b/sounds/create_voice/0019_marisa_cp_67alice.vsnd_c new file mode 100755 index 0000000..8a3b5c4 Binary files /dev/null and b/sounds/create_voice/0019_marisa_cp_67alice.vsnd_c differ diff --git a/sounds/create_voice/0021_pachouli.vsnd_c b/sounds/create_voice/0021_pachouli.vsnd_c new file mode 100755 index 0000000..586de97 Binary files /dev/null and b/sounds/create_voice/0021_pachouli.vsnd_c differ diff --git a/sounds/create_voice/0021_pachouli_cp_19marisa.vsnd_c b/sounds/create_voice/0021_pachouli_cp_19marisa.vsnd_c new file mode 100755 index 0000000..f62fb8c Binary files /dev/null and b/sounds/create_voice/0021_pachouli_cp_19marisa.vsnd_c differ diff --git a/sounds/create_voice/0021_pachouli_cp_33koakuma.vsnd_c b/sounds/create_voice/0021_pachouli_cp_33koakuma.vsnd_c new file mode 100755 index 0000000..bcb3b27 Binary files /dev/null and b/sounds/create_voice/0021_pachouli_cp_33koakuma.vsnd_c differ diff --git a/sounds/create_voice/0022_sakuya.vsnd_c b/sounds/create_voice/0022_sakuya.vsnd_c new file mode 100755 index 0000000..dfd7c63 Binary files /dev/null and b/sounds/create_voice/0022_sakuya.vsnd_c differ diff --git a/sounds/create_voice/0022_sakuya_cp_18_mystia.vsnd_c b/sounds/create_voice/0022_sakuya_cp_18_mystia.vsnd_c new file mode 100755 index 0000000..e3615a1 Binary files /dev/null and b/sounds/create_voice/0022_sakuya_cp_18_mystia.vsnd_c differ diff --git a/sounds/create_voice/0022_sakuya_cp_19marisa.vsnd_c b/sounds/create_voice/0022_sakuya_cp_19marisa.vsnd_c new file mode 100755 index 0000000..9f5242e Binary files /dev/null and b/sounds/create_voice/0022_sakuya_cp_19marisa.vsnd_c differ diff --git a/sounds/create_voice/0022_sakuya_cp_30_remilia.vsnd_c b/sounds/create_voice/0022_sakuya_cp_30_remilia.vsnd_c new file mode 100755 index 0000000..1875db6 Binary files /dev/null and b/sounds/create_voice/0022_sakuya_cp_30_remilia.vsnd_c differ diff --git a/sounds/create_voice/0023_reisen_1.vsnd_c b/sounds/create_voice/0023_reisen_1.vsnd_c new file mode 100755 index 0000000..3542494 Binary files /dev/null and b/sounds/create_voice/0023_reisen_1.vsnd_c differ diff --git a/sounds/create_voice/0023_reisen_2.vsnd_c b/sounds/create_voice/0023_reisen_2.vsnd_c new file mode 100755 index 0000000..66b6083 Binary files /dev/null and b/sounds/create_voice/0023_reisen_2.vsnd_c differ diff --git a/sounds/create_voice/0023_reisen_cp_39eirin.vsnd_c b/sounds/create_voice/0023_reisen_cp_39eirin.vsnd_c new file mode 100755 index 0000000..658996a Binary files /dev/null and b/sounds/create_voice/0023_reisen_cp_39eirin.vsnd_c differ diff --git a/sounds/create_voice/0023_reisen_cp_41kaguya.vsnd_c b/sounds/create_voice/0023_reisen_cp_41kaguya.vsnd_c new file mode 100755 index 0000000..2dbfc2e Binary files /dev/null and b/sounds/create_voice/0023_reisen_cp_41kaguya.vsnd_c differ diff --git a/sounds/create_voice/0023_reisen_cp_70tewi.vsnd_c b/sounds/create_voice/0023_reisen_cp_70tewi.vsnd_c new file mode 100755 index 0000000..460e5d1 Binary files /dev/null and b/sounds/create_voice/0023_reisen_cp_70tewi.vsnd_c differ diff --git a/sounds/create_voice/0024_yuyuko_1.vsnd_c b/sounds/create_voice/0024_yuyuko_1.vsnd_c new file mode 100755 index 0000000..7852db1 Binary files /dev/null and b/sounds/create_voice/0024_yuyuko_1.vsnd_c differ diff --git a/sounds/create_voice/0024_yuyuko_2.vsnd_c b/sounds/create_voice/0024_yuyuko_2.vsnd_c new file mode 100755 index 0000000..d00cf17 Binary files /dev/null and b/sounds/create_voice/0024_yuyuko_2.vsnd_c differ diff --git a/sounds/create_voice/0024_yuyuko_cp_25youmu.vsnd_c b/sounds/create_voice/0024_yuyuko_cp_25youmu.vsnd_c new file mode 100755 index 0000000..c1dcda6 Binary files /dev/null and b/sounds/create_voice/0024_yuyuko_cp_25youmu.vsnd_c differ diff --git a/sounds/create_voice/0024_yuyuko_cp_36yukari.vsnd_c b/sounds/create_voice/0024_yuyuko_cp_36yukari.vsnd_c new file mode 100755 index 0000000..22067bb Binary files /dev/null and b/sounds/create_voice/0024_yuyuko_cp_36yukari.vsnd_c differ diff --git a/sounds/create_voice/0025_youmu.vsnd_c b/sounds/create_voice/0025_youmu.vsnd_c new file mode 100755 index 0000000..0b75343 Binary files /dev/null and b/sounds/create_voice/0025_youmu.vsnd_c differ diff --git a/sounds/create_voice/0025_youmu_cp_24yuyuko.vsnd_c b/sounds/create_voice/0025_youmu_cp_24yuyuko.vsnd_c new file mode 100755 index 0000000..f622d54 Binary files /dev/null and b/sounds/create_voice/0025_youmu_cp_24yuyuko.vsnd_c differ diff --git a/sounds/create_voice/0026_rin.vsnd_c b/sounds/create_voice/0026_rin.vsnd_c new file mode 100755 index 0000000..eab755f Binary files /dev/null and b/sounds/create_voice/0026_rin.vsnd_c differ diff --git a/sounds/create_voice/0028_reimu.vsnd_c b/sounds/create_voice/0028_reimu.vsnd_c new file mode 100755 index 0000000..9d63360 Binary files /dev/null and b/sounds/create_voice/0028_reimu.vsnd_c differ diff --git a/sounds/create_voice/0029_daiyousei.vsnd_c b/sounds/create_voice/0029_daiyousei.vsnd_c new file mode 100755 index 0000000..5ae8b9d Binary files /dev/null and b/sounds/create_voice/0029_daiyousei.vsnd_c differ diff --git a/sounds/create_voice/0029_daiyousei_cp_09cirno.vsnd_c b/sounds/create_voice/0029_daiyousei_cp_09cirno.vsnd_c new file mode 100755 index 0000000..a7621c0 Binary files /dev/null and b/sounds/create_voice/0029_daiyousei_cp_09cirno.vsnd_c differ diff --git a/sounds/create_voice/0029_daiyousei_cp_15rumia.vsnd_c b/sounds/create_voice/0029_daiyousei_cp_15rumia.vsnd_c new file mode 100755 index 0000000..d03d0a7 Binary files /dev/null and b/sounds/create_voice/0029_daiyousei_cp_15rumia.vsnd_c differ diff --git a/sounds/create_voice/0031_koishi_1.vsnd_c b/sounds/create_voice/0031_koishi_1.vsnd_c new file mode 100755 index 0000000..6bcf8bb Binary files /dev/null and b/sounds/create_voice/0031_koishi_1.vsnd_c differ diff --git a/sounds/create_voice/0031_koishi_2.vsnd_c b/sounds/create_voice/0031_koishi_2.vsnd_c new file mode 100755 index 0000000..7294cb9 Binary files /dev/null and b/sounds/create_voice/0031_koishi_2.vsnd_c differ diff --git a/sounds/create_voice/0031_koishi_cp_16satori.vsnd_c b/sounds/create_voice/0031_koishi_cp_16satori.vsnd_c new file mode 100755 index 0000000..70edde8 Binary files /dev/null and b/sounds/create_voice/0031_koishi_cp_16satori.vsnd_c differ diff --git a/sounds/create_voice/0032_flandre_1.vsnd_c b/sounds/create_voice/0032_flandre_1.vsnd_c new file mode 100755 index 0000000..d372197 Binary files /dev/null and b/sounds/create_voice/0032_flandre_1.vsnd_c differ diff --git a/sounds/create_voice/0032_flandre_2.vsnd_c b/sounds/create_voice/0032_flandre_2.vsnd_c new file mode 100755 index 0000000..67bf192 Binary files /dev/null and b/sounds/create_voice/0032_flandre_2.vsnd_c differ diff --git a/sounds/create_voice/0033_koakuma.vsnd_c b/sounds/create_voice/0033_koakuma.vsnd_c new file mode 100755 index 0000000..7858628 Binary files /dev/null and b/sounds/create_voice/0033_koakuma.vsnd_c differ diff --git a/sounds/create_voice/0033_koakuma_cp_21pachouli.vsnd_c b/sounds/create_voice/0033_koakuma_cp_21pachouli.vsnd_c new file mode 100755 index 0000000..466048d Binary files /dev/null and b/sounds/create_voice/0033_koakuma_cp_21pachouli.vsnd_c differ diff --git a/sounds/create_voice/0035_yuuka_1.vsnd_c b/sounds/create_voice/0035_yuuka_1.vsnd_c new file mode 100755 index 0000000..9ecbced Binary files /dev/null and b/sounds/create_voice/0035_yuuka_1.vsnd_c differ diff --git a/sounds/create_voice/0035_yuuka_2.vsnd_c b/sounds/create_voice/0035_yuuka_2.vsnd_c new file mode 100755 index 0000000..18a9f15 Binary files /dev/null and b/sounds/create_voice/0035_yuuka_2.vsnd_c differ diff --git a/sounds/create_voice/0037_ran.vsnd_c b/sounds/create_voice/0037_ran.vsnd_c new file mode 100755 index 0000000..41ee846 Binary files /dev/null and b/sounds/create_voice/0037_ran.vsnd_c differ diff --git a/sounds/create_voice/0039_eirin.vsnd_c b/sounds/create_voice/0039_eirin.vsnd_c new file mode 100755 index 0000000..ead4307 Binary files /dev/null and b/sounds/create_voice/0039_eirin.vsnd_c differ diff --git a/sounds/create_voice/0039_eirin_41kaguya.vsnd_c b/sounds/create_voice/0039_eirin_41kaguya.vsnd_c new file mode 100755 index 0000000..9677657 Binary files /dev/null and b/sounds/create_voice/0039_eirin_41kaguya.vsnd_c differ diff --git a/sounds/create_voice/0041_kaguya_1.vsnd_c b/sounds/create_voice/0041_kaguya_1.vsnd_c new file mode 100755 index 0000000..d301657 Binary files /dev/null and b/sounds/create_voice/0041_kaguya_1.vsnd_c differ diff --git a/sounds/create_voice/0041_kaguya_2.vsnd_c b/sounds/create_voice/0041_kaguya_2.vsnd_c new file mode 100755 index 0000000..1a5b6d6 Binary files /dev/null and b/sounds/create_voice/0041_kaguya_2.vsnd_c differ diff --git a/sounds/create_voice/0041_kaguya_cp_23reisen.vsnd_c b/sounds/create_voice/0041_kaguya_cp_23reisen.vsnd_c new file mode 100755 index 0000000..d35a11f Binary files /dev/null and b/sounds/create_voice/0041_kaguya_cp_23reisen.vsnd_c differ diff --git a/sounds/create_voice/0041_kaguya_cp_39_eirin.vsnd_c b/sounds/create_voice/0041_kaguya_cp_39_eirin.vsnd_c new file mode 100755 index 0000000..52a1c19 Binary files /dev/null and b/sounds/create_voice/0041_kaguya_cp_39_eirin.vsnd_c differ diff --git a/sounds/create_voice/0041_kaguya_cp_70tewi.vsnd_c b/sounds/create_voice/0041_kaguya_cp_70tewi.vsnd_c new file mode 100755 index 0000000..92e37b2 Binary files /dev/null and b/sounds/create_voice/0041_kaguya_cp_70tewi.vsnd_c differ diff --git a/sounds/create_voice/0043_hatate.vsnd_c b/sounds/create_voice/0043_hatate.vsnd_c new file mode 100755 index 0000000..083beb6 Binary files /dev/null and b/sounds/create_voice/0043_hatate.vsnd_c differ diff --git a/sounds/create_voice/0044_momizi_1.vsnd_c b/sounds/create_voice/0044_momizi_1.vsnd_c new file mode 100755 index 0000000..572e50e Binary files /dev/null and b/sounds/create_voice/0044_momizi_1.vsnd_c differ diff --git a/sounds/create_voice/0044_momizi_2.vsnd_c b/sounds/create_voice/0044_momizi_2.vsnd_c new file mode 100755 index 0000000..be07bd7 Binary files /dev/null and b/sounds/create_voice/0044_momizi_2.vsnd_c differ diff --git a/sounds/create_voice/0045_nitori_1.vsnd_c b/sounds/create_voice/0045_nitori_1.vsnd_c new file mode 100755 index 0000000..cf3795e Binary files /dev/null and b/sounds/create_voice/0045_nitori_1.vsnd_c differ diff --git a/sounds/create_voice/0045_nitori_2.vsnd_c b/sounds/create_voice/0045_nitori_2.vsnd_c new file mode 100755 index 0000000..362d4b1 Binary files /dev/null and b/sounds/create_voice/0045_nitori_2.vsnd_c differ diff --git a/sounds/create_voice/0047_kanako.vsnd_c b/sounds/create_voice/0047_kanako.vsnd_c new file mode 100755 index 0000000..e3c036f Binary files /dev/null and b/sounds/create_voice/0047_kanako.vsnd_c differ diff --git a/sounds/create_voice/0049_minamitsu.vsnd_c b/sounds/create_voice/0049_minamitsu.vsnd_c new file mode 100755 index 0000000..fc04885 Binary files /dev/null and b/sounds/create_voice/0049_minamitsu.vsnd_c differ diff --git a/sounds/create_voice/0052_miko_1.vsnd_c b/sounds/create_voice/0052_miko_1.vsnd_c new file mode 100755 index 0000000..acfb42c Binary files /dev/null and b/sounds/create_voice/0052_miko_1.vsnd_c differ diff --git a/sounds/create_voice/0052_miko_2.vsnd_c b/sounds/create_voice/0052_miko_2.vsnd_c new file mode 100755 index 0000000..f0ad09f Binary files /dev/null and b/sounds/create_voice/0052_miko_2.vsnd_c differ diff --git a/sounds/create_voice/0056_star.vsnd_c b/sounds/create_voice/0056_star.vsnd_c new file mode 100755 index 0000000..396cfac Binary files /dev/null and b/sounds/create_voice/0056_star.vsnd_c differ diff --git a/sounds/create_voice/0057_sunny.vsnd_c b/sounds/create_voice/0057_sunny.vsnd_c new file mode 100755 index 0000000..ba46f8f Binary files /dev/null and b/sounds/create_voice/0057_sunny.vsnd_c differ diff --git a/sounds/create_voice/0058_luna.vsnd_c b/sounds/create_voice/0058_luna.vsnd_c new file mode 100755 index 0000000..7d2d76e Binary files /dev/null and b/sounds/create_voice/0058_luna.vsnd_c differ diff --git a/sounds/create_voice/0059_alice.vsnd_c b/sounds/create_voice/0059_alice.vsnd_c new file mode 100755 index 0000000..50643d7 Binary files /dev/null and b/sounds/create_voice/0059_alice.vsnd_c differ diff --git a/sounds/create_voice/0059_alicee_cp_marisa.vsnd_c b/sounds/create_voice/0059_alicee_cp_marisa.vsnd_c new file mode 100755 index 0000000..382fa1f Binary files /dev/null and b/sounds/create_voice/0059_alicee_cp_marisa.vsnd_c differ diff --git a/sounds/create_voice/0059_alicee_cp_reimu.vsnd_c b/sounds/create_voice/0059_alicee_cp_reimu.vsnd_c new file mode 100755 index 0000000..9d9e50a Binary files /dev/null and b/sounds/create_voice/0059_alicee_cp_reimu.vsnd_c differ diff --git a/sounds/create_voice/0060_wriggle.vsnd_c b/sounds/create_voice/0060_wriggle.vsnd_c new file mode 100755 index 0000000..06f348f Binary files /dev/null and b/sounds/create_voice/0060_wriggle.vsnd_c differ diff --git a/sounds/create_voice/0061_keine.vsnd_c b/sounds/create_voice/0061_keine.vsnd_c new file mode 100755 index 0000000..b59ef5d Binary files /dev/null and b/sounds/create_voice/0061_keine.vsnd_c differ diff --git a/sounds/create_voice/0088_sizuha.vsnd_c b/sounds/create_voice/0088_sizuha.vsnd_c new file mode 100755 index 0000000..e36ea8d Binary files /dev/null and b/sounds/create_voice/0088_sizuha.vsnd_c differ diff --git a/sounds/create_voice/0092_medicine.vsnd_c b/sounds/create_voice/0092_medicine.vsnd_c new file mode 100755 index 0000000..452a76b Binary files /dev/null and b/sounds/create_voice/0092_medicine.vsnd_c differ diff --git a/sounds/create_voice/0094_soga.vsnd_c b/sounds/create_voice/0094_soga.vsnd_c new file mode 100755 index 0000000..fdd401f Binary files /dev/null and b/sounds/create_voice/0094_soga.vsnd_c differ diff --git a/sounds/music/valve_dota_001/music/laning_01_layer_01.vsnd_c b/sounds/music/valve_dota_001/music/laning_01_layer_01.vsnd_c new file mode 100755 index 0000000..a2131db Binary files /dev/null and b/sounds/music/valve_dota_001/music/laning_01_layer_01.vsnd_c differ diff --git a/sounds/music/valve_dota_001/music/laning_01_layer_02.vsnd_c b/sounds/music/valve_dota_001/music/laning_01_layer_02.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/music/valve_dota_001/music/laning_01_layer_02.vsnd_c differ diff --git a/sounds/music/valve_dota_001/music/laning_01_layer_03.vsnd_c b/sounds/music/valve_dota_001/music/laning_01_layer_03.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/music/valve_dota_001/music/laning_01_layer_03.vsnd_c differ diff --git a/sounds/music/valve_dota_001/music/laning_02_layer_01.vsnd_c b/sounds/music/valve_dota_001/music/laning_02_layer_01.vsnd_c new file mode 100755 index 0000000..3f74e0c Binary files /dev/null and b/sounds/music/valve_dota_001/music/laning_02_layer_01.vsnd_c differ diff --git a/sounds/music/valve_dota_001/music/laning_02_layer_02.vsnd_c b/sounds/music/valve_dota_001/music/laning_02_layer_02.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/music/valve_dota_001/music/laning_02_layer_02.vsnd_c differ diff --git a/sounds/music/valve_dota_001/music/laning_03_layer_01.vsnd_c b/sounds/music/valve_dota_001/music/laning_03_layer_01.vsnd_c new file mode 100755 index 0000000..96d69ae Binary files /dev/null and b/sounds/music/valve_dota_001/music/laning_03_layer_01.vsnd_c differ diff --git a/sounds/music/valve_dota_001/music/laning_03_layer_02.vsnd_c b/sounds/music/valve_dota_001/music/laning_03_layer_02.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/music/valve_dota_001/music/laning_03_layer_02.vsnd_c differ diff --git a/sounds/music/valve_dota_001/music/laning_03_layer_03.vsnd_c b/sounds/music/valve_dota_001/music/laning_03_layer_03.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/music/valve_dota_001/music/laning_03_layer_03.vsnd_c differ diff --git a/sounds/music/valve_dota_001/music/ui_hero_select.vsnd_c b/sounds/music/valve_dota_001/music/ui_hero_select.vsnd_c new file mode 100755 index 0000000..d2cfb21 Binary files /dev/null and b/sounds/music/valve_dota_001/music/ui_hero_select.vsnd_c differ diff --git a/sounds/null_2s.vsnd_c b/sounds/null_2s.vsnd_c new file mode 100755 index 0000000..e1b36f8 Binary files /dev/null and b/sounds/null_2s.vsnd_c differ diff --git a/sounds/pick_1.vsnd_c b/sounds/pick_1.vsnd_c new file mode 100755 index 0000000..f82ca09 Binary files /dev/null and b/sounds/pick_1.vsnd_c differ diff --git a/sounds/pick_2.vsnd_c b/sounds/pick_2.vsnd_c new file mode 100755 index 0000000..2e4d4d5 Binary files /dev/null and b/sounds/pick_2.vsnd_c differ diff --git a/sounds/star_up.vsnd_c b/sounds/star_up.vsnd_c new file mode 100755 index 0000000..6b6b377 Binary files /dev/null and b/sounds/star_up.vsnd_c differ diff --git a/sounds/thtd_sounds/ability_buy_normal_card.vsnd_c b/sounds/thtd_sounds/ability_buy_normal_card.vsnd_c new file mode 100755 index 0000000..c1833ca Binary files /dev/null and b/sounds/thtd_sounds/ability_buy_normal_card.vsnd_c differ diff --git a/sounds/thtd_sounds/ability_buy_senior_card.vsnd_c b/sounds/thtd_sounds/ability_buy_senior_card.vsnd_c new file mode 100755 index 0000000..d76ee89 Binary files /dev/null and b/sounds/thtd_sounds/ability_buy_senior_card.vsnd_c differ diff --git a/sounds/thtd_sounds/ability_exp_up.vsnd_c b/sounds/thtd_sounds/ability_exp_up.vsnd_c new file mode 100755 index 0000000..3c4e2a1 Binary files /dev/null and b/sounds/thtd_sounds/ability_exp_up.vsnd_c differ diff --git a/sounds/thtd_sounds/ability_release_tower.vsnd_c b/sounds/thtd_sounds/ability_release_tower.vsnd_c new file mode 100755 index 0000000..15affb0 Binary files /dev/null and b/sounds/thtd_sounds/ability_release_tower.vsnd_c differ diff --git a/sounds/thtd_sounds/ability_star_up.vsnd_c b/sounds/thtd_sounds/ability_star_up.vsnd_c new file mode 100755 index 0000000..1aa93d9 Binary files /dev/null and b/sounds/thtd_sounds/ability_star_up.vsnd_c differ diff --git a/sounds/thtd_sounds/thtd_draw_r.vsnd_c b/sounds/thtd_sounds/thtd_draw_r.vsnd_c new file mode 100755 index 0000000..2a2b480 Binary files /dev/null and b/sounds/thtd_sounds/thtd_draw_r.vsnd_c differ diff --git a/sounds/thtd_sounds/thtd_draw_sr.vsnd_c b/sounds/thtd_sounds/thtd_draw_sr.vsnd_c new file mode 100755 index 0000000..f0e3ea4 Binary files /dev/null and b/sounds/thtd_sounds/thtd_draw_sr.vsnd_c differ diff --git a/sounds/thtd_sounds/thtd_draw_ssr.vsnd_c b/sounds/thtd_sounds/thtd_draw_ssr.vsnd_c new file mode 100755 index 0000000..48223dd Binary files /dev/null and b/sounds/thtd_sounds/thtd_draw_ssr.vsnd_c differ diff --git a/sounds/ui/button01.vsnd_c b/sounds/ui/button01.vsnd_c new file mode 100755 index 0000000..7318898 Binary files /dev/null and b/sounds/ui/button01.vsnd_c differ diff --git a/sounds/ui/button02.vsnd_c b/sounds/ui/button02.vsnd_c new file mode 100755 index 0000000..c7e35e9 Binary files /dev/null and b/sounds/ui/button02.vsnd_c differ diff --git a/sounds/ui/button03.vsnd_c b/sounds/ui/button03.vsnd_c new file mode 100755 index 0000000..cdb691a Binary files /dev/null and b/sounds/ui/button03.vsnd_c differ diff --git a/sounds/ui/button04.vsnd_c b/sounds/ui/button04.vsnd_c new file mode 100755 index 0000000..62913b3 Binary files /dev/null and b/sounds/ui/button04.vsnd_c differ diff --git a/sounds/ui/card01.vsnd_c b/sounds/ui/card01.vsnd_c new file mode 100755 index 0000000..d0660b5 Binary files /dev/null and b/sounds/ui/card01.vsnd_c differ diff --git a/sounds/ui/card02.vsnd_c b/sounds/ui/card02.vsnd_c new file mode 100755 index 0000000..cf34696 Binary files /dev/null and b/sounds/ui/card02.vsnd_c differ diff --git a/sounds/ui/quest_completed.vsnd_c b/sounds/ui/quest_completed.vsnd_c new file mode 100755 index 0000000..1591866 Binary files /dev/null and b/sounds/ui/quest_completed.vsnd_c differ diff --git a/sounds/vo/announcer/announcer_battle_begin_01.vsnd_c b/sounds/vo/announcer/announcer_battle_begin_01.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/vo/announcer/announcer_battle_begin_01.vsnd_c differ diff --git a/sounds/vo/announcer/announcer_battle_prepare_01.vsnd_c b/sounds/vo/announcer/announcer_battle_prepare_01.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/vo/announcer/announcer_battle_prepare_01.vsnd_c differ diff --git a/sounds/vo/announcer/announcer_choose_hero.vsnd_c b/sounds/vo/announcer/announcer_choose_hero.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/vo/announcer/announcer_choose_hero.vsnd_c differ diff --git a/sounds/vo/announcer/announcer_count_battle_10.vsnd_c b/sounds/vo/announcer/announcer_count_battle_10.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/vo/announcer/announcer_count_battle_10.vsnd_c differ diff --git a/sounds/vo/announcer/announcer_count_battle_30.vsnd_c b/sounds/vo/announcer/announcer_count_battle_30.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/vo/announcer/announcer_count_battle_30.vsnd_c differ diff --git a/sounds/vo/announcer/announcer_count_pick_10.vsnd_c b/sounds/vo/announcer/announcer_count_pick_10.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/vo/announcer/announcer_count_pick_10.vsnd_c differ diff --git a/sounds/vo/announcer/announcer_count_pick_5.vsnd_c b/sounds/vo/announcer/announcer_count_pick_5.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/vo/announcer/announcer_count_pick_5.vsnd_c differ diff --git a/sounds/vo/announcer/announcer_now_select.vsnd_c b/sounds/vo/announcer/announcer_now_select.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/vo/announcer/announcer_now_select.vsnd_c differ diff --git a/sounds/vo/announcer/announcer_victory_dire.vsnd_c b/sounds/vo/announcer/announcer_victory_dire.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/vo/announcer/announcer_victory_dire.vsnd_c differ diff --git a/sounds/vo/announcer/announcer_victory_rad.vsnd_c b/sounds/vo/announcer/announcer_victory_rad.vsnd_c new file mode 100755 index 0000000..89d017b Binary files /dev/null and b/sounds/vo/announcer/announcer_victory_rad.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_bladefury_02.vsnd_c b/sounds/vo/juggernaut/jug_ability_bladefury_02.vsnd_c new file mode 100755 index 0000000..d1ad10a Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_bladefury_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_bladefury_03.vsnd_c b/sounds/vo/juggernaut/jug_ability_bladefury_03.vsnd_c new file mode 100755 index 0000000..7b8d920 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_bladefury_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_bladefury_05.vsnd_c b/sounds/vo/juggernaut/jug_ability_bladefury_05.vsnd_c new file mode 100755 index 0000000..e7d062b Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_bladefury_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_bladefury_06.vsnd_c b/sounds/vo/juggernaut/jug_ability_bladefury_06.vsnd_c new file mode 100755 index 0000000..0521467 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_bladefury_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_bladefury_07.vsnd_c b/sounds/vo/juggernaut/jug_ability_bladefury_07.vsnd_c new file mode 100755 index 0000000..20e34b3 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_bladefury_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_bladefury_08.vsnd_c b/sounds/vo/juggernaut/jug_ability_bladefury_08.vsnd_c new file mode 100755 index 0000000..e53d356 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_bladefury_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_bladefury_09.vsnd_c b/sounds/vo/juggernaut/jug_ability_bladefury_09.vsnd_c new file mode 100755 index 0000000..ffe4731 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_bladefury_09.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_bladefury_10.vsnd_c b/sounds/vo/juggernaut/jug_ability_bladefury_10.vsnd_c new file mode 100755 index 0000000..4510e79 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_bladefury_10.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_immunity_01.vsnd_c b/sounds/vo/juggernaut/jug_ability_immunity_01.vsnd_c new file mode 100755 index 0000000..e38773b Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_immunity_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_immunity_02.vsnd_c b/sounds/vo/juggernaut/jug_ability_immunity_02.vsnd_c new file mode 100755 index 0000000..d891ef5 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_immunity_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_immunity_03.vsnd_c b/sounds/vo/juggernaut/jug_ability_immunity_03.vsnd_c new file mode 100755 index 0000000..5d82f26 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_immunity_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_01.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_01.vsnd_c new file mode 100755 index 0000000..23d00ee Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_02.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_02.vsnd_c new file mode 100755 index 0000000..4c61ec1 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_03.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_03.vsnd_c new file mode 100755 index 0000000..22cb3c5 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_04.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_04.vsnd_c new file mode 100755 index 0000000..105b24c Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_05.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_05.vsnd_c new file mode 100755 index 0000000..9033eb0 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_06.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_06.vsnd_c new file mode 100755 index 0000000..4222437 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_07.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_07.vsnd_c new file mode 100755 index 0000000..2f584c5 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_08.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_08.vsnd_c new file mode 100755 index 0000000..1df547e Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_09.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_09.vsnd_c new file mode 100755 index 0000000..b5341d6 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_09.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_10.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_10.vsnd_c new file mode 100755 index 0000000..0c25ed7 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_10.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_11.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_11.vsnd_c new file mode 100755 index 0000000..0026fb9 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_11.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_12.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_12.vsnd_c new file mode 100755 index 0000000..df3118c Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_12.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_13.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_13.vsnd_c new file mode 100755 index 0000000..3020c29 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_13.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_14.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_14.vsnd_c new file mode 100755 index 0000000..364911d Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_14.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_15.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_15.vsnd_c new file mode 100755 index 0000000..fc5923a Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_15.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_16.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_16.vsnd_c new file mode 100755 index 0000000..302fbd6 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_16.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_17.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_17.vsnd_c new file mode 100755 index 0000000..f477b9c Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_17.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_18.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_18.vsnd_c new file mode 100755 index 0000000..8a377f4 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_18.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_19.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_19.vsnd_c new file mode 100755 index 0000000..3f19abe Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_19.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_20.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_20.vsnd_c new file mode 100755 index 0000000..804fd99 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_20.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_21.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_21.vsnd_c new file mode 100755 index 0000000..ff3a8bf Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_21.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_22.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_22.vsnd_c new file mode 100755 index 0000000..634d7a3 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_22.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_23.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_23.vsnd_c new file mode 100755 index 0000000..a87fa1d Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_23.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_24.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_24.vsnd_c new file mode 100755 index 0000000..9f58d40 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_24.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_25.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_25.vsnd_c new file mode 100755 index 0000000..9275175 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_25.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_26.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_26.vsnd_c new file mode 100755 index 0000000..44d7ef5 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_26.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_27.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_27.vsnd_c new file mode 100755 index 0000000..0ece53f Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_27.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_28.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_28.vsnd_c new file mode 100755 index 0000000..374dade Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_28.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_29.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_29.vsnd_c new file mode 100755 index 0000000..d37b7ba Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_29.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_30.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_30.vsnd_c new file mode 100755 index 0000000..42b03e3 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_30.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_31.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_31.vsnd_c new file mode 100755 index 0000000..3572261 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_31.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_32.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_32.vsnd_c new file mode 100755 index 0000000..2b4b6ad Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_32.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_33.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_33.vsnd_c new file mode 100755 index 0000000..fe1b9cf Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_33.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_omnislash_34.vsnd_c b/sounds/vo/juggernaut/jug_ability_omnislash_34.vsnd_c new file mode 100755 index 0000000..2f5c34e Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_omnislash_34.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_stunteleport_01.vsnd_c b/sounds/vo/juggernaut/jug_ability_stunteleport_01.vsnd_c new file mode 100755 index 0000000..eda4614 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_stunteleport_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_stunteleport_02.vsnd_c b/sounds/vo/juggernaut/jug_ability_stunteleport_02.vsnd_c new file mode 100755 index 0000000..bd98b7a Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_stunteleport_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_stunteleport_03.vsnd_c b/sounds/vo/juggernaut/jug_ability_stunteleport_03.vsnd_c new file mode 100755 index 0000000..5ee8625 Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_stunteleport_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_waste_01.vsnd_c b/sounds/vo/juggernaut/jug_ability_waste_01.vsnd_c new file mode 100755 index 0000000..5bb774d Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_waste_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_ability_waste_02.vsnd_c b/sounds/vo/juggernaut/jug_ability_waste_02.vsnd_c new file mode 100755 index 0000000..f1b7eda Binary files /dev/null and b/sounds/vo/juggernaut/jug_ability_waste_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_acknow_01.vsnd_c b/sounds/vo/juggernaut/jug_acknow_01.vsnd_c new file mode 100755 index 0000000..510adbf Binary files /dev/null and b/sounds/vo/juggernaut/jug_acknow_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_acknow_02.vsnd_c b/sounds/vo/juggernaut/jug_acknow_02.vsnd_c new file mode 100755 index 0000000..b7fe0b2 Binary files /dev/null and b/sounds/vo/juggernaut/jug_acknow_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_acknow_03.vsnd_c b/sounds/vo/juggernaut/jug_acknow_03.vsnd_c new file mode 100755 index 0000000..2b3fa94 Binary files /dev/null and b/sounds/vo/juggernaut/jug_acknow_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_acknow_04.vsnd_c b/sounds/vo/juggernaut/jug_acknow_04.vsnd_c new file mode 100755 index 0000000..b52d2e0 Binary files /dev/null and b/sounds/vo/juggernaut/jug_acknow_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_acknow_05.vsnd_c b/sounds/vo/juggernaut/jug_acknow_05.vsnd_c new file mode 100755 index 0000000..685ae14 Binary files /dev/null and b/sounds/vo/juggernaut/jug_acknow_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_anger_01.vsnd_c b/sounds/vo/juggernaut/jug_anger_01.vsnd_c new file mode 100755 index 0000000..f926616 Binary files /dev/null and b/sounds/vo/juggernaut/jug_anger_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_anger_02.vsnd_c b/sounds/vo/juggernaut/jug_anger_02.vsnd_c new file mode 100755 index 0000000..ac6fa01 Binary files /dev/null and b/sounds/vo/juggernaut/jug_anger_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_anger_03.vsnd_c b/sounds/vo/juggernaut/jug_anger_03.vsnd_c new file mode 100755 index 0000000..101eace Binary files /dev/null and b/sounds/vo/juggernaut/jug_anger_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_anger_04.vsnd_c b/sounds/vo/juggernaut/jug_anger_04.vsnd_c new file mode 100755 index 0000000..2b423bd Binary files /dev/null and b/sounds/vo/juggernaut/jug_anger_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_anger_05.vsnd_c b/sounds/vo/juggernaut/jug_anger_05.vsnd_c new file mode 100755 index 0000000..9e4af3e Binary files /dev/null and b/sounds/vo/juggernaut/jug_anger_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_anger_06.vsnd_c b/sounds/vo/juggernaut/jug_anger_06.vsnd_c new file mode 100755 index 0000000..66e45de Binary files /dev/null and b/sounds/vo/juggernaut/jug_anger_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_anger_07.vsnd_c b/sounds/vo/juggernaut/jug_anger_07.vsnd_c new file mode 100755 index 0000000..8e25df1 Binary files /dev/null and b/sounds/vo/juggernaut/jug_anger_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_01.vsnd_c b/sounds/vo/juggernaut/jug_attack_01.vsnd_c new file mode 100755 index 0000000..096b4a2 Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_02.vsnd_c b/sounds/vo/juggernaut/jug_attack_02.vsnd_c new file mode 100755 index 0000000..a962b79 Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_03.vsnd_c b/sounds/vo/juggernaut/jug_attack_03.vsnd_c new file mode 100755 index 0000000..5f2469f Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_04.vsnd_c b/sounds/vo/juggernaut/jug_attack_04.vsnd_c new file mode 100755 index 0000000..637a1fb Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_05.vsnd_c b/sounds/vo/juggernaut/jug_attack_05.vsnd_c new file mode 100755 index 0000000..01ee3fb Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_06.vsnd_c b/sounds/vo/juggernaut/jug_attack_06.vsnd_c new file mode 100755 index 0000000..36b4fbc Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_07.vsnd_c b/sounds/vo/juggernaut/jug_attack_07.vsnd_c new file mode 100755 index 0000000..1af1aa0 Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_08.vsnd_c b/sounds/vo/juggernaut/jug_attack_08.vsnd_c new file mode 100755 index 0000000..5acd301 Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_09.vsnd_c b/sounds/vo/juggernaut/jug_attack_09.vsnd_c new file mode 100755 index 0000000..5cacee1 Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_09.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_10.vsnd_c b/sounds/vo/juggernaut/jug_attack_10.vsnd_c new file mode 100755 index 0000000..ddfdb4e Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_10.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_11.vsnd_c b/sounds/vo/juggernaut/jug_attack_11.vsnd_c new file mode 100755 index 0000000..7e05a88 Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_11.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_12.vsnd_c b/sounds/vo/juggernaut/jug_attack_12.vsnd_c new file mode 100755 index 0000000..52c90b1 Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_12.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_attack_13.vsnd_c b/sounds/vo/juggernaut/jug_attack_13.vsnd_c new file mode 100755 index 0000000..2be44f3 Binary files /dev/null and b/sounds/vo/juggernaut/jug_attack_13.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_bottle_01.vsnd_c b/sounds/vo/juggernaut/jug_bottle_01.vsnd_c new file mode 100755 index 0000000..bc9bb00 Binary files /dev/null and b/sounds/vo/juggernaut/jug_bottle_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_bottle_02.vsnd_c b/sounds/vo/juggernaut/jug_bottle_02.vsnd_c new file mode 100755 index 0000000..d859c27 Binary files /dev/null and b/sounds/vo/juggernaut/jug_bottle_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_bottle_03.vsnd_c b/sounds/vo/juggernaut/jug_bottle_03.vsnd_c new file mode 100755 index 0000000..2ab9466 Binary files /dev/null and b/sounds/vo/juggernaut/jug_bottle_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_bottle_04.vsnd_c b/sounds/vo/juggernaut/jug_bottle_04.vsnd_c new file mode 100755 index 0000000..7f1141d Binary files /dev/null and b/sounds/vo/juggernaut/jug_bottle_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_cast_01.vsnd_c b/sounds/vo/juggernaut/jug_cast_01.vsnd_c new file mode 100755 index 0000000..6d0f371 Binary files /dev/null and b/sounds/vo/juggernaut/jug_cast_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_cast_02.vsnd_c b/sounds/vo/juggernaut/jug_cast_02.vsnd_c new file mode 100755 index 0000000..ea0e0a2 Binary files /dev/null and b/sounds/vo/juggernaut/jug_cast_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_cast_03.vsnd_c b/sounds/vo/juggernaut/jug_cast_03.vsnd_c new file mode 100755 index 0000000..ffd2863 Binary files /dev/null and b/sounds/vo/juggernaut/jug_cast_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_crumwiz_01.vsnd_c b/sounds/vo/juggernaut/jug_crumwiz_01.vsnd_c new file mode 100755 index 0000000..2808b0c Binary files /dev/null and b/sounds/vo/juggernaut/jug_crumwiz_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_death_01.vsnd_c b/sounds/vo/juggernaut/jug_death_01.vsnd_c new file mode 100755 index 0000000..8d0b422 Binary files /dev/null and b/sounds/vo/juggernaut/jug_death_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_death_02.vsnd_c b/sounds/vo/juggernaut/jug_death_02.vsnd_c new file mode 100755 index 0000000..9e86e81 Binary files /dev/null and b/sounds/vo/juggernaut/jug_death_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_death_03.vsnd_c b/sounds/vo/juggernaut/jug_death_03.vsnd_c new file mode 100755 index 0000000..30e067e Binary files /dev/null and b/sounds/vo/juggernaut/jug_death_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_death_04.vsnd_c b/sounds/vo/juggernaut/jug_death_04.vsnd_c new file mode 100755 index 0000000..4295ba6 Binary files /dev/null and b/sounds/vo/juggernaut/jug_death_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_death_05.vsnd_c b/sounds/vo/juggernaut/jug_death_05.vsnd_c new file mode 100755 index 0000000..284d072 Binary files /dev/null and b/sounds/vo/juggernaut/jug_death_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_death_06.vsnd_c b/sounds/vo/juggernaut/jug_death_06.vsnd_c new file mode 100755 index 0000000..73a0646 Binary files /dev/null and b/sounds/vo/juggernaut/jug_death_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_death_07.vsnd_c b/sounds/vo/juggernaut/jug_death_07.vsnd_c new file mode 100755 index 0000000..f0cd42b Binary files /dev/null and b/sounds/vo/juggernaut/jug_death_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_death_08.vsnd_c b/sounds/vo/juggernaut/jug_death_08.vsnd_c new file mode 100755 index 0000000..aeb90cf Binary files /dev/null and b/sounds/vo/juggernaut/jug_death_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_death_09.vsnd_c b/sounds/vo/juggernaut/jug_death_09.vsnd_c new file mode 100755 index 0000000..cb3bdc1 Binary files /dev/null and b/sounds/vo/juggernaut/jug_death_09.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_death_10.vsnd_c b/sounds/vo/juggernaut/jug_death_10.vsnd_c new file mode 100755 index 0000000..c732879 Binary files /dev/null and b/sounds/vo/juggernaut/jug_death_10.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_death_11.vsnd_c b/sounds/vo/juggernaut/jug_death_11.vsnd_c new file mode 100755 index 0000000..2bbeb34 Binary files /dev/null and b/sounds/vo/juggernaut/jug_death_11.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_death_12.vsnd_c b/sounds/vo/juggernaut/jug_death_12.vsnd_c new file mode 100755 index 0000000..c2ceb20 Binary files /dev/null and b/sounds/vo/juggernaut/jug_death_12.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_deny_01.vsnd_c b/sounds/vo/juggernaut/jug_deny_01.vsnd_c new file mode 100755 index 0000000..860dff7 Binary files /dev/null and b/sounds/vo/juggernaut/jug_deny_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_deny_02.vsnd_c b/sounds/vo/juggernaut/jug_deny_02.vsnd_c new file mode 100755 index 0000000..920725e Binary files /dev/null and b/sounds/vo/juggernaut/jug_deny_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_deny_03.vsnd_c b/sounds/vo/juggernaut/jug_deny_03.vsnd_c new file mode 100755 index 0000000..e895fdf Binary files /dev/null and b/sounds/vo/juggernaut/jug_deny_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_deny_04.vsnd_c b/sounds/vo/juggernaut/jug_deny_04.vsnd_c new file mode 100755 index 0000000..08a3195 Binary files /dev/null and b/sounds/vo/juggernaut/jug_deny_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_deny_05.vsnd_c b/sounds/vo/juggernaut/jug_deny_05.vsnd_c new file mode 100755 index 0000000..3fd0990 Binary files /dev/null and b/sounds/vo/juggernaut/jug_deny_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_deny_06.vsnd_c b/sounds/vo/juggernaut/jug_deny_06.vsnd_c new file mode 100755 index 0000000..1c31de7 Binary files /dev/null and b/sounds/vo/juggernaut/jug_deny_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_deny_07.vsnd_c b/sounds/vo/juggernaut/jug_deny_07.vsnd_c new file mode 100755 index 0000000..d645248 Binary files /dev/null and b/sounds/vo/juggernaut/jug_deny_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_doubdam_01.vsnd_c b/sounds/vo/juggernaut/jug_doubdam_01.vsnd_c new file mode 100755 index 0000000..cf0a8f0 Binary files /dev/null and b/sounds/vo/juggernaut/jug_doubdam_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_doubdam_02.vsnd_c b/sounds/vo/juggernaut/jug_doubdam_02.vsnd_c new file mode 100755 index 0000000..ce375d3 Binary files /dev/null and b/sounds/vo/juggernaut/jug_doubdam_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_happy_01.vsnd_c b/sounds/vo/juggernaut/jug_happy_01.vsnd_c new file mode 100755 index 0000000..12aca0e Binary files /dev/null and b/sounds/vo/juggernaut/jug_happy_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_happy_02.vsnd_c b/sounds/vo/juggernaut/jug_happy_02.vsnd_c new file mode 100755 index 0000000..15f7acd Binary files /dev/null and b/sounds/vo/juggernaut/jug_happy_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_happy_03.vsnd_c b/sounds/vo/juggernaut/jug_happy_03.vsnd_c new file mode 100755 index 0000000..39739bf Binary files /dev/null and b/sounds/vo/juggernaut/jug_happy_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_haste_01.vsnd_c b/sounds/vo/juggernaut/jug_haste_01.vsnd_c new file mode 100755 index 0000000..3acbab2 Binary files /dev/null and b/sounds/vo/juggernaut/jug_haste_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_haste_02.vsnd_c b/sounds/vo/juggernaut/jug_haste_02.vsnd_c new file mode 100755 index 0000000..aab2fbb Binary files /dev/null and b/sounds/vo/juggernaut/jug_haste_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_haste_03.vsnd_c b/sounds/vo/juggernaut/jug_haste_03.vsnd_c new file mode 100755 index 0000000..f788293 Binary files /dev/null and b/sounds/vo/juggernaut/jug_haste_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_illus_01.vsnd_c b/sounds/vo/juggernaut/jug_illus_01.vsnd_c new file mode 100755 index 0000000..4568fee Binary files /dev/null and b/sounds/vo/juggernaut/jug_illus_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_illus_02.vsnd_c b/sounds/vo/juggernaut/jug_illus_02.vsnd_c new file mode 100755 index 0000000..7dbd746 Binary files /dev/null and b/sounds/vo/juggernaut/jug_illus_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_illus_03.vsnd_c b/sounds/vo/juggernaut/jug_illus_03.vsnd_c new file mode 100755 index 0000000..e63894e Binary files /dev/null and b/sounds/vo/juggernaut/jug_illus_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_immort_01.vsnd_c b/sounds/vo/juggernaut/jug_immort_01.vsnd_c new file mode 100755 index 0000000..4b743b5 Binary files /dev/null and b/sounds/vo/juggernaut/jug_immort_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_immort_02.vsnd_c b/sounds/vo/juggernaut/jug_immort_02.vsnd_c new file mode 100755 index 0000000..c0945e6 Binary files /dev/null and b/sounds/vo/juggernaut/jug_immort_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_immort_03.vsnd_c b/sounds/vo/juggernaut/jug_immort_03.vsnd_c new file mode 100755 index 0000000..365e56e Binary files /dev/null and b/sounds/vo/juggernaut/jug_immort_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_inthebag_01.vsnd_c b/sounds/vo/juggernaut/jug_inthebag_01.vsnd_c new file mode 100755 index 0000000..94e0baf Binary files /dev/null and b/sounds/vo/juggernaut/jug_inthebag_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_inthebag_02.vsnd_c b/sounds/vo/juggernaut/jug_inthebag_02.vsnd_c new file mode 100755 index 0000000..95e3696 Binary files /dev/null and b/sounds/vo/juggernaut/jug_inthebag_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_inthebag_03.vsnd_c b/sounds/vo/juggernaut/jug_inthebag_03.vsnd_c new file mode 100755 index 0000000..ecf297d Binary files /dev/null and b/sounds/vo/juggernaut/jug_inthebag_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_invis_01.vsnd_c b/sounds/vo/juggernaut/jug_invis_01.vsnd_c new file mode 100755 index 0000000..4e3a5e0 Binary files /dev/null and b/sounds/vo/juggernaut/jug_invis_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_invis_02.vsnd_c b/sounds/vo/juggernaut/jug_invis_02.vsnd_c new file mode 100755 index 0000000..910cade Binary files /dev/null and b/sounds/vo/juggernaut/jug_invis_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_kill_01.vsnd_c b/sounds/vo/juggernaut/jug_kill_01.vsnd_c new file mode 100755 index 0000000..da51f00 Binary files /dev/null and b/sounds/vo/juggernaut/jug_kill_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_kill_02.vsnd_c b/sounds/vo/juggernaut/jug_kill_02.vsnd_c new file mode 100755 index 0000000..578250c Binary files /dev/null and b/sounds/vo/juggernaut/jug_kill_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_kill_03.vsnd_c b/sounds/vo/juggernaut/jug_kill_03.vsnd_c new file mode 100755 index 0000000..9a3826e Binary files /dev/null and b/sounds/vo/juggernaut/jug_kill_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_kill_04.vsnd_c b/sounds/vo/juggernaut/jug_kill_04.vsnd_c new file mode 100755 index 0000000..4be1f6e Binary files /dev/null and b/sounds/vo/juggernaut/jug_kill_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_kill_05.vsnd_c b/sounds/vo/juggernaut/jug_kill_05.vsnd_c new file mode 100755 index 0000000..a0d6f39 Binary files /dev/null and b/sounds/vo/juggernaut/jug_kill_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_kill_06.vsnd_c b/sounds/vo/juggernaut/jug_kill_06.vsnd_c new file mode 100755 index 0000000..c254d5a Binary files /dev/null and b/sounds/vo/juggernaut/jug_kill_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_kill_07.vsnd_c b/sounds/vo/juggernaut/jug_kill_07.vsnd_c new file mode 100755 index 0000000..9646f7d Binary files /dev/null and b/sounds/vo/juggernaut/jug_kill_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_kill_08.vsnd_c b/sounds/vo/juggernaut/jug_kill_08.vsnd_c new file mode 100755 index 0000000..5316312 Binary files /dev/null and b/sounds/vo/juggernaut/jug_kill_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_kill_09.vsnd_c b/sounds/vo/juggernaut/jug_kill_09.vsnd_c new file mode 100755 index 0000000..71f2f5e Binary files /dev/null and b/sounds/vo/juggernaut/jug_kill_09.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_kill_10.vsnd_c b/sounds/vo/juggernaut/jug_kill_10.vsnd_c new file mode 100755 index 0000000..9d6fef9 Binary files /dev/null and b/sounds/vo/juggernaut/jug_kill_10.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_kill_11.vsnd_c b/sounds/vo/juggernaut/jug_kill_11.vsnd_c new file mode 100755 index 0000000..efd9179 Binary files /dev/null and b/sounds/vo/juggernaut/jug_kill_11.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_kill_12.vsnd_c b/sounds/vo/juggernaut/jug_kill_12.vsnd_c new file mode 100755 index 0000000..7d7664b Binary files /dev/null and b/sounds/vo/juggernaut/jug_kill_12.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lasthit_01.vsnd_c b/sounds/vo/juggernaut/jug_lasthit_01.vsnd_c new file mode 100755 index 0000000..b2aab70 Binary files /dev/null and b/sounds/vo/juggernaut/jug_lasthit_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lasthit_02.vsnd_c b/sounds/vo/juggernaut/jug_lasthit_02.vsnd_c new file mode 100755 index 0000000..f3a178e Binary files /dev/null and b/sounds/vo/juggernaut/jug_lasthit_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lasthit_03.vsnd_c b/sounds/vo/juggernaut/jug_lasthit_03.vsnd_c new file mode 100755 index 0000000..2ba4258 Binary files /dev/null and b/sounds/vo/juggernaut/jug_lasthit_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lasthit_04.vsnd_c b/sounds/vo/juggernaut/jug_lasthit_04.vsnd_c new file mode 100755 index 0000000..2757c82 Binary files /dev/null and b/sounds/vo/juggernaut/jug_lasthit_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lasthit_05.vsnd_c b/sounds/vo/juggernaut/jug_lasthit_05.vsnd_c new file mode 100755 index 0000000..1c0a368 Binary files /dev/null and b/sounds/vo/juggernaut/jug_lasthit_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lasthit_06.vsnd_c b/sounds/vo/juggernaut/jug_lasthit_06.vsnd_c new file mode 100755 index 0000000..295a462 Binary files /dev/null and b/sounds/vo/juggernaut/jug_lasthit_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lasthit_07.vsnd_c b/sounds/vo/juggernaut/jug_lasthit_07.vsnd_c new file mode 100755 index 0000000..18046bd Binary files /dev/null and b/sounds/vo/juggernaut/jug_lasthit_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lasthit_08.vsnd_c b/sounds/vo/juggernaut/jug_lasthit_08.vsnd_c new file mode 100755 index 0000000..07411ce Binary files /dev/null and b/sounds/vo/juggernaut/jug_lasthit_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lasthit_09.vsnd_c b/sounds/vo/juggernaut/jug_lasthit_09.vsnd_c new file mode 100755 index 0000000..408abba Binary files /dev/null and b/sounds/vo/juggernaut/jug_lasthit_09.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lasthit_10.vsnd_c b/sounds/vo/juggernaut/jug_lasthit_10.vsnd_c new file mode 100755 index 0000000..ac281c1 Binary files /dev/null and b/sounds/vo/juggernaut/jug_lasthit_10.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lasthit_11.vsnd_c b/sounds/vo/juggernaut/jug_lasthit_11.vsnd_c new file mode 100755 index 0000000..b1876c2 Binary files /dev/null and b/sounds/vo/juggernaut/jug_lasthit_11.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lasthit_12.vsnd_c b/sounds/vo/juggernaut/jug_lasthit_12.vsnd_c new file mode 100755 index 0000000..24d1a21 Binary files /dev/null and b/sounds/vo/juggernaut/jug_lasthit_12.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_laugh_01.vsnd_c b/sounds/vo/juggernaut/jug_laugh_01.vsnd_c new file mode 100755 index 0000000..985c029 Binary files /dev/null and b/sounds/vo/juggernaut/jug_laugh_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_laugh_02.vsnd_c b/sounds/vo/juggernaut/jug_laugh_02.vsnd_c new file mode 100755 index 0000000..7cbc14b Binary files /dev/null and b/sounds/vo/juggernaut/jug_laugh_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_laugh_03.vsnd_c b/sounds/vo/juggernaut/jug_laugh_03.vsnd_c new file mode 100755 index 0000000..bd236b2 Binary files /dev/null and b/sounds/vo/juggernaut/jug_laugh_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_laugh_04.vsnd_c b/sounds/vo/juggernaut/jug_laugh_04.vsnd_c new file mode 100755 index 0000000..5cb229d Binary files /dev/null and b/sounds/vo/juggernaut/jug_laugh_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_laugh_05.vsnd_c b/sounds/vo/juggernaut/jug_laugh_05.vsnd_c new file mode 100755 index 0000000..bfa0d86 Binary files /dev/null and b/sounds/vo/juggernaut/jug_laugh_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_laugh_06.vsnd_c b/sounds/vo/juggernaut/jug_laugh_06.vsnd_c new file mode 100755 index 0000000..fe77e35 Binary files /dev/null and b/sounds/vo/juggernaut/jug_laugh_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_laugh_07.vsnd_c b/sounds/vo/juggernaut/jug_laugh_07.vsnd_c new file mode 100755 index 0000000..8546c47 Binary files /dev/null and b/sounds/vo/juggernaut/jug_laugh_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_laugh_08.vsnd_c b/sounds/vo/juggernaut/jug_laugh_08.vsnd_c new file mode 100755 index 0000000..238b454 Binary files /dev/null and b/sounds/vo/juggernaut/jug_laugh_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_level_02.vsnd_c b/sounds/vo/juggernaut/jug_level_02.vsnd_c new file mode 100755 index 0000000..5bb58d3 Binary files /dev/null and b/sounds/vo/juggernaut/jug_level_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_level_03.vsnd_c b/sounds/vo/juggernaut/jug_level_03.vsnd_c new file mode 100755 index 0000000..7b7f76e Binary files /dev/null and b/sounds/vo/juggernaut/jug_level_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_level_04.vsnd_c b/sounds/vo/juggernaut/jug_level_04.vsnd_c new file mode 100755 index 0000000..cb821af Binary files /dev/null and b/sounds/vo/juggernaut/jug_level_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_level_05.vsnd_c b/sounds/vo/juggernaut/jug_level_05.vsnd_c new file mode 100755 index 0000000..6b4b711 Binary files /dev/null and b/sounds/vo/juggernaut/jug_level_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_level_06.vsnd_c b/sounds/vo/juggernaut/jug_level_06.vsnd_c new file mode 100755 index 0000000..8b29921 Binary files /dev/null and b/sounds/vo/juggernaut/jug_level_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lose_01.vsnd_c b/sounds/vo/juggernaut/jug_lose_01.vsnd_c new file mode 100755 index 0000000..9e22ba2 Binary files /dev/null and b/sounds/vo/juggernaut/jug_lose_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lose_02.vsnd_c b/sounds/vo/juggernaut/jug_lose_02.vsnd_c new file mode 100755 index 0000000..8486055 Binary files /dev/null and b/sounds/vo/juggernaut/jug_lose_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lose_03.vsnd_c b/sounds/vo/juggernaut/jug_lose_03.vsnd_c new file mode 100755 index 0000000..f92c037 Binary files /dev/null and b/sounds/vo/juggernaut/jug_lose_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_lose_04.vsnd_c b/sounds/vo/juggernaut/jug_lose_04.vsnd_c new file mode 100755 index 0000000..6823e20 Binary files /dev/null and b/sounds/vo/juggernaut/jug_lose_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_01.vsnd_c b/sounds/vo/juggernaut/jug_move_01.vsnd_c new file mode 100755 index 0000000..08c2fc1 Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_02.vsnd_c b/sounds/vo/juggernaut/jug_move_02.vsnd_c new file mode 100755 index 0000000..b61812c Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_03.vsnd_c b/sounds/vo/juggernaut/jug_move_03.vsnd_c new file mode 100755 index 0000000..f95974b Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_04.vsnd_c b/sounds/vo/juggernaut/jug_move_04.vsnd_c new file mode 100755 index 0000000..f9bdea4 Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_05.vsnd_c b/sounds/vo/juggernaut/jug_move_05.vsnd_c new file mode 100755 index 0000000..94c2291 Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_06.vsnd_c b/sounds/vo/juggernaut/jug_move_06.vsnd_c new file mode 100755 index 0000000..281217f Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_07.vsnd_c b/sounds/vo/juggernaut/jug_move_07.vsnd_c new file mode 100755 index 0000000..7819d00 Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_08.vsnd_c b/sounds/vo/juggernaut/jug_move_08.vsnd_c new file mode 100755 index 0000000..da59651 Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_09.vsnd_c b/sounds/vo/juggernaut/jug_move_09.vsnd_c new file mode 100755 index 0000000..73edcf5 Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_09.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_10.vsnd_c b/sounds/vo/juggernaut/jug_move_10.vsnd_c new file mode 100755 index 0000000..1d86490 Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_10.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_11.vsnd_c b/sounds/vo/juggernaut/jug_move_11.vsnd_c new file mode 100755 index 0000000..e628d1c Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_11.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_12.vsnd_c b/sounds/vo/juggernaut/jug_move_12.vsnd_c new file mode 100755 index 0000000..4cb1823 Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_12.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_13.vsnd_c b/sounds/vo/juggernaut/jug_move_13.vsnd_c new file mode 100755 index 0000000..ce46d14 Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_13.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_14.vsnd_c b/sounds/vo/juggernaut/jug_move_14.vsnd_c new file mode 100755 index 0000000..6947fe0 Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_14.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_15.vsnd_c b/sounds/vo/juggernaut/jug_move_15.vsnd_c new file mode 100755 index 0000000..a5f9b43 Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_15.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_16.vsnd_c b/sounds/vo/juggernaut/jug_move_16.vsnd_c new file mode 100755 index 0000000..4e92e3c Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_16.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_17.vsnd_c b/sounds/vo/juggernaut/jug_move_17.vsnd_c new file mode 100755 index 0000000..24276c9 Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_17.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_18.vsnd_c b/sounds/vo/juggernaut/jug_move_18.vsnd_c new file mode 100755 index 0000000..05b330b Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_18.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_move_19.vsnd_c b/sounds/vo/juggernaut/jug_move_19.vsnd_c new file mode 100755 index 0000000..f58457d Binary files /dev/null and b/sounds/vo/juggernaut/jug_move_19.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_nomana_01.vsnd_c b/sounds/vo/juggernaut/jug_nomana_01.vsnd_c new file mode 100755 index 0000000..875410b Binary files /dev/null and b/sounds/vo/juggernaut/jug_nomana_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_nomana_02.vsnd_c b/sounds/vo/juggernaut/jug_nomana_02.vsnd_c new file mode 100755 index 0000000..ebc6fc6 Binary files /dev/null and b/sounds/vo/juggernaut/jug_nomana_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_nomana_03.vsnd_c b/sounds/vo/juggernaut/jug_nomana_03.vsnd_c new file mode 100755 index 0000000..b9b2548 Binary files /dev/null and b/sounds/vo/juggernaut/jug_nomana_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_nomana_04.vsnd_c b/sounds/vo/juggernaut/jug_nomana_04.vsnd_c new file mode 100755 index 0000000..dfc2488 Binary files /dev/null and b/sounds/vo/juggernaut/jug_nomana_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_nomana_05.vsnd_c b/sounds/vo/juggernaut/jug_nomana_05.vsnd_c new file mode 100755 index 0000000..1d7b8aa Binary files /dev/null and b/sounds/vo/juggernaut/jug_nomana_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_nomana_06.vsnd_c b/sounds/vo/juggernaut/jug_nomana_06.vsnd_c new file mode 100755 index 0000000..08955b7 Binary files /dev/null and b/sounds/vo/juggernaut/jug_nomana_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_nomana_07.vsnd_c b/sounds/vo/juggernaut/jug_nomana_07.vsnd_c new file mode 100755 index 0000000..a5f725c Binary files /dev/null and b/sounds/vo/juggernaut/jug_nomana_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_nomana_08.vsnd_c b/sounds/vo/juggernaut/jug_nomana_08.vsnd_c new file mode 100755 index 0000000..fc4e31b Binary files /dev/null and b/sounds/vo/juggernaut/jug_nomana_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_nomana_09.vsnd_c b/sounds/vo/juggernaut/jug_nomana_09.vsnd_c new file mode 100755 index 0000000..625e0d8 Binary files /dev/null and b/sounds/vo/juggernaut/jug_nomana_09.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_notyet_01.vsnd_c b/sounds/vo/juggernaut/jug_notyet_01.vsnd_c new file mode 100755 index 0000000..3d2aefb Binary files /dev/null and b/sounds/vo/juggernaut/jug_notyet_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_notyet_02.vsnd_c b/sounds/vo/juggernaut/jug_notyet_02.vsnd_c new file mode 100755 index 0000000..dd884f9 Binary files /dev/null and b/sounds/vo/juggernaut/jug_notyet_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_notyet_03.vsnd_c b/sounds/vo/juggernaut/jug_notyet_03.vsnd_c new file mode 100755 index 0000000..5e2a9c0 Binary files /dev/null and b/sounds/vo/juggernaut/jug_notyet_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_notyet_04.vsnd_c b/sounds/vo/juggernaut/jug_notyet_04.vsnd_c new file mode 100755 index 0000000..5413e07 Binary files /dev/null and b/sounds/vo/juggernaut/jug_notyet_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_notyet_05.vsnd_c b/sounds/vo/juggernaut/jug_notyet_05.vsnd_c new file mode 100755 index 0000000..d7c49b9 Binary files /dev/null and b/sounds/vo/juggernaut/jug_notyet_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_notyet_06.vsnd_c b/sounds/vo/juggernaut/jug_notyet_06.vsnd_c new file mode 100755 index 0000000..d5d7e7c Binary files /dev/null and b/sounds/vo/juggernaut/jug_notyet_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_notyet_07.vsnd_c b/sounds/vo/juggernaut/jug_notyet_07.vsnd_c new file mode 100755 index 0000000..d23b1b2 Binary files /dev/null and b/sounds/vo/juggernaut/jug_notyet_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_notyet_08.vsnd_c b/sounds/vo/juggernaut/jug_notyet_08.vsnd_c new file mode 100755 index 0000000..77eb970 Binary files /dev/null and b/sounds/vo/juggernaut/jug_notyet_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_notyet_09.vsnd_c b/sounds/vo/juggernaut/jug_notyet_09.vsnd_c new file mode 100755 index 0000000..9bf841a Binary files /dev/null and b/sounds/vo/juggernaut/jug_notyet_09.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_pain_01.vsnd_c b/sounds/vo/juggernaut/jug_pain_01.vsnd_c new file mode 100755 index 0000000..51cd7b7 Binary files /dev/null and b/sounds/vo/juggernaut/jug_pain_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_pain_02.vsnd_c b/sounds/vo/juggernaut/jug_pain_02.vsnd_c new file mode 100755 index 0000000..5d771a2 Binary files /dev/null and b/sounds/vo/juggernaut/jug_pain_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_pain_03.vsnd_c b/sounds/vo/juggernaut/jug_pain_03.vsnd_c new file mode 100755 index 0000000..fdb25b1 Binary files /dev/null and b/sounds/vo/juggernaut/jug_pain_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_pain_04.vsnd_c b/sounds/vo/juggernaut/jug_pain_04.vsnd_c new file mode 100755 index 0000000..9543e0d Binary files /dev/null and b/sounds/vo/juggernaut/jug_pain_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_pain_05.vsnd_c b/sounds/vo/juggernaut/jug_pain_05.vsnd_c new file mode 100755 index 0000000..848b122 Binary files /dev/null and b/sounds/vo/juggernaut/jug_pain_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_pain_06.vsnd_c b/sounds/vo/juggernaut/jug_pain_06.vsnd_c new file mode 100755 index 0000000..d64b341 Binary files /dev/null and b/sounds/vo/juggernaut/jug_pain_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_pain_07.vsnd_c b/sounds/vo/juggernaut/jug_pain_07.vsnd_c new file mode 100755 index 0000000..60bd664 Binary files /dev/null and b/sounds/vo/juggernaut/jug_pain_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_pain_08.vsnd_c b/sounds/vo/juggernaut/jug_pain_08.vsnd_c new file mode 100755 index 0000000..d1351a4 Binary files /dev/null and b/sounds/vo/juggernaut/jug_pain_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_pain_09.vsnd_c b/sounds/vo/juggernaut/jug_pain_09.vsnd_c new file mode 100755 index 0000000..9d15a28 Binary files /dev/null and b/sounds/vo/juggernaut/jug_pain_09.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_pain_10.vsnd_c b/sounds/vo/juggernaut/jug_pain_10.vsnd_c new file mode 100755 index 0000000..8e3151f Binary files /dev/null and b/sounds/vo/juggernaut/jug_pain_10.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_purch_01.vsnd_c b/sounds/vo/juggernaut/jug_purch_01.vsnd_c new file mode 100755 index 0000000..687bc31 Binary files /dev/null and b/sounds/vo/juggernaut/jug_purch_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_purch_02.vsnd_c b/sounds/vo/juggernaut/jug_purch_02.vsnd_c new file mode 100755 index 0000000..81a8b2d Binary files /dev/null and b/sounds/vo/juggernaut/jug_purch_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_purch_03.vsnd_c b/sounds/vo/juggernaut/jug_purch_03.vsnd_c new file mode 100755 index 0000000..bb5e278 Binary files /dev/null and b/sounds/vo/juggernaut/jug_purch_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_01.vsnd_c b/sounds/vo/juggernaut/jug_rare_01.vsnd_c new file mode 100755 index 0000000..28c582b Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_02.vsnd_c b/sounds/vo/juggernaut/jug_rare_02.vsnd_c new file mode 100755 index 0000000..f3de195 Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_03.vsnd_c b/sounds/vo/juggernaut/jug_rare_03.vsnd_c new file mode 100755 index 0000000..1d26226 Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_04.vsnd_c b/sounds/vo/juggernaut/jug_rare_04.vsnd_c new file mode 100755 index 0000000..271b6a3 Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_05.vsnd_c b/sounds/vo/juggernaut/jug_rare_05.vsnd_c new file mode 100755 index 0000000..5923e86 Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_06.vsnd_c b/sounds/vo/juggernaut/jug_rare_06.vsnd_c new file mode 100755 index 0000000..f1e3411 Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_07.vsnd_c b/sounds/vo/juggernaut/jug_rare_07.vsnd_c new file mode 100755 index 0000000..4f3ce8a Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_08.vsnd_c b/sounds/vo/juggernaut/jug_rare_08.vsnd_c new file mode 100755 index 0000000..4584979 Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_09.vsnd_c b/sounds/vo/juggernaut/jug_rare_09.vsnd_c new file mode 100755 index 0000000..db66b00 Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_09.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_10.vsnd_c b/sounds/vo/juggernaut/jug_rare_10.vsnd_c new file mode 100755 index 0000000..3663994 Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_10.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_11.vsnd_c b/sounds/vo/juggernaut/jug_rare_11.vsnd_c new file mode 100755 index 0000000..4ccb0e7 Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_11.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_12.vsnd_c b/sounds/vo/juggernaut/jug_rare_12.vsnd_c new file mode 100755 index 0000000..1a3540f Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_12.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_13.vsnd_c b/sounds/vo/juggernaut/jug_rare_13.vsnd_c new file mode 100755 index 0000000..01a2712 Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_13.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_14.vsnd_c b/sounds/vo/juggernaut/jug_rare_14.vsnd_c new file mode 100755 index 0000000..00fa9fb Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_14.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_15.vsnd_c b/sounds/vo/juggernaut/jug_rare_15.vsnd_c new file mode 100755 index 0000000..3a6ac39 Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_15.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_16.vsnd_c b/sounds/vo/juggernaut/jug_rare_16.vsnd_c new file mode 100755 index 0000000..dd72f2b Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_16.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_rare_17.vsnd_c b/sounds/vo/juggernaut/jug_rare_17.vsnd_c new file mode 100755 index 0000000..eb568b7 Binary files /dev/null and b/sounds/vo/juggernaut/jug_rare_17.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_regen_01.vsnd_c b/sounds/vo/juggernaut/jug_regen_01.vsnd_c new file mode 100755 index 0000000..abe1512 Binary files /dev/null and b/sounds/vo/juggernaut/jug_regen_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_regen_02.vsnd_c b/sounds/vo/juggernaut/jug_regen_02.vsnd_c new file mode 100755 index 0000000..88f7fd2 Binary files /dev/null and b/sounds/vo/juggernaut/jug_regen_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_respawn_01.vsnd_c b/sounds/vo/juggernaut/jug_respawn_01.vsnd_c new file mode 100755 index 0000000..4c34790 Binary files /dev/null and b/sounds/vo/juggernaut/jug_respawn_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_respawn_02.vsnd_c b/sounds/vo/juggernaut/jug_respawn_02.vsnd_c new file mode 100755 index 0000000..3be509d Binary files /dev/null and b/sounds/vo/juggernaut/jug_respawn_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_respawn_03.vsnd_c b/sounds/vo/juggernaut/jug_respawn_03.vsnd_c new file mode 100755 index 0000000..bff54ac Binary files /dev/null and b/sounds/vo/juggernaut/jug_respawn_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_respawn_04.vsnd_c b/sounds/vo/juggernaut/jug_respawn_04.vsnd_c new file mode 100755 index 0000000..ce92a24 Binary files /dev/null and b/sounds/vo/juggernaut/jug_respawn_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_respawn_05.vsnd_c b/sounds/vo/juggernaut/jug_respawn_05.vsnd_c new file mode 100755 index 0000000..d4818b5 Binary files /dev/null and b/sounds/vo/juggernaut/jug_respawn_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_respawn_06.vsnd_c b/sounds/vo/juggernaut/jug_respawn_06.vsnd_c new file mode 100755 index 0000000..f20f14e Binary files /dev/null and b/sounds/vo/juggernaut/jug_respawn_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_respawn_07.vsnd_c b/sounds/vo/juggernaut/jug_respawn_07.vsnd_c new file mode 100755 index 0000000..503cd27 Binary files /dev/null and b/sounds/vo/juggernaut/jug_respawn_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_shitwiz_01.vsnd_c b/sounds/vo/juggernaut/jug_shitwiz_01.vsnd_c new file mode 100755 index 0000000..d662e38 Binary files /dev/null and b/sounds/vo/juggernaut/jug_shitwiz_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_spawn_01.vsnd_c b/sounds/vo/juggernaut/jug_spawn_01.vsnd_c new file mode 100755 index 0000000..07f2754 Binary files /dev/null and b/sounds/vo/juggernaut/jug_spawn_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_spawn_02.vsnd_c b/sounds/vo/juggernaut/jug_spawn_02.vsnd_c new file mode 100755 index 0000000..3447be9 Binary files /dev/null and b/sounds/vo/juggernaut/jug_spawn_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_spawn_03.vsnd_c b/sounds/vo/juggernaut/jug_spawn_03.vsnd_c new file mode 100755 index 0000000..be8e818 Binary files /dev/null and b/sounds/vo/juggernaut/jug_spawn_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_spawn_04.vsnd_c b/sounds/vo/juggernaut/jug_spawn_04.vsnd_c new file mode 100755 index 0000000..4bda1cd Binary files /dev/null and b/sounds/vo/juggernaut/jug_spawn_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_spawn_05.vsnd_c b/sounds/vo/juggernaut/jug_spawn_05.vsnd_c new file mode 100755 index 0000000..6e5488e Binary files /dev/null and b/sounds/vo/juggernaut/jug_spawn_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_spawn_06.vsnd_c b/sounds/vo/juggernaut/jug_spawn_06.vsnd_c new file mode 100755 index 0000000..8af0609 Binary files /dev/null and b/sounds/vo/juggernaut/jug_spawn_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_spawn_07.vsnd_c b/sounds/vo/juggernaut/jug_spawn_07.vsnd_c new file mode 100755 index 0000000..ee7c2c9 Binary files /dev/null and b/sounds/vo/juggernaut/jug_spawn_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_spawn_08.vsnd_c b/sounds/vo/juggernaut/jug_spawn_08.vsnd_c new file mode 100755 index 0000000..8fc9814 Binary files /dev/null and b/sounds/vo/juggernaut/jug_spawn_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_win_01.vsnd_c b/sounds/vo/juggernaut/jug_win_01.vsnd_c new file mode 100755 index 0000000..80c7e1a Binary files /dev/null and b/sounds/vo/juggernaut/jug_win_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_win_02.vsnd_c b/sounds/vo/juggernaut/jug_win_02.vsnd_c new file mode 100755 index 0000000..13d64e6 Binary files /dev/null and b/sounds/vo/juggernaut/jug_win_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_win_03.vsnd_c b/sounds/vo/juggernaut/jug_win_03.vsnd_c new file mode 100755 index 0000000..9bbb3fe Binary files /dev/null and b/sounds/vo/juggernaut/jug_win_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jug_win_04.vsnd_c b/sounds/vo/juggernaut/jug_win_04.vsnd_c new file mode 100755 index 0000000..b0f05eb Binary files /dev/null and b/sounds/vo/juggernaut/jug_win_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_ability_bladefury_10.vsnd_c b/sounds/vo/juggernaut/jugg_ability_bladefury_10.vsnd_c new file mode 100755 index 0000000..8492a4c Binary files /dev/null and b/sounds/vo/juggernaut/jugg_ability_bladefury_10.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_ability_bladefury_11.vsnd_c b/sounds/vo/juggernaut/jugg_ability_bladefury_11.vsnd_c new file mode 100755 index 0000000..14fa2d3 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_ability_bladefury_11.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_ability_bladefury_12.vsnd_c b/sounds/vo/juggernaut/jugg_ability_bladefury_12.vsnd_c new file mode 100755 index 0000000..1a31df0 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_ability_bladefury_12.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_ability_bladefury_13.vsnd_c b/sounds/vo/juggernaut/jugg_ability_bladefury_13.vsnd_c new file mode 100755 index 0000000..a862b95 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_ability_bladefury_13.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_ability_bladefury_14.vsnd_c b/sounds/vo/juggernaut/jugg_ability_bladefury_14.vsnd_c new file mode 100755 index 0000000..55b58ab Binary files /dev/null and b/sounds/vo/juggernaut/jugg_ability_bladefury_14.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_ability_bladefury_15.vsnd_c b/sounds/vo/juggernaut/jugg_ability_bladefury_15.vsnd_c new file mode 100755 index 0000000..6e729e0 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_ability_bladefury_15.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_ability_bladefury_16.vsnd_c b/sounds/vo/juggernaut/jugg_ability_bladefury_16.vsnd_c new file mode 100755 index 0000000..36342d8 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_ability_bladefury_16.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_ability_bladefury_17.vsnd_c b/sounds/vo/juggernaut/jugg_ability_bladefury_17.vsnd_c new file mode 100755 index 0000000..69d362b Binary files /dev/null and b/sounds/vo/juggernaut/jugg_ability_bladefury_17.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_ability_bladefury_18.vsnd_c b/sounds/vo/juggernaut/jugg_ability_bladefury_18.vsnd_c new file mode 100755 index 0000000..65b7d66 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_ability_bladefury_18.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_battlebegins_01.vsnd_c b/sounds/vo/juggernaut/jugg_battlebegins_01.vsnd_c new file mode 100755 index 0000000..8d5fd37 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_battlebegins_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_blink_01.vsnd_c b/sounds/vo/juggernaut/jugg_blink_01.vsnd_c new file mode 100755 index 0000000..68b9564 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_blink_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_blink_02.vsnd_c b/sounds/vo/juggernaut/jugg_blink_02.vsnd_c new file mode 100755 index 0000000..1d75ba0 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_blink_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_drop_common.vsnd_c b/sounds/vo/juggernaut/jugg_drop_common.vsnd_c new file mode 100755 index 0000000..f07d3ce Binary files /dev/null and b/sounds/vo/juggernaut/jugg_drop_common.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_drop_medium.vsnd_c b/sounds/vo/juggernaut/jugg_drop_medium.vsnd_c new file mode 100755 index 0000000..c792b45 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_drop_medium.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_drop_rare.vsnd_c b/sounds/vo/juggernaut/jugg_drop_rare.vsnd_c new file mode 100755 index 0000000..a8913dc Binary files /dev/null and b/sounds/vo/juggernaut/jugg_drop_rare.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_equipping_01.vsnd_c b/sounds/vo/juggernaut/jugg_equipping_01.vsnd_c new file mode 100755 index 0000000..51f5d1c Binary files /dev/null and b/sounds/vo/juggernaut/jugg_equipping_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_equipping_02.vsnd_c b/sounds/vo/juggernaut/jugg_equipping_02.vsnd_c new file mode 100755 index 0000000..fafb016 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_equipping_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_equipping_03.vsnd_c b/sounds/vo/juggernaut/jugg_equipping_03.vsnd_c new file mode 100755 index 0000000..fe7c26f Binary files /dev/null and b/sounds/vo/juggernaut/jugg_equipping_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_equipping_04.vsnd_c b/sounds/vo/juggernaut/jugg_equipping_04.vsnd_c new file mode 100755 index 0000000..e9af08f Binary files /dev/null and b/sounds/vo/juggernaut/jugg_equipping_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_equipping_05.vsnd_c b/sounds/vo/juggernaut/jugg_equipping_05.vsnd_c new file mode 100755 index 0000000..8c10fda Binary files /dev/null and b/sounds/vo/juggernaut/jugg_equipping_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_equipping_06.vsnd_c b/sounds/vo/juggernaut/jugg_equipping_06.vsnd_c new file mode 100755 index 0000000..ac6e115 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_equipping_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_fastres_01.vsnd_c b/sounds/vo/juggernaut/jugg_fastres_01.vsnd_c new file mode 100755 index 0000000..2b679f5 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_fastres_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_firstblood_01.vsnd_c b/sounds/vo/juggernaut/jugg_firstblood_01.vsnd_c new file mode 100755 index 0000000..8dcb9da Binary files /dev/null and b/sounds/vo/juggernaut/jugg_firstblood_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_item_01.vsnd_c b/sounds/vo/juggernaut/jugg_item_01.vsnd_c new file mode 100755 index 0000000..0e1b6cf Binary files /dev/null and b/sounds/vo/juggernaut/jugg_item_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_item_02.vsnd_c b/sounds/vo/juggernaut/jugg_item_02.vsnd_c new file mode 100755 index 0000000..55ad2f8 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_item_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_item_03.vsnd_c b/sounds/vo/juggernaut/jugg_item_03.vsnd_c new file mode 100755 index 0000000..189bc0c Binary files /dev/null and b/sounds/vo/juggernaut/jugg_item_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_item_04.vsnd_c b/sounds/vo/juggernaut/jugg_item_04.vsnd_c new file mode 100755 index 0000000..7c7b2e7 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_item_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_missing_lane_01.vsnd_c b/sounds/vo/juggernaut/jugg_missing_lane_01.vsnd_c new file mode 100755 index 0000000..f7d8fe9 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_missing_lane_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_missing_lane_02.vsnd_c b/sounds/vo/juggernaut/jugg_missing_lane_02.vsnd_c new file mode 100755 index 0000000..0e54b59 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_missing_lane_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_missing_lane_03.vsnd_c b/sounds/vo/juggernaut/jugg_missing_lane_03.vsnd_c new file mode 100755 index 0000000..0f3a142 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_missing_lane_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_01.vsnd_c b/sounds/vo/juggernaut/jugg_rival_01.vsnd_c new file mode 100755 index 0000000..5e77701 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_02.vsnd_c b/sounds/vo/juggernaut/jugg_rival_02.vsnd_c new file mode 100755 index 0000000..f00b29e Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_03.vsnd_c b/sounds/vo/juggernaut/jugg_rival_03.vsnd_c new file mode 100755 index 0000000..275a4dc Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_04.vsnd_c b/sounds/vo/juggernaut/jugg_rival_04.vsnd_c new file mode 100755 index 0000000..c83e94a Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_05.vsnd_c b/sounds/vo/juggernaut/jugg_rival_05.vsnd_c new file mode 100755 index 0000000..a731de6 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_06.vsnd_c b/sounds/vo/juggernaut/jugg_rival_06.vsnd_c new file mode 100755 index 0000000..4817ea5 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_07.vsnd_c b/sounds/vo/juggernaut/jugg_rival_07.vsnd_c new file mode 100755 index 0000000..caecfa1 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_08.vsnd_c b/sounds/vo/juggernaut/jugg_rival_08.vsnd_c new file mode 100755 index 0000000..7db8b0f Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_09.vsnd_c b/sounds/vo/juggernaut/jugg_rival_09.vsnd_c new file mode 100755 index 0000000..409ee78 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_09.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_10.vsnd_c b/sounds/vo/juggernaut/jugg_rival_10.vsnd_c new file mode 100755 index 0000000..9e4418b Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_10.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_11.vsnd_c b/sounds/vo/juggernaut/jugg_rival_11.vsnd_c new file mode 100755 index 0000000..0012271 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_11.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_12.vsnd_c b/sounds/vo/juggernaut/jugg_rival_12.vsnd_c new file mode 100755 index 0000000..d2acf4b Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_12.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_13.vsnd_c b/sounds/vo/juggernaut/jugg_rival_13.vsnd_c new file mode 100755 index 0000000..3d8ae4d Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_13.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_14.vsnd_c b/sounds/vo/juggernaut/jugg_rival_14.vsnd_c new file mode 100755 index 0000000..ea9355b Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_14.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_rival_15.vsnd_c b/sounds/vo/juggernaut/jugg_rival_15.vsnd_c new file mode 100755 index 0000000..aaf6ae0 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_rival_15.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_scepter_01.vsnd_c b/sounds/vo/juggernaut/jugg_scepter_01.vsnd_c new file mode 100755 index 0000000..3f59b6e Binary files /dev/null and b/sounds/vo/juggernaut/jugg_scepter_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_scepter_02.vsnd_c b/sounds/vo/juggernaut/jugg_scepter_02.vsnd_c new file mode 100755 index 0000000..d875576 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_scepter_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_scepter_03.vsnd_c b/sounds/vo/juggernaut/jugg_scepter_03.vsnd_c new file mode 100755 index 0000000..f27be35 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_scepter_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_set_complete_01.vsnd_c b/sounds/vo/juggernaut/jugg_set_complete_01.vsnd_c new file mode 100755 index 0000000..b7fdd45 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_set_complete_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_set_complete_02.vsnd_c b/sounds/vo/juggernaut/jugg_set_complete_02.vsnd_c new file mode 100755 index 0000000..d970188 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_set_complete_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_set_complete_03.vsnd_c b/sounds/vo/juggernaut/jugg_set_complete_03.vsnd_c new file mode 100755 index 0000000..48880ff Binary files /dev/null and b/sounds/vo/juggernaut/jugg_set_complete_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_set_complete_04.vsnd_c b/sounds/vo/juggernaut/jugg_set_complete_04.vsnd_c new file mode 100755 index 0000000..f8f9f01 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_set_complete_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_set_complete_05.vsnd_c b/sounds/vo/juggernaut/jugg_set_complete_05.vsnd_c new file mode 100755 index 0000000..016fb48 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_set_complete_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_set_complete_06.vsnd_c b/sounds/vo/juggernaut/jugg_set_complete_06.vsnd_c new file mode 100755 index 0000000..88a4beb Binary files /dev/null and b/sounds/vo/juggernaut/jugg_set_complete_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_taunt_01.vsnd_c b/sounds/vo/juggernaut/jugg_taunt_01.vsnd_c new file mode 100755 index 0000000..dbe04e1 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_taunt_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_taunt_02.vsnd_c b/sounds/vo/juggernaut/jugg_taunt_02.vsnd_c new file mode 100755 index 0000000..3fe22e1 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_taunt_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_taunt_03.vsnd_c b/sounds/vo/juggernaut/jugg_taunt_03.vsnd_c new file mode 100755 index 0000000..716194a Binary files /dev/null and b/sounds/vo/juggernaut/jugg_taunt_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_taunt_04.vsnd_c b/sounds/vo/juggernaut/jugg_taunt_04.vsnd_c new file mode 100755 index 0000000..f6c4407 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_taunt_04.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_taunt_05.vsnd_c b/sounds/vo/juggernaut/jugg_taunt_05.vsnd_c new file mode 100755 index 0000000..7456153 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_taunt_05.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_taunt_06.vsnd_c b/sounds/vo/juggernaut/jugg_taunt_06.vsnd_c new file mode 100755 index 0000000..f49a43a Binary files /dev/null and b/sounds/vo/juggernaut/jugg_taunt_06.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_taunt_07.vsnd_c b/sounds/vo/juggernaut/jugg_taunt_07.vsnd_c new file mode 100755 index 0000000..e61cad0 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_taunt_07.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_taunt_08.vsnd_c b/sounds/vo/juggernaut/jugg_taunt_08.vsnd_c new file mode 100755 index 0000000..313ccaa Binary files /dev/null and b/sounds/vo/juggernaut/jugg_taunt_08.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_thanks_01.vsnd_c b/sounds/vo/juggernaut/jugg_thanks_01.vsnd_c new file mode 100755 index 0000000..b52e61f Binary files /dev/null and b/sounds/vo/juggernaut/jugg_thanks_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_thanks_02.vsnd_c b/sounds/vo/juggernaut/jugg_thanks_02.vsnd_c new file mode 100755 index 0000000..6d061c3 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_thanks_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_underattack_01.vsnd_c b/sounds/vo/juggernaut/jugg_underattack_01.vsnd_c new file mode 100755 index 0000000..0953a37 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_underattack_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_view_defeat_01.vsnd_c b/sounds/vo/juggernaut/jugg_view_defeat_01.vsnd_c new file mode 100755 index 0000000..8660706 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_view_defeat_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_view_defeat_02.vsnd_c b/sounds/vo/juggernaut/jugg_view_defeat_02.vsnd_c new file mode 100755 index 0000000..3d86023 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_view_defeat_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_view_defeat_03.vsnd_c b/sounds/vo/juggernaut/jugg_view_defeat_03.vsnd_c new file mode 100755 index 0000000..a2d5e91 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_view_defeat_03.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_view_victory_01.vsnd_c b/sounds/vo/juggernaut/jugg_view_victory_01.vsnd_c new file mode 100755 index 0000000..9a20ab5 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_view_victory_01.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_view_victory_02.vsnd_c b/sounds/vo/juggernaut/jugg_view_victory_02.vsnd_c new file mode 100755 index 0000000..8bd41e6 Binary files /dev/null and b/sounds/vo/juggernaut/jugg_view_victory_02.vsnd_c differ diff --git a/sounds/vo/juggernaut/jugg_view_victory_03.vsnd_c b/sounds/vo/juggernaut/jugg_view_victory_03.vsnd_c new file mode 100755 index 0000000..e0e361c Binary files /dev/null and b/sounds/vo/juggernaut/jugg_view_victory_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_ability_lightstrike_01.vsnd_c b/sounds/vo/lina/lina_ability_lightstrike_01.vsnd_c new file mode 100755 index 0000000..0b204b3 Binary files /dev/null and b/sounds/vo/lina/lina_ability_lightstrike_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_ability_lightstrike_02.vsnd_c b/sounds/vo/lina/lina_ability_lightstrike_02.vsnd_c new file mode 100755 index 0000000..b87514e Binary files /dev/null and b/sounds/vo/lina/lina_ability_lightstrike_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_ability_lightstrike_03.vsnd_c b/sounds/vo/lina/lina_ability_lightstrike_03.vsnd_c new file mode 100755 index 0000000..c81b789 Binary files /dev/null and b/sounds/vo/lina/lina_ability_lightstrike_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_ability_lightstrike_04.vsnd_c b/sounds/vo/lina/lina_ability_lightstrike_04.vsnd_c new file mode 100755 index 0000000..e997d7c Binary files /dev/null and b/sounds/vo/lina/lina_ability_lightstrike_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_ability_lightstrike_05.vsnd_c b/sounds/vo/lina/lina_ability_lightstrike_05.vsnd_c new file mode 100755 index 0000000..cf232c6 Binary files /dev/null and b/sounds/vo/lina/lina_ability_lightstrike_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_ability_lightstrike_06.vsnd_c b/sounds/vo/lina/lina_ability_lightstrike_06.vsnd_c new file mode 100755 index 0000000..344ecde Binary files /dev/null and b/sounds/vo/lina/lina_ability_lightstrike_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_ally_01.vsnd_c b/sounds/vo/lina/lina_ally_01.vsnd_c new file mode 100755 index 0000000..8f848e4 Binary files /dev/null and b/sounds/vo/lina/lina_ally_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_ally_02.vsnd_c b/sounds/vo/lina/lina_ally_02.vsnd_c new file mode 100755 index 0000000..3fc8a52 Binary files /dev/null and b/sounds/vo/lina/lina_ally_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_ally_03.vsnd_c b/sounds/vo/lina/lina_ally_03.vsnd_c new file mode 100755 index 0000000..daa3290 Binary files /dev/null and b/sounds/vo/lina/lina_ally_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_ally_04.vsnd_c b/sounds/vo/lina/lina_ally_04.vsnd_c new file mode 100755 index 0000000..fe21594 Binary files /dev/null and b/sounds/vo/lina/lina_ally_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_ally_05.vsnd_c b/sounds/vo/lina/lina_ally_05.vsnd_c new file mode 100755 index 0000000..347f200 Binary files /dev/null and b/sounds/vo/lina/lina_ally_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_ally_06.vsnd_c b/sounds/vo/lina/lina_ally_06.vsnd_c new file mode 100755 index 0000000..8d5dfe8 Binary files /dev/null and b/sounds/vo/lina/lina_ally_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_ally_07.vsnd_c b/sounds/vo/lina/lina_ally_07.vsnd_c new file mode 100755 index 0000000..00d3719 Binary files /dev/null and b/sounds/vo/lina/lina_ally_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_ally_08.vsnd_c b/sounds/vo/lina/lina_ally_08.vsnd_c new file mode 100755 index 0000000..dc1949d Binary files /dev/null and b/sounds/vo/lina/lina_ally_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_anger_01.vsnd_c b/sounds/vo/lina/lina_anger_01.vsnd_c new file mode 100755 index 0000000..62cc10d Binary files /dev/null and b/sounds/vo/lina/lina_anger_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_anger_02.vsnd_c b/sounds/vo/lina/lina_anger_02.vsnd_c new file mode 100755 index 0000000..b9e0a8a Binary files /dev/null and b/sounds/vo/lina/lina_anger_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_anger_03.vsnd_c b/sounds/vo/lina/lina_anger_03.vsnd_c new file mode 100755 index 0000000..4cec752 Binary files /dev/null and b/sounds/vo/lina/lina_anger_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_anger_04.vsnd_c b/sounds/vo/lina/lina_anger_04.vsnd_c new file mode 100755 index 0000000..55eb907 Binary files /dev/null and b/sounds/vo/lina/lina_anger_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_anger_05.vsnd_c b/sounds/vo/lina/lina_anger_05.vsnd_c new file mode 100755 index 0000000..c794c1a Binary files /dev/null and b/sounds/vo/lina/lina_anger_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_anger_06.vsnd_c b/sounds/vo/lina/lina_anger_06.vsnd_c new file mode 100755 index 0000000..bd51473 Binary files /dev/null and b/sounds/vo/lina/lina_anger_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_attack_01.vsnd_c b/sounds/vo/lina/lina_attack_01.vsnd_c new file mode 100755 index 0000000..0424730 Binary files /dev/null and b/sounds/vo/lina/lina_attack_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_attack_02.vsnd_c b/sounds/vo/lina/lina_attack_02.vsnd_c new file mode 100755 index 0000000..9ff81cb Binary files /dev/null and b/sounds/vo/lina/lina_attack_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_attack_03.vsnd_c b/sounds/vo/lina/lina_attack_03.vsnd_c new file mode 100755 index 0000000..8638a6d Binary files /dev/null and b/sounds/vo/lina/lina_attack_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_attack_04.vsnd_c b/sounds/vo/lina/lina_attack_04.vsnd_c new file mode 100755 index 0000000..49bbf06 Binary files /dev/null and b/sounds/vo/lina/lina_attack_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_attack_05.vsnd_c b/sounds/vo/lina/lina_attack_05.vsnd_c new file mode 100755 index 0000000..66ffdb9 Binary files /dev/null and b/sounds/vo/lina/lina_attack_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_attack_06.vsnd_c b/sounds/vo/lina/lina_attack_06.vsnd_c new file mode 100755 index 0000000..623eca4 Binary files /dev/null and b/sounds/vo/lina/lina_attack_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_attack_07.vsnd_c b/sounds/vo/lina/lina_attack_07.vsnd_c new file mode 100755 index 0000000..7d22820 Binary files /dev/null and b/sounds/vo/lina/lina_attack_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_attack_08.vsnd_c b/sounds/vo/lina/lina_attack_08.vsnd_c new file mode 100755 index 0000000..a80f3b2 Binary files /dev/null and b/sounds/vo/lina/lina_attack_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_attack_09.vsnd_c b/sounds/vo/lina/lina_attack_09.vsnd_c new file mode 100755 index 0000000..9b896ea Binary files /dev/null and b/sounds/vo/lina/lina_attack_09.vsnd_c differ diff --git a/sounds/vo/lina/lina_attack_10.vsnd_c b/sounds/vo/lina/lina_attack_10.vsnd_c new file mode 100755 index 0000000..e31ac25 Binary files /dev/null and b/sounds/vo/lina/lina_attack_10.vsnd_c differ diff --git a/sounds/vo/lina/lina_background.vsnd_c b/sounds/vo/lina/lina_background.vsnd_c new file mode 100755 index 0000000..51ac1af Binary files /dev/null and b/sounds/vo/lina/lina_background.vsnd_c differ diff --git a/sounds/vo/lina/lina_battlebegins_01.vsnd_c b/sounds/vo/lina/lina_battlebegins_01.vsnd_c new file mode 100755 index 0000000..ec417ad Binary files /dev/null and b/sounds/vo/lina/lina_battlebegins_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_blink_01.vsnd_c b/sounds/vo/lina/lina_blink_01.vsnd_c new file mode 100755 index 0000000..778cd9b Binary files /dev/null and b/sounds/vo/lina/lina_blink_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_blink_02.vsnd_c b/sounds/vo/lina/lina_blink_02.vsnd_c new file mode 100755 index 0000000..8568857 Binary files /dev/null and b/sounds/vo/lina/lina_blink_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_bottle_01.vsnd_c b/sounds/vo/lina/lina_bottle_01.vsnd_c new file mode 100755 index 0000000..0a9b3fb Binary files /dev/null and b/sounds/vo/lina/lina_bottle_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_bottle_02.vsnd_c b/sounds/vo/lina/lina_bottle_02.vsnd_c new file mode 100755 index 0000000..65d378e Binary files /dev/null and b/sounds/vo/lina/lina_bottle_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_bottle_03.vsnd_c b/sounds/vo/lina/lina_bottle_03.vsnd_c new file mode 100755 index 0000000..24a52cc Binary files /dev/null and b/sounds/vo/lina/lina_bottle_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_cast_01.vsnd_c b/sounds/vo/lina/lina_cast_01.vsnd_c new file mode 100755 index 0000000..9fcafaa Binary files /dev/null and b/sounds/vo/lina/lina_cast_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_cast_02.vsnd_c b/sounds/vo/lina/lina_cast_02.vsnd_c new file mode 100755 index 0000000..96f1920 Binary files /dev/null and b/sounds/vo/lina/lina_cast_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_cast_03.vsnd_c b/sounds/vo/lina/lina_cast_03.vsnd_c new file mode 100755 index 0000000..0836c90 Binary files /dev/null and b/sounds/vo/lina/lina_cast_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_01.vsnd_c b/sounds/vo/lina/lina_cm_01.vsnd_c new file mode 100755 index 0000000..7cf8024 Binary files /dev/null and b/sounds/vo/lina/lina_cm_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_02.vsnd_c b/sounds/vo/lina/lina_cm_02.vsnd_c new file mode 100755 index 0000000..f4609a5 Binary files /dev/null and b/sounds/vo/lina/lina_cm_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_03.vsnd_c b/sounds/vo/lina/lina_cm_03.vsnd_c new file mode 100755 index 0000000..acb4be5 Binary files /dev/null and b/sounds/vo/lina/lina_cm_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_04.vsnd_c b/sounds/vo/lina/lina_cm_04.vsnd_c new file mode 100755 index 0000000..2acf7e0 Binary files /dev/null and b/sounds/vo/lina/lina_cm_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_05.vsnd_c b/sounds/vo/lina/lina_cm_05.vsnd_c new file mode 100755 index 0000000..fca07b3 Binary files /dev/null and b/sounds/vo/lina/lina_cm_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_06.vsnd_c b/sounds/vo/lina/lina_cm_06.vsnd_c new file mode 100755 index 0000000..bccd97e Binary files /dev/null and b/sounds/vo/lina/lina_cm_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_07.vsnd_c b/sounds/vo/lina/lina_cm_07.vsnd_c new file mode 100755 index 0000000..2085266 Binary files /dev/null and b/sounds/vo/lina/lina_cm_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_08.vsnd_c b/sounds/vo/lina/lina_cm_08.vsnd_c new file mode 100755 index 0000000..8f0a457 Binary files /dev/null and b/sounds/vo/lina/lina_cm_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_09.vsnd_c b/sounds/vo/lina/lina_cm_09.vsnd_c new file mode 100755 index 0000000..05e3253 Binary files /dev/null and b/sounds/vo/lina/lina_cm_09.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_10.vsnd_c b/sounds/vo/lina/lina_cm_10.vsnd_c new file mode 100755 index 0000000..03568cc Binary files /dev/null and b/sounds/vo/lina/lina_cm_10.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_11.vsnd_c b/sounds/vo/lina/lina_cm_11.vsnd_c new file mode 100755 index 0000000..667428b Binary files /dev/null and b/sounds/vo/lina/lina_cm_11.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_12.vsnd_c b/sounds/vo/lina/lina_cm_12.vsnd_c new file mode 100755 index 0000000..f735b72 Binary files /dev/null and b/sounds/vo/lina/lina_cm_12.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_13.vsnd_c b/sounds/vo/lina/lina_cm_13.vsnd_c new file mode 100755 index 0000000..68df41a Binary files /dev/null and b/sounds/vo/lina/lina_cm_13.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_14.vsnd_c b/sounds/vo/lina/lina_cm_14.vsnd_c new file mode 100755 index 0000000..9946cb1 Binary files /dev/null and b/sounds/vo/lina/lina_cm_14.vsnd_c differ diff --git a/sounds/vo/lina/lina_cm_15.vsnd_c b/sounds/vo/lina/lina_cm_15.vsnd_c new file mode 100755 index 0000000..9f7f7be Binary files /dev/null and b/sounds/vo/lina/lina_cm_15.vsnd_c differ diff --git a/sounds/vo/lina/lina_crumwiz_01.vsnd_c b/sounds/vo/lina/lina_crumwiz_01.vsnd_c new file mode 100755 index 0000000..2f904c1 Binary files /dev/null and b/sounds/vo/lina/lina_crumwiz_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_death_01.vsnd_c b/sounds/vo/lina/lina_death_01.vsnd_c new file mode 100755 index 0000000..1f556e8 Binary files /dev/null and b/sounds/vo/lina/lina_death_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_death_02.vsnd_c b/sounds/vo/lina/lina_death_02.vsnd_c new file mode 100755 index 0000000..a1b4e6d Binary files /dev/null and b/sounds/vo/lina/lina_death_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_death_03.vsnd_c b/sounds/vo/lina/lina_death_03.vsnd_c new file mode 100755 index 0000000..899054f Binary files /dev/null and b/sounds/vo/lina/lina_death_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_death_04.vsnd_c b/sounds/vo/lina/lina_death_04.vsnd_c new file mode 100755 index 0000000..ebffa9f Binary files /dev/null and b/sounds/vo/lina/lina_death_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_death_05.vsnd_c b/sounds/vo/lina/lina_death_05.vsnd_c new file mode 100755 index 0000000..3107c10 Binary files /dev/null and b/sounds/vo/lina/lina_death_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_death_06.vsnd_c b/sounds/vo/lina/lina_death_06.vsnd_c new file mode 100755 index 0000000..cfc6639 Binary files /dev/null and b/sounds/vo/lina/lina_death_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_death_07.vsnd_c b/sounds/vo/lina/lina_death_07.vsnd_c new file mode 100755 index 0000000..6b2fb1a Binary files /dev/null and b/sounds/vo/lina/lina_death_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_death_08.vsnd_c b/sounds/vo/lina/lina_death_08.vsnd_c new file mode 100755 index 0000000..3b8bee0 Binary files /dev/null and b/sounds/vo/lina/lina_death_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_death_09.vsnd_c b/sounds/vo/lina/lina_death_09.vsnd_c new file mode 100755 index 0000000..a167ef0 Binary files /dev/null and b/sounds/vo/lina/lina_death_09.vsnd_c differ diff --git a/sounds/vo/lina/lina_death_10.vsnd_c b/sounds/vo/lina/lina_death_10.vsnd_c new file mode 100755 index 0000000..d7603ae Binary files /dev/null and b/sounds/vo/lina/lina_death_10.vsnd_c differ diff --git a/sounds/vo/lina/lina_death_11.vsnd_c b/sounds/vo/lina/lina_death_11.vsnd_c new file mode 100755 index 0000000..d53ca11 Binary files /dev/null and b/sounds/vo/lina/lina_death_11.vsnd_c differ diff --git a/sounds/vo/lina/lina_death_12.vsnd_c b/sounds/vo/lina/lina_death_12.vsnd_c new file mode 100755 index 0000000..03c05d5 Binary files /dev/null and b/sounds/vo/lina/lina_death_12.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_01.vsnd_c b/sounds/vo/lina/lina_deny_01.vsnd_c new file mode 100755 index 0000000..de7b045 Binary files /dev/null and b/sounds/vo/lina/lina_deny_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_02.vsnd_c b/sounds/vo/lina/lina_deny_02.vsnd_c new file mode 100755 index 0000000..7ddb48c Binary files /dev/null and b/sounds/vo/lina/lina_deny_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_03.vsnd_c b/sounds/vo/lina/lina_deny_03.vsnd_c new file mode 100755 index 0000000..fc79107 Binary files /dev/null and b/sounds/vo/lina/lina_deny_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_04.vsnd_c b/sounds/vo/lina/lina_deny_04.vsnd_c new file mode 100755 index 0000000..4fb56c8 Binary files /dev/null and b/sounds/vo/lina/lina_deny_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_05.vsnd_c b/sounds/vo/lina/lina_deny_05.vsnd_c new file mode 100755 index 0000000..c230081 Binary files /dev/null and b/sounds/vo/lina/lina_deny_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_06.vsnd_c b/sounds/vo/lina/lina_deny_06.vsnd_c new file mode 100755 index 0000000..607d3b1 Binary files /dev/null and b/sounds/vo/lina/lina_deny_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_07.vsnd_c b/sounds/vo/lina/lina_deny_07.vsnd_c new file mode 100755 index 0000000..584f647 Binary files /dev/null and b/sounds/vo/lina/lina_deny_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_08.vsnd_c b/sounds/vo/lina/lina_deny_08.vsnd_c new file mode 100755 index 0000000..6273961 Binary files /dev/null and b/sounds/vo/lina/lina_deny_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_09.vsnd_c b/sounds/vo/lina/lina_deny_09.vsnd_c new file mode 100755 index 0000000..f1e7775 Binary files /dev/null and b/sounds/vo/lina/lina_deny_09.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_10.vsnd_c b/sounds/vo/lina/lina_deny_10.vsnd_c new file mode 100755 index 0000000..cc30c5b Binary files /dev/null and b/sounds/vo/lina/lina_deny_10.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_11.vsnd_c b/sounds/vo/lina/lina_deny_11.vsnd_c new file mode 100755 index 0000000..6e898b8 Binary files /dev/null and b/sounds/vo/lina/lina_deny_11.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_12.vsnd_c b/sounds/vo/lina/lina_deny_12.vsnd_c new file mode 100755 index 0000000..28f0ffc Binary files /dev/null and b/sounds/vo/lina/lina_deny_12.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_13.vsnd_c b/sounds/vo/lina/lina_deny_13.vsnd_c new file mode 100755 index 0000000..6df3ef9 Binary files /dev/null and b/sounds/vo/lina/lina_deny_13.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_14.vsnd_c b/sounds/vo/lina/lina_deny_14.vsnd_c new file mode 100755 index 0000000..f727731 Binary files /dev/null and b/sounds/vo/lina/lina_deny_14.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_15.vsnd_c b/sounds/vo/lina/lina_deny_15.vsnd_c new file mode 100755 index 0000000..4cc10a6 Binary files /dev/null and b/sounds/vo/lina/lina_deny_15.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_16.vsnd_c b/sounds/vo/lina/lina_deny_16.vsnd_c new file mode 100755 index 0000000..0860392 Binary files /dev/null and b/sounds/vo/lina/lina_deny_16.vsnd_c differ diff --git a/sounds/vo/lina/lina_deny_17.vsnd_c b/sounds/vo/lina/lina_deny_17.vsnd_c new file mode 100755 index 0000000..9080117 Binary files /dev/null and b/sounds/vo/lina/lina_deny_17.vsnd_c differ diff --git a/sounds/vo/lina/lina_doubdam_01.vsnd_c b/sounds/vo/lina/lina_doubdam_01.vsnd_c new file mode 100755 index 0000000..eacbf37 Binary files /dev/null and b/sounds/vo/lina/lina_doubdam_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_doubdam_02.vsnd_c b/sounds/vo/lina/lina_doubdam_02.vsnd_c new file mode 100755 index 0000000..d462b8b Binary files /dev/null and b/sounds/vo/lina/lina_doubdam_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_drop_common_01.vsnd_c b/sounds/vo/lina/lina_drop_common_01.vsnd_c new file mode 100755 index 0000000..d92b16c Binary files /dev/null and b/sounds/vo/lina/lina_drop_common_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_drop_medium_01.vsnd_c b/sounds/vo/lina/lina_drop_medium_01.vsnd_c new file mode 100755 index 0000000..abff2ce Binary files /dev/null and b/sounds/vo/lina/lina_drop_medium_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_drop_rare_01.vsnd_c b/sounds/vo/lina/lina_drop_rare_01.vsnd_c new file mode 100755 index 0000000..135000c Binary files /dev/null and b/sounds/vo/lina/lina_drop_rare_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_fastres_01.vsnd_c b/sounds/vo/lina/lina_fastres_01.vsnd_c new file mode 100755 index 0000000..d7a3491 Binary files /dev/null and b/sounds/vo/lina/lina_fastres_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_firstblood_01.vsnd_c b/sounds/vo/lina/lina_firstblood_01.vsnd_c new file mode 100755 index 0000000..2e9bebb Binary files /dev/null and b/sounds/vo/lina/lina_firstblood_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_happy_01.vsnd_c b/sounds/vo/lina/lina_happy_01.vsnd_c new file mode 100755 index 0000000..8d1d543 Binary files /dev/null and b/sounds/vo/lina/lina_happy_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_happy_02.vsnd_c b/sounds/vo/lina/lina_happy_02.vsnd_c new file mode 100755 index 0000000..b7bc9c9 Binary files /dev/null and b/sounds/vo/lina/lina_happy_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_happy_03.vsnd_c b/sounds/vo/lina/lina_happy_03.vsnd_c new file mode 100755 index 0000000..d7755ae Binary files /dev/null and b/sounds/vo/lina/lina_happy_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_haste_01.vsnd_c b/sounds/vo/lina/lina_haste_01.vsnd_c new file mode 100755 index 0000000..bad82e9 Binary files /dev/null and b/sounds/vo/lina/lina_haste_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_haste_02.vsnd_c b/sounds/vo/lina/lina_haste_02.vsnd_c new file mode 100755 index 0000000..edc83ea Binary files /dev/null and b/sounds/vo/lina/lina_haste_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_illus_01.vsnd_c b/sounds/vo/lina/lina_illus_01.vsnd_c new file mode 100755 index 0000000..5c50113 Binary files /dev/null and b/sounds/vo/lina/lina_illus_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_illus_02.vsnd_c b/sounds/vo/lina/lina_illus_02.vsnd_c new file mode 100755 index 0000000..9a0dc46 Binary files /dev/null and b/sounds/vo/lina/lina_illus_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_illus_03.vsnd_c b/sounds/vo/lina/lina_illus_03.vsnd_c new file mode 100755 index 0000000..cb31cd6 Binary files /dev/null and b/sounds/vo/lina/lina_illus_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_immort_01.vsnd_c b/sounds/vo/lina/lina_immort_01.vsnd_c new file mode 100755 index 0000000..95315fc Binary files /dev/null and b/sounds/vo/lina/lina_immort_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_immort_02.vsnd_c b/sounds/vo/lina/lina_immort_02.vsnd_c new file mode 100755 index 0000000..5dc9bd2 Binary files /dev/null and b/sounds/vo/lina/lina_immort_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_inthebag_01.vsnd_c b/sounds/vo/lina/lina_inthebag_01.vsnd_c new file mode 100755 index 0000000..48646a9 Binary files /dev/null and b/sounds/vo/lina/lina_inthebag_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_invis_01.vsnd_c b/sounds/vo/lina/lina_invis_01.vsnd_c new file mode 100755 index 0000000..6fd81d3 Binary files /dev/null and b/sounds/vo/lina/lina_invis_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_invis_02.vsnd_c b/sounds/vo/lina/lina_invis_02.vsnd_c new file mode 100755 index 0000000..c77cc36 Binary files /dev/null and b/sounds/vo/lina/lina_invis_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_item_01.vsnd_c b/sounds/vo/lina/lina_item_01.vsnd_c new file mode 100755 index 0000000..88d1c85 Binary files /dev/null and b/sounds/vo/lina/lina_item_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_item_02.vsnd_c b/sounds/vo/lina/lina_item_02.vsnd_c new file mode 100755 index 0000000..62f8e01 Binary files /dev/null and b/sounds/vo/lina/lina_item_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_item_03.vsnd_c b/sounds/vo/lina/lina_item_03.vsnd_c new file mode 100755 index 0000000..07ed910 Binary files /dev/null and b/sounds/vo/lina/lina_item_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_item_04.vsnd_c b/sounds/vo/lina/lina_item_04.vsnd_c new file mode 100755 index 0000000..b2e56b3 Binary files /dev/null and b/sounds/vo/lina/lina_item_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_item_05.vsnd_c b/sounds/vo/lina/lina_item_05.vsnd_c new file mode 100755 index 0000000..c4210ba Binary files /dev/null and b/sounds/vo/lina/lina_item_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_item_06.vsnd_c b/sounds/vo/lina/lina_item_06.vsnd_c new file mode 100755 index 0000000..823d510 Binary files /dev/null and b/sounds/vo/lina/lina_item_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_item_07.vsnd_c b/sounds/vo/lina/lina_item_07.vsnd_c new file mode 100755 index 0000000..e11e337 Binary files /dev/null and b/sounds/vo/lina/lina_item_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_01.vsnd_c b/sounds/vo/lina/lina_kill_01.vsnd_c new file mode 100755 index 0000000..c5de740 Binary files /dev/null and b/sounds/vo/lina/lina_kill_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_02.vsnd_c b/sounds/vo/lina/lina_kill_02.vsnd_c new file mode 100755 index 0000000..100ce0d Binary files /dev/null and b/sounds/vo/lina/lina_kill_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_03.vsnd_c b/sounds/vo/lina/lina_kill_03.vsnd_c new file mode 100755 index 0000000..1cca5ab Binary files /dev/null and b/sounds/vo/lina/lina_kill_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_04.vsnd_c b/sounds/vo/lina/lina_kill_04.vsnd_c new file mode 100755 index 0000000..ec5db7d Binary files /dev/null and b/sounds/vo/lina/lina_kill_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_05.vsnd_c b/sounds/vo/lina/lina_kill_05.vsnd_c new file mode 100755 index 0000000..e72c63e Binary files /dev/null and b/sounds/vo/lina/lina_kill_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_06.vsnd_c b/sounds/vo/lina/lina_kill_06.vsnd_c new file mode 100755 index 0000000..89bc822 Binary files /dev/null and b/sounds/vo/lina/lina_kill_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_07.vsnd_c b/sounds/vo/lina/lina_kill_07.vsnd_c new file mode 100755 index 0000000..4ebbf9b Binary files /dev/null and b/sounds/vo/lina/lina_kill_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_08.vsnd_c b/sounds/vo/lina/lina_kill_08.vsnd_c new file mode 100755 index 0000000..672a4ec Binary files /dev/null and b/sounds/vo/lina/lina_kill_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_09.vsnd_c b/sounds/vo/lina/lina_kill_09.vsnd_c new file mode 100755 index 0000000..542f51a Binary files /dev/null and b/sounds/vo/lina/lina_kill_09.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_10.vsnd_c b/sounds/vo/lina/lina_kill_10.vsnd_c new file mode 100755 index 0000000..83e0cef Binary files /dev/null and b/sounds/vo/lina/lina_kill_10.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_11.vsnd_c b/sounds/vo/lina/lina_kill_11.vsnd_c new file mode 100755 index 0000000..7f9fca5 Binary files /dev/null and b/sounds/vo/lina/lina_kill_11.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_12.vsnd_c b/sounds/vo/lina/lina_kill_12.vsnd_c new file mode 100755 index 0000000..761f623 Binary files /dev/null and b/sounds/vo/lina/lina_kill_12.vsnd_c differ diff --git a/sounds/vo/lina/lina_kill_13.vsnd_c b/sounds/vo/lina/lina_kill_13.vsnd_c new file mode 100755 index 0000000..8718c86 Binary files /dev/null and b/sounds/vo/lina/lina_kill_13.vsnd_c differ diff --git a/sounds/vo/lina/lina_killspecial_01.vsnd_c b/sounds/vo/lina/lina_killspecial_01.vsnd_c new file mode 100755 index 0000000..c5439f4 Binary files /dev/null and b/sounds/vo/lina/lina_killspecial_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_lasthit_01.vsnd_c b/sounds/vo/lina/lina_lasthit_01.vsnd_c new file mode 100755 index 0000000..0dcd3c3 Binary files /dev/null and b/sounds/vo/lina/lina_lasthit_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_lasthit_02.vsnd_c b/sounds/vo/lina/lina_lasthit_02.vsnd_c new file mode 100755 index 0000000..db9d37c Binary files /dev/null and b/sounds/vo/lina/lina_lasthit_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_lasthit_03.vsnd_c b/sounds/vo/lina/lina_lasthit_03.vsnd_c new file mode 100755 index 0000000..d3bdf6a Binary files /dev/null and b/sounds/vo/lina/lina_lasthit_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_lasthit_04.vsnd_c b/sounds/vo/lina/lina_lasthit_04.vsnd_c new file mode 100755 index 0000000..67f434b Binary files /dev/null and b/sounds/vo/lina/lina_lasthit_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_lasthit_05.vsnd_c b/sounds/vo/lina/lina_lasthit_05.vsnd_c new file mode 100755 index 0000000..4408a18 Binary files /dev/null and b/sounds/vo/lina/lina_lasthit_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_lasthit_06.vsnd_c b/sounds/vo/lina/lina_lasthit_06.vsnd_c new file mode 100755 index 0000000..c52e0b6 Binary files /dev/null and b/sounds/vo/lina/lina_lasthit_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_lasthit_07.vsnd_c b/sounds/vo/lina/lina_lasthit_07.vsnd_c new file mode 100755 index 0000000..51a0202 Binary files /dev/null and b/sounds/vo/lina/lina_lasthit_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_lasthit_08.vsnd_c b/sounds/vo/lina/lina_lasthit_08.vsnd_c new file mode 100755 index 0000000..35d5043 Binary files /dev/null and b/sounds/vo/lina/lina_lasthit_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_laugh_01.vsnd_c b/sounds/vo/lina/lina_laugh_01.vsnd_c new file mode 100755 index 0000000..1fdf82e Binary files /dev/null and b/sounds/vo/lina/lina_laugh_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_laugh_02.vsnd_c b/sounds/vo/lina/lina_laugh_02.vsnd_c new file mode 100755 index 0000000..4e15b9b Binary files /dev/null and b/sounds/vo/lina/lina_laugh_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_laugh_03.vsnd_c b/sounds/vo/lina/lina_laugh_03.vsnd_c new file mode 100755 index 0000000..7e6b34d Binary files /dev/null and b/sounds/vo/lina/lina_laugh_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_laugh_04.vsnd_c b/sounds/vo/lina/lina_laugh_04.vsnd_c new file mode 100755 index 0000000..9877688 Binary files /dev/null and b/sounds/vo/lina/lina_laugh_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_laugh_05.vsnd_c b/sounds/vo/lina/lina_laugh_05.vsnd_c new file mode 100755 index 0000000..b48b8fc Binary files /dev/null and b/sounds/vo/lina/lina_laugh_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_laugh_06.vsnd_c b/sounds/vo/lina/lina_laugh_06.vsnd_c new file mode 100755 index 0000000..7e6c712 Binary files /dev/null and b/sounds/vo/lina/lina_laugh_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_laugh_07.vsnd_c b/sounds/vo/lina/lina_laugh_07.vsnd_c new file mode 100755 index 0000000..f177bfa Binary files /dev/null and b/sounds/vo/lina/lina_laugh_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_laugh_08.vsnd_c b/sounds/vo/lina/lina_laugh_08.vsnd_c new file mode 100755 index 0000000..89087d4 Binary files /dev/null and b/sounds/vo/lina/lina_laugh_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_laugh_09.vsnd_c b/sounds/vo/lina/lina_laugh_09.vsnd_c new file mode 100755 index 0000000..5880121 Binary files /dev/null and b/sounds/vo/lina/lina_laugh_09.vsnd_c differ diff --git a/sounds/vo/lina/lina_laugh_10.vsnd_c b/sounds/vo/lina/lina_laugh_10.vsnd_c new file mode 100755 index 0000000..9029396 Binary files /dev/null and b/sounds/vo/lina/lina_laugh_10.vsnd_c differ diff --git a/sounds/vo/lina/lina_level_01.vsnd_c b/sounds/vo/lina/lina_level_01.vsnd_c new file mode 100755 index 0000000..e766b52 Binary files /dev/null and b/sounds/vo/lina/lina_level_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_level_02.vsnd_c b/sounds/vo/lina/lina_level_02.vsnd_c new file mode 100755 index 0000000..9006b15 Binary files /dev/null and b/sounds/vo/lina/lina_level_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_level_03.vsnd_c b/sounds/vo/lina/lina_level_03.vsnd_c new file mode 100755 index 0000000..fed0962 Binary files /dev/null and b/sounds/vo/lina/lina_level_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_level_04.vsnd_c b/sounds/vo/lina/lina_level_04.vsnd_c new file mode 100755 index 0000000..f1c4b34 Binary files /dev/null and b/sounds/vo/lina/lina_level_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_level_05.vsnd_c b/sounds/vo/lina/lina_level_05.vsnd_c new file mode 100755 index 0000000..c9ceb34 Binary files /dev/null and b/sounds/vo/lina/lina_level_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_level_06.vsnd_c b/sounds/vo/lina/lina_level_06.vsnd_c new file mode 100755 index 0000000..62d3868 Binary files /dev/null and b/sounds/vo/lina/lina_level_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_level_07.vsnd_c b/sounds/vo/lina/lina_level_07.vsnd_c new file mode 100755 index 0000000..3a8843a Binary files /dev/null and b/sounds/vo/lina/lina_level_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_lose_01.vsnd_c b/sounds/vo/lina/lina_lose_01.vsnd_c new file mode 100755 index 0000000..6d04347 Binary files /dev/null and b/sounds/vo/lina/lina_lose_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_lose_02.vsnd_c b/sounds/vo/lina/lina_lose_02.vsnd_c new file mode 100755 index 0000000..6604c3f Binary files /dev/null and b/sounds/vo/lina/lina_lose_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_lose_03.vsnd_c b/sounds/vo/lina/lina_lose_03.vsnd_c new file mode 100755 index 0000000..2eeb985 Binary files /dev/null and b/sounds/vo/lina/lina_lose_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_lose_04.vsnd_c b/sounds/vo/lina/lina_lose_04.vsnd_c new file mode 100755 index 0000000..799f2c6 Binary files /dev/null and b/sounds/vo/lina/lina_lose_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_missing_lane_01.vsnd_c b/sounds/vo/lina/lina_missing_lane_01.vsnd_c new file mode 100755 index 0000000..f5e63a7 Binary files /dev/null and b/sounds/vo/lina/lina_missing_lane_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_missing_lane_02.vsnd_c b/sounds/vo/lina/lina_missing_lane_02.vsnd_c new file mode 100755 index 0000000..3a08418 Binary files /dev/null and b/sounds/vo/lina/lina_missing_lane_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_missing_lane_03.vsnd_c b/sounds/vo/lina/lina_missing_lane_03.vsnd_c new file mode 100755 index 0000000..e063ad6 Binary files /dev/null and b/sounds/vo/lina/lina_missing_lane_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_move_01.vsnd_c b/sounds/vo/lina/lina_move_01.vsnd_c new file mode 100755 index 0000000..12717e6 Binary files /dev/null and b/sounds/vo/lina/lina_move_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_move_02.vsnd_c b/sounds/vo/lina/lina_move_02.vsnd_c new file mode 100755 index 0000000..97ffcf9 Binary files /dev/null and b/sounds/vo/lina/lina_move_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_move_03.vsnd_c b/sounds/vo/lina/lina_move_03.vsnd_c new file mode 100755 index 0000000..5ee83b0 Binary files /dev/null and b/sounds/vo/lina/lina_move_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_move_04.vsnd_c b/sounds/vo/lina/lina_move_04.vsnd_c new file mode 100755 index 0000000..4bd0ec7 Binary files /dev/null and b/sounds/vo/lina/lina_move_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_move_05.vsnd_c b/sounds/vo/lina/lina_move_05.vsnd_c new file mode 100755 index 0000000..f7d7dfe Binary files /dev/null and b/sounds/vo/lina/lina_move_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_move_06.vsnd_c b/sounds/vo/lina/lina_move_06.vsnd_c new file mode 100755 index 0000000..6dd920e Binary files /dev/null and b/sounds/vo/lina/lina_move_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_move_07.vsnd_c b/sounds/vo/lina/lina_move_07.vsnd_c new file mode 100755 index 0000000..2a7d7be Binary files /dev/null and b/sounds/vo/lina/lina_move_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_move_08.vsnd_c b/sounds/vo/lina/lina_move_08.vsnd_c new file mode 100755 index 0000000..c707f8f Binary files /dev/null and b/sounds/vo/lina/lina_move_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_move_09.vsnd_c b/sounds/vo/lina/lina_move_09.vsnd_c new file mode 100755 index 0000000..4e53f79 Binary files /dev/null and b/sounds/vo/lina/lina_move_09.vsnd_c differ diff --git a/sounds/vo/lina/lina_move_10.vsnd_c b/sounds/vo/lina/lina_move_10.vsnd_c new file mode 100755 index 0000000..9bfa129 Binary files /dev/null and b/sounds/vo/lina/lina_move_10.vsnd_c differ diff --git a/sounds/vo/lina/lina_move_11.vsnd_c b/sounds/vo/lina/lina_move_11.vsnd_c new file mode 100755 index 0000000..16bf043 Binary files /dev/null and b/sounds/vo/lina/lina_move_11.vsnd_c differ diff --git a/sounds/vo/lina/lina_move_12.vsnd_c b/sounds/vo/lina/lina_move_12.vsnd_c new file mode 100755 index 0000000..ea6008e Binary files /dev/null and b/sounds/vo/lina/lina_move_12.vsnd_c differ diff --git a/sounds/vo/lina/lina_nomana_01.vsnd_c b/sounds/vo/lina/lina_nomana_01.vsnd_c new file mode 100755 index 0000000..7f61bb0 Binary files /dev/null and b/sounds/vo/lina/lina_nomana_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_nomana_02.vsnd_c b/sounds/vo/lina/lina_nomana_02.vsnd_c new file mode 100755 index 0000000..f9fa9a6 Binary files /dev/null and b/sounds/vo/lina/lina_nomana_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_nomana_03.vsnd_c b/sounds/vo/lina/lina_nomana_03.vsnd_c new file mode 100755 index 0000000..1583815 Binary files /dev/null and b/sounds/vo/lina/lina_nomana_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_nomana_04.vsnd_c b/sounds/vo/lina/lina_nomana_04.vsnd_c new file mode 100755 index 0000000..e152528 Binary files /dev/null and b/sounds/vo/lina/lina_nomana_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_nomana_05.vsnd_c b/sounds/vo/lina/lina_nomana_05.vsnd_c new file mode 100755 index 0000000..1258d3b Binary files /dev/null and b/sounds/vo/lina/lina_nomana_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_nomana_06.vsnd_c b/sounds/vo/lina/lina_nomana_06.vsnd_c new file mode 100755 index 0000000..5de52b7 Binary files /dev/null and b/sounds/vo/lina/lina_nomana_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_nomana_07.vsnd_c b/sounds/vo/lina/lina_nomana_07.vsnd_c new file mode 100755 index 0000000..744f271 Binary files /dev/null and b/sounds/vo/lina/lina_nomana_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_nomana_08.vsnd_c b/sounds/vo/lina/lina_nomana_08.vsnd_c new file mode 100755 index 0000000..310d6be Binary files /dev/null and b/sounds/vo/lina/lina_nomana_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_nomana_09.vsnd_c b/sounds/vo/lina/lina_nomana_09.vsnd_c new file mode 100755 index 0000000..0ba2fa9 Binary files /dev/null and b/sounds/vo/lina/lina_nomana_09.vsnd_c differ diff --git a/sounds/vo/lina/lina_notyet_01.vsnd_c b/sounds/vo/lina/lina_notyet_01.vsnd_c new file mode 100755 index 0000000..c94d7fb Binary files /dev/null and b/sounds/vo/lina/lina_notyet_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_notyet_02.vsnd_c b/sounds/vo/lina/lina_notyet_02.vsnd_c new file mode 100755 index 0000000..2909409 Binary files /dev/null and b/sounds/vo/lina/lina_notyet_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_notyet_03.vsnd_c b/sounds/vo/lina/lina_notyet_03.vsnd_c new file mode 100755 index 0000000..c7d5d66 Binary files /dev/null and b/sounds/vo/lina/lina_notyet_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_notyet_04.vsnd_c b/sounds/vo/lina/lina_notyet_04.vsnd_c new file mode 100755 index 0000000..a54e302 Binary files /dev/null and b/sounds/vo/lina/lina_notyet_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_notyet_05.vsnd_c b/sounds/vo/lina/lina_notyet_05.vsnd_c new file mode 100755 index 0000000..b86e6a9 Binary files /dev/null and b/sounds/vo/lina/lina_notyet_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_notyet_06.vsnd_c b/sounds/vo/lina/lina_notyet_06.vsnd_c new file mode 100755 index 0000000..cf72124 Binary files /dev/null and b/sounds/vo/lina/lina_notyet_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_notyet_07.vsnd_c b/sounds/vo/lina/lina_notyet_07.vsnd_c new file mode 100755 index 0000000..aeea1c5 Binary files /dev/null and b/sounds/vo/lina/lina_notyet_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_notyet_08.vsnd_c b/sounds/vo/lina/lina_notyet_08.vsnd_c new file mode 100755 index 0000000..a52bc22 Binary files /dev/null and b/sounds/vo/lina/lina_notyet_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_notyet_09.vsnd_c b/sounds/vo/lina/lina_notyet_09.vsnd_c new file mode 100755 index 0000000..db265a2 Binary files /dev/null and b/sounds/vo/lina/lina_notyet_09.vsnd_c differ diff --git a/sounds/vo/lina/lina_pain_01.vsnd_c b/sounds/vo/lina/lina_pain_01.vsnd_c new file mode 100755 index 0000000..1b7567b Binary files /dev/null and b/sounds/vo/lina/lina_pain_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_pain_02.vsnd_c b/sounds/vo/lina/lina_pain_02.vsnd_c new file mode 100755 index 0000000..a2e4aab Binary files /dev/null and b/sounds/vo/lina/lina_pain_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_pain_03.vsnd_c b/sounds/vo/lina/lina_pain_03.vsnd_c new file mode 100755 index 0000000..68e0c45 Binary files /dev/null and b/sounds/vo/lina/lina_pain_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_pain_04.vsnd_c b/sounds/vo/lina/lina_pain_04.vsnd_c new file mode 100755 index 0000000..ede0622 Binary files /dev/null and b/sounds/vo/lina/lina_pain_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_pain_05.vsnd_c b/sounds/vo/lina/lina_pain_05.vsnd_c new file mode 100755 index 0000000..0bfe5b7 Binary files /dev/null and b/sounds/vo/lina/lina_pain_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_pain_06.vsnd_c b/sounds/vo/lina/lina_pain_06.vsnd_c new file mode 100755 index 0000000..8a6135d Binary files /dev/null and b/sounds/vo/lina/lina_pain_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_pain_07.vsnd_c b/sounds/vo/lina/lina_pain_07.vsnd_c new file mode 100755 index 0000000..3622811 Binary files /dev/null and b/sounds/vo/lina/lina_pain_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_pain_08.vsnd_c b/sounds/vo/lina/lina_pain_08.vsnd_c new file mode 100755 index 0000000..0d6be5a Binary files /dev/null and b/sounds/vo/lina/lina_pain_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_purch_01.vsnd_c b/sounds/vo/lina/lina_purch_01.vsnd_c new file mode 100755 index 0000000..52bed1d Binary files /dev/null and b/sounds/vo/lina/lina_purch_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_purch_02.vsnd_c b/sounds/vo/lina/lina_purch_02.vsnd_c new file mode 100755 index 0000000..8bbb759 Binary files /dev/null and b/sounds/vo/lina/lina_purch_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_purch_03.vsnd_c b/sounds/vo/lina/lina_purch_03.vsnd_c new file mode 100755 index 0000000..af4e403 Binary files /dev/null and b/sounds/vo/lina/lina_purch_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_purch_04.vsnd_c b/sounds/vo/lina/lina_purch_04.vsnd_c new file mode 100755 index 0000000..b47eeca Binary files /dev/null and b/sounds/vo/lina/lina_purch_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_purch_05.vsnd_c b/sounds/vo/lina/lina_purch_05.vsnd_c new file mode 100755 index 0000000..04ea55a Binary files /dev/null and b/sounds/vo/lina/lina_purch_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_rare_01.vsnd_c b/sounds/vo/lina/lina_rare_01.vsnd_c new file mode 100755 index 0000000..21c29bb Binary files /dev/null and b/sounds/vo/lina/lina_rare_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_rare_02.vsnd_c b/sounds/vo/lina/lina_rare_02.vsnd_c new file mode 100755 index 0000000..475cdd2 Binary files /dev/null and b/sounds/vo/lina/lina_rare_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_rare_03.vsnd_c b/sounds/vo/lina/lina_rare_03.vsnd_c new file mode 100755 index 0000000..bce3477 Binary files /dev/null and b/sounds/vo/lina/lina_rare_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_rare_04.vsnd_c b/sounds/vo/lina/lina_rare_04.vsnd_c new file mode 100755 index 0000000..d28fb91 Binary files /dev/null and b/sounds/vo/lina/lina_rare_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_regen_01.vsnd_c b/sounds/vo/lina/lina_regen_01.vsnd_c new file mode 100755 index 0000000..c0bec8a Binary files /dev/null and b/sounds/vo/lina/lina_regen_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_regen_02.vsnd_c b/sounds/vo/lina/lina_regen_02.vsnd_c new file mode 100755 index 0000000..ac9dd08 Binary files /dev/null and b/sounds/vo/lina/lina_regen_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_respawn_01.vsnd_c b/sounds/vo/lina/lina_respawn_01.vsnd_c new file mode 100755 index 0000000..a19925c Binary files /dev/null and b/sounds/vo/lina/lina_respawn_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_respawn_02.vsnd_c b/sounds/vo/lina/lina_respawn_02.vsnd_c new file mode 100755 index 0000000..66d6972 Binary files /dev/null and b/sounds/vo/lina/lina_respawn_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_respawn_03.vsnd_c b/sounds/vo/lina/lina_respawn_03.vsnd_c new file mode 100755 index 0000000..084bf34 Binary files /dev/null and b/sounds/vo/lina/lina_respawn_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_respawn_04.vsnd_c b/sounds/vo/lina/lina_respawn_04.vsnd_c new file mode 100755 index 0000000..8ddf03b Binary files /dev/null and b/sounds/vo/lina/lina_respawn_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_respawn_05.vsnd_c b/sounds/vo/lina/lina_respawn_05.vsnd_c new file mode 100755 index 0000000..1d62065 Binary files /dev/null and b/sounds/vo/lina/lina_respawn_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_respawn_06.vsnd_c b/sounds/vo/lina/lina_respawn_06.vsnd_c new file mode 100755 index 0000000..cd8dfa7 Binary files /dev/null and b/sounds/vo/lina/lina_respawn_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_respawn_07.vsnd_c b/sounds/vo/lina/lina_respawn_07.vsnd_c new file mode 100755 index 0000000..3d12ff2 Binary files /dev/null and b/sounds/vo/lina/lina_respawn_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_respawn_08.vsnd_c b/sounds/vo/lina/lina_respawn_08.vsnd_c new file mode 100755 index 0000000..21ae17e Binary files /dev/null and b/sounds/vo/lina/lina_respawn_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_respawn_09.vsnd_c b/sounds/vo/lina/lina_respawn_09.vsnd_c new file mode 100755 index 0000000..15ddcfe Binary files /dev/null and b/sounds/vo/lina/lina_respawn_09.vsnd_c differ diff --git a/sounds/vo/lina/lina_respawn_10.vsnd_c b/sounds/vo/lina/lina_respawn_10.vsnd_c new file mode 100755 index 0000000..bcac1a9 Binary files /dev/null and b/sounds/vo/lina/lina_respawn_10.vsnd_c differ diff --git a/sounds/vo/lina/lina_respawn_11.vsnd_c b/sounds/vo/lina/lina_respawn_11.vsnd_c new file mode 100755 index 0000000..4df859c Binary files /dev/null and b/sounds/vo/lina/lina_respawn_11.vsnd_c differ diff --git a/sounds/vo/lina/lina_respawn_12.vsnd_c b/sounds/vo/lina/lina_respawn_12.vsnd_c new file mode 100755 index 0000000..8bd96d8 Binary files /dev/null and b/sounds/vo/lina/lina_respawn_12.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_01.vsnd_c b/sounds/vo/lina/lina_rival_01.vsnd_c new file mode 100755 index 0000000..abe70c4 Binary files /dev/null and b/sounds/vo/lina/lina_rival_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_02.vsnd_c b/sounds/vo/lina/lina_rival_02.vsnd_c new file mode 100755 index 0000000..631c458 Binary files /dev/null and b/sounds/vo/lina/lina_rival_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_03.vsnd_c b/sounds/vo/lina/lina_rival_03.vsnd_c new file mode 100755 index 0000000..f3bc34d Binary files /dev/null and b/sounds/vo/lina/lina_rival_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_04.vsnd_c b/sounds/vo/lina/lina_rival_04.vsnd_c new file mode 100755 index 0000000..54406f9 Binary files /dev/null and b/sounds/vo/lina/lina_rival_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_05.vsnd_c b/sounds/vo/lina/lina_rival_05.vsnd_c new file mode 100755 index 0000000..ff38433 Binary files /dev/null and b/sounds/vo/lina/lina_rival_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_06.vsnd_c b/sounds/vo/lina/lina_rival_06.vsnd_c new file mode 100755 index 0000000..5c81811 Binary files /dev/null and b/sounds/vo/lina/lina_rival_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_07.vsnd_c b/sounds/vo/lina/lina_rival_07.vsnd_c new file mode 100755 index 0000000..e8c15f9 Binary files /dev/null and b/sounds/vo/lina/lina_rival_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_08.vsnd_c b/sounds/vo/lina/lina_rival_08.vsnd_c new file mode 100755 index 0000000..0bafd22 Binary files /dev/null and b/sounds/vo/lina/lina_rival_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_09.vsnd_c b/sounds/vo/lina/lina_rival_09.vsnd_c new file mode 100755 index 0000000..bd59313 Binary files /dev/null and b/sounds/vo/lina/lina_rival_09.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_10.vsnd_c b/sounds/vo/lina/lina_rival_10.vsnd_c new file mode 100755 index 0000000..ed14912 Binary files /dev/null and b/sounds/vo/lina/lina_rival_10.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_11.vsnd_c b/sounds/vo/lina/lina_rival_11.vsnd_c new file mode 100755 index 0000000..ea9020f Binary files /dev/null and b/sounds/vo/lina/lina_rival_11.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_12.vsnd_c b/sounds/vo/lina/lina_rival_12.vsnd_c new file mode 100755 index 0000000..77f441a Binary files /dev/null and b/sounds/vo/lina/lina_rival_12.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_13.vsnd_c b/sounds/vo/lina/lina_rival_13.vsnd_c new file mode 100755 index 0000000..9071dda Binary files /dev/null and b/sounds/vo/lina/lina_rival_13.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_14.vsnd_c b/sounds/vo/lina/lina_rival_14.vsnd_c new file mode 100755 index 0000000..57a3543 Binary files /dev/null and b/sounds/vo/lina/lina_rival_14.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_15.vsnd_c b/sounds/vo/lina/lina_rival_15.vsnd_c new file mode 100755 index 0000000..9c1b80c Binary files /dev/null and b/sounds/vo/lina/lina_rival_15.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_16.vsnd_c b/sounds/vo/lina/lina_rival_16.vsnd_c new file mode 100755 index 0000000..9aca7c4 Binary files /dev/null and b/sounds/vo/lina/lina_rival_16.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_17.vsnd_c b/sounds/vo/lina/lina_rival_17.vsnd_c new file mode 100755 index 0000000..f1e7446 Binary files /dev/null and b/sounds/vo/lina/lina_rival_17.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_18.vsnd_c b/sounds/vo/lina/lina_rival_18.vsnd_c new file mode 100755 index 0000000..122e797 Binary files /dev/null and b/sounds/vo/lina/lina_rival_18.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_19.vsnd_c b/sounds/vo/lina/lina_rival_19.vsnd_c new file mode 100755 index 0000000..421b741 Binary files /dev/null and b/sounds/vo/lina/lina_rival_19.vsnd_c differ diff --git a/sounds/vo/lina/lina_rival_20.vsnd_c b/sounds/vo/lina/lina_rival_20.vsnd_c new file mode 100755 index 0000000..0217299 Binary files /dev/null and b/sounds/vo/lina/lina_rival_20.vsnd_c differ diff --git a/sounds/vo/lina/lina_scepter_01.vsnd_c b/sounds/vo/lina/lina_scepter_01.vsnd_c new file mode 100755 index 0000000..7fd2ad9 Binary files /dev/null and b/sounds/vo/lina/lina_scepter_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_scepter_02.vsnd_c b/sounds/vo/lina/lina_scepter_02.vsnd_c new file mode 100755 index 0000000..d841b2f Binary files /dev/null and b/sounds/vo/lina/lina_scepter_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_shitwiz_01.vsnd_c b/sounds/vo/lina/lina_shitwiz_01.vsnd_c new file mode 100755 index 0000000..c085655 Binary files /dev/null and b/sounds/vo/lina/lina_shitwiz_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_spawn_01.vsnd_c b/sounds/vo/lina/lina_spawn_01.vsnd_c new file mode 100755 index 0000000..556275d Binary files /dev/null and b/sounds/vo/lina/lina_spawn_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_spawn_02.vsnd_c b/sounds/vo/lina/lina_spawn_02.vsnd_c new file mode 100755 index 0000000..e8de152 Binary files /dev/null and b/sounds/vo/lina/lina_spawn_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_spawn_03.vsnd_c b/sounds/vo/lina/lina_spawn_03.vsnd_c new file mode 100755 index 0000000..0ba054d Binary files /dev/null and b/sounds/vo/lina/lina_spawn_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_spawn_04.vsnd_c b/sounds/vo/lina/lina_spawn_04.vsnd_c new file mode 100755 index 0000000..977fde8 Binary files /dev/null and b/sounds/vo/lina/lina_spawn_04.vsnd_c differ diff --git a/sounds/vo/lina/lina_spawn_05.vsnd_c b/sounds/vo/lina/lina_spawn_05.vsnd_c new file mode 100755 index 0000000..a4ac997 Binary files /dev/null and b/sounds/vo/lina/lina_spawn_05.vsnd_c differ diff --git a/sounds/vo/lina/lina_spawn_06.vsnd_c b/sounds/vo/lina/lina_spawn_06.vsnd_c new file mode 100755 index 0000000..4b64487 Binary files /dev/null and b/sounds/vo/lina/lina_spawn_06.vsnd_c differ diff --git a/sounds/vo/lina/lina_spawn_07.vsnd_c b/sounds/vo/lina/lina_spawn_07.vsnd_c new file mode 100755 index 0000000..6ee9a41 Binary files /dev/null and b/sounds/vo/lina/lina_spawn_07.vsnd_c differ diff --git a/sounds/vo/lina/lina_spawn_08.vsnd_c b/sounds/vo/lina/lina_spawn_08.vsnd_c new file mode 100755 index 0000000..bcb9ae7 Binary files /dev/null and b/sounds/vo/lina/lina_spawn_08.vsnd_c differ diff --git a/sounds/vo/lina/lina_spawn_09.vsnd_c b/sounds/vo/lina/lina_spawn_09.vsnd_c new file mode 100755 index 0000000..f747b72 Binary files /dev/null and b/sounds/vo/lina/lina_spawn_09.vsnd_c differ diff --git a/sounds/vo/lina/lina_thanks_01.vsnd_c b/sounds/vo/lina/lina_thanks_01.vsnd_c new file mode 100755 index 0000000..4b549cd Binary files /dev/null and b/sounds/vo/lina/lina_thanks_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_thanks_02.vsnd_c b/sounds/vo/lina/lina_thanks_02.vsnd_c new file mode 100755 index 0000000..0cf2315 Binary files /dev/null and b/sounds/vo/lina/lina_thanks_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_thanks_03.vsnd_c b/sounds/vo/lina/lina_thanks_03.vsnd_c new file mode 100755 index 0000000..404456b Binary files /dev/null and b/sounds/vo/lina/lina_thanks_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_underattack_01.vsnd_c b/sounds/vo/lina/lina_underattack_01.vsnd_c new file mode 100755 index 0000000..eeef3cf Binary files /dev/null and b/sounds/vo/lina/lina_underattack_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_win_01.vsnd_c b/sounds/vo/lina/lina_win_01.vsnd_c new file mode 100755 index 0000000..d8d5d25 Binary files /dev/null and b/sounds/vo/lina/lina_win_01.vsnd_c differ diff --git a/sounds/vo/lina/lina_win_02.vsnd_c b/sounds/vo/lina/lina_win_02.vsnd_c new file mode 100755 index 0000000..80829f0 Binary files /dev/null and b/sounds/vo/lina/lina_win_02.vsnd_c differ diff --git a/sounds/vo/lina/lina_win_03.vsnd_c b/sounds/vo/lina/lina_win_03.vsnd_c new file mode 100755 index 0000000..cc5099f Binary files /dev/null and b/sounds/vo/lina/lina_win_03.vsnd_c differ diff --git a/sounds/vo/lina/lina_win_04.vsnd_c b/sounds/vo/lina/lina_win_04.vsnd_c new file mode 100755 index 0000000..e5c59e0 Binary files /dev/null and b/sounds/vo/lina/lina_win_04.vsnd_c differ diff --git a/sounds/weapons/hero/antimage/antimage_attack3.vsnd_c b/sounds/weapons/hero/antimage/antimage_attack3.vsnd_c new file mode 100755 index 0000000..f89bd2f Binary files /dev/null and b/sounds/weapons/hero/antimage/antimage_attack3.vsnd_c differ diff --git a/sounds/weapons/hero/antimage/antimage_attack4.vsnd_c b/sounds/weapons/hero/antimage/antimage_attack4.vsnd_c new file mode 100755 index 0000000..4869899 Binary files /dev/null and b/sounds/weapons/hero/antimage/antimage_attack4.vsnd_c differ diff --git a/sounds/weapons/hero/antimage/antimage_attack5.vsnd_c b/sounds/weapons/hero/antimage/antimage_attack5.vsnd_c new file mode 100755 index 0000000..0c06bde Binary files /dev/null and b/sounds/weapons/hero/antimage/antimage_attack5.vsnd_c differ diff --git a/sounds/weapons/hero/axe/attack01.vsnd_c b/sounds/weapons/hero/axe/attack01.vsnd_c new file mode 100755 index 0000000..d314944 Binary files /dev/null and b/sounds/weapons/hero/axe/attack01.vsnd_c differ diff --git a/sounds/weapons/hero/axe/attack02.vsnd_c b/sounds/weapons/hero/axe/attack02.vsnd_c new file mode 100755 index 0000000..f8081f1 Binary files /dev/null and b/sounds/weapons/hero/axe/attack02.vsnd_c differ diff --git a/sounds/weapons/hero/axe/attack03.vsnd_c b/sounds/weapons/hero/axe/attack03.vsnd_c new file mode 100755 index 0000000..374901f Binary files /dev/null and b/sounds/weapons/hero/axe/attack03.vsnd_c differ diff --git a/sounds/weapons/hero/axe/preattack01.vsnd_c b/sounds/weapons/hero/axe/preattack01.vsnd_c new file mode 100755 index 0000000..cc87947 Binary files /dev/null and b/sounds/weapons/hero/axe/preattack01.vsnd_c differ diff --git a/sounds/weapons/hero/axe/preattack02.vsnd_c b/sounds/weapons/hero/axe/preattack02.vsnd_c new file mode 100755 index 0000000..4b7a8d0 Binary files /dev/null and b/sounds/weapons/hero/axe/preattack02.vsnd_c differ diff --git a/sounds/weapons/hero/axe/preattack03.vsnd_c b/sounds/weapons/hero/axe/preattack03.vsnd_c new file mode 100755 index 0000000..b27add1 Binary files /dev/null and b/sounds/weapons/hero/axe/preattack03.vsnd_c differ diff --git a/sounds/weapons/hero/bloodseeker/attack1.vsnd_c b/sounds/weapons/hero/bloodseeker/attack1.vsnd_c new file mode 100755 index 0000000..696620d Binary files /dev/null and b/sounds/weapons/hero/bloodseeker/attack1.vsnd_c differ diff --git a/sounds/weapons/hero/bloodseeker/attack2.vsnd_c b/sounds/weapons/hero/bloodseeker/attack2.vsnd_c new file mode 100755 index 0000000..cc9a14f Binary files /dev/null and b/sounds/weapons/hero/bloodseeker/attack2.vsnd_c differ diff --git a/sounds/weapons/hero/bloodseeker/attack3.vsnd_c b/sounds/weapons/hero/bloodseeker/attack3.vsnd_c new file mode 100755 index 0000000..25acf45 Binary files /dev/null and b/sounds/weapons/hero/bloodseeker/attack3.vsnd_c differ diff --git a/sounds/weapons/hero/bloodseeker/preattack1.vsnd_c b/sounds/weapons/hero/bloodseeker/preattack1.vsnd_c new file mode 100755 index 0000000..088d994 Binary files /dev/null and b/sounds/weapons/hero/bloodseeker/preattack1.vsnd_c differ diff --git a/sounds/weapons/hero/bloodseeker/preattack2.vsnd_c b/sounds/weapons/hero/bloodseeker/preattack2.vsnd_c new file mode 100755 index 0000000..c7d5ebb Binary files /dev/null and b/sounds/weapons/hero/bloodseeker/preattack2.vsnd_c differ diff --git a/sounds/weapons/hero/earthshaker/enchant_attack.vsnd_c b/sounds/weapons/hero/earthshaker/enchant_attack.vsnd_c new file mode 100755 index 0000000..ae28b95 Binary files /dev/null and b/sounds/weapons/hero/earthshaker/enchant_attack.vsnd_c differ diff --git a/sounds/weapons/hero/earthshaker/fissure_whoosh.vsnd_c b/sounds/weapons/hero/earthshaker/fissure_whoosh.vsnd_c new file mode 100755 index 0000000..51c69d3 Binary files /dev/null and b/sounds/weapons/hero/earthshaker/fissure_whoosh.vsnd_c differ diff --git a/sounds/weapons/hero/earthshaker/fist_swing_impact1.vsnd_c b/sounds/weapons/hero/earthshaker/fist_swing_impact1.vsnd_c new file mode 100755 index 0000000..211a5f0 Binary files /dev/null and b/sounds/weapons/hero/earthshaker/fist_swing_impact1.vsnd_c differ diff --git a/sounds/weapons/hero/earthshaker/fist_swing_impact2.vsnd_c b/sounds/weapons/hero/earthshaker/fist_swing_impact2.vsnd_c new file mode 100755 index 0000000..fdb6687 Binary files /dev/null and b/sounds/weapons/hero/earthshaker/fist_swing_impact2.vsnd_c differ diff --git a/sounds/weapons/hero/earthshaker/fist_swing_impact3.vsnd_c b/sounds/weapons/hero/earthshaker/fist_swing_impact3.vsnd_c new file mode 100755 index 0000000..eecdbd9 Binary files /dev/null and b/sounds/weapons/hero/earthshaker/fist_swing_impact3.vsnd_c differ diff --git a/sounds/weapons/hero/keeper/chakra_target.vsnd_c b/sounds/weapons/hero/keeper/chakra_target.vsnd_c new file mode 100755 index 0000000..f6d8e8d Binary files /dev/null and b/sounds/weapons/hero/keeper/chakra_target.vsnd_c differ diff --git a/sounds/weapons/hero/puck/illusory_orb.vsnd_c b/sounds/weapons/hero/puck/illusory_orb.vsnd_c new file mode 100755 index 0000000..2639ce1 Binary files /dev/null and b/sounds/weapons/hero/puck/illusory_orb.vsnd_c differ diff --git a/sounds/weapons/hero/shared/large_blacde/ring01.vsnd_c b/sounds/weapons/hero/shared/large_blacde/ring01.vsnd_c new file mode 100755 index 0000000..7b1def8 Binary files /dev/null and b/sounds/weapons/hero/shared/large_blacde/ring01.vsnd_c differ diff --git a/sounds/weapons/hero/shared/large_blacde/ring04.vsnd_c b/sounds/weapons/hero/shared/large_blacde/ring04.vsnd_c new file mode 100755 index 0000000..2d8bfaf Binary files /dev/null and b/sounds/weapons/hero/shared/large_blacde/ring04.vsnd_c differ diff --git a/sounds/weapons/hero/shared/small_blade/ring01.vsnd_c b/sounds/weapons/hero/shared/small_blade/ring01.vsnd_c new file mode 100755 index 0000000..d43b499 Binary files /dev/null and b/sounds/weapons/hero/shared/small_blade/ring01.vsnd_c differ diff --git a/sounds/weapons/hero/shared/small_blade/ring02.vsnd_c b/sounds/weapons/hero/shared/small_blade/ring02.vsnd_c new file mode 100755 index 0000000..933f94c Binary files /dev/null and b/sounds/weapons/hero/shared/small_blade/ring02.vsnd_c differ diff --git a/sounds/weapons/hero/shared/small_blade/ring03.vsnd_c b/sounds/weapons/hero/shared/small_blade/ring03.vsnd_c new file mode 100755 index 0000000..a0edf90 Binary files /dev/null and b/sounds/weapons/hero/shared/small_blade/ring03.vsnd_c differ diff --git a/sounds/weapons/hero/tidehunter/attack1.vsnd_c b/sounds/weapons/hero/tidehunter/attack1.vsnd_c new file mode 100755 index 0000000..934a6b8 Binary files /dev/null and b/sounds/weapons/hero/tidehunter/attack1.vsnd_c differ diff --git a/sounds/weapons/hero/tidehunter/attack2.vsnd_c b/sounds/weapons/hero/tidehunter/attack2.vsnd_c new file mode 100755 index 0000000..11deeb8 Binary files /dev/null and b/sounds/weapons/hero/tidehunter/attack2.vsnd_c differ diff --git a/sounds/weapons/hero/tidehunter/attack3.vsnd_c b/sounds/weapons/hero/tidehunter/attack3.vsnd_c new file mode 100755 index 0000000..e5e99ee Binary files /dev/null and b/sounds/weapons/hero/tidehunter/attack3.vsnd_c differ diff --git a/sounds/weapons/hero/warlock/attack1.vsnd_c b/sounds/weapons/hero/warlock/attack1.vsnd_c new file mode 100755 index 0000000..781b19a Binary files /dev/null and b/sounds/weapons/hero/warlock/attack1.vsnd_c differ diff --git a/sounds/weapons/hero/warlock/attack2.vsnd_c b/sounds/weapons/hero/warlock/attack2.vsnd_c new file mode 100755 index 0000000..c996584 Binary files /dev/null and b/sounds/weapons/hero/warlock/attack2.vsnd_c differ diff --git a/sounds/weapons/hero/warlock/attack3.vsnd_c b/sounds/weapons/hero/warlock/attack3.vsnd_c new file mode 100755 index 0000000..1a3211b Binary files /dev/null and b/sounds/weapons/hero/warlock/attack3.vsnd_c differ diff --git a/sounds/weapons/hero/witch_doctor/preattack.vsnd_c b/sounds/weapons/hero/witch_doctor/preattack.vsnd_c new file mode 100755 index 0000000..9474e96 Binary files /dev/null and b/sounds/weapons/hero/witch_doctor/preattack.vsnd_c differ